From 4a6767cdd0faaaa28ded2b054493fec5bafdb1a9 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Thu, 29 Oct 2026 16:41:01 +0000 Subject: [PATCH] Rename `xcodeVersion` to `xcodeVersionFromLink` --- lib/entry-points.js | 5 ++- src/platform.test.ts | 103 +++++++++++++++++++++++-------------------- src/platform.ts | 17 ++++++- 3 files changed, 75 insertions(+), 50 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index b2bb9c183..8f903af15 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -183448,7 +183448,7 @@ var XCODE_SELECT_LINK_PATH = "/private/var/db/xcode_select_link"; var XCODE_APP_FILENAME_PATTERN = new RegExp( /(?Xcode_(?\d+(\.\d+)?).*\.app)/ ); -function xcodeVersion(logger2) { +function xcodeVersionFromLink(logger2) { try { const xcodePath = import_fs.default.readlinkSync(XCODE_SELECT_LINK_PATH); if (xcodePath.trim() === "") { @@ -183476,6 +183476,9 @@ function xcodeVersion(logger2) { return void 0; } } +function xcodeVersion(logger2) { + return xcodeVersionFromLink(logger2); +} // src/per-language-bundles.ts var MIN_PER_LANGUAGE_BUNDLE_CLI_VERSION = "2.27.1"; diff --git a/src/platform.test.ts b/src/platform.test.ts index 58c41408e..d84ccb43d 100644 --- a/src/platform.test.ts +++ b/src/platform.test.ts @@ -8,7 +8,7 @@ import { getBundlePlatform, darwinVersion, XCODE_SELECT_LINK_PATH, - xcodeVersion, + xcodeVersionFromLink, } from "./platform"; import { checkExpectedLogMessages, @@ -71,21 +71,24 @@ test("darwinVersion returns semver if parsing succeeds", (t) => { } }); -test.serial("xcodeVersion returns undefined if symlink doesn't exist", (t) => { - const logger = new RecordingLogger(); +test.serial( + "xcodeVersionFromLink returns undefined if symlink doesn't exist", + (t) => { + const logger = new RecordingLogger(); - const readlinkSync = sinon - .stub(fs, "readlinkSync") - .throws(new Error("ENOENT: no such file or directory")); + const readlinkSync = sinon + .stub(fs, "readlinkSync") + .throws(new Error("ENOENT: no such file or directory")); - t.is(xcodeVersion(logger), undefined); - t.is(readlinkSync.callCount, 1); - t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); + t.is(xcodeVersionFromLink(logger), undefined); + t.is(readlinkSync.callCount, 1); + t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); - checkExpectedLogMessages(t, logger.messages, [ - "Unable to determine Xcode version: ENOENT: no such file or directory", - ]); -}); + checkExpectedLogMessages(t, logger.messages, [ + "Unable to determine Xcode version: ENOENT: no such file or directory", + ]); + }, +); test.serial("xcodeVersion returns undefined if file is not a symlink", (t) => { const logger = new RecordingLogger(); @@ -94,7 +97,7 @@ test.serial("xcodeVersion returns undefined if file is not a symlink", (t) => { .stub(fs, "readlinkSync") .throws(new Error("EINVAL: invalid argument")); - t.is(xcodeVersion(logger), undefined); + t.is(xcodeVersionFromLink(logger), undefined); t.is(readlinkSync.callCount, 1); t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); @@ -104,13 +107,13 @@ test.serial("xcodeVersion returns undefined if file is not a symlink", (t) => { }); test.serial( - "xcodeVersion returns undefined if resolving the symlink returns nothing", + "xcodeVersionFromLink returns undefined if resolving the symlink returns nothing", (t) => { const logger = new RecordingLogger(); const readlinkSync = sinon.stub(fs, "readlinkSync").returns(""); - t.is(xcodeVersion(logger), undefined); + t.is(xcodeVersionFromLink(logger), undefined); t.is(readlinkSync.callCount, 1); t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); @@ -121,7 +124,7 @@ test.serial( ); test.serial( - "xcodeVersion returns undefined if resolved path doesn't include pattern", + "xcodeVersionFromLink returns undefined if resolved path doesn't include pattern", (t) => { const logger = new RecordingLogger(); @@ -129,7 +132,7 @@ test.serial( .stub(fs, "readlinkSync") .returns("/Applications/Xcode.app/Contents/Developer"); - t.is(xcodeVersion(logger), undefined); + t.is(xcodeVersionFromLink(logger), undefined); t.is(readlinkSync.callCount, 1); t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); @@ -139,30 +142,33 @@ test.serial( }, ); -test.serial("xcodeVersion returns undefined if match can't be parsed", (t) => { - const logger = new RecordingLogger(); +test.serial( + "xcodeVersionFromLink returns undefined if match can't be parsed", + (t) => { + const logger = new RecordingLogger(); - const readlinkSync = sinon - .stub(fs, "readlinkSync") - .returns("/Applications/Xcode_00.0.app/Contents/Developer"); + const readlinkSync = sinon + .stub(fs, "readlinkSync") + .returns("/Applications/Xcode_00.0.app/Contents/Developer"); - t.is(xcodeVersion(logger), undefined); - t.is(readlinkSync.callCount, 1); - t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); + t.is(xcodeVersionFromLink(logger), undefined); + t.is(readlinkSync.callCount, 1); + t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); - checkExpectedLogMessages(t, logger.messages, [ - "Couldn't parse '00.0' as a semantic version.", - ]); -}); + checkExpectedLogMessages(t, logger.messages, [ + "Couldn't parse '00.0' as a semantic version.", + ]); + }, +); -test.serial("xcodeVersion returns version from resolved path", (t) => { +test.serial("xcodeVersionFromLink returns version from resolved path", (t) => { const logger = new RecordingLogger(); const readlinkSync = sinon .stub(fs, "readlinkSync") .returns("/Applications/Xcode_16.4.app/Contents/Developer"); - const result = xcodeVersion(logger); + const result = xcodeVersionFromLink(logger); if (t.truthy(result)) { t.is(result.major, 16); @@ -173,26 +179,29 @@ test.serial("xcodeVersion returns version from resolved path", (t) => { t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); }); -test.serial("xcodeVersion returns major version from resolved path", (t) => { - const logger = new RecordingLogger(); +test.serial( + "xcodeVersionFromLink returns major version from resolved path", + (t) => { + const logger = new RecordingLogger(); - const readlinkSync = sinon - .stub(fs, "readlinkSync") - .returns("/Applications/Xcode_16.app/Contents/Developer"); + const readlinkSync = sinon + .stub(fs, "readlinkSync") + .returns("/Applications/Xcode_16.app/Contents/Developer"); - const result = xcodeVersion(logger); + const result = xcodeVersionFromLink(logger); - if (t.truthy(result)) { - t.is(result.major, 16); - t.is(result.minor, 0); - } + if (t.truthy(result)) { + t.is(result.major, 16); + t.is(result.minor, 0); + } - t.is(readlinkSync.callCount, 1); - t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); -}); + t.is(readlinkSync.callCount, 1); + t.deepEqual(readlinkSync.args[0], [XCODE_SELECT_LINK_PATH]); + }, +); test.serial( - "xcodeVersion allows more version components in resolved path", + "xcodeVersionFromLink allows more version components in resolved path", (t) => { const logger = new RecordingLogger(); @@ -200,7 +209,7 @@ test.serial( .stub(fs, "readlinkSync") .returns("/Applications/Xcode_16.5.9.app/Contents/Developer"); - const result = xcodeVersion(logger); + const result = xcodeVersionFromLink(logger); if (t.truthy(result)) { t.is(result.major, 16); diff --git a/src/platform.ts b/src/platform.ts index e5c0e6ac6..37cd7fa11 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -68,12 +68,15 @@ export const XCODE_APP_FILENAME_PATTERN = new RegExp( ); /** - * Tries to determine the version of Xcode that is installed. + * Tries to determine the version of Xcode that is installed from the resolved symbolic link + * at {@link XCODE_SELECT_LINK_PATH}. * * @param logger The logger to use. * @returns The Xcode version or `undefined` if it couldn't be determined. */ -export function xcodeVersion(logger: Logger): semver.SemVer | undefined { +export function xcodeVersionFromLink( + logger: Logger, +): semver.SemVer | undefined { try { // Read what the symbolic link points to. This will throw if `XCODE_SELECT_LINK_PATH` does not // exist (`ENOENT`) or is not a symbolic link (`EINVAL`). @@ -109,3 +112,13 @@ export function xcodeVersion(logger: Logger): semver.SemVer | undefined { return undefined; } } + +/** + * Tries to determine the version of Xcode that is installed. + * + * @param logger The logger to use. + * @returns The Xcode version or `undefined` if it couldn't be determined. + */ +export function xcodeVersion(logger: Logger): semver.SemVer | undefined { + return xcodeVersionFromLink(logger); +}