104 lines
3.1 KiB
JavaScript
104 lines
3.1 KiB
JavaScript
const platforms = [
|
|
"aws",
|
|
"azure",
|
|
"cloudflare",
|
|
"deno",
|
|
"firebase",
|
|
"netlify",
|
|
"vercel"
|
|
];
|
|
|
|
function resolveCompatibilityDates(input, defaults) {
|
|
const dates = {
|
|
default: ""
|
|
};
|
|
const _defaults = typeof defaults === "string" ? { default: defaults } : defaults || {};
|
|
for (const [key, value] of Object.entries(_defaults)) {
|
|
if (value) {
|
|
dates[key] = formatDate(value);
|
|
}
|
|
}
|
|
const _input = typeof input === "string" ? { default: input } : input || {};
|
|
for (const [key, value] of Object.entries(_input)) {
|
|
if (value) {
|
|
dates[key] = formatDate(value);
|
|
}
|
|
}
|
|
dates.default = formatDate(dates.default || "") || Object.values(dates).sort().pop() || "";
|
|
return dates;
|
|
}
|
|
function resolveCompatibilityDatesFromEnv(overridesInput) {
|
|
const defaults = {
|
|
default: process.env.COMPATIBILITY_DATE ? formatDate(process.env.COMPATIBILITY_DATE) : void 0
|
|
};
|
|
for (const platform of platforms) {
|
|
const envName = `COMPATIBILITY_DATE_${platform.toUpperCase()}`;
|
|
const env = process.env[envName];
|
|
if (env) {
|
|
defaults[platform] = formatDate(env);
|
|
}
|
|
}
|
|
return resolveCompatibilityDates(overridesInput, defaults);
|
|
}
|
|
function formatCompatibilityDate(input) {
|
|
const dates = resolveCompatibilityDates(input);
|
|
const entries = Object.entries(dates);
|
|
if (entries.length === 0) {
|
|
return "-";
|
|
}
|
|
return [
|
|
`${dates["default"]}`,
|
|
...Object.entries(dates).filter(
|
|
([key, value]) => key !== "default" && value && value !== dates["default"]
|
|
).map(([key, value]) => `${key}: ${value}`)
|
|
].join(", ");
|
|
}
|
|
function formatDate(date) {
|
|
const d = normalizeDate(date);
|
|
if (Number.isNaN(d.getDate())) {
|
|
return "";
|
|
}
|
|
const year = d.getFullYear().toString();
|
|
const month = (d.getMonth() + 1).toString().padStart(2, "0");
|
|
const day = d.getDate().toString().padStart(2, "0");
|
|
return `${year}-${month}-${day}`;
|
|
}
|
|
function normalizeDate(date) {
|
|
if (date instanceof Date) {
|
|
return date;
|
|
}
|
|
if (date === "latest") {
|
|
return /* @__PURE__ */ new Date();
|
|
}
|
|
return new Date(date);
|
|
}
|
|
|
|
function getCompatibilityUpdates(allUpdates, compatibilityDate) {
|
|
const _date = resolveCompatibilityDates(compatibilityDate);
|
|
return allUpdates.filter((change) => {
|
|
const _platformDate = _date[change.platform] || _date.default;
|
|
if (!_platformDate) {
|
|
return false;
|
|
}
|
|
if (change.from && _platformDate < change.from) {
|
|
return false;
|
|
}
|
|
if (change.until && _platformDate > change.until) {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
}
|
|
function getCompatibilityChanges(allUpdates, compatibilityDate1, compatibilityDate2) {
|
|
const updates1 = getCompatibilityUpdates(allUpdates, compatibilityDate1);
|
|
const updates2 = getCompatibilityUpdates(allUpdates, compatibilityDate2);
|
|
const added = updates2.filter((update) => !updates1.includes(update));
|
|
const removed = updates1.filter((update) => !updates2.includes(update));
|
|
return {
|
|
added,
|
|
removed
|
|
};
|
|
}
|
|
|
|
export { formatCompatibilityDate, formatDate, getCompatibilityChanges, getCompatibilityUpdates, platforms, resolveCompatibilityDates, resolveCompatibilityDatesFromEnv };
|