@sanity/cli 7.2.2 → 7.3.0

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 (160) hide show
  1. package/bin/run.js +3 -12
  2. package/dist/actions/auth/authServer.js +37 -20
  3. package/dist/actions/auth/authServer.js.map +1 -1
  4. package/dist/actions/backup/assertDatasetExist.js +3 -3
  5. package/dist/actions/backup/assertDatasetExist.js.map +1 -1
  6. package/dist/actions/build/buildApp.js +15 -5
  7. package/dist/actions/build/buildApp.js.map +1 -1
  8. package/dist/actions/build/buildStaticFiles.js +57 -5
  9. package/dist/actions/build/buildStaticFiles.js.map +1 -1
  10. package/dist/actions/build/buildStudio.js +13 -5
  11. package/dist/actions/build/buildStudio.js.map +1 -1
  12. package/dist/actions/build/handlePrereleaseVersions.js +2 -2
  13. package/dist/actions/build/handlePrereleaseVersions.js.map +1 -1
  14. package/dist/actions/dataset/resolveDataset.js +2 -2
  15. package/dist/actions/dataset/resolveDataset.js.map +1 -1
  16. package/dist/actions/deploy/deployApp.js +43 -5
  17. package/dist/actions/deploy/deployApp.js.map +1 -1
  18. package/dist/actions/deploy/deployStudio.js +14 -2
  19. package/dist/actions/deploy/deployStudio.js.map +1 -1
  20. package/dist/actions/deploy/viewDeployment.js +32 -0
  21. package/dist/actions/deploy/viewDeployment.js.map +1 -0
  22. package/dist/actions/dev/devAction.js +219 -4
  23. package/dist/actions/dev/devAction.js.map +1 -1
  24. package/dist/actions/dev/registration/deriveInterfaces.js +46 -0
  25. package/dist/actions/dev/registration/deriveInterfaces.js.map +1 -0
  26. package/dist/actions/dev/registration/extractDevServerManifest.js +30 -0
  27. package/dist/actions/dev/registration/extractDevServerManifest.js.map +1 -0
  28. package/dist/actions/dev/registration/interfaceSetId.js +41 -0
  29. package/dist/actions/dev/registration/interfaceSetId.js.map +1 -0
  30. package/dist/actions/dev/registration/startDevManifestWatcher.js +104 -0
  31. package/dist/actions/dev/registration/startDevManifestWatcher.js.map +1 -0
  32. package/dist/actions/dev/registration/startDevServerRegistration.js +121 -0
  33. package/dist/actions/dev/registration/startDevServerRegistration.js.map +1 -0
  34. package/dist/actions/dev/servers/getDashboardAppUrl.js.map +1 -0
  35. package/dist/actions/dev/servers/getDevServerConfig.js +45 -0
  36. package/dist/actions/dev/servers/getDevServerConfig.js.map +1 -0
  37. package/dist/actions/dev/servers/startAppDevServer.js +78 -0
  38. package/dist/actions/dev/servers/startAppDevServer.js.map +1 -0
  39. package/dist/actions/dev/{startStudioDevServer.js → servers/startStudioDevServer.js} +20 -16
  40. package/dist/actions/dev/servers/startStudioDevServer.js.map +1 -0
  41. package/dist/actions/dev/types.js +7 -1
  42. package/dist/actions/dev/types.js.map +1 -1
  43. package/dist/actions/dev/workbench/startWorkbenchDevServer.js +276 -0
  44. package/dist/actions/dev/workbench/startWorkbenchDevServer.js.map +1 -0
  45. package/dist/actions/dev/workbench/writeWorkbenchRuntime.js +66 -0
  46. package/dist/actions/dev/workbench/writeWorkbenchRuntime.js.map +1 -0
  47. package/dist/actions/init/bootstrapLocalTemplate.js +15 -3
  48. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
  49. package/dist/actions/init/bootstrapTemplate.js +3 -2
  50. package/dist/actions/init/bootstrapTemplate.js.map +1 -1
  51. package/dist/actions/init/createAppCliConfig.js +5 -2
  52. package/dist/actions/init/createAppCliConfig.js.map +1 -1
  53. package/dist/actions/init/createCliConfig.js +5 -3
  54. package/dist/actions/init/createCliConfig.js.map +1 -1
  55. package/dist/actions/init/createStudioConfig.js.map +1 -1
  56. package/dist/actions/init/initAction.js +11 -4
  57. package/dist/actions/init/initAction.js.map +1 -1
  58. package/dist/actions/init/initApp.js +2 -1
  59. package/dist/actions/init/initApp.js.map +1 -1
  60. package/dist/actions/init/initStudio.js +2 -1
  61. package/dist/actions/init/initStudio.js.map +1 -1
  62. package/dist/actions/init/scaffoldTemplate.js +3 -2
  63. package/dist/actions/init/scaffoldTemplate.js.map +1 -1
  64. package/dist/actions/init/templates/pageBuilder.js +1 -1
  65. package/dist/actions/init/templates/pageBuilder.js.map +1 -1
  66. package/dist/actions/init/types.js +1 -0
  67. package/dist/actions/init/types.js.map +1 -1
  68. package/dist/actions/manifest/{extractAppManifest.js → extractCoreAppManifest.js} +30 -11
  69. package/dist/actions/manifest/extractCoreAppManifest.js.map +1 -0
  70. package/dist/actions/manifest/extractManifest.js +7 -7
  71. package/dist/actions/manifest/extractManifest.js.map +1 -1
  72. package/dist/actions/manifest/iconResolver.js +2 -3
  73. package/dist/actions/manifest/iconResolver.js.map +1 -1
  74. package/dist/actions/manifest/sanitizeIcon.js +13 -0
  75. package/dist/actions/manifest/sanitizeIcon.js.map +1 -0
  76. package/dist/actions/manifest/types.js +4 -9
  77. package/dist/actions/manifest/types.js.map +1 -1
  78. package/dist/actions/manifest/writeManifestFile.js +1 -1
  79. package/dist/actions/manifest/writeManifestFile.js.map +1 -1
  80. package/dist/actions/mcp/editorConfigs.js +26 -2
  81. package/dist/actions/mcp/editorConfigs.js.map +1 -1
  82. package/dist/actions/mcp/setupMCP.js +24 -25
  83. package/dist/actions/mcp/setupMCP.js.map +1 -1
  84. package/dist/actions/mcp/types.js.map +1 -1
  85. package/dist/actions/skills/configureSkills.js +49 -0
  86. package/dist/actions/skills/configureSkills.js.map +1 -0
  87. package/dist/actions/skills/readSkillState.js +40 -5
  88. package/dist/actions/skills/readSkillState.js.map +1 -1
  89. package/dist/actions/skills/setupSkills.js +47 -6
  90. package/dist/actions/skills/setupSkills.js.map +1 -1
  91. package/dist/actions/skills/skillCandidates.js +40 -0
  92. package/dist/actions/skills/skillCandidates.js.map +1 -0
  93. package/dist/actions/telemetry/telemetryDisclosure.js +2 -3
  94. package/dist/actions/telemetry/telemetryDisclosure.js.map +1 -1
  95. package/dist/actions/tokens/validateRole.js +3 -3
  96. package/dist/actions/tokens/validateRole.js.map +1 -1
  97. package/dist/commands/backups/disable.js +1 -1
  98. package/dist/commands/backups/disable.js.map +1 -1
  99. package/dist/commands/backups/download.js +1 -1
  100. package/dist/commands/backups/download.js.map +1 -1
  101. package/dist/commands/backups/enable.js +1 -1
  102. package/dist/commands/backups/enable.js.map +1 -1
  103. package/dist/commands/backups/list.js +1 -1
  104. package/dist/commands/backups/list.js.map +1 -1
  105. package/dist/commands/datasets/embeddings/disable.js +1 -0
  106. package/dist/commands/datasets/embeddings/disable.js.map +1 -1
  107. package/dist/commands/datasets/embeddings/enable.js +1 -0
  108. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  109. package/dist/commands/datasets/embeddings/status.js +1 -0
  110. package/dist/commands/datasets/embeddings/status.js.map +1 -1
  111. package/dist/commands/dev.js +11 -1
  112. package/dist/commands/dev.js.map +1 -1
  113. package/dist/commands/init.js +7 -0
  114. package/dist/commands/init.js.map +1 -1
  115. package/dist/commands/manifest/extract.js +7 -2
  116. package/dist/commands/manifest/extract.js.map +1 -1
  117. package/dist/commands/mcp/configure.js +1 -0
  118. package/dist/commands/mcp/configure.js.map +1 -1
  119. package/dist/commands/skills/install.js +40 -0
  120. package/dist/commands/skills/install.js.map +1 -0
  121. package/dist/commands/tokens/add.js +1 -1
  122. package/dist/commands/tokens/add.js.map +1 -1
  123. package/dist/exports/index.d.ts +6 -0
  124. package/dist/exports/index.js +8 -0
  125. package/dist/exports/index.js.map +1 -1
  126. package/dist/exports/runtime.d.ts +41 -0
  127. package/dist/exports/runtime.js +13 -0
  128. package/dist/exports/runtime.js.map +1 -0
  129. package/dist/hooks/prerun/setupTelemetry.js +3 -1
  130. package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
  131. package/dist/server/devServer.js +8 -3
  132. package/dist/server/devServer.js.map +1 -1
  133. package/dist/services/documents.js +0 -1
  134. package/dist/services/documents.js.map +1 -1
  135. package/dist/telemetry/skills.telemetry.js +8 -0
  136. package/dist/telemetry/skills.telemetry.js.map +1 -0
  137. package/dist/util/compareDependencyVersions.js +1 -1
  138. package/dist/util/compareDependencyVersions.js.map +1 -1
  139. package/dist/util/determineIsApp.js +12 -1
  140. package/dist/util/determineIsApp.js.map +1 -1
  141. package/dist/util/getSharedServerConfig.js +2 -1
  142. package/dist/util/getSharedServerConfig.js.map +1 -1
  143. package/dist/util/resolveReactStrictMode.js +11 -0
  144. package/dist/util/resolveReactStrictMode.js.map +1 -0
  145. package/oclif.config.js +2 -1
  146. package/oclif.manifest.json +119 -86
  147. package/package.json +27 -18
  148. package/templates/page-builder/schemaTypes/index.js +1 -1
  149. package/dist/actions/build/checkRequiredDependencies.js +0 -124
  150. package/dist/actions/build/checkRequiredDependencies.js.map +0 -1
  151. package/dist/actions/build/getAutoUpdatesImportMap.js +0 -66
  152. package/dist/actions/build/getAutoUpdatesImportMap.js.map +0 -1
  153. package/dist/actions/dev/getDashboardAppUrl.js.map +0 -1
  154. package/dist/actions/dev/getDevServerConfig.js +0 -32
  155. package/dist/actions/dev/getDevServerConfig.js.map +0 -1
  156. package/dist/actions/dev/startAppDevServer.js +0 -59
  157. package/dist/actions/dev/startAppDevServer.js.map +0 -1
  158. package/dist/actions/dev/startStudioDevServer.js.map +0 -1
  159. package/dist/actions/manifest/extractAppManifest.js.map +0 -1
  160. /package/dist/actions/dev/{getDashboardAppUrl.js → servers/getDashboardAppUrl.js} +0 -0
