diff --git a/.changeset/red-boxes-own.md b/.changeset/red-boxes-own.md
new file mode 100644
index 0000000000..a8c36872e7
--- /dev/null
+++ b/.changeset/red-boxes-own.md
@@ -0,0 +1,5 @@
+---
+"effect": patch
+---
+
+only wrap objects with string keys in Config.Wrap
diff --git a/packages/effect/src/Config.ts b/packages/effect/src/Config.ts
index 0893446f03..0751a77ffd 100644
--- a/packages/effect/src/Config.ts
+++ b/packages/effect/src/Config.ts
@@ -69,13 +69,11 @@ export declare namespace Config {
* @since 2.0.0
* @category models
*/
- export type Wrap = [NonNullable] extends [infer T] ? [T] extends [Function] ? Config :
- [T] extends [ReadonlyArray] ? Config :
- [T] extends [Record] ?
- | {
- [K in keyof A]: Wrap
- }
- | Config
+ export type Wrap = [NonNullable] extends [infer T] ?
+ [T] extends [Record] ? [Exclude] extends [never] ?
+ | { readonly [K in keyof A]: Wrap }
+ | Config
+ : Config
: Config
: Config
}
diff --git a/packages/effect/test/Config.test.ts b/packages/effect/test/Config.test.ts
index 0ade66cdd2..b23ff69c10 100644
--- a/packages/effect/test/Config.test.ts
+++ b/packages/effect/test/Config.test.ts
@@ -385,6 +385,8 @@ describe("Config", () => {
_: Config.Config.Wrap<{
key1: number
list: ReadonlyArray
+ option: Option.Option
+ secret: Secret.Secret
nested?:
| Partial<{
key2: string
@@ -396,20 +398,27 @@ describe("Config", () => {
const config = wrapper({
key1: Config.integer("key1"),
list: Config.array(Config.integer(), "items"),
+ option: Config.option(Config.integer("option")),
+ secret: Config.secret("secret"),
nested: {
key2: Config.string("key2")
}
})
- assertSuccess(config, [["key1", "123"], ["items", "1,2,3"], ["key2", "value"]], {
+ assertSuccess(config, [["key1", "123"], ["items", "1,2,3"], ["option", "123"], ["secret", "sauce"], [
+ "key2",
+ "value"
+ ]], {
key1: 123,
list: [1, 2, 3],
+ option: Option.some(123),
+ secret: Secret.fromString("sauce"),
nested: {
key2: "value"
}
})
assertFailure(
config,
- [["key1", "123"], ["items", "1,value,3"], ["key2", "value"]],
+ [["key1", "123"], ["items", "1,value,3"], ["option", "123"], ["secret", "sauce"], ["key2", "value"]],
ConfigError.InvalidData(["items"], "Expected an integer value but received value")
)
})