From 71239c8c663ff675bad4cd2090372333cde61f88 Mon Sep 17 00:00:00 2001 From: Jens Ochsenmeier Date: Thu, 9 Dec 2021 00:09:41 +0100 Subject: [PATCH 1/7] remove getIntrinsic from plaindate, add monkeypatching test --- .gitignore | 1 + lib/plaindate.ts | 5 ++--- test/all.mjs | 3 +++ test/monkeypatch.mjs | 28 ++++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 test/monkeypatch.mjs diff --git a/.gitignore b/.gitignore index d7c7c711..197c5b0e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ tsc-out/ .vscode/* !.vscode/launch.json *.tgz +.DS_Store diff --git a/lib/plaindate.ts b/lib/plaindate.ts index 48a3627a..a3dbdeaf 100644 --- a/lib/plaindate.ts +++ b/lib/plaindate.ts @@ -1,5 +1,5 @@ import * as ES from './ecmascript'; -import { GetIntrinsic, MakeIntrinsicClass } from './intrinsicclass'; +import { MakeIntrinsicClass } from './intrinsicclass'; import { ISO_YEAR, ISO_MONTH, @@ -17,6 +17,7 @@ import { import { Temporal } from '..'; import { DateTimeFormat } from './intl'; import type { PlainDateParams as Params, PlainDateReturn as Return } from './internaltypes'; +import { Duration } from './duration'; const DISALLOWED_UNITS = ['hour', 'minute', 'second', 'millisecond', 'microsecond', 'nanosecond'] as const; @@ -188,7 +189,6 @@ export class PlainDate implements Temporal.PlainDate { this )); - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration(years, months, weeks, days, 0, 0, 0, 0, 0, 0); } since(otherParam: Params['since'][0], optionsParam: Params['since'][1] = undefined): Return['since'] { @@ -212,7 +212,6 @@ export class PlainDate implements Temporal.PlainDate { const untilOptions = { ...options, largestUnit }; let { years, months, weeks, days } = ES.CalendarDateUntil(calendar, this, other, untilOptions); - const Duration = GetIntrinsic('%Temporal.Duration%'); if (smallestUnit === 'day' && roundingIncrement === 1) { return new Duration(-years, -months, -weeks, -days, 0, 0, 0, 0, 0, 0); } diff --git a/test/all.mjs b/test/all.mjs index f8922b87..0f0731c0 100644 --- a/test/all.mjs +++ b/test/all.mjs @@ -34,6 +34,9 @@ import './calendar.mjs'; import './usertimezone.mjs'; import './usercalendar.mjs'; +// monkeypatching +import './monkeypatch.mjs'; + Promise.resolve() .then(() => { return Demitasse.report(Pretty.reporter); diff --git a/test/monkeypatch.mjs b/test/monkeypatch.mjs new file mode 100644 index 00000000..146bf785 --- /dev/null +++ b/test/monkeypatch.mjs @@ -0,0 +1,28 @@ +#! /usr/bin/env -S node --experimental-modules + +import Demitasse from '@pipobscure/demitasse'; +const { describe, it, report } = Demitasse; + +import Pretty from '@pipobscure/demitasse-pretty'; +const { reporter } = Pretty; + +import { strict as assert } from 'assert'; +const { equal } = assert; + +import * as Temporal from '@js-temporal/polyfill'; +const { PlainDate } = Temporal; + +describe('Monkeypatch', () => { + describe('PlainDate', () => { + it("Monkeypatching Duration doesn't affect PlainDate", () => { + Temporal.Duration.prototype.constructor = null; + const date = PlainDate.from('2021-12-09'); + equal(`${date.until('2021-12-10')}`, 'P1D'); + }); + }); +}); + +import { normalize } from 'path'; +if (normalize(import.meta.url.slice(8)) === normalize(process.argv[1])) { + report(reporter).then((failed) => process.exit(failed ? 1 : 0)); +} From 3dd5bef8a2b3ca07fa9c9b56725df90c6bcf1310 Mon Sep 17 00:00:00 2001 From: Jens Ochsenmeier Date: Tue, 14 Dec 2021 21:34:34 +0100 Subject: [PATCH 2/7] wip --- lib/calendar.ts | 6 +---- lib/ecmascript.ts | 53 +++++++++++++++----------------------------- test/monkeypatch.mjs | 17 +++++++++++++- 3 files changed, 35 insertions(+), 41 deletions(-) diff --git a/lib/calendar.ts b/lib/calendar.ts index 185dbfc5..3b66401a 100644 --- a/lib/calendar.ts +++ b/lib/calendar.ts @@ -1,6 +1,5 @@ import { DEBUG } from './debug'; import * as ES from './ecmascript'; -import { GetIntrinsic, MakeIntrinsicClass, DefineIntrinsic } from './intrinsicclass'; import { CALENDAR_ID, ISO_YEAR, @@ -28,6 +27,7 @@ import type { CalendarReturn as Return, FieldRecord } from './internaltypes'; +import { Duration } from './duration'; const ArrayIncludes = Array.prototype.includes; const ArrayPrototypePush = Array.prototype.push; @@ -216,7 +216,6 @@ export class Calendar implements Temporal.Calendar { 'day' ); const { years, months, weeks, days } = impl[GetSlot(this, CALENDAR_ID)].dateUntil(one, two, largestUnit); - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration(years, months, weeks, days, 0, 0, 0, 0, 0, 0); } year(dateParam: Params['year'][0]): Return['year'] { @@ -321,9 +320,6 @@ export class Calendar implements Temporal.Calendar { [Symbol.toStringTag]!: 'Temporal.Calendar'; } -MakeIntrinsicClass(Calendar, 'Temporal.Calendar'); -DefineIntrinsic('Temporal.Calendar.from', Calendar.from); - impl['iso8601'] = { dateFromFields(fieldsParam, options, calendar) { const overflow = ES.ToTemporalOverflow(options); diff --git a/lib/ecmascript.ts b/lib/ecmascript.ts index 3d9ff73d..47879a5a 100644 --- a/lib/ecmascript.ts +++ b/lib/ecmascript.ts @@ -38,7 +38,6 @@ import type { PlainYearMonthParams, FieldRecord } from './internaltypes'; -import { GetIntrinsic } from './intrinsicclass'; import { CreateSlots, GetSlot, @@ -223,6 +222,13 @@ const SINGULAR_PLURAL_UNITS: readonly PluralAndSingularUnitTuple(); @@ -1275,8 +1281,7 @@ export function ToTemporalDate( ToTemporalOverflow(options); // validate and ignore const { year, month, day, calendar, z } = ParseTemporalDateString(ToString(item)); if (z) throw new RangeError('Z designator not supported for PlainDate'); - const TemporalPlainDate = GetIntrinsic('%Temporal.PlainDate%'); - return new TemporalPlainDate(year, month, day, calendar); // include validation + return new PlainDate(year, month, day, calendar); // include validation } export function InterpretTemporalDateTimeFields( @@ -1382,30 +1387,16 @@ export function ToTemporalDuration(item: DurationParams['from'][0]) { ({ years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds } = ParseTemporalDurationString(ToString(item))); } - const TemporalDuration = GetIntrinsic('%Temporal.Duration%'); - return new TemporalDuration( - years, - months, - weeks, - days, - hours, - minutes, - seconds, - milliseconds, - microseconds, - nanoseconds - ); + return new Duration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); } export function ToTemporalInstant(item: InstantParams['from'][0]) { if (IsTemporalInstant(item)) return item; if (IsTemporalZonedDateTime(item)) { - const TemporalInstant = GetIntrinsic('%Temporal.Instant%'); - return new TemporalInstant(GetSlot(item, EPOCHNANOSECONDS)); + return new Instant(GetSlot(item, EPOCHNANOSECONDS)); } const ns = ParseTemporalInstant(ToString(item)); - const TemporalInstant = GetIntrinsic('%Temporal.Instant%'); - return new TemporalInstant(ns); + return new Instant(ns); } export function ToTemporalMonthDay( @@ -1467,8 +1458,7 @@ export function ToTemporalTime( ); } if (IsTemporalDateTime(item)) { - const TemporalPlainTime = GetIntrinsic('%Temporal.PlainTime%'); - return new TemporalPlainTime( + return new PlainTime( GetSlot(item, ISO_HOUR), GetSlot(item, ISO_MINUTE), GetSlot(item, ISO_SECOND), @@ -1500,8 +1490,7 @@ export function ToTemporalTime( throw new RangeError('PlainTime can only have iso8601 calendar'); } } - const TemporalPlainTime = GetIntrinsic('%Temporal.PlainTime%'); - return new TemporalPlainTime(hour, minute, second, millisecond, microsecond, nanosecond); + return new PlainTime(hour, minute, second, millisecond, microsecond, nanosecond); } export function ToTemporalYearMonth( @@ -1551,8 +1540,7 @@ export function InterpretISODateTimeOffset( offsetOpt: Temporal.OffsetDisambiguationOptions['offset'], matchMinute: boolean ) { - const DateTime = GetIntrinsic('%Temporal.PlainDateTime%'); - const dt = new DateTime(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond); + const dt = new PlainDateTime(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond); if (offsetBehaviour === 'wall' || offsetOpt === 'ignore') { // Simple case: ISO string without a TZ offset (or caller wants to ignore @@ -1656,8 +1644,7 @@ export function ToTemporalZonedDateTime( } else if (!offset) { offsetBehaviour = 'wall'; } - const TemporalTimeZone = GetIntrinsic('%Temporal.TimeZone%'); - timeZone = new TemporalTimeZone(ianaName); + timeZone = new TimeZone(ianaName); if (!calendar) calendar = GetISO8601Calendar(); calendar = ToTemporalCalendar(calendar); matchMinute = true; // ISO strings may specify offset with less precision @@ -1719,8 +1706,7 @@ export function CreateTemporalDate( isoDay: number, calendar: Temporal.CalendarProtocol = GetISO8601Calendar() ) { - const TemporalPlainDate = GetIntrinsic('%Temporal.PlainDate%'); - const result = ObjectCreate(TemporalPlainDate.prototype); + const result = ObjectCreate(PlainDate.prototype); CreateTemporalDateSlots(result, isoYear, isoMonth, isoDay, calendar); return result; } @@ -1775,8 +1761,7 @@ export function CreateTemporalDateTime( ns: number, calendar: Temporal.CalendarProtocol = GetISO8601Calendar() ) { - const TemporalPlainDateTime = GetIntrinsic('%Temporal.PlainDateTime%'); - const result = ObjectCreate(TemporalPlainDateTime.prototype); + const result = ObjectCreate(PlainDateTime.prototype); CreateTemporalDateTimeSlots(result, isoYear, isoMonth, isoDay, h, min, s, ms, µs, ns, calendar); return result as Temporal.PlainDateTime; } @@ -1814,8 +1799,7 @@ export function CreateTemporalMonthDay( calendar: Temporal.CalendarProtocol = GetISO8601Calendar(), referenceISOYear = 1972 ) { - const TemporalPlainMonthDay = GetIntrinsic('%Temporal.PlainMonthDay%'); - const result = ObjectCreate(TemporalPlainMonthDay.prototype); + const result = ObjectCreate(PlainMonthDay.prototype); CreateTemporalMonthDaySlots(result, isoMonth, isoDay, calendar, referenceISOYear); return result; } @@ -1853,7 +1837,6 @@ export function CreateTemporalYearMonth( calendar: Temporal.CalendarProtocol = GetISO8601Calendar(), referenceISODay = 1 ) { - const TemporalPlainYearMonth = GetIntrinsic('%Temporal.PlainYearMonth%'); const result = ObjectCreate(TemporalPlainYearMonth.prototype); CreateTemporalYearMonthSlots(result, isoYear, isoMonth, calendar, referenceISODay); return result; diff --git a/test/monkeypatch.mjs b/test/monkeypatch.mjs index 146bf785..9c8da2e7 100644 --- a/test/monkeypatch.mjs +++ b/test/monkeypatch.mjs @@ -1,4 +1,5 @@ #! /usr/bin/env -S node --experimental-modules +/* eslint-disable no-import-assign */ import Demitasse from '@pipobscure/demitasse'; const { describe, it, report } = Demitasse; @@ -14,11 +15,25 @@ const { PlainDate } = Temporal; describe('Monkeypatch', () => { describe('PlainDate', () => { - it("Monkeypatching Duration doesn't affect PlainDate", () => { + it("Monkeypatching Duration constructor doesn't affect PlainDate", () => { Temporal.Duration.prototype.constructor = null; const date = PlainDate.from('2021-12-09'); equal(`${date.until('2021-12-10')}`, 'P1D'); }); + + it("Monkeypatching Duration to be null doesn't affect PlainDate", () => { + // @ts-ignore: we need to forcefully do stupid things here + Temporal.Duration = null; + const date = PlainDate.from('2021-12-09'); + equal(`${date.until('2021-12-10')}`, 'P1D'); + }); + + it("delete Duration constructor doesn't affect PlainDate", () => { + // @ts-ignore: we need to forcefully do stupid things here + delete Temporal.Duration; + const date = PlainDate.from('2021-12-09'); + equal(`${date.until('2021-12-10')}`, 'P1D'); + }); }); }); From f2684b5607c236ee3452aa1d71ce59f5461548e7 Mon Sep 17 00:00:00 2001 From: Jens Ochsenmeier Date: Tue, 14 Dec 2021 22:21:10 +0100 Subject: [PATCH 3/7] merging with changes on main --- lib/duration.ts | 3 - lib/ecmascript.ts | 135 +++++++++++++++------------------------- lib/instant.ts | 6 +- lib/intl.ts | 25 +++++--- lib/intrinsicclass.ts | 139 ------------------------------------------ lib/now.ts | 3 +- lib/plaindate.ts | 3 - lib/plaindatetime.ts | 6 +- lib/plainmonthday.ts | 3 - lib/plaintime.ts | 8 +-- lib/plainyearmonth.ts | 6 +- lib/timezone.ts | 7 +-- lib/zoneddatetime.ts | 36 +++++------ test262 | 2 +- 14 files changed, 93 insertions(+), 289 deletions(-) delete mode 100644 lib/intrinsicclass.ts diff --git a/lib/duration.ts b/lib/duration.ts index bbb43bdb..9acde729 100644 --- a/lib/duration.ts +++ b/lib/duration.ts @@ -1,6 +1,5 @@ import { DEBUG } from './debug'; import * as ES from './ecmascript'; -import { MakeIntrinsicClass } from './intrinsicclass'; import { YEARS, MONTHS, @@ -522,5 +521,3 @@ export class Duration implements Temporal.Duration { } [Symbol.toStringTag]!: 'Temporal.Duration'; } - -MakeIntrinsicClass(Duration, 'Temporal.Duration'); diff --git a/lib/ecmascript.ts b/lib/ecmascript.ts index 47879a5a..4862109d 100644 --- a/lib/ecmascript.ts +++ b/lib/ecmascript.ts @@ -72,7 +72,7 @@ import { MICROSECONDS, NANOSECONDS } from './slots'; -import { IsBuiltinCalendar } from './calendar'; +import { Calendar, IsBuiltinCalendar } from './calendar'; export const ZERO = JSBI.BigInt(0); const ONE = JSBI.BigInt(1); @@ -225,10 +225,11 @@ import * as PARSE from './regex'; import { PlainDate } from './plaindate'; import { Duration } from './duration'; import { Instant } from './instant'; -import { PlainMonthDay } from './plainmonthday'; -import { PlainDateTime } from './plaindatetime'; import { PlainTime } from './plaintime'; +import { PlainDateTime } from './plaindatetime'; import { TimeZone } from './timezone'; +import { PlainMonthDay } from './plainmonthday'; +import { ZonedDateTime } from './zoneddatetime'; const IntlDateTimeFormatEnUsCache = new Map(); @@ -1428,10 +1429,7 @@ export function ToTemporalMonthDay( ToTemporalOverflow(options); // validate and ignore let { month, day, referenceISOYear, calendar: maybeStringCalendar } = ParseTemporalMonthDayString(ToString(item)); - // TODO: should this be a ternary? - let calendar: Temporal.CalendarProtocol | string = maybeStringCalendar; - if (calendar === undefined) calendar = GetISO8601Calendar(); - calendar = ToTemporalCalendar(calendar); + const calendar = maybeStringCalendar ? ToTemporalCalendar(maybeStringCalendar) : GetISO8601Calendar(); if (referenceISOYear === undefined) { RejectISODate(1972, month, day); @@ -1507,10 +1505,8 @@ export function ToTemporalYearMonth( ToTemporalOverflow(options); // validate and ignore let { year, month, referenceISODay, calendar: maybeStringCalendar } = ParseTemporalYearMonthString(ToString(item)); - // TODO: replace with ternary? - let calendar: Temporal.CalendarProtocol | string = maybeStringCalendar; - if (calendar === undefined) calendar = GetISO8601Calendar(); - calendar = ToTemporalCalendar(calendar); + + const calendar = maybeStringCalendar ? ToTemporalCalendar(maybeStringCalendar) : GetISO8601Calendar(); if (referenceISODay === undefined) { RejectISODate(year, month, 1); @@ -1670,7 +1666,8 @@ export function ToTemporalZonedDateTime( offsetOpt, matchMinute ); - return CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar); + // make sure that calendar is CalendarPrototocol + return CreateTemporalZonedDateTime(epochNanoseconds, timeZone, ToTemporalCalendar(calendar)); } export function CreateTemporalDateSlots( @@ -1837,7 +1834,11 @@ export function CreateTemporalYearMonth( calendar: Temporal.CalendarProtocol = GetISO8601Calendar(), referenceISODay = 1 ) { +<<<<<<< Updated upstream const result = ObjectCreate(TemporalPlainYearMonth.prototype); +======= + const result = ObjectCreate(PlainYearMonth.prototype); +>>>>>>> Stashed changes CreateTemporalYearMonthSlots(result, isoYear, isoMonth, calendar, referenceISODay); return result; } @@ -1855,8 +1856,7 @@ export function CreateTemporalZonedDateTimeSlots( SetSlot(result, TIME_ZONE, timeZone); SetSlot(result, CALENDAR, calendar); - const TemporalInstant = GetIntrinsic('%Temporal.Instant%'); - const instant = new TemporalInstant(GetSlot(result, EPOCHNANOSECONDS)); + const instant = new Instant(GetSlot(result, EPOCHNANOSECONDS)); SetSlot(result, INSTANT, instant); if (DEBUG) { @@ -1874,15 +1874,13 @@ export function CreateTemporalZonedDateTime( timeZone: Temporal.TimeZoneProtocol, calendar: Temporal.CalendarProtocol = GetISO8601Calendar() ) { - const TemporalZonedDateTime = GetIntrinsic('%Temporal.ZonedDateTime%'); - const result = ObjectCreate(TemporalZonedDateTime.prototype); + const result = ObjectCreate(ZonedDateTime.prototype); CreateTemporalZonedDateTimeSlots(result, epochNanoseconds, timeZone, calendar); return result; } export function GetISO8601Calendar() { - const TemporalCalendar = GetIntrinsic('%Temporal.Calendar%'); - return new TemporalCalendar('iso8601'); + return new Calendar('iso8601'); } // TODO: should (can?) we make this generic so the field names are checked @@ -2062,8 +2060,7 @@ export function ToTemporalCalendar(calendarLikeParam: CalendarParams['from'][0]) if (IsObject(calendarLike) && !('calendar' in calendarLike)) return calendarLike; } const identifier = ToString(calendarLike); - const TemporalCalendar = GetIntrinsic('%Temporal.Calendar%'); - if (IsBuiltinCalendar(identifier)) return new TemporalCalendar(identifier); + if (IsBuiltinCalendar(identifier)) return new Calendar(identifier); let calendar; try { ({ calendar } = ParseISODateTime(identifier, { zoneRequired: false })); @@ -2071,7 +2068,7 @@ export function ToTemporalCalendar(calendarLikeParam: CalendarParams['from'][0]) throw new RangeError(`Invalid calendar: ${identifier}`); } if (!calendar) calendar = 'iso8601'; - return new TemporalCalendar(calendar); + return new Calendar(calendar); } function GetTemporalCalendarWithISODefault( @@ -2145,8 +2142,7 @@ export function ToTemporalTimeZone(temporalTimeZoneLikeParam: TimeZoneParams['fr } const identifier = ToString(temporalTimeZoneLike); const timeZone = ParseTemporalTimeZone(identifier); - const TemporalTimeZone = GetIntrinsic('%Temporal.TimeZone%'); - return new TemporalTimeZone(timeZone); + return new TimeZone(timeZone); } export function TimeZoneEquals(one: Temporal.TimeZoneProtocol, two: Temporal.TimeZoneProtocol) { @@ -2166,8 +2162,7 @@ export function TemporalDateTimeToDate(dateTime: Temporal.PlainDateTime) { } export function TemporalDateTimeToTime(dateTime: Temporal.PlainDateTime) { - const Time = GetIntrinsic('%Temporal.PlainTime%'); - return new Time( + return new PlainTime( GetSlot(dateTime, ISO_HOUR), GetSlot(dateTime, ISO_MINUTE), GetSlot(dateTime, ISO_SECOND), @@ -2237,7 +2232,6 @@ function DisambiguatePossibleInstants( dateTime: Temporal.PlainDateTime, disambiguation: Temporal.ToInstantOptions['disambiguation'] ) { - const Instant = GetIntrinsic('%Temporal.Instant%'); const numInstants = possibleInstants.length; if (numInstants === 1) return possibleInstants[0]; @@ -2274,7 +2268,6 @@ function DisambiguatePossibleInstants( switch (disambiguation) { case 'earlier': { const calendar = GetSlot(dateTime, CALENDAR); - const PlainDateTime = GetIntrinsic('%Temporal.PlainDateTime%'); const earlier = AddDateTime( year, month, @@ -2316,7 +2309,6 @@ function DisambiguatePossibleInstants( // fall through because 'compatible' means 'later' for "spring forward" transitions case 'later': { const calendar = GetSlot(dateTime, CALENDAR); - const PlainDateTime = GetIntrinsic('%Temporal.PlainDateTime%'); const later = AddDateTime( year, month, @@ -2422,8 +2414,7 @@ export function TemporalInstantToString( ) { let outputTimeZone = timeZone; if (outputTimeZone === undefined) { - const TemporalTimeZone = GetIntrinsic('%Temporal.TimeZone%'); - outputTimeZone = new TemporalTimeZone('UTC'); + outputTimeZone = new TimeZone('UTC'); } const iso = GetISO8601Calendar(); const dateTime = BuiltinTimeZoneGetPlainDateTimeFor(outputTimeZone, instant, iso); @@ -2634,8 +2625,7 @@ export function TemporalZonedDateTimeToString( if (options) { const { unit, increment, roundingMode } = options; const ns = RoundInstant(GetSlot(zdt, EPOCHNANOSECONDS), increment, unit, roundingMode); - const TemporalInstant = GetIntrinsic('%Temporal.Instant%'); - instant = new TemporalInstant(ns); + instant = new Instant(ns); } const tz = GetSlot(zdt, TIME_ZONE); @@ -3108,7 +3098,6 @@ export function TotalDurationNanoseconds( } function NanosecondsToDays(nanosecondsParam: JSBI, relativeTo: ReturnType) { - const TemporalInstant = GetIntrinsic('%Temporal.Instant%'); const sign = MathSign(JSBI.toNumber(nanosecondsParam)); let nanoseconds = JSBI.BigInt(nanosecondsParam); let dayLengthNs = 86400e9; @@ -3122,7 +3111,7 @@ function NanosecondsToDays(nanosecondsParam: JSBI, relativeTo: ReturnTypePlainDate @@ -4725,11 +4689,11 @@ export function RoundDuration( // convert months and weeks to days by calculating difference( // relativeTo + years, relativeTo + { years, months, weeks }) - const yearsDuration = new TemporalDuration(years); + const yearsDuration = new Duration(years); const dateAdd = calendar.dateAdd; const firstAddOptions = ObjectCreate(null); const yearsLater = CalendarDateAdd(calendar, relativeTo, yearsDuration, firstAddOptions, dateAdd); - const yearsMonthsWeeks = new TemporalDuration(years, months, weeks); + const yearsMonthsWeeks = new Duration(years, months, weeks); const secondAddOptions = ObjectCreate(null); const yearsMonthsWeeksLater = CalendarDateAdd(calendar, relativeTo, yearsMonthsWeeks, secondAddOptions, dateAdd); const monthsWeeksInDays = DaysUntil(yearsLater, yearsMonthsWeeksLater); @@ -4747,7 +4711,7 @@ export function RoundDuration( relativeTo = CalendarDateAdd(calendar, relativeTo, { years: yearsPassed }, fourthAddOptions, dateAdd); const daysPassed = DaysUntil(oldRelativeTo, relativeTo); days -= daysPassed; - const oneYear = new TemporalDuration(days < 0 ? -1 : 1); + const oneYear = new Duration(days < 0 ? -1 : 1); let { days: oneYearDays } = MoveRelativeDate(calendar, relativeTo, oneYear); // Note that `nanoseconds` below (here and in similar code for months, @@ -4778,11 +4742,11 @@ export function RoundDuration( // convert weeks to days by calculating difference(relativeTo + // { years, months }, relativeTo + { years, months, weeks }) - const yearsMonths = new TemporalDuration(years, months); + const yearsMonths = new Duration(years, months); const dateAdd = calendar.dateAdd; const firstAddOptions = ObjectCreate(null); const yearsMonthsLater = CalendarDateAdd(calendar, relativeTo, yearsMonths, firstAddOptions, dateAdd); - const yearsMonthsWeeks = new TemporalDuration(years, months, weeks); + const yearsMonthsWeeks = new Duration(years, months, weeks); const secondAddOptions = ObjectCreate(null); const yearsMonthsWeeksLater = CalendarDateAdd(calendar, relativeTo, yearsMonthsWeeks, secondAddOptions, dateAdd); const weeksInDays = DaysUntil(yearsMonthsLater, yearsMonthsWeeksLater); @@ -4792,7 +4756,7 @@ export function RoundDuration( // Months may be different lengths of days depending on the calendar, // convert days to months in a loop as described above under 'years'. const sign = MathSign(days); - const oneMonth = new TemporalDuration(0, days < 0 ? -1 : 1); + const oneMonth = new Duration(0, days < 0 ? -1 : 1); let oneMonthDays: number; ({ relativeTo, days: oneMonthDays } = MoveRelativeDate(calendar, relativeTo, oneMonth)); while (MathAbs(days) >= MathAbs(oneMonthDays)) { @@ -4822,7 +4786,7 @@ export function RoundDuration( // Weeks may be different lengths of days depending on the calendar, // convert days to weeks in a loop as described above under 'years'. const sign = MathSign(days); - const oneWeek = new TemporalDuration(0, 0, days < 0 ? -1 : 1); + const oneWeek = new Duration(0, 0, days < 0 ? -1 : 1); let oneWeekDays; ({ relativeTo, days: oneWeekDays } = MoveRelativeDate(calendar, relativeTo, oneWeek)); while (MathAbs(days) >= MathAbs(oneWeekDays)) { @@ -5034,8 +4998,7 @@ export const SystemUTCEpochNanoSeconds: () => JSBI = (() => { export function SystemTimeZone() { const fmt = new IntlDateTimeFormat('en-us'); - const TemporalTimeZone = GetIntrinsic('%Temporal.TimeZone%'); - return new TemporalTimeZone(ParseTemporalTimeZone(fmt.resolvedOptions().timeZone)); + return new TimeZone(ParseTemporalTimeZone(fmt.resolvedOptions().timeZone)); } export function ComparisonResult(value: number) { diff --git a/lib/instant.ts b/lib/instant.ts index 56a124b5..15670697 100644 --- a/lib/instant.ts +++ b/lib/instant.ts @@ -1,6 +1,5 @@ import { DEBUG } from './debug'; import * as ES from './ecmascript'; -import { GetIntrinsic, MakeIntrinsicClass } from './intrinsicclass'; import { EPOCHNANOSECONDS, CreateSlots, GetSlot, SetSlot } from './slots'; import { Temporal } from '..'; import { DateTimeFormat } from './intl'; @@ -8,6 +7,7 @@ import type { InstantParams as Params, InstantReturn as Return } from './interna import JSBI from 'jsbi'; import { BILLION, MILLION, THOUSAND } from './ecmascript'; +import { Duration } from './duration'; const DISALLOWED_UNITS = ['year', 'month', 'week', 'day'] as const; const MAX_DIFFERENCE_INCREMENTS = { @@ -127,7 +127,6 @@ export class Instant implements Temporal.Instant { nanoseconds, largestUnit )); - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration(0, 0, 0, 0, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); } since(otherParam: Params['since'][0], optionsParam: Params['since'][1] = undefined) { @@ -160,7 +159,6 @@ export class Instant implements Temporal.Instant { nanoseconds, largestUnit )); - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration(0, 0, 0, 0, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); } round(optionsParam: Params['round'][0]): Return['round'] { @@ -297,5 +295,3 @@ export class Instant implements Temporal.Instant { } [Symbol.toStringTag]!: 'Temporal.Instant'; } - -MakeIntrinsicClass(Instant, 'Temporal.Instant'); diff --git a/lib/intl.ts b/lib/intl.ts index 49a02de4..5777f1cd 100644 --- a/lib/intl.ts +++ b/lib/intl.ts @@ -1,5 +1,4 @@ import * as ES from './ecmascript'; -import { GetIntrinsic } from './intrinsicclass'; import { GetSlot, INSTANT, @@ -26,6 +25,7 @@ import { PlainTimeParams, PlainYearMonthParams } from './internaltypes'; +import { PlainDateTime } from './plaindatetime'; const DATE = Symbol('date'); const YM = Symbol('ym'); @@ -505,8 +505,6 @@ type TypesWithToLocaleString = | Temporal.ZonedDateTime; function extractOverrides(temporalObj: Params['format'][0], main: DateTimeFormatImpl) { - const DateTime = GetIntrinsic('%Temporal.PlainDateTime%'); - if (ES.IsTemporalTime(temporalObj)) { const hour = GetSlot(temporalObj, ISO_HOUR); const minute = GetSlot(temporalObj, ISO_MINUTE); @@ -514,7 +512,18 @@ function extractOverrides(temporalObj: Params['format'][0], main: DateTimeFormat const millisecond = GetSlot(temporalObj, ISO_MILLISECOND); const microsecond = GetSlot(temporalObj, ISO_MICROSECOND); const nanosecond = GetSlot(temporalObj, ISO_NANOSECOND); - const datetime = new DateTime(1970, 1, 1, hour, minute, second, millisecond, microsecond, nanosecond, main[CAL_ID]); + const datetime = new PlainDateTime( + 1970, + 1, + 1, + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + main[CAL_ID] + ); return { instant: ES.BuiltinTimeZoneGetInstantFor(getResolvedTimeZoneLazy(main), datetime, 'compatible'), formatter: getPropLazy(main, TIME) @@ -531,7 +540,7 @@ function extractOverrides(temporalObj: Params['format'][0], main: DateTimeFormat `cannot format PlainYearMonth with calendar ${calendar} in locale with calendar ${main[CAL_ID]}` ); } - const datetime = new DateTime(isoYear, isoMonth, referenceISODay, 12, 0, 0, 0, 0, 0, calendar); + const datetime = new PlainDateTime(isoYear, isoMonth, referenceISODay, 12, 0, 0, 0, 0, 0, calendar); return { instant: ES.BuiltinTimeZoneGetInstantFor(getResolvedTimeZoneLazy(main), datetime, 'compatible'), formatter: getPropLazy(main, YM) @@ -548,7 +557,7 @@ function extractOverrides(temporalObj: Params['format'][0], main: DateTimeFormat `cannot format PlainMonthDay with calendar ${calendar} in locale with calendar ${main[CAL_ID]}` ); } - const datetime = new DateTime(referenceISOYear, isoMonth, isoDay, 12, 0, 0, 0, 0, 0, calendar); + const datetime = new PlainDateTime(referenceISOYear, isoMonth, isoDay, 12, 0, 0, 0, 0, 0, calendar); return { instant: ES.BuiltinTimeZoneGetInstantFor(getResolvedTimeZoneLazy(main), datetime, 'compatible'), formatter: getPropLazy(main, MD) @@ -563,7 +572,7 @@ function extractOverrides(temporalObj: Params['format'][0], main: DateTimeFormat if (calendar !== 'iso8601' && calendar !== main[CAL_ID]) { throw new RangeError(`cannot format PlainDate with calendar ${calendar} in locale with calendar ${main[CAL_ID]}`); } - const datetime = new DateTime(isoYear, isoMonth, isoDay, 12, 0, 0, 0, 0, 0, main[CAL_ID]); + const datetime = new PlainDateTime(isoYear, isoMonth, isoDay, 12, 0, 0, 0, 0, 0, main[CAL_ID]); return { instant: ES.BuiltinTimeZoneGetInstantFor(getResolvedTimeZoneLazy(main), datetime, 'compatible'), formatter: getPropLazy(main, DATE) @@ -588,7 +597,7 @@ function extractOverrides(temporalObj: Params['format'][0], main: DateTimeFormat } let datetime = temporalObj; if (calendar === 'iso8601') { - datetime = new DateTime( + datetime = new PlainDateTime( isoYear, isoMonth, isoDay, diff --git a/lib/intrinsicclass.ts b/lib/intrinsicclass.ts deleted file mode 100644 index b9846f87..00000000 --- a/lib/intrinsicclass.ts +++ /dev/null @@ -1,139 +0,0 @@ -import JSBI from 'jsbi'; -import { Temporal } from '..'; - -import { DEBUG } from './debug'; - -type OmitConstructor = { [P in keyof T as T[P] extends new (...args: any[]) => any ? P : never]: T[P] }; - -type TemporalIntrinsics = Omit & { - Instant: OmitConstructor & - (new (epochNanoseconds: JSBI) => Temporal.Instant) & { prototype: typeof Temporal.Instant.prototype }; - ZonedDateTime: OmitConstructor & - (new ( - epochNanoseconds: JSBI, - timeZone: Temporal.TimeZoneProtocol | string, - calendar?: Temporal.CalendarProtocol | string - ) => Temporal.ZonedDateTime) & { - prototype: typeof Temporal.ZonedDateTime.prototype; - from: typeof Temporal.ZonedDateTime.from; - compare: typeof Temporal.ZonedDateTime.compare; - }; -}; -type TemporalIntrinsicRegistrations = { - [key in keyof TemporalIntrinsics as `Temporal.${key}`]: TemporalIntrinsics[key]; -}; -type TemporalIntrinsicPrototypeRegistrations = { - [key in keyof TemporalIntrinsics as `Temporal.${key}.prototype`]: TemporalIntrinsics[key]['prototype']; -}; -type TemporalIntrinsicRegisteredKeys = { - [key in keyof TemporalIntrinsicRegistrations as `%${key}%`]: TemporalIntrinsicRegistrations[key]; -}; -type TemporalIntrinsicPrototypeRegisteredKeys = { - [key in keyof TemporalIntrinsicPrototypeRegistrations as `%${key}%`]: TemporalIntrinsicPrototypeRegistrations[key]; -}; - -interface StandaloneIntrinsics { - 'Temporal.Calendar.from': typeof Temporal.Calendar.from; -} -type RegisteredStandaloneIntrinsics = { [key in keyof StandaloneIntrinsics as `%${key}%`]: StandaloneIntrinsics[key] }; -const INTRINSICS: Partial & - Partial & - Partial = {}; - -type customFormatFunction = ( - this: T, - depth: number, - options: { stylize: (value: unknown, type: 'number' | 'special') => string } -) => string; -const customUtilInspectFormatters: Partial<{ - [key in keyof TemporalIntrinsicRegistrations]: customFormatFunction< - InstanceType - >; -}> = { - ['Temporal.Duration'](depth, options) { - const descr = options.stylize(`${this[Symbol.toStringTag]} <${this}>`, 'special'); - if (depth < 1) return descr; - const entries = []; - for (const prop of [ - 'years', - 'months', - 'weeks', - 'days', - 'hours', - 'minutes', - 'seconds', - 'milliseconds', - 'microseconds', - 'nanoseconds' - ] as const) { - if (this[prop] !== 0) entries.push(` ${prop}: ${options.stylize(this[prop], 'number')}`); - } - return descr + ' {\n' + entries.join(',\n') + '\n}'; - } -}; - -type InspectFormatterOptions = { stylize: (str: string, styleType: string) => string }; -function defaultUtilInspectFormatter(this: any, depth: number, options: InspectFormatterOptions) { - return options.stylize(`${this[Symbol.toStringTag]} <${this}>`, 'special'); -} - -export function MakeIntrinsicClass( - Class: TemporalIntrinsicRegistrations[typeof name], - name: keyof TemporalIntrinsicRegistrations -) { - Object.defineProperty(Class.prototype, Symbol.toStringTag, { - value: name, - writable: false, - enumerable: false, - configurable: true - }); - if (DEBUG) { - Object.defineProperty(Class.prototype, Symbol.for('nodejs.util.inspect.custom'), { - value: customUtilInspectFormatters[name] || defaultUtilInspectFormatter, - writable: false, - enumerable: false, - configurable: true - }); - } - for (const prop of Object.getOwnPropertyNames(Class)) { - const desc = Object.getOwnPropertyDescriptor(Class, prop); - if (!desc.configurable || !desc.enumerable) continue; - desc.enumerable = false; - Object.defineProperty(Class, prop, desc); - } - for (const prop of Object.getOwnPropertyNames(Class.prototype)) { - const desc = Object.getOwnPropertyDescriptor(Class.prototype, prop); - if (!desc.configurable || !desc.enumerable) continue; - desc.enumerable = false; - Object.defineProperty(Class.prototype, prop, desc); - } - - DefineIntrinsic(name, Class); - DefineIntrinsic(`${name}.prototype`, Class.prototype); -} - -type IntrinsicDefinitionKeys = - | keyof TemporalIntrinsicRegistrations - | keyof TemporalIntrinsicPrototypeRegistrations - | keyof StandaloneIntrinsics; -export function DefineIntrinsic( - name: KeyT, - value: TemporalIntrinsicRegistrations[KeyT] -): void; -export function DefineIntrinsic( - name: KeyT, - value: TemporalIntrinsicPrototypeRegistrations[KeyT] -): void; -export function DefineIntrinsic( - name: KeyT, - value: StandaloneIntrinsics[KeyT] -): void; -export function DefineIntrinsic(name: KeyT, value: never): void; -export function DefineIntrinsic(name: KeyT, value: unknown): void { - const key: `%${IntrinsicDefinitionKeys}%` = `%${name}%`; - if (INTRINSICS[key] !== undefined) throw new Error(`intrinsic ${name} already exists`); - INTRINSICS[key] = value; -} -export function GetIntrinsic(intrinsic: KeyT): typeof INTRINSICS[KeyT] { - return INTRINSICS[intrinsic]; -} diff --git a/lib/now.ts b/lib/now.ts index befb9bed..0de18fe6 100644 --- a/lib/now.ts +++ b/lib/now.ts @@ -1,9 +1,8 @@ import * as ES from './ecmascript'; -import { GetIntrinsic } from './intrinsicclass'; import { Temporal } from '..'; +import { Instant } from './instant'; const instant: typeof Temporal.Now['instant'] = () => { - const Instant = GetIntrinsic('%Temporal.Instant%'); return new Instant(ES.SystemUTCEpochNanoSeconds()); }; const plainDateTime: typeof Temporal.Now['plainDateTime'] = (calendarLike, temporalTimeZoneLike = timeZone()) => { diff --git a/lib/plaindate.ts b/lib/plaindate.ts index a3dbdeaf..0817df69 100644 --- a/lib/plaindate.ts +++ b/lib/plaindate.ts @@ -1,5 +1,4 @@ import * as ES from './ecmascript'; -import { MakeIntrinsicClass } from './intrinsicclass'; import { ISO_YEAR, ISO_MONTH, @@ -402,5 +401,3 @@ export class PlainDate implements Temporal.PlainDate { } [Symbol.toStringTag]!: 'Temporal.PlainDate'; } - -MakeIntrinsicClass(PlainDate, 'Temporal.PlainDate'); diff --git a/lib/plaindatetime.ts b/lib/plaindatetime.ts index 6eebf490..b0811727 100644 --- a/lib/plaindatetime.ts +++ b/lib/plaindatetime.ts @@ -1,5 +1,4 @@ import * as ES from './ecmascript'; -import { GetIntrinsic, MakeIntrinsicClass } from './intrinsicclass'; import { ISO_YEAR, @@ -18,6 +17,7 @@ import { import { Temporal } from '..'; import { DateTimeFormat } from './intl'; import type { PlainDateTimeParams as Params, PlainDateTimeReturn as Return } from './internaltypes'; +import { Duration } from './duration'; export class PlainDateTime implements Temporal.PlainDateTime { constructor( @@ -428,7 +428,6 @@ export class PlainDateTime implements Temporal.PlainDateTime { largestUnit )); - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); } since(otherParam: Params['since'][0], optionsParam: Params['since'][1] = undefined): Return['since'] { @@ -503,7 +502,6 @@ export class PlainDateTime implements Temporal.PlainDateTime { largestUnit )); - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration( -years, -months, @@ -708,5 +706,3 @@ export class PlainDateTime implements Temporal.PlainDateTime { } [Symbol.toStringTag]!: 'Temporal.PlainDateTime'; } - -MakeIntrinsicClass(PlainDateTime, 'Temporal.PlainDateTime'); diff --git a/lib/plainmonthday.ts b/lib/plainmonthday.ts index e9ba3c68..8d8dd3da 100644 --- a/lib/plainmonthday.ts +++ b/lib/plainmonthday.ts @@ -1,5 +1,4 @@ import * as ES from './ecmascript'; -import { MakeIntrinsicClass } from './intrinsicclass'; import { ISO_MONTH, ISO_DAY, ISO_YEAR, CALENDAR, GetSlot } from './slots'; import { Temporal } from '..'; import { DateTimeFormat } from './intl'; @@ -148,5 +147,3 @@ export class PlainMonthDay implements Temporal.PlainMonthDay { } [Symbol.toStringTag]!: 'Temporal.PlainMonthDay'; } - -MakeIntrinsicClass(PlainMonthDay, 'Temporal.PlainMonthDay'); diff --git a/lib/plaintime.ts b/lib/plaintime.ts index f9c041b2..60b4aac6 100644 --- a/lib/plaintime.ts +++ b/lib/plaintime.ts @@ -1,6 +1,5 @@ import { DEBUG } from './debug'; import * as ES from './ecmascript'; -import { GetIntrinsic, MakeIntrinsicClass } from './intrinsicclass'; import { ISO_YEAR, @@ -21,6 +20,8 @@ import { import { Temporal } from '..'; import { DateTimeFormat } from './intl'; import type { PlainTimeParams as Params, PlainTimeReturn as Return } from './internaltypes'; +import { Duration } from './duration'; +import { PlainDateTime } from './plaindatetime'; const ObjectAssign = Object.assign; @@ -291,7 +292,6 @@ export class PlainTime implements Temporal.PlainTime { nanoseconds, largestUnit )); - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration(0, 0, 0, 0, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); } since(otherParam: Params['since'][0], optionsParam: Params['since'][1] = undefined): Return['since'] { @@ -348,7 +348,6 @@ export class PlainTime implements Temporal.PlainTime { nanoseconds, largestUnit )); - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration(0, 0, 0, 0, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); } round(optionsParam: Params['round'][0]): Return['round'] { @@ -475,7 +474,6 @@ export class PlainTime implements Temporal.PlainTime { const microsecond = GetSlot(this, ISO_MICROSECOND); const nanosecond = GetSlot(this, ISO_NANOSECOND); - const PlainDateTime = GetIntrinsic('%Temporal.PlainDateTime%'); const dt = new PlainDateTime( year, month, @@ -531,5 +529,3 @@ export class PlainTime implements Temporal.PlainTime { } [Symbol.toStringTag]!: 'Temporal.PlainTime'; } - -MakeIntrinsicClass(PlainTime, 'Temporal.PlainTime'); diff --git a/lib/plainyearmonth.ts b/lib/plainyearmonth.ts index 537c3046..bd5e6552 100644 --- a/lib/plainyearmonth.ts +++ b/lib/plainyearmonth.ts @@ -1,9 +1,9 @@ import * as ES from './ecmascript'; -import { GetIntrinsic, MakeIntrinsicClass } from './intrinsicclass'; import { ISO_YEAR, ISO_MONTH, ISO_DAY, CALENDAR, GetSlot } from './slots'; import { Temporal } from '..'; import { DateTimeFormat } from './intl'; import type { FieldRecord, PlainYearMonthParams as Params, PlainYearMonthReturn as Return } from './internaltypes'; +import { Duration } from './duration'; const ObjectCreate = Object.create; @@ -203,7 +203,6 @@ export class PlainYearMonth implements Temporal.PlainYearMonth { thisDate )); - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration(years, months, 0, 0, 0, 0, 0, 0, 0, 0); } since(otherParam: Params['since'][0], optionsParam: Params['since'][1] = undefined): Return['since'] { @@ -233,7 +232,6 @@ export class PlainYearMonth implements Temporal.PlainYearMonth { const untilOptions = { ...options, largestUnit }; let { years, months } = ES.CalendarDateUntil(calendar, thisDate, otherDate, untilOptions); - const Duration = GetIntrinsic('%Temporal.Duration%'); if (smallestUnit === 'month' && roundingIncrement === 1) { return new Duration(-years, -months, 0, 0, 0, 0, 0, 0, 0, 0); } @@ -356,5 +354,3 @@ export class PlainYearMonth implements Temporal.PlainYearMonth { } [Symbol.toStringTag]!: 'Temporal.PlainYearMonth'; } - -MakeIntrinsicClass(PlainYearMonth, 'Temporal.PlainYearMonth'); diff --git a/lib/timezone.ts b/lib/timezone.ts index b6d6ac0c..4b390d69 100644 --- a/lib/timezone.ts +++ b/lib/timezone.ts @@ -1,6 +1,5 @@ import { DEBUG } from './debug'; import * as ES from './ecmascript'; -import { GetIntrinsic, MakeIntrinsicClass } from './intrinsicclass'; import { TIMEZONE_ID, EPOCHNANOSECONDS, @@ -20,6 +19,7 @@ import { import JSBI from 'jsbi'; import { Temporal } from '..'; import type { TimeZoneParams as Params, TimeZoneReturn as Return } from './internaltypes'; +import { Instant } from './instant'; export class TimeZone implements Temporal.TimeZone { constructor(timeZoneIdentifierParam: string) { @@ -81,7 +81,6 @@ export class TimeZone implements Temporal.TimeZone { getPossibleInstantsFor(dateTimeParam: Params['getPossibleInstantsFor'][0]): Return['getPossibleInstantsFor'] { if (!ES.IsTemporalTimeZone(this)) throw new TypeError('invalid receiver'); const dateTime = ES.ToTemporalDateTime(dateTimeParam); - const Instant = GetIntrinsic('%Temporal.Instant%'); const id = GetSlot(this, TIMEZONE_ID); const offsetNs = ES.ParseOffsetString(id); @@ -126,7 +125,6 @@ export class TimeZone implements Temporal.TimeZone { } let epochNanoseconds = GetSlot(startingPoint, EPOCHNANOSECONDS); - const Instant = GetIntrinsic('%Temporal.Instant%'); epochNanoseconds = ES.GetIANATimeZoneNextTransition(epochNanoseconds, id); return epochNanoseconds === null ? null : new Instant(epochNanoseconds); } @@ -141,7 +139,6 @@ export class TimeZone implements Temporal.TimeZone { } let epochNanoseconds = GetSlot(startingPoint, EPOCHNANOSECONDS); - const Instant = GetIntrinsic('%Temporal.Instant%'); epochNanoseconds = ES.GetIANATimeZonePreviousTransition(epochNanoseconds, id); return epochNanoseconds === null ? null : new Instant(epochNanoseconds); } @@ -157,5 +154,3 @@ export class TimeZone implements Temporal.TimeZone { } [Symbol.toStringTag]!: 'Temporal.TimeZone'; } - -MakeIntrinsicClass(TimeZone, 'Temporal.TimeZone'); diff --git a/lib/zoneddatetime.ts b/lib/zoneddatetime.ts index 1c535f6c..3f65b142 100644 --- a/lib/zoneddatetime.ts +++ b/lib/zoneddatetime.ts @@ -1,5 +1,4 @@ import * as ES from './ecmascript'; -import { GetIntrinsic, MakeIntrinsicClass } from './intrinsicclass'; import { CALENDAR, EPOCHNANOSECONDS, @@ -22,6 +21,10 @@ import type { ZonedDateTimeParams as Params, ZonedDateTimeReturn as Return } fro import JSBI from 'jsbi'; import { BILLION, MILLION, THOUSAND, ZERO } from './ecmascript'; +import { PlainDateTime } from './plaindatetime'; +import { PlainTime } from './plaintime'; +import { Duration } from './duration'; +import { Instant } from './instant'; const ArrayPrototypePush = Array.prototype.push; @@ -134,13 +137,12 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { get hoursInDay(): Return['hoursInDay'] { if (!ES.IsTemporalZonedDateTime(this)) throw new TypeError('invalid receiver'); const dt = dateTime(this); - const DateTime = GetIntrinsic('%Temporal.PlainDateTime%'); const year = GetSlot(dt, ISO_YEAR); const month = GetSlot(dt, ISO_MONTH); const day = GetSlot(dt, ISO_DAY); - const today = new DateTime(year, month, day, 0, 0, 0, 0, 0, 0); + const today = new PlainDateTime(year, month, day, 0, 0, 0, 0, 0, 0); const tomorrowFields = ES.AddISODate(year, month, day, 0, 0, 0, 1, 'reject'); - const tomorrow = new DateTime(tomorrowFields.year, tomorrowFields.month, tomorrowFields.day, 0, 0, 0, 0, 0, 0); + const tomorrow = new PlainDateTime(tomorrowFields.year, tomorrowFields.month, tomorrowFields.day, 0, 0, 0, 0, 0, 0); const timeZone = GetSlot(this, TIME_ZONE); const todayNs = GetSlot(ES.BuiltinTimeZoneGetInstantFor(timeZone, today, 'compatible'), EPOCHNANOSECONDS); const tomorrowNs = GetSlot(ES.BuiltinTimeZoneGetInstantFor(timeZone, tomorrow, 'compatible'), EPOCHNANOSECONDS); @@ -270,7 +272,6 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { calendar = ES.ConsolidateCalendars(GetSlot(this, CALENDAR), calendar); const timeZone = GetSlot(this, TIME_ZONE); - const PlainDateTime = GetIntrinsic('%Temporal.PlainDateTime%'); const dt = new PlainDateTime( year, month, @@ -289,7 +290,6 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { withPlainTime(temporalTimeParam: Params['withPlainTime'][0] = undefined): Return['withPlainTime'] { if (!ES.IsTemporalZonedDateTime(this)) throw new TypeError('invalid receiver'); - const PlainTime = GetIntrinsic('%Temporal.PlainTime%'); const temporalTime = temporalTimeParam == undefined ? new PlainTime() : ES.ToTemporalTime(temporalTimeParam); const thisDt = dateTime(this); @@ -305,7 +305,6 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { const nanosecond = GetSlot(temporalTime, ISO_NANOSECOND); const timeZone = GetSlot(this, TIME_ZONE); - const PlainDateTime = GetIntrinsic('%Temporal.PlainDateTime%'); const dt = new PlainDateTime( year, month, @@ -475,7 +474,6 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { )); } - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); } since(otherParam: Params['since'][0], optionsParam: Params['since'][1] = undefined) { @@ -570,7 +568,6 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { )); } - const Duration = GetIntrinsic('%Temporal.Duration%'); return new Duration( -years, -months, @@ -617,10 +614,19 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { let microsecond = GetSlot(dt, ISO_MICROSECOND); let nanosecond = GetSlot(dt, ISO_NANOSECOND); - const DateTime = GetIntrinsic('%Temporal.PlainDateTime%'); const timeZone = GetSlot(this, TIME_ZONE); const calendar = GetSlot(this, CALENDAR); - const dtStart = new DateTime(GetSlot(dt, ISO_YEAR), GetSlot(dt, ISO_MONTH), GetSlot(dt, ISO_DAY), 0, 0, 0, 0, 0, 0); + const dtStart = new PlainDateTime( + GetSlot(dt, ISO_YEAR), + GetSlot(dt, ISO_MONTH), + GetSlot(dt, ISO_DAY), + 0, + 0, + 0, + 0, + 0, + 0 + ); const instantStart = ES.BuiltinTimeZoneGetInstantFor(timeZone, dtStart, 'compatible'); const endNs = ES.AddZonedDateTime(instantStart, timeZone, calendar, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); const dayLengthNs = JSBI.subtract(endNs, JSBI.BigInt(GetSlot(instantStart, EPOCHNANOSECONDS))); @@ -711,9 +717,8 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { startOfDay(): Return['startOfDay'] { if (!ES.IsTemporalZonedDateTime(this)) throw new TypeError('invalid receiver'); const dt = dateTime(this); - const DateTime = GetIntrinsic('%Temporal.PlainDateTime%'); const calendar = GetSlot(this, CALENDAR); - const dtStart = new DateTime( + const dtStart = new PlainDateTime( GetSlot(dt, ISO_YEAR), GetSlot(dt, ISO_MONTH), GetSlot(dt, ISO_DAY), @@ -731,8 +736,7 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { } toInstant(): Return['toInstant'] { if (!ES.IsTemporalZonedDateTime(this)) throw new TypeError('invalid receiver'); - const TemporalInstant = GetIntrinsic('%Temporal.Instant%'); - return new TemporalInstant(GetSlot(this, EPOCHNANOSECONDS)); + return new Instant(GetSlot(this, EPOCHNANOSECONDS)); } toPlainDate(): Return['toPlainDate'] { if (!ES.IsTemporalZonedDateTime(this)) throw new TypeError('invalid receiver'); @@ -805,8 +809,6 @@ export class ZonedDateTime implements Temporal.ZonedDateTime { [Symbol.toStringTag]!: 'Temporal.ZonedDateTime'; } -MakeIntrinsicClass(ZonedDateTime, 'Temporal.ZonedDateTime'); - function dateTime(zdt: Temporal.ZonedDateTime) { return ES.BuiltinTimeZoneGetPlainDateTimeFor(GetSlot(zdt, TIME_ZONE), GetSlot(zdt, INSTANT), GetSlot(zdt, CALENDAR)); } diff --git a/test262 b/test262 index 4b7f8b49..3dbf940c 160000 --- a/test262 +++ b/test262 @@ -1 +1 @@ -Subproject commit 4b7f8b49cc07a89c093475f284ef112f26a8529f +Subproject commit 3dbf940c9bff08b05a87e34e98864887550bda8d From 4c126eb117c8b22002e2190e17cb2bc6057d066e Mon Sep 17 00:00:00 2001 From: Jens Ochsenmeier Date: Tue, 14 Dec 2021 22:29:18 +0100 Subject: [PATCH 4/7] fix merge error, update test262 --- lib/ecmascript.ts | 5 +---- test262 | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/ecmascript.ts b/lib/ecmascript.ts index 4862109d..4393ec0f 100644 --- a/lib/ecmascript.ts +++ b/lib/ecmascript.ts @@ -230,6 +230,7 @@ import { PlainDateTime } from './plaindatetime'; import { TimeZone } from './timezone'; import { PlainMonthDay } from './plainmonthday'; import { ZonedDateTime } from './zoneddatetime'; +import { PlainYearMonth } from './plainyearmonth'; const IntlDateTimeFormatEnUsCache = new Map(); @@ -1834,11 +1835,7 @@ export function CreateTemporalYearMonth( calendar: Temporal.CalendarProtocol = GetISO8601Calendar(), referenceISODay = 1 ) { -<<<<<<< Updated upstream - const result = ObjectCreate(TemporalPlainYearMonth.prototype); -======= const result = ObjectCreate(PlainYearMonth.prototype); ->>>>>>> Stashed changes CreateTemporalYearMonthSlots(result, isoYear, isoMonth, calendar, referenceISODay); return result; } diff --git a/test262 b/test262 index 3dbf940c..04cd6da0 160000 --- a/test262 +++ b/test262 @@ -1 +1 @@ -Subproject commit 3dbf940c9bff08b05a87e34e98864887550bda8d +Subproject commit 04cd6da021461653b2fb1076392b6e13ffb9b1d7 From 34c3049e3995c55251ed016b430e392dcf9a5a86 Mon Sep 17 00:00:00 2001 From: Jens Ochsenmeier Date: Mon, 20 Dec 2021 23:59:44 +0100 Subject: [PATCH 5/7] update tests --- test/monkeypatch.mjs | 14 -------------- test262 | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/test/monkeypatch.mjs b/test/monkeypatch.mjs index 9c8da2e7..11ac5632 100644 --- a/test/monkeypatch.mjs +++ b/test/monkeypatch.mjs @@ -20,20 +20,6 @@ describe('Monkeypatch', () => { const date = PlainDate.from('2021-12-09'); equal(`${date.until('2021-12-10')}`, 'P1D'); }); - - it("Monkeypatching Duration to be null doesn't affect PlainDate", () => { - // @ts-ignore: we need to forcefully do stupid things here - Temporal.Duration = null; - const date = PlainDate.from('2021-12-09'); - equal(`${date.until('2021-12-10')}`, 'P1D'); - }); - - it("delete Duration constructor doesn't affect PlainDate", () => { - // @ts-ignore: we need to forcefully do stupid things here - delete Temporal.Duration; - const date = PlainDate.from('2021-12-09'); - equal(`${date.until('2021-12-10')}`, 'P1D'); - }); }); }); diff --git a/test262 b/test262 index 04cd6da0..08a9fc2b 160000 --- a/test262 +++ b/test262 @@ -1 +1 @@ -Subproject commit 04cd6da021461653b2fb1076392b6e13ffb9b1d7 +Subproject commit 08a9fc2b974f83a9835174cede20a7935f126015 From 516b4d31c1c3e711185f93e93814ed51b7e3c8d8 Mon Sep 17 00:00:00 2001 From: Jens Ochsenmeier Date: Sat, 9 Jul 2022 15:02:05 +0200 Subject: [PATCH 6/7] remove unnecessary defaults from package.json --- package.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/package.json b/package.json index 2bcc9949..46b2dfd4 100644 --- a/package.json +++ b/package.json @@ -109,11 +109,7 @@ "prettier": { "printWidth": 120, "trailingComma": "none", - "tabWidth": 2, - "semi": true, - "singleQuote": true, - "bracketSpacing": true, - "arrowParens": "always" + "singleQuote": true }, "directories": { "lib": "lib", From 1c4fc3b6350bd76e4114f244a3a59426611ca24a Mon Sep 17 00:00:00 2001 From: Jens Ochsenmeier Date: Sat, 9 Jul 2022 15:02:25 +0200 Subject: [PATCH 7/7] remove unnecessary defaults from tsconfig.json --- tsconfig.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index d5397b7b..57256740 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,19 +5,16 @@ "downlevelIteration": true, "importHelpers": true, "importsNotUsedAsValues": "error", - "inlineSources": false, "lib": ["dom", "ES2020"], "module": "es6", "moduleResolution": "node", "noEmitOnError": true, "noErrorTruncation": true, - // "noFallthroughCasesInSwitch": true, "noImplicitAny": true, "noImplicitOverride": true, "noImplicitReturns": true, "noImplicitThis": true, "outDir": "tsc-out/", - "preserveConstEnums": false, "skipDefaultLibCheck": true, "sourceMap": true, "strictBindCallApply": true,