Skip to content
842 changes: 487 additions & 355 deletions lib/calendar.ts

Large diffs are not rendered by default.

256 changes: 162 additions & 94 deletions lib/ecmascript.ts

Large diffs are not rendered by default.

34 changes: 14 additions & 20 deletions lib/intl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,7 @@ import {
TIME_ZONE
} from './slots';
import { Temporal, Intl } from '..';
import {
DateTimeFormatParams as Params,
DateTimeFormatReturn as Return,
InstantParams,
PlainDateParams,
PlainDateTimeParams,
PlainMonthDayParams,
PlainTimeParams,
PlainYearMonthParams
} from './internaltypes';
import { DateTimeFormatParams as Params, DateTimeFormatReturn as Return } from './internaltypes';

const DATE = Symbol('date');
const YM = Symbol('ym');
Expand Down Expand Up @@ -340,7 +331,9 @@ function amend(optionsParam: Intl.DateTimeFormatOptions = {}, amended: MaybeFals
return options as globalThis.Intl.DateTimeFormatOptions;
}

function timeAmend(optionsParam: Intl.DateTimeFormatOptions) {
type OptionsType<T extends TypesWithToLocaleString> = NonNullable<Parameters<T['toLocaleString']>[1]>;

function timeAmend(optionsParam: OptionsType<Temporal.PlainTime>) {
let options = amend(optionsParam, {
year: false,
month: false,
Expand All @@ -359,7 +352,7 @@ function timeAmend(optionsParam: Intl.DateTimeFormatOptions) {
return options;
}

function yearMonthAmend(optionsParam: PlainYearMonthParams['toLocaleString'][1]) {
function yearMonthAmend(optionsParam: OptionsType<Temporal.PlainYearMonth>) {
let options = amend(optionsParam, {
day: false,
hour: false,
Expand All @@ -377,7 +370,7 @@ function yearMonthAmend(optionsParam: PlainYearMonthParams['toLocaleString'][1])
return options;
}

function monthDayAmend(optionsParam: PlainMonthDayParams['toLocaleString'][1]) {
function monthDayAmend(optionsParam: OptionsType<Temporal.PlainMonthDay>) {
let options = amend(optionsParam, {
year: false,
hour: false,
Expand All @@ -395,7 +388,7 @@ function monthDayAmend(optionsParam: PlainMonthDayParams['toLocaleString'][1]) {
return options;
}

function dateAmend(optionsParam: PlainDateParams['toLocaleString'][1]) {
function dateAmend(optionsParam: OptionsType<Temporal.PlainDate>) {
let options = amend(optionsParam, {
hour: false,
minute: false,
Expand All @@ -414,7 +407,7 @@ function dateAmend(optionsParam: PlainDateParams['toLocaleString'][1]) {
return options;
}

function datetimeAmend(optionsParam: PlainDateTimeParams['toLocaleString'][1]) {
function datetimeAmend(optionsParam: OptionsType<Temporal.PlainDateTime>) {
let options = amend(optionsParam, { timeZoneName: false });
if (!hasTimeOptions(options) && !hasDateOptions(options)) {
options = ObjectAssign({}, options, {
Expand All @@ -429,7 +422,7 @@ function datetimeAmend(optionsParam: PlainDateTimeParams['toLocaleString'][1]) {
return options;
}

function zonedDateTimeAmend(optionsParam: PlainTimeParams['toLocaleString'][1]) {
function zonedDateTimeAmend(optionsParam: OptionsType<Temporal.PlainTime>) {
let options = optionsParam;
if (!hasTimeOptions(options) && !hasDateOptions(options)) {
options = ObjectAssign({}, options, {
Expand All @@ -445,7 +438,7 @@ function zonedDateTimeAmend(optionsParam: PlainTimeParams['toLocaleString'][1])
return options;
}

function instantAmend(optionsParam: InstantParams['toLocaleString'][1]) {
function instantAmend(optionsParam: OptionsType<Temporal.Instant>) {
let options = optionsParam;
if (!hasTimeOptions(options) && !hasDateOptions(options)) {
options = ObjectAssign({}, options, {
Expand All @@ -460,11 +453,11 @@ function instantAmend(optionsParam: InstantParams['toLocaleString'][1]) {
return options;
}

function hasDateOptions(options: Parameters<TypesWithToLocaleString['toLocaleString']>[1]) {
function hasDateOptions(options: OptionsType<TypesWithToLocaleString>) {
return 'year' in options || 'month' in options || 'day' in options || 'weekday' in options || 'dateStyle' in options;
}

function hasTimeOptions(options: Parameters<TypesWithToLocaleString['toLocaleString']>[1]) {
function hasTimeOptions(options: OptionsType<TypesWithToLocaleString>) {
return (
'hour' in options || 'minute' in options || 'second' in options || 'timeStyle' in options || 'dayPeriod' in options
);
Expand Down Expand Up @@ -509,7 +502,8 @@ type TypesWithToLocaleString =
| Temporal.PlainTime
| Temporal.PlainYearMonth
| Temporal.PlainMonthDay
| Temporal.ZonedDateTime;
| Temporal.ZonedDateTime
| Temporal.Instant;

function extractOverrides(temporalObj: Params['format'][0], main: DateTimeFormatImpl) {
const DateTime = GetIntrinsic('%Temporal.PlainDateTime%');
Expand Down
10 changes: 5 additions & 5 deletions lib/intrinsicclass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ interface StandaloneIntrinsics {
'Temporal.Calendar.from': typeof Temporal.Calendar.from;
}
type RegisteredStandaloneIntrinsics = { [key in keyof StandaloneIntrinsics as `%${key}%`]: StandaloneIntrinsics[key] };
const INTRINSICS: Partial<TemporalIntrinsicRegisteredKeys> &
Partial<TemporalIntrinsicPrototypeRegisteredKeys> &
Partial<RegisteredStandaloneIntrinsics> = {};
const INTRINSICS = {} as TemporalIntrinsicRegisteredKeys &
TemporalIntrinsicPrototypeRegisteredKeys &
RegisteredStandaloneIntrinsics;

type customFormatFunction<T> = (
this: T,
Expand Down Expand Up @@ -96,13 +96,13 @@ export function MakeIntrinsicClass(
});
}
for (const prop of Object.getOwnPropertyNames(Class)) {
const desc = Object.getOwnPropertyDescriptor(Class, prop);
const desc = Object.getOwnPropertyDescriptor(Class, prop) as PropertyDescriptor;
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);
const desc = Object.getOwnPropertyDescriptor(Class.prototype, prop) as PropertyDescriptor;
if (!desc.configurable || !desc.enumerable) continue;
desc.enumerable = false;
Object.defineProperty(Class.prototype, prop, desc);
Expand Down
2 changes: 1 addition & 1 deletion lib/plaintime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ type TemporalTimeToStringOptions = {
function TemporalTimeToString(
time: Temporal.PlainTime,
precision: ReturnType<typeof ES.ToSecondsStringPrecision>['precision'],
options: TemporalTimeToStringOptions = undefined
options: TemporalTimeToStringOptions | undefined = undefined
) {
let hour = GetSlot(time, ISO_HOUR);
let minute = GetSlot(time, ISO_MINUTE);
Expand Down
4 changes: 2 additions & 2 deletions lib/timezone.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ export class TimeZone implements Temporal.TimeZone {
return null;
}

let epochNanoseconds = GetSlot(startingPoint, EPOCHNANOSECONDS);
let epochNanoseconds: JSBI | null = GetSlot(startingPoint, EPOCHNANOSECONDS);
const Instant = GetIntrinsic('%Temporal.Instant%');
epochNanoseconds = ES.GetIANATimeZoneNextTransition(epochNanoseconds, id);
return epochNanoseconds === null ? null : new Instant(epochNanoseconds);
Expand All @@ -140,7 +140,7 @@ export class TimeZone implements Temporal.TimeZone {
return null;
}

let epochNanoseconds = GetSlot(startingPoint, EPOCHNANOSECONDS);
let epochNanoseconds: JSBI | null = GetSlot(startingPoint, EPOCHNANOSECONDS);
const Instant = GetIntrinsic('%Temporal.Instant%');
epochNanoseconds = ES.GetIANATimeZonePreviousTransition(epochNanoseconds, id);
return epochNanoseconds === null ? null : new Instant(epochNanoseconds);
Expand Down
4 changes: 2 additions & 2 deletions lib/zoneddatetime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,9 +225,9 @@ export class ZonedDateTime implements Temporal.ZonedDateTime {
entries.push([fieldName, undefined]);
}
});
let fields = ES.PrepareTemporalFields(this, entries as any);
let fields = ES.PrepareTemporalFields(this, entries);
fields = ES.CalendarMergeFields(calendar, fields, props);
fields = ES.PrepareTemporalFields(fields, entries as any);
fields = ES.PrepareTemporalFields(fields, entries);
const { year, month, day, hour, minute, second, millisecond, microsecond, nanosecond } =
ES.InterpretTemporalDateTimeFields(calendar, fields, options);
const offsetNs = ES.ParseTimeZoneOffsetString(fields.offset);
Expand Down
4 changes: 2 additions & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
"skipDefaultLibCheck": true,
"strictBindCallApply": true,
"strictFunctionTypes": true,
// "strictNullChecks": true,
// "strictPropertyInitialization": true,
"strictNullChecks": true,
"strictPropertyInitialization": true,
"stripInternal": true,
"target": "es2020",
"outDir": "tsc-out/",
Expand Down