@sanity/cli 7.4.0 → 7.4.2

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 (59) hide show
  1. package/README.md +25 -1
  2. package/dist/actions/build/buildApp.js +20 -17
  3. package/dist/actions/build/buildApp.js.map +1 -1
  4. package/dist/actions/build/buildStudio.js +23 -21
  5. package/dist/actions/build/buildStudio.js.map +1 -1
  6. package/dist/actions/dev/devAction.js +46 -197
  7. package/dist/actions/dev/devAction.js.map +1 -1
  8. package/dist/actions/dev/servers/getDevServerConfig.js +1 -1
  9. package/dist/actions/dev/servers/getDevServerConfig.js.map +1 -1
  10. package/dist/actions/dev/servers/startAppDevServer.js +18 -9
  11. package/dist/actions/dev/servers/startAppDevServer.js.map +1 -1
  12. package/dist/actions/dev/servers/startStudioDevServer.js +2 -2
  13. package/dist/actions/dev/servers/startStudioDevServer.js.map +1 -1
  14. package/dist/actions/dev/types.js.map +1 -1
  15. package/dist/actions/{dev/registration/extractDevServerManifest.js → manifest/extractStudioManifest.js} +3 -3
  16. package/dist/actions/manifest/extractStudioManifest.js.map +1 -0
  17. package/dist/actions/mcp/editorConfigs.js +8 -4
  18. package/dist/actions/mcp/editorConfigs.js.map +1 -1
  19. package/dist/commands/datasets/copy.js +17 -19
  20. package/dist/commands/datasets/copy.js.map +1 -1
  21. package/dist/commands/datasets/import.js +11 -15
  22. package/dist/commands/datasets/import.js.map +1 -1
  23. package/dist/commands/doctor.js +9 -9
  24. package/dist/commands/doctor.js.map +1 -1
  25. package/dist/commands/telemetry/disable.js +3 -3
  26. package/dist/commands/telemetry/disable.js.map +1 -1
  27. package/dist/commands/telemetry/enable.js +3 -3
  28. package/dist/commands/telemetry/enable.js.map +1 -1
  29. package/dist/commands/telemetry/status.js +2 -2
  30. package/dist/commands/telemetry/status.js.map +1 -1
  31. package/dist/exports/_internal.d.ts +4 -47
  32. package/dist/exports/_internal.js +1 -1
  33. package/dist/exports/_internal.js.map +1 -1
  34. package/dist/server/devServer.js +1 -1
  35. package/dist/server/devServer.js.map +1 -1
  36. package/dist/util/compareDependencyVersions.js.map +1 -1
  37. package/oclif.manifest.json +1 -1
  38. package/package.json +9 -8
  39. package/dist/actions/build/buildStaticFiles.js +0 -144
  40. package/dist/actions/build/buildStaticFiles.js.map +0 -1
  41. package/dist/actions/build/getEnvironmentVariables.js +0 -54
  42. package/dist/actions/build/getEnvironmentVariables.js.map +0 -1
  43. package/dist/actions/dev/registration/deriveInterfaces.js +0 -46
  44. package/dist/actions/dev/registration/deriveInterfaces.js.map +0 -1
  45. package/dist/actions/dev/registration/extractDevServerManifest.js.map +0 -1
  46. package/dist/actions/dev/registration/interfaceSetId.js +0 -41
  47. package/dist/actions/dev/registration/interfaceSetId.js.map +0 -1
  48. package/dist/actions/dev/registration/startDevManifestWatcher.js +0 -104
  49. package/dist/actions/dev/registration/startDevManifestWatcher.js.map +0 -1
  50. package/dist/actions/dev/registration/startDevServerRegistration.js +0 -121
  51. package/dist/actions/dev/registration/startDevServerRegistration.js.map +0 -1
  52. package/dist/actions/dev/workbench/startWorkbenchDevServer.js +0 -276
  53. package/dist/actions/dev/workbench/startWorkbenchDevServer.js.map +0 -1
  54. package/dist/actions/dev/workbench/writeWorkbenchRuntime.js +0 -66
  55. package/dist/actions/dev/workbench/writeWorkbenchRuntime.js.map +0 -1
  56. package/dist/util/formatSize.js +0 -10
  57. package/dist/util/formatSize.js.map +0 -1
  58. package/dist/util/moduleFormatUtils.js +0 -18
  59. package/dist/util/moduleFormatUtils.js.map +0 -1
package/README.md CHANGED
@@ -103,6 +103,7 @@ Code for sanity cli
103
103
  - [`sanity schemas extract`](#sanity-schemas-extract)
104
104
  - [`sanity schemas list`](#sanity-schemas-list)
105
105
  - [`sanity schemas validate`](#sanity-schemas-validate)
106
+ - [`sanity skills install`](#sanity-skills-install)
106
107
  - [`sanity telemetry disable`](#sanity-telemetry-disable)
107
108
  - [`sanity telemetry enable`](#sanity-telemetry-enable)
108
109
  - [`sanity telemetry status`](#sanity-telemetry-status)
@@ -501,7 +502,7 @@ USAGE
501
502
  --stack-id <value> | --stack-name <value>] [--project-id <value> | --organization-id <value>]
502
503
 
503
504
  ARGUMENTS
504
- [DIR] Directory to create the local Blueprint in
505
+ [DIR] Directory to create the local Blueprint in (defaults to the current directory)
505
506
 
506
507
  FLAGS
507
508
  --blueprint-type=<option> Blueprint manifest type to use for the local Blueprint
@@ -528,9 +529,14 @@ DESCRIPTION
528
529
 
529
530
  After initialization, use 'blueprints plan' to preview changes, then 'blueprints deploy' to apply them.
530
531
 
532
+ Running without a directory prompts to confirm the current directory. Run 'blueprints init .' to initialize in the
533
+ current directory without a prompt.
534
+
531
535
  EXAMPLES
532
536
  $ sanity blueprints init
533
537
 
538
+ $ sanity blueprints init .
539
+
534
540
  $ sanity blueprints init [directory]
535
541
 
536
542
  $ sanity blueprints init --blueprint-type <json|js|ts>
@@ -3185,6 +3191,24 @@ EXAMPLES
3185
3191
  $ sanity schemas validate --debug-metafile-path metafile.json
3186
3192
  ```
3187
3193
 
3194
+ ## `sanity skills install`
3195
+
3196
+ Install Sanity agent skills for detected AI editors (Antigravity, Claude Code, Cline, Cline CLI, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, VS Code, VS Code Insiders)
3197
+
3198
+ ```
3199
+ USAGE
3200
+ $ sanity skills install
3201
+
3202
+ DESCRIPTION
3203
+ Install Sanity agent skills for detected AI editors (Antigravity, Claude Code, Cline, Cline CLI, Codex CLI, Cursor,
3204
+ Gemini CLI, GitHub Copilot CLI, OpenCode, VS Code, VS Code Insiders)
3205
+
3206
+ EXAMPLES
3207
+ Install Sanity agent skills for detected AI editors
3208
+
3209
+ $ sanity skills install
3210
+ ```
3211
+
3188
3212
  ## `sanity telemetry disable`
3189
3213
 
3190
3214
  Disable telemetry for your account
@@ -1,18 +1,16 @@
1
1
  import { rm } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { styleText } from 'node:util';
4
- import { AppBuildTrace, buildDebug, getAutoUpdatesCssUrls, getAutoUpdatesImportMap, resolveVendorBuildConfig } from '@sanity/cli-build/_internal/build';
4
+ import { AppBuildTrace, buildDebug, buildStaticFiles, formatModuleSizes, getAutoUpdatesCssUrls, getAutoUpdatesImportMap, resolveVendorBuildConfig, sortModulesBySize } from '@sanity/cli-build/_internal/build';
5
+ import { getAppEnvironmentVariables } from '@sanity/cli-build/_internal/env';
5
6
  import { getCliTelemetry, getLocalPackageVersion, getTimer, isInteractive } from '@sanity/cli-core';
6
7
  import { confirm, logSymbols, spinner } from '@sanity/cli-core/ux';
7
8
  import { resolveWorkbenchApp } from '@sanity/workbench-cli/build';
8
9
  import { parse as semverParse } from 'semver';
9
10
  import { getAppId } from '../../util/appId.js';
10
11
  import { compareDependencyVersions } from '../../util/compareDependencyVersions.js';
11
- import { formatModuleSizes, sortModulesBySize } from '../../util/moduleFormatUtils.js';
12
12
  import { warnAboutMissingAppId } from '../../util/warnAboutMissingAppId.js';
13
- import { buildStaticFiles } from './buildStaticFiles.js';
14
13
  import { determineBasePath } from './determineBasePath.js';
15
- import { getAppEnvironmentVariables } from './getEnvironmentVariables.js';
16
14
  import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
17
15
  /**
18
16
  * Build the Sanity app.
@@ -24,11 +22,25 @@ import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
24
22
  // `views`/`services` live on the branded `unstable_defineApp` result, not the
25
23
  // legacy `app` config object — resolve the workbench capability to read them.
26
24
  const workbench = resolveWorkbenchApp(cliConfig);
25
+ const appId = getAppId(cliConfig);
27
26
  await internalBuildApp({
28
- appId: getAppId(cliConfig),
27
+ appId,
29
28
  appTitle: app?.title,
30
29
  autoUpdatesEnabled: options.autoUpdatesEnabled,
31
- calledFromDeploy: options.calledFromDeploy,
30
+ checkAppId: ()=>{
31
+ // Warn if auto updates enabled but no appId configured.
32
+ // Skip when called from deploy, since deploy handles appId itself
33
+ // (prompts the user and tells them to add it to config).
34
+ if (!appId && !options.calledFromDeploy) {
35
+ warnAboutMissingAppId({
36
+ appType: 'app',
37
+ output
38
+ });
39
+ }
40
+ },
41
+ compareDependencyVersions: (packages)=>compareDependencyVersions(packages, workDir, {
42
+ appId
43
+ }),
32
44
  determineBasePath: ()=>determineBasePath(cliConfig, 'app', output),
33
45
  entry: app?.entry,
34
46
  isWorkbenchApp: !!workbench,
@@ -103,18 +115,9 @@ import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
103
115
  });
104
116
  output.log(`${logSymbols.info} Building with auto-updates enabled`);
105
117
  // Warn if auto updates enabled but no appId configured.
106
- // Skip when called from deploy, since deploy handles appId itself
107
- // (prompts the user and tells them to add it to config).
108
- if (!appId && !options.calledFromDeploy) {
109
- warnAboutMissingAppId({
110
- appType: 'app',
111
- output
112
- });
113
- }
118
+ options.checkAppId();
114
119
  // Check the versions
115
- const { mismatched, unresolvedPrerelease } = await compareDependencyVersions(autoUpdatedPackages, workDir, {
116
- appId
117
- });
120
+ const { mismatched, unresolvedPrerelease } = await options.compareDependencyVersions(autoUpdatedPackages);
118
121
  if (unresolvedPrerelease.length > 0) {
119
122
  await handlePrereleaseVersions({
120
123
  output,
@@ -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 {\n AppBuildTrace,\n buildDebug,\n getAutoUpdatesCssUrls,\n getAutoUpdatesImportMap,\n resolveVendorBuildConfig,\n} from '@sanity/cli-build/_internal/build'\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 {type DefineAppInput} from '@sanity/workbench-cli'\nimport {resolveWorkbenchApp} from '@sanity/workbench-cli/build'\nimport {parse as semverParse} from 'semver'\n\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 {buildStaticFiles} from './buildStaticFiles.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAppEnvironmentVariables} from './getEnvironmentVariables.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 isWorkbenchApp: boolean\n minify: boolean\n outDir: string | undefined\n output: Output\n reactCompiler: CliConfig['reactCompiler']\n schemaExtraction: CliConfig['schemaExtraction']\n services: DefineAppInput['services']\n sourceMap: boolean\n stats: boolean\n unattendedMode: boolean\n views: DefineAppInput['views']\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 const app = cliConfig && 'app' in cliConfig ? cliConfig.app : undefined\n // `views`/`services` live on the branded `unstable_defineApp` result, not the\n // legacy `app` config object — resolve the workbench capability to read them.\n const workbench = resolveWorkbenchApp(cliConfig)\n\n await internalBuildApp({\n appId: getAppId(cliConfig),\n appTitle: app?.title,\n autoUpdatesEnabled: options.autoUpdatesEnabled,\n calledFromDeploy: options.calledFromDeploy,\n determineBasePath: () => determineBasePath(cliConfig, 'app', output),\n entry: app?.entry,\n isWorkbenchApp: !!workbench,\n minify: flags.minify,\n outDir,\n output,\n reactCompiler: cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n schemaExtraction: cliConfig?.schemaExtraction,\n services: workbench?.services,\n sourceMap: Boolean(flags['source-maps']),\n stats: flags.stats,\n unattendedMode: flags.yes,\n views: workbench?.views,\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 buildDebug(`Building app`)\n\n const {appId, determineBasePath, outDir, output, workDir} = options\n let {autoUpdatesEnabled} = options\n const unattendedMode = options.unattendedMode\n\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 = Object.keys(getAppEnvironmentVariables())\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 autoUpdates\n if (autoUpdatesEnabled && !options.isWorkbenchApp) {\n autoUpdates = {\n cssUrls: autoUpdatesCssUrls,\n imports: autoUpdatesImports,\n vendor: await resolveVendorBuildConfig({cwd: workDir, isApp: true}),\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n appTitle: options.appTitle,\n autoUpdates,\n basePath,\n cwd: workDir,\n entry: options.entry,\n isApp: true,\n isWorkbenchApp: options.isWorkbenchApp,\n minify: options.minify,\n outputDir,\n reactCompiler: options.reactCompiler,\n schemaExtraction: options.schemaExtraction,\n services: options.services,\n sourceMap: options.sourceMap,\n views: options.views,\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","AppBuildTrace","buildDebug","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","resolveVendorBuildConfig","getCliTelemetry","getLocalPackageVersion","getTimer","isInteractive","confirm","logSymbols","spinner","resolveWorkbenchApp","parse","semverParse","getAppId","compareDependencyVersions","formatModuleSizes","sortModulesBySize","warnAboutMissingAppId","buildStaticFiles","determineBasePath","getAppEnvironmentVariables","handlePrereleaseVersions","buildApp","options","cliConfig","flags","outDir","output","workDir","app","undefined","workbench","internalBuildApp","appId","appTitle","title","autoUpdatesEnabled","calledFromDeploy","entry","isWorkbenchApp","minify","reactCompiler","schemaExtraction","services","sourceMap","Boolean","stats","unattendedMode","yes","views","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","Object","keys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","autoUpdates","cssUrls","imports","vendor","cwd","isApp","bundle","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","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 AppBuildTrace,\n buildDebug,\n buildStaticFiles,\n formatModuleSizes,\n getAutoUpdatesCssUrls,\n getAutoUpdatesImportMap,\n resolveVendorBuildConfig,\n sortModulesBySize,\n} from '@sanity/cli-build/_internal/build'\nimport {getAppEnvironmentVariables} from '@sanity/cli-build/_internal/env'\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 {type DefineAppInput} from '@sanity/workbench-cli'\nimport {resolveWorkbenchApp} from '@sanity/workbench-cli/build'\nimport {parse as semverParse} from 'semver'\n\nimport {getAppId} from '../../util/appId.js'\nimport {\n compareDependencyVersions,\n CompareDependencyVersionsResult,\n} from '../../util/compareDependencyVersions.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {determineBasePath} from './determineBasePath.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 checkAppId: () => void\n compareDependencyVersions: (\n packages: {name: string; version: string}[],\n ) => Promise<CompareDependencyVersionsResult>\n determineBasePath: () => string\n entry: string | undefined\n isWorkbenchApp: boolean\n minify: boolean\n outDir: string | undefined\n output: Output\n reactCompiler: CliConfig['reactCompiler']\n schemaExtraction: CliConfig['schemaExtraction']\n services: DefineAppInput['services']\n sourceMap: boolean\n stats: boolean\n unattendedMode: boolean\n views: DefineAppInput['views']\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 const app = cliConfig && 'app' in cliConfig ? cliConfig.app : undefined\n // `views`/`services` live on the branded `unstable_defineApp` result, not the\n // legacy `app` config object — resolve the workbench capability to read them.\n const workbench = resolveWorkbenchApp(cliConfig)\n\n const appId = getAppId(cliConfig)\n\n await internalBuildApp({\n appId,\n appTitle: app?.title,\n autoUpdatesEnabled: options.autoUpdatesEnabled,\n checkAppId: () => {\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 compareDependencyVersions: (packages) => compareDependencyVersions(packages, workDir, {appId}),\n determineBasePath: () => determineBasePath(cliConfig, 'app', output),\n entry: app?.entry,\n isWorkbenchApp: !!workbench,\n minify: flags.minify,\n outDir,\n output,\n reactCompiler: cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n schemaExtraction: cliConfig?.schemaExtraction,\n services: workbench?.services,\n sourceMap: Boolean(flags['source-maps']),\n stats: flags.stats,\n unattendedMode: flags.yes,\n views: workbench?.views,\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 buildDebug(`Building app`)\n\n const {appId, determineBasePath, outDir, output, workDir} = options\n let {autoUpdatesEnabled} = options\n const unattendedMode = options.unattendedMode\n\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 options.checkAppId()\n\n // Check the versions\n const {mismatched, unresolvedPrerelease} =\n await options.compareDependencyVersions(autoUpdatedPackages)\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 = Object.keys(getAppEnvironmentVariables())\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 autoUpdates\n if (autoUpdatesEnabled && !options.isWorkbenchApp) {\n autoUpdates = {\n cssUrls: autoUpdatesCssUrls,\n imports: autoUpdatesImports,\n vendor: await resolveVendorBuildConfig({cwd: workDir, isApp: true}),\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n appTitle: options.appTitle,\n autoUpdates,\n basePath,\n cwd: workDir,\n entry: options.entry,\n isApp: true,\n isWorkbenchApp: options.isWorkbenchApp,\n minify: options.minify,\n outputDir,\n reactCompiler: options.reactCompiler,\n schemaExtraction: options.schemaExtraction,\n services: options.services,\n sourceMap: options.sourceMap,\n views: options.views,\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","AppBuildTrace","buildDebug","buildStaticFiles","formatModuleSizes","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","resolveVendorBuildConfig","sortModulesBySize","getAppEnvironmentVariables","getCliTelemetry","getLocalPackageVersion","getTimer","isInteractive","confirm","logSymbols","spinner","resolveWorkbenchApp","parse","semverParse","getAppId","compareDependencyVersions","warnAboutMissingAppId","determineBasePath","handlePrereleaseVersions","buildApp","options","cliConfig","flags","outDir","output","workDir","app","undefined","workbench","appId","internalBuildApp","appTitle","title","autoUpdatesEnabled","checkAppId","calledFromDeploy","appType","packages","entry","isWorkbenchApp","minify","reactCompiler","schemaExtraction","services","sourceMap","Boolean","stats","unattendedMode","yes","views","vite","timer","defaultOutputDir","resolve","join","outputDir","installedSdkVersion","installedSanityVersion","error","exit","autoUpdatesImports","autoUpdatesCssUrls","cleanSDKVersion","version","cleanSanityVersion","autoUpdatedPackages","name","cssFile","log","info","mismatched","unresolvedPrerelease","length","versionMismatchWarning","map","mod","pkg","installed","remote","shouldContinue","default","message","warn","envVarKeys","Object","keys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","autoUpdates","cssUrls","imports","vendor","cwd","isApp","bundle","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","slice","complete","fail","Error","String"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { rm } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { styleText } from 'node:util';
4
- import { buildDebug, checkRequiredDependencies, checkStudioDependencyVersions, getAutoUpdatesCssUrls, getAutoUpdatesImportMap, resolveVendorBuildConfig, StudioBuildTrace } from '@sanity/cli-build/_internal/build';
4
+ import { buildDebug, buildStaticFiles, checkRequiredDependencies, checkStudioDependencyVersions, formatModuleSizes, getAutoUpdatesCssUrls, getAutoUpdatesImportMap, resolveVendorBuildConfig, sortModulesBySize, StudioBuildTrace } from '@sanity/cli-build/_internal/build';
5
+ import { getStudioEnvironmentVariables } from '@sanity/cli-build/_internal/env';
5
6
  import { getCliTelemetry, getLocalPackageVersion, getTimer, isInteractive } from '@sanity/cli-core';
6
7
  import { confirm, logSymbols, select, spinner } from '@sanity/cli-core/ux';
7
8
  import { resolveWorkbenchApp } from '@sanity/workbench-cli/build';
@@ -9,13 +10,10 @@ import { parse as semverParse } from 'semver';
9
10
  import { getAppId } from '../../util/appId.js';
10
11
  import { compareDependencyVersions } from '../../util/compareDependencyVersions.js';
11
12
  import { determineIsApp } from '../../util/determineIsApp.js';
12
- import { formatModuleSizes, sortModulesBySize } from '../../util/moduleFormatUtils.js';
13
13
  import { getPackageManagerChoice } from '../../util/packageManager/packageManagerChoice.js';
14
14
  import { upgradePackages } from '../../util/packageManager/upgradePackages.js';
15
15
  import { warnAboutMissingAppId } from '../../util/warnAboutMissingAppId.js';
16
- import { buildStaticFiles } from './buildStaticFiles.js';
17
16
  import { determineBasePath } from './determineBasePath.js';
18
- import { getStudioEnvironmentVariables } from './getEnvironmentVariables.js';
19
17
  import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
20
18
  /**
21
19
  * Build the Sanity Studio.
@@ -26,6 +24,7 @@ import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
26
24
  // `views`/`services` live on the branded `unstable_defineApp` result — resolve
27
25
  // the workbench capability so it's gated on the brand, like the app build.
28
26
  const workbench = resolveWorkbenchApp(cliConfig);
27
+ const appId = getAppId(cliConfig);
29
28
  const upgradePkgs = async (options)=>{
30
29
  await upgradePackages({
31
30
  packageManager: (await getPackageManagerChoice(workDir, {
@@ -38,16 +37,29 @@ import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
38
37
  });
39
38
  };
40
39
  await internalBuildStudio({
41
- appId: getAppId(cliConfig),
40
+ appId,
42
41
  autoUpdatesEnabled: options.autoUpdatesEnabled,
43
- calledFromDeploy,
42
+ checkAppId: ()=>{
43
+ // Warn if auto updates enabled but no appId configured.
44
+ // Skip when called from deploy, since deploy handles appId itself
45
+ // (prompts the user and tells them to add it to config).
46
+ if (!appId && !calledFromDeploy) {
47
+ warnAboutMissingAppId({
48
+ appType: 'studio',
49
+ output,
50
+ projectId: cliConfig?.api?.projectId
51
+ });
52
+ }
53
+ },
54
+ compareDependencyVersions: (packages)=>compareDependencyVersions(packages, workDir, {
55
+ appId
56
+ }),
44
57
  determineBasePath: ()=>determineBasePath(cliConfig, 'studio', output),
45
58
  isApp: determineIsApp(cliConfig),
46
59
  isWorkbenchApp: !!workbench,
47
60
  minify: Boolean(flags.minify),
48
61
  outDir,
49
62
  output,
50
- projectId: cliConfig?.api?.projectId,
51
63
  reactCompiler: cliConfig.reactCompiler,
52
64
  schemaExtraction: cliConfig.schemaExtraction,
53
65
  services: workbench?.services,
@@ -66,7 +78,7 @@ import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
66
78
  */ async function internalBuildStudio(options) {
67
79
  buildDebug(`Building studio`);
68
80
  const timer = getTimer();
69
- const { appId, determineBasePath, isApp, minify, outDir, output, projectId, reactCompiler, schemaExtraction, services, sourceMap, stats, unattendedMode, upgradePackages, views, vite, workDir } = options;
81
+ const { appId, determineBasePath, isApp, minify, outDir, output, reactCompiler, schemaExtraction, services, sourceMap, stats, unattendedMode, upgradePackages, views, vite, workDir } = options;
70
82
  const defaultOutputDir = path.resolve(path.join(workDir, 'dist'));
71
83
  const outputDir = path.resolve(outDir || defaultOutputDir);
72
84
  await checkStudioDependencyVersions(workDir, output);
@@ -87,16 +99,8 @@ import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
87
99
  throw new Error(`Failed to parse installed Sanity version: ${installedSanityVersion}`);
88
100
  }
89
101
  output.log(`${logSymbols.info} Building with auto-updates enabled`);
90
- // Warn if auto updates enabled but no appId configured.
91
- // Skip when called from deploy, since deploy handles appId itself
92
- // (prompts the user and tells them to add it to config).
93
- if (!appId && !options.calledFromDeploy) {
94
- warnAboutMissingAppId({
95
- appType: 'studio',
96
- output,
97
- projectId
98
- });
99
- }
102
+ // Warn if auto updates enabled but no appId configured
103
+ options.checkAppId();
100
104
  const installedVisionVersion = await getLocalPackageVersion('@sanity/vision', workDir);
101
105
  const cleanVisionVersion = installedVisionVersion ? semverParse(installedVisionVersion)?.version : undefined;
102
106
  const sanityDependencies = [
@@ -125,9 +129,7 @@ import { handlePrereleaseVersions } from './handlePrereleaseVersions.js';
125
129
  appId
126
130
  });
127
131
  // Check the versions
128
- const { mismatched, unresolvedPrerelease } = await compareDependencyVersions(sanityDependencies, workDir, {
129
- appId
130
- });
132
+ const { mismatched, unresolvedPrerelease } = await options.compareDependencyVersions(sanityDependencies);
131
133
  if (unresolvedPrerelease.length > 0) {
132
134
  await handlePrereleaseVersions({
133
135
  output,
@@ -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 {\n buildDebug,\n checkRequiredDependencies,\n checkStudioDependencyVersions,\n getAutoUpdatesCssUrls,\n getAutoUpdatesImportMap,\n resolveVendorBuildConfig,\n StudioBuildTrace,\n} from '@sanity/cli-build/_internal/build'\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 {type DefineAppInput} from '@sanity/workbench-cli'\nimport {resolveWorkbenchApp} from '@sanity/workbench-cli/build'\nimport {parse as semverParse} from 'semver'\n\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 {buildStaticFiles} from './buildStaticFiles.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getStudioEnvironmentVariables} from './getEnvironmentVariables.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.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 isWorkbenchApp: boolean\n minify: boolean\n outDir: string | undefined\n output: Output\n projectId: string | undefined\n reactCompiler: CliConfig['reactCompiler']\n schemaExtraction: CliConfig['schemaExtraction']\n services: DefineAppInput['services']\n sourceMap: boolean\n stats: boolean\n unattendedMode: boolean\n upgradePackages(options: {packages: [name: string, version: string][]}): Promise<void>\n views: DefineAppInput['views']\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 // `views`/`services` live on the branded `unstable_defineApp` result — resolve\n // the workbench capability so it's gated on the brand, like the app build.\n const workbench = resolveWorkbenchApp(cliConfig)\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: options.autoUpdatesEnabled,\n calledFromDeploy,\n determineBasePath: () => determineBasePath(cliConfig, 'studio', output),\n isApp: determineIsApp(cliConfig),\n isWorkbenchApp: !!workbench,\n minify: Boolean(flags.minify),\n outDir,\n output,\n projectId: cliConfig?.api?.projectId,\n reactCompiler: cliConfig.reactCompiler,\n schemaExtraction: cliConfig.schemaExtraction,\n services: workbench?.services,\n sourceMap: Boolean(flags['source-maps']),\n stats: flags.stats,\n unattendedMode: Boolean(flags.yes),\n upgradePackages: upgradePkgs,\n views: workbench?.views,\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 buildDebug(`Building studio`)\n\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 services,\n sourceMap,\n stats,\n unattendedMode,\n upgradePackages,\n views,\n vite,\n workDir,\n } = options\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 autoUpdatesEnabled = options.autoUpdatesEnabled\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 = Object.keys(getStudioEnvironmentVariables())\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 autoUpdates\n if (autoUpdatesEnabled && !options.isWorkbenchApp) {\n autoUpdates = {\n cssUrls: autoUpdatesCssUrls,\n imports: autoUpdatesImports,\n vendor: await resolveVendorBuildConfig({cwd: workDir, isApp: false}),\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n autoUpdates,\n basePath,\n cwd: workDir,\n isWorkbenchApp: options.isWorkbenchApp,\n minify,\n outputDir,\n reactCompiler,\n schemaExtraction,\n services,\n sourceMap,\n views,\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","buildDebug","checkRequiredDependencies","checkStudioDependencyVersions","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","resolveVendorBuildConfig","StudioBuildTrace","getCliTelemetry","getLocalPackageVersion","getTimer","isInteractive","confirm","logSymbols","select","spinner","resolveWorkbenchApp","parse","semverParse","getAppId","compareDependencyVersions","determineIsApp","formatModuleSizes","sortModulesBySize","getPackageManagerChoice","upgradePackages","warnAboutMissingAppId","buildStaticFiles","determineBasePath","getStudioEnvironmentVariables","handlePrereleaseVersions","buildStudio","options","calledFromDeploy","cliConfig","flags","outDir","output","workDir","workbench","upgradePkgs","packageManager","interactive","chosen","packages","internalBuildStudio","appId","autoUpdatesEnabled","isApp","isWorkbenchApp","minify","Boolean","projectId","api","reactCompiler","schemaExtraction","services","sourceMap","stats","unattendedMode","yes","views","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","Object","keys","key","shouldClean","basePath","enabled","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","autoUpdates","cssUrls","imports","vendor","cwd","bundle","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","complete","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 buildDebug,\n buildStaticFiles,\n checkRequiredDependencies,\n checkStudioDependencyVersions,\n formatModuleSizes,\n getAutoUpdatesCssUrls,\n getAutoUpdatesImportMap,\n resolveVendorBuildConfig,\n sortModulesBySize,\n StudioBuildTrace,\n} from '@sanity/cli-build/_internal/build'\nimport {getStudioEnvironmentVariables} from '@sanity/cli-build/_internal/env'\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 {type DefineAppInput} from '@sanity/workbench-cli'\nimport {resolveWorkbenchApp} from '@sanity/workbench-cli/build'\nimport {parse as semverParse} from 'semver'\n\nimport {getAppId} from '../../util/appId.js'\nimport {\n compareDependencyVersions,\n CompareDependencyVersionsResult,\n} from '../../util/compareDependencyVersions.js'\nimport {determineIsApp} from '../../util/determineIsApp.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {handlePrereleaseVersions} from './handlePrereleaseVersions.js'\nimport {type BuildOptions} from './types.js'\n\ninterface InternalBuildOptions {\n appId: string | undefined\n autoUpdatesEnabled: boolean\n checkAppId: () => void\n compareDependencyVersions: (\n packages: {name: string; version: string}[],\n ) => Promise<CompareDependencyVersionsResult>\n determineBasePath: () => string\n isApp: boolean\n isWorkbenchApp: boolean\n minify: boolean\n outDir: string | undefined\n output: Output\n reactCompiler: CliConfig['reactCompiler']\n schemaExtraction: CliConfig['schemaExtraction']\n services: DefineAppInput['services']\n sourceMap: boolean\n stats: boolean\n unattendedMode: boolean\n upgradePackages(options: {packages: [name: string, version: string][]}): Promise<void>\n views: DefineAppInput['views']\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 // `views`/`services` live on the branded `unstable_defineApp` result — resolve\n // the workbench capability so it's gated on the brand, like the app build.\n const workbench = resolveWorkbenchApp(cliConfig)\n\n const appId = getAppId(cliConfig)\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,\n autoUpdatesEnabled: options.autoUpdatesEnabled,\n checkAppId: () => {\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 && !calledFromDeploy) {\n warnAboutMissingAppId({appType: 'studio', output, projectId: cliConfig?.api?.projectId})\n }\n },\n compareDependencyVersions: (packages) => compareDependencyVersions(packages, workDir, {appId}),\n determineBasePath: () => determineBasePath(cliConfig, 'studio', output),\n isApp: determineIsApp(cliConfig),\n isWorkbenchApp: !!workbench,\n minify: Boolean(flags.minify),\n outDir,\n output,\n reactCompiler: cliConfig.reactCompiler,\n schemaExtraction: cliConfig.schemaExtraction,\n services: workbench?.services,\n sourceMap: Boolean(flags['source-maps']),\n stats: flags.stats,\n unattendedMode: Boolean(flags.yes),\n upgradePackages: upgradePkgs,\n views: workbench?.views,\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 buildDebug(`Building studio`)\n\n const timer = getTimer()\n const {\n appId,\n determineBasePath,\n isApp,\n minify,\n outDir,\n output,\n reactCompiler,\n schemaExtraction,\n services,\n sourceMap,\n stats,\n unattendedMode,\n upgradePackages,\n views,\n vite,\n workDir,\n } = options\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 autoUpdatesEnabled = options.autoUpdatesEnabled\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 options.checkAppId()\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} =\n await options.compareDependencyVersions(sanityDependencies)\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 = Object.keys(getStudioEnvironmentVariables())\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 autoUpdates\n if (autoUpdatesEnabled && !options.isWorkbenchApp) {\n autoUpdates = {\n cssUrls: autoUpdatesCssUrls,\n imports: autoUpdatesImports,\n vendor: await resolveVendorBuildConfig({cwd: workDir, isApp: false}),\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n autoUpdates,\n basePath,\n cwd: workDir,\n isWorkbenchApp: options.isWorkbenchApp,\n minify,\n outputDir,\n reactCompiler,\n schemaExtraction,\n services,\n sourceMap,\n views,\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","buildDebug","buildStaticFiles","checkRequiredDependencies","checkStudioDependencyVersions","formatModuleSizes","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","resolveVendorBuildConfig","sortModulesBySize","StudioBuildTrace","getStudioEnvironmentVariables","getCliTelemetry","getLocalPackageVersion","getTimer","isInteractive","confirm","logSymbols","select","spinner","resolveWorkbenchApp","parse","semverParse","getAppId","compareDependencyVersions","determineIsApp","getPackageManagerChoice","upgradePackages","warnAboutMissingAppId","determineBasePath","handlePrereleaseVersions","buildStudio","options","calledFromDeploy","cliConfig","flags","outDir","output","workDir","workbench","appId","upgradePkgs","packageManager","interactive","chosen","packages","internalBuildStudio","autoUpdatesEnabled","checkAppId","appType","projectId","api","isApp","isWorkbenchApp","minify","Boolean","reactCompiler","schemaExtraction","services","sourceMap","stats","unattendedMode","yes","views","vite","timer","defaultOutputDir","resolve","join","outputDir","installedSanityVersion","autoUpdatesImports","autoUpdatesCssUrls","cleanSanityVersion","version","Error","log","info","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","Object","keys","key","shouldClean","basePath","enabled","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","autoUpdates","cssUrls","imports","vendor","cwd","bundle","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","complete","slice","fail","String"],"mappings":"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"}