diff --git a/src/util/OrmUtils.ts b/src/util/OrmUtils.ts index 3d9e2cccc9..87aad7ea68 100644 --- a/src/util/OrmUtils.ts +++ b/src/util/OrmUtils.ts @@ -1,4 +1,5 @@ import { ObjectLiteral } from "../common/ObjectLiteral"; +import { URL } from "url"; export class OrmUtils { @@ -82,7 +83,8 @@ export class OrmUtils { && !(value instanceof Set) && !(value instanceof Date) && !(value instanceof Buffer) - && !(value instanceof RegExp)) { + && !(value instanceof RegExp) + && !(value instanceof URL)) { if (!target[key]) Object.assign(target, { [key]: Object.create(Object.getPrototypeOf(value)) }); this.mergeDeep(target[key], value); @@ -192,7 +194,8 @@ export class OrmUtils { (x instanceof Date && y instanceof Date) || (x instanceof RegExp && y instanceof RegExp) || (x instanceof String && y instanceof String) || - (x instanceof Number && y instanceof Number)) + (x instanceof Number && y instanceof Number) || + (x instanceof URL && y instanceof URL)) return x.toString() === y.toString(); // At last checking prototypes as good as we can diff --git a/test/github-issues/5762/entity/User.ts b/test/github-issues/5762/entity/User.ts new file mode 100644 index 0000000000..6fd70a6141 --- /dev/null +++ b/test/github-issues/5762/entity/User.ts @@ -0,0 +1,24 @@ +import {Entity} from "../../../../src/decorator/entity/Entity"; +import {PrimaryColumn, Column} from "../../../../src"; +import { URL } from "url"; + +@Entity() +export class User { + + @PrimaryColumn() + id: number; + + @Column("varchar", { + // marshall + transformer: { + from(value: string): URL { + return new URL(value); + }, + to(value: URL): string { + return value.toString(); + }, + }, + }) + url: URL; + +} diff --git a/test/github-issues/5762/issue-5762.ts b/test/github-issues/5762/issue-5762.ts new file mode 100644 index 0000000000..7f90cd23be --- /dev/null +++ b/test/github-issues/5762/issue-5762.ts @@ -0,0 +1,39 @@ +import "reflect-metadata"; +import {expect} from "chai"; +import {Connection} from "../../../src"; +import {User} from "./entity/User"; +import {createTestingConnections, reloadTestingDatabases, closeTestingConnections} from "../../utils/test-utils"; +import { URL } from "url"; + +describe("github issues > #5762 `Using URL as a rich column type breaks", () => { + + let connections: Connection[]; + + before(async () => { + connections = await createTestingConnections({ + entities: [User], + schemaCreate: true, + dropSchema: true + }); + }); + beforeEach(() => reloadTestingDatabases(connections)); + after(() => closeTestingConnections(connections)); + + it("should allow assigning URL as a field value", () => + Promise.all(connections.map(async (connection) => { + const userRepository = connection.getRepository(User); + + const url = new URL("https://typeorm.io"); + + const user = new User(); + user.id = 1; + user.url = url; + + const promise = userRepository.save(user); + + return expect(promise).to.eventually.be.deep.equal(user) + .and.to.have.property("url").be.instanceOf(URL) + .and.to.have.nested.property("href").equal(url.href); + }))); + +});