diff --git a/.changeset/young-terms-wink.md b/.changeset/young-terms-wink.md new file mode 100644 index 000000000..330a8fda8 --- /dev/null +++ b/.changeset/young-terms-wink.md @@ -0,0 +1,5 @@ +--- +"@effect/schema": patch +--- + +int filter: use Number.isSafeInteger instead of Number.isInteger diff --git a/src/Schema.ts b/src/Schema.ts index 1f9d82873..506b64d33 100644 --- a/src/Schema.ts +++ b/src/Schema.ts @@ -1973,7 +1973,7 @@ export const IntTypeId = Symbol.for("@effect/schema/TypeId/Int") export const int = (options?: FilterAnnotations) => (self: Schema): Schema => self.pipe( - filter((a): a is A => Number.isInteger(a), { + filter((a): a is A => Number.isSafeInteger(a), { typeId: IntTypeId, description: "integer", jsonSchema: { type: "integer" }, diff --git a/test/Schema/fromBrand.test.ts b/test/Schema/fromBrand.test.ts index 2f0f318f4..854a86c0f 100644 --- a/test/Schema/fromBrand.test.ts +++ b/test/Schema/fromBrand.test.ts @@ -4,7 +4,7 @@ import * as Util from "@effect/schema/test/util" type Int = number & Brand.Brand<"Int"> const Int = Brand.refined( - (n) => Number.isInteger(n), + (n) => Number.isSafeInteger(n), (n) => Brand.error(`Expected ${n} to be an integer`) ) diff --git a/test/number/int.test.ts b/test/number/int.test.ts index 5d29762f8..1315738ac 100644 --- a/test/number/int.test.ts +++ b/test/number/int.test.ts @@ -3,7 +3,7 @@ import * as Pretty from "@effect/schema/Pretty" import * as S from "@effect/schema/Schema" import * as Util from "@effect/schema/test/util" -const schema = S.number.pipe(S.int()) +const schema = S.Int describe("number/int", () => { it("property tests", () => { @@ -15,6 +15,8 @@ describe("number/int", () => { expect(is(0)).toEqual(true) expect(is(1)).toEqual(true) expect(is(0.5)).toEqual(false) + expect(is(Number.MAX_SAFE_INTEGER + 1)).toEqual(false) + expect(is(Number.MIN_SAFE_INTEGER - 1)).toEqual(false) }) it("decoding", async () => {