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") ) })