/**
 * Provides the data source layer for the `Config` module. A `ConfigProvider`
 * knows how to load raw configuration nodes from a backing store (environment
 * variables, JSON objects, `.env` files, file trees) and expose them through a
 * uniform `Node` interface that `Config` schemas consume.
 *
 * ## Mental model
 *
 * - **Node** – a discriminated union (`Value | Record | Array`) that describes
 *   what lives at a given path in the configuration tree.
 * - **Path** – an array of string or numeric segments used to address a node
 *   (e.g. `["database", "host"]`).
 * - **ConfigProvider** – an object with a `load(path)` method that resolves a
 *   path to a `Node | undefined`. Providers can be composed and transformed.
 * - **Context.Reference** – `ConfigProvider` is registered as a reference
 *   service that defaults to `fromEnv()`, so it works without explicit
 *   provision.
 * - **SourceError** – the typed error returned when a backing store is
 *   unreadable (I/O failure, permission error, etc.).
 *
 * ## Common tasks
 *
 * - Read from environment variables → {@link fromEnv}
 * - Read from a JSON / plain object → {@link fromUnknown}
 * - Parse a `.env` string → {@link fromDotEnvContents}
 * - Load a `.env` file → {@link fromDotEnv}
 * - Read from a directory tree → {@link fromDir}
 * - Build a custom provider → {@link make}
 * - Fall back to another provider → {@link orElse}
 * - Scope a provider under a prefix → {@link nested}
 * - Convert path segments to `CONSTANT_CASE` → {@link constantCase}
 * - Transform path segments arbitrarily → {@link mapInput}
 * - Install a provider as a Layer → {@link layer} / {@link layerAdd}
 *
 * ## Gotchas
 *
 * - `fromEnv` joins path segments with `_` for lookup **and** splits env var
 *   names on `_` to discover child keys. `DATABASE_HOST=x` is therefore
 *   accessible at both `["DATABASE_HOST"]` and `["DATABASE", "HOST"]`.
 * - Because of `_` splitting, querying a parent path like `["DATABASE"]`
 *   returns a `Record` node with child key `"HOST"`, even if no env var
 *   named `DATABASE` exists.
 * - When using `fromEnv` with schemas that use camelCase keys, pipe the
 *   provider through {@link constantCase} so `databaseHost` resolves to
 *   `DATABASE_HOST`.
 * - `orElse` only falls back when the primary provider returns `undefined`
 *   (path not found). It does **not** catch `SourceError`.
 * - `nested` prepends segments to the path *after* `mapInput` has run, so
 *   the order of composition matters.
 *
 * ## Quickstart
 *
 * **Example** (Reading config from environment variables)
 *
 * ```ts
 * import { Config, ConfigProvider, Effect } from "effect"
 *
 * const provider = ConfigProvider.fromEnv({
 *   env: { APP_PORT: "3000", APP_HOST: "localhost" }
 * })
 *
 * const port = Config.number("port")
 *
 * const program = port.parse(
 *   provider.pipe(
 *     ConfigProvider.nested("app"),
 *     ConfigProvider.constantCase
 *   )
 * )
 *
 * // Effect.runSync(program) // 3000
 * ```
 *
 * @see {@link make} – build a provider from a lookup function
 * @see {@link fromEnv} – the default provider backed by `process.env`
 * @see {@link fromUnknown} – provider backed by a plain JS object
 *
 * @since 4.0.0
 */
import * as Context from "./Context.ts";
import * as Effect from "./Effect.ts";
import * as FileSystem from "./FileSystem.ts";
import * as Layer from "./Layer.ts";
import * as Path_ from "./Path.ts";
import type { Pipeable } from "./Pipeable.ts";
import type { PlatformError } from "./PlatformError.ts";
import type { Scope } from "./Scope.ts";
/**
 * A discriminated union describing the shape of a configuration value at a
 * given path.
 *
 * **When to use**
 *
 * Use when implementing a custom `ConfigProvider` by returning raw
 * nodes from the `get` callback passed to {@link make}, or when inspecting raw
 * provider output before schema parsing.
 *
 * **Details**
 *
 * `Value` is a terminal string leaf. `Record` is an object-like container
 * whose immediate child keys are known and may carry an optional co-located
 * `value`. `Array` is an indexed container with a known `length` and may also
 * carry an optional co-located `value`.
 *
 * @see {@link makeValue} – construct a `Value` node
 * @see {@link makeRecord} – construct a `Record` node
 * @see {@link makeArray} – construct an `Array` node
 *
 * @category models
 * @since 4.0.0
 */
