2025-09-05 14:59:21 +08:00

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 };