diff --git a/.changeset/orange-dolls-smell.md b/.changeset/orange-dolls-smell.md new file mode 100644 index 0000000000..b63e3ab83b --- /dev/null +++ b/.changeset/orange-dolls-smell.md @@ -0,0 +1,6 @@ +--- +"@sanity/cli-build": major +"@sanity/cli": patch +--- + +Move compareDependencyVersions into cli-build package. This change cleans up an unused export getModuleUrl from cli-build. diff --git a/packages/@sanity/cli-build/src/_exports/_internal/build.ts b/packages/@sanity/cli-build/src/_exports/_internal/build.ts index d00a025ec0..e1acdcc498 100644 --- a/packages/@sanity/cli-build/src/_exports/_internal/build.ts +++ b/packages/@sanity/cli-build/src/_exports/_internal/build.ts @@ -3,13 +3,13 @@ export {buildStaticFiles} from '../../actions/build/buildStaticFiles.js' export {buildStudio} from '../../actions/build/buildStudio.js' export {checkRequiredDependencies} from '../../actions/build/checkRequiredDependencies.js' export {checkStudioDependencyVersions} from '../../actions/build/checkStudioDependencyVersions.js' -export {getModuleUrl} from '../../actions/build/getAutoUpdatesImportMap.js' export {extendViteConfigWithUserConfig, getViteConfig} from '../../actions/build/getViteConfig.js' export {resolveVendorBuildConfig} from '../../actions/build/resolveVendorBuildConfig.js' export {writeSanityRuntime} from '../../actions/build/writeSanityRuntime.js' export {SANITY_CACHE_DIR} from '../../constants.js' -export type { - CompareDependencyVersions, - CompareDependencyVersionsResult, - UnresolvedPrerelease, +export { + compareDependencyVersions, + type CompareDependencyVersions, + type CompareDependencyVersionsResult, + type UnresolvedPrerelease, } from '../../util/compareDependencyVersions.js' diff --git a/packages/@sanity/cli/src/util/__tests__/compareDependencyVersions.test.ts b/packages/@sanity/cli-build/src/util/__tests__/compareDependencyVersions.test.ts similarity index 86% rename from packages/@sanity/cli/src/util/__tests__/compareDependencyVersions.test.ts rename to packages/@sanity/cli-build/src/util/__tests__/compareDependencyVersions.test.ts index 1e6cb0a7e6..66bf38e24e 100644 --- a/packages/@sanity/cli/src/util/__tests__/compareDependencyVersions.test.ts +++ b/packages/@sanity/cli-build/src/util/__tests__/compareDependencyVersions.test.ts @@ -1,9 +1,9 @@ +import {mockRequest} from '@sanity/cli-test/mocks/cli-core/request' import {beforeEach, describe, expect, it, vi} from 'vitest' -import {compareDependencyVersions} from '../compareDependencyVersions' +import {compareDependencyVersions} from '../compareDependencyVersions.js' const mockReadPackageJson = vi.hoisted(() => vi.fn()) -const mockRequest = vi.hoisted(() => vi.fn()) const mockGetLocalPackageVersion = vi.hoisted(() => vi.fn()) vi.mock('@sanity/cli-core', async (importOriginal) => { @@ -15,6 +15,8 @@ vi.mock('@sanity/cli-core', async (importOriginal) => { } }) +vi.mock('@sanity/cli-core/request', async () => import('@sanity/cli-test/mocks/cli-core/request')) + const autoUpdatePackages = [ {name: 'sanity', version: '1.0.0'}, {name: '@sanity/vision', version: '1.0.0'}, @@ -25,18 +27,6 @@ const appAutoUpdatePackages = [ {name: '@sanity/sdk', version: '1.0.0'}, ] -/** Helper to call compareDependencyVersions with the mock requester injected */ -function compare( - packages: {name: string; version: string}[], - workDir: string, - options: {appId?: string} = {}, -) { - return compareDependencyVersions(packages, workDir, { - ...options, - requester: mockRequest as never, - }) -} - describe('compareDependencyVersions', () => { beforeEach(() => { vi.clearAllMocks() @@ -58,7 +48,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(autoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(autoUpdatePackages, '/test/workdir') expect(result.mismatched).toEqual([]) expect(result.unresolvedPrerelease).toEqual([]) @@ -81,7 +71,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(autoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(autoUpdatePackages, '/test/workdir') expect(result.mismatched).toEqual([ { @@ -108,7 +98,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(autoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(autoUpdatePackages, '/test/workdir') expect(result.mismatched).toEqual([ { @@ -141,7 +131,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(autoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(autoUpdatePackages, '/test/workdir') expect(result.mismatched).toEqual([ { @@ -169,7 +159,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(autoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(autoUpdatePackages, '/test/workdir') expect(mockReadPackageJson).toHaveBeenCalledTimes(1) @@ -206,7 +196,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(appAutoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(appAutoUpdatePackages, '/test/workdir') expect(result.mismatched).toEqual([]) expect(result.unresolvedPrerelease).toEqual([]) @@ -229,7 +219,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(appAutoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(appAutoUpdatePackages, '/test/workdir') expect(result.mismatched).toEqual([ { @@ -256,7 +246,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(appAutoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(appAutoUpdatePackages, '/test/workdir') expect(result.mismatched).toEqual([ { @@ -289,7 +279,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(appAutoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(appAutoUpdatePackages, '/test/workdir') expect(result.mismatched).toEqual([ { @@ -322,7 +312,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(appAutoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(appAutoUpdatePackages, '/test/workdir') expect(mockReadPackageJson).toHaveBeenCalledTimes(1) @@ -351,9 +341,9 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - await expect(compare([{name: 'sanity', version: '3.40.0'}], '/test/workdir')).rejects.toThrow( - /Failed to fetch remote version for .+: getaddrinfo ENOTFOUND/, - ) + await expect( + compareDependencyVersions([{name: 'sanity', version: '3.40.0'}], '/test/workdir'), + ).rejects.toThrow(/Failed to fetch remote version for .+: getaddrinfo ENOTFOUND/) }) it("should throw when response is missing the 'x-resolved-version' header", async () => { @@ -368,9 +358,9 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - await expect(compare([{name: 'sanity', version: '3.40.0'}], '/test/workdir')).rejects.toThrow( - "Missing 'x-resolved-version' header", - ) + await expect( + compareDependencyVersions([{name: 'sanity', version: '3.40.0'}], '/test/workdir'), + ).rejects.toThrow("Missing 'x-resolved-version' header") }) it('should throw when response has an unexpected HTTP status code', async () => { @@ -386,9 +376,9 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - await expect(compare([{name: 'sanity', version: '3.40.0'}], '/test/workdir')).rejects.toThrow( - 'Unexpected HTTP response: 500 Internal Server Error', - ) + await expect( + compareDependencyVersions([{name: 'sanity', version: '3.40.0'}], '/test/workdir'), + ).rejects.toThrow('Unexpected HTTP response: 500 Internal Server Error') }) }) @@ -409,7 +399,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(autoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(autoUpdatePackages, '/test/workdir') // Only sanity should be checked, @sanity/vision should be skipped entirely expect(mockRequest).toHaveBeenCalledTimes(1) @@ -433,7 +423,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare(autoUpdatePackages, '/test/workdir') + const result = await compareDependencyVersions(autoUpdatePackages, '/test/workdir') expect(result.mismatched).toEqual([ { @@ -460,9 +450,9 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - await expect(compare([{name: 'sanity', version: '3.40.0'}], '/test/workdir')).rejects.toThrow( - 'Failed to parse installed version for sanity', - ) + await expect( + compareDependencyVersions([{name: 'sanity', version: '3.40.0'}], '/test/workdir'), + ).rejects.toThrow('Failed to parse installed version for sanity') }) }) @@ -480,7 +470,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - await compare([{name: 'sanity', version: '3.40.0'}], '/test/workdir') + await compareDependencyVersions([{name: 'sanity', version: '3.40.0'}], '/test/workdir') const url = mockRequest.mock.calls[0][0].url as string expect(url).toContain('/v1/modules/sanity/default/') @@ -500,7 +490,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - await compare([{name: 'sanity', version: '3.40.0'}], '/test/workdir', { + await compareDependencyVersions([{name: 'sanity', version: '3.40.0'}], '/test/workdir', { appId: 'my-app-id', }) @@ -524,7 +514,10 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare([{name: 'sanity', version: '5.11.1-alpha.14'}], '/test/workdir') + const result = await compareDependencyVersions( + [{name: 'sanity', version: '5.11.1-alpha.14'}], + '/test/workdir', + ) expect(result.mismatched).toEqual([]) expect(result.unresolvedPrerelease).toEqual([{pkg: 'sanity', version: '5.11.1-alpha.14'}]) @@ -543,9 +536,9 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - await expect(compare([{name: 'sanity', version: '3.40.0'}], '/test/workdir')).rejects.toThrow( - 'Failed to resolve remote version for sanity@3.40.0: package not found', - ) + await expect( + compareDependencyVersions([{name: 'sanity', version: '3.40.0'}], '/test/workdir'), + ).rejects.toThrow('Failed to resolve remote version for sanity@3.40.0: package not found') }) it('should correctly split resolvable and prerelease packages', async () => { @@ -573,7 +566,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare( + const result = await compareDependencyVersions( [ {name: 'sanity', version: '5.11.1-alpha.14'}, {name: '@sanity/vision', version: '3.40.0'}, @@ -607,7 +600,7 @@ describe('compareDependencyVersions', () => { version: '0.0.0', }) - const result = await compare( + const result = await compareDependencyVersions( [ {name: 'sanity', version: '5.11.1-alpha.14'}, {name: '@sanity/vision', version: '5.11.1-beta.1'}, diff --git a/packages/@sanity/cli-build/src/util/compareDependencyVersions.d.ts b/packages/@sanity/cli-build/src/util/compareDependencyVersions.d.ts deleted file mode 100644 index c64f196d03..0000000000 --- a/packages/@sanity/cli-build/src/util/compareDependencyVersions.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface CompareDependencyVersions { - installed: string - pkg: string - remote: string -} - -export interface UnresolvedPrerelease { - pkg: string - version: string -} - -export interface CompareDependencyVersionsResult { - mismatched: Array - unresolvedPrerelease: Array -} diff --git a/packages/@sanity/cli/src/util/compareDependencyVersions.ts b/packages/@sanity/cli-build/src/util/compareDependencyVersions.ts similarity index 87% rename from packages/@sanity/cli/src/util/compareDependencyVersions.ts rename to packages/@sanity/cli-build/src/util/compareDependencyVersions.ts index 6d50dd621f..71f66b65c3 100644 --- a/packages/@sanity/cli/src/util/compareDependencyVersions.ts +++ b/packages/@sanity/cli-build/src/util/compareDependencyVersions.ts @@ -1,15 +1,27 @@ import path from 'node:path' -import { - type CompareDependencyVersions, - type CompareDependencyVersionsResult, - getModuleUrl, - type UnresolvedPrerelease, -} from '@sanity/cli-build/_internal/build' import {getLocalPackageVersion, readPackageJson} from '@sanity/cli-core' import {createRequester} from '@sanity/cli-core/request' import {coerce, eq, prerelease, parse as semverParse} from 'semver' +import {getModuleUrl} from '../actions/build/getAutoUpdatesImportMap.js' + +export interface CompareDependencyVersions { + installed: string + pkg: string + remote: string +} + +export interface UnresolvedPrerelease { + pkg: string + version: string +} + +export interface CompareDependencyVersionsResult { + mismatched: Array + unresolvedPrerelease: Array +} + const defaultRequester = createRequester({ middleware: {httpErrors: false, promise: {onlyBody: false}}, }) @@ -17,8 +29,6 @@ const defaultRequester = createRequester({ interface CompareDependencyVersionsOptions { /** When provided, uses the app-specific module endpoint instead of the default endpoint. */ appId?: string - /** Optional requester for dependency injection (primarily for testing). */ - requester?: typeof defaultRequester } /** @@ -46,7 +56,7 @@ interface CompareDependencyVersionsOptions { export async function compareDependencyVersions( packages: {name: string; version: string}[], workDir: string, - {appId, requester = defaultRequester}: CompareDependencyVersionsOptions = {}, + {appId}: CompareDependencyVersionsOptions = {}, ): Promise { const manifest = await readPackageJson(path.join(workDir, 'package.json'), { skipSchemaValidation: true, @@ -62,7 +72,7 @@ export async function compareDependencyVersions( continue } - const resolvedVersion = await getRemoteResolvedVersion(getModuleUrl(pkg, {appId}), requester) + const resolvedVersion = await getRemoteResolvedVersion(getModuleUrl(pkg, {appId})) if (resolvedVersion === null) { if (prerelease(pkg.version)) { @@ -96,13 +106,10 @@ export async function compareDependencyVersions( return {mismatched, unresolvedPrerelease} } -async function getRemoteResolvedVersion( - url: string, - request: typeof defaultRequester, -): Promise { +async function getRemoteResolvedVersion(url: string): Promise { let response try { - response = await request({ + response = await defaultRequester({ maxRedirects: 0, method: 'HEAD', url, diff --git a/packages/@sanity/cli/src/actions/build/__tests__/buildApp.appIdWarning.test.ts b/packages/@sanity/cli/src/actions/build/__tests__/buildApp.appIdWarning.test.ts index 8c05f15e72..72d69485a5 100644 --- a/packages/@sanity/cli/src/actions/build/__tests__/buildApp.appIdWarning.test.ts +++ b/packages/@sanity/cli/src/actions/build/__tests__/buildApp.appIdWarning.test.ts @@ -21,45 +21,25 @@ const FLAGS = { // Mock heavy dependencies to isolate appId warning logic // Paths are relative to the test file location (__tests__/) -vi.mock('../../../util/warnAboutMissingAppId.js', () => ({ +vi.mock(import('../../../util/warnAboutMissingAppId.js'), () => ({ warnAboutMissingAppId: mockWarnAboutMissingAppId, })) -vi.mock('../../../util/appId.js', () => ({ +vi.mock(import('../../../util/appId.js'), () => ({ getAppId: mockGetAppId, })) -vi.mock('../../../util/compareDependencyVersions.js', () => ({ - compareDependencyVersions: vi.fn().mockResolvedValue({mismatched: [], unresolvedPrerelease: []}), -})) - -vi.mock('@sanity/cli-build/_internal/build', async (importOriginal) => { - const actual = await importOriginal() +vi.mock(import('@sanity/cli-build/_internal/build'), async (importOriginal) => { + const actual = await importOriginal() return { ...actual, buildApp: mockedBuildApp, + compareDependencyVersions: vi + .fn() + .mockResolvedValue({mismatched: [], unresolvedPrerelease: []}), } }) -vi.mock('@sanity/cli-core', async (importOriginal) => { - const actual = await importOriginal() - return { - ...actual, - getCliTelemetry: vi.fn().mockReturnValue({ - trace: vi.fn().mockReturnValue({complete: vi.fn(), log: vi.fn(), start: vi.fn()}), - }), - getLocalPackageVersion: vi.fn().mockResolvedValue('1.0.0'), - getTimer: vi.fn().mockReturnValue({end: vi.fn().mockReturnValue(0), start: vi.fn()}), - isInteractive: vi.fn().mockReturnValue(false), - } -}) - -vi.mock('@sanity/cli-core/ux', () => ({ - confirm: vi.fn(), - logSymbols: {info: 'i', warning: '!'}, - spinner: vi.fn(() => ({fail: vi.fn(), start: vi.fn().mockReturnThis(), succeed: vi.fn()})), -})) - // Import after mocks are set up const {buildApp} = await import('../buildApp.js') diff --git a/packages/@sanity/cli/src/actions/build/__tests__/buildStudio.appIdWarning.test.ts b/packages/@sanity/cli/src/actions/build/__tests__/buildStudio.appIdWarning.test.ts index e392355927..1943753131 100644 --- a/packages/@sanity/cli/src/actions/build/__tests__/buildStudio.appIdWarning.test.ts +++ b/packages/@sanity/cli/src/actions/build/__tests__/buildStudio.appIdWarning.test.ts @@ -3,7 +3,6 @@ import {afterEach, describe, expect, test, vi} from 'vitest' const mockWarnAboutMissingAppId = vi.hoisted(() => vi.fn()) const mockGetAppId = vi.hoisted(() => vi.fn()) -const mockGetLocalPackageVersion = vi.hoisted(() => vi.fn()) const mockBuildStudio = vi.hoisted(() => vi.fn().mockImplementation((options) => { options.checkAppId() @@ -22,46 +21,25 @@ const FLAGS = { // Mock heavy dependencies to isolate appId warning logic // Paths are relative to the test file location (__tests__/) -vi.mock('../../../util/warnAboutMissingAppId.js', () => ({ +vi.mock(import('../../../util/warnAboutMissingAppId.js'), () => ({ warnAboutMissingAppId: mockWarnAboutMissingAppId, })) -vi.mock('../../../util/appId.js', () => ({ +vi.mock(import('../../../util/appId.js'), () => ({ getAppId: mockGetAppId, })) -vi.mock('../../../util/compareDependencyVersions.js', () => ({ - compareDependencyVersions: vi.fn().mockResolvedValue({mismatched: [], unresolvedPrerelease: []}), -})) - -vi.mock('@sanity/cli-build/_internal/build', async (importOriginal) => { - const actual = await importOriginal() +vi.mock(import('@sanity/cli-build/_internal/build'), async (importOriginal) => { + const actual = await importOriginal() return { ...actual, buildStudio: mockBuildStudio, + compareDependencyVersions: vi + .fn() + .mockResolvedValue({mismatched: [], unresolvedPrerelease: []}), } }) -vi.mock('@sanity/cli-core', async (importOriginal) => { - const actual = await importOriginal() - return { - ...actual, - getCliTelemetry: vi.fn().mockReturnValue({ - trace: vi.fn().mockReturnValue({complete: vi.fn(), log: vi.fn(), start: vi.fn()}), - }), - getLocalPackageVersion: mockGetLocalPackageVersion, - getTimer: vi.fn().mockReturnValue({end: vi.fn().mockReturnValue(0), start: vi.fn()}), - isInteractive: vi.fn().mockReturnValue(false), - } -}) - -vi.mock('@sanity/cli-core/ux', () => ({ - confirm: vi.fn(), - logSymbols: {info: 'i', warning: '!'}, - select: vi.fn(), - spinner: vi.fn(() => ({fail: vi.fn(), start: vi.fn().mockReturnThis(), succeed: vi.fn()})), -})) - // Import after mocks are set up const {buildStudio} = await import('../buildStudio.js') diff --git a/packages/@sanity/cli/src/actions/build/buildApp.ts b/packages/@sanity/cli/src/actions/build/buildApp.ts index 79dfbc7fcc..3c322196d0 100644 --- a/packages/@sanity/cli/src/actions/build/buildApp.ts +++ b/packages/@sanity/cli/src/actions/build/buildApp.ts @@ -1,8 +1,10 @@ -import {buildApp as internalBuildApp} from '@sanity/cli-build/_internal/build' +import { + compareDependencyVersions, + buildApp as internalBuildApp, +} from '@sanity/cli-build/_internal/build' import {resolveWorkbenchApp} from '@sanity/workbench-cli/build' import {getAppId} from '../../util/appId.js' -import {compareDependencyVersions} from '../../util/compareDependencyVersions.js' import {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js' import {determineBasePath} from './determineBasePath.js' import {type BuildOptions} from './types.js' diff --git a/packages/@sanity/cli/src/actions/build/buildStudio.ts b/packages/@sanity/cli/src/actions/build/buildStudio.ts index d3fcadaa9d..b6357bf2e5 100644 --- a/packages/@sanity/cli/src/actions/build/buildStudio.ts +++ b/packages/@sanity/cli/src/actions/build/buildStudio.ts @@ -1,8 +1,10 @@ -import {buildStudio as internalBuildStudio} from '@sanity/cli-build/_internal/build' +import { + compareDependencyVersions, + buildStudio as internalBuildStudio, +} from '@sanity/cli-build/_internal/build' import {resolveWorkbenchApp} from '@sanity/workbench-cli/build' import {getAppId} from '../../util/appId.js' -import {compareDependencyVersions} from '../../util/compareDependencyVersions.js' import {determineIsApp} from '../../util/determineIsApp.js' import {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js' import {upgradePackages} from '../../util/packageManager/upgradePackages.js' diff --git a/packages/@sanity/cli/src/actions/dev/servers/__tests__/startStudioDevServer.test.ts b/packages/@sanity/cli/src/actions/dev/servers/__tests__/startStudioDevServer.test.ts index 0c8a06102a..043c6c54b4 100644 --- a/packages/@sanity/cli/src/actions/dev/servers/__tests__/startStudioDevServer.test.ts +++ b/packages/@sanity/cli/src/actions/dev/servers/__tests__/startStudioDevServer.test.ts @@ -42,13 +42,11 @@ vi.mock('../getDashboardAppUrl.js', () => ({ vi.mock('@sanity/cli-build/_internal/build', () => ({ checkRequiredDependencies: mockCheckRequiredDependencies, checkStudioDependencyVersions: mockCheckStudioDependencyVersions, + compareDependencyVersions: mockCompareDependencyVersions, })) vi.mock('../../../build/shouldAutoUpdate.js', () => ({ shouldAutoUpdate: mockShouldAutoUpdate, })) -vi.mock('../../../../util/compareDependencyVersions.js', () => ({ - compareDependencyVersions: mockCompareDependencyVersions, -})) vi.mock('../../../../util/appId.js', () => ({ getAppId: mockGetAppId, })) diff --git a/packages/@sanity/cli/src/actions/dev/servers/startStudioDevServer.ts b/packages/@sanity/cli/src/actions/dev/servers/startStudioDevServer.ts index 9cb2e1648a..f2ac83d28d 100644 --- a/packages/@sanity/cli/src/actions/dev/servers/startStudioDevServer.ts +++ b/packages/@sanity/cli/src/actions/dev/servers/startStudioDevServer.ts @@ -3,6 +3,7 @@ import {styleText} from 'node:util' import { checkRequiredDependencies, checkStudioDependencyVersions, + compareDependencyVersions, } from '@sanity/cli-build/_internal/build' import {getLocalPackageVersion, isInteractive} from '@sanity/cli-core' import {confirm, logSymbols, spinner} from '@sanity/cli-core/ux' @@ -13,7 +14,6 @@ import {startDevServer} from '../../../server/devServer.js' import {gracefulServerDeath} from '../../../server/gracefulServerDeath.js' import {getProjectById} from '../../../services/projects.js' import {getAppId} from '../../../util/appId.js' -import {compareDependencyVersions} from '../../../util/compareDependencyVersions.js' import {getPackageManagerChoice} from '../../../util/packageManager/packageManagerChoice.js' import {upgradePackages} from '../../../util/packageManager/upgradePackages.js' import {shouldAutoUpdate} from '../../build/shouldAutoUpdate.js' diff --git a/packages/@sanity/cli/test/integration/commands/build.app.test.ts b/packages/@sanity/cli/test/integration/commands/build.app.test.ts index 4acc37a06a..846041cb81 100644 --- a/packages/@sanity/cli/test/integration/commands/build.app.test.ts +++ b/packages/@sanity/cli/test/integration/commands/build.app.test.ts @@ -12,8 +12,16 @@ const mockedSelect = vi.hoisted(() => vi.fn()) const mockedCompareDependencyVersions = vi.hoisted(() => vi.fn()) const mockedIsInteractive = vi.hoisted(() => vi.fn(() => true)) -vi.mock('@sanity/cli-core/ux', async (importOriginal) => { - const original = await importOriginal() +vi.mock(import('@sanity/cli-build/_internal/build'), async (importOriginal) => { + const original = await importOriginal() + return { + ...original, + compareDependencyVersions: mockedCompareDependencyVersions, + } +}) + +vi.mock(import('@sanity/cli-core/ux'), async (importOriginal) => { + const original = await importOriginal() return { ...original, confirm: mockedConfirm, @@ -21,12 +29,8 @@ vi.mock('@sanity/cli-core/ux', async (importOriginal) => { } }) -vi.mock('../../../src/util/compareDependencyVersions.js', () => ({ - compareDependencyVersions: mockedCompareDependencyVersions, -})) - -vi.mock('@sanity/cli-core', async (importOriginal) => { - const original = await importOriginal() +vi.mock(import('@sanity/cli-core'), async (importOriginal) => { + const original = await importOriginal() return { ...original, isInteractive: mockedIsInteractive, diff --git a/packages/@sanity/cli/test/integration/commands/build.studio.test.ts b/packages/@sanity/cli/test/integration/commands/build.studio.test.ts index 710429e80e..513f4e5325 100644 --- a/packages/@sanity/cli/test/integration/commands/build.studio.test.ts +++ b/packages/@sanity/cli/test/integration/commands/build.studio.test.ts @@ -14,16 +14,24 @@ const mockedCompareDependencyVersions = vi.hoisted(() => vi.fn()) const mockedUpgradePackages = vi.hoisted(() => vi.fn()) const mockedIsInteractive = vi.hoisted(() => vi.fn()) -vi.mock('@sanity/cli-core', async (importOriginal) => { - const original = await importOriginal() +vi.mock(import('@sanity/cli-build/_internal/build'), async (importOriginal) => { + const original = await importOriginal() + return { + ...original, + compareDependencyVersions: mockedCompareDependencyVersions, + } +}) + +vi.mock(import('@sanity/cli-core'), async (importOriginal) => { + const original = await importOriginal() return { ...original, isInteractive: mockedIsInteractive, } }) -vi.mock('@sanity/cli-core/ux', async (importOriginal) => { - const original = await importOriginal() +vi.mock(import('@sanity/cli-core/ux'), async (importOriginal) => { + const original = await importOriginal() return { ...original, confirm: mockedConfirm, @@ -31,11 +39,7 @@ vi.mock('@sanity/cli-core/ux', async (importOriginal) => { } }) -vi.mock('../../../src/util/compareDependencyVersions.js', () => ({ - compareDependencyVersions: mockedCompareDependencyVersions, -})) - -vi.mock('../../../src/util/packageManager/upgradePackages.js', () => ({ +vi.mock(import('../../../src/util/packageManager/upgradePackages.js'), () => ({ upgradePackages: mockedUpgradePackages, })) diff --git a/packages/@sanity/cli/test/integration/commands/dev.test.ts b/packages/@sanity/cli/test/integration/commands/dev.test.ts index bd826ff5d4..3ded360354 100644 --- a/packages/@sanity/cli/test/integration/commands/dev.test.ts +++ b/packages/@sanity/cli/test/integration/commands/dev.test.ts @@ -3,14 +3,16 @@ import {createServer} from 'node:http' import {platform} from 'node:os' import {join} from 'node:path' -import {checkRequiredDependencies} from '@sanity/cli-build/_internal/build' +import { + checkRequiredDependencies, + compareDependencyVersions, +} from '@sanity/cli-build/_internal/build' import {getProjectCliClient} from '@sanity/cli-core' -import {confirm} from '@sanity/cli-core/ux' import {testCommand, testFixture} from '@sanity/cli-test' +import {confirm as mockConfirm, spinner as mockSpinner} from '@sanity/cli-test/mocks/cli-core/ux' import {afterEach, describe, expect, test, vi} from 'vitest' import {DevCommand} from '../../../src/commands/dev.js' -import {compareDependencyVersions} from '../../../src/util/compareDependencyVersions.js' import {getPackageManagerChoice} from '../../../src/util/packageManager/packageManagerChoice.js' import {upgradePackages} from '../../../src/util/packageManager/upgradePackages.js' import {closeServer, tryCloseServer} from '../../testUtils.js' @@ -20,39 +22,30 @@ const mockGetDashboardAppURL = vi.hoisted(() => vi.fn().mockResolvedValue('https://www.sanity.io/@test-org?dev=http%3A%2F%2Flocalhost%3A5340'), ) -vi.mock('../../../src/actions/dev/servers/getDashboardAppUrl.js', () => ({ +vi.mock(import('../../../src/actions/dev/servers/getDashboardAppUrl.js'), () => ({ getDashboardAppURL: mockGetDashboardAppURL, })) -vi.mock('../../../src/util/compareDependencyVersions.js', () => ({ - compareDependencyVersions: vi.fn().mockResolvedValue({mismatched: [], unresolvedPrerelease: []}), -})) - -vi.mock('../../../src/server/vite/plugin-typegen.js', () => ({ +vi.mock(import('../../../src/server/vite/plugin-typegen.js'), () => ({ sanityTypegenPlugin: mockTypegenPlugin.mockReturnValue({ name: 'sanity/typegen', }), })) -vi.mock('@sanity/cli-build/_internal/build', async () => { - const actual = await vi.importActual( - '@sanity/cli-build/_internal/build', - ) +vi.mock(import('@sanity/cli-build/_internal/build'), async () => { + const actual = await vi.importActual('@sanity/cli-build/_internal/build') return { ...actual, checkRequiredDependencies: vi.fn().mockResolvedValue({ installedSanityVersion: '3.0.0', }), + compareDependencyVersions: vi + .fn() + .mockResolvedValue({mismatched: [], unresolvedPrerelease: []}), } }) -vi.mock('@sanity/cli-core/ux', async () => { - const actual = await vi.importActual('@sanity/cli-core/ux') - return { - ...actual, - confirm: vi.fn(), - } -}) +vi.mock('@sanity/cli-core/ux', async () => import('@sanity/cli-test/mocks/cli-core/ux')) vi.mock('../../../src/util/packageManager/upgradePackages.js') vi.mock('../../../src/util/packageManager/packageManagerChoice.js') @@ -68,7 +61,6 @@ vi.mock('@sanity/cli-core', async () => { const mockCheckRequiredDependencies = vi.mocked(checkRequiredDependencies) const mockCompareDependencyVersions = vi.mocked(compareDependencyVersions) -const mockConfirm = vi.mocked(confirm) const mockUpgradePackages = vi.mocked(upgradePackages) const mockGetPackageManagerChoice = vi.mocked(getPackageManagerChoice) const mockGetProjectCliClient = vi.mocked(getProjectCliClient) @@ -84,7 +76,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { const cwd = await testFixture('basic-app') process.cwd = () => cwd - const {error, result, stderr, stdout} = await testCommand(DevCommand, ['--port', '5333'], { + const {error, result, stdout} = await testCommand(DevCommand, ['--port', '5333'], { config: {root: cwd}, mocks: {isInteractive: true}, }) @@ -92,7 +84,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { if (error) throw error expect(stdout).toContain('Dev server started on port 5333') expect(stdout).toContain('View your app in the Sanity dashboard here:') - expect(stderr).toContain('Checking configuration files') + expect(mockSpinner).toHaveBeenCalledWith('Checking configuration files...') await tryCloseServer(result) expect(mockTypegenPlugin).not.toHaveBeenCalled() @@ -116,7 +108,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { ) await writeFile(configPath, modifiedConfig) - const {error, result, stderr, stdout} = await testCommand(DevCommand, ['--port', '5333'], { + const {error, result, stdout} = await testCommand(DevCommand, ['--port', '5333'], { config: {root: cwd}, mocks: {isInteractive: true}, }) @@ -124,7 +116,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { if (error) throw error expect(stdout).toContain('Dev server started on port 5333') expect(stdout).toContain('View your app in the Sanity dashboard here:') - expect(stderr).toContain('Checking configuration files') + expect(mockSpinner).toHaveBeenCalledWith('Checking configuration files...') await tryCloseServer(result) expect(mockTypegenPlugin).toHaveBeenCalledWith({ @@ -229,7 +221,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { const cwd = await testFixture('basic-studio') process.cwd = () => cwd - const {error, result, stderr, stdout} = await testCommand(DevCommand, ['--port', '5335'], { + const {error, result, stdout} = await testCommand(DevCommand, ['--port', '5335'], { config: {root: cwd}, mocks: {isInteractive: true}, }) @@ -240,7 +232,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { expect(stdout).toMatch(/vite@\d+\.\d+/) expect(stdout).toContain('ready in') expect(stdout).toContain('ms and running at http://localhost:5335') - expect(stderr).toContain('Checking configuration files') + expect(mockSpinner).toHaveBeenCalledWith('Checking configuration files...') await tryCloseServer(result) }) @@ -284,7 +276,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { }, } as never) - const {error, result, stderr, stdout} = await testCommand( + const {error, result, stdout} = await testCommand( DevCommand, ['--load-in-dashboard', '--port', '5340'], { @@ -297,7 +289,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { expect(stdout).toContain('Dev server started on port 5340') expect(stdout).toContain('View your studio in the Sanity dashboard here:') expect(stdout).toContain('https://www.sanity.io/@test-org?dev=http%3A%2F%2Flocalhost%3A5340') - expect(stderr).toContain('Checking configuration files') + expect(mockSpinner).toHaveBeenCalledWith('Checking configuration files...') await tryCloseServer(result) }) @@ -364,7 +356,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { }) mockConfirm.mockResolvedValueOnce(false) // User declines upgrade - const {error, result, stderr, stdout} = await testCommand( + const {error, result, stdout} = await testCommand( DevCommand, ['--auto-updates', '--port', '5346'], { @@ -375,7 +367,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { if (error) throw error // Check that the server started successfully with auto-updates flag expect(stdout).toMatch(/running at http:\/\/localhost:5346/) - expect(stderr).toContain('Checking configuration files') + expect(mockSpinner).toHaveBeenCalledWith('Checking configuration files...') await tryCloseServer(result) }) @@ -401,7 +393,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { mostOptimal: 'npm', }) - const {error, result, stderr, stdout} = await testCommand( + const {error, result, stdout} = await testCommand( DevCommand, ['--auto-updates', '--port', '5348'], { @@ -412,7 +404,7 @@ describe('#dev', {timeout: (platform() === 'win32' ? 60 : 30) * 1000}, () => { if (error) throw error expect(stdout).toMatch(/running at http:\/\/localhost:5348/) - expect(stderr).toContain('Checking configuration files') + expect(mockSpinner).toHaveBeenCalledWith('Checking configuration files...') expect(mockUpgradePackages).toHaveBeenCalledWith( { diff --git a/packages/@sanity/cli/test/integration/util/compareDependencyVersions.integration.test.ts b/packages/@sanity/cli/test/integration/util/compareDependencyVersions.integration.test.ts index 11471742b0..f08a63df30 100644 --- a/packages/@sanity/cli/test/integration/util/compareDependencyVersions.integration.test.ts +++ b/packages/@sanity/cli/test/integration/util/compareDependencyVersions.integration.test.ts @@ -2,11 +2,10 @@ import {mkdtemp, rm, writeFile} from 'node:fs/promises' import {tmpdir} from 'node:os' import path from 'node:path' +import {compareDependencyVersions} from '@sanity/cli-build/_internal/build' import {gt, valid} from 'semver' import {afterAll, beforeAll, describe, expect, it} from 'vitest' -import {compareDependencyVersions} from '../../../src/util/compareDependencyVersions.js' - describe('compareDependencyVersions (integration)', {timeout: 30_000}, () => { let workDir: string