export type Node = 
/** A terminal string value */
{
    readonly _tag: "Value";
    readonly value: string;
}
/** An object; keys are unordered */
 | {
    readonly _tag: "Record";
    readonly keys: ReadonlySet<string>;
    readonly value: string | undefined;
}
/** An array-like container; length is the number of elements */
 | {
    readonly _tag: "Array";
    readonly length: number;
    readonly value: string | undefined;
};
/**
 * Creates a `Value` node representing a terminal string leaf.
 *
 * **When to use**
 *
 * Use when building nodes inside a custom `ConfigProvider`'s `get`
 * callback.
 *
 * **Details**
 *
 * The function returns a new plain object.
 *
 * **Example** (Creating a value node)
 *
 * ```ts
 * import { ConfigProvider } from "effect"
 *
 * const node = ConfigProvider.makeValue("3000")
 * // { _tag: "Value", value: "3000" }
 * ```
 *
 * @see {@link makeRecord} – for object-like containers
 * @see {@link makeArray} – for array-like containers
 *
 * @category constructors
 * @since 4.0.0
 */
export declare function makeValue(value: string): Node;
/**
 * Creates a `Record` node representing an object-like container with known
 * child keys.
 *
 * **When to use**
 *
 * Use when describing a directory or JSON object inside a custom
 * provider.
 *
 * **Details**
 *
 * The optional `value` allows a node to be both a container and a leaf at the
 * same time (for example, an env var `A=x` that also has children `A_FOO` and
 * `A_BAR`).
 *
 * **Example** (Creating a record node)
 *
 * ```ts
 * import { ConfigProvider } from "effect"
 *
 * const node = ConfigProvider.makeRecord(new Set(["host", "port"]))
 * // { _tag: "Record", keys: Set(["host", "port"]), value: undefined }
 * ```
 *
 * @see {@link makeValue} – for terminal leaves
 * @see {@link makeArray} – for array-like containers
 *
 * @category constructors
 * @since 4.0.0
 */
export declare function makeRecord(keys: ReadonlySet<string>, value?: string): Node;
/**
 * Creates an `Array` node representing an indexed container with a known
 * length.
 *
 * **When to use**
 *
 * Use when describing a JSON array or a set of numerically-indexed env
 * vars inside a custom provider.
 *
 * **Details**
 *
 * The optional `value` allows a node to be both a container and a leaf at the
 * same time.
 *
 * **Example** (Creating an array node)
 *
 * ```ts
 * import { ConfigProvider } from "effect"
 *
 * const node = ConfigProvider.makeArray(3)
 * // { _tag: "Array", length: 3, value: undefined }
 * ```
 *
 * @see {@link makeValue} – for terminal leaves
 * @see {@link makeRecord} – for object-like containers
 *
 * @category constructors
 * @since 4.0.0
 */
