From 215176b7e45d37c6f7d1153640de167ba380568c Mon Sep 17 00:00:00 2001 From: HerrDerb Date: Mon, 9 Feb 2026 09:48:59 +0100 Subject: [PATCH 1/3] Allo skip version check to be set with env var --- ChangeLog.md | 1 + src/common/Environment.ts | 2 +- tests/common/environment.test.ts | 47 ++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 tests/common/environment.test.ts diff --git a/ChangeLog.md b/ChangeLog.md index 51cd48fd2..2aefa9882 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,7 @@ General: - Performance improvements for internal metadata access using in-memory metadata store - Fix building failure on Node 22 platform. - Fix * IfMatch for non-existent resource not throwing 412 Precondition Failed +- Allow to set `--skipApiVersionCheck` via environment variable `AZURITE_SKIP_API_VERSION_CHECK` ## 2025.07 Version 3.35.0 diff --git a/src/common/Environment.ts b/src/common/Environment.ts index e42c4fddb..33eec9d31 100644 --- a/src/common/Environment.ts +++ b/src/common/Environment.ts @@ -173,7 +173,7 @@ export default class Environment implements IEnvironment { } public skipApiVersionCheck(): boolean { - if (this.flags.skipApiVersionCheck !== undefined) { + if (this.flags.skipApiVersionCheck !== undefined || process.env.AZURITE_SKIP_API_VERSION_CHECK === "true") { return true; } // default is false which will check API version diff --git a/tests/common/environment.test.ts b/tests/common/environment.test.ts new file mode 100644 index 000000000..894d87144 --- /dev/null +++ b/tests/common/environment.test.ts @@ -0,0 +1,47 @@ +import * as assert from "assert"; + +import Environment from "../../src/common/Environment"; + +describe("Environment", () => { + const originalArgv = process.argv; + + beforeEach(() => { + process.argv = ["node", "azurite"]; + delete process.env.AZURITE_SKIP_API_VERSION_CHECK; + }); + + afterEach(() => { + process.argv = originalArgv; + delete process.env.AZURITE_SKIP_API_VERSION_CHECK; + }); + + it("defaults skipApiVersionCheck to false @loki", () => { + const env = new Environment(); + + assert.strictEqual(env.skipApiVersionCheck(), false); + }); + + it("returns true when env var AZURITE_SKIP_API_VERSION_CHECK is true @loki", () => { + process.env.AZURITE_SKIP_API_VERSION_CHECK = "true"; + + const env = new Environment(); + + assert.strictEqual(env.skipApiVersionCheck(), true); + }); + + it("returns false when env var AZURITE_SKIP_API_VERSION_CHECK is false @loki", () => { + process.env.AZURITE_SKIP_API_VERSION_CHECK = "false"; + + const env = new Environment(); + + assert.strictEqual(env.skipApiVersionCheck(), false); + }); + + it("returns true when skipApiVersionCheck flag is set @loki", () => { + process.argv.push("--skipApiVersionCheck"); + + const env = new Environment(); + + assert.strictEqual(env.skipApiVersionCheck(), true); + }); +}); From af0fc98a53b00f3c5c7af31c406e9a9094a30efd Mon Sep 17 00:00:00 2001 From: HerrDerb Date: Wed, 18 Mar 2026 09:18:31 +0100 Subject: [PATCH 2/3] Align skip version check for all environments --- ChangeLog.md | 2 +- src/blob/BlobEnvironment.ts | 7 ++----- src/common/Environment.ts | 7 ++----- src/common/utils/utils.ts | 15 +++++++++++++++ src/queue/QueueEnvironment.ts | 7 ++----- src/table/TableEnvironment.ts | 15 +++++++-------- 6 files changed, 29 insertions(+), 24 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 2aefa9882..7ecf9410a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,7 +9,7 @@ General: - Performance improvements for internal metadata access using in-memory metadata store - Fix building failure on Node 22 platform. - Fix * IfMatch for non-existent resource not throwing 412 Precondition Failed -- Allow to set `--skipApiVersionCheck` via environment variable `AZURITE_SKIP_API_VERSION_CHECK` +- Allow setting `--skipApiVersionCheck` via the `AZURITE_SKIP_API_VERSION_CHECK=true` environment variable ## 2025.07 Version 3.35.0 diff --git a/src/blob/BlobEnvironment.ts b/src/blob/BlobEnvironment.ts index 19978e592..1cf940c72 100644 --- a/src/blob/BlobEnvironment.ts +++ b/src/blob/BlobEnvironment.ts @@ -8,6 +8,7 @@ import { DEFAULT_BLOB_SERVER_HOST_NAME, DEFAULT_BLOB_KEEP_ALIVE_TIMEOUT } from "./utils/constants"; +import { shouldSkipApiVersionCheck } from "../common/utils/utils"; if (!(args as any).config.name) { args @@ -112,11 +113,7 @@ export default class BlobEnvironment implements IBlobEnvironment { } public skipApiVersionCheck(): boolean { - if (this.flags.skipApiVersionCheck !== undefined) { - return true; - } - // default is false which will check API version - return false; + return shouldSkipApiVersionCheck(this.flags); } public cert(): string | undefined { diff --git a/src/common/Environment.ts b/src/common/Environment.ts index 33eec9d31..b83b26a0b 100644 --- a/src/common/Environment.ts +++ b/src/common/Environment.ts @@ -19,6 +19,7 @@ import { } from "../table/utils/constants"; import IEnvironment from "./IEnvironment"; +import { shouldSkipApiVersionCheck } from "./utils/utils"; args .option( @@ -173,11 +174,7 @@ export default class Environment implements IEnvironment { } public skipApiVersionCheck(): boolean { - if (this.flags.skipApiVersionCheck !== undefined || process.env.AZURITE_SKIP_API_VERSION_CHECK === "true") { - return true; - } - // default is false which will check API version - return false; + return shouldSkipApiVersionCheck(this.flags); } public disableProductStyleUrl(): boolean { diff --git a/src/common/utils/utils.ts b/src/common/utils/utils.ts index 3debf4f56..71d2776b4 100644 --- a/src/common/utils/utils.ts +++ b/src/common/utils/utils.ts @@ -169,3 +169,18 @@ export async function getMD5FromStream( }); }); } + +/** + * Shared helper to determine whether API version checks should be skipped. + * This checks both CLI flags and the AZURITE_SKIP_API_VERSION_CHECK env var. + */ +export function shouldSkipApiVersionCheck(flags: any): boolean { + if (flags && flags.skipApiVersionCheck !== undefined) { + return true; + } + if (process.env.AZURITE_SKIP_API_VERSION_CHECK === "true") { + return true; + } + // default is false which will check API version + return false; +} diff --git a/src/queue/QueueEnvironment.ts b/src/queue/QueueEnvironment.ts index b0228e013..00464447b 100644 --- a/src/queue/QueueEnvironment.ts +++ b/src/queue/QueueEnvironment.ts @@ -5,6 +5,7 @@ import { DEFAULT_QUEUE_LISTENING_PORT, DEFAULT_QUEUE_SERVER_HOST_NAME } from "./utils/constants"; +import { shouldSkipApiVersionCheck } from "../common/utils/utils"; args .option( @@ -96,11 +97,7 @@ export default class QueueEnvironment implements IQueueEnvironment { } public skipApiVersionCheck(): boolean { - if (this.flags.skipApiVersionCheck !== undefined) { - return true; - } - // default is false which will check API version - return false; + return shouldSkipApiVersionCheck(this.flags); } public cert(): string | undefined { diff --git a/src/table/TableEnvironment.ts b/src/table/TableEnvironment.ts index 86007cd85..1e2b39c6e 100644 --- a/src/table/TableEnvironment.ts +++ b/src/table/TableEnvironment.ts @@ -9,6 +9,7 @@ import { DEFAULT_TABLE_SERVER_HOST_NAME, DEFAULT_TABLE_KEEP_ALIVE_TIMEOUT } from "./utils/constants"; +import { shouldSkipApiVersionCheck } from "../common/utils/utils"; args .option( @@ -24,13 +25,13 @@ args .option( ["", "tableKeepAliveTimeout"], "Optional. Customize http keep alive timeout for table", - DEFAULT_TABLE_KEEP_ALIVE_TIMEOUT, + DEFAULT_TABLE_KEEP_ALIVE_TIMEOUT ) .option( ["l", "location"], "Optional. Use an existing folder as workspace path, default is current working directory", "", - s => s == "" ? undefined : s + (s) => (s == "" ? undefined : s) ) .option(["s", "silent"], "Optional. Disable access log displayed in console") .option( @@ -104,11 +105,7 @@ export default class TableEnvironment implements ITableEnvironment { } public skipApiVersionCheck(): boolean { - if (this.flags.skipApiVersionCheck !== undefined) { - return true; - } - // default is false which will check API version - return false; + return shouldSkipApiVersionCheck(this.flags); } public disableProductStyleUrl(): boolean { @@ -130,7 +127,9 @@ export default class TableEnvironment implements ITableEnvironment { public inMemoryPersistence(): boolean { if (this.flags.inMemoryPersistence !== undefined) { if (this.flags.location) { - throw new RangeError(`The --inMemoryPersistence option is not supported when the --location option is set.`) + throw new RangeError( + `The --inMemoryPersistence option is not supported when the --location option is set.` + ); } return true; } From 43f15e994e9dc53bb34b514b77b8d87bc2a959ac Mon Sep 17 00:00:00 2001 From: HerrDerb Date: Wed, 18 Mar 2026 11:11:58 +0100 Subject: [PATCH 3/3] Add missing tests --- tests/blob/blobEnvironment.test.ts | 47 ++++++++++++++++++++++++++++ tests/queue/queueEnvironment.test.ts | 47 ++++++++++++++++++++++++++++ tests/table/tableEnvironment.test.ts | 47 ++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+) create mode 100644 tests/blob/blobEnvironment.test.ts create mode 100644 tests/queue/queueEnvironment.test.ts create mode 100644 tests/table/tableEnvironment.test.ts diff --git a/tests/blob/blobEnvironment.test.ts b/tests/blob/blobEnvironment.test.ts new file mode 100644 index 000000000..874bcc470 --- /dev/null +++ b/tests/blob/blobEnvironment.test.ts @@ -0,0 +1,47 @@ +import * as assert from "assert"; + +import BlobEnvironment from "../../src/blob/BlobEnvironment"; + +describe("BlobEnvironment", () => { + const originalArgv = process.argv; + + beforeEach(() => { + process.argv = ["node", "azurite-blob"]; + delete process.env.AZURITE_SKIP_API_VERSION_CHECK; + }); + + afterEach(() => { + process.argv = originalArgv; + delete process.env.AZURITE_SKIP_API_VERSION_CHECK; + }); + + it("defaults skipApiVersionCheck to false @loki", () => { + const env = new BlobEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), false); + }); + + it("returns true when env var AZURITE_SKIP_API_VERSION_CHECK is true @loki", () => { + process.env.AZURITE_SKIP_API_VERSION_CHECK = "true"; + + const env = new BlobEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), true); + }); + + it("returns false when env var AZURITE_SKIP_API_VERSION_CHECK is false @loki", () => { + process.env.AZURITE_SKIP_API_VERSION_CHECK = "false"; + + const env = new BlobEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), false); + }); + + it("returns true when skipApiVersionCheck flag is set @loki", () => { + process.argv.push("--skipApiVersionCheck"); + + const env = new BlobEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), true); + }); +}); diff --git a/tests/queue/queueEnvironment.test.ts b/tests/queue/queueEnvironment.test.ts new file mode 100644 index 000000000..8e096d533 --- /dev/null +++ b/tests/queue/queueEnvironment.test.ts @@ -0,0 +1,47 @@ +import * as assert from "assert"; + +import QueueEnvironment from "../../src/queue/QueueEnvironment"; + +describe("QueueEnvironment", () => { + const originalArgv = process.argv; + + beforeEach(() => { + process.argv = ["node", "azurite-queue"]; + delete process.env.AZURITE_SKIP_API_VERSION_CHECK; + }); + + afterEach(() => { + process.argv = originalArgv; + delete process.env.AZURITE_SKIP_API_VERSION_CHECK; + }); + + it("defaults skipApiVersionCheck to false @loki", () => { + const env = new QueueEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), false); + }); + + it("returns true when env var AZURITE_SKIP_API_VERSION_CHECK is true @loki", () => { + process.env.AZURITE_SKIP_API_VERSION_CHECK = "true"; + + const env = new QueueEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), true); + }); + + it("returns false when env var AZURITE_SKIP_API_VERSION_CHECK is false @loki", () => { + process.env.AZURITE_SKIP_API_VERSION_CHECK = "false"; + + const env = new QueueEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), false); + }); + + it("returns true when skipApiVersionCheck flag is set @loki", () => { + process.argv.push("--skipApiVersionCheck"); + + const env = new QueueEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), true); + }); +}); diff --git a/tests/table/tableEnvironment.test.ts b/tests/table/tableEnvironment.test.ts new file mode 100644 index 000000000..6dd3798ce --- /dev/null +++ b/tests/table/tableEnvironment.test.ts @@ -0,0 +1,47 @@ +import * as assert from "assert"; + +import TableEnvironment from "../../src/table/TableEnvironment"; + +describe("TableEnvironment", () => { + const originalArgv = process.argv; + + beforeEach(() => { + process.argv = ["node", "azurite-table"]; + delete process.env.AZURITE_SKIP_API_VERSION_CHECK; + }); + + afterEach(() => { + process.argv = originalArgv; + delete process.env.AZURITE_SKIP_API_VERSION_CHECK; + }); + + it("defaults skipApiVersionCheck to false @loki", () => { + const env = new TableEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), false); + }); + + it("returns true when env var AZURITE_SKIP_API_VERSION_CHECK is true @loki", () => { + process.env.AZURITE_SKIP_API_VERSION_CHECK = "true"; + + const env = new TableEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), true); + }); + + it("returns false when env var AZURITE_SKIP_API_VERSION_CHECK is false @loki", () => { + process.env.AZURITE_SKIP_API_VERSION_CHECK = "false"; + + const env = new TableEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), false); + }); + + it("returns true when skipApiVersionCheck flag is set @loki", () => { + process.argv.push("--skipApiVersionCheck"); + + const env = new TableEnvironment(); + + assert.strictEqual(env.skipApiVersionCheck(), true); + }); +});