Skip to content

add a util to format compatibility dates #10043

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 23, 2025
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/wrangler/e2e/pages-dev.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import getPort from "get-port";
import dedent from "ts-dedent";
import { fetch } from "undici";
import { describe, expect, it } from "vitest";
import { formatCompatibilityDate } from "../src/utils/compatibility-date";
import { WranglerE2ETestHelper } from "./helpers/e2e-wrangler-test";
import { fetchText } from "./helpers/fetch-text";
import { normalizeOutput } from "./helpers/normalize";
Expand All @@ -28,7 +29,7 @@ describe.sequential("wrangler pages dev", () => {
);
const { url } = await worker.waitForReady();

const currentDate = new Date().toISOString().substring(0, 10);
const currentDate = formatCompatibilityDate(new Date());
const output = worker.currentOutput.replaceAll(
currentDate,
"<current-date>"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ import {
requireApiToken,
requireAuth,
} from "../../user";
import { getDevCompatibilityDate } from "../../utils/compatibility-date";
import {
DEFAULT_INSPECTOR_PORT,
DEFAULT_LOCAL_PORT,
} from "../../utils/constants";
import { getDevCompatibilityDate } from "../../utils/getDevCompatibilityDate";
import { getRules } from "../../utils/getRules";
import { getScriptName } from "../../utils/getScriptName";
import { isLegacyEnv } from "../../utils/isLegacyEnv";
Expand Down
7 changes: 2 additions & 5 deletions packages/wrangler/src/deploy/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import {
maybeRetrieveFileSourceMap,
} from "../sourcemap";
import triggersDeploy from "../triggers/deploy";
import { formatCompatibilityDate } from "../utils/compatibility-date";
import { helpIfErrorIsSizeOrScriptStartup } from "../utils/friendly-validator-errors";
import { printBindings } from "../utils/print-bindings";
import { retryOnAPIFailure } from "../utils/retry";
Expand Down Expand Up @@ -399,11 +400,7 @@ export default async function deploy(props: Props): Promise<{
}

if (!(props.compatibilityDate || config.compatibility_date)) {
const compatibilityDateStr = `${new Date().getFullYear()}-${(
new Date().getMonth() +
1 +
""
).padStart(2, "0")}-${(new Date().getDate() + "").padStart(2, "0")}`;
const compatibilityDateStr = formatCompatibilityDate(new Date());

throw new UserError(
`A compatibility_date is required when publishing. Add the following to your ${configFileName(config.configPath)} file:
Expand Down
3 changes: 2 additions & 1 deletion packages/wrangler/src/deploy/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { writeOutput } from "../output";
import { getSiteAssetPaths } from "../sites";
import { requireAuth } from "../user";
import { collectKeyValues } from "../utils/collectKeyValues";
import { formatCompatibilityDate } from "../utils/compatibility-date";
import { getRules } from "../utils/getRules";
import { getScriptName } from "../utils/getScriptName";
import { isLegacyEnv } from "../utils/isLegacyEnv";
Expand Down Expand Up @@ -307,7 +308,7 @@ export const deployCommand = createCommand({
entry,
env: args.env,
compatibilityDate: args.latest
? new Date().toISOString().substring(0, 10)
? formatCompatibilityDate(new Date())
: args.compatibilityDate,
compatibilityFlags: args.compatibilityFlags,
vars: cliVars,
Expand Down
7 changes: 2 additions & 5 deletions packages/wrangler/src/deployment-bundle/entry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import dedent from "ts-dedent";
import { configFileName, formatConfigSnippet } from "../config";
import { UserError } from "../errors";
import { sniffUserAgent } from "../package-manager";
import { formatCompatibilityDate } from "../utils/compatibility-date";
import guessWorkerFormat from "./guess-worker-format";
import {
resolveEntryWithAssets,
Expand Down Expand Up @@ -75,11 +76,7 @@ export async function getEntry(
);
}

const compatibilityDateStr = [
new Date().getFullYear(),
(new Date().getMonth() + 1 + "").padStart(2, "0"),
(new Date().getDate() + "").padStart(2, "0"),
].join("-");
const compatibilityDateStr = formatCompatibilityDate(new Date());

const updateConfigMessage = (snippet: RawConfig) => dedent`
${
Expand Down
3 changes: 2 additions & 1 deletion packages/wrangler/src/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { logger } from "./logger";
import { readMetricsConfig } from "./metrics/metrics-config";
import { getPackageManager } from "./package-manager";
import { requireAuth } from "./user";
import { formatCompatibilityDate } from "./utils/compatibility-date";
import { createBatches } from "./utils/create-batches";
import * as shellquote from "./utils/shell-quote";
import type { RawConfig } from "./config";
Expand Down Expand Up @@ -305,7 +306,7 @@ async function getWorkerConfig(
workers_dev: workersDev.enabled,
compatibility_date:
serviceEnvMetadata.script.compatibility_date ??
new Date().toISOString().substring(0, 10),
formatCompatibilityDate(new Date()),
compatibility_flags: serviceEnvMetadata.script.compatibility_flags,
...(allRoutes.length ? { routes: allRoutes } : {}),
placement:
Expand Down
3 changes: 2 additions & 1 deletion packages/wrangler/src/pages/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { logger } from "../logger";
import * as metrics from "../metrics";
import { isNavigatorDefined } from "../navigator-user-agent";
import { getBasePath } from "../paths";
import { formatCompatibilityDate } from "../utils/compatibility-date";
import { debounce } from "../utils/debounce";
import * as shellquote from "../utils/shell-quote";
import { buildFunctions } from "./buildFunctions";
Expand Down Expand Up @@ -1140,7 +1141,7 @@ function resolvePagesDevServerSettings(
// resolve compatibility date
let compatibilityDate = args.compatibilityDate || config.compatibility_date;
if (!compatibilityDate) {
const currentDate = new Date().toISOString().substring(0, 10);
const currentDate = formatCompatibilityDate(new Date());
logger.warn(
`No compatibility_date was specified. Using today's date: ${currentDate}.\n` +
`❯❯ Add one to your ${configFileName(config.configPath)} file: compatibility_date = "${currentDate}", or\n` +
Expand Down
4 changes: 2 additions & 2 deletions packages/wrangler/src/pages/download-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { FatalError } from "../errors";
import { logger } from "../logger";
import * as metrics from "../metrics";
import { requireAuth } from "../user";
import { formatCompatibilityDate } from "../utils/compatibility-date";
import { PAGES_CONFIG_CACHE_FILENAME } from "./constants";
import type { RawEnvironment } from "../config";
import type { PagesConfigCache } from "./types";
Expand Down Expand Up @@ -71,8 +72,7 @@ async function toEnvironment(
): Promise<RawEnvironment> {
const configObj = {} as RawEnvironment;
configObj.compatibility_date =
deploymentConfig.compatibility_date ??
new Date().toISOString().substring(0, 10);
deploymentConfig.compatibility_date ?? formatCompatibilityDate(new Date());

// Find the latest supported compatibility date and use that
if (deploymentConfig.always_use_latest_compatibility_date) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@ import { configFileName } from "../config";
import { logger } from "../logger";
import type { Config } from "../config";

/**
* Returns the compatibility date to use in development.
*
* When no compatibility date is configured, used the workerd date.
* That's the latest valid compatibility date.
*
* @param config wrangler configuration
* @param compatibilityDate configured compatibility date
* @returns the compatibility date to use in development
*/
export function getDevCompatibilityDate(
config: Config,
compatibilityDate = config.compatibility_date
Expand All @@ -13,15 +23,25 @@ export function getDevCompatibilityDate(
const miniflareWorkerd = miniflareRequire("workerd") as {
compatibilityDate: string;
};
const currentDate = miniflareWorkerd.compatibilityDate;
const workerdDate = miniflareWorkerd.compatibilityDate;

if (config.configPath !== undefined && compatibilityDate === undefined) {
logger.warn(
`No compatibility_date was specified. Using the installed Workers runtime's latest supported date: ${currentDate}.\n` +
`❯❯ Add one to your ${configFileName(config.configPath)} file: compatibility_date = "${currentDate}", or\n` +
`❯❯ Pass it in your terminal: wrangler dev [<SCRIPT>] --compatibility-date=${currentDate}\n\n` +
`No compatibility_date was specified. Using the installed Workers runtime's latest supported date: ${workerdDate}.\n` +
`❯❯ Add one to your ${configFileName(config.configPath)} file: compatibility_date = "${workerdDate}", or\n` +
`❯❯ Pass it in your terminal: wrangler dev [<SCRIPT>] --compatibility-date=${workerdDate}\n\n` +
"See https://developers.cloudflare.com/workers/platform/compatibility-dates/ for more information."
);
}
return compatibilityDate ?? currentDate;
return compatibilityDate ?? workerdDate;
}

/**
* Returns the date formatted as a compatibility date
*
* @param date
* @returns The date as a `YYYY-MM-DD` string
*/
export function formatCompatibilityDate(date: Date): string {
return date.toISOString().slice(0, 10);
}
9 changes: 3 additions & 6 deletions packages/wrangler/src/versions/upload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import {
} from "../sourcemap";
import { requireAuth } from "../user";
import { collectKeyValues } from "../utils/collectKeyValues";
import { formatCompatibilityDate } from "../utils/compatibility-date";
import { helpIfErrorIsSizeOrScriptStartup } from "../utils/friendly-validator-errors";
import { getRules } from "../utils/getRules";
import { getScriptName } from "../utils/getScriptName";
Expand Down Expand Up @@ -357,7 +358,7 @@ export const versionsUploadCommand = createCommand({
legacyEnv: isLegacyEnv(config),
env: args.env,
compatibilityDate: args.latest
? new Date().toISOString().substring(0, 10)
? formatCompatibilityDate(new Date())
: args.compatibilityDate,
compatibilityFlags: args.compatibilityFlags,
vars: cliVars,
Expand Down Expand Up @@ -456,11 +457,7 @@ export default async function versionsUpload(props: Props): Promise<{
}

if (!(props.compatibilityDate || config.compatibility_date)) {
const compatibilityDateStr = `${new Date().getFullYear()}-${(
new Date().getMonth() +
1 +
""
).padStart(2, "0")}-${(new Date().getDate() + "").padStart(2, "0")}`;
const compatibilityDateStr = formatCompatibilityDate(new Date());

throw new UserError(`A compatibility_date is required when uploading a Worker Version. Add the following to your ${configFileName(config.configPath)} file:
\`\`\`
Expand Down
Loading