diff --git a/eslint.config.mjs b/eslint.config.mjs index 6053812..6b5c4a6 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,44 +1,49 @@ import js from "@eslint/js"; import globals from "globals"; +import prettier from "eslint-plugin-prettier"; export default [ js.configs.recommended, { files: ["**/*.js"], ignores: ["dist/**"], + plugins: { + prettier, + }, languageOptions: { ecmaVersion: 2020, globals: { ...globals.browser, - ...globals.node - } + ...globals.node, + }, }, rules: { "no-console": "off", "no-trailing-spaces": "warn", - "quotes": ["warn", "double"], - "semi": ["warn", "always"] - } + quotes: ["warn", "double"], + semi: ["warn", "always"], + "prettier/prettier": "warn", + }, }, { files: ["src/**/*.js", "test/**/*.js"], languageOptions: { - sourceType: "module" - } + sourceType: "module", + }, }, { files: ["test/**/*.js"], languageOptions: { globals: { ...globals.mocha, - expect: "readonly" - } - } + expect: "readonly", + }, + }, }, { files: ["test/index.js", "getting_started.js"], languageOptions: { - sourceType: "commonjs" - } - } + sourceType: "commonjs", + }, + }, ]; diff --git a/package-lock.json b/package-lock.json index dd6a938..cd68bf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,8 +16,10 @@ "babel-preset-es2015": "^6.6.0", "chai": "^3.5.0", "eslint": "^9.36.0", + "eslint-plugin-prettier": "^5.5.4", "globals": "^15.12.0", "mocha": "^11.7.2", + "prettier": "^3.6.2", "sinon": "^1.17.3" } }, @@ -412,6 +414,19 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -2005,6 +2020,37 @@ } } }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -2297,6 +2343,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4287,6 +4340,35 @@ "node": ">=0.10.0" } }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -5388,6 +5470,22 @@ "node": ">=0.8.0" } }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", diff --git a/package.json b/package.json index 0eee852..dfa4693 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "homepage": "https://github.com/rxaviers/relative-time#readme", "scripts": { "test": "eslint --ext .js src && mocha", - "build": "npm test && mkdir -p dist && rm -f dist/* && echo Building dist/relative-time.js && babel src/relative-time.js -o dist/relative-time.js && echo Done" + "build": "npm test && mkdir -p dist && rm -f dist/* && echo Building dist/relative-time.js && babel src/relative-time.js -o dist/relative-time.js && echo Done", + "lint-fix": "prettier --write --ignore-unknown \"src\" \"test\" \"getting_started.js\" \"eslint.config.mjs\" \"package.json\" \"README.md\"" }, "devDependencies": { "@eslint/js": "^9.13.0", @@ -45,8 +46,10 @@ "babel-preset-es2015": "^6.6.0", "chai": "^3.5.0", "eslint": "^9.36.0", + "eslint-plugin-prettier": "^5.5.4", "globals": "^15.12.0", "mocha": "^11.7.2", + "prettier": "^3.6.2", "sinon": "^1.17.3" } } diff --git a/src/relative-time.js b/src/relative-time.js index c881d83..0574165 100644 --- a/src/relative-time.js +++ b/src/relative-time.js @@ -1,6 +1,11 @@ -const root = typeof global !== "undefined" ? global : - typeof window !== "undefined" ? window : - typeof self !== "undefined" ? self : {}; +const root = + typeof global !== "undefined" + ? global + : typeof window !== "undefined" + ? window + : typeof self !== "undefined" + ? self + : {}; function getTemporal() { const Temporal = root.Temporal; @@ -19,34 +24,42 @@ function defineCachedGetter(object, property, compute) { Object.defineProperty(object, property, { configurable: true, enumerable: true, - value + value, }); return value; - } + }, }); } function isTemporalZonedDateTime(value, Temporal) { - return Boolean(Temporal.ZonedDateTime && value instanceof Temporal.ZonedDateTime); + return Boolean( + Temporal.ZonedDateTime && value instanceof Temporal.ZonedDateTime + ); } function isTemporalPlainDateTime(value, Temporal) { - return Boolean(Temporal.PlainDateTime && value instanceof Temporal.PlainDateTime); + return Boolean( + Temporal.PlainDateTime && value instanceof Temporal.PlainDateTime + ); } function resolvePlainNow(now, Temporal, target) { if (now === undefined || now === null) { const current = Temporal.Now.plainDateTimeISO(); - return typeof current.withCalendar === "function" && target.calendar ? - current.withCalendar(target.calendar) : current; + return typeof current.withCalendar === "function" && target.calendar + ? current.withCalendar(target.calendar) + : current; } if (!isTemporalPlainDateTime(now, Temporal)) { - throw new TypeError("Unsupported now value; expected Temporal.PlainDateTime"); + throw new TypeError( + "Unsupported now value; expected Temporal.PlainDateTime" + ); } - return typeof now.withCalendar === "function" && target.calendar ? - now.withCalendar(target.calendar) : now; + return typeof now.withCalendar === "function" && target.calendar + ? now.withCalendar(target.calendar) + : now; } function resolveZonedNow(now, Temporal, targetZone) { @@ -55,11 +68,15 @@ function resolveZonedNow(now, Temporal, targetZone) { } if (!isTemporalZonedDateTime(now, Temporal)) { - throw new TypeError("Unsupported now value; expected Temporal.ZonedDateTime"); + throw new TypeError( + "Unsupported now value; expected Temporal.ZonedDateTime" + ); } if (now.timeZoneId !== targetZone) { - throw new TypeError("Unsupported now value; expected Temporal.ZonedDateTime in the same time zone as the target date"); + throw new TypeError( + "Unsupported now value; expected Temporal.ZonedDateTime in the same time zone as the target date" + ); } return now; @@ -67,8 +84,10 @@ function resolveZonedNow(now, Temporal, targetZone) { function differenceInUnit(now, target, unit) { if (unit === "year" || unit === "month") { - const startDate = typeof now.toPlainDate === "function" ? now.toPlainDate() : now; - const endDate = typeof target.toPlainDate === "function" ? target.toPlainDate() : target; + const startDate = + typeof now.toPlainDate === "function" ? now.toPlainDate() : now; + const endDate = + typeof target.toPlainDate === "function" ? target.toPlainDate() : target; const yearDelta = endDate.year - startDate.year; if (unit === "year") { @@ -79,12 +98,14 @@ function differenceInUnit(now, target, unit) { } if (unit === "day") { - const startDate = typeof now.toPlainDate === "function" ? now.toPlainDate() : now; - const endDate = typeof target.toPlainDate === "function" ? target.toPlainDate() : target; + const startDate = + typeof now.toPlainDate === "function" ? now.toPlainDate() : now; + const endDate = + typeof target.toPlainDate === "function" ? target.toPlainDate() : target; const duration = startDate.until(endDate, { largestUnit: unit, smallestUnit: unit, - roundingMode: "trunc" + roundingMode: "trunc", }); return duration.days; } @@ -93,7 +114,7 @@ function differenceInUnit(now, target, unit) { const duration = now.until(target, { largestUnit: unit, smallestUnit: unit, - roundingMode: "trunc" + roundingMode: "trunc", }); let hours = duration.hours; @@ -101,7 +122,7 @@ function differenceInUnit(now, target, unit) { const minutes = now.until(target, { largestUnit: "minute", smallestUnit: "minute", - roundingMode: "trunc" + roundingMode: "trunc", }); if (minutes.minutes < 0) { @@ -115,7 +136,7 @@ function differenceInUnit(now, target, unit) { const duration = now.until(target, { largestUnit: unit, smallestUnit: unit, - roundingMode: "trunc" + roundingMode: "trunc", }); return duration[unit + "s"]; } @@ -125,7 +146,7 @@ export default class RelativeTime { this.formatters = RelativeTime.initializeFormatters(...arguments); } - format(date, {unit = "best-fit", now} = {}) { + format(date, { unit = "best-fit", now } = {}) { const Temporal = getTemporal(); let target; let resolvedNow; @@ -138,19 +159,28 @@ export default class RelativeTime { target = date; resolvedNow = resolvePlainNow(now, Temporal, target); } else { - throw new TypeError("Unsupported date value; expected Temporal.ZonedDateTime or Temporal.PlainDateTime"); + throw new TypeError( + "Unsupported date value; expected Temporal.ZonedDateTime or Temporal.PlainDateTime" + ); } const diff = Object.create(null); const absDiff = Object.create(null); - const diffUnits = ["year", "month", /* "week", */ "day", "hour", "minute", "second"]; - - diffUnits.forEach(function(currentUnit) { - defineCachedGetter(diff, currentUnit, function() { + const diffUnits = [ + "year", + "month", + /* "week", */ "day", + "hour", + "minute", + "second", + ]; + + diffUnits.forEach(function (currentUnit) { + defineCachedGetter(diff, currentUnit, function () { return differenceInUnit(resolvedNow, target, currentUnit); }); - defineCachedGetter(absDiff, currentUnit, function() { + defineCachedGetter(absDiff, currentUnit, function () { return Math.abs(diff[currentUnit]); }); }); @@ -163,17 +193,23 @@ export default class RelativeTime { } } -RelativeTime.bestFit = function(absDiff) { +RelativeTime.bestFit = function (absDiff) { const threshold = this.threshold; switch (true) { - case absDiff.year > 0 && absDiff.month > threshold.month: return "year"; - case absDiff.month > 0 && absDiff.day > threshold.day: return "month"; + case absDiff.year > 0 && absDiff.month > threshold.month: + return "year"; + case absDiff.month > 0 && absDiff.day > threshold.day: + return "month"; // case absDiff.month > 0 && absDiff.week > threshold.week: return "month"; // case absDiff.week > 0 && absDiff.day > threshold.day: return "week"; - case absDiff.day > 0 && absDiff.hour > threshold.hour: return "day"; - case absDiff.hour > 0 && absDiff.minute > threshold.minute: return "hour"; - case absDiff.minute > 0 && absDiff.second > threshold.second: return "minute"; - default: return "second"; + case absDiff.day > 0 && absDiff.hour > threshold.hour: + return "day"; + case absDiff.hour > 0 && absDiff.minute > threshold.minute: + return "hour"; + case absDiff.minute > 0 && absDiff.second > threshold.second: + return "minute"; + default: + return "second"; } }; @@ -183,31 +219,53 @@ RelativeTime.threshold = { day: 6, hour: 6, minute: 59, - second: 59 + second: 59, }; -RelativeTime.initializeFormatters = function(localesOrFormatter, options) { +RelativeTime.initializeFormatters = function (localesOrFormatter, options) { let locales = localesOrFormatter; let formatOptions = options; - if (localesOrFormatter && typeof localesOrFormatter.format === "function" && - typeof localesOrFormatter.resolvedOptions === "function") { + if ( + localesOrFormatter && + typeof localesOrFormatter.format === "function" && + typeof localesOrFormatter.resolvedOptions === "function" + ) { return createFormatterMap(localesOrFormatter); } - if (localesOrFormatter && typeof localesOrFormatter === "object" && !Array.isArray(localesOrFormatter)) { + if ( + localesOrFormatter && + typeof localesOrFormatter === "object" && + !Array.isArray(localesOrFormatter) + ) { formatOptions = localesOrFormatter; locales = undefined; } - return createFormatterMap(new Intl.RelativeTimeFormat(locales, Object.assign({ - numeric: "auto" - }, formatOptions))); + return createFormatterMap( + new Intl.RelativeTimeFormat( + locales, + Object.assign( + { + numeric: "auto", + }, + formatOptions + ) + ) + ); }; function createFormatterMap(formatter) { - return ["second", "minute", "hour", "day", /* "week", */ "month", "year"].reduce(function(map, unit) { - map[unit] = function(value) { + return [ + "second", + "minute", + "hour", + "day", + /* "week", */ "month", + "year", + ].reduce(function (map, unit) { + map[unit] = function (value) { return formatter.format(value, unit); }; return map; diff --git a/test/relative-time.js b/test/relative-time.js index 541dc95..0c7bbc4 100644 --- a/test/relative-time.js +++ b/test/relative-time.js @@ -9,209 +9,372 @@ function zoned(dateTime) { return global.Temporal.ZonedDateTime.from(dateTime); } -describe("relative-time", function() { +describe("relative-time", function () { let relativeTime; let originalTemporal; let baseNow; - before(function() { + before(function () { originalTemporal = global.Temporal; global.Temporal = TemporalPolyfill; }); - after(function() { + after(function () { global.Temporal = originalTemporal; }); - beforeEach(function() { + beforeEach(function () { relativeTime = new RelativeTime(); baseNow = plain("2016-04-10T12:00:00"); }); - describe("bestFit", function() { - it("should format seconds-distant dates", function() { - expect(relativeTime.format(plain("2016-04-10T11:59:01"), {now: baseNow})).to.equal("59 seconds ago"); - expect(relativeTime.format(plain("2016-04-10T12:00:00"), {now: baseNow})).to.equal("now"); - expect(relativeTime.format(plain("2016-04-10T12:00:59"), {now: baseNow})).to.equal("in 59 seconds"); + describe("bestFit", function () { + it("should format seconds-distant dates", function () { + expect( + relativeTime.format(plain("2016-04-10T11:59:01"), { now: baseNow }) + ).to.equal("59 seconds ago"); + expect( + relativeTime.format(plain("2016-04-10T12:00:00"), { now: baseNow }) + ).to.equal("now"); + expect( + relativeTime.format(plain("2016-04-10T12:00:59"), { now: baseNow }) + ).to.equal("in 59 seconds"); }); - it("should format minutes-distant dates", function() { - expect(relativeTime.format(plain("2016-04-10T11:01:00"), {now: baseNow})).to.equal("59 minutes ago"); - expect(relativeTime.format(plain("2016-04-10T11:59:00"), {now: baseNow})).to.equal("1 minute ago"); - expect(relativeTime.format(plain("2016-04-10T12:01:00"), {now: baseNow})).to.equal("in 1 minute"); - expect(relativeTime.format(plain("2016-04-10T12:01:59"), {now: baseNow})).to.equal("in 1 minute"); - expect(relativeTime.format(plain("2016-04-10T12:59:59"), {now: baseNow})).to.equal("in 59 minutes"); + it("should format minutes-distant dates", function () { + expect( + relativeTime.format(plain("2016-04-10T11:01:00"), { now: baseNow }) + ).to.equal("59 minutes ago"); + expect( + relativeTime.format(plain("2016-04-10T11:59:00"), { now: baseNow }) + ).to.equal("1 minute ago"); + expect( + relativeTime.format(plain("2016-04-10T12:01:00"), { now: baseNow }) + ).to.equal("in 1 minute"); + expect( + relativeTime.format(plain("2016-04-10T12:01:59"), { now: baseNow }) + ).to.equal("in 1 minute"); + expect( + relativeTime.format(plain("2016-04-10T12:59:59"), { now: baseNow }) + ).to.equal("in 59 minutes"); }); - it("should format hours-distant dates", function() { - expect(relativeTime.format(plain("2016-04-10T00:00:00"), {now: baseNow})).to.equal("12 hours ago"); - expect(relativeTime.format(plain("2016-04-10T13:00:00"), {now: baseNow})).to.equal("in 1 hour"); - expect(relativeTime.format(plain("2016-04-10T13:59:59"), {now: baseNow})).to.equal("in 1 hour"); - expect(relativeTime.format(plain("2016-04-10T23:59:59"), {now: baseNow})).to.equal("in 11 hours"); + it("should format hours-distant dates", function () { + expect( + relativeTime.format(plain("2016-04-10T00:00:00"), { now: baseNow }) + ).to.equal("12 hours ago"); + expect( + relativeTime.format(plain("2016-04-10T13:00:00"), { now: baseNow }) + ).to.equal("in 1 hour"); + expect( + relativeTime.format(plain("2016-04-10T13:59:59"), { now: baseNow }) + ).to.equal("in 1 hour"); + expect( + relativeTime.format(plain("2016-04-10T23:59:59"), { now: baseNow }) + ).to.equal("in 11 hours"); const eveningNow = plain("2016-04-10T01:00:00"); - expect(relativeTime.format(plain("2016-04-09T19:00:00"), {now: eveningNow})).to.equal("6 hours ago"); - expect(relativeTime.format(plain("2016-04-09T18:00:00"), {now: eveningNow})).to.equal("yesterday"); + expect( + relativeTime.format(plain("2016-04-09T19:00:00"), { now: eveningNow }) + ).to.equal("6 hours ago"); + expect( + relativeTime.format(plain("2016-04-09T18:00:00"), { now: eveningNow }) + ).to.equal("yesterday"); const lateNow = plain("2016-04-10T23:00:00"); - expect(relativeTime.format(plain("2016-04-11T05:00:00"), {now: lateNow})).to.equal("in 6 hours"); - expect(relativeTime.format(plain("2016-04-11T06:00:00"), {now: lateNow})).to.equal("tomorrow"); + expect( + relativeTime.format(plain("2016-04-11T05:00:00"), { now: lateNow }) + ).to.equal("in 6 hours"); + expect( + relativeTime.format(plain("2016-04-11T06:00:00"), { now: lateNow }) + ).to.equal("tomorrow"); const janEnd = plain("2016-01-31T23:00:00"); - expect(relativeTime.format(plain("2016-02-01T05:00:00"), {now: janEnd})).to.equal("in 6 hours"); - expect(relativeTime.format(plain("2016-02-01T07:00:00"), {now: janEnd})).to.equal("tomorrow"); + expect( + relativeTime.format(plain("2016-02-01T05:00:00"), { now: janEnd }) + ).to.equal("in 6 hours"); + expect( + relativeTime.format(plain("2016-02-01T07:00:00"), { now: janEnd }) + ).to.equal("tomorrow"); const yearEnd = plain("2016-12-31T23:00:00"); - expect(relativeTime.format(plain("2017-01-01T05:00:00"), {now: yearEnd})).to.equal("in 6 hours"); - expect(relativeTime.format(plain("2017-01-01T07:00:00"), {now: yearEnd})).to.equal("tomorrow"); + expect( + relativeTime.format(plain("2017-01-01T05:00:00"), { now: yearEnd }) + ).to.equal("in 6 hours"); + expect( + relativeTime.format(plain("2017-01-01T07:00:00"), { now: yearEnd }) + ).to.equal("tomorrow"); }); - it("should format days-distant dates", function() { - expect(relativeTime.format(plain("2016-04-01T00:00:00"), {now: baseNow})).to.equal("9 days ago"); - expect(relativeTime.format(plain("2016-04-09T18:00:00"), {now: baseNow})).to.equal("yesterday"); - expect(relativeTime.format(plain("2016-04-11T09:00:00"), {now: baseNow})).to.equal("tomorrow"); - expect(relativeTime.format(plain("2016-04-30T23:59:00"), {now: baseNow})).to.equal("in 20 days"); - expect(relativeTime.format(plain("2016-03-31T23:59:00"), {now: baseNow})).to.equal("last month"); - expect(relativeTime.format(plain("2016-05-01T00:00:00"), {now: baseNow})).to.equal("next month"); + it("should format days-distant dates", function () { + expect( + relativeTime.format(plain("2016-04-01T00:00:00"), { now: baseNow }) + ).to.equal("9 days ago"); + expect( + relativeTime.format(plain("2016-04-09T18:00:00"), { now: baseNow }) + ).to.equal("yesterday"); + expect( + relativeTime.format(plain("2016-04-11T09:00:00"), { now: baseNow }) + ).to.equal("tomorrow"); + expect( + relativeTime.format(plain("2016-04-30T23:59:00"), { now: baseNow }) + ).to.equal("in 20 days"); + expect( + relativeTime.format(plain("2016-03-31T23:59:00"), { now: baseNow }) + ).to.equal("last month"); + expect( + relativeTime.format(plain("2016-05-01T00:00:00"), { now: baseNow }) + ).to.equal("next month"); const aprilSixth = plain("2016-04-06T12:00:00"); - expect(relativeTime.format(plain("2016-03-31T23:59:00"), {now: aprilSixth})).to.equal("6 days ago"); + expect( + relativeTime.format(plain("2016-03-31T23:59:00"), { now: aprilSixth }) + ).to.equal("6 days ago"); const aprilTwentyFifth = plain("2016-04-25T23:00:00"); - expect(relativeTime.format(plain("2016-05-01T00:00:00"), {now: aprilTwentyFifth})).to.equal("in 6 days"); + expect( + relativeTime.format(plain("2016-05-01T00:00:00"), { + now: aprilTwentyFifth, + }) + ).to.equal("in 6 days"); }); - it("should format months-distant dates", function() { - expect(relativeTime.format(plain("2016-01-01T00:00:00"), {now: baseNow})).to.equal("3 months ago"); - expect(relativeTime.format(plain("2016-03-01T00:00:00"), {now: baseNow})).to.equal("last month"); - expect(relativeTime.format(plain("2016-05-01T00:00:00"), {now: baseNow})).to.equal("next month"); - expect(relativeTime.format(plain("2016-12-01T23:59:00"), {now: baseNow})).to.equal("in 8 months"); + it("should format months-distant dates", function () { + expect( + relativeTime.format(plain("2016-01-01T00:00:00"), { now: baseNow }) + ).to.equal("3 months ago"); + expect( + relativeTime.format(plain("2016-03-01T00:00:00"), { now: baseNow }) + ).to.equal("last month"); + expect( + relativeTime.format(plain("2016-05-01T00:00:00"), { now: baseNow }) + ).to.equal("next month"); + expect( + relativeTime.format(plain("2016-12-01T23:59:00"), { now: baseNow }) + ).to.equal("in 8 months"); const janTwelve = plain("2017-01-12T18:30:00"); - expect(relativeTime.format(plain("2016-12-29T18:30:00"), {now: janTwelve})).to.equal("last month"); + expect( + relativeTime.format(plain("2016-12-29T18:30:00"), { now: janTwelve }) + ).to.equal("last month"); const decTwentyNine = plain("2016-12-29T18:30:00"); - expect(relativeTime.format(plain("2017-01-12T18:30:00"), {now: decTwentyNine})).to.equal("next month"); + expect( + relativeTime.format(plain("2017-01-12T18:30:00"), { + now: decTwentyNine, + }) + ).to.equal("next month"); const febTwentyEight = plain("2016-02-28T12:00:00"); - expect(relativeTime.format(plain("2015-12-31T23:59:00"), {now: febTwentyEight})).to.equal("2 months ago"); + expect( + relativeTime.format(plain("2015-12-31T23:59:00"), { + now: febTwentyEight, + }) + ).to.equal("2 months ago"); }); - it("should format years-distant dates", function() { - expect(relativeTime.format(plain("2010-06-01T12:00:00"), {now: baseNow})).to.equal("6 years ago"); - expect(relativeTime.format(plain("2015-12-31T23:59:00"), {now: baseNow})).to.equal("last year"); - expect(relativeTime.format(plain("2017-01-01T00:00:00"), {now: baseNow})).to.equal("next year"); + it("should format years-distant dates", function () { + expect( + relativeTime.format(plain("2010-06-01T12:00:00"), { now: baseNow }) + ).to.equal("6 years ago"); + expect( + relativeTime.format(plain("2015-12-31T23:59:00"), { now: baseNow }) + ).to.equal("last year"); + expect( + relativeTime.format(plain("2017-01-01T00:00:00"), { now: baseNow }) + ).to.equal("next year"); const octSecond = plain("2016-10-02T12:00:00"); - expect(relativeTime.format(plain("2017-01-01T00:00:00"), {now: octSecond})).to.equal("next year"); + expect( + relativeTime.format(plain("2017-01-01T00:00:00"), { now: octSecond }) + ).to.equal("next year"); }); - it("should format relative time using hours", function() { - expect(relativeTime.format(plain("2016-04-10T12:45:00"), {unit: "hour", now: baseNow})).to.equal("this hour"); - expect(relativeTime.format(plain("2016-04-10T11:01:00"), {unit: "hour", now: baseNow})).to.equal("1 hour ago"); - expect(relativeTime.format(plain("2016-04-10T00:00:00"), {unit: "hour", now: baseNow})).to.equal("12 hours ago"); - expect(relativeTime.format(plain("2016-04-01T00:00:00"), {unit: "hour", now: baseNow})).to.equal("228 hours ago"); - expect(relativeTime.format(plain("2016-01-01T00:00:00"), {unit: "hour", now: baseNow})).to.equal("2,412 hours ago"); + it("should format relative time using hours", function () { + expect( + relativeTime.format(plain("2016-04-10T12:45:00"), { + unit: "hour", + now: baseNow, + }) + ).to.equal("this hour"); + expect( + relativeTime.format(plain("2016-04-10T11:01:00"), { + unit: "hour", + now: baseNow, + }) + ).to.equal("1 hour ago"); + expect( + relativeTime.format(plain("2016-04-10T00:00:00"), { + unit: "hour", + now: baseNow, + }) + ).to.equal("12 hours ago"); + expect( + relativeTime.format(plain("2016-04-01T00:00:00"), { + unit: "hour", + now: baseNow, + }) + ).to.equal("228 hours ago"); + expect( + relativeTime.format(plain("2016-01-01T00:00:00"), { + unit: "hour", + now: baseNow, + }) + ).to.equal("2,412 hours ago"); }); - it("should format relative time using days", function() { - expect(relativeTime.format(plain("2016-04-10T11:30:00"), {unit: "day", now: baseNow})).to.equal("today"); - expect(relativeTime.format(plain("2016-01-01T00:00:00"), {unit: "day", now: baseNow})).to.equal("100 days ago"); + it("should format relative time using days", function () { + expect( + relativeTime.format(plain("2016-04-10T11:30:00"), { + unit: "day", + now: baseNow, + }) + ).to.equal("today"); + expect( + relativeTime.format(plain("2016-01-01T00:00:00"), { + unit: "day", + now: baseNow, + }) + ).to.equal("100 days ago"); }); - it("should format relative time using months", function() { - expect(relativeTime.format(plain("2016-04-10T23:59:59"), {unit: "month", now: baseNow})).to.equal("this month"); - expect(relativeTime.format(plain("2017-01-01T00:00:00"), {unit: "month", now: baseNow})).to.equal("in 9 months"); + it("should format relative time using months", function () { + expect( + relativeTime.format(plain("2016-04-10T23:59:59"), { + unit: "month", + now: baseNow, + }) + ).to.equal("this month"); + expect( + relativeTime.format(plain("2017-01-01T00:00:00"), { + unit: "month", + now: baseNow, + }) + ).to.equal("in 9 months"); }); }); - describe("time zone", function() { - it("should support using specific time zone", function() { - const losAngelesDate = zoned("2016-04-09T17:00:00-07:00[America/Los_Angeles]"); - const losAngelesNow = zoned("2016-04-10T05:00:00-07:00[America/Los_Angeles]"); - expect(relativeTime.format(losAngelesDate, {now: losAngelesNow})).to.equal("yesterday"); + describe("time zone", function () { + it("should support using specific time zone", function () { + const losAngelesDate = zoned( + "2016-04-09T17:00:00-07:00[America/Los_Angeles]" + ); + const losAngelesNow = zoned( + "2016-04-10T05:00:00-07:00[America/Los_Angeles]" + ); + expect( + relativeTime.format(losAngelesDate, { now: losAngelesNow }) + ).to.equal("yesterday"); const berlinDate = zoned("2016-04-10T02:00:00+02:00[Europe/Berlin]"); const berlinNow = zoned("2016-04-10T14:00:00+02:00[Europe/Berlin]"); - expect(relativeTime.format(berlinDate, {now: berlinNow})).to.equal("12 hours ago"); + expect(relativeTime.format(berlinDate, { now: berlinNow })).to.equal( + "12 hours ago" + ); - const losAngelesMarchDate = zoned("2016-03-31T17:00:00-07:00[America/Los_Angeles]"); - expect(relativeTime.format(losAngelesMarchDate, {now: losAngelesNow})).to.equal("last month"); + const losAngelesMarchDate = zoned( + "2016-03-31T17:00:00-07:00[America/Los_Angeles]" + ); + expect( + relativeTime.format(losAngelesMarchDate, { now: losAngelesNow }) + ).to.equal("last month"); const berlinAprilDate = zoned("2016-04-01T02:00:00+02:00[Europe/Berlin]"); - expect(relativeTime.format(berlinAprilDate, {now: berlinNow})).to.equal("9 days ago"); + expect(relativeTime.format(berlinAprilDate, { now: berlinNow })).to.equal( + "9 days ago" + ); - const losAngelesYearDate = zoned("2015-12-31T16:00:00-08:00[America/Los_Angeles]"); - expect(relativeTime.format(losAngelesYearDate, {now: losAngelesNow})).to.equal("last year"); + const losAngelesYearDate = zoned( + "2015-12-31T16:00:00-08:00[America/Los_Angeles]" + ); + expect( + relativeTime.format(losAngelesYearDate, { now: losAngelesNow }) + ).to.equal("last year"); const berlinYearDate = zoned("2016-01-01T01:00:00+01:00[Europe/Berlin]"); - expect(relativeTime.format(berlinYearDate, {now: berlinNow})).to.equal("3 months ago"); + expect(relativeTime.format(berlinYearDate, { now: berlinNow })).to.equal( + "3 months ago" + ); }); - it("should format daylight savings edge cases", function() { - const losAngelesNow = zoned("2017-03-12T03:00:00-07:00[America/Los_Angeles]"); + it("should format daylight savings edge cases", function () { + const losAngelesNow = zoned( + "2017-03-12T03:00:00-07:00[America/Los_Angeles]" + ); const dstDate = zoned("2017-03-12T01:00:00-08:00[America/Los_Angeles]"); - expect(relativeTime.format(dstDate, {now: losAngelesNow})).to.equal("1 hour ago"); + expect(relativeTime.format(dstDate, { now: losAngelesNow })).to.equal( + "1 hour ago" + ); }); }); - describe("Temporal inputs", function() { - it("should reject non-ZonedDateTime dates", function() { + describe("Temporal inputs", function () { + it("should reject non-ZonedDateTime dates", function () { const instant = global.Temporal.Instant.from("2016-04-10T11:59:01Z"); - expect(function() { - relativeTime.format(instant, {now: baseNow}); + expect(function () { + relativeTime.format(instant, { now: baseNow }); }).to.throw(TypeError, /Temporal\.ZonedDateTime/); }); - it("should reject non-PlainDateTime now values for PlainDateTime targets", function() { + it("should reject non-PlainDateTime now values for PlainDateTime targets", function () { const instantNow = global.Temporal.Instant.from("2016-04-10T12:00:00Z"); - expect(function() { - relativeTime.format(plain("2016-04-10T11:59:01"), {now: instantNow}); + expect(function () { + relativeTime.format(plain("2016-04-10T11:59:01"), { now: instantNow }); }).to.throw(TypeError, /Temporal\.PlainDateTime/); }); - it("should reject non-ZonedDateTime now values for ZonedDateTime targets", function() { + it("should reject non-ZonedDateTime now values for ZonedDateTime targets", function () { const instantNow = global.Temporal.Instant.from("2016-04-10T12:00:00Z"); - expect(function() { - relativeTime.format(zoned("2016-04-10T11:59:01[UTC]"), {now: instantNow}); + expect(function () { + relativeTime.format(zoned("2016-04-10T11:59:01[UTC]"), { + now: instantNow, + }); }).to.throw(TypeError, /Temporal\.ZonedDateTime/); }); - it("should reject ZonedDateTime now values from a different time zone", function() { - const losAngelesDate = zoned("2016-04-10T05:00:00-07:00[America/Los_Angeles]"); + it("should reject ZonedDateTime now values from a different time zone", function () { + const losAngelesDate = zoned( + "2016-04-10T05:00:00-07:00[America/Los_Angeles]" + ); const newYorkNow = zoned("2016-04-10T08:00:00-04:00[America/New_York]"); - expect(function() { - relativeTime.format(losAngelesDate, {now: newYorkNow}); + expect(function () { + relativeTime.format(losAngelesDate, { now: newYorkNow }); }).to.throw(TypeError, /same time zone/); }); - it("should use Temporal.Now when now is omitted for PlainDateTime targets", function() { + it("should use Temporal.Now when now is omitted for PlainDateTime targets", function () { const stubNow = plain("2016-04-10T12:00:00"); const originalPlain = global.Temporal.Now.plainDateTimeISO; - global.Temporal.Now.plainDateTimeISO = function() { + global.Temporal.Now.plainDateTimeISO = function () { return stubNow; }; try { - expect(relativeTime.format(plain("2016-04-10T11:59:01"))).to.equal("59 seconds ago"); + expect(relativeTime.format(plain("2016-04-10T11:59:01"))).to.equal( + "59 seconds ago" + ); } finally { global.Temporal.Now.plainDateTimeISO = originalPlain; } }); - it("should use Temporal.Now when now is omitted for ZonedDateTime targets", function() { + it("should use Temporal.Now when now is omitted for ZonedDateTime targets", function () { const stubNow = zoned("2016-04-10T12:00:00[UTC]"); const originalZoned = global.Temporal.Now.zonedDateTimeISO; - global.Temporal.Now.zonedDateTimeISO = function(timeZoneLike) { - const zone = typeof timeZoneLike === "string" ? - timeZoneLike : timeZoneLike && timeZoneLike.timeZone; + global.Temporal.Now.zonedDateTimeISO = function (timeZoneLike) { + const zone = + typeof timeZoneLike === "string" + ? timeZoneLike + : timeZoneLike && timeZoneLike.timeZone; return stubNow.withTimeZone(zone || stubNow.timeZoneId); }; try { - expect(relativeTime.format(zoned("2016-04-10T11:59:01[UTC]"))).to.equal("59 seconds ago"); + expect(relativeTime.format(zoned("2016-04-10T11:59:01[UTC]"))).to.equal( + "59 seconds ago" + ); } finally { global.Temporal.Now.zonedDateTimeISO = originalZoned; }