export declare function makeArray(length: number, value?: string): Node;
declare const SourceError_base: new <A extends Record<string, any> = {}>(args: import("./Types.ts").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("./Cause.ts").YieldableError & {
    readonly _tag: "SourceError";
} & Readonly<A>;
/**
 * Typed error indicating that a configuration source could not be read.
 *
 * **When to use**
 *
 * Use when you use this from a custom provider's `get` callback when the underlying store
 * is unreachable or produces an I/O error, or match on it in error channels
 * when consuming provider output directly.
 *
 * **Gotchas**
 *
 * Do not use `SourceError` for "key not found". That case is represented by
 * returning `undefined` from `load` or `get`.
 *
 * **Example** (Failing with a SourceError)
 *
 * ```ts
 * import { ConfigProvider, Effect } from "effect"
 *
 * const provider = ConfigProvider.make((_path) =>
 *   Effect.fail(
 *     new ConfigProvider.SourceError({ message: "connection refused" })
 *   )
 * )
 * ```
 *
 * @see {@link ConfigProvider} – the interface whose `load`/`get` may fail
 *   with this error
 *
 * @category models
 * @since 4.0.0
 */
export declare class SourceError extends SourceError_base<{
    readonly message: string;
    readonly cause?: unknown;
}> {
}
/**
 * An ordered sequence of string or numeric segments that addresses a node in
 * the configuration tree. String segments name object keys; numeric segments
 * index into arrays.
 *
 * **When to use**
 *
 * Use to address raw configuration nodes when implementing or transforming a
 * `ConfigProvider`.
 *
 * **Example** (A typical config path)
 *
 * ```ts
 * import type { ConfigProvider } from "effect"
 *
 * const path: ConfigProvider.Path = ["database", "replicas", 0, "host"]
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export type Path = ReadonlyArray<string | number>;
/**
 * The core interface for loading raw configuration data.
 *
 * **When to use**
 *
 * Use to type-annotate variables that hold a provider or to implement a
 * custom provider via {@link make}.
 *
 * **Details**
 *
 * `load(path)` resolves `mapInput` and `prefix` transformations, then
 * delegates to `get`. This is what the `Config` module calls. `get(path)` is
 * raw access to the underlying store without path transformations.
 * `mapInput` and `prefix` are optional path transformations set by
 * {@link mapInput} and {@link nested}. All methods return
 * `Effect<Node | undefined, SourceError>`: `undefined` means "not found" and
 * `SourceError` means the source itself failed.
 *
 * @see {@link make} – construct a provider from a lookup function
 * @see {@link orElse} – compose providers with fallback
 *
 * @category models
 * @since 2.0.0
 */
export interface ConfigProvider extends Pipeable {
    /**
     * Returns the node found at `path`, or `undefined` if it does not exist.
     * Fails with `SourceError` when the underlying source cannot be read.
     *
     * **When to use**
     *
     * Use to resolve a path through this provider's path transformations before
     * reading the backing source.
     */
    readonly load: (path: Path) => Effect.Effect<Node | undefined, SourceError>;
    /**
     * Raw access to the underlying source.
     *
     * **When to use**
     *
     * Use to read from the backing source without applying this provider's path
     * transformations.
     */
    readonly get: (path: Path) => Effect.Effect<Node | undefined, SourceError>;
    /**
     * Function to map the input path.
     *
     * **When to use**
     *
     * Use to store the path transformation applied before raw provider lookup.
     */
    readonly mapInput: ((path: Path) => Path) | undefined;
    /**
     * Prefix to add to the input path.
     *
     * **When to use**
     *
     * Use to store the path prefix applied before raw provider lookup.
     */
    readonly prefix: Path | undefined;
}
/**
 * Context reference for the active raw configuration provider, registered in the context with a
 * default value of `fromEnv()`. Because it is a `Context.Reference`, it is
 * available without explicit provision; `Config` schemas automatically resolve
 * it.
 *
 * **When to use**
 *
 * Use to override the provider for an entire program via
 * `Effect.provideService(ConfigProvider.ConfigProvider, myProvider)`, or to
 * retrieve the current provider inside an Effect with
 * `yield* ConfigProvider.ConfigProvider`.
 *
 * **Example** (Providing a custom provider)
 *
 * ```ts
 * import { ConfigProvider, Effect } from "effect"
 *
 * const provider = ConfigProvider.fromUnknown({ port: 8080 })
 *
 * const program = Effect.gen(function*() {
 *   const current = yield* ConfigProvider.ConfigProvider
 *   return current
 * }).pipe(
 *   Effect.provideService(ConfigProvider.ConfigProvider, provider)
 * )
 * ```
 *
 * @see {@link layer} – install a provider as a Layer
 * @see {@link layerAdd} – add a fallback provider as a Layer
 *
 * @category services
 * @since 2.0.0
 */
export declare const ConfigProvider: Context.Reference<ConfigProvider>;
/**
 * Creates a `ConfigProvider` from a raw lookup function.
 *
 * **When to use**
 *
 * Use when implementing a provider backed by a custom store, such as a
 * database, remote API, or in-memory map.
 *
 * **Details**
 *
 * The `get` callback receives a `Path` and must return
 * `Effect<Node | undefined, SourceError>`. Return `undefined` when the path
 * does not exist; fail with `SourceError` only for actual I/O errors.
 *
 * The optional `mapInput` and `prefix` parameters are wired into the
 * resulting `load` method so that combinators like {@link mapInput} and
 * {@link nested} can compose without wrapping `get`.
 *
 * **Example** (A simple in-memory provider)
 *
 * ```ts
 * import { ConfigProvider, Effect } from "effect"
 *
 * const data: Record<string, string> = {
 *   host: "localhost",
 *   port: "5432"
 * }
 *
 * const provider = ConfigProvider.make((path) => {
 *   const key = path.join(".")
 *   const value = data[key]
 *   return Effect.succeed(
 *     value !== undefined ? ConfigProvider.makeValue(value) : undefined
 *   )
 * })
 * ```
 *
 * @see {@link fromEnv} – pre-built provider for environment variables
 * @see {@link fromUnknown} – pre-built provider for JSON objects
 *
 * @category constructors
 * @since 2.0.0
 */
export declare function make(get: (path: Path) => Effect.Effect<Node | undefined, SourceError>, mapInput?: (path: Path) => Path, prefix?: Path): ConfigProvider;
/**
 * Returns a provider that falls back to `that` when `self` returns `undefined`
 * for a path.
 *
 * **When to use**
 *
 * Use to layer multiple config sources, such as env vars plus a defaults
 * file, or to provide partial overrides on top of a base config.
 *
 * **Details**
 *
 * Supports both data-last and data-first calling conventions.
 *
 * **Gotchas**
 *
 * The fallback only runs when the path is not found (`undefined`). A
 * `SourceError` from `self` is not caught; it propagates immediately.
 *
 * **Example** (Falling back to a default provider)
 *
 * ```ts
 * import { ConfigProvider } from "effect"
 *
 * const envProvider = ConfigProvider.fromEnv({
 *   env: { HOST: "prod.example.com" }
 * })
 * const defaults = ConfigProvider.fromUnknown({ HOST: "localhost", PORT: "3000" })
 *
 * const combined = ConfigProvider.orElse(envProvider, defaults)
 * ```
 *
 * @see {@link layerAdd} – install a fallback provider via a Layer
 *
 * @category combinators
 * @since 2.0.0
 */
export declare const orElse: {
    /**
     * Returns a provider that falls back to `that` when `self` returns `undefined`
     * for a path.
     *
     * **When to use**
     *
     * Use to layer multiple config sources, such as env vars plus a defaults
     * file, or to provide partial overrides on top of a base config.
     *
     * **Details**
     *
     * Supports both data-last and data-first calling conventions.
     *
     * **Gotchas**
     *
     * The fallback only runs when the path is not found (`undefined`). A
     * `SourceError` from `self` is not caught; it propagates immediately.
     *
     * **Example** (Falling back to a default provider)
     *
     * ```ts
     * import { ConfigProvider } from "effect"
     *
     * const envProvider = ConfigProvider.fromEnv({
     *   env: { HOST: "prod.example.com" }
     * })
     * const defaults = ConfigProvider.fromUnknown({ HOST: "localhost", PORT: "3000" })
     *
     * const combined = ConfigProvider.orElse(envProvider, defaults)
     * ```
     *
     * @see {@link layerAdd} – install a fallback provider via a Layer
     *
     * @category combinators
     * @since 2.0.0
     */
    (that: ConfigProvider): (self: ConfigProvider) => ConfigProvider;
    /**
     * Returns a provider that falls back to `that` when `self` returns `undefined`
     * for a path.
     *
     * **When to use**
     *
     * Use to layer multiple config sources, such as env vars plus a defaults
     * file, or to provide partial overrides on top of a base config.
     *
     * **Details**
     *
     * Supports both data-last and data-first calling conventions.
     *
     * **Gotchas**
     *
     * The fallback only runs when the path is not found (`undefined`). A
     * `SourceError` from `self` is not caught; it propagates immediately.
     *
     * **Example** (Falling back to a default provider)
     *
     * ```ts
     * import { ConfigProvider } from "effect"
     *
     * const envProvider = ConfigProvider.fromEnv({
     *   env: { HOST: "prod.example.com" }
     * })
     * const defaults = ConfigProvider.fromUnknown({ HOST: "localhost", PORT: "3000" })
     *
     * const combined = ConfigProvider.orElse(envProvider, defaults)
     * ```
     *
     * @see {@link layerAdd} – install a fallback provider via a Layer
     *
     * @category combinators
     * @since 2.0.0
     */
    (self: ConfigProvider, that: ConfigProvider): ConfigProvider;
};
/**
 * Transforms the path segments before they reach the underlying store.
 *
 * **When to use**
 *
 * Use when you use this for renaming or re-casing path segments, or for adding suffixes and
 * other per-segment transformations. See {@link constantCase} for a common
 * specialization.
 *
 * **Details**
 *
 * The function `f` receives the full path and must return a new path. If the
 * provider already has a `mapInput`, the functions compose: the existing
 * mapping runs first, then `f`. Supports both data-last and data-first calling
 * conventions.
 *
 * **Example** (Uppercasing path segments)
 *
 * ```ts
 * import { ConfigProvider } from "effect"
 *
 * const provider = ConfigProvider.fromEnv({
 *   env: { APP_HOST: "localhost" }
 * })
 *
 * const upper = ConfigProvider.mapInput(provider, (path) =>
 *   path.map((seg) =>
 *     typeof seg === "string" ? seg.toUpperCase() : seg
 *   )
 * )
 * ```
 *
 * @see {@link constantCase} – a preset that converts to `CONSTANT_CASE`
 * @see {@link nested} – for prepending a prefix instead of transforming
 *
 * @category combinators
 * @since 4.0.0
 */
export declare const mapInput: {
    /**
     * Transforms the path segments before they reach the underlying store.
     *
     * **When to use**
     *
     * Use when you use this for renaming or re-casing path segments, or for adding suffixes and
     * other per-segment transformations. See {@link constantCase} for a common
     * specialization.
     *
     * **Details**
     *
     * The function `f` receives the full path and must return a new path. If the
     * provider already has a `mapInput`, the functions compose: the existing
     * mapping runs first, then `f`. Supports both data-last and data-first calling
     * conventions.
     *
     * **Example** (Uppercasing path segments)
     *
     * ```ts
     * import { ConfigProvider } from "effect"
     *
     * const provider = ConfigProvider.fromEnv({
     *   env: { APP_HOST: "localhost" }
     * })
     *
     * const upper = ConfigProvider.mapInput(provider, (path) =>
     *   path.map((seg) =>
     *     typeof seg === "string" ? seg.toUpperCase() : seg
     *   )
     * )
     * ```
     *
     * @see {@link constantCase} – a preset that converts to `CONSTANT_CASE`
     * @see {@link nested} – for prepending a prefix instead of transforming
     *
     * @category combinators
     * @since 4.0.0
     */
    (f: (path: Path) => Path): (self: ConfigProvider) => ConfigProvider;
    /**
     * Transforms the path segments before they reach the underlying store.
     *
     * **When to use**
     *
     * Use when you use this for renaming or re-casing path segments, or for adding suffixes and
     * other per-segment transformations. See {@link constantCase} for a common
     * specialization.
     *
     * **Details**
     *
     * The function `f` receives the full path and must return a new path. If the
     * provider already has a `mapInput`, the functions compose: the existing
     * mapping runs first, then `f`. Supports both data-last and data-first calling
     * conventions.
     *
     * **Example** (Uppercasing path segments)
     *
     * ```ts
     * import { ConfigProvider } from "effect"
     *
     * const provider = ConfigProvider.fromEnv({
     *   env: { APP_HOST: "localhost" }
     * })
     *
     * const upper = ConfigProvider.mapInput(provider, (path) =>
     *   path.map((seg) =>
     *     typeof seg === "string" ? seg.toUpperCase() : seg
     *   )
     * )
     * ```
     *
     * @see {@link constantCase} – a preset that converts to `CONSTANT_CASE`
     * @see {@link nested} – for prepending a prefix instead of transforming
     *
     * @category combinators
     * @since 4.0.0
     */
    (self: ConfigProvider, f: (path: Path) => Path): ConfigProvider;
};
/**
 * Converts all string path segments to `CONSTANT_CASE` before lookup.
 *
 * **When to use**
 *
 * Use to bridge camelCase schema keys to `SCREAMING_SNAKE_CASE`
 * environment variables.
 *
 * **Details**
 *
 * Numeric segments are left unchanged. This is a specialization of
 * {@link mapInput}.
 *
 * **Example** (Resolving camelCase keys to env vars)
 *
 * ```ts
 * import { ConfigProvider } from "effect"
 *
 * const provider = ConfigProvider.fromEnv({
 *   env: { DATABASE_HOST: "localhost" }
 * }).pipe(ConfigProvider.constantCase)
 *
 * // path ["databaseHost"] now resolves to env var DATABASE_HOST
 * ```
 *
 * @see {@link mapInput} – for arbitrary path transformations
 *
 * @category combinators
 * @since 2.0.0
 */
export declare const constantCase: (self: ConfigProvider) => ConfigProvider;
/**
 * Scopes a provider so that all lookups are prefixed with the given path
 * segments.
 *
 * **When to use**
 *
 * Use to namespace config under a prefix like `"app"` or `"database"`, or
 * to reuse the same provider shape for multiple sub-configs.
 *
 * **Details**
 *
 * Accepts a single string or a full `Path` array. Supports both data-last and
 * data-first calling conventions.
 *
 * **Gotchas**
 *
 * The prefix is prepended after any `mapInput` transformation runs, so
 * ordering matters when composing with {@link mapInput} or
 * {@link constantCase}.
 *
 * **Example** (Nesting under a prefix)
 *
 * ```ts
 * import { ConfigProvider } from "effect"
 *
 * const provider = ConfigProvider.fromEnv({
 *   env: { APP_HOST: "localhost", APP_PORT: "3000" }
 * })
 *
 * // Lookups for ["HOST"] now resolve to ["APP", "HOST"]
 * const scoped = ConfigProvider.nested(provider, "APP")
 * ```
 *
 * @see {@link mapInput} – for arbitrary path transformations
 *
 * @category combinators
 * @since 2.0.0
 */
export declare const nested: {
    /**
     * Scopes a provider so that all lookups are prefixed with the given path
     * segments.
     *
     * **When to use**
     *
     * Use to namespace config under a prefix like `"app"` or `"database"`, or
     * to reuse the same provider shape for multiple sub-configs.
     *
     * **Details**
     *
     * Accepts a single string or a full `Path` array. Supports both data-last and
     * data-first calling conventions.
     *
     * **Gotchas**
     *
     * The prefix is prepended after any `mapInput` transformation runs, so
     * ordering matters when composing with {@link mapInput} or
     * {@link constantCase}.
     *
     * **Example** (Nesting under a prefix)
     *
     * ```ts
     * import { ConfigProvider } from "effect"
     *
     * const provider = ConfigProvider.fromEnv({
     *   env: { APP_HOST: "localhost", APP_PORT: "3000" }
     * })
     *
     * // Lookups for ["HOST"] now resolve to ["APP", "HOST"]
     * const scoped = ConfigProvider.nested(provider, "APP")
     * ```
     *
     * @see {@link mapInput} – for arbitrary path transformations
     *
     * @category combinators
     * @since 2.0.0
     */
    (prefix: string | Path): (self: ConfigProvider) => ConfigProvider;
    /**
     * Scopes a provider so that all lookups are prefixed with the given path
     * segments.
     *
     * **When to use**
     *
     * Use to namespace config under a prefix like `"app"` or `"database"`, or
     * to reuse the same provider shape for multiple sub-configs.
     *
     * **Details**
     *
     * Accepts a single string or a full `Path` array. Supports both data-last and
     * data-first calling conventions.
     *
     * **Gotchas**
     *
     * The prefix is prepended after any `mapInput` transformation runs, so
     * ordering matters when composing with {@link mapInput} or
     * {@link constantCase}.
     *
     * **Example** (Nesting under a prefix)
     *
     * ```ts
     * import { ConfigProvider } from "effect"
     *
     * const provider = ConfigProvider.fromEnv({
     *   env: { APP_HOST: "localhost", APP_PORT: "3000" }
     * })
     *
     * // Lookups for ["HOST"] now resolve to ["APP", "HOST"]
     * const scoped = ConfigProvider.nested(provider, "APP")
     * ```
     *
     * @see {@link mapInput} – for arbitrary path transformations
     *
     * @category combinators
     * @since 2.0.0
     */
    (self: ConfigProvider, prefix: string | Path): ConfigProvider;
};
/**
 * Provides a layer that installs a `ConfigProvider` as the active provider for
 * all downstream effects, replacing any previously installed provider.
 *
 * **When to use**
 *
 * Use to set the config source for an entire application or test suite.
 *
 * **Details**
 *
 * Accepts either a plain `ConfigProvider` or an `Effect` that produces one.
 * When given an Effect, it is evaluated once when the layer is built.
 *
 * **Example** (Using a JSON object as the config source)
 *
 * ```ts
 * import { Config, ConfigProvider, Effect, Layer } from "effect"
 *
 * const TestLayer = ConfigProvider.layer(
 *   ConfigProvider.fromUnknown({ port: 8080 })
 * )
 *
 * const program = Effect.gen(function*() {
 *   const port = yield* Config.number("port")
 *   return port
 * })
 *
 * // Effect.runSync(Effect.provide(program, TestLayer)) // 8080
 * ```
 *
 * @see {@link layerAdd} – add a provider without replacing the existing one
 *
 * @category layers
 * @since 4.0.0
 */
export declare const layer: <E = never, R = never>(self: ConfigProvider | Effect.Effect<ConfigProvider, E, R>) => Layer.Layer<never, E, Exclude<R, Scope>>;
/**
 * Creates a Layer that composes a new `ConfigProvider` with the currently
 * active one, rather than replacing it.
 *
 * **When to use**
 *
 * Use to add defaults that should only apply when the primary provider
 * has no value for a path, or to override specific keys while keeping the rest
 * from the existing provider by setting `asPrimary: true`.
 *
 * **Details**
 *
 * By default, the new provider acts as a fallback and is consulted only when
 * the current provider returns `undefined`. Set `asPrimary: true` to make the
 * new provider the primary source, with the existing one as fallback.
 *
 * **Example** (Adding default values)
 *
 * ```ts
 * import { ConfigProvider } from "effect"
 *
 * const defaults = ConfigProvider.fromUnknown({
 *   HOST: "localhost",
 *   PORT: "3000"
 * })
 *
 * // The current env provider is tried first; `defaults` is the fallback
 * const DefaultsLayer = ConfigProvider.layerAdd(defaults)
 * ```
 *
 * @see {@link layer} – replace the provider entirely
 * @see {@link orElse} – compose providers without layers
 *
 * @category layers
 * @since 4.0.0
 */
export declare const layerAdd: <E = never, R = never>(self: ConfigProvider | Effect.Effect<ConfigProvider, E, R>, options?: {
    readonly asPrimary?: boolean | undefined;
} | undefined) => Layer.Layer<never, E, Exclude<R, Scope>>;
/**
 * Creates a `ConfigProvider` backed by an in-memory JavaScript value
 * (typically a parsed JSON object).
 *
 * **When to use**
 *
 * Use when you use this in unit or integration tests where you want deterministic config
 * without touching the environment, or when embedding config directly in code
 * or reading a JSON file.
 *
 * **Details**
 *
 * Path traversal follows standard JS rules: string segments index into object
 * keys, numeric segments index into arrays. Returns `undefined` for any path
 * that cannot be resolved. Never fails with `SourceError`.
 *
 * Primitive values (`number`, `boolean`, `bigint`) are stringified via
 * `String(...)`.
 *
 * **Example** (Providing config from a plain object)
 *
 * ```ts
 * import { Config, ConfigProvider, Effect } from "effect"
 *
 * const provider = ConfigProvider.fromUnknown({
 *   database: {
 *     host: "localhost",
 *     port: 5432
 *   }
 * })
 *
 * const host = Config.string("host").parse(
 *   provider.pipe(ConfigProvider.nested("database"))
 * )
 *
 * // Effect.runSync(host) // "localhost"
 * ```
 *
 * @see {@link fromEnv} – for environment variables
 * @see {@link make} – for custom backing stores
 *
 * @category ConfigProviders
 * @since 4.0.0
 */
export declare function fromUnknown(root: unknown): ConfigProvider;
/**
 * Creates a `ConfigProvider` backed by environment variables.
 *
 * **When to use**
 *
 * Use to read configuration from `process.env`, which is the default when
 * no provider is explicitly set, or to pass a custom env record for testing or
 * non-Node runtimes.
 *
 * **Details**
 *
 * Path segments are joined with `_` for direct lookup, and env var names are
 * also split on `_` to build a trie for child key discovery. This means
 * `DATABASE_HOST=localhost` is accessible at both path `["DATABASE_HOST"]`
 * and `["DATABASE", "HOST"]`. If all immediate children of a trie node have
 * purely numeric names, the node is reported as an `Array`; otherwise as a
 * `Record`.
 *
 * The default environment merges `process.env` and `import.meta.env` (when
 * available). Override by passing `{ env: { ... } }`.
 *
 * Never fails with `SourceError` — all lookups are synchronous.
 *
 * **Example** (Reading from a custom env record)
 *
 * ```ts
 * import { Config, ConfigProvider, Effect } from "effect"
 *
 * const provider = ConfigProvider.fromEnv({
 *   env: {
 *     DATABASE_HOST: "localhost",
 *     DATABASE_PORT: "5432"
 *   }
 * })
 *
 * const host = Config.string("HOST").parse(
 *   provider.pipe(ConfigProvider.nested("DATABASE"))
 * )
 *
 * // Effect.runSync(host) // "localhost"
 * ```
 *
 * @see {@link fromUnknown} – for JSON objects
 * @see {@link constantCase} – bridge camelCase keys to SCREAMING_SNAKE_CASE
 *
 * @category ConfigProviders
 * @since 2.0.0
 */
export declare function fromEnv(options?: {
    readonly env?: Record<string, string> | undefined;
}): ConfigProvider;
/**
 * Creates a `ConfigProvider` by parsing the string contents of a `.env` file.
 *
 * **When to use**
 *
 * Use when you already have the `.env` contents as a string, such as
 * contents fetched from a remote store or embedded in a test. Use
 * {@link fromDotEnv} instead if you want to read a `.env` file from disk.
 *
 * **Details**
 *
 * Supports `export` prefixes, single/double/backtick quoting, inline comments,
 * and escaped newlines. Variable expansion (for example, `${VAR}`) is disabled
 * by default; enable with `{ expandVariables: true }`.
 *
 * Parsing is based on the `dotenv` / `dotenv-expand` algorithm.
 *
 * Internally delegates to {@link fromEnv} with the parsed key-value pairs.
 *
 * **Example** (Parsing .env contents)
 *
 * ```ts
 * import { ConfigProvider } from "effect"
 *
 * const contents = `
 * HOST=localhost
 * PORT=3000
 * # this is a comment
 * `
 *
 * const provider = ConfigProvider.fromDotEnvContents(contents)
 * ```
 *
 * @see {@link fromDotEnv} – loads a `.env` file from disk
 * @see {@link fromEnv} – for raw environment variable access
 *
 * @category ConfigProviders
 * @since 4.0.0
 */
export declare function fromDotEnvContents(lines: string, options?: {
    readonly expandVariables?: boolean | undefined;
}): ConfigProvider;
/**
 * Creates a `ConfigProvider` by reading and parsing a `.env` file from the
 * file system.
 *
 * **When to use**
 *
 * Use to load environment config from a `.env` file at application
 * startup. Use {@link fromDotEnvContents} if you already have the file
 * contents as a string.
 *
 * **Details**
 *
 * Requires `FileSystem` in the Effect context. Defaults to reading `".env"` in
 * the current directory; override with `{ path: "/custom/.env" }`.
 *
 * Returns an `Effect` that resolves to a `ConfigProvider`. Fails with a
 * `PlatformError` if the file cannot be read.
 *
 * **Example** (Loading a .env file)
 *
 * ```ts
 * import { ConfigProvider, Effect } from "effect"
 *
 * const program = Effect.gen(function*() {
 *   const provider = yield* ConfigProvider.fromDotEnv()
 *   return provider
 * })
 * ```
 *
 * @see {@link fromDotEnvContents} – parse a `.env` string directly
 * @see {@link fromEnv} – read from the runtime environment
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const fromDotEnv: (options?: {
    readonly path?: string | undefined;
    readonly expandVariables?: boolean | undefined;
}) => Effect.Effect<ConfigProvider, PlatformError, FileSystem.FileSystem>;
/**
 * Creates a `ConfigProvider` that reads configuration from a directory tree
 * on disk, where each file is a leaf value and each directory is a container.
 *
 * **When to use**
 *
 * Use when you use this for Kubernetes ConfigMap or Secret volume mounts, where each key is
 * a file under a mount path, or for any file-per-key configuration layout.
 *
 * **Details**
 *
 * Resolution tries a regular file first and returns a `Value` node with
 * trimmed file contents. If the file read fails, it tries a directory and
 * returns a `Record` node with immediate child names as keys. If both fail, it
 * returns `SourceError`.
 *
 * Requires `Path` and `FileSystem` in the Effect context. Defaults to root
 * path `/`; override with `{ rootPath: "/etc/config" }`.
 *
 * **Example** (Reading config from a directory)
 *
 * ```ts
 * import { ConfigProvider, Effect } from "effect"
 *
 * const program = Effect.gen(function*() {
 *   const provider = yield* ConfigProvider.fromDir({
 *     rootPath: "/etc/myapp"
 *   })
 *   return provider
 * })
 * ```
 *
 * @see {@link fromEnv} – for environment variables
 * @see {@link fromDotEnv} – for `.env` files
 *
 * @category ConfigProviders
 * @since 4.0.0
 */
export declare const fromDir: (options?: {
    readonly rootPath?: string | undefined;
}) => Effect.Effect<ConfigProvider, never, Path_.Path | FileSystem.FileSystem>;
export {};
//# sourceMappingURL=ConfigProvider.d.ts.map