mirror of
https://github.com/swc-project/swc.git
synced 2024-12-25 06:36:08 +03:00
bbaf619f63
swc_bundler: - [x] Fix wrapped esms. (denoland/deno#9307) - [x] Make test secure.
161 lines
4.5 KiB
TypeScript
161 lines
4.5 KiB
TypeScript
// Loaded from https://unpkg.com/luxon@1.25.0/src/impl/conversions.js
|
|
|
|
|
|
import {
|
|
integerBetween,
|
|
isLeapYear,
|
|
timeObject,
|
|
daysInYear,
|
|
daysInMonth,
|
|
weeksInWeekYear,
|
|
isInteger
|
|
} from "./util.js";
|
|
import Invalid from "./invalid.js";
|
|
|
|
const nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
|
|
leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];
|
|
|
|
function unitOutOfRange(unit, value) {
|
|
return new Invalid(
|
|
"unit out of range",
|
|
`you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`
|
|
);
|
|
}
|
|
|
|
function dayOfWeek(year, month, day) {
|
|
const js = new Date(Date.UTC(year, month - 1, day)).getUTCDay();
|
|
return js === 0 ? 7 : js;
|
|
}
|
|
|
|
function computeOrdinal(year, month, day) {
|
|
return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];
|
|
}
|
|
|
|
function uncomputeOrdinal(year, ordinal) {
|
|
const table = isLeapYear(year) ? leapLadder : nonLeapLadder,
|
|
month0 = table.findIndex(i => i < ordinal),
|
|
day = ordinal - table[month0];
|
|
return { month: month0 + 1, day };
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
|
|
export function gregorianToWeek(gregObj) {
|
|
const { year, month, day } = gregObj,
|
|
ordinal = computeOrdinal(year, month, day),
|
|
weekday = dayOfWeek(year, month, day);
|
|
|
|
let weekNumber = Math.floor((ordinal - weekday + 10) / 7),
|
|
weekYear;
|
|
|
|
if (weekNumber < 1) {
|
|
weekYear = year - 1;
|
|
weekNumber = weeksInWeekYear(weekYear);
|
|
} else if (weekNumber > weeksInWeekYear(year)) {
|
|
weekYear = year + 1;
|
|
weekNumber = 1;
|
|
} else {
|
|
weekYear = year;
|
|
}
|
|
|
|
return Object.assign({ weekYear, weekNumber, weekday }, timeObject(gregObj));
|
|
}
|
|
|
|
export function weekToGregorian(weekData) {
|
|
const { weekYear, weekNumber, weekday } = weekData,
|
|
weekdayOfJan4 = dayOfWeek(weekYear, 1, 4),
|
|
yearInDays = daysInYear(weekYear);
|
|
|
|
let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 3,
|
|
year;
|
|
|
|
if (ordinal < 1) {
|
|
year = weekYear - 1;
|
|
ordinal += daysInYear(year);
|
|
} else if (ordinal > yearInDays) {
|
|
year = weekYear + 1;
|
|
ordinal -= daysInYear(weekYear);
|
|
} else {
|
|
year = weekYear;
|
|
}
|
|
|
|
const { month, day } = uncomputeOrdinal(year, ordinal);
|
|
|
|
return Object.assign({ year, month, day }, timeObject(weekData));
|
|
}
|
|
|
|
export function gregorianToOrdinal(gregData) {
|
|
const { year, month, day } = gregData,
|
|
ordinal = computeOrdinal(year, month, day);
|
|
|
|
return Object.assign({ year, ordinal }, timeObject(gregData));
|
|
}
|
|
|
|
export function ordinalToGregorian(ordinalData) {
|
|
const { year, ordinal } = ordinalData,
|
|
{ month, day } = uncomputeOrdinal(year, ordinal);
|
|
|
|
return Object.assign({ year, month, day }, timeObject(ordinalData));
|
|
}
|
|
|
|
export function hasInvalidWeekData(obj) {
|
|
const validYear = isInteger(obj.weekYear),
|
|
validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear)),
|
|
validWeekday = integerBetween(obj.weekday, 1, 7);
|
|
|
|
if (!validYear) {
|
|
return unitOutOfRange("weekYear", obj.weekYear);
|
|
} else if (!validWeek) {
|
|
return unitOutOfRange("week", obj.week);
|
|
} else if (!validWeekday) {
|
|
return unitOutOfRange("weekday", obj.weekday);
|
|
} else return false;
|
|
}
|
|
|
|
export function hasInvalidOrdinalData(obj) {
|
|
const validYear = isInteger(obj.year),
|
|
validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));
|
|
|
|
if (!validYear) {
|
|
return unitOutOfRange("year", obj.year);
|
|
} else if (!validOrdinal) {
|
|
return unitOutOfRange("ordinal", obj.ordinal);
|
|
} else return false;
|
|
}
|
|
|
|
export function hasInvalidGregorianData(obj) {
|
|
const validYear = isInteger(obj.year),
|
|
validMonth = integerBetween(obj.month, 1, 12),
|
|
validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));
|
|
|
|
if (!validYear) {
|
|
return unitOutOfRange("year", obj.year);
|
|
} else if (!validMonth) {
|
|
return unitOutOfRange("month", obj.month);
|
|
} else if (!validDay) {
|
|
return unitOutOfRange("day", obj.day);
|
|
} else return false;
|
|
}
|
|
|
|
export function hasInvalidTimeData(obj) {
|
|
const { hour, minute, second, millisecond } = obj;
|
|
const validHour =
|
|
integerBetween(hour, 0, 23) ||
|
|
(hour === 24 && minute === 0 && second === 0 && millisecond === 0),
|
|
validMinute = integerBetween(minute, 0, 59),
|
|
validSecond = integerBetween(second, 0, 59),
|
|
validMillisecond = integerBetween(millisecond, 0, 999);
|
|
|
|
if (!validHour) {
|
|
return unitOutOfRange("hour", hour);
|
|
} else if (!validMinute) {
|
|
return unitOutOfRange("minute", minute);
|
|
} else if (!validSecond) {
|
|
return unitOutOfRange("second", second);
|
|
} else if (!validMillisecond) {
|
|
return unitOutOfRange("millisecond", millisecond);
|
|
} else return false;
|
|
}
|