From cea266a67b8f17cd4b431cf3f5550732573f3e9d Mon Sep 17 00:00:00 2001 From: Yukan ZHAO Date: Fri, 3 Jun 2022 15:18:12 +0200 Subject: [PATCH] feat: add support for Temporal objects --- index.js | 13 ++++ package-lock.json | 44 ++++++++++++-- package.json | 1 + test/temporal-types.js | 135 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 189 insertions(+), 4 deletions(-) create mode 100644 test/temporal-types.js diff --git a/index.js b/index.js index 8b65f8f..0ebe47c 100644 --- a/index.js +++ b/index.js @@ -234,6 +234,19 @@ function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandTyp return entriesEqual(leftHandOperand, rightHandOperand, options); case 'Map': return entriesEqual(leftHandOperand, rightHandOperand, options); + case 'Temporal.PlainDate': + case 'Temporal.PlainTime': + case 'Temporal.PlainDateTime': + case 'Temporal.Instant': + case 'Temporal.ZonedDateTime': + case 'Temporal.PlainYearMonth': + case 'Temporal.PlainMonthDay': + return leftHandOperand.equals(rightHandOperand); + case 'Temporal.Duration': + return leftHandOperand.total('nanoseconds') === rightHandOperand.total('nanoseconds'); + case 'Temporal.TimeZone': + case 'Temporal.Calendar': + return leftHandOperand.toString() === rightHandOperand.toString(); default: return objectEqual(leftHandOperand, rightHandOperand, options); } diff --git a/package-lock.json b/package-lock.json index 21e706e..99c4f72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,18 @@ { "name": "deep-eql", + "version": "4.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "deep-eql", + "version": "4.0.1", "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, "devDependencies": { + "@js-temporal/polyfill": "^0.4.1", "benchmark": "^2.1.0", "browserify": "^17.0.0", "browserify-istanbul": "^3.0.1", @@ -35,8 +38,7 @@ }, "engines": { "node": ">=6" - }, - "version": "4.0.1" + } }, "node_modules/@babel/code-frame": { "version": "7.14.5", @@ -522,6 +524,19 @@ "node": ">=8" } }, + "node_modules/@js-temporal/polyfill": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.1.tgz", + "integrity": "sha512-q45ecIocpa2TLem2jNOsCrDwP/sgKZdSkt+C1Rx07OkdKsdbvVfHcD1iDiK9scxBZrBQ38uJ8VQISXBS70ql1w==", + "dev": true, + "dependencies": { + "jsbi": "^4.1.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", @@ -7394,6 +7409,12 @@ "node": ">=4" } }, + "node_modules/jsbi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", + "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==", + "dev": true + }, "node_modules/jsbn": { "version": "0.1.1", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", @@ -19232,6 +19253,16 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@js-temporal/polyfill": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.1.tgz", + "integrity": "sha512-q45ecIocpa2TLem2jNOsCrDwP/sgKZdSkt+C1Rx07OkdKsdbvVfHcD1iDiK9scxBZrBQ38uJ8VQISXBS70ql1w==", + "dev": true, + "requires": { + "jsbi": "^4.1.0", + "tslib": "^2.3.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", @@ -24597,6 +24628,12 @@ } } }, + "jsbi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", + "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==", + "dev": true + }, "jsbn": { "version": "0.1.1", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", @@ -33104,6 +33141,5 @@ } } } - }, - "version": "4.0.1" + } } diff --git a/package.json b/package.json index bc2846a..c8320e0 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "type-detect": "^4.0.0" }, "devDependencies": { + "@js-temporal/polyfill": "^0.4.1", "benchmark": "^2.1.0", "browserify": "^17.0.0", "browserify-istanbul": "^3.0.1", diff --git a/test/temporal-types.js b/test/temporal-types.js new file mode 100644 index 0000000..7b56c3f --- /dev/null +++ b/test/temporal-types.js @@ -0,0 +1,135 @@ +'use strict'; + +var assert = require('simple-assert'); +var { Temporal } = require('@js-temporal/polyfill'); +var eql = require('..'); + +describe('TC39 Temporal', function () { + describe('Temporal.PlainDate', function () { + it('returns true for same dates', function () { + assert(eql(new Temporal.PlainDate(2022, 1, 1), new Temporal.PlainDate(2022, 1, 1)), + 'eql(new Temporal.PlainDate(2022, 1, 1), new Temporal.PlainDate(2022, 1, 1))'); + }); + + it('returns false for different dates', function () { + assert(eql(new Temporal.PlainDate(2022, 1, 1), new Temporal.PlainDate(2022, 1, 2)) === false, + 'eql(new Temporal.PlainDate(2022, 1, 1), new Temporal.PlainDate(2022, 1, 2)) === false'); + }); + }); + + describe('Temporal.PlainTime', function () { + it('returns true for same times', function () { + assert(eql(new Temporal.PlainTime(12, 0, 0), new Temporal.PlainTime(12, 0, 0)), + 'eql(new Temporal.PlainTime(12, 0, 0), new Temporal.PlainTime(12, 0, 0))'); + }); + + it('returns false for different times', function () { + assert(eql(new Temporal.PlainTime(12, 0, 0), new Temporal.PlainTime(13, 0, 0)) === false, + 'eql(new Temporal.PlainTime(12, 0, 0), new Temporal.PlainTime(13, 0, 0)) === false'); + }); + }); + + describe('Temporal.PlainDateTime', function () { + it('returns true for same date times', function () { + assert(eql(new Temporal.PlainDateTime(2022, 1, 1, 12, 0, 0), new Temporal.PlainDateTime(2022, 1, 1, 12, 0, 0)), + 'eql(new Temporal.PlainDateTime(2022, 1, 1, 12, 0, 0), new Temporal.PlainDateTime(2022, 1, 1, 12, 0, 0))'); + }); + + it('returns false for different date times', function () { + assert(eql(new Temporal.PlainDateTime(2022, 1, 1, 12, 0, 0), + new Temporal.PlainDateTime(2022, 1, 1, 13, 0, 0)) === false, + // eslint-disable-next-line max-len + 'eql(new Temporal.PlainDateTime(2022, 1, 1, 12, 0, 0), new Temporal.PlainDateTime(2022, 1, 1, 13, 0, 0)) === false'); + }); + }); + + describe('Temporal.Instant', function () { + it('returns true for same instants', function () { + assert(eql(Temporal.Instant.from('2022-01-01T12:00:00.000Z'), Temporal.Instant.from('2022-01-01T12:00:00.000Z')), + 'eql(Temporal.Instant.from("2022-01-01T12:00:00.000Z"), Temporal.Instant.from("2022-01-01T12:00:00.000Z"))'); + }); + + it('returns false for different instants', function () { + assert(eql(Temporal.Instant.from('2022-01-01T12:00:00.000Z'), + Temporal.Instant.from('2022-01-01T13:00:00.000Z')) === false, + // eslint-disable-next-line max-len + 'eql(Temporal.Instant.from("2022-01-01T12:00:00.000Z"), Temporal.Instant.from("2022-01-01T13:00:00.000Z")) === false'); + }); + }); + + describe('Temporal.ZonedDateTime', function () { + it('returns true for same zoned date times', function () { + assert(eql(Temporal.ZonedDateTime.from('2022-01-01T12:00:00.000Z[+01:00]'), + Temporal.ZonedDateTime.from('2022-01-01T12:00:00.000Z[+01:00]')), + // eslint-disable-next-line max-len + 'eql(Temporal.ZonedDateTime.from("2022-01-01T12:00:00.000Z[+01:00]"), Temporal.ZonedDateTime.from("2022-01-01T12:00:00.000Z[+01:00]"))'); + }); + + it('returns false for different zoned date times', function () { + assert(eql(Temporal.ZonedDateTime.from('2022-01-01T12:00:00.000Z[+01:00]'), + Temporal.ZonedDateTime.from('2022-01-01T13:00:00.000Z[+01:00]')) === false, + // eslint-disable-next-line max-len + 'eql(Temporal.ZonedDateTime.from("2022-01-01T12:00:00.000Z[+01:00]"), Temporal.ZonedDateTime.from("2022-01-01T13:00:00.000Z[+01:00]")) === false'); + }); + }); + + describe('Temporal.PlainYearMonth', function () { + it('returns true for same plain year months', function () { + assert(eql(new Temporal.PlainYearMonth(2022, 1), new Temporal.PlainYearMonth(2022, 1)), + 'eql(new Temporal.PlainYearMonth(2022, 1), new Temporal.PlainYearMonth(2022, 1))'); + }); + + it('returns false for different plain year months', function () { + assert(eql(new Temporal.PlainYearMonth(2022, 1), new Temporal.PlainYearMonth(2022, 2)) === false, + 'eql(new Temporal.PlainYearMonth(2022, 1), new Temporal.PlainYearMonth(2022, 2)) === false'); + }); + }); + + describe('Temporal.PlainMonthDay', function () { + it('returns true for same plain month days', function () { + assert(eql(new Temporal.PlainMonthDay(1, 1), new Temporal.PlainMonthDay(1, 1)), + 'eql(new Temporal.PlainMonthDay(1, 1), new Temporal.PlainMonthDay(1, 1))'); + }); + + it('returns false for different plain month days', function () { + assert(eql(new Temporal.PlainMonthDay(1, 1), new Temporal.PlainMonthDay(2, 1)) === false, + 'eql(new Temporal.PlainMonthDay(1, 1), new Temporal.PlainMonthDay(2, 1)) === false'); + }); + }); + + describe('Temporal.Duration', function () { + it('returns true for same durations', function () { + assert(eql(new Temporal.Duration(0, 0, 0, 1), new Temporal.Duration(0, 0, 0, 1)), + 'eql(new Temporal.Duration(0, 0, 0, 1), new Temporal.Duration(0, 0, 0, 1))'); + }); + + it('returns false for different durations', function () { + assert(eql(new Temporal.Duration(0, 0, 0, 1), new Temporal.Duration(0, 0, 0, 2)) === false, + 'eql(new Temporal.Duration(0, 0, 0, 1), new Temporal.Duration(0, 0, 0, 2)) === false'); + }); + }); + + describe('Temporal.TimeZone', function () { + it('returns true for same time zones', function () { + assert(eql(new Temporal.TimeZone('+01:00'), new Temporal.TimeZone('+01:00')), + 'eql(new Temporal.TimeZone("+01:00"), new Temporal.TimeZone("+01:00"))'); + }); + + it('returns false for different time zones', function () { + assert(eql(new Temporal.TimeZone('+01:00'), new Temporal.TimeZone('+02:00')) === false, + 'eql(new Temporal.TimeZone("+01:00"), new Temporal.TimeZone("+02:00")) === false'); + }); + }); + + describe('Temporal.Calendar', function () { + it('returns true for same calendars', function () { + assert(eql(new Temporal.Calendar('gregory'), new Temporal.Calendar('gregory')), + 'eql(new Temporal.Calendar("gregory"), new Temporal.Calendar("gregory"))'); + }); + + it('returns false for different calendars', function () { + assert(eql(new Temporal.Calendar('gregory'), new Temporal.Calendar('iso8601')) === false, + 'eql(new Temporal.Calendar("gregory"), new Temporal.Calendar("iso8601")) === false'); + }); + }); +});