From b12dc798ee4ac67bdb2647afb1dc6d50f8bd3340 Mon Sep 17 00:00:00 2001 From: Juliano Solanho Date: Mon, 17 Nov 2025 00:33:22 -0300 Subject: [PATCH 1/9] Fix mismatched app and test versions elm-test was running tests with indirect dependencies always at latest available version, regardless of whether the app under test had indirect dependencies pinned to an earlier version. This can lead to tests behaving different from real world apps. The reason is elm-solve-deps always picks the first acceptable version given to it in the versions array. This commit fixes the issue by ensuring indirect dependencies' versions are always sorted in this order: - the pinned version first - versions higher than the pinned version, in ascending order - versions lower than the pinned version, in descending order --- lib/DependencyProvider.js | 51 +++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/lib/DependencyProvider.js b/lib/DependencyProvider.js index d432beb6..331b9d7e 100644 --- a/lib/DependencyProvider.js +++ b/lib/DependencyProvider.js @@ -104,10 +104,10 @@ class OnlineAvailableVersionLister { this.onlineCache = onlineCache; } - list(pkg /*: string */) /*: Array */ { + list(pkg /*: string */, indirectDeps /*: undefined | Map*/) /*: Array */ { const memoVersions = this.memoCache.get(pkg); if (memoVersions !== undefined) { - return memoVersions; + return prioritizePinnedIndirectVersion(memoVersions, indirectDeps?.[pkg]); } const offlineVersions = readVersionsInElmHomeAndSort(pkg); const allVersionsSet = new Set(this.onlineCache.getVersions(pkg)); @@ -117,7 +117,7 @@ class OnlineAvailableVersionLister { } const allVersions = [...allVersionsSet].sort(flippedSemverCompare); this.memoCache.set(pkg, allVersions); - return allVersions; + return prioritizePinnedIndirectVersion(allVersions, indirectDeps?.[pkg]); } } @@ -125,16 +125,16 @@ class OfflineAvailableVersionLister { // Memoization cache to avoid doing the same work twice in list. cache /*: Map> */ = new Map(); - list(pkg /*: string */) /*: Array */ { + list(pkg /*: string */, indirectDeps /*: undefined | Map*/) /*: Array */ { const memoVersions = this.cache.get(pkg); if (memoVersions !== undefined) { - return memoVersions; + return prioritizePinnedIndirectVersion(memoVersions, indirectDeps?.[pkg]); } const offlineVersions = readVersionsInElmHomeAndSort(pkg); this.cache.set(pkg, offlineVersions); - return offlineVersions; + return prioritizePinnedIndirectVersion(offlineVersions, indirectDeps?.[pkg]); } } @@ -162,13 +162,14 @@ class DependencyProvider { extra /*: { [string]: string } */ ) /*: string */ { const lister = new OfflineAvailableVersionLister(); + const indirectDeps = JSON.parse(elmJson).dependencies?.indirect; try { return wasm.solve_deps( elmJson, useTest, extra, fetchElmJsonOffline, - (pkg) => lister.list(pkg) + (pkg) => lister.list(pkg, indirectDeps) ); } catch (errorMessage) { throw new Error(errorMessage); @@ -182,13 +183,14 @@ class DependencyProvider { extra /*: { [string]: string } */ ) /*: string */ { const lister = new OnlineAvailableVersionLister(this.cache); + const indirectDeps = JSON.parse(elmJson).dependencies?.indirect; try { return wasm.solve_deps( elmJson, useTest, extra, fetchElmJsonOnline, - (pkg) => lister.list(pkg) + (pkg) => lister.list(pkg, indirectDeps) ); } catch (errorMessage) { throw new Error(errorMessage); @@ -253,6 +255,39 @@ function onlineVersionsFromScratch( // Helper functions ################################################## +/** + * Enforces respecting pinned indirect dependencies. + * + * When Elm apps have pinned indirect versions, e.g.: + * + * "indirect": { + * "elm/virtual-dom": "1.0.3" + * } + * + * We must prioritize these versions for the wasm dependency solver. + * + * Otherwise the wasm solver will take liberties that will result in + * tests running with dependency versions distinct from those used by + * the real live application. + * + * Assumes versions is sorted descending (newest -> oldest). + */ +function prioritizePinnedIndirectVersion( + versions /*: Array */, + pinnedVersion /*: undefined | string */) /*: Array */ { + if (!pinnedVersion || !versions.includes(pinnedVersion)) { + return versions; + } + + // the pinned version and any newer version, in ascending order + const desirableVersions = versions.filter(v => v >= pinnedVersion).reverse(); + + // older versions, in descending order + const olderVersions = versions.filter(v => v < pinnedVersion); + + return desirableVersions.concat(olderVersions); +} + /* Compares two versions so that newer versions appear first when sorting with this function. */ function flippedSemverCompare(a /*: string */, b /*: string */) /*: number */ { return collator.compare(b, a); From 1ec63f90a91890013fe7d943580592d5a64e8bb7 Mon Sep 17 00:00:00 2001 From: Juliano Solanho Date: Mon, 17 Nov 2025 00:33:46 -0300 Subject: [PATCH 2/9] Export the helper function --- lib/DependencyProvider.js | 5 ++++- lib/Generate.js | 2 +- lib/RunTests.js | 2 +- lib/Solve.js | 2 +- lib/elm-test.js | 2 +- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/DependencyProvider.js b/lib/DependencyProvider.js index 331b9d7e..5eaf32fa 100644 --- a/lib/DependencyProvider.js +++ b/lib/DependencyProvider.js @@ -375,4 +375,7 @@ function splitPkgVersion(str /*: string */) /*: { return { pkg: parts[0], version: parts[1] }; } -module.exports = DependencyProvider; +module.exports = { + DependencyProvider, + prioritizePinnedIndirectVersion +}; diff --git a/lib/Generate.js b/lib/Generate.js index 6d87e068..e6aec134 100644 --- a/lib/Generate.js +++ b/lib/Generate.js @@ -3,7 +3,7 @@ const { supportsColor } = require('chalk'); const fs = require('fs'); const path = require('path'); -const DependencyProvider = require('./DependencyProvider.js'); +const { DependencyProvider } = require('./DependencyProvider.js'); const ElmJson = require('./ElmJson'); const Project = require('./Project'); const Report = require('./Report'); diff --git a/lib/RunTests.js b/lib/RunTests.js index e66a1aab..42e34320 100644 --- a/lib/RunTests.js +++ b/lib/RunTests.js @@ -6,7 +6,7 @@ const path = require('path'); const readline = require('readline'); const packageInfo = require('../package.json'); const Compile = require('./Compile'); -const DependencyProvider = require('./DependencyProvider.js'); +const { DependencyProvider } = require('./DependencyProvider.js'); const ElmJson = require('./ElmJson'); const FindTests = require('./FindTests'); const Generate = require('./Generate'); diff --git a/lib/Solve.js b/lib/Solve.js index 5801f801..21a7e397 100644 --- a/lib/Solve.js +++ b/lib/Solve.js @@ -5,7 +5,7 @@ const fs = require('fs'); const path = require('path'); const ElmJson = require('./ElmJson'); const Project = require('./Project'); -const DependencyProvider = require('./DependencyProvider.js'); +const { DependencyProvider } = require('./DependencyProvider.js'); // These value are used _only_ in flow types. 'use' them with the javascript // void operator to keep eslint happy. diff --git a/lib/elm-test.js b/lib/elm-test.js index 854ef1e4..1127b77c 100644 --- a/lib/elm-test.js +++ b/lib/elm-test.js @@ -7,7 +7,7 @@ const path = require('path'); const which = require('which'); const packageInfo = require('../package.json'); const Compile = require('./Compile'); -const DependencyProvider = require('./DependencyProvider.js'); +const { DependencyProvider } = require('./DependencyProvider.js'); const ElmJson = require('./ElmJson'); const FindTests = require('./FindTests'); const Generate = require('./Generate'); From daf5c81abd997a5ca23ef0008520a21b0fdf51d7 Mon Sep 17 00:00:00 2001 From: Juliano Solanho Date: Mon, 17 Nov 2025 00:34:13 -0300 Subject: [PATCH 3/9] Write tests for it --- tests/DependencyProvider.js | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/DependencyProvider.js diff --git a/tests/DependencyProvider.js b/tests/DependencyProvider.js new file mode 100644 index 00000000..335e35ac --- /dev/null +++ b/tests/DependencyProvider.js @@ -0,0 +1,48 @@ +'use strict'; + +const assert = require('assert'); +const { prioritizePinnedIndirectVersion } = require('../lib/DependencyProvider'); + +describe('DependencyProvider', () => { + describe("prioritizePinnedIndirectVersion", () => { + const versions = ["1.0.5", "1.0.4", "1.0.3", "1.0.2", "1.0.1", "1.0.0"]; + + const testPinning = (pinnedVersion, expectedResult) => { + assert.deepStrictEqual( + prioritizePinnedIndirectVersion(versions, pinnedVersion), + expectedResult + ); + }; + + it("retains order when no pinned indirect dependency", () => { + testPinning(undefined, versions); + }); + + it("retains order when pinned version doesn't exist", () => { + testPinning("1.0.6", versions); + }); + + it("retains order if already at latest", () => { + testPinning("1.0.5", versions); + }); + + it("prioritizes a version in the middle, if we're pinned to it", () => { + const expected = [ + // first, try the pinned version + "1.0.3", + // then, try upgrading + "1.0.4", + "1.0.5", + // then, try downgrading + "1.0.2", + "1.0.1", + "1.0.0" + ]; + testPinning("1.0.3", expected); + }); + + it("prioritizes first version, if we're pinned to it", () => { + testPinning("1.0.0", [...versions].sort()); + }); + }); +}); From 03bafe2a5f710fbed39546d53939280d0aa94b72 Mon Sep 17 00:00:00 2001 From: Juliano Solanho Date: Mon, 17 Nov 2025 15:00:11 +0100 Subject: [PATCH 4/9] Appease flow --- lib/DependencyProvider.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/DependencyProvider.js b/lib/DependencyProvider.js index 5eaf32fa..54983785 100644 --- a/lib/DependencyProvider.js +++ b/lib/DependencyProvider.js @@ -104,10 +104,10 @@ class OnlineAvailableVersionLister { this.onlineCache = onlineCache; } - list(pkg /*: string */, indirectDeps /*: undefined | Map*/) /*: Array */ { + list(pkg /*: string */, indirectDeps /*: void | Map*/) /*: Array */ { const memoVersions = this.memoCache.get(pkg); if (memoVersions !== undefined) { - return prioritizePinnedIndirectVersion(memoVersions, indirectDeps?.[pkg]); + return prioritizePinnedIndirectVersion(memoVersions, indirectDeps?.get(pkg)); } const offlineVersions = readVersionsInElmHomeAndSort(pkg); const allVersionsSet = new Set(this.onlineCache.getVersions(pkg)); @@ -117,7 +117,7 @@ class OnlineAvailableVersionLister { } const allVersions = [...allVersionsSet].sort(flippedSemverCompare); this.memoCache.set(pkg, allVersions); - return prioritizePinnedIndirectVersion(allVersions, indirectDeps?.[pkg]); + return prioritizePinnedIndirectVersion(allVersions, indirectDeps?.get(pkg)); } } @@ -125,16 +125,16 @@ class OfflineAvailableVersionLister { // Memoization cache to avoid doing the same work twice in list. cache /*: Map> */ = new Map(); - list(pkg /*: string */, indirectDeps /*: undefined | Map*/) /*: Array */ { + list(pkg /*: string */, indirectDeps /*: void | Map*/) /*: Array */ { const memoVersions = this.cache.get(pkg); if (memoVersions !== undefined) { - return prioritizePinnedIndirectVersion(memoVersions, indirectDeps?.[pkg]); + return prioritizePinnedIndirectVersion(memoVersions, indirectDeps?.get(pkg)); } const offlineVersions = readVersionsInElmHomeAndSort(pkg); this.cache.set(pkg, offlineVersions); - return prioritizePinnedIndirectVersion(offlineVersions, indirectDeps?.[pkg]); + return prioritizePinnedIndirectVersion(offlineVersions, indirectDeps?.get(pkg)); } } @@ -274,8 +274,8 @@ function onlineVersionsFromScratch( */ function prioritizePinnedIndirectVersion( versions /*: Array */, - pinnedVersion /*: undefined | string */) /*: Array */ { - if (!pinnedVersion || !versions.includes(pinnedVersion)) { + pinnedVersion /*: void | string */) /*: Array */ { + if (pinnedVersion === undefined || !versions.includes(pinnedVersion)) { return versions; } From ee8cb82426d9e29f872456141099a59152292b69 Mon Sep 17 00:00:00 2001 From: Juliano Solanho Date: Mon, 17 Nov 2025 15:14:51 +0100 Subject: [PATCH 5/9] prettier --- lib/DependencyProvider.js | 36 +++++++++++++++++++++++++++--------- tests/DependencyProvider.js | 32 +++++++++++++++++--------------- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/lib/DependencyProvider.js b/lib/DependencyProvider.js index 54983785..344198fb 100644 --- a/lib/DependencyProvider.js +++ b/lib/DependencyProvider.js @@ -104,10 +104,16 @@ class OnlineAvailableVersionLister { this.onlineCache = onlineCache; } - list(pkg /*: string */, indirectDeps /*: void | Map*/) /*: Array */ { + list( + pkg /*: string */, + indirectDeps /*: void | Map */ + ) /*: Array */ { const memoVersions = this.memoCache.get(pkg); if (memoVersions !== undefined) { - return prioritizePinnedIndirectVersion(memoVersions, indirectDeps?.get(pkg)); + return prioritizePinnedIndirectVersion( + memoVersions, + indirectDeps?.get(pkg) + ); } const offlineVersions = readVersionsInElmHomeAndSort(pkg); const allVersionsSet = new Set(this.onlineCache.getVersions(pkg)); @@ -125,16 +131,25 @@ class OfflineAvailableVersionLister { // Memoization cache to avoid doing the same work twice in list. cache /*: Map> */ = new Map(); - list(pkg /*: string */, indirectDeps /*: void | Map*/) /*: Array */ { + list( + pkg /*: string */, + indirectDeps /*: void | Map */ + ) /*: Array */ { const memoVersions = this.cache.get(pkg); if (memoVersions !== undefined) { - return prioritizePinnedIndirectVersion(memoVersions, indirectDeps?.get(pkg)); + return prioritizePinnedIndirectVersion( + memoVersions, + indirectDeps?.get(pkg) + ); } const offlineVersions = readVersionsInElmHomeAndSort(pkg); this.cache.set(pkg, offlineVersions); - return prioritizePinnedIndirectVersion(offlineVersions, indirectDeps?.get(pkg)); + return prioritizePinnedIndirectVersion( + offlineVersions, + indirectDeps?.get(pkg) + ); } } @@ -274,16 +289,19 @@ function onlineVersionsFromScratch( */ function prioritizePinnedIndirectVersion( versions /*: Array */, - pinnedVersion /*: void | string */) /*: Array */ { + pinnedVersion /*: void | string */ +) /*: Array */ { if (pinnedVersion === undefined || !versions.includes(pinnedVersion)) { return versions; } // the pinned version and any newer version, in ascending order - const desirableVersions = versions.filter(v => v >= pinnedVersion).reverse(); + const desirableVersions = versions + .filter((v) => v >= pinnedVersion) + .reverse(); // older versions, in descending order - const olderVersions = versions.filter(v => v < pinnedVersion); + const olderVersions = versions.filter((v) => v < pinnedVersion); return desirableVersions.concat(olderVersions); } @@ -377,5 +395,5 @@ function splitPkgVersion(str /*: string */) /*: { module.exports = { DependencyProvider, - prioritizePinnedIndirectVersion + prioritizePinnedIndirectVersion, }; diff --git a/tests/DependencyProvider.js b/tests/DependencyProvider.js index 335e35ac..3ce7f395 100644 --- a/tests/DependencyProvider.js +++ b/tests/DependencyProvider.js @@ -1,11 +1,13 @@ 'use strict'; const assert = require('assert'); -const { prioritizePinnedIndirectVersion } = require('../lib/DependencyProvider'); +const { + prioritizePinnedIndirectVersion, +} = require('../lib/DependencyProvider'); describe('DependencyProvider', () => { - describe("prioritizePinnedIndirectVersion", () => { - const versions = ["1.0.5", "1.0.4", "1.0.3", "1.0.2", "1.0.1", "1.0.0"]; + describe('prioritizePinnedIndirectVersion', () => { + const versions = ['1.0.5', '1.0.4', '1.0.3', '1.0.2', '1.0.1', '1.0.0']; const testPinning = (pinnedVersion, expectedResult) => { assert.deepStrictEqual( @@ -14,35 +16,35 @@ describe('DependencyProvider', () => { ); }; - it("retains order when no pinned indirect dependency", () => { + it('retains order when no pinned indirect dependency', () => { testPinning(undefined, versions); }); it("retains order when pinned version doesn't exist", () => { - testPinning("1.0.6", versions); + testPinning('1.0.6', versions); }); - it("retains order if already at latest", () => { - testPinning("1.0.5", versions); + it('retains order if already at latest', () => { + testPinning('1.0.5', versions); }); it("prioritizes a version in the middle, if we're pinned to it", () => { const expected = [ // first, try the pinned version - "1.0.3", + '1.0.3', // then, try upgrading - "1.0.4", - "1.0.5", + '1.0.4', + '1.0.5', // then, try downgrading - "1.0.2", - "1.0.1", - "1.0.0" + '1.0.2', + '1.0.1', + '1.0.0', ]; - testPinning("1.0.3", expected); + testPinning('1.0.3', expected); }); it("prioritizes first version, if we're pinned to it", () => { - testPinning("1.0.0", [...versions].sort()); + testPinning('1.0.0', [...versions].sort()); }); }); }); From 3d6dbcbdd5e4b87f2d7903b5769086434e309b25 Mon Sep 17 00:00:00 2001 From: Juliano Solanho Date: Mon, 17 Nov 2025 15:54:31 +0100 Subject: [PATCH 6/9] Move fetching pinned version out of lister --- lib/DependencyProvider.js | 43 ++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/lib/DependencyProvider.js b/lib/DependencyProvider.js index 344198fb..99a18acd 100644 --- a/lib/DependencyProvider.js +++ b/lib/DependencyProvider.js @@ -106,14 +106,11 @@ class OnlineAvailableVersionLister { list( pkg /*: string */, - indirectDeps /*: void | Map */ + pinnedVersion /*: void | string */ ) /*: Array */ { const memoVersions = this.memoCache.get(pkg); if (memoVersions !== undefined) { - return prioritizePinnedIndirectVersion( - memoVersions, - indirectDeps?.get(pkg) - ); + return prioritizePinnedIndirectVersion(memoVersions, pinnedVersion); } const offlineVersions = readVersionsInElmHomeAndSort(pkg); const allVersionsSet = new Set(this.onlineCache.getVersions(pkg)); @@ -123,7 +120,7 @@ class OnlineAvailableVersionLister { } const allVersions = [...allVersionsSet].sort(flippedSemverCompare); this.memoCache.set(pkg, allVersions); - return prioritizePinnedIndirectVersion(allVersions, indirectDeps?.get(pkg)); + return prioritizePinnedIndirectVersion(allVersions, pinnedVersion); } } @@ -133,23 +130,17 @@ class OfflineAvailableVersionLister { list( pkg /*: string */, - indirectDeps /*: void | Map */ + pinnedVersion /*: void | string */ ) /*: Array */ { const memoVersions = this.cache.get(pkg); if (memoVersions !== undefined) { - return prioritizePinnedIndirectVersion( - memoVersions, - indirectDeps?.get(pkg) - ); + return prioritizePinnedIndirectVersion(memoVersions, pinnedVersion); } const offlineVersions = readVersionsInElmHomeAndSort(pkg); this.cache.set(pkg, offlineVersions); - return prioritizePinnedIndirectVersion( - offlineVersions, - indirectDeps?.get(pkg) - ); + return prioritizePinnedIndirectVersion(offlineVersions, pinnedVersion); } } @@ -177,14 +168,21 @@ class DependencyProvider { extra /*: { [string]: string } */ ) /*: string */ { const lister = new OfflineAvailableVersionLister(); - const indirectDeps = JSON.parse(elmJson).dependencies?.indirect; + const dependencies = JSON.parse(elmJson).dependencies; + const indirectDeps = + dependencies === undefined ? undefined : dependencies.indirect; + try { return wasm.solve_deps( elmJson, useTest, extra, fetchElmJsonOffline, - (pkg) => lister.list(pkg, indirectDeps) + (pkg) => + lister.list( + pkg, + indirectDeps === undefined ? undefined : indirectDeps[pkg] + ) ); } catch (errorMessage) { throw new Error(errorMessage); @@ -198,14 +196,21 @@ class DependencyProvider { extra /*: { [string]: string } */ ) /*: string */ { const lister = new OnlineAvailableVersionLister(this.cache); - const indirectDeps = JSON.parse(elmJson).dependencies?.indirect; + const dependencies = JSON.parse(elmJson).dependencies; + const indirectDeps = + dependencies === undefined ? undefined : dependencies.indirect; + try { return wasm.solve_deps( elmJson, useTest, extra, fetchElmJsonOnline, - (pkg) => lister.list(pkg, indirectDeps) + (pkg) => + lister.list( + pkg, + indirectDeps === undefined ? undefined : indirectDeps[pkg] + ) ); } catch (errorMessage) { throw new Error(errorMessage); From 255b46e03bb99947cf6ddf4a436a90e65db90946 Mon Sep 17 00:00:00 2001 From: Simon Lydell Date: Mon, 17 Nov 2025 20:59:33 +0100 Subject: [PATCH 7/9] Lazily initialize SyncGetWorker --- lib/DependencyProvider.js | 17 ++++++++++++----- lib/SyncGet.js | 16 ++++++++++++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/lib/DependencyProvider.js b/lib/DependencyProvider.js index 99a18acd..afd1fbcd 100644 --- a/lib/DependencyProvider.js +++ b/lib/DependencyProvider.js @@ -9,8 +9,15 @@ const collator = new Intl.Collator('en', { numeric: true }); // for sorting SemV // Initialization work done only once. wasm.init(); -const syncGetWorker /*: {| get: (string) => string, shutDown: () => void |} */ = - SyncGet.startWorker(); +// Lazily start the worker until needed. +// This is important for the tests, which never exit otherwise. +let syncGetWorker_ /*: void | typeof SyncGet.SyncGetWorker */ = undefined; +function syncGetWorker() /*: typeof SyncGet.SyncGetWorker */ { + if (syncGetWorker_ === undefined) { + syncGetWorker_ = SyncGet.startWorker(); + } + return syncGetWorker_; +} // Cache of existing versions according to the package website. class OnlineVersionsCache { @@ -55,7 +62,7 @@ class OnlineVersionsCache { // Complete cache with a remote call to the package server. const remoteUrl = remotePackagesUrl + '/since/' + (versionsCount - 1); // -1 to check if no package was deleted. - const newVersions = JSON.parse(syncGetWorker.get(remoteUrl)); + const newVersions = JSON.parse(syncGetWorker().get(remoteUrl)); if (newVersions.length === 0) { // Reload from scratch since it means at least one package was deleted from the registry. this.map = onlineVersionsFromScratch(cachePath, remotePackagesUrl); @@ -230,7 +237,7 @@ function fetchElmJsonOnline( // or because there was an error parsing `pkg` and `version`. // In such case, this will throw again with `cacheElmJsonPath()` so it's fine. const remoteUrl = remoteElmJsonUrl(pkg, version); - const elmJson = syncGetWorker.get(remoteUrl); + const elmJson = syncGetWorker().get(remoteUrl); const cachePath = cacheElmJsonPath(pkg, version); const parentDir = path.dirname(cachePath); fs.mkdirSync(parentDir, { recursive: true }); @@ -261,7 +268,7 @@ function onlineVersionsFromScratch( cachePath /*: string */, remotePackagesUrl /*: string */ ) /*: Map> */ { - const onlineVersionsJson = syncGetWorker.get(remotePackagesUrl); + const onlineVersionsJson = syncGetWorker().get(remotePackagesUrl); fs.writeFileSync(cachePath, onlineVersionsJson); const onlineVersions = JSON.parse(onlineVersionsJson); try { diff --git a/lib/SyncGet.js b/lib/SyncGet.js index c8108800..32f5f427 100644 --- a/lib/SyncGet.js +++ b/lib/SyncGet.js @@ -8,12 +8,19 @@ const { // $FlowFixMe[cannot-resolve-module]: Flow doesn’t seem to know about the `worker_threads` module yet. } = require('worker_threads'); -// Start a worker thread and return a `syncGetWorker` -// capable of making sync requests until shut down. -function startWorker() /*: { +// Poor man’s type alias. We can’t use /*:: type SyncGetWorker = ... */ because of: +// https://github.com/prettier/prettier/issues/2597 +const SyncGetWorker /*: { get: (string) => string, shutDown: () => void, -} */ { +} */ = { + get: (string) => string, + shutDown: () => {}, +}; + +// Start a worker thread and return a `syncGetWorker` +// capable of making sync requests until shut down. +function startWorker() /*: typeof SyncGetWorker */ { const { port1: localPort, port2: workerPort } = new MessageChannel(); const sharedLock = new SharedArrayBuffer(4); // $FlowFixMe[incompatible-call]: Flow is wrong and says `sharedLock` is not an accepted parameter here. @@ -41,5 +48,6 @@ function startWorker() /*: { } module.exports = { + SyncGetWorker, startWorker, }; From af9029bc7df83adf5a2130cc05d08969f0650aed Mon Sep 17 00:00:00 2001 From: Simon Lydell Date: Mon, 17 Nov 2025 21:21:57 +0100 Subject: [PATCH 8/9] Temporarily comment out `wasm.init()` to see if macOS CI finishes --- lib/DependencyProvider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/DependencyProvider.js b/lib/DependencyProvider.js index afd1fbcd..66b63c1a 100644 --- a/lib/DependencyProvider.js +++ b/lib/DependencyProvider.js @@ -8,7 +8,7 @@ const SyncGet = require('./SyncGet.js'); const collator = new Intl.Collator('en', { numeric: true }); // for sorting SemVer strings // Initialization work done only once. -wasm.init(); +// wasm.init(); // Lazily start the worker until needed. // This is important for the tests, which never exit otherwise. let syncGetWorker_ /*: void | typeof SyncGet.SyncGetWorker */ = undefined; From e97a9bfbb61342f362a591d2d195ccd528d6623c Mon Sep 17 00:00:00 2001 From: Simon Lydell Date: Mon, 17 Nov 2025 21:51:21 +0100 Subject: [PATCH 9/9] Revert "Temporarily comment out `wasm.init()` to see if macOS CI finishes" This reverts commit af9029bc7df83adf5a2130cc05d08969f0650aed. --- lib/DependencyProvider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/DependencyProvider.js b/lib/DependencyProvider.js index 66b63c1a..afd1fbcd 100644 --- a/lib/DependencyProvider.js +++ b/lib/DependencyProvider.js @@ -8,7 +8,7 @@ const SyncGet = require('./SyncGet.js'); const collator = new Intl.Collator('en', { numeric: true }); // for sorting SemVer strings // Initialization work done only once. -// wasm.init(); +wasm.init(); // Lazily start the worker until needed. // This is important for the tests, which never exit otherwise. let syncGetWorker_ /*: void | typeof SyncGet.SyncGetWorker */ = undefined;