@@ -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 checkStudioDependencyVersions,\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 {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 {checkRequiredDependencies} from './checkRequiredDependencies.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAutoUpdatesCssUrls, getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.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 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 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 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 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 sourceMap,\n stats,\n unattendedMode,\n upgradePackages,\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) {\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 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","buildDebug","checkStudioDependencyVersions","resolveVendorBuildConfig","StudioBuildTrace","getCliTelemetry","getLocalPackageVersion","getTimer","isInteractive","confirm","logSymbols","select","spinner","parse","semverParse","getAppId","compareDependencyVersions","determineIsApp","formatModuleSizes","sortModulesBySize","getPackageManagerChoice","upgradePackages","warnAboutMissingAppId","buildStaticFiles","checkRequiredDependencies","determineBasePath","getAutoUpdatesCssUrls","getAutoUpdatesImportMap","getStudioEnvironmentVariables","handlePrereleaseVersions","buildStudio","options","calledFromDeploy","cliConfig","flags","outDir","output","workDir","upgradePkgs","packageManager","interactive","chosen","packages","internalBuildStudio","appId","autoUpdatesEnabled","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","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 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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"}
@@ -15,7 +15,7 @@ import { select } from '@sanity/cli-core/ux';
15
15
  exit: 1
16
16
  });
17
17
  // output.error with exit: 1 throws, but TypeScript doesn't know that
18
- throw new Error('unreachable');
18
+ return;
19
19
  }
20
20
  const choice = await select({
21
21
  choices: [
@@ -36,7 +36,7 @@ import { select } from '@sanity/cli-core/ux';
36
36
  exit: 1
37
37
  });
38
38
  // output.error with exit: 1 throws, but TypeScript doesn't know that
39
- throw new Error('unreachable');
39
+ return;
40
40
  }
41
41
  output.warn('Auto-updates disabled for this build');
42
42
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/handlePrereleaseVersions.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {isInteractive, type Output} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type UnresolvedPrerelease} from '../../util/compareDependencyVersions.js'\n\n/**\n * Handle prerelease versions that cannot be resolved by the auto-updates CDN.\n *\n * In unattended or non-interactive mode, exits with an error. In interactive mode,\n * prompts the user to either disable auto-updates for this build or cancel.\n *\n * Does not return if the build should be cancelled (exits via `output.error`).\n */\nexport async function handlePrereleaseVersions({\n output,\n unattendedMode,\n unresolvedPrerelease,\n}: {\n output: Output\n unattendedMode: boolean\n unresolvedPrerelease: UnresolvedPrerelease[]\n}): Promise<void> {\n const prereleaseMessage =\n `The following packages are using prerelease versions not yet available on the auto-updates CDN:\\n\\n` +\n `${unresolvedPrerelease.map((mod) => ` - ${mod.pkg} (${mod.version})`).join('\\n')}\\n\\n` +\n `Auto-updates cannot be used with prerelease versions. To re-enable auto-updates later, ` +\n `switch to a non-prerelease version locally and deploy again.`\n\n if (unattendedMode || !isInteractive()) {\n output.error(\n `${prereleaseMessage}\\n\\n` +\n `Cannot build with auto-updates in unattended mode when using prerelease versions. ` +\n `Either switch to a non-prerelease version, or use --no-auto-updates to build without auto-updates.`,\n {exit: 1},\n )\n // output.error with exit: 1 throws, but TypeScript doesn't know that\n throw new Error('unreachable')\n }\n\n const choice = await select({\n choices: [\n {\n name: 'Disable auto-updates for this build and continue',\n value: 'disable-auto-updates',\n },\n {name: 'Cancel build', value: 'cancel'},\n ],\n default: 'disable-auto-updates',\n message: styleText('yellow', prereleaseMessage),\n })\n\n if (choice === 'cancel') {\n output.error('Declined to continue with build', {exit: 1})\n // output.error with exit: 1 throws, but TypeScript doesn't know that\n throw new Error('unreachable')\n }\n\n output.warn('Auto-updates disabled for this build')\n}\n"],"names":["styleText","isInteractive","select","handlePrereleaseVersions","output","unattendedMode","unresolvedPrerelease","prereleaseMessage","map","mod","pkg","version","join","error","exit","Error","choice","choices","name","value","default","message","warn"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,aAAa,QAAoB,mBAAkB;AAC3D,SAAQC,MAAM,QAAO,sBAAqB;AAI1C;;;;;;;CAOC,GACD,OAAO,eAAeC,yBAAyB,EAC7CC,MAAM,EACNC,cAAc,EACdC,oBAAoB,EAKrB;IACC,MAAMC,oBACJ,CAAC,mGAAmG,CAAC,GACrG,GAAGD,qBAAqBE,GAAG,CAAC,CAACC,MAAQ,CAAC,GAAG,EAAEA,IAAIC,GAAG,CAAC,EAAE,EAAED,IAAIE,OAAO,CAAC,CAAC,CAAC,EAAEC,IAAI,CAAC,MAAM,IAAI,CAAC,GACvF,CAAC,uFAAuF,CAAC,GACzF,CAAC,4DAA4D,CAAC;IAEhE,IAAIP,kBAAkB,CAACJ,iBAAiB;QACtCG,OAAOS,KAAK,CACV,GAAGN,kBAAkB,IAAI,CAAC,GACxB,CAAC,kFAAkF,CAAC,GACpF,CAAC,kGAAkG,CAAC,EACtG;YAACO,MAAM;QAAC;QAEV,qEAAqE;QACrE,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,SAAS,MAAMd,OAAO;QAC1Be,SAAS;YACP;gBACEC,MAAM;gBACNC,OAAO;YACT;YACA;gBAACD,MAAM;gBAAgBC,OAAO;YAAQ;SACvC;QACDC,SAAS;QACTC,SAASrB,UAAU,UAAUO;IAC/B;IAEA,IAAIS,WAAW,UAAU;QACvBZ,OAAOS,KAAK,CAAC,mCAAmC;YAACC,MAAM;QAAC;QACxD,qEAAqE;QACrE,MAAM,IAAIC,MAAM;IAClB;IAEAX,OAAOkB,IAAI,CAAC;AACd"}
1
+ {"version":3,"sources":["../../../src/actions/build/handlePrereleaseVersions.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {isInteractive, type Output} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type UnresolvedPrerelease} from '../../util/compareDependencyVersions.js'\n\n/**\n * Handle prerelease versions that cannot be resolved by the auto-updates CDN.\n *\n * In unattended or non-interactive mode, exits with an error. In interactive mode,\n * prompts the user to either disable auto-updates for this build or cancel.\n *\n * Does not return if the build should be cancelled (exits via `output.error`).\n */\nexport async function handlePrereleaseVersions({\n output,\n unattendedMode,\n unresolvedPrerelease,\n}: {\n output: Output\n unattendedMode: boolean\n unresolvedPrerelease: UnresolvedPrerelease[]\n}): Promise<void> {\n const prereleaseMessage =\n `The following packages are using prerelease versions not yet available on the auto-updates CDN:\\n\\n` +\n `${unresolvedPrerelease.map((mod) => ` - ${mod.pkg} (${mod.version})`).join('\\n')}\\n\\n` +\n `Auto-updates cannot be used with prerelease versions. To re-enable auto-updates later, ` +\n `switch to a non-prerelease version locally and deploy again.`\n\n if (unattendedMode || !isInteractive()) {\n output.error(\n `${prereleaseMessage}\\n\\n` +\n `Cannot build with auto-updates in unattended mode when using prerelease versions. ` +\n `Either switch to a non-prerelease version, or use --no-auto-updates to build without auto-updates.`,\n {exit: 1},\n )\n // output.error with exit: 1 throws, but TypeScript doesn't know that\n return\n }\n\n const choice = await select({\n choices: [\n {\n name: 'Disable auto-updates for this build and continue',\n value: 'disable-auto-updates',\n },\n {name: 'Cancel build', value: 'cancel'},\n ],\n default: 'disable-auto-updates',\n message: styleText('yellow', prereleaseMessage),\n })\n\n if (choice === 'cancel') {\n output.error('Declined to continue with build', {exit: 1})\n // output.error with exit: 1 throws, but TypeScript doesn't know that\n return\n }\n\n output.warn('Auto-updates disabled for this build')\n}\n"],"names":["styleText","isInteractive","select","handlePrereleaseVersions","output","unattendedMode","unresolvedPrerelease","prereleaseMessage","map","mod","pkg","version","join","error","exit","choice","choices","name","value","default","message","warn"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,aAAa,QAAoB,mBAAkB;AAC3D,SAAQC,MAAM,QAAO,sBAAqB;AAI1C;;;;;;;CAOC,GACD,OAAO,eAAeC,yBAAyB,EAC7CC,MAAM,EACNC,cAAc,EACdC,oBAAoB,EAKrB;IACC,MAAMC,oBACJ,CAAC,mGAAmG,CAAC,GACrG,GAAGD,qBAAqBE,GAAG,CAAC,CAACC,MAAQ,CAAC,GAAG,EAAEA,IAAIC,GAAG,CAAC,EAAE,EAAED,IAAIE,OAAO,CAAC,CAAC,CAAC,EAAEC,IAAI,CAAC,MAAM,IAAI,CAAC,GACvF,CAAC,uFAAuF,CAAC,GACzF,CAAC,4DAA4D,CAAC;IAEhE,IAAIP,kBAAkB,CAACJ,iBAAiB;QACtCG,OAAOS,KAAK,CACV,GAAGN,kBAAkB,IAAI,CAAC,GACxB,CAAC,kFAAkF,CAAC,GACpF,CAAC,kGAAkG,CAAC,EACtG;YAACO,MAAM;QAAC;QAEV,qEAAqE;QACrE;IACF;IAEA,MAAMC,SAAS,MAAMb,OAAO;QAC1Bc,SAAS;YACP;gBACEC,MAAM;gBACNC,OAAO;YACT;YACA;gBAACD,MAAM;gBAAgBC,OAAO;YAAQ;SACvC;QACDC,SAAS;QACTC,SAASpB,UAAU,UAAUO;IAC/B;IAEA,IAAIQ,WAAW,UAAU;QACvBX,OAAOS,KAAK,CAAC,mCAAmC;YAACC,MAAM;QAAC;QACxD,qEAAqE;QACrE;IACF;IAEAV,OAAOiB,IAAI,CAAC;AACd"}
@@ -5,13 +5,13 @@ import { assertDatasetExists } from '../backup/assertDatasetExist.js';
5
5
  * Lists datasets for a project, validates the given dataset name (or prompts
6
6
  * the user to pick one), and returns the resolved name together with the full
7
7
  * dataset list.
8
- */ export async function resolveDataset({ dataset, projectId }) {
8
+ */ export async function resolveDataset({ dataset, output, projectId }) {
9
9
  const datasets = await listDatasets(projectId);
10
10
  if (datasets.length === 0) {
11
11
  throw new Error('No datasets found in this project.');
12
12
  }
13
13
  if (dataset) {
14
- assertDatasetExists(datasets, dataset);
14
+ assertDatasetExists(datasets, dataset, output);
15
15
  } else {
16
16
  dataset = await promptForDataset({
17
17
  datasets
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/dataset/resolveDataset.ts"],"sourcesContent":["import {type DatasetsResponse} from '@sanity/client'\n\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {assertDatasetExists} from '../backup/assertDatasetExist.js'\n\ninterface ResolveDatasetOptions {\n projectId: string\n\n dataset?: string\n}\n\ninterface ResolveDatasetResult {\n dataset: string\n datasets: DatasetsResponse\n}\n\n/**\n * Lists datasets for a project, validates the given dataset name (or prompts\n * the user to pick one), and returns the resolved name together with the full\n * dataset list.\n */\nexport async function resolveDataset({\n dataset,\n projectId,\n}: ResolveDatasetOptions): Promise<ResolveDatasetResult> {\n const datasets = await listDatasets(projectId)\n\n if (datasets.length === 0) {\n throw new Error('No datasets found in this project.')\n }\n\n if (dataset) {\n assertDatasetExists(datasets, dataset)\n } else {\n dataset = await promptForDataset({datasets})\n }\n\n return {dataset, datasets}\n}\n"],"names":["promptForDataset","listDatasets","assertDatasetExists","resolveDataset","dataset","projectId","datasets","length","Error"],"mappings":"AAEA,SAAQA,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,YAAY,QAAO,6BAA4B;AACvD,SAAQC,mBAAmB,QAAO,kCAAiC;AAanE;;;;CAIC,GACD,OAAO,eAAeC,eAAe,EACnCC,OAAO,EACPC,SAAS,EACa;IACtB,MAAMC,WAAW,MAAML,aAAaI;IAEpC,IAAIC,SAASC,MAAM,KAAK,GAAG;QACzB,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAIJ,SAAS;QACXF,oBAAoBI,UAAUF;IAChC,OAAO;QACLA,UAAU,MAAMJ,iBAAiB;YAACM;QAAQ;IAC5C;IAEA,OAAO;QAACF;QAASE;IAAQ;AAC3B"}
1
+ {"version":3,"sources":["../../../src/actions/dataset/resolveDataset.ts"],"sourcesContent":["import {type Output} from '@sanity/cli-core'\nimport {type DatasetsResponse} from '@sanity/client'\n\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {assertDatasetExists} from '../backup/assertDatasetExist.js'\n\ninterface ResolveDatasetOptions {\n /** Output to use for user-facing messages from the calling command */\n output: Output\n\n projectId: string\n\n dataset?: string\n}\n\ninterface ResolveDatasetResult {\n dataset: string\n datasets: DatasetsResponse\n}\n\n/**\n * Lists datasets for a project, validates the given dataset name (or prompts\n * the user to pick one), and returns the resolved name together with the full\n * dataset list.\n */\nexport async function resolveDataset({\n dataset,\n output,\n projectId,\n}: ResolveDatasetOptions): Promise<ResolveDatasetResult> {\n const datasets = await listDatasets(projectId)\n\n if (datasets.length === 0) {\n throw new Error('No datasets found in this project.')\n }\n\n if (dataset) {\n assertDatasetExists(datasets, dataset, output)\n } else {\n dataset = await promptForDataset({datasets})\n }\n\n return {dataset, datasets}\n}\n"],"names":["promptForDataset","listDatasets","assertDatasetExists","resolveDataset","dataset","output","projectId","datasets","length","Error"],"mappings":"AAGA,SAAQA,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,YAAY,QAAO,6BAA4B;AACvD,SAAQC,mBAAmB,QAAO,kCAAiC;AAgBnE;;;;CAIC,GACD,OAAO,eAAeC,eAAe,EACnCC,OAAO,EACPC,MAAM,EACNC,SAAS,EACa;IACtB,MAAMC,WAAW,MAAMN,aAAaK;IAEpC,IAAIC,SAASC,MAAM,KAAK,GAAG;QACzB,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAIL,SAAS;QACXF,oBAAoBK,UAAUH,SAASC;IACzC,OAAO;QACLD,UAAU,MAAMJ,iBAAiB;YAACO;QAAQ;IAC5C;IAEA,OAAO;QAACH;QAASG;IAAQ;AAC3B"}
@@ -2,8 +2,9 @@ import { basename, dirname } from 'node:path';
2
2
  import { styleText } from 'node:util';
3
3
  import { createGzip } from 'node:zlib';
4
4
  import { CLIError } from '@oclif/core/errors';
5
- import { getLocalPackageVersion } from '@sanity/cli-core';
5
+ import { exitCodes, getLocalPackageVersion } from '@sanity/cli-core';
6
6
  import { spinner } from '@sanity/cli-core/ux';
7
+ import { getWorkbench } from '@sanity/workbench-cli/deploy';
7
8
  import { pack } from 'tar-fs';
8
9
  import { createDeployment, updateUserApplication } from '../../services/userApplications.js';
9
10
  import { getAppId } from '../../util/appId.js';
@@ -11,17 +12,19 @@ import { NO_ORGANIZATION_ID } from '../../util/errorMessages.js';
11
12
  import { getErrorMessage } from '../../util/getErrorMessage.js';
12
13
  import { buildApp } from '../build/buildApp.js';
13
14
  import { shouldAutoUpdate } from '../build/shouldAutoUpdate.js';
14
- import { extractAppManifest } from '../manifest/extractAppManifest.js';
15
+ import { extractCoreAppManifest } from '../manifest/extractCoreAppManifest.js';
15
16
  import { checkDir } from './checkDir.js';
16
17
  import { createUserApplicationForApp } from './createUserApplicationForApp.js';
17
18
  import { deployDebug } from './deployDebug.js';
18
19
  import { findUserApplicationForApp } from './findUserApplicationForApp.js';
20
+ import { buildViewDeploymentPayload } from './viewDeployment.js';
19
21
  /**
20
22
  * Deploy a Sanity application.
21
23
  *
22
24
  * @internal
23
25
  */ export async function deployApp(options) {
24
26
  const { cliConfig, flags, output, projectRoot, sourceDir } = options;
27
+ const workbench = getWorkbench(cliConfig);
25
28
  const workDir = projectRoot.directory;
26
29
  const organizationId = cliConfig.app?.organizationId;
27
30
  const appId = getAppId(cliConfig);
@@ -48,6 +51,18 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
48
51
  exit: 1
49
52
  });
50
53
  }
54
+ // Fail before any prompts or API calls when the app declares nothing to
55
+ // expose.
56
+ if (workbench) {
57
+ try {
58
+ workbench.assertDeployable();
59
+ } catch (err) {
60
+ output.error(getErrorMessage(err), {
61
+ exit: exitCodes.USAGE_ERROR
62
+ });
63
+ return;
64
+ }
65
+ }
51
66
  let spin = spinner('Verifying local content...');
52
67
  try {
53
68
  let userApplication = await findUserApplicationForApp({
@@ -78,12 +93,12 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
78
93
  // Ensure that the directory exists, is a directory and seems to have valid content
79
94
  spin = spin.start();
80
95
  try {
81
- await checkDir(sourceDir);
96
+ await (workbench ? workbench.checkBuiltOutput(sourceDir) : checkDir(sourceDir));
82
97
  spin.succeed();
83
98
  } catch (err) {
84
99
  spin.fail();
85
100
  deployDebug('Error checking directory', err);
86
- output.error('Error checking directory', {
101
+ output.error(getErrorMessage(err), {
87
102
  exit: 1
88
103
  });
89
104
  return;
@@ -98,7 +113,7 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
98
113
  }).pipe(createGzip());
99
114
  let manifest;
100
115
  try {
101
- manifest = await extractAppManifest({
116
+ manifest = await extractCoreAppManifest({
102
117
  workDir
103
118
  });
104
119
  } catch (err) {
@@ -134,6 +149,29 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
134
149
  output.warn(`Error updating application title: ${message}`);
135
150
  }
136
151
  }
152
+ // Register the app's declared views with the application service. That
153
+ // service doesn't exist yet, so validate the payload and log it (no store);
154
+ // a malformed view declaration fails the deploy before we ship the bundle.
155
+ // `views` lives on the branded `unstable_defineApp` result, not the legacy
156
+ // `app` config object.
157
+ const declaredViews = workbench?.views ?? [];
158
+ if (declaredViews.length > 0) {
159
+ try {
160
+ const payload = buildViewDeploymentPayload({
161
+ applicationId: userApplication.id,
162
+ views: declaredViews
163
+ });
164
+ output.log(`Validated ${payload.views.length} view(s) for the application service (not yet persisted):`);
165
+ output.log(JSON.stringify(payload, null, 2));
166
+ deployDebug('View deployment payload', payload);
167
+ } catch (err) {
168
+ const message = getErrorMessage(err);
169
+ output.error(`Invalid view declaration: ${message}`, {
170
+ exit: 1
171
+ });
172
+ return;
173
+ }
174
+ }
137
175
  spin = spinner('Deploying...').start();
138
176
  await createDeployment({
139
177
  applicationId: userApplication.id,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/deployApp.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {getLocalPackageVersion} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment, updateUserApplication} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_ORGANIZATION_ID} from '../../util/errorMessages.js'\nimport {getErrorMessage} from '../../util/getErrorMessage.js'\nimport {buildApp} from '../build/buildApp.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {extractAppManifest} from '../manifest/extractAppManifest.js'\nimport {type CoreAppManifest} from '../manifest/types.js'\nimport {checkDir} from './checkDir.js'\nimport {createUserApplicationForApp} from './createUserApplicationForApp.js'\nimport {deployDebug} from './deployDebug.js'\nimport {findUserApplicationForApp} from './findUserApplicationForApp.js'\nimport {type DeployAppOptions} from './types.js'\n\n/**\n * Deploy a Sanity application.\n *\n * @internal\n */\nexport async function deployApp(options: DeployAppOptions) {\n const {cliConfig, flags, output, projectRoot, sourceDir} = options\n\n const workDir = projectRoot.directory\n\n const organizationId = cliConfig.app?.organizationId\n const appId = getAppId(cliConfig)\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n const installedSdkVersion = await getLocalPackageVersion('@sanity/sdk-react', workDir)\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n if (!organizationId) {\n output.error(NO_ORGANIZATION_ID, {exit: 1})\n return\n }\n\n if (flags.external) {\n output.error('Deploying an app to an external host is not supported.', {exit: 1})\n }\n\n let spin = spinner('Verifying local content...')\n\n try {\n let userApplication = await findUserApplicationForApp({\n cliConfig,\n organizationId,\n output,\n })\n\n deployDebug(`User application found`, userApplication)\n\n if (!userApplication) {\n deployDebug(`No user application found. Creating a new one`)\n\n userApplication = await createUserApplicationForApp(organizationId)\n deployDebug(`User application created`, userApplication)\n }\n\n // Always build the project, unless --no-build is passed\n const shouldBuild = flags.build\n if (shouldBuild) {\n deployDebug(`Building app`)\n await buildApp({\n autoUpdatesEnabled: isAutoUpdating,\n calledFromDeploy: true,\n cliConfig,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await checkDir(sourceDir)\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error('Error checking directory', {exit: 1})\n return\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n const tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n let manifest: CoreAppManifest | undefined\n try {\n manifest = await extractAppManifest({workDir})\n } catch (err) {\n deployDebug('Error extracting app manifest', err)\n const message = getErrorMessage(err)\n // manifests aren't strictly essential, so continue deploy\n output.warn(`Error extracting app manifest: ${message}`)\n }\n\n // Sync app title from manifest when it has changed (Brett user-applications)\n if (manifest?.title !== undefined && manifest.title !== userApplication.title) {\n deployDebug('Updating application title from manifest', {\n from: userApplication.title,\n to: manifest.title,\n })\n const existing = userApplication.title\n output.log(\n existing\n ? `Updating title from \"${existing}\" to \"${manifest.title}\"`\n : `Setting application title to \"${manifest.title}\"`,\n )\n spin = spinner(`Updating application title`).start()\n try {\n userApplication = await updateUserApplication({\n applicationId: userApplication.id,\n appType: 'coreApp',\n body: {title: manifest.title},\n })\n spin.succeed()\n } catch (err) {\n spin.fail()\n const message = getErrorMessage(err)\n deployDebug('Error updating application title', {message})\n output.warn(`Error updating application title: ${message}`)\n }\n }\n\n spin = spinner('Deploying...').start()\n await createDeployment({\n applicationId: userApplication.id,\n isApp: true,\n isAutoUpdating,\n manifest,\n tarball,\n version: installedSdkVersion,\n })\n\n spin.succeed()\n\n // And let the user know we're done\n output.log(`\\n🚀 ${styleText('bold', 'Success!')} Application deployed`)\n\n if (!appId) {\n output.log(`\\n════ ${styleText('bold', 'Next step:')} ════`)\n output.log(\n styleText(\n 'bold',\n '\\nAdd the deployment.appId to your sanity.cli.js or sanity.cli.ts file:',\n ),\n )\n output.log(`\n${styleText(\n 'dim',\n `app: {\n // your application config here…\n}`,\n)},\n${styleText(\n ['bold', 'green'],\n `deployment: {\n appId: '${userApplication.id}',\n}\\n`,\n)}`)\n }\n } catch (error) {\n spin.clear()\n // Don't throw generic error if user cancels\n if (error.name === 'ExitPromptError') {\n output.error('Deployment cancelled by user', {exit: 1})\n return\n }\n // If the error is a CLIError, we can just output the message & error options (if any), while ensuring we exit\n if (error instanceof CLIError) {\n const {message, ...errorOptions} = error\n output.error(message, {...errorOptions, exit: 1})\n return\n }\n\n deployDebug('Error deploying application', error)\n output.error(`Error deploying application: ${error}`, {exit: 1})\n }\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","getLocalPackageVersion","spinner","pack","createDeployment","updateUserApplication","getAppId","NO_ORGANIZATION_ID","getErrorMessage","buildApp","shouldAutoUpdate","extractAppManifest","checkDir","createUserApplicationForApp","deployDebug","findUserApplicationForApp","deployApp","options","cliConfig","flags","output","projectRoot","sourceDir","workDir","directory","organizationId","app","appId","isAutoUpdating","installedSdkVersion","error","exit","external","spin","userApplication","shouldBuild","build","autoUpdatesEnabled","calledFromDeploy","outDir","start","succeed","err","fail","parentDir","base","tarball","entries","pipe","manifest","message","warn","title","undefined","from","to","existing","log","applicationId","id","appType","body","isApp","version","clear","name","errorOptions"],"mappings":"AAAA,SAAQA,QAAQ,EAAEC,OAAO,QAAO,YAAW;AAC3C,SAAQC,SAAS,QAAO,YAAW;AACnC,SAAQC,UAAU,QAAO,YAAW;AAEpC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,sBAAsB,QAAO,mBAAkB;AACvD,SAAQC,OAAO,QAAO,sBAAqB;AAC3C,SAAQC,IAAI,QAAO,SAAQ;AAE3B,SAAQC,gBAAgB,EAAEC,qBAAqB,QAAO,qCAAoC;AAC1F,SAAQC,QAAQ,QAAO,sBAAqB;AAC5C,SAAQC,kBAAkB,QAAO,8BAA6B;AAC9D,SAAQC,eAAe,QAAO,gCAA+B;AAC7D,SAAQC,QAAQ,QAAO,uBAAsB;AAC7C,SAAQC,gBAAgB,QAAO,+BAA8B;AAC7D,SAAQC,kBAAkB,QAAO,oCAAmC;AAEpE,SAAQC,QAAQ,QAAO,gBAAe;AACtC,SAAQC,2BAA2B,QAAO,mCAAkC;AAC5E,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,yBAAyB,QAAO,iCAAgC;AAGxE;;;;CAIC,GACD,OAAO,eAAeC,UAAUC,OAAyB;IACvD,MAAM,EAACC,SAAS,EAAEC,KAAK,EAAEC,MAAM,EAAEC,WAAW,EAAEC,SAAS,EAAC,GAAGL;IAE3D,MAAMM,UAAUF,YAAYG,SAAS;IAErC,MAAMC,iBAAiBP,UAAUQ,GAAG,EAAED;IACtC,MAAME,QAAQrB,SAASY;IACvB,MAAMU,iBAAiBlB,iBAAiB;QAACQ;QAAWC;QAAOC;IAAM;IACjE,MAAMS,sBAAsB,MAAM5B,uBAAuB,qBAAqBsB;IAE9E,IAAI,CAACM,qBAAqB;QACxBT,OAAOU,KAAK,CAAC,CAAC,kDAAkD,CAAC,EAAE;YAACC,MAAM;QAAC;QAC3E;IACF;IAEA,IAAI,CAACN,gBAAgB;QACnBL,OAAOU,KAAK,CAACvB,oBAAoB;YAACwB,MAAM;QAAC;QACzC;IACF;IAEA,IAAIZ,MAAMa,QAAQ,EAAE;QAClBZ,OAAOU,KAAK,CAAC,0DAA0D;YAACC,MAAM;QAAC;IACjF;IAEA,IAAIE,OAAO/B,QAAQ;IAEnB,IAAI;QACF,IAAIgC,kBAAkB,MAAMnB,0BAA0B;YACpDG;YACAO;YACAL;QACF;QAEAN,YAAY,CAAC,sBAAsB,CAAC,EAAEoB;QAEtC,IAAI,CAACA,iBAAiB;YACpBpB,YAAY,CAAC,6CAA6C,CAAC;YAE3DoB,kBAAkB,MAAMrB,4BAA4BY;YACpDX,YAAY,CAAC,wBAAwB,CAAC,EAAEoB;QAC1C;QAEA,wDAAwD;QACxD,MAAMC,cAAchB,MAAMiB,KAAK;QAC/B,IAAID,aAAa;YACfrB,YAAY,CAAC,YAAY,CAAC;YAC1B,MAAML,SAAS;gBACb4B,oBAAoBT;gBACpBU,kBAAkB;gBAClBpB;gBACAC;gBACAoB,QAAQjB;gBACRF;gBACAG;YACF;QACF;QAEA,mFAAmF;QACnFU,OAAOA,KAAKO,KAAK;QACjB,IAAI;YACF,MAAM5B,SAASU;YACfW,KAAKQ,OAAO;QACd,EAAE,OAAOC,KAAK;YACZT,KAAKU,IAAI;YACT7B,YAAY,4BAA4B4B;YACxCtB,OAAOU,KAAK,CAAC,4BAA4B;gBAACC,MAAM;YAAC;YACjD;QACF;QAEA,0CAA0C;QAC1C,MAAMa,YAAY/C,QAAQyB;QAC1B,MAAMuB,OAAOjD,SAAS0B;QACtB,MAAMwB,UAAU3C,KAAKyC,WAAW;YAACG,SAAS;gBAACF;aAAK;QAAA,GAAGG,IAAI,CAACjD;QACxD,IAAIkD;QACJ,IAAI;YACFA,WAAW,MAAMtC,mBAAmB;gBAACY;YAAO;QAC9C,EAAE,OAAOmB,KAAK;YACZ5B,YAAY,iCAAiC4B;YAC7C,MAAMQ,UAAU1C,gBAAgBkC;YAChC,0DAA0D;YAC1DtB,OAAO+B,IAAI,CAAC,CAAC,+BAA+B,EAAED,SAAS;QACzD;QAEA,6EAA6E;QAC7E,IAAID,UAAUG,UAAUC,aAAaJ,SAASG,KAAK,KAAKlB,gBAAgBkB,KAAK,EAAE;YAC7EtC,YAAY,4CAA4C;gBACtDwC,MAAMpB,gBAAgBkB,KAAK;gBAC3BG,IAAIN,SAASG,KAAK;YACpB;YACA,MAAMI,WAAWtB,gBAAgBkB,KAAK;YACtChC,OAAOqC,GAAG,CACRD,WACI,CAAC,qBAAqB,EAAEA,SAAS,MAAM,EAAEP,SAASG,KAAK,CAAC,CAAC,CAAC,GAC1D,CAAC,8BAA8B,EAAEH,SAASG,KAAK,CAAC,CAAC,CAAC;YAExDnB,OAAO/B,QAAQ,CAAC,0BAA0B,CAAC,EAAEsC,KAAK;YAClD,IAAI;gBACFN,kBAAkB,MAAM7B,sBAAsB;oBAC5CqD,eAAexB,gBAAgByB,EAAE;oBACjCC,SAAS;oBACTC,MAAM;wBAACT,OAAOH,SAASG,KAAK;oBAAA;gBAC9B;gBACAnB,KAAKQ,OAAO;YACd,EAAE,OAAOC,KAAK;gBACZT,KAAKU,IAAI;gBACT,MAAMO,UAAU1C,gBAAgBkC;gBAChC5B,YAAY,oCAAoC;oBAACoC;gBAAO;gBACxD9B,OAAO+B,IAAI,CAAC,CAAC,kCAAkC,EAAED,SAAS;YAC5D;QACF;QAEAjB,OAAO/B,QAAQ,gBAAgBsC,KAAK;QACpC,MAAMpC,iBAAiB;YACrBsD,eAAexB,gBAAgByB,EAAE;YACjCG,OAAO;YACPlC;YACAqB;YACAH;YACAiB,SAASlC;QACX;QAEAI,KAAKQ,OAAO;QAEZ,mCAAmC;QACnCrB,OAAOqC,GAAG,CAAC,CAAC,KAAK,EAAE3D,UAAU,QAAQ,YAAY,qBAAqB,CAAC;QAEvE,IAAI,CAAC6B,OAAO;YACVP,OAAOqC,GAAG,CAAC,CAAC,OAAO,EAAE3D,UAAU,QAAQ,cAAc,KAAK,CAAC;YAC3DsB,OAAOqC,GAAG,CACR3D,UACE,QACA;YAGJsB,OAAOqC,GAAG,CAAC,CAAC;AAClB,EAAE3D,UACA,OACA,CAAC;;CAEF,CAAC,EACA;AACF,EAAEA,UACA;gBAAC;gBAAQ;aAAQ,EACjB,CAAC;UACO,EAAEoC,gBAAgByB,EAAE,CAAC;GAC5B,CAAC,GACD;QACC;IACF,EAAE,OAAO7B,OAAO;QACdG,KAAK+B,KAAK;QACV,4CAA4C;QAC5C,IAAIlC,MAAMmC,IAAI,KAAK,mBAAmB;YACpC7C,OAAOU,KAAK,CAAC,gCAAgC;gBAACC,MAAM;YAAC;YACrD;QACF;QACA,8GAA8G;QAC9G,IAAID,iBAAiB9B,UAAU;YAC7B,MAAM,EAACkD,OAAO,EAAE,GAAGgB,cAAa,GAAGpC;YACnCV,OAAOU,KAAK,CAACoB,SAAS;gBAAC,GAAGgB,YAAY;gBAAEnC,MAAM;YAAC;YAC/C;QACF;QAEAjB,YAAY,+BAA+BgB;QAC3CV,OAAOU,KAAK,CAAC,CAAC,6BAA6B,EAAEA,OAAO,EAAE;YAACC,MAAM;QAAC;IAChE;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/deployApp.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, getLocalPackageVersion} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {getWorkbench} from '@sanity/workbench-cli/deploy'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment, updateUserApplication} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_ORGANIZATION_ID} from '../../util/errorMessages.js'\nimport {getErrorMessage} from '../../util/getErrorMessage.js'\nimport {buildApp} from '../build/buildApp.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {extractCoreAppManifest} from '../manifest/extractCoreAppManifest.js'\nimport {type CoreAppManifest} from '../manifest/types.js'\nimport {checkDir} from './checkDir.js'\nimport {createUserApplicationForApp} from './createUserApplicationForApp.js'\nimport {deployDebug} from './deployDebug.js'\nimport {findUserApplicationForApp} from './findUserApplicationForApp.js'\nimport {type DeployAppOptions} from './types.js'\nimport {buildViewDeploymentPayload} from './viewDeployment.js'\n\n/**\n * Deploy a Sanity application.\n *\n * @internal\n */\nexport async function deployApp(options: DeployAppOptions) {\n const {cliConfig, flags, output, projectRoot, sourceDir} = options\n const workbench = getWorkbench(cliConfig)\n\n const workDir = projectRoot.directory\n\n const organizationId = cliConfig.app?.organizationId\n const appId = getAppId(cliConfig)\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n const installedSdkVersion = await getLocalPackageVersion('@sanity/sdk-react', workDir)\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n if (!organizationId) {\n output.error(NO_ORGANIZATION_ID, {exit: 1})\n return\n }\n\n if (flags.external) {\n output.error('Deploying an app to an external host is not supported.', {exit: 1})\n }\n\n // Fail before any prompts or API calls when the app declares nothing to\n // expose.\n if (workbench) {\n try {\n workbench.assertDeployable()\n } catch (err) {\n output.error(getErrorMessage(err), {exit: exitCodes.USAGE_ERROR})\n return\n }\n }\n\n let spin = spinner('Verifying local content...')\n\n try {\n let userApplication = await findUserApplicationForApp({\n cliConfig,\n organizationId,\n output,\n })\n\n deployDebug(`User application found`, userApplication)\n\n if (!userApplication) {\n deployDebug(`No user application found. Creating a new one`)\n\n userApplication = await createUserApplicationForApp(organizationId)\n deployDebug(`User application created`, userApplication)\n }\n\n // Always build the project, unless --no-build is passed\n const shouldBuild = flags.build\n if (shouldBuild) {\n deployDebug(`Building app`)\n await buildApp({\n autoUpdatesEnabled: isAutoUpdating,\n calledFromDeploy: true,\n cliConfig,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await (workbench ? workbench.checkBuiltOutput(sourceDir) : checkDir(sourceDir))\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error(getErrorMessage(err), {exit: 1})\n return\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n const tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n let manifest: CoreAppManifest | undefined\n try {\n manifest = await extractCoreAppManifest({workDir})\n } catch (err) {\n deployDebug('Error extracting app manifest', err)\n const message = getErrorMessage(err)\n // manifests aren't strictly essential, so continue deploy\n output.warn(`Error extracting app manifest: ${message}`)\n }\n\n // Sync app title from manifest when it has changed (Brett user-applications)\n if (manifest?.title !== undefined && manifest.title !== userApplication.title) {\n deployDebug('Updating application title from manifest', {\n from: userApplication.title,\n to: manifest.title,\n })\n const existing = userApplication.title\n output.log(\n existing\n ? `Updating title from \"${existing}\" to \"${manifest.title}\"`\n : `Setting application title to \"${manifest.title}\"`,\n )\n spin = spinner(`Updating application title`).start()\n try {\n userApplication = await updateUserApplication({\n applicationId: userApplication.id,\n appType: 'coreApp',\n body: {title: manifest.title},\n })\n spin.succeed()\n } catch (err) {\n spin.fail()\n const message = getErrorMessage(err)\n deployDebug('Error updating application title', {message})\n output.warn(`Error updating application title: ${message}`)\n }\n }\n\n // Register the app's declared views with the application service. That\n // service doesn't exist yet, so validate the payload and log it (no store);\n // a malformed view declaration fails the deploy before we ship the bundle.\n // `views` lives on the branded `unstable_defineApp` result, not the legacy\n // `app` config object.\n const declaredViews = workbench?.views ?? []\n if (declaredViews.length > 0) {\n try {\n const payload = buildViewDeploymentPayload({\n applicationId: userApplication.id,\n views: declaredViews,\n })\n output.log(\n `Validated ${payload.views.length} view(s) for the application service (not yet persisted):`,\n )\n output.log(JSON.stringify(payload, null, 2))\n deployDebug('View deployment payload', payload)\n } catch (err) {\n const message = getErrorMessage(err)\n output.error(`Invalid view declaration: ${message}`, {exit: 1})\n return\n }\n }\n\n spin = spinner('Deploying...').start()\n await createDeployment({\n applicationId: userApplication.id,\n isApp: true,\n isAutoUpdating,\n manifest,\n tarball,\n version: installedSdkVersion,\n })\n\n spin.succeed()\n\n // And let the user know we're done\n output.log(`\\n🚀 ${styleText('bold', 'Success!')} Application deployed`)\n\n if (!appId) {\n output.log(`\\n════ ${styleText('bold', 'Next step:')} ════`)\n output.log(\n styleText(\n 'bold',\n '\\nAdd the deployment.appId to your sanity.cli.js or sanity.cli.ts file:',\n ),\n )\n output.log(`\n${styleText(\n 'dim',\n `app: {\n // your application config here…\n}`,\n)},\n${styleText(\n ['bold', 'green'],\n `deployment: {\n appId: '${userApplication.id}',\n}\\n`,\n)}`)\n }\n } catch (error) {\n spin.clear()\n // Don't throw generic error if user cancels\n if (error.name === 'ExitPromptError') {\n output.error('Deployment cancelled by user', {exit: 1})\n return\n }\n // If the error is a CLIError, we can just output the message & error options (if any), while ensuring we exit\n if (error instanceof CLIError) {\n const {message, ...errorOptions} = error\n output.error(message, {...errorOptions, exit: 1})\n return\n }\n\n deployDebug('Error deploying application', error)\n output.error(`Error deploying application: ${error}`, {exit: 1})\n }\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","exitCodes","getLocalPackageVersion","spinner","getWorkbench","pack","createDeployment","updateUserApplication","getAppId","NO_ORGANIZATION_ID","getErrorMessage","buildApp","shouldAutoUpdate","extractCoreAppManifest","checkDir","createUserApplicationForApp","deployDebug","findUserApplicationForApp","buildViewDeploymentPayload","deployApp","options","cliConfig","flags","output","projectRoot","sourceDir","workbench","workDir","directory","organizationId","app","appId","isAutoUpdating","installedSdkVersion","error","exit","external","assertDeployable","err","USAGE_ERROR","spin","userApplication","shouldBuild","build","autoUpdatesEnabled","calledFromDeploy","outDir","start","checkBuiltOutput","succeed","fail","parentDir","base","tarball","entries","pipe","manifest","message","warn","title","undefined","from","to","existing","log","applicationId","id","appType","body","declaredViews","views","length","payload","JSON","stringify","isApp","version","clear","name","errorOptions"],"mappings":"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"}
@@ -5,10 +5,12 @@ import { CLIError } from '@oclif/core/errors';
5
5
  import { formatSchemaValidation, SchemaExtractionError } from '@sanity/cli-build/_internal/extract';
6
6
  import { exitCodes, getLocalPackageVersion } from '@sanity/cli-core';
7
7
  import { spinner } from '@sanity/cli-core/ux';
8
+ import { getWorkbench } from '@sanity/workbench-cli/deploy';
8
9
  import { pack } from 'tar-fs';
9
10
  import { createDeployment } from '../../services/userApplications.js';
10
11
  import { getAppId } from '../../util/appId.js';
11
12
  import { NO_PROJECT_ID } from '../../util/errorMessages.js';
13
+ import { getErrorMessage } from '../../util/getErrorMessage.js';
12
14
  import { buildStudio } from '../build/buildStudio.js';
13
15
  import { shouldAutoUpdate } from '../build/shouldAutoUpdate.js';
14
16
  import { checkDir } from './checkDir.js';
@@ -19,6 +21,7 @@ import { findUserApplicationForStudio } from './findUserApplicationForStudio.js'
19
21
  import { normalizeUrl, validateUrl } from './urlUtils.js';
20
22
  export async function deployStudio(options) {
21
23
  const { cliConfig, flags, output, projectRoot, sourceDir } = options;
24
+ const workbench = getWorkbench(cliConfig);
22
25
  const workDir = projectRoot.directory;
23
26
  const configPath = projectRoot.path;
24
27
  const appId = getAppId(cliConfig);
@@ -31,6 +34,15 @@ export async function deployStudio(options) {
31
34
  });
32
35
  const isExternal = !!flags.external;
33
36
  const urlType = isExternal ? 'external' : 'internal';
37
+ // Federated (`unstable_defineApp`) applications integrate through Sanity's
38
+ // build and hosting pipeline, which `--external` skips. Fail before any
39
+ // prompts or API calls.
40
+ if (isExternal && workbench) {
41
+ output.error('Deploying a federated application to an external host is not yet supported. ' + 'Remove the `--external` flag to deploy to Sanity hosting.', {
42
+ exit: exitCodes.USAGE_ERROR
43
+ });
44
+ return;
45
+ }
34
46
  // Resolve the app host from --url flag (takes precedence) or studioHost config
35
47
  const appHost = resolveAppHost({
36
48
  flags,
@@ -129,12 +141,12 @@ export async function deployStudio(options) {
129
141
  // Ensure that the directory exists, is a directory and seems to have valid content
130
142
  spin = spin.start();
131
143
  try {
132
- await checkDir(sourceDir);
144
+ await (workbench ? workbench.checkBuiltOutput(sourceDir) : checkDir(sourceDir));
133
145
  spin.succeed();
134
146
  } catch (err) {
135
147
  spin.fail();
136
148
  deployDebug('Error checking directory', err);
137
- output.error('Error checking directory', {
149
+ output.error(getErrorMessage(err), {
138
150
  exit: 1
139
151
  });
140
152
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/deployStudio.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip, type Gzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {exitCodes, getLocalPackageVersion, type Output} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type StudioManifest} from 'sanity'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\nimport {buildStudio} from '../build/buildStudio.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {checkDir} from './checkDir.js'\nimport {createStudioUserApplication} from './createStudioUserApplication.js'\nimport {deployDebug} from './deployDebug.js'\nimport {deployStudioSchemasAndManifests} from './deployStudioSchemasAndManifests.js'\nimport {findUserApplicationForStudio} from './findUserApplicationForStudio.js'\nimport {type DeployAppOptions} from './types.js'\nimport {normalizeUrl, validateUrl} from './urlUtils.js'\n\nexport async function deployStudio(options: DeployAppOptions) {\n const {cliConfig, flags, output, projectRoot, sourceDir} = options\n\n const workDir = projectRoot.directory\n const configPath = projectRoot.path\n\n const appId = getAppId(cliConfig)\n const projectId = cliConfig.api?.projectId\n const installedSanityVersion = await getLocalPackageVersion('sanity', workDir)\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n\n const isExternal = !!flags.external\n const urlType: 'external' | 'internal' = isExternal ? 'external' : 'internal'\n\n // Resolve the app host from --url flag (takes precedence) or studioHost config\n const appHost = resolveAppHost({flags, isExternal, output, studioHost: cliConfig.studioHost})\n\n if (!installedSanityVersion) {\n output.error(`Failed to find installed sanity version`, {exit: 1})\n return\n }\n\n if (!projectId) {\n output.error(NO_PROJECT_ID, {exit: 1})\n return\n }\n\n let spin = spinner('Verifying local content')\n\n try {\n let userApplication = await findUserApplicationForStudio({\n appHost,\n appId,\n output,\n projectId,\n unattended: !!flags.yes,\n urlType,\n })\n\n if (!userApplication) {\n if (flags.yes) {\n const flagHint = isExternal\n ? 'Use --url to specify the external studio URL'\n : 'Use --url to specify the studio hostname'\n output.error(\n `Cannot prompt for ${isExternal ? 'external studio URL' : 'studio hostname'} in unattended mode. ${flagHint}.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n return\n }\n\n if (isExternal) {\n output.log('Your project has not been registered with an external studio URL.')\n output.log('Please enter the full URL where your studio is hosted.')\n } else {\n output.log('Your project has not been assigned a studio hostname.')\n output.log('To deploy your Sanity Studio to our hosted sanity.studio service,')\n output.log('you will need one. Please enter the subdomain you want to use.')\n }\n\n userApplication = await createStudioUserApplication({projectId, urlType})\n\n deployDebug('Created user application', userApplication)\n }\n\n deployDebug('Found user application', userApplication)\n\n // Always build the project, unless --no-build is passed or --external is passed\n const shouldBuild = flags.build && !isExternal\n if (shouldBuild) {\n deployDebug(`Building studio`)\n await buildStudio({\n autoUpdatesEnabled: isAutoUpdating,\n calledFromDeploy: true,\n cliConfig,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n let studioManifest: StudioManifest | null = null\n try {\n studioManifest = await deployStudioSchemasAndManifests({\n configPath,\n isExternal,\n outPath: `${sourceDir}/static`,\n projectId,\n schemaRequired: flags['schema-required'],\n verbose: flags.verbose,\n workDir,\n })\n } catch (error) {\n deployDebug('Error deploying studio schemas and manifests', error)\n if (error instanceof SchemaExtractionError) {\n output.error(formatSchemaValidation(error.validation || []), {exit: 1})\n }\n output.error(`Error deploying studio schemas and manifests: ${error}`, {exit: 1})\n }\n\n if (!studioManifest) {\n output.error('Failed to generate studio manifest. Please check your schemas and manifests.', {\n exit: 1,\n })\n }\n\n let tarball: Gzip | undefined\n\n if (!isExternal) {\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await checkDir(sourceDir)\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error('Error checking directory', {exit: 1})\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n }\n\n spin = spinner(isExternal ? 'Registering studio' : 'Deploying to sanity.studio').start()\n\n const {location} = await createDeployment({\n applicationId: userApplication.id,\n isApp: false,\n isAutoUpdating,\n manifest: studioManifest,\n projectId,\n tarball,\n version: installedSanityVersion,\n })\n\n spin.succeed()\n\n if (isExternal) {\n output.log(`\\nSuccess! Studio registered`)\n } else {\n output.log(`\\nSuccess! Studio deployed to ${styleText('cyan', location)}`)\n }\n\n if (!appId) {\n const example = `Example:\nexport default defineCliConfig({\n //…\n deployment: {\n ${styleText('cyan', `appId: '${userApplication.id}'`)},\n },\n //…\n})`\n output.log(`\\nAdd ${styleText('cyan', `appId: '${userApplication.id}'`)}`)\n output.log(`to the \\`deployment\\` section in sanity.cli.js or sanity.cli.ts`)\n output.log(`to avoid prompting for application id on next deploy.`)\n output.log(`\\n${example}`)\n }\n } catch (error) {\n // if the error is a CLIError, we can just output the message and preserve its exit code\n if (error instanceof CLIError) {\n output.error(error.message, {exit: error.oclif?.exit ?? exitCodes.RUNTIME_ERROR})\n return\n }\n\n spin.fail()\n deployDebug('Error deploying studio', error)\n output.error(`Error deploying studio: ${error}`, {exit: 1})\n }\n}\n\nfunction resolveAppHost({\n flags,\n isExternal,\n output,\n studioHost,\n}: {\n flags: DeployAppOptions['flags']\n isExternal: boolean\n output: Output\n studioHost: string | undefined\n}): string | undefined {\n const url = flags.url\n if (!url) {\n return studioHost\n }\n\n if (isExternal) {\n const normalized = normalizeUrl(url)\n const validation = validateUrl(normalized)\n if (validation !== true) {\n output.error(validation, {exit: exitCodes.USAGE_ERROR})\n return undefined\n }\n return normalized\n }\n\n // For internal deploys, strip protocol prefix and .sanity.studio suffix if present\n const hostname = url.replace(/^https?:\\/\\//i, '').replace(/\\.sanity\\.studio\\/?$/i, '')\n\n // If the result still looks like a URL (contains dots), the user likely meant --external\n if (hostname.includes('.')) {\n output.error(\n `\"${hostname}\" does not look like a sanity.studio hostname. Did you mean to use --external?`,\n {exit: exitCodes.USAGE_ERROR},\n )\n return undefined\n }\n\n // Validate hostname characters (alphanumeric and hyphens only)\n if (!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/i.test(hostname)) {\n output.error(\n `Invalid studio hostname \"${hostname}\". Hostnames can only contain letters, numbers, and hyphens.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n return undefined\n }\n\n return hostname\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","formatSchemaValidation","SchemaExtractionError","exitCodes","getLocalPackageVersion","spinner","pack","createDeployment","getAppId","NO_PROJECT_ID","buildStudio","shouldAutoUpdate","checkDir","createStudioUserApplication","deployDebug","deployStudioSchemasAndManifests","findUserApplicationForStudio","normalizeUrl","validateUrl","deployStudio","options","cliConfig","flags","output","projectRoot","sourceDir","workDir","directory","configPath","path","appId","projectId","api","installedSanityVersion","isAutoUpdating","isExternal","external","urlType","appHost","resolveAppHost","studioHost","error","exit","spin","userApplication","unattended","yes","flagHint","USAGE_ERROR","log","shouldBuild","build","autoUpdatesEnabled","calledFromDeploy","outDir","studioManifest","outPath","schemaRequired","verbose","validation","tarball","start","succeed","err","fail","parentDir","base","entries","pipe","location","applicationId","id","isApp","manifest","version","example","message","oclif","RUNTIME_ERROR","url","normalized","undefined","hostname","replace","includes","test"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/deployStudio.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip, type Gzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {exitCodes, getLocalPackageVersion, type Output} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {getWorkbench} from '@sanity/workbench-cli/deploy'\nimport {type StudioManifest} from 'sanity'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\nimport {getErrorMessage} from '../../util/getErrorMessage.js'\nimport {buildStudio} from '../build/buildStudio.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {checkDir} from './checkDir.js'\nimport {createStudioUserApplication} from './createStudioUserApplication.js'\nimport {deployDebug} from './deployDebug.js'\nimport {deployStudioSchemasAndManifests} from './deployStudioSchemasAndManifests.js'\nimport {findUserApplicationForStudio} from './findUserApplicationForStudio.js'\nimport {type DeployAppOptions} from './types.js'\nimport {normalizeUrl, validateUrl} from './urlUtils.js'\n\nexport async function deployStudio(options: DeployAppOptions) {\n const {cliConfig, flags, output, projectRoot, sourceDir} = options\n const workbench = getWorkbench(cliConfig)\n\n const workDir = projectRoot.directory\n const configPath = projectRoot.path\n\n const appId = getAppId(cliConfig)\n const projectId = cliConfig.api?.projectId\n const installedSanityVersion = await getLocalPackageVersion('sanity', workDir)\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n\n const isExternal = !!flags.external\n const urlType: 'external' | 'internal' = isExternal ? 'external' : 'internal'\n\n // Federated (`unstable_defineApp`) applications integrate through Sanity's\n // build and hosting pipeline, which `--external` skips. Fail before any\n // prompts or API calls.\n if (isExternal && workbench) {\n output.error(\n 'Deploying a federated application to an external host is not yet supported. ' +\n 'Remove the `--external` flag to deploy to Sanity hosting.',\n {exit: exitCodes.USAGE_ERROR},\n )\n return\n }\n\n // Resolve the app host from --url flag (takes precedence) or studioHost config\n const appHost = resolveAppHost({flags, isExternal, output, studioHost: cliConfig.studioHost})\n\n if (!installedSanityVersion) {\n output.error(`Failed to find installed sanity version`, {exit: 1})\n return\n }\n\n if (!projectId) {\n output.error(NO_PROJECT_ID, {exit: 1})\n return\n }\n\n let spin = spinner('Verifying local content')\n\n try {\n let userApplication = await findUserApplicationForStudio({\n appHost,\n appId,\n output,\n projectId,\n unattended: !!flags.yes,\n urlType,\n })\n\n if (!userApplication) {\n if (flags.yes) {\n const flagHint = isExternal\n ? 'Use --url to specify the external studio URL'\n : 'Use --url to specify the studio hostname'\n output.error(\n `Cannot prompt for ${isExternal ? 'external studio URL' : 'studio hostname'} in unattended mode. ${flagHint}.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n return\n }\n\n if (isExternal) {\n output.log('Your project has not been registered with an external studio URL.')\n output.log('Please enter the full URL where your studio is hosted.')\n } else {\n output.log('Your project has not been assigned a studio hostname.')\n output.log('To deploy your Sanity Studio to our hosted sanity.studio service,')\n output.log('you will need one. Please enter the subdomain you want to use.')\n }\n\n userApplication = await createStudioUserApplication({projectId, urlType})\n\n deployDebug('Created user application', userApplication)\n }\n\n deployDebug('Found user application', userApplication)\n\n // Always build the project, unless --no-build is passed or --external is passed\n const shouldBuild = flags.build && !isExternal\n if (shouldBuild) {\n deployDebug(`Building studio`)\n await buildStudio({\n autoUpdatesEnabled: isAutoUpdating,\n calledFromDeploy: true,\n cliConfig,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n let studioManifest: StudioManifest | null = null\n try {\n studioManifest = await deployStudioSchemasAndManifests({\n configPath,\n isExternal,\n outPath: `${sourceDir}/static`,\n projectId,\n schemaRequired: flags['schema-required'],\n verbose: flags.verbose,\n workDir,\n })\n } catch (error) {\n deployDebug('Error deploying studio schemas and manifests', error)\n if (error instanceof SchemaExtractionError) {\n output.error(formatSchemaValidation(error.validation || []), {exit: 1})\n }\n output.error(`Error deploying studio schemas and manifests: ${error}`, {exit: 1})\n }\n\n if (!studioManifest) {\n output.error('Failed to generate studio manifest. Please check your schemas and manifests.', {\n exit: 1,\n })\n }\n\n let tarball: Gzip | undefined\n\n if (!isExternal) {\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await (workbench ? workbench.checkBuiltOutput(sourceDir) : checkDir(sourceDir))\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error(getErrorMessage(err), {exit: 1})\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n }\n\n spin = spinner(isExternal ? 'Registering studio' : 'Deploying to sanity.studio').start()\n\n const {location} = await createDeployment({\n applicationId: userApplication.id,\n isApp: false,\n isAutoUpdating,\n manifest: studioManifest,\n projectId,\n tarball,\n version: installedSanityVersion,\n })\n\n spin.succeed()\n\n if (isExternal) {\n output.log(`\\nSuccess! Studio registered`)\n } else {\n output.log(`\\nSuccess! Studio deployed to ${styleText('cyan', location)}`)\n }\n\n if (!appId) {\n const example = `Example:\nexport default defineCliConfig({\n //…\n deployment: {\n ${styleText('cyan', `appId: '${userApplication.id}'`)},\n },\n //…\n})`\n output.log(`\\nAdd ${styleText('cyan', `appId: '${userApplication.id}'`)}`)\n output.log(`to the \\`deployment\\` section in sanity.cli.js or sanity.cli.ts`)\n output.log(`to avoid prompting for application id on next deploy.`)\n output.log(`\\n${example}`)\n }\n } catch (error) {\n // if the error is a CLIError, we can just output the message and preserve its exit code\n if (error instanceof CLIError) {\n output.error(error.message, {exit: error.oclif?.exit ?? exitCodes.RUNTIME_ERROR})\n return\n }\n\n spin.fail()\n deployDebug('Error deploying studio', error)\n output.error(`Error deploying studio: ${error}`, {exit: 1})\n }\n}\n\nfunction resolveAppHost({\n flags,\n isExternal,\n output,\n studioHost,\n}: {\n flags: DeployAppOptions['flags']\n isExternal: boolean\n output: Output\n studioHost: string | undefined\n}): string | undefined {\n const url = flags.url\n if (!url) {\n return studioHost\n }\n\n if (isExternal) {\n const normalized = normalizeUrl(url)\n const validation = validateUrl(normalized)\n if (validation !== true) {\n output.error(validation, {exit: exitCodes.USAGE_ERROR})\n return undefined\n }\n return normalized\n }\n\n // For internal deploys, strip protocol prefix and .sanity.studio suffix if present\n const hostname = url.replace(/^https?:\\/\\//i, '').replace(/\\.sanity\\.studio\\/?$/i, '')\n\n // If the result still looks like a URL (contains dots), the user likely meant --external\n if (hostname.includes('.')) {\n output.error(\n `\"${hostname}\" does not look like a sanity.studio hostname. Did you mean to use --external?`,\n {exit: exitCodes.USAGE_ERROR},\n )\n return undefined\n }\n\n // Validate hostname characters (alphanumeric and hyphens only)\n if (!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/i.test(hostname)) {\n output.error(\n `Invalid studio hostname \"${hostname}\". Hostnames can only contain letters, numbers, and hyphens.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n return undefined\n }\n\n return hostname\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","formatSchemaValidation","SchemaExtractionError","exitCodes","getLocalPackageVersion","spinner","getWorkbench","pack","createDeployment","getAppId","NO_PROJECT_ID","getErrorMessage","buildStudio","shouldAutoUpdate","checkDir","createStudioUserApplication","deployDebug","deployStudioSchemasAndManifests","findUserApplicationForStudio","normalizeUrl","validateUrl","deployStudio","options","cliConfig","flags","output","projectRoot","sourceDir","workbench","workDir","directory","configPath","path","appId","projectId","api","installedSanityVersion","isAutoUpdating","isExternal","external","urlType","error","exit","USAGE_ERROR","appHost","resolveAppHost","studioHost","spin","userApplication","unattended","yes","flagHint","log","shouldBuild","build","autoUpdatesEnabled","calledFromDeploy","outDir","studioManifest","outPath","schemaRequired","verbose","validation","tarball","start","checkBuiltOutput","succeed","err","fail","parentDir","base","entries","pipe","location","applicationId","id","isApp","manifest","version","example","message","oclif","RUNTIME_ERROR","url","normalized","undefined","hostname","replace","includes","test"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod/mini';
2
+ /**
3
+ * A view record as persisted to the application service: `type`, `name`, `src`,
4
+ * plus any view-type-specific attributes (passed through for storage).
5
+ */ const viewRecordSchema = z.looseObject({
6
+ name: z.string().check(z.regex(/^[a-zA-Z0-9_-]+$/, 'View `name` must match /^[a-zA-Z0-9_-]+$/')),
7
+ src: z.string(),
8
+ type: z.enum([
9
+ 'panel'
10
+ ])
11
+ });
12
+ /**
13
+ * Payload registering an app's views with the application service on deploy.
14
+ *
15
+ * Phase 1 stub: the service that stores views does not exist yet, so the
16
+ * payload is validated and logged only — never sent. Builds the contract the
17
+ * application-service endpoint will accept.
18
+ */ const viewDeploymentPayloadSchema = z.object({
19
+ applicationId: z.string(),
20
+ views: z.array(viewRecordSchema)
21
+ });
22
+ /**
23
+ * Validate an app's declared views into the application-service payload.
24
+ * Throws (via Zod) when a view declaration is malformed.
25
+ */ export function buildViewDeploymentPayload(input) {
26
+ return viewDeploymentPayloadSchema.parse({
27
+ applicationId: input.applicationId,
28
+ views: input.views ?? []
29
+ });
30
+ }
31
+
32
+ //# sourceMappingURL=viewDeployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/deploy/viewDeployment.ts"],"sourcesContent":["import {z} from 'zod/mini'\n\n/**\n * A view record as persisted to the application service: `type`, `name`, `src`,\n * plus any view-type-specific attributes (passed through for storage).\n */\nconst viewRecordSchema = z.looseObject({\n name: z.string().check(z.regex(/^[a-zA-Z0-9_-]+$/, 'View `name` must match /^[a-zA-Z0-9_-]+$/')),\n src: z.string(),\n type: z.enum(['panel']),\n})\n\n/**\n * Payload registering an app's views with the application service on deploy.\n *\n * Phase 1 stub: the service that stores views does not exist yet, so the\n * payload is validated and logged only — never sent. Builds the contract the\n * application-service endpoint will accept.\n */\nconst viewDeploymentPayloadSchema = z.object({\n applicationId: z.string(),\n views: z.array(viewRecordSchema),\n})\n\ntype ViewDeploymentPayload = z.infer<typeof viewDeploymentPayloadSchema>\n\n/**\n * Validate an app's declared views into the application-service payload.\n * Throws (via Zod) when a view declaration is malformed.\n */\nexport function buildViewDeploymentPayload(input: {\n applicationId: string\n views?: ReadonlyArray<Record<string, unknown>>\n}): ViewDeploymentPayload {\n return viewDeploymentPayloadSchema.parse({\n applicationId: input.applicationId,\n views: input.views ?? [],\n })\n}\n"],"names":["z","viewRecordSchema","looseObject","name","string","check","regex","src","type","enum","viewDeploymentPayloadSchema","object","applicationId","views","array","buildViewDeploymentPayload","input","parse"],"mappings":"AAAA,SAAQA,CAAC,QAAO,WAAU;AAE1B;;;CAGC,GACD,MAAMC,mBAAmBD,EAAEE,WAAW,CAAC;IACrCC,MAAMH,EAAEI,MAAM,GAAGC,KAAK,CAACL,EAAEM,KAAK,CAAC,oBAAoB;IACnDC,KAAKP,EAAEI,MAAM;IACbI,MAAMR,EAAES,IAAI,CAAC;QAAC;KAAQ;AACxB;AAEA;;;;;;CAMC,GACD,MAAMC,8BAA8BV,EAAEW,MAAM,CAAC;IAC3CC,eAAeZ,EAAEI,MAAM;IACvBS,OAAOb,EAAEc,KAAK,CAACb;AACjB;AAIA;;;CAGC,GACD,OAAO,SAASc,2BAA2BC,KAG1C;IACC,OAAON,4BAA4BO,KAAK,CAAC;QACvCL,eAAeI,MAAMJ,aAAa;QAClCC,OAAOG,MAAMH,KAAK,IAAI,EAAE;IAC1B;AACF"}