@sanity/cli 6.5.0 → 6.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +190 -98
  2. package/dist/actions/build/buildApp.js +35 -14
  3. package/dist/actions/build/buildApp.js.map +1 -1
  4. package/dist/actions/build/buildStudio.js +54 -26
  5. package/dist/actions/build/buildStudio.js.map +1 -1
  6. package/dist/actions/build/buildVendorDependencies.js +3 -2
  7. package/dist/actions/build/buildVendorDependencies.js.map +1 -1
  8. package/dist/actions/build/checkRequiredDependencies.js +2 -5
  9. package/dist/actions/build/checkRequiredDependencies.js.map +1 -1
  10. package/dist/actions/build/checkStudioDependencyVersions.js +1 -2
  11. package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -1
  12. package/dist/actions/build/getViteConfig.js +2 -1
  13. package/dist/actions/build/getViteConfig.js.map +1 -1
  14. package/dist/actions/codemods/reactIconsV3.js +1 -1
  15. package/dist/actions/codemods/reactIconsV3.js.map +1 -1
  16. package/dist/actions/deploy/deployApp.js +1 -1
  17. package/dist/actions/deploy/deployApp.js.map +1 -1
  18. package/dist/actions/deploy/deployStudio.js +1 -2
  19. package/dist/actions/deploy/deployStudio.js.map +1 -1
  20. package/dist/actions/dev/startStudioDevServer.js +1 -2
  21. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  22. package/dist/actions/manifest/extractAppManifest.js +3 -2
  23. package/dist/actions/manifest/extractAppManifest.js.map +1 -1
  24. package/dist/actions/manifest/types.js +9 -0
  25. package/dist/actions/manifest/types.js.map +1 -1
  26. package/dist/actions/manifest/writeManifestFile.js +1 -2
  27. package/dist/actions/manifest/writeManifestFile.js.map +1 -1
  28. package/dist/actions/schema/uploadSchemaToLexicon.js +1 -2
  29. package/dist/actions/schema/uploadSchemaToLexicon.js.map +1 -1
  30. package/dist/actions/versions/buildPackageArray.js +1 -1
  31. package/dist/actions/versions/buildPackageArray.js.map +1 -1
  32. package/dist/constants.js +8 -0
  33. package/dist/constants.js.map +1 -0
  34. package/dist/server/previewServer.js +1 -1
  35. package/dist/server/previewServer.js.map +1 -1
  36. package/dist/services/userApplications.js.map +1 -1
  37. package/dist/util/compareDependencyVersions.js +1 -2
  38. package/dist/util/compareDependencyVersions.js.map +1 -1
  39. package/oclif.manifest.json +1 -1
  40. package/package.json +9 -9
  41. package/dist/util/getLocalPackageVersion.js +0 -55
  42. package/dist/util/getLocalPackageVersion.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/buildApp.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {getCliTelemetry, getTimer, isInteractive} from '@sanity/cli-core'\nimport {confirm, logSymbols, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport {parse as semverParse} from 'semver'\n\nimport {AppBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {buildVendorDependencies} from './buildVendorDependencies.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAppEnvVars} from './getAppEnvVars.js'\nimport {getAutoUpdatesCssUrls, getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.js'\nimport {type BuildOptions} from './types.js'\n\n/**\n * Build the Sanity app.\n *\n * @internal\n */\nexport async function buildApp(options: BuildOptions): Promise<void> {\n const {cliConfig, flags, outDir, output, workDir} = options\n let {autoUpdatesEnabled} = options\n const unattendedMode = flags.yes\n const timer = getTimer()\n\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n const appId = getAppId(cliConfig)\n\n const installedSdkVersion = await getLocalPackageVersion('@sanity/sdk-react', workDir)\n const installedSanityVersion = await getLocalPackageVersion('sanity', workDir)\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n let autoUpdatesImports = {}\n let autoUpdatesCssUrls: string[] = []\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSDKVersion = semverParse(installedSdkVersion)?.version\n if (!cleanSDKVersion) {\n output.error(`Failed to parse installed SDK version: ${installedSdkVersion}`, {exit: 1})\n return\n }\n\n // Sanity might not be installed, but if it is, we want to auto update it.\n const cleanSanityVersion = semverParse(installedSanityVersion)?.version\n\n const autoUpdatedPackages = [\n {name: '@sanity/sdk', version: cleanSDKVersion},\n {name: '@sanity/sdk-react', version: cleanSDKVersion},\n ...(cleanSanityVersion\n ? [{cssFile: 'index.css', name: 'sanity' as const, version: cleanSanityVersion}]\n : []),\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(autoUpdatedPackages, {appId})\n autoUpdatesCssUrls = getAutoUpdatesCssUrls(autoUpdatedPackages, {appId})\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n // Warn if auto updates enabled but no appId configured.\n // Skip when called from deploy, since deploy handles appId itself\n // (prompts the user and tells them to add it to config).\n if (!appId && !options.calledFromDeploy) {\n warnAboutMissingAppId({appType: 'app', output})\n }\n\n // Check the versions\n const {mismatched, unresolvedPrerelease} = await compareDependencyVersions(\n autoUpdatedPackages,\n workDir,\n {appId},\n )\n\n if (unresolvedPrerelease.length > 0) {\n await handlePrereleaseVersions({output, unattendedMode, unresolvedPrerelease})\n autoUpdatesImports = {}\n autoUpdatesCssUrls = []\n autoUpdatesEnabled = false\n }\n\n if (mismatched.length > 0 && autoUpdatesEnabled) {\n const versionMismatchWarning =\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you test locally with the same versions before deploying. \\n\\n` +\n `${mismatched.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')}`\n\n // If it is non-interactive or in unattended mode, we don't want to prompt\n if (isInteractive() && !unattendedMode) {\n const shouldContinue = await confirm({\n default: false,\n message: styleText('yellow', `${versionMismatchWarning} \\n\\nContinue anyway?`),\n })\n\n if (!shouldContinue) {\n output.error('Declined to continue with build', {exit: 1})\n return\n }\n } else {\n // if non-interactive or unattended, just show the warning\n output.warn(versionMismatchWarning)\n }\n }\n }\n\n const envVarKeys = getAppEnvVars()\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) output.log(`- ${key}`)\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode && isInteractive()) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n // Determine base path for built app\n const basePath = determineBasePath(cliConfig, 'app', output)\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Building Sanity application`).start()\n\n const trace = getCliTelemetry().trace(AppBuildTrace)\n trace.start()\n\n let importMap: {imports?: Record<string, string>} | undefined\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, isApp: true, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n appTitle: cliConfig && 'app' in cliConfig ? cliConfig.app?.title : undefined,\n autoUpdatesCssUrls: autoUpdatesCssUrls.length > 0 ? autoUpdatesCssUrls : undefined,\n basePath,\n cwd: workDir,\n entry: cliConfig && 'app' in cliConfig ? cliConfig.app?.entry : undefined,\n importMap,\n isApp: true,\n minify: Boolean(flags.minify),\n outputDir,\n reactCompiler:\n cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n schemaExtraction: cliConfig?.schemaExtraction,\n sourceMap: Boolean(flags['source-maps']),\n vite: cliConfig && 'vite' in cliConfig ? cliConfig.vite : undefined,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity application (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n if (flags.stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n\n trace.complete()\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity application`, {error})\n output.error(`Failed to build Sanity application: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","getCliTelemetry","getTimer","isInteractive","confirm","logSymbols","spinner","parse","semverParse","AppBuildTrace","getAppId","compareDependencyVersions","getLocalPackageVersion","formatModuleSizes","sortModulesBySize","warnAboutMissingAppId","buildDebug","buildStaticFiles","buildVendorDependencies","determineBasePath","getAppEnvVars","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","handlePrereleaseVersions","buildApp","options","cliConfig","flags","outDir","output","workDir","autoUpdatesEnabled","unattendedMode","yes","timer","defaultOutputDir","resolve","join","outputDir","appId","installedSdkVersion","installedSanityVersion","error","exit","autoUpdatesImports","autoUpdatesCssUrls","cleanSDKVersion","version","cleanSanityVersion","autoUpdatedPackages","name","cssFile","log","info","calledFromDeploy","appType","mismatched","unresolvedPrerelease","length","versionMismatchWarning","map","mod","pkg","installed","remote","shouldContinue","default","message","warn","envVarKeys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","isApp","bundle","appTitle","app","title","undefined","entry","minify","Boolean","reactCompiler","schemaExtraction","sourceMap","vite","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","stats","slice","complete","fail","Error","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/build/buildApp.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {\n type CliConfig,\n getCliTelemetry,\n getLocalPackageVersion,\n getTimer,\n isInteractive,\n type Output,\n UserViteConfig,\n} from '@sanity/cli-core'\nimport {confirm, logSymbols, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport {parse as semverParse} from 'semver'\n\nimport {AppBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {buildVendorDependencies} from './buildVendorDependencies.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAppEnvVars} from './getAppEnvVars.js'\nimport {getAutoUpdatesCssUrls, getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.js'\nimport {type BuildOptions} from './types.js'\n\ninterface InternalBuildOptions {\n appId: string | undefined\n appTitle: string | undefined\n autoUpdatesEnabled: boolean\n calledFromDeploy: boolean | undefined\n determineBasePath: () => string\n entry: string | undefined\n minify: boolean\n outDir: string | undefined\n output: Output\n reactCompiler: CliConfig['reactCompiler']\n schemaExtraction: CliConfig['schemaExtraction']\n sourceMap: boolean\n stats: boolean\n unattendedMode: boolean\n vite: UserViteConfig | undefined\n workDir: string\n}\n\n/**\n * Build the Sanity app.\n *\n * @internal\n */\nexport async function buildApp(options: BuildOptions): Promise<void> {\n const {cliConfig, flags, outDir, output, workDir} = options\n\n await internalBuildApp({\n appId: getAppId(cliConfig),\n appTitle: cliConfig && 'app' in cliConfig ? cliConfig.app?.title : undefined,\n autoUpdatesEnabled: options.autoUpdatesEnabled,\n calledFromDeploy: options.calledFromDeploy,\n determineBasePath: () => determineBasePath(cliConfig, 'app', output),\n entry: cliConfig && 'app' in cliConfig ? cliConfig.app?.entry : undefined,\n minify: flags.minify,\n outDir,\n output,\n reactCompiler: cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n schemaExtraction: cliConfig?.schemaExtraction,\n sourceMap: Boolean(flags['source-maps']),\n stats: flags.stats,\n unattendedMode: flags.yes,\n vite: cliConfig.vite,\n workDir,\n })\n}\n\n/**\n * Internal build app that avoids depending on flags for CLI config.\n * @param options - options for the build\n */\nasync function internalBuildApp(options: InternalBuildOptions): Promise<void> {\n const {appId, determineBasePath, outDir, output, workDir} = options\n let {autoUpdatesEnabled} = options\n const unattendedMode = options.unattendedMode\n const timer = getTimer()\n\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n const installedSdkVersion = await getLocalPackageVersion('@sanity/sdk-react', workDir)\n const installedSanityVersion = await getLocalPackageVersion('sanity', workDir)\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n let autoUpdatesImports = {}\n let autoUpdatesCssUrls: string[] = []\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSDKVersion = semverParse(installedSdkVersion)?.version\n if (!cleanSDKVersion) {\n output.error(`Failed to parse installed SDK version: ${installedSdkVersion}`, {exit: 1})\n return\n }\n\n // Sanity might not be installed, but if it is, we want to auto update it.\n const cleanSanityVersion = semverParse(installedSanityVersion)?.version\n\n const autoUpdatedPackages = [\n {name: '@sanity/sdk', version: cleanSDKVersion},\n {name: '@sanity/sdk-react', version: cleanSDKVersion},\n ...(cleanSanityVersion\n ? [{cssFile: 'index.css', name: 'sanity' as const, version: cleanSanityVersion}]\n : []),\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(autoUpdatedPackages, {appId})\n autoUpdatesCssUrls = getAutoUpdatesCssUrls(autoUpdatedPackages, {appId})\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n // Warn if auto updates enabled but no appId configured.\n // Skip when called from deploy, since deploy handles appId itself\n // (prompts the user and tells them to add it to config).\n if (!appId && !options.calledFromDeploy) {\n warnAboutMissingAppId({appType: 'app', output})\n }\n\n // Check the versions\n const {mismatched, unresolvedPrerelease} = await compareDependencyVersions(\n autoUpdatedPackages,\n workDir,\n {appId},\n )\n\n if (unresolvedPrerelease.length > 0) {\n await handlePrereleaseVersions({output, unattendedMode, unresolvedPrerelease})\n autoUpdatesImports = {}\n autoUpdatesCssUrls = []\n autoUpdatesEnabled = false\n }\n\n if (mismatched.length > 0 && autoUpdatesEnabled) {\n const versionMismatchWarning =\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you test locally with the same versions before deploying. \\n\\n` +\n `${mismatched.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')}`\n\n // If it is non-interactive or in unattended mode, we don't want to prompt\n if (isInteractive() && !unattendedMode) {\n const shouldContinue = await confirm({\n default: false,\n message: styleText('yellow', `${versionMismatchWarning} \\n\\nContinue anyway?`),\n })\n\n if (!shouldContinue) {\n output.error('Declined to continue with build', {exit: 1})\n return\n }\n } else {\n // if non-interactive or unattended, just show the warning\n output.warn(versionMismatchWarning)\n }\n }\n }\n\n const envVarKeys = getAppEnvVars()\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) output.log(`- ${key}`)\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode && isInteractive()) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n const basePath = determineBasePath()\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Building Sanity application`).start()\n\n const trace = getCliTelemetry().trace(AppBuildTrace)\n trace.start()\n\n let importMap: {imports?: Record<string, string>} | undefined\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, isApp: true, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n appTitle: options.appTitle,\n autoUpdatesCssUrls: autoUpdatesCssUrls.length > 0 ? autoUpdatesCssUrls : undefined,\n basePath,\n cwd: workDir,\n entry: options.entry,\n importMap,\n isApp: true,\n minify: options.minify,\n outputDir,\n reactCompiler: options.reactCompiler,\n schemaExtraction: options.schemaExtraction,\n sourceMap: options.sourceMap,\n vite: options.vite,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity application (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n if (options.stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n\n trace.complete()\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity application`, {error})\n output.error(`Failed to build Sanity application: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","getCliTelemetry","getLocalPackageVersion","getTimer","isInteractive","confirm","logSymbols","spinner","parse","semverParse","AppBuildTrace","getAppId","compareDependencyVersions","formatModuleSizes","sortModulesBySize","warnAboutMissingAppId","buildDebug","buildStaticFiles","buildVendorDependencies","determineBasePath","getAppEnvVars","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","handlePrereleaseVersions","buildApp","options","cliConfig","flags","outDir","output","workDir","internalBuildApp","appId","appTitle","app","title","undefined","autoUpdatesEnabled","calledFromDeploy","entry","minify","reactCompiler","schemaExtraction","sourceMap","Boolean","stats","unattendedMode","yes","vite","timer","defaultOutputDir","resolve","join","outputDir","installedSdkVersion","installedSanityVersion","error","exit","autoUpdatesImports","autoUpdatesCssUrls","cleanSDKVersion","version","cleanSanityVersion","autoUpdatedPackages","name","cssFile","log","info","appType","mismatched","unresolvedPrerelease","length","versionMismatchWarning","map","mod","pkg","installed","remote","shouldContinue","default","message","warn","envVarKeys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","isApp","bundle","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","slice","complete","fail","Error","String"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  import { rm } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { styleText } from 'node:util';
4
- import { getCliTelemetry, getTimer, isInteractive } from '@sanity/cli-core';
4
+ import { getCliTelemetry, getLocalPackageVersion, getTimer, isInteractive } from '@sanity/cli-core';
5
5
  import { confirm, logSymbols, select, spinner } from '@sanity/cli-core/ux';
6
6
  import { parse as semverParse } from 'semver';
7
7
  import { StudioBuildTrace } from '../../telemetry/build.telemetry.js';
8
8
  import { getAppId } from '../../util/appId.js';
9
9
  import { compareDependencyVersions } from '../../util/compareDependencyVersions.js';
10
- import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
10
+ import { determineIsApp } from '../../util/determineIsApp.js';
11
11
  import { formatModuleSizes, sortModulesBySize } from '../../util/moduleFormatUtils.js';
12
12
  import { getPackageManagerChoice } from '../../util/packageManager/packageManagerChoice.js';
13
13
  import { upgradePackages } from '../../util/packageManager/upgradePackages.js';
@@ -27,24 +27,60 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
27
27
  *
28
28
  * @internal
29
29
  */ export async function buildStudio(options) {
30
+ const { calledFromDeploy, cliConfig, flags, outDir, output, workDir } = options;
31
+ const autoUpdatesEnabled = options.calledFromDeploy ? options.autoUpdatesEnabled : shouldAutoUpdate({
32
+ cliConfig,
33
+ flags,
34
+ output
35
+ });
36
+ const upgradePkgs = async (options)=>{
37
+ await upgradePackages({
38
+ packageManager: (await getPackageManagerChoice(workDir, {
39
+ interactive: false
40
+ })).chosen,
41
+ packages: options.packages
42
+ }, {
43
+ output,
44
+ workDir
45
+ });
46
+ };
47
+ await internalBuildStudio({
48
+ appId: getAppId(cliConfig),
49
+ autoUpdatesEnabled,
50
+ calledFromDeploy,
51
+ determineBasePath: ()=>determineBasePath(cliConfig, 'studio', output),
52
+ isApp: determineIsApp(cliConfig),
53
+ minify: Boolean(flags.minify),
54
+ outDir,
55
+ output,
56
+ projectId: cliConfig?.api?.projectId,
57
+ reactCompiler: cliConfig.reactCompiler,
58
+ schemaExtraction: cliConfig.schemaExtraction,
59
+ sourceMap: Boolean(flags['source-maps']),
60
+ stats: flags.stats,
61
+ unattendedMode: Boolean(flags.yes),
62
+ upgradePackages: upgradePkgs,
63
+ vite: cliConfig.vite,
64
+ workDir
65
+ });
66
+ }
67
+ /**
68
+ * Internal build studio that avoids depending on flags for CLI config.
69
+ * @param options - options for the build
70
+ */ async function internalBuildStudio(options) {
30
71
  const timer = getTimer();
31
- const { cliConfig, flags, outDir, output, workDir } = options;
32
- const unattendedMode = Boolean(flags.yes);
72
+ const { appId, determineBasePath, isApp, minify, outDir, output, projectId, reactCompiler, schemaExtraction, sourceMap, stats, unattendedMode, upgradePackages, vite, workDir } = options;
73
+ let autoUpdatesEnabled = options.autoUpdatesEnabled;
33
74
  const defaultOutputDir = path.resolve(path.join(workDir, 'dist'));
34
75
  const outputDir = path.resolve(outDir || defaultOutputDir);
35
76
  await checkStudioDependencyVersions(workDir, output);
36
77
  // If the check resulted in a dependency install, the CLI command will be re-run,
37
78
  // thus we want to exit early
38
79
  const { installedSanityVersion } = await checkRequiredDependencies({
39
- cliConfig,
80
+ isApp,
40
81
  output,
41
82
  workDir
42
83
  });
43
- let autoUpdatesEnabled = options.calledFromDeploy ? options.autoUpdatesEnabled : shouldAutoUpdate({
44
- cliConfig,
45
- flags,
46
- output
47
- });
48
84
  let autoUpdatesImports = {};
49
85
  let autoUpdatesCssUrls = [];
50
86
  if (autoUpdatesEnabled) {
@@ -54,8 +90,6 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
54
90
  throw new Error(`Failed to parse installed Sanity version: ${installedSanityVersion}`);
55
91
  }
56
92
  output.log(`${logSymbols.info} Building with auto-updates enabled`);
57
- const projectId = cliConfig?.api?.projectId;
58
- const appId = getAppId(cliConfig);
59
93
  // Warn if auto updates enabled but no appId configured.
60
94
  // Skip when called from deploy, since deploy handles appId itself
61
95
  // (prompts the user and tells them to add it to config).
@@ -141,16 +175,10 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
141
175
  }
142
176
  if (choice === 'upgrade' || choice === 'upgrade-and-proceed') {
143
177
  await upgradePackages({
144
- packageManager: (await getPackageManagerChoice(workDir, {
145
- interactive: false
146
- })).chosen,
147
178
  packages: mismatched.map((res)=>[
148
179
  res.pkg,
149
180
  res.remote
150
181
  ])
151
- }, {
152
- output,
153
- workDir
154
182
  });
155
183
  if (choice === 'upgrade') {
156
184
  return;
@@ -178,8 +206,8 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
178
206
  });
179
207
  }
180
208
  // Determine base path for built studio
181
- const basePath = determineBasePath(cliConfig, 'studio', output);
182
- if (cliConfig?.schemaExtraction?.enabled) {
209
+ const basePath = determineBasePath();
210
+ if (schemaExtraction?.enabled) {
183
211
  output.log(`${logSymbols.info} Building with schema extraction enabled`);
184
212
  }
185
213
  let spin;
@@ -218,12 +246,12 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
218
246
  basePath,
219
247
  cwd: workDir,
220
248
  importMap,
221
- minify: Boolean(flags.minify),
249
+ minify,
222
250
  outputDir,
223
- reactCompiler: cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,
224
- schemaExtraction: cliConfig?.schemaExtraction,
225
- sourceMap: Boolean(flags['source-maps']),
226
- vite: cliConfig && 'vite' in cliConfig ? cliConfig.vite : undefined
251
+ reactCompiler,
252
+ schemaExtraction,
253
+ sourceMap,
254
+ vite
227
255
  });
228
256
  trace.log({
229
257
  outputSize: bundle.chunks.flatMap((chunk)=>chunk.modules.flatMap((mod)=>mod.renderedLength)).reduce((sum, n)=>sum + n, 0)
@@ -232,7 +260,7 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
232
260
  spin.text = `Build Sanity Studio (${buildDuration.toFixed(0)}ms)`;
233
261
  spin.succeed();
234
262
  trace.complete();
235
- if (flags.stats) {
263
+ if (stats) {
236
264
  output.log('\nLargest module files:');
237
265
  output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)));
238
266
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/buildStudio.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {getCliTelemetry, getTimer, isInteractive} from '@sanity/cli-core'\nimport {confirm, logSymbols, select, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport {parse as semverParse} from 'semver'\n\nimport {StudioBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {buildVendorDependencies} from './buildVendorDependencies.js'\nimport {checkRequiredDependencies} from './checkRequiredDependencies.js'\nimport {checkStudioDependencyVersions} from './checkStudioDependencyVersions.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAutoUpdatesCssUrls, getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {getStudioEnvVars} from './getStudioEnvVars.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.js'\nimport {shouldAutoUpdate} from './shouldAutoUpdate.js'\nimport {type BuildOptions} from './types.js'\n\n/**\n * Build the Sanity Studio.\n *\n * @internal\n */\nexport async function buildStudio(options: BuildOptions): Promise<void> {\n const timer = getTimer()\n const {cliConfig, flags, outDir, output, workDir} = options\n\n const unattendedMode = Boolean(flags.yes)\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n await checkStudioDependencyVersions(workDir, output)\n\n // If the check resulted in a dependency install, the CLI command will be re-run,\n // thus we want to exit early\n const {installedSanityVersion} = await checkRequiredDependencies({\n cliConfig,\n output,\n workDir,\n })\n\n let autoUpdatesEnabled = options.calledFromDeploy\n ? options.autoUpdatesEnabled\n : shouldAutoUpdate({cliConfig, flags, output})\n\n let autoUpdatesImports = {}\n let autoUpdatesCssUrls: string[] = []\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSanityVersion = semverParse(installedSanityVersion)?.version\n if (!cleanSanityVersion) {\n throw new Error(`Failed to parse installed Sanity version: ${installedSanityVersion}`)\n }\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n const projectId = cliConfig?.api?.projectId\n const appId = getAppId(cliConfig)\n\n // Warn if auto updates enabled but no appId configured.\n // Skip when called from deploy, since deploy handles appId itself\n // (prompts the user and tells them to add it to config).\n if (!appId && !options.calledFromDeploy) {\n warnAboutMissingAppId({appType: 'studio', output, projectId})\n }\n\n const installedVisionVersion = await getLocalPackageVersion('@sanity/vision', workDir)\n const cleanVisionVersion = installedVisionVersion\n ? semverParse(installedVisionVersion)?.version\n : undefined\n\n const sanityDependencies = [\n {cssFile: 'index.css', name: 'sanity', version: cleanSanityVersion},\n ...(cleanVisionVersion\n ? [{cssFile: 'index.css', name: '@sanity/vision' as const, version: cleanVisionVersion}]\n : [{name: '@sanity/vision' as const, version: cleanSanityVersion}]),\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(sanityDependencies, {appId})\n\n autoUpdatesCssUrls = getAutoUpdatesCssUrls(sanityDependencies, {appId})\n\n // Check the versions\n const {mismatched, unresolvedPrerelease} = await compareDependencyVersions(\n sanityDependencies,\n workDir,\n {appId},\n )\n\n if (unresolvedPrerelease.length > 0) {\n await handlePrereleaseVersions({output, unattendedMode, unresolvedPrerelease})\n autoUpdatesImports = {}\n autoUpdatesCssUrls = []\n autoUpdatesEnabled = false\n }\n\n if (mismatched.length > 0 && autoUpdatesEnabled) {\n const versionMismatchWarning =\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you test locally with the same versions before deploying. \\n\\n` +\n `${mismatched.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')}`\n\n // If it is non-interactive or in unattended mode, we don't want to prompt\n if (isInteractive() && !unattendedMode) {\n const choice = await select({\n choices: [\n {\n name: `Upgrade local versions (recommended). You will need to run the build command again`,\n value: 'upgrade',\n },\n {\n name: `Upgrade and proceed with build`,\n value: 'upgrade-and-proceed',\n },\n {\n name: `Continue anyway`,\n value: 'continue',\n },\n {name: 'Cancel', value: 'cancel'},\n ],\n default: 'upgrade',\n message: styleText(\n 'yellow',\n `${logSymbols.warning} ${versionMismatchWarning}\\n\\nDo you want to upgrade local versions before deploying?`,\n ),\n })\n\n if (choice === 'cancel') {\n output.error('Declined to continue with build', {exit: 1})\n return\n }\n\n if (choice === 'upgrade' || choice === 'upgrade-and-proceed') {\n await upgradePackages(\n {\n packageManager: (await getPackageManagerChoice(workDir, {interactive: false})).chosen,\n packages: mismatched.map((res) => [res.pkg, res.remote]),\n },\n {output, workDir},\n )\n\n if (choice === 'upgrade') {\n return\n }\n }\n } else {\n // if non-interactive or unattended, just show the warning\n output.warn(versionMismatchWarning)\n }\n }\n }\n\n const envVarKeys = getStudioEnvVars()\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) {\n output.log(`- ${key}`)\n }\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode && isInteractive()) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n // Determine base path for built studio\n const basePath = determineBasePath(cliConfig, 'studio', output)\n\n if (cliConfig?.schemaExtraction?.enabled) {\n output.log(`${logSymbols.info} Building with schema extraction enabled`)\n }\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Build Sanity Studio`).start()\n\n const trace = getCliTelemetry().trace(StudioBuildTrace)\n trace.start()\n\n let importMap\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, isApp: false, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n autoUpdatesCssUrls: autoUpdatesCssUrls.length > 0 ? autoUpdatesCssUrls : undefined,\n basePath,\n cwd: workDir,\n importMap,\n minify: Boolean(flags.minify),\n outputDir,\n reactCompiler:\n cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n schemaExtraction: cliConfig?.schemaExtraction,\n sourceMap: Boolean(flags['source-maps']),\n vite: cliConfig && 'vite' in cliConfig ? cliConfig.vite : undefined,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity Studio (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n trace.complete()\n if (flags.stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity Studio`, {error})\n output.error(`Failed to build Sanity Studio: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","getCliTelemetry","getTimer","isInteractive","confirm","logSymbols","select","spinner","parse","semverParse","StudioBuildTrace","getAppId","compareDependencyVersions","getLocalPackageVersion","formatModuleSizes","sortModulesBySize","getPackageManagerChoice","upgradePackages","warnAboutMissingAppId","buildDebug","buildStaticFiles","buildVendorDependencies","checkRequiredDependencies","checkStudioDependencyVersions","determineBasePath","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","getStudioEnvVars","handlePrereleaseVersions","shouldAutoUpdate","buildStudio","options","timer","cliConfig","flags","outDir","output","workDir","unattendedMode","Boolean","yes","defaultOutputDir","resolve","join","outputDir","installedSanityVersion","autoUpdatesEnabled","calledFromDeploy","autoUpdatesImports","autoUpdatesCssUrls","cleanSanityVersion","version","Error","log","info","projectId","api","appId","appType","installedVisionVersion","cleanVisionVersion","undefined","sanityDependencies","cssFile","name","mismatched","unresolvedPrerelease","length","versionMismatchWarning","map","mod","pkg","installed","remote","choice","choices","value","default","message","warning","error","exit","packageManager","interactive","chosen","packages","res","warn","envVarKeys","key","shouldClean","basePath","schemaExtraction","enabled","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","isApp","bundle","minify","reactCompiler","sourceMap","vite","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","complete","stats","slice","fail","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/build/buildStudio.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {\n type CliConfig,\n getCliTelemetry,\n getLocalPackageVersion,\n getTimer,\n isInteractive,\n type Output,\n UserViteConfig,\n} from '@sanity/cli-core'\nimport {confirm, logSymbols, select, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport {parse as semverParse} from 'semver'\n\nimport {StudioBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {determineIsApp} from '../../util/determineIsApp.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {buildVendorDependencies} from './buildVendorDependencies.js'\nimport {checkRequiredDependencies} from './checkRequiredDependencies.js'\nimport {checkStudioDependencyVersions} from './checkStudioDependencyVersions.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAutoUpdatesCssUrls, getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {getStudioEnvVars} from './getStudioEnvVars.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.js'\nimport {shouldAutoUpdate} from './shouldAutoUpdate.js'\nimport {type BuildOptions} from './types.js'\n\ninterface InternalBuildOptions {\n appId: string | undefined\n autoUpdatesEnabled: boolean\n calledFromDeploy: boolean | undefined\n determineBasePath: () => string\n isApp: boolean\n minify: boolean\n outDir: string | undefined\n output: Output\n projectId: string | undefined\n reactCompiler: CliConfig['reactCompiler']\n schemaExtraction: CliConfig['schemaExtraction']\n sourceMap: boolean\n stats: boolean\n unattendedMode: boolean\n upgradePackages(options: {packages: [name: string, version: string][]}): Promise<void>\n vite: UserViteConfig | undefined\n workDir: string\n}\n\n/**\n * Build the Sanity Studio.\n *\n * @internal\n */\nexport async function buildStudio(options: BuildOptions): Promise<void> {\n const {calledFromDeploy, cliConfig, flags, outDir, output, workDir} = options\n\n const autoUpdatesEnabled = options.calledFromDeploy\n ? options.autoUpdatesEnabled\n : shouldAutoUpdate({cliConfig, flags, output})\n\n const upgradePkgs = async (options: {\n packages: [name: string, version: string][]\n }): Promise<void> => {\n await upgradePackages(\n {\n packageManager: (await getPackageManagerChoice(workDir, {interactive: false})).chosen,\n packages: options.packages,\n },\n {output, workDir},\n )\n }\n\n await internalBuildStudio({\n appId: getAppId(cliConfig),\n autoUpdatesEnabled,\n calledFromDeploy,\n determineBasePath: () => determineBasePath(cliConfig, 'studio', output),\n isApp: determineIsApp(cliConfig),\n minify: Boolean(flags.minify),\n outDir,\n output,\n projectId: cliConfig?.api?.projectId,\n reactCompiler: cliConfig.reactCompiler,\n schemaExtraction: cliConfig.schemaExtraction,\n sourceMap: Boolean(flags['source-maps']),\n stats: flags.stats,\n unattendedMode: Boolean(flags.yes),\n upgradePackages: upgradePkgs,\n vite: cliConfig.vite,\n workDir,\n })\n}\n\n/**\n * Internal build studio that avoids depending on flags for CLI config.\n * @param options - options for the build\n */\nasync function internalBuildStudio(options: InternalBuildOptions): Promise<void> {\n const timer = getTimer()\n const {\n appId,\n determineBasePath,\n isApp,\n minify,\n outDir,\n output,\n projectId,\n reactCompiler,\n schemaExtraction,\n sourceMap,\n stats,\n unattendedMode,\n upgradePackages,\n vite,\n workDir,\n } = options\n let autoUpdatesEnabled = options.autoUpdatesEnabled\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n await checkStudioDependencyVersions(workDir, output)\n\n // If the check resulted in a dependency install, the CLI command will be re-run,\n // thus we want to exit early\n const {installedSanityVersion} = await checkRequiredDependencies({\n isApp,\n output,\n workDir,\n })\n\n let autoUpdatesImports = {}\n let autoUpdatesCssUrls: string[] = []\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSanityVersion = semverParse(installedSanityVersion)?.version\n if (!cleanSanityVersion) {\n throw new Error(`Failed to parse installed Sanity version: ${installedSanityVersion}`)\n }\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n // Warn if auto updates enabled but no appId configured.\n // Skip when called from deploy, since deploy handles appId itself\n // (prompts the user and tells them to add it to config).\n if (!appId && !options.calledFromDeploy) {\n warnAboutMissingAppId({appType: 'studio', output, projectId})\n }\n\n const installedVisionVersion = await getLocalPackageVersion('@sanity/vision', workDir)\n const cleanVisionVersion = installedVisionVersion\n ? semverParse(installedVisionVersion)?.version\n : undefined\n\n const sanityDependencies = [\n {cssFile: 'index.css', name: 'sanity', version: cleanSanityVersion},\n ...(cleanVisionVersion\n ? [{cssFile: 'index.css', name: '@sanity/vision' as const, version: cleanVisionVersion}]\n : [{name: '@sanity/vision' as const, version: cleanSanityVersion}]),\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(sanityDependencies, {appId})\n\n autoUpdatesCssUrls = getAutoUpdatesCssUrls(sanityDependencies, {appId})\n\n // Check the versions\n const {mismatched, unresolvedPrerelease} = await compareDependencyVersions(\n sanityDependencies,\n workDir,\n {appId},\n )\n\n if (unresolvedPrerelease.length > 0) {\n await handlePrereleaseVersions({output, unattendedMode, unresolvedPrerelease})\n autoUpdatesImports = {}\n autoUpdatesCssUrls = []\n autoUpdatesEnabled = false\n }\n\n if (mismatched.length > 0 && autoUpdatesEnabled) {\n const versionMismatchWarning =\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you test locally with the same versions before deploying. \\n\\n` +\n `${mismatched.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')}`\n\n // If it is non-interactive or in unattended mode, we don't want to prompt\n if (isInteractive() && !unattendedMode) {\n const choice = await select({\n choices: [\n {\n name: `Upgrade local versions (recommended). You will need to run the build command again`,\n value: 'upgrade',\n },\n {\n name: `Upgrade and proceed with build`,\n value: 'upgrade-and-proceed',\n },\n {\n name: `Continue anyway`,\n value: 'continue',\n },\n {name: 'Cancel', value: 'cancel'},\n ],\n default: 'upgrade',\n message: styleText(\n 'yellow',\n `${logSymbols.warning} ${versionMismatchWarning}\\n\\nDo you want to upgrade local versions before deploying?`,\n ),\n })\n\n if (choice === 'cancel') {\n output.error('Declined to continue with build', {exit: 1})\n return\n }\n\n if (choice === 'upgrade' || choice === 'upgrade-and-proceed') {\n await upgradePackages({\n packages: mismatched.map((res) => [res.pkg, res.remote]),\n })\n\n if (choice === 'upgrade') {\n return\n }\n }\n } else {\n // if non-interactive or unattended, just show the warning\n output.warn(versionMismatchWarning)\n }\n }\n }\n\n const envVarKeys = getStudioEnvVars()\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) {\n output.log(`- ${key}`)\n }\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode && isInteractive()) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n // Determine base path for built studio\n const basePath = determineBasePath()\n\n if (schemaExtraction?.enabled) {\n output.log(`${logSymbols.info} Building with schema extraction enabled`)\n }\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Build Sanity Studio`).start()\n\n const trace = getCliTelemetry().trace(StudioBuildTrace)\n trace.start()\n\n let importMap\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, isApp: false, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n autoUpdatesCssUrls: autoUpdatesCssUrls.length > 0 ? autoUpdatesCssUrls : undefined,\n basePath,\n cwd: workDir,\n importMap,\n minify,\n outputDir,\n reactCompiler,\n schemaExtraction,\n sourceMap,\n vite,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity Studio (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n trace.complete()\n if (stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity Studio`, {error})\n output.error(`Failed to build Sanity Studio: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","getCliTelemetry","getLocalPackageVersion","getTimer","isInteractive","confirm","logSymbols","select","spinner","parse","semverParse","StudioBuildTrace","getAppId","compareDependencyVersions","determineIsApp","formatModuleSizes","sortModulesBySize","getPackageManagerChoice","upgradePackages","warnAboutMissingAppId","buildDebug","buildStaticFiles","buildVendorDependencies","checkRequiredDependencies","checkStudioDependencyVersions","determineBasePath","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","getStudioEnvVars","handlePrereleaseVersions","shouldAutoUpdate","buildStudio","options","calledFromDeploy","cliConfig","flags","outDir","output","workDir","autoUpdatesEnabled","upgradePkgs","packageManager","interactive","chosen","packages","internalBuildStudio","appId","isApp","minify","Boolean","projectId","api","reactCompiler","schemaExtraction","sourceMap","stats","unattendedMode","yes","vite","timer","defaultOutputDir","resolve","join","outputDir","installedSanityVersion","autoUpdatesImports","autoUpdatesCssUrls","cleanSanityVersion","version","Error","log","info","appType","installedVisionVersion","cleanVisionVersion","undefined","sanityDependencies","cssFile","name","mismatched","unresolvedPrerelease","length","versionMismatchWarning","map","mod","pkg","installed","remote","choice","choices","value","default","message","warning","error","exit","res","warn","envVarKeys","key","shouldClean","basePath","enabled","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","bundle","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","complete","slice","fail","String"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import path from 'node:path';
2
+ import { getLocalPackageDir, getLocalPackageVersion } from '@sanity/cli-core';
2
3
  import { gt, minVersion, rcompare, satisfies } from 'semver';
3
4
  import { build } from 'vite';
4
- import { getLocalPackageDir, getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
5
+ import { SANITY_CACHE_DIR } from '../../constants.js';
5
6
  import { createExternalFromImportMap } from './createExternalFromImportMap.js';
6
7
  // Directory where vendor packages will be stored
7
8
  const VENDOR_DIR = 'vendor';
@@ -119,7 +120,7 @@ const STYLED_COMPONENTS_IMPORTS = {
119
120
  },
120
121
  // Define a custom cache directory so that sanity's vite cache
121
122
  // does not conflict with any potential local vite projects
122
- cacheDir: 'node_modules/.sanity/vite-vendor',
123
+ cacheDir: `${SANITY_CACHE_DIR}/vite-vendor`,
123
124
  configFile: false,
124
125
  define: {
125
126
  'process.env.NODE_ENV': JSON.stringify('production')
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/buildVendorDependencies.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {gt, minVersion, rcompare, satisfies} from 'semver'\nimport {build} from 'vite'\n\nimport {getLocalPackageDir, getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {createExternalFromImportMap} from './createExternalFromImportMap.js'\n\n// Directory where vendor packages will be stored\nconst VENDOR_DIR = 'vendor'\n\n/**\n * A type representing the imports of vendor packages, defining specific entry\n * points for various versions and subpaths of the packages.\n *\n * The `VendorImports` object is used to build ESM browser-compatible versions\n * of the specified packages. This approach ensures that the appropriate version\n * and entry points are used for each package, enabling compatibility and proper\n * functionality in the browser environment.\n *\n * ## Rationale\n *\n * The rationale for this structure is to handle different versions of the\n * packages carefully, especially major versions. Major version bumps often\n * introduce breaking changes, so the module scheme for the package needs to be\n * checked when there is a major version update. However, minor and patch\n * versions are generally backward compatible, so they are handled more\n * leniently. By assuming that new minor versions are compatible, we avoid\n * unnecessary warnings and streamline the update process.\n *\n * If a new minor version introduces an additional subpath export within the\n * package of this version range, the corresponding package can add a more\n * specific version range that includes the new subpath. This design allows for\n * flexibility and ease of maintenance, ensuring that the latest features and\n * fixes are incorporated without extensive manual intervention.\n *\n * An additional subpath export within the package of this version range that\n * could cause the build to break if that new export is used, can be treated as\n * a bug fix. It might make more sense to our users that this new subpath isn't\n * supported yet until we address it as a bug fix. This approach helps maintain\n * stability and prevents unexpected issues during the build process.\n *\n * ## Structure\n * The `VendorImports` type is a nested object where:\n * - The keys at the first level represent the package names.\n * - The keys at the second level represent the version ranges (e.g., `^19.0.0`).\n * - The keys at the third level represent the subpaths within the package (e.g., `.` for the main entry point).\n * - The values at the third level are the relative paths to the corresponding entry points within the package.\n *\n * This structure allows for precise specification of the entry points for\n * different versions and subpaths, ensuring that the correct files are used\n * during the build process.\n */\ntype VendorImports = {\n [packageName: string]: {\n [versionRange: string]: {\n [subpath: string]: string\n }\n }\n}\n\n// Define the vendor packages and their corresponding versions and entry points\nconst VENDOR_IMPORTS: VendorImports = {\n react: {\n '^19.2.0': {\n '.': './cjs/react.production.js',\n './compiler-runtime': './cjs/react-compiler-runtime.production.js',\n './jsx-dev-runtime': './cjs/react-jsx-dev-runtime.production.js',\n './jsx-runtime': './cjs/react-jsx-runtime.production.js',\n './package.json': './package.json',\n },\n },\n 'react-dom': {\n '^19.2.0': {\n '.': './cjs/react-dom.production.js',\n './client': './cjs/react-dom-client.production.js',\n './package.json': './package.json',\n './server': './cjs/react-dom-server-legacy.browser.production.js',\n './server.browser': './cjs/react-dom-server-legacy.browser.production.js',\n './static': './cjs/react-dom-server.browser.production.js',\n './static.browser': './cjs/react-dom-server.browser.production.js',\n },\n },\n}\n\nconst STYLED_COMPONENTS_IMPORTS = {\n 'styled-components': {\n '^6.1.0': {\n '.': './dist/styled-components.browser.esm.js',\n './package.json': './package.json',\n },\n },\n}\n\ninterface VendorBuildOptions {\n basePath: string\n cwd: string\n isApp: boolean\n outputDir: string\n}\n\n/**\n * Builds the ESM browser compatible versions of the vendor packages\n * specified in VENDOR_IMPORTS. Returns the `imports` object of an import map.\n */\nexport async function buildVendorDependencies({\n basePath,\n cwd,\n isApp,\n outputDir,\n}: VendorBuildOptions): Promise<Record<string, string>> {\n const entry: Record<string, string> = {}\n const imports: Record<string, string> = {}\n\n // If we're building an app, we don't need to build the styled-components package\n const vendorImports = isApp ? VENDOR_IMPORTS : {...VENDOR_IMPORTS, ...STYLED_COMPONENTS_IMPORTS}\n\n // Iterate over each package and its version ranges in VENDOR_IMPORTS\n for (const [packageName, ranges] of Object.entries(vendorImports)) {\n const version = await getLocalPackageVersion(packageName, cwd)\n if (!version) {\n throw new Error(`Could not get version for '${packageName}'`)\n }\n\n // Sort version ranges in descending order\n const sortedRanges = Object.keys(ranges).toSorted((range1, range2) => {\n const min1 = minVersion(range1)\n const min2 = minVersion(range2)\n\n if (!min1) throw new Error(`Could not parse range '${range1}'`)\n if (!min2) throw new Error(`Could not parse range '${range2}'`)\n\n // sort them in reverse so we can rely on array `.find` below\n return rcompare(min1.version, min2.version)\n })\n\n // Find the first version range that satisfies the package version\n const matchedRange = sortedRanges.find((range) => satisfies(version, range))\n\n if (!matchedRange) {\n const min = minVersion(sortedRanges.at(-1)!)\n if (!min) {\n throw new Error(`Could not find a minimum version for package '${packageName}'`)\n }\n\n if (gt(min.version, version)) {\n throw new Error(`Package '${packageName}' requires at least ${min.version}.`)\n }\n\n throw new Error(`Version '${version}' of package '${packageName}' is not supported yet.`)\n }\n\n const subpaths = ranges[matchedRange]\n\n // Resolve the actual package directory using Node module resolution,\n // so that hoisted packages in monorepos/workspaces are found correctly\n const packageDir = getLocalPackageDir(packageName, cwd)\n\n // Iterate over each subpath and its corresponding entry point\n for (const [subpath, relativeEntryPoint] of Object.entries(subpaths)) {\n const specifier = path.posix.join(packageName, subpath)\n const chunkName = path.posix.join(\n packageName,\n path.relative(packageName, specifier) || 'index',\n )\n\n entry[chunkName] = path.join(packageDir, relativeEntryPoint)\n imports[specifier] = path.posix.join('/', basePath, VENDOR_DIR, `${chunkName}.mjs`)\n }\n }\n\n // removes the `RollupWatcher` type\n type BuildResult = Exclude<Awaited<ReturnType<typeof build>>, {close: unknown}>\n\n // Use Vite to build the packages into the output directory\n let buildResult = (await build({\n appType: 'custom',\n build: {\n commonjsOptions: {strictRequires: 'auto'},\n emptyOutDir: false, // Rely on CLI to do this\n lib: {entry, formats: ['es']},\n minify: true,\n outDir: path.join(outputDir, VENDOR_DIR),\n rollupOptions: {\n external: createExternalFromImportMap({imports}),\n output: {\n chunkFileNames: '[name]-[hash].mjs',\n entryFileNames: '[name]-[hash].mjs',\n exports: 'named',\n format: 'es',\n },\n treeshake: {preset: 'recommended'},\n },\n },\n // Define a custom cache directory so that sanity's vite cache\n // does not conflict with any potential local vite projects\n cacheDir: 'node_modules/.sanity/vite-vendor',\n configFile: false,\n define: {'process.env.NODE_ENV': JSON.stringify('production')},\n logLevel: 'silent',\n mode: 'production',\n root: cwd,\n })) as BuildResult\n\n buildResult = Array.isArray(buildResult) ? buildResult : [buildResult]\n\n // Create a map of the original import specifiers to their hashed filenames\n const hashedImports: Record<string, string> = {}\n const output = buildResult.flatMap((i) => i.output)\n\n for (const chunk of output) {\n if (chunk.type === 'asset') continue\n\n for (const [specifier, originalPath] of Object.entries(imports)) {\n if (originalPath.endsWith(`${chunk.name}.mjs`)) {\n hashedImports[specifier] = path.posix.join('/', basePath, VENDOR_DIR, chunk.fileName)\n }\n }\n }\n\n return hashedImports\n}\n"],"names":["path","gt","minVersion","rcompare","satisfies","build","getLocalPackageDir","getLocalPackageVersion","createExternalFromImportMap","VENDOR_DIR","VENDOR_IMPORTS","react","STYLED_COMPONENTS_IMPORTS","buildVendorDependencies","basePath","cwd","isApp","outputDir","entry","imports","vendorImports","packageName","ranges","Object","entries","version","Error","sortedRanges","keys","toSorted","range1","range2","min1","min2","matchedRange","find","range","min","at","subpaths","packageDir","subpath","relativeEntryPoint","specifier","posix","join","chunkName","relative","buildResult","appType","commonjsOptions","strictRequires","emptyOutDir","lib","formats","minify","outDir","rollupOptions","external","output","chunkFileNames","entryFileNames","exports","format","treeshake","preset","cacheDir","configFile","define","JSON","stringify","logLevel","mode","root","Array","isArray","hashedImports","flatMap","i","chunk","type","originalPath","endsWith","name","fileName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/build/buildVendorDependencies.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {getLocalPackageDir, getLocalPackageVersion} from '@sanity/cli-core'\nimport {gt, minVersion, rcompare, satisfies} from 'semver'\nimport {build} from 'vite'\n\nimport {SANITY_CACHE_DIR} from '../../constants.js'\nimport {createExternalFromImportMap} from './createExternalFromImportMap.js'\n\n// Directory where vendor packages will be stored\nconst VENDOR_DIR = 'vendor'\n\n/**\n * A type representing the imports of vendor packages, defining specific entry\n * points for various versions and subpaths of the packages.\n *\n * The `VendorImports` object is used to build ESM browser-compatible versions\n * of the specified packages. This approach ensures that the appropriate version\n * and entry points are used for each package, enabling compatibility and proper\n * functionality in the browser environment.\n *\n * ## Rationale\n *\n * The rationale for this structure is to handle different versions of the\n * packages carefully, especially major versions. Major version bumps often\n * introduce breaking changes, so the module scheme for the package needs to be\n * checked when there is a major version update. However, minor and patch\n * versions are generally backward compatible, so they are handled more\n * leniently. By assuming that new minor versions are compatible, we avoid\n * unnecessary warnings and streamline the update process.\n *\n * If a new minor version introduces an additional subpath export within the\n * package of this version range, the corresponding package can add a more\n * specific version range that includes the new subpath. This design allows for\n * flexibility and ease of maintenance, ensuring that the latest features and\n * fixes are incorporated without extensive manual intervention.\n *\n * An additional subpath export within the package of this version range that\n * could cause the build to break if that new export is used, can be treated as\n * a bug fix. It might make more sense to our users that this new subpath isn't\n * supported yet until we address it as a bug fix. This approach helps maintain\n * stability and prevents unexpected issues during the build process.\n *\n * ## Structure\n * The `VendorImports` type is a nested object where:\n * - The keys at the first level represent the package names.\n * - The keys at the second level represent the version ranges (e.g., `^19.0.0`).\n * - The keys at the third level represent the subpaths within the package (e.g., `.` for the main entry point).\n * - The values at the third level are the relative paths to the corresponding entry points within the package.\n *\n * This structure allows for precise specification of the entry points for\n * different versions and subpaths, ensuring that the correct files are used\n * during the build process.\n */\ntype VendorImports = {\n [packageName: string]: {\n [versionRange: string]: {\n [subpath: string]: string\n }\n }\n}\n\n// Define the vendor packages and their corresponding versions and entry points\nconst VENDOR_IMPORTS: VendorImports = {\n react: {\n '^19.2.0': {\n '.': './cjs/react.production.js',\n './compiler-runtime': './cjs/react-compiler-runtime.production.js',\n './jsx-dev-runtime': './cjs/react-jsx-dev-runtime.production.js',\n './jsx-runtime': './cjs/react-jsx-runtime.production.js',\n './package.json': './package.json',\n },\n },\n 'react-dom': {\n '^19.2.0': {\n '.': './cjs/react-dom.production.js',\n './client': './cjs/react-dom-client.production.js',\n './package.json': './package.json',\n './server': './cjs/react-dom-server-legacy.browser.production.js',\n './server.browser': './cjs/react-dom-server-legacy.browser.production.js',\n './static': './cjs/react-dom-server.browser.production.js',\n './static.browser': './cjs/react-dom-server.browser.production.js',\n },\n },\n}\n\nconst STYLED_COMPONENTS_IMPORTS = {\n 'styled-components': {\n '^6.1.0': {\n '.': './dist/styled-components.browser.esm.js',\n './package.json': './package.json',\n },\n },\n}\n\ninterface VendorBuildOptions {\n basePath: string\n cwd: string\n isApp: boolean\n outputDir: string\n}\n\n/**\n * Builds the ESM browser compatible versions of the vendor packages\n * specified in VENDOR_IMPORTS. Returns the `imports` object of an import map.\n */\nexport async function buildVendorDependencies({\n basePath,\n cwd,\n isApp,\n outputDir,\n}: VendorBuildOptions): Promise<Record<string, string>> {\n const entry: Record<string, string> = {}\n const imports: Record<string, string> = {}\n\n // If we're building an app, we don't need to build the styled-components package\n const vendorImports = isApp ? VENDOR_IMPORTS : {...VENDOR_IMPORTS, ...STYLED_COMPONENTS_IMPORTS}\n\n // Iterate over each package and its version ranges in VENDOR_IMPORTS\n for (const [packageName, ranges] of Object.entries(vendorImports)) {\n const version = await getLocalPackageVersion(packageName, cwd)\n if (!version) {\n throw new Error(`Could not get version for '${packageName}'`)\n }\n\n // Sort version ranges in descending order\n const sortedRanges = Object.keys(ranges).toSorted((range1, range2) => {\n const min1 = minVersion(range1)\n const min2 = minVersion(range2)\n\n if (!min1) throw new Error(`Could not parse range '${range1}'`)\n if (!min2) throw new Error(`Could not parse range '${range2}'`)\n\n // sort them in reverse so we can rely on array `.find` below\n return rcompare(min1.version, min2.version)\n })\n\n // Find the first version range that satisfies the package version\n const matchedRange = sortedRanges.find((range) => satisfies(version, range))\n\n if (!matchedRange) {\n const min = minVersion(sortedRanges.at(-1)!)\n if (!min) {\n throw new Error(`Could not find a minimum version for package '${packageName}'`)\n }\n\n if (gt(min.version, version)) {\n throw new Error(`Package '${packageName}' requires at least ${min.version}.`)\n }\n\n throw new Error(`Version '${version}' of package '${packageName}' is not supported yet.`)\n }\n\n const subpaths = ranges[matchedRange]\n\n // Resolve the actual package directory using Node module resolution,\n // so that hoisted packages in monorepos/workspaces are found correctly\n const packageDir = getLocalPackageDir(packageName, cwd)\n\n // Iterate over each subpath and its corresponding entry point\n for (const [subpath, relativeEntryPoint] of Object.entries(subpaths)) {\n const specifier = path.posix.join(packageName, subpath)\n const chunkName = path.posix.join(\n packageName,\n path.relative(packageName, specifier) || 'index',\n )\n\n entry[chunkName] = path.join(packageDir, relativeEntryPoint)\n imports[specifier] = path.posix.join('/', basePath, VENDOR_DIR, `${chunkName}.mjs`)\n }\n }\n\n // removes the `RollupWatcher` type\n type BuildResult = Exclude<Awaited<ReturnType<typeof build>>, {close: unknown}>\n\n // Use Vite to build the packages into the output directory\n let buildResult = (await build({\n appType: 'custom',\n build: {\n commonjsOptions: {strictRequires: 'auto'},\n emptyOutDir: false, // Rely on CLI to do this\n lib: {entry, formats: ['es']},\n minify: true,\n outDir: path.join(outputDir, VENDOR_DIR),\n rollupOptions: {\n external: createExternalFromImportMap({imports}),\n output: {\n chunkFileNames: '[name]-[hash].mjs',\n entryFileNames: '[name]-[hash].mjs',\n exports: 'named',\n format: 'es',\n },\n treeshake: {preset: 'recommended'},\n },\n },\n // Define a custom cache directory so that sanity's vite cache\n // does not conflict with any potential local vite projects\n cacheDir: `${SANITY_CACHE_DIR}/vite-vendor`,\n configFile: false,\n define: {'process.env.NODE_ENV': JSON.stringify('production')},\n logLevel: 'silent',\n mode: 'production',\n root: cwd,\n })) as BuildResult\n\n buildResult = Array.isArray(buildResult) ? buildResult : [buildResult]\n\n // Create a map of the original import specifiers to their hashed filenames\n const hashedImports: Record<string, string> = {}\n const output = buildResult.flatMap((i) => i.output)\n\n for (const chunk of output) {\n if (chunk.type === 'asset') continue\n\n for (const [specifier, originalPath] of Object.entries(imports)) {\n if (originalPath.endsWith(`${chunk.name}.mjs`)) {\n hashedImports[specifier] = path.posix.join('/', basePath, VENDOR_DIR, chunk.fileName)\n }\n }\n }\n\n return hashedImports\n}\n"],"names":["path","getLocalPackageDir","getLocalPackageVersion","gt","minVersion","rcompare","satisfies","build","SANITY_CACHE_DIR","createExternalFromImportMap","VENDOR_DIR","VENDOR_IMPORTS","react","STYLED_COMPONENTS_IMPORTS","buildVendorDependencies","basePath","cwd","isApp","outputDir","entry","imports","vendorImports","packageName","ranges","Object","entries","version","Error","sortedRanges","keys","toSorted","range1","range2","min1","min2","matchedRange","find","range","min","at","subpaths","packageDir","subpath","relativeEntryPoint","specifier","posix","join","chunkName","relative","buildResult","appType","commonjsOptions","strictRequires","emptyOutDir","lib","formats","minify","outDir","rollupOptions","external","output","chunkFileNames","entryFileNames","exports","format","treeshake","preset","cacheDir","configFile","define","JSON","stringify","logLevel","mode","root","Array","isArray","hashedImports","flatMap","i","chunk","type","originalPath","endsWith","name","fileName"],"mappings":"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"}
@@ -1,9 +1,7 @@
1
1
  import path from 'node:path';
2
- import { readPackageJson } from '@sanity/cli-core';
2
+ import { getLocalPackageVersion, readPackageJson } from '@sanity/cli-core';
3
3
  import { oneline } from 'oneline';
4
4
  import { minVersion, satisfies } from 'semver';
5
- import { determineIsApp } from '../../util/determineIsApp.js';
6
- import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
7
5
  const defaultStudioManifestProps = {
8
6
  name: 'studio',
9
7
  version: '1.0.0'
@@ -20,10 +18,9 @@ const styledComponentsVersionRange = '^6.1.15';
20
18
  *
21
19
  * Additionally, returns the version of the 'sanity' dependency from the package.json.
22
20
  */ export async function checkRequiredDependencies(options) {
23
- const { cliConfig, output, workDir: studioPath } = options;
21
+ const { isApp, output, workDir: studioPath } = options;
24
22
  // currently there's no check needed for core apps,
25
23
  // but this should be removed once they are more mature
26
- const isApp = determineIsApp(cliConfig);
27
24
  if (isApp) {
28
25
  return {
29
26
  installedSanityVersion: ''
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/checkRequiredDependencies.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type CliConfig, type Output, type PackageJson, readPackageJson} from '@sanity/cli-core'\nimport {oneline} from 'oneline'\nimport {minVersion, satisfies, type SemVer} from 'semver'\n\nimport {determineIsApp} from '../../util/determineIsApp.js'\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\n\nconst defaultStudioManifestProps: Partial<PackageJson> = {\n name: 'studio',\n version: '1.0.0',\n}\n\ninterface CheckResult {\n installedSanityVersion: string\n}\n\ninterface CheckRequiredDependenciesOptions {\n cliConfig: CliConfig\n output: Output\n workDir: string\n}\n\nconst styledComponentsVersionRange = '^6.1.15'\n\n/**\n * Checks that the studio has declared and installed the required dependencies\n * needed by the Sanity modules. While we generally use regular, explicit\n * dependencies in modules, there are certain dependencies that are better\n * served being peer dependencies, such as react and styled-components.\n *\n * If these dependencies are not installed/declared, we report an error\n * and instruct the user to install them manually.\n *\n * Additionally, returns the version of the 'sanity' dependency from the package.json.\n */\nexport async function checkRequiredDependencies(\n options: CheckRequiredDependenciesOptions,\n): Promise<CheckResult> {\n const {cliConfig, output, workDir: studioPath} = options\n // currently there's no check needed for core apps,\n // but this should be removed once they are more mature\n const isApp = determineIsApp(cliConfig)\n if (isApp) {\n return {installedSanityVersion: ''}\n }\n\n const [studioPackageManifest, installedStyledComponentsVersion, installedSanityVersion] =\n await Promise.all([\n readPackageJson(path.join(studioPath, 'package.json'), {\n defaults: defaultStudioManifestProps,\n skipSchemaValidation: true,\n }),\n getLocalPackageVersion('styled-components', studioPath),\n getLocalPackageVersion('sanity', studioPath),\n ])\n\n const wantedStyledComponentsVersionRange = styledComponentsVersionRange\n\n // Retrieve the version of the 'sanity' dependency\n if (!installedSanityVersion) {\n output.error('Failed to read the installed sanity version.', {exit: 1})\n return {installedSanityVersion: ''}\n }\n\n // The studio _must_ now declare `styled-components` as a dependency. If it's not there,\n // we'll want to automatically _add it_ to the manifest and tell the user to reinstall\n // dependencies before running whatever command was being run\n const declaredStyledComponentsVersion =\n studioPackageManifest.dependencies?.['styled-components'] ||\n studioPackageManifest?.devDependencies?.['styled-components']\n\n if (!declaredStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` is not installed - run\n \\`npm install\\`, \\`yarn install\\` or \\`pnpm install\\` to install it before re-running this command.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // We ignore catalog identifiers since we check the actual version anyway\n const isStyledComponentsVersionRangeInCatalog =\n declaredStyledComponentsVersion.startsWith('catalog:')\n // Theoretically the version specified in package.json could be incorrect, eg `foo`\n let minDeclaredStyledComponentsVersion: SemVer | null = null\n try {\n minDeclaredStyledComponentsVersion = minVersion(declaredStyledComponentsVersion)\n } catch {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredStyledComponentsVersion && !isStyledComponentsVersionRangeInCatalog) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` has an invalid version range:\n \\`${declaredStyledComponentsVersion}\\`.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // The declared version should be semver-compatible with the version specified as a\n // peer dependency in `sanity`. If not, we should tell the user to change it.\n //\n // Exception: Ranges are hard to compare. `>=5.0.0 && <=5.3.2 || ^6`... Comparing this\n // to anything is going to be challenging, so only compare \"simple\" ranges/versions\n // (^x.x.x / ~x.x.x / x.x.x)\n if (\n !isStyledComponentsVersionRangeInCatalog &&\n isComparableRange(declaredStyledComponentsVersion) &&\n !satisfies(minDeclaredStyledComponentsVersion!, wantedStyledComponentsVersionRange)\n ) {\n output.warn(oneline`\n Declared version of styled-components (${declaredStyledComponentsVersion})\n is not compatible with the version required by sanity (${wantedStyledComponentsVersionRange}).\n This might cause problems!\n `)\n }\n\n // Ensure the studio has _installed_ a version of `styled-components`\n if (!installedStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` is not installed - run\n \\`npm install\\`, \\`yarn install\\` or \\`pnpm install\\` to install it before re-running this command.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // The studio should have an _installed_ version of `styled-components`, and it should\n // be semver compatible with the version specified in `sanity` peer dependencies.\n if (!satisfies(installedStyledComponentsVersion, wantedStyledComponentsVersionRange)) {\n output.warn(oneline`\n Installed version of styled-components (${installedStyledComponentsVersion})\n is not compatible with the version required by sanity (${wantedStyledComponentsVersionRange}).\n This might cause problems!\n `)\n }\n\n return {installedSanityVersion}\n}\n\nfunction isComparableRange(range: string): boolean {\n return /^[\\^~]?\\d+(\\.\\d+)?(\\.\\d+)?$/.test(range)\n}\n"],"names":["path","readPackageJson","oneline","minVersion","satisfies","determineIsApp","getLocalPackageVersion","defaultStudioManifestProps","name","version","styledComponentsVersionRange","checkRequiredDependencies","options","cliConfig","output","workDir","studioPath","isApp","installedSanityVersion","studioPackageManifest","installedStyledComponentsVersion","Promise","all","join","defaults","skipSchemaValidation","wantedStyledComponentsVersionRange","error","exit","declaredStyledComponentsVersion","dependencies","devDependencies","isStyledComponentsVersionRangeInCatalog","startsWith","minDeclaredStyledComponentsVersion","isComparableRange","warn","range","test"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SAAuDC,eAAe,QAAO,mBAAkB;AAC/F,SAAQC,OAAO,QAAO,UAAS;AAC/B,SAAQC,UAAU,EAAEC,SAAS,QAAoB,SAAQ;AAEzD,SAAQC,cAAc,QAAO,+BAA8B;AAC3D,SAAQC,sBAAsB,QAAO,uCAAsC;AAE3E,MAAMC,6BAAmD;IACvDC,MAAM;IACNC,SAAS;AACX;AAYA,MAAMC,+BAA+B;AAErC;;;;;;;;;;CAUC,GACD,OAAO,eAAeC,0BACpBC,OAAyC;IAEzC,MAAM,EAACC,SAAS,EAAEC,MAAM,EAAEC,SAASC,UAAU,EAAC,GAAGJ;IACjD,mDAAmD;IACnD,uDAAuD;IACvD,MAAMK,QAAQZ,eAAeQ;IAC7B,IAAII,OAAO;QACT,OAAO;YAACC,wBAAwB;QAAE;IACpC;IAEA,MAAM,CAACC,uBAAuBC,kCAAkCF,uBAAuB,GACrF,MAAMG,QAAQC,GAAG,CAAC;QAChBrB,gBAAgBD,KAAKuB,IAAI,CAACP,YAAY,iBAAiB;YACrDQ,UAAUjB;YACVkB,sBAAsB;QACxB;QACAnB,uBAAuB,qBAAqBU;QAC5CV,uBAAuB,UAAUU;KAClC;IAEH,MAAMU,qCAAqChB;IAE3C,kDAAkD;IAClD,IAAI,CAACQ,wBAAwB;QAC3BJ,OAAOa,KAAK,CAAC,gDAAgD;YAACC,MAAM;QAAC;QACrE,OAAO;YAACV,wBAAwB;QAAE;IACpC;IAEA,wFAAwF;IACxF,sFAAsF;IACtF,6DAA6D;IAC7D,MAAMW,kCACJV,sBAAsBW,YAAY,EAAE,CAAC,oBAAoB,IACzDX,uBAAuBY,iBAAiB,CAAC,oBAAoB;IAE/D,IAAI,CAACF,iCAAiC;QACpCf,OAAOa,KAAK,CACVzB,OAAO,CAAC;;;IAGV,CAAC,EACC;YAAC0B,MAAM;QAAC;QAEV,OAAO;YAACV;QAAsB;IAChC;IAEA,yEAAyE;IACzE,MAAMc,0CACJH,gCAAgCI,UAAU,CAAC;IAC7C,mFAAmF;IACnF,IAAIC,qCAAoD;IACxD,IAAI;QACFA,qCAAqC/B,WAAW0B;IAClD,EAAE,OAAM;IACN,2EAA2E;IAC7E;IAEA,IAAI,CAACK,sCAAsC,CAACF,yCAAyC;QACnFlB,OAAOa,KAAK,CACVzB,OAAO,CAAC;;QAEN,EAAE2B,gCAAgC;IACtC,CAAC,EACC;YAACD,MAAM;QAAC;QAEV,OAAO;YAACV;QAAsB;IAChC;IAEA,mFAAmF;IACnF,6EAA6E;IAC7E,EAAE;IACF,sFAAsF;IACtF,mFAAmF;IACnF,4BAA4B;IAC5B,IACE,CAACc,2CACDG,kBAAkBN,oCAClB,CAACzB,UAAU8B,oCAAqCR,qCAChD;QACAZ,OAAOsB,IAAI,CAAClC,OAAO,CAAC;6CACqB,EAAE2B,gCAAgC;6DAClB,EAAEH,mCAAmC;;IAE9F,CAAC;IACH;IAEA,qEAAqE;IACrE,IAAI,CAACN,kCAAkC;QACrCN,OAAOa,KAAK,CACVzB,OAAO,CAAC;;;IAGV,CAAC,EACC;YAAC0B,MAAM;QAAC;QAEV,OAAO;YAACV;QAAsB;IAChC;IAEA,sFAAsF;IACtF,iFAAiF;IACjF,IAAI,CAACd,UAAUgB,kCAAkCM,qCAAqC;QACpFZ,OAAOsB,IAAI,CAAClC,OAAO,CAAC;8CACsB,EAAEkB,iCAAiC;6DACpB,EAAEM,mCAAmC;;IAE9F,CAAC;IACH;IAEA,OAAO;QAACR;IAAsB;AAChC;AAEA,SAASiB,kBAAkBE,KAAa;IACtC,OAAO,8BAA8BC,IAAI,CAACD;AAC5C"}
1
+ {"version":3,"sources":["../../../src/actions/build/checkRequiredDependencies.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {\n getLocalPackageVersion,\n type Output,\n type PackageJson,\n readPackageJson,\n} from '@sanity/cli-core'\nimport {oneline} from 'oneline'\nimport {minVersion, satisfies, type SemVer} from 'semver'\n\nconst defaultStudioManifestProps: Partial<PackageJson> = {\n name: 'studio',\n version: '1.0.0',\n}\n\ninterface CheckResult {\n installedSanityVersion: string\n}\n\ninterface CheckRequiredDependenciesOptions {\n isApp: boolean\n output: Output\n workDir: string\n}\n\nconst styledComponentsVersionRange = '^6.1.15'\n\n/**\n * Checks that the studio has declared and installed the required dependencies\n * needed by the Sanity modules. While we generally use regular, explicit\n * dependencies in modules, there are certain dependencies that are better\n * served being peer dependencies, such as react and styled-components.\n *\n * If these dependencies are not installed/declared, we report an error\n * and instruct the user to install them manually.\n *\n * Additionally, returns the version of the 'sanity' dependency from the package.json.\n */\nexport async function checkRequiredDependencies(\n options: CheckRequiredDependenciesOptions,\n): Promise<CheckResult> {\n const {isApp, output, workDir: studioPath} = options\n // currently there's no check needed for core apps,\n // but this should be removed once they are more mature\n if (isApp) {\n return {installedSanityVersion: ''}\n }\n\n const [studioPackageManifest, installedStyledComponentsVersion, installedSanityVersion] =\n await Promise.all([\n readPackageJson(path.join(studioPath, 'package.json'), {\n defaults: defaultStudioManifestProps,\n skipSchemaValidation: true,\n }),\n getLocalPackageVersion('styled-components', studioPath),\n getLocalPackageVersion('sanity', studioPath),\n ])\n\n const wantedStyledComponentsVersionRange = styledComponentsVersionRange\n\n // Retrieve the version of the 'sanity' dependency\n if (!installedSanityVersion) {\n output.error('Failed to read the installed sanity version.', {exit: 1})\n return {installedSanityVersion: ''}\n }\n\n // The studio _must_ now declare `styled-components` as a dependency. If it's not there,\n // we'll want to automatically _add it_ to the manifest and tell the user to reinstall\n // dependencies before running whatever command was being run\n const declaredStyledComponentsVersion =\n studioPackageManifest.dependencies?.['styled-components'] ||\n studioPackageManifest?.devDependencies?.['styled-components']\n\n if (!declaredStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` is not installed - run\n \\`npm install\\`, \\`yarn install\\` or \\`pnpm install\\` to install it before re-running this command.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // We ignore catalog identifiers since we check the actual version anyway\n const isStyledComponentsVersionRangeInCatalog =\n declaredStyledComponentsVersion.startsWith('catalog:')\n // Theoretically the version specified in package.json could be incorrect, eg `foo`\n let minDeclaredStyledComponentsVersion: SemVer | null = null\n try {\n minDeclaredStyledComponentsVersion = minVersion(declaredStyledComponentsVersion)\n } catch {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredStyledComponentsVersion && !isStyledComponentsVersionRangeInCatalog) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` has an invalid version range:\n \\`${declaredStyledComponentsVersion}\\`.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // The declared version should be semver-compatible with the version specified as a\n // peer dependency in `sanity`. If not, we should tell the user to change it.\n //\n // Exception: Ranges are hard to compare. `>=5.0.0 && <=5.3.2 || ^6`... Comparing this\n // to anything is going to be challenging, so only compare \"simple\" ranges/versions\n // (^x.x.x / ~x.x.x / x.x.x)\n if (\n !isStyledComponentsVersionRangeInCatalog &&\n isComparableRange(declaredStyledComponentsVersion) &&\n !satisfies(minDeclaredStyledComponentsVersion!, wantedStyledComponentsVersionRange)\n ) {\n output.warn(oneline`\n Declared version of styled-components (${declaredStyledComponentsVersion})\n is not compatible with the version required by sanity (${wantedStyledComponentsVersionRange}).\n This might cause problems!\n `)\n }\n\n // Ensure the studio has _installed_ a version of `styled-components`\n if (!installedStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` is not installed - run\n \\`npm install\\`, \\`yarn install\\` or \\`pnpm install\\` to install it before re-running this command.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // The studio should have an _installed_ version of `styled-components`, and it should\n // be semver compatible with the version specified in `sanity` peer dependencies.\n if (!satisfies(installedStyledComponentsVersion, wantedStyledComponentsVersionRange)) {\n output.warn(oneline`\n Installed version of styled-components (${installedStyledComponentsVersion})\n is not compatible with the version required by sanity (${wantedStyledComponentsVersionRange}).\n This might cause problems!\n `)\n }\n\n return {installedSanityVersion}\n}\n\nfunction isComparableRange(range: string): boolean {\n return /^[\\^~]?\\d+(\\.\\d+)?(\\.\\d+)?$/.test(range)\n}\n"],"names":["path","getLocalPackageVersion","readPackageJson","oneline","minVersion","satisfies","defaultStudioManifestProps","name","version","styledComponentsVersionRange","checkRequiredDependencies","options","isApp","output","workDir","studioPath","installedSanityVersion","studioPackageManifest","installedStyledComponentsVersion","Promise","all","join","defaults","skipSchemaValidation","wantedStyledComponentsVersionRange","error","exit","declaredStyledComponentsVersion","dependencies","devDependencies","isStyledComponentsVersionRangeInCatalog","startsWith","minDeclaredStyledComponentsVersion","isComparableRange","warn","range","test"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SACEC,sBAAsB,EAGtBC,eAAe,QACV,mBAAkB;AACzB,SAAQC,OAAO,QAAO,UAAS;AAC/B,SAAQC,UAAU,EAAEC,SAAS,QAAoB,SAAQ;AAEzD,MAAMC,6BAAmD;IACvDC,MAAM;IACNC,SAAS;AACX;AAYA,MAAMC,+BAA+B;AAErC;;;;;;;;;;CAUC,GACD,OAAO,eAAeC,0BACpBC,OAAyC;IAEzC,MAAM,EAACC,KAAK,EAAEC,MAAM,EAAEC,SAASC,UAAU,EAAC,GAAGJ;IAC7C,mDAAmD;IACnD,uDAAuD;IACvD,IAAIC,OAAO;QACT,OAAO;YAACI,wBAAwB;QAAE;IACpC;IAEA,MAAM,CAACC,uBAAuBC,kCAAkCF,uBAAuB,GACrF,MAAMG,QAAQC,GAAG,CAAC;QAChBlB,gBAAgBF,KAAKqB,IAAI,CAACN,YAAY,iBAAiB;YACrDO,UAAUhB;YACViB,sBAAsB;QACxB;QACAtB,uBAAuB,qBAAqBc;QAC5Cd,uBAAuB,UAAUc;KAClC;IAEH,MAAMS,qCAAqCf;IAE3C,kDAAkD;IAClD,IAAI,CAACO,wBAAwB;QAC3BH,OAAOY,KAAK,CAAC,gDAAgD;YAACC,MAAM;QAAC;QACrE,OAAO;YAACV,wBAAwB;QAAE;IACpC;IAEA,wFAAwF;IACxF,sFAAsF;IACtF,6DAA6D;IAC7D,MAAMW,kCACJV,sBAAsBW,YAAY,EAAE,CAAC,oBAAoB,IACzDX,uBAAuBY,iBAAiB,CAAC,oBAAoB;IAE/D,IAAI,CAACF,iCAAiC;QACpCd,OAAOY,KAAK,CACVtB,OAAO,CAAC;;;IAGV,CAAC,EACC;YAACuB,MAAM;QAAC;QAEV,OAAO;YAACV;QAAsB;IAChC;IAEA,yEAAyE;IACzE,MAAMc,0CACJH,gCAAgCI,UAAU,CAAC;IAC7C,mFAAmF;IACnF,IAAIC,qCAAoD;IACxD,IAAI;QACFA,qCAAqC5B,WAAWuB;IAClD,EAAE,OAAM;IACN,2EAA2E;IAC7E;IAEA,IAAI,CAACK,sCAAsC,CAACF,yCAAyC;QACnFjB,OAAOY,KAAK,CACVtB,OAAO,CAAC;;QAEN,EAAEwB,gCAAgC;IACtC,CAAC,EACC;YAACD,MAAM;QAAC;QAEV,OAAO;YAACV;QAAsB;IAChC;IAEA,mFAAmF;IACnF,6EAA6E;IAC7E,EAAE;IACF,sFAAsF;IACtF,mFAAmF;IACnF,4BAA4B;IAC5B,IACE,CAACc,2CACDG,kBAAkBN,oCAClB,CAACtB,UAAU2B,oCAAqCR,qCAChD;QACAX,OAAOqB,IAAI,CAAC/B,OAAO,CAAC;6CACqB,EAAEwB,gCAAgC;6DAClB,EAAEH,mCAAmC;;IAE9F,CAAC;IACH;IAEA,qEAAqE;IACrE,IAAI,CAACN,kCAAkC;QACrCL,OAAOY,KAAK,CACVtB,OAAO,CAAC;;;IAGV,CAAC,EACC;YAACuB,MAAM;QAAC;QAEV,OAAO;YAACV;QAAsB;IAChC;IAEA,sFAAsF;IACtF,iFAAiF;IACjF,IAAI,CAACX,UAAUa,kCAAkCM,qCAAqC;QACpFX,OAAOqB,IAAI,CAAC/B,OAAO,CAAC;8CACsB,EAAEe,iCAAiC;6DACpB,EAAEM,mCAAmC;;IAE9F,CAAC;IACH;IAEA,OAAO;QAACR;IAAsB;AAChC;AAEA,SAASiB,kBAAkBE,KAAa;IACtC,OAAO,8BAA8BC,IAAI,CAACD;AAC5C"}
@@ -1,7 +1,6 @@
1
1
  import path from 'node:path';
2
- import { readPackageJson } from '@sanity/cli-core';
2
+ import { getLocalPackageVersion, readPackageJson } from '@sanity/cli-core';
3
3
  import { coerce, gtr, ltr, rcompare, satisfies } from 'semver';
4
- import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
5
4
  // NOTE: when doing changes here, also remember to update versions in help docs at
6
5
  // https://sanity.io/admin/structure/docs;helpArticle;upgrade-packages
7
6
  const DEFAULT_PACKAGES = [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/checkStudioDependencyVersions.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type Output, readPackageJson} from '@sanity/cli-core'\nimport {coerce, gtr, ltr, rcompare, satisfies, type SemVer} from 'semver'\n\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\n\ninterface PackageInfo {\n deprecatedBelow: string | null\n installed: SemVer\n isDeprecated: boolean\n isUnsupported: boolean\n isUntested: boolean\n name: string\n supported: string[]\n}\n\ninterface TrackedPackage {\n deprecatedBelow: string | null\n name: string\n supported: string[]\n}\n\n// NOTE: when doing changes here, also remember to update versions in help docs at\n// https://sanity.io/admin/structure/docs;helpArticle;upgrade-packages\nconst DEFAULT_PACKAGES: TrackedPackage[] = [\n {deprecatedBelow: null, name: 'react', supported: ['^19.2.2']},\n {deprecatedBelow: null, name: 'react-dom', supported: ['^19.2.2']},\n {deprecatedBelow: null, name: 'styled-components', supported: ['^6']},\n {deprecatedBelow: '^3', name: '@sanity/ui', supported: ['^2', '^3']},\n]\n\nexport async function checkStudioDependencyVersions(\n workDir: string,\n output: Output,\n {packages = DEFAULT_PACKAGES}: {packages?: TrackedPackage[]} = {},\n): Promise<void> {\n const manifest = await readPackageJson(path.join(workDir, 'package.json'), {\n skipSchemaValidation: true,\n })\n const dependencies = {...manifest?.dependencies, ...manifest?.devDependencies}\n\n const packageInfo = packages.map(async (pkg): Promise<false | PackageInfo> => {\n const dependency = dependencies[pkg.name]\n if (!dependency) {\n return false\n }\n\n const packageVersion = await getLocalPackageVersion(pkg.name, workDir)\n const installed = coerce(packageVersion ?? dependency.replaceAll(/[\\D.]/g, ''))\n\n if (!installed) {\n return false\n }\n\n const supported = pkg.supported.join(' || ')\n\n // \"Untested\" is usually the case where we have not upgraded the React version requirements\n // before a release, but given that is usually works in a backwards-compatible way, we want\n // to indicate that it's _untested_, not necessarily _unsupported_\n // Ex: Installed is react@20.0.0, but we've only _tested_ with react@^19\n const isUntested = !satisfies(installed, supported) && gtr(installed, supported)\n\n // \"Unsupported\" in that the installed version is _lower than_ the minimum version\n // Ex: Installed is react@18.0.0, but we require react@^19.2\n const isUnsupported = !satisfies(installed, supported) && !isUntested\n\n // \"Deprecated\" in that we will stop supporting it at some point in the near future,\n // so users should be prompted to upgrade\n const isDeprecated = pkg.deprecatedBelow ? ltr(installed, pkg.deprecatedBelow) : false\n\n return {\n ...pkg,\n installed,\n isDeprecated,\n isUnsupported,\n isUntested,\n }\n })\n\n const installedPackages = (await Promise.all(packageInfo)).filter(\n (inp): inp is PackageInfo => inp !== false,\n )\n const unsupported = installedPackages.filter((pkg) => pkg.isUnsupported)\n const deprecated = installedPackages.filter((pkg) => !pkg.isUnsupported && pkg.isDeprecated)\n const untested = installedPackages.filter((pkg) => pkg.isUntested)\n\n if (deprecated.length > 0) {\n output.warn(`The following package versions have been deprecated and should be upgraded:\n\n ${listPackages(deprecated)}\n\nSupport for these will be removed in a future release!\n\n ${getUpgradeInstructions(deprecated)}\n`)\n }\n\n if (untested.length > 0) {\n output.warn(`The following package versions have not yet been marked as supported:\n\n ${listPackages(untested)}\n\nYou _may_ encounter bugs while using these versions.\n\n ${getDowngradeInstructions(untested)}\n`)\n }\n\n if (unsupported.length > 0) {\n output.error(\n `The following package versions are no longer supported and needs to be upgraded:\n\n ${listPackages(unsupported)}\n\n ${getUpgradeInstructions(unsupported)}\n`,\n {exit: 1},\n )\n }\n}\n\nfunction listPackages(pkgs: PackageInfo[]) {\n return pkgs\n .map(\n (pkg) =>\n `${pkg.name} (installed: ${pkg.installed}, want: ${\n pkg.deprecatedBelow || pkg.supported.join(' || ')\n })`,\n )\n .join('\\n ')\n}\n\nfunction getUpgradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (coerce(version) || {version: ''}).version)\n .toSorted(rcompare)\n\n return `\"${pkg.name}@^${highestSupported}\"`\n })\n .join(' ')\n\n return `To upgrade, run either:\n\n npm install ${inst}\n\n or\n\n yarn add ${inst}\n\n or\n\n pnpm add ${inst}\n\n\nRead more at https://www.sanity.io/docs/help/upgrade-packages`\n}\n\nfunction getDowngradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (coerce(version) || {version: ''}).version)\n .toSorted(rcompare)\n\n return `\"${pkg.name}@^${highestSupported}\"`\n })\n .join(' ')\n\n return `To downgrade, run either:\n\n yarn add ${inst}\n\n or\n\n npm install ${inst}\n\n or\n\n pnpm install ${inst}`\n}\n"],"names":["path","readPackageJson","coerce","gtr","ltr","rcompare","satisfies","getLocalPackageVersion","DEFAULT_PACKAGES","deprecatedBelow","name","supported","checkStudioDependencyVersions","workDir","output","packages","manifest","join","skipSchemaValidation","dependencies","devDependencies","packageInfo","map","pkg","dependency","packageVersion","installed","replaceAll","isUntested","isUnsupported","isDeprecated","installedPackages","Promise","all","filter","inp","unsupported","deprecated","untested","length","warn","listPackages","getUpgradeInstructions","getDowngradeInstructions","error","exit","pkgs","inst","highestSupported","version","toSorted"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/build/checkStudioDependencyVersions.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {getLocalPackageVersion, type Output, readPackageJson} from '@sanity/cli-core'\nimport {coerce, gtr, ltr, rcompare, satisfies, type SemVer} from 'semver'\n\ninterface PackageInfo {\n deprecatedBelow: string | null\n installed: SemVer\n isDeprecated: boolean\n isUnsupported: boolean\n isUntested: boolean\n name: string\n supported: string[]\n}\n\ninterface TrackedPackage {\n deprecatedBelow: string | null\n name: string\n supported: string[]\n}\n\n// NOTE: when doing changes here, also remember to update versions in help docs at\n// https://sanity.io/admin/structure/docs;helpArticle;upgrade-packages\nconst DEFAULT_PACKAGES: TrackedPackage[] = [\n {deprecatedBelow: null, name: 'react', supported: ['^19.2.2']},\n {deprecatedBelow: null, name: 'react-dom', supported: ['^19.2.2']},\n {deprecatedBelow: null, name: 'styled-components', supported: ['^6']},\n {deprecatedBelow: '^3', name: '@sanity/ui', supported: ['^2', '^3']},\n]\n\nexport async function checkStudioDependencyVersions(\n workDir: string,\n output: Output,\n {packages = DEFAULT_PACKAGES}: {packages?: TrackedPackage[]} = {},\n): Promise<void> {\n const manifest = await readPackageJson(path.join(workDir, 'package.json'), {\n skipSchemaValidation: true,\n })\n const dependencies = {...manifest?.dependencies, ...manifest?.devDependencies}\n\n const packageInfo = packages.map(async (pkg): Promise<false | PackageInfo> => {\n const dependency = dependencies[pkg.name]\n if (!dependency) {\n return false\n }\n\n const packageVersion = await getLocalPackageVersion(pkg.name, workDir)\n const installed = coerce(packageVersion ?? dependency.replaceAll(/[\\D.]/g, ''))\n\n if (!installed) {\n return false\n }\n\n const supported = pkg.supported.join(' || ')\n\n // \"Untested\" is usually the case where we have not upgraded the React version requirements\n // before a release, but given that is usually works in a backwards-compatible way, we want\n // to indicate that it's _untested_, not necessarily _unsupported_\n // Ex: Installed is react@20.0.0, but we've only _tested_ with react@^19\n const isUntested = !satisfies(installed, supported) && gtr(installed, supported)\n\n // \"Unsupported\" in that the installed version is _lower than_ the minimum version\n // Ex: Installed is react@18.0.0, but we require react@^19.2\n const isUnsupported = !satisfies(installed, supported) && !isUntested\n\n // \"Deprecated\" in that we will stop supporting it at some point in the near future,\n // so users should be prompted to upgrade\n const isDeprecated = pkg.deprecatedBelow ? ltr(installed, pkg.deprecatedBelow) : false\n\n return {\n ...pkg,\n installed,\n isDeprecated,\n isUnsupported,\n isUntested,\n }\n })\n\n const installedPackages = (await Promise.all(packageInfo)).filter(\n (inp): inp is PackageInfo => inp !== false,\n )\n const unsupported = installedPackages.filter((pkg) => pkg.isUnsupported)\n const deprecated = installedPackages.filter((pkg) => !pkg.isUnsupported && pkg.isDeprecated)\n const untested = installedPackages.filter((pkg) => pkg.isUntested)\n\n if (deprecated.length > 0) {\n output.warn(`The following package versions have been deprecated and should be upgraded:\n\n ${listPackages(deprecated)}\n\nSupport for these will be removed in a future release!\n\n ${getUpgradeInstructions(deprecated)}\n`)\n }\n\n if (untested.length > 0) {\n output.warn(`The following package versions have not yet been marked as supported:\n\n ${listPackages(untested)}\n\nYou _may_ encounter bugs while using these versions.\n\n ${getDowngradeInstructions(untested)}\n`)\n }\n\n if (unsupported.length > 0) {\n output.error(\n `The following package versions are no longer supported and needs to be upgraded:\n\n ${listPackages(unsupported)}\n\n ${getUpgradeInstructions(unsupported)}\n`,\n {exit: 1},\n )\n }\n}\n\nfunction listPackages(pkgs: PackageInfo[]) {\n return pkgs\n .map(\n (pkg) =>\n `${pkg.name} (installed: ${pkg.installed}, want: ${\n pkg.deprecatedBelow || pkg.supported.join(' || ')\n })`,\n )\n .join('\\n ')\n}\n\nfunction getUpgradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (coerce(version) || {version: ''}).version)\n .toSorted(rcompare)\n\n return `\"${pkg.name}@^${highestSupported}\"`\n })\n .join(' ')\n\n return `To upgrade, run either:\n\n npm install ${inst}\n\n or\n\n yarn add ${inst}\n\n or\n\n pnpm add ${inst}\n\n\nRead more at https://www.sanity.io/docs/help/upgrade-packages`\n}\n\nfunction getDowngradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (coerce(version) || {version: ''}).version)\n .toSorted(rcompare)\n\n return `\"${pkg.name}@^${highestSupported}\"`\n })\n .join(' ')\n\n return `To downgrade, run either:\n\n yarn add ${inst}\n\n or\n\n npm install ${inst}\n\n or\n\n pnpm install ${inst}`\n}\n"],"names":["path","getLocalPackageVersion","readPackageJson","coerce","gtr","ltr","rcompare","satisfies","DEFAULT_PACKAGES","deprecatedBelow","name","supported","checkStudioDependencyVersions","workDir","output","packages","manifest","join","skipSchemaValidation","dependencies","devDependencies","packageInfo","map","pkg","dependency","packageVersion","installed","replaceAll","isUntested","isUnsupported","isDeprecated","installedPackages","Promise","all","filter","inp","unsupported","deprecated","untested","length","warn","listPackages","getUpgradeInstructions","getDowngradeInstructions","error","exit","pkgs","inst","highestSupported","version","toSorted"],"mappings":"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"}
@@ -4,6 +4,7 @@ import viteReact from '@vitejs/plugin-react';
4
4
  import debug from 'debug';
5
5
  import { readPackageUp } from 'read-package-up';
6
6
  import { mergeConfig } from 'vite';
7
+ import { SANITY_CACHE_DIR } from '../../constants.js';
7
8
  import { sanityBuildEntries } from '../../server/vite/plugin-sanity-build-entries.js';
8
9
  import { sanityFaviconsPlugin } from '../../server/vite/plugin-sanity-favicons.js';
9
10
  import { sanityRuntimeRewritePlugin } from '../../server/vite/plugin-sanity-runtime-rewrite.js';
@@ -45,7 +46,7 @@ import { normalizeBasePath } from './normalizeBasePath.js';
45
46
  },
46
47
  // Define a custom cache directory so that sanity's vite cache
47
48
  // does not conflict with any potential local vite projects
48
- cacheDir: 'node_modules/.sanity/vite',
49
+ cacheDir: `${SANITY_CACHE_DIR}/vite`,
49
50
  configFile: false,
50
51
  define: {
51
52
  __SANITY_BUILD_TIMESTAMP__: JSON.stringify(Date.now()),