@sanity/cli 8.21.0 → 8.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +106 -47
  2. package/codemods/dashboard.js +111 -0
  3. package/dist/actions/build/buildApp.js +1 -1
  4. package/dist/actions/build/buildApp.js.map +1 -1
  5. package/dist/actions/build/buildStudio.js +1 -1
  6. package/dist/actions/build/buildStudio.js.map +1 -1
  7. package/dist/actions/codemods/dashboard.js +113 -0
  8. package/dist/actions/codemods/dashboard.js.map +1 -0
  9. package/dist/actions/codemods/index.js +2 -0
  10. package/dist/actions/codemods/index.js.map +1 -1
  11. package/dist/actions/codemods/types.js.map +1 -1
  12. package/dist/actions/deploy/deployApp.js +13 -6
  13. package/dist/actions/deploy/deployApp.js.map +1 -1
  14. package/dist/actions/deploy/deployChecks.js +12 -7
  15. package/dist/actions/deploy/deployChecks.js.map +1 -1
  16. package/dist/actions/deploy/deployRunner.js +14 -8
  17. package/dist/actions/deploy/deployRunner.js.map +1 -1
  18. package/dist/actions/deploy/deployStudio.js +39 -4
  19. package/dist/actions/deploy/deployStudio.js.map +1 -1
  20. package/dist/actions/deploy/deployStudioSchemasAndManifestsWorker.js +6 -15
  21. package/dist/actions/deploy/deployStudioSchemasAndManifestsWorker.js.map +1 -1
  22. package/dist/actions/deploy/resolveDeployTarget.js +7 -6
  23. package/dist/actions/deploy/resolveDeployTarget.js.map +1 -1
  24. package/dist/actions/init/project/promptForAppTemplateSetup.js +22 -0
  25. package/dist/actions/init/project/promptForAppTemplateSetup.js.map +1 -1
  26. package/dist/actions/schema/deploySchemas.js.map +1 -1
  27. package/dist/actions/schema/extractSchemaWatcher.js +69 -14
  28. package/dist/actions/schema/extractSchemaWatcher.js.map +1 -1
  29. package/dist/actions/schema/listSchemas.js +2 -3
  30. package/dist/actions/schema/listSchemas.js.map +1 -1
  31. package/dist/actions/schema/updateWorkspaceSchema.js.map +1 -1
  32. package/dist/actions/typegen/generateResourceTypes.js +11 -8
  33. package/dist/actions/typegen/generateResourceTypes.js.map +1 -1
  34. package/dist/actions/typegen/watchResourceTypes.js +208 -0
  35. package/dist/actions/typegen/watchResourceTypes.js.map +1 -0
  36. package/dist/actions/undeploy/runUndeploy.js +14 -8
  37. package/dist/actions/undeploy/runUndeploy.js.map +1 -1
  38. package/dist/commands/codemod.js +15 -4
  39. package/dist/commands/codemod.js.map +1 -1
  40. package/dist/commands/context/get.js +3 -8
  41. package/dist/commands/context/get.js.map +1 -1
  42. package/dist/commands/context/imports/download.js +3 -8
  43. package/dist/commands/context/imports/download.js.map +1 -1
  44. package/dist/commands/context/imports/get.js +3 -8
  45. package/dist/commands/context/imports/get.js.map +1 -1
  46. package/dist/commands/context/imports/list.js +3 -8
  47. package/dist/commands/context/imports/list.js.map +1 -1
  48. package/dist/commands/context/jobs/get.js +8 -8
  49. package/dist/commands/context/jobs/get.js.map +1 -1
  50. package/dist/commands/context/list.js +2 -6
  51. package/dist/commands/context/list.js.map +1 -1
  52. package/dist/commands/deploy.js +1 -0
  53. package/dist/commands/deploy.js.map +1 -1
  54. package/dist/commands/doctor.js +2 -1
  55. package/dist/commands/doctor.js.map +1 -1
  56. package/dist/commands/openapi/list.js +2 -4
  57. package/dist/commands/openapi/list.js.map +1 -1
  58. package/dist/commands/projects/create.js +3 -6
  59. package/dist/commands/projects/create.js.map +1 -1
  60. package/dist/commands/schemas/list.js +1 -3
  61. package/dist/commands/schemas/list.js.map +1 -1
  62. package/dist/commands/tokens/create.js +2 -5
  63. package/dist/commands/tokens/create.js.map +1 -1
  64. package/dist/commands/tokens/list.js +2 -6
  65. package/dist/commands/tokens/list.js.map +1 -1
  66. package/dist/commands/tokens/rotate.js +2 -5
  67. package/dist/commands/tokens/rotate.js.map +1 -1
  68. package/dist/commands/typegen/generate.js +83 -45
  69. package/dist/commands/typegen/generate.js.map +1 -1
  70. package/dist/commands/undeploy.js +1 -0
  71. package/dist/commands/undeploy.js.map +1 -1
  72. package/dist/commands/whoami.js +5 -11
  73. package/dist/commands/whoami.js.map +1 -1
  74. package/dist/exports/invokeSanityCli/index.js +26 -6
  75. package/dist/exports/invokeSanityCli/index.js.map +1 -1
  76. package/dist/generated/apiRoutes.js +11 -26
  77. package/dist/generated/apiRoutes.js.map +1 -1
  78. package/dist/telemetry/init.telemetry.js.map +1 -1
  79. package/oclif.manifest.json +2340 -2311
  80. package/package.json +6 -5
@@ -1,6 +1,7 @@
1
- import { basename, dirname, relative } from 'node:path';
1
+ import { basename, dirname, join, relative } from 'node:path';
2
2
  import { styleText } from 'node:util';
3
3
  import { createGzip } from 'node:zlib';
4
+ import { findBlueprintFile, readBlueprint } from '@sanity/blueprints/resolve';
4
5
  import { formatSchemaValidation, SchemaExtractionError } from '@sanity/cli-build/_internal/extract';
5
6
  import { readIconFromPath } from '@sanity/cli-build/_internal/manifest';
6
7
  import { exitCodes } from '@sanity/cli-core';
@@ -56,6 +57,13 @@ export function deployStudio(options) {
56
57
  solution: 'Add `api.projectId` to sanity.cli.ts',
57
58
  status: 'fail'
58
59
  });
60
+ if (await isBlueprintStudio(options.projectRoot.directory)) {
61
+ reporter.report({
62
+ message: 'Using the `deploy` command for a studio that is referenced by a blueprint is not allowed',
63
+ solution: 'Deploy the studio using the `blueprints deploy` command',
64
+ status: 'fail'
65
+ });
66
+ }
59
67
  // Workbench studios deploy to Brett (which needs the org); plain studios
60
68
  // resolve/create on user-applications, unchanged.
61
69
  let application = null;
@@ -126,7 +134,7 @@ export function deployStudio(options) {
126
134
  // A record created above is stranded at its slug (and blocks retries) if any
127
135
  // step before it fully deploys fails, so undo the creation on failure.
128
136
  try {
129
- await checkBuild(reporter, {
137
+ const built = await checkBuild(reporter, {
130
138
  build: ()=>buildStudio({
131
139
  applicationId: workbench ? applicationId : undefined,
132
140
  autoUpdatesEnabled: isAutoUpdating,
@@ -143,8 +151,10 @@ export function deployStudio(options) {
143
151
  }),
144
152
  successMessage: 'Studio built'
145
153
  });
146
- if (!isLegacyExternal) {
147
- await verifyOutputDir({
154
+ let mfManifest = built?.mfManifest;
155
+ // A federated build has already read its manifest; anything else verifies the directory.
156
+ if (mfManifest === undefined && !isLegacyExternal) {
157
+ mfManifest = await verifyOutputDir({
148
158
  isWorkbenchApp,
149
159
  reporter,
150
160
  sourceDir
@@ -182,6 +192,7 @@ export function deployStudio(options) {
182
192
  // The studio was created (or resolved from `deployment.appId`) before the
183
193
  // build, so this only ships the deployment; plain studios use user-applications.
184
194
  if (workbench && organizationId && applicationId) {
195
+ if (!mfManifest) throw new Error('The federated build produced no manifest.');
185
196
  await deployWorkbenchApp({
186
197
  access: toAccess(studioManifest),
187
198
  app: cliConfig.app,
@@ -191,6 +202,7 @@ export function deployStudio(options) {
191
202
  isAutoUpdating,
192
203
  isExternal: isExternallyHosted,
193
204
  label: 'Deploying studio',
205
+ mfManifest,
194
206
  // Once the deployment is live, a metadata-sync failure must not delete
195
207
  // the studio.
196
208
  onDeployed: ()=>{
@@ -206,6 +218,7 @@ export function deployStudio(options) {
206
218
  const url = getApplicationUrl({
207
219
  id: applicationId,
208
220
  organizationId,
221
+ slug: workbench.slug,
209
222
  type: 'studio'
210
223
  });
211
224
  logWorkbenchStudioDeployed({
@@ -429,5 +442,27 @@ function studioBuildSkipReason({ build, isLegacyExternal }) {
429
442
  if (!build) return 'Build skipped (--no-build) — validating existing output directory';
430
443
  return;
431
444
  }
445
+ /**
446
+ * Determine if the blueprint being deployed is referenced by a blueprint.
447
+ * @param projectRootDir - The root directory of the studio
448
+ */ async function isBlueprintStudio(projectRootDir) {
449
+ try {
450
+ const blueprintFile = findBlueprintFile(projectRootDir);
451
+ if (!blueprintFile) return false;
452
+ const localBlueprint = await readBlueprint({
453
+ path: blueprintFile
454
+ });
455
+ const blueprintReferencesStudio = localBlueprint.resources.some((r)=>{
456
+ if (r.type === 'sanity.studio' && 'root' in r && typeof r.root === 'string') {
457
+ return relative(join(dirname(blueprintFile), r.root), projectRootDir) === '';
458
+ }
459
+ return false;
460
+ });
461
+ return blueprintReferencesStudio;
462
+ } catch {
463
+ return false // fail open
464
+ ;
465
+ }
466
+ }
432
467
 
433
468
  //# sourceMappingURL=deployStudio.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/deployStudio.ts"],"sourcesContent":["import {basename, dirname, relative} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip, type Gzip} from 'node:zlib'\n\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {readIconFromPath} from '@sanity/cli-build/_internal/manifest'\nimport {exitCodes} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {\n type BrettAccess,\n type BrettWorkspace,\n createStudio,\n deployWorkbenchApp,\n getApplicationUrl,\n getWorkbench,\n getWorkbenchUrl,\n toWorkbenchPayload,\n} from '@sanity/workbench-cli/deploy'\nimport {type StudioManifest} from 'sanity'\nimport {c as createTar} from 'tar'\n\nimport {createDeployment, type UserApplication} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_ORGANIZATION_ID, NO_PROJECT_ID} from '../../util/errorMessages.js'\nimport {buildStudio} from '../build/buildStudio.js'\nimport {createStudioUserApplication} from './createUserApplication.js'\nimport {\n checkAutoUpdates,\n checkBuild,\n checkExternalUrl,\n checkPackageVersion,\n checkStudioTarget,\n type DeployCheckReporter,\n verifyOutputDir,\n} from './deployChecks.js'\nimport {deployDebug} from './deployDebug.js'\nimport {listDeploymentFiles, reportInterfaces} from './deploymentPlan.js'\nimport {type DeployPayload, type DeployResult, runDeploy} from './deployRunner.js'\nimport {deployStudioSchemasAndManifests} from './deployStudioSchemasAndManifests.js'\nimport {findUserApplicationForStudio} from './findUserApplication.js'\nimport {type DeployAppOptions} from './types.js'\n\nconst STUDIO_PACKAGE = 'sanity'\n\nexport function deployStudio(options: DeployAppOptions): Promise<void> {\n return runDeploy(options, {\n listFiles: ({flags, projectRoot, sourceDir}) =>\n flags.external ? Promise.resolve([]) : listDeploymentFiles(sourceDir, projectRoot.directory),\n run: runStudioDeployment,\n type: 'studio',\n })\n}\n\n/** Validates the deploy, extracts and uploads the schema, and ships the build. */\nasync function runStudioDeployment(\n options: DeployAppOptions,\n reporter: DeployCheckReporter,\n): Promise<DeployResult | void> {\n const {cliConfig, flags, output, sourceDir} = options\n const workDir = options.projectRoot.directory\n const isExternal = !!flags.external\n const workbench = getWorkbench(cliConfig)\n const isWorkbenchApp = workbench !== null\n const projectId = cliConfig.api?.projectId\n const organizationId = cliConfig.app?.organizationId\n const appId = getAppId(cliConfig)\n const dryRun = !!flags['dry-run']\n // A legacy external studio only registers its URL; a federated one is built\n // and deployed like a hosted one, minus the upload.\n const isLegacyExternal = isExternal && !isWorkbenchApp\n\n const appTitle = workbench\n ? flags.title?.trim() || cliConfig.app?.title?.trim() || workbench.slug\n : ''\n\n const isAutoUpdating = checkAutoUpdates(reporter, {cliConfig, flags})\n\n const version = await checkPackageVersion(reporter, {\n moduleName: STUDIO_PACKAGE,\n workDir,\n })\n\n reporter.report(\n projectId\n ? {message: `Project: ${projectId}`, status: 'pass'}\n : {\n message: NO_PROJECT_ID,\n solution: 'Add `api.projectId` to sanity.cli.ts',\n status: 'fail',\n },\n )\n\n // Workbench studios deploy to Brett (which needs the org); plain studios\n // resolve/create on user-applications, unchanged.\n let application: UserApplication | null = null\n let studioCreated = false\n let workbenchApp: {externalUrl?: string} | undefined\n let externalUrl: string | undefined\n if (workbench) {\n reporter.report(\n organizationId\n ? {message: `Organization: ${organizationId}`, status: 'pass'}\n : {\n message: NO_ORGANIZATION_ID,\n solution: 'Add `app.organizationId` to sanity.cli.ts',\n status: 'fail',\n },\n )\n workbenchApp = (\n await checkStudioTarget(reporter, {\n appId,\n isWorkbenchApp: true,\n organizationId,\n slug: workbench.slug,\n title: appTitle,\n })\n )?.application\n if (isExternal) externalUrl = checkExternalUrl(reporter, {appId, url: flags.url})\n } else {\n ;({application, created: studioCreated} = await resolveStudioApplication(options, {\n dryRun,\n reporter,\n }))\n }\n // A redeploy follows how the application was registered, so --external is only needed once.\n const isExternallyHosted = isExternal || !!workbenchApp?.externalUrl\n\n // A first deploy mints the app id and the build inlines it; --no-build would\n // ship an existing bundle carrying a different id, so it can't be a first deploy.\n if (workbench && !appId && !flags.build) {\n reporter.report({\n exitCode: exitCodes.USAGE_ERROR,\n message: 'A first deploy cannot skip the build (--no-build)',\n solution: 'Drop --no-build so the new application id is inlined into the build',\n status: 'fail',\n })\n }\n\n // Read up front so a bad icon path fails before we create or build.\n const appIcon =\n !dryRun && workbench?.icon ? await readIconFromPath(workDir, workbench.icon) : undefined\n\n // Create the studio before the build so the bundle carries its real id. A\n // redeploy already has it from `deployment.appId`; a dry run skips creation.\n let applicationId = appId\n let applicationCreated = false\n let rollbackApp: (() => Promise<void>) | undefined\n if (!dryRun && workbench && organizationId && !applicationId) {\n const created = await createStudio({\n externalUrl,\n name: workbench.name,\n organizationId,\n projectId,\n slug: workbench.slug,\n title: appTitle,\n visibility: workbench.visibility,\n })\n workbenchApp = created.application\n applicationId = created.application.id\n rollbackApp = created.rollback\n applicationCreated = true\n }\n\n // A record created above is stranded at its slug (and blocks retries) if any\n // step before it fully deploys fails, so undo the creation on failure.\n try {\n await checkBuild(reporter, {\n build: () =>\n buildStudio({\n applicationId: workbench ? applicationId : undefined,\n autoUpdatesEnabled: isAutoUpdating,\n calledFromDeploy: true,\n cliConfig,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n }),\n skipReason: studioBuildSkipReason({build: flags.build, isLegacyExternal}),\n successMessage: 'Studio built',\n })\n\n if (!isLegacyExternal) {\n await verifyOutputDir({isWorkbenchApp, reporter, sourceDir})\n }\n\n const interfaces = workbench ? reportInterfaces(reporter, workbench) : null\n\n const payload: DeployPayload = {\n appId: appId ?? null,\n isAutoUpdating,\n ...(organizationId ? {organizationId} : {}),\n ...(projectId ? {projectId} : {}),\n type: 'studio',\n version,\n ...toWorkbenchPayload(workbench, {interfaces, title: appTitle}),\n }\n\n // Dry run stops here — everything below mutates.\n if (dryRun) return {application: null, payload}\n\n // A real deploy has already exited if anything failed; landing here without a\n // resolved version means the deploy target was never resolved.\n if (!version) return\n\n const studioManifest = await uploadStudioSchema(options, {\n applicationId: workbench ? applicationId : undefined,\n isExternal: isLegacyExternal,\n })\n // The studio was created (or resolved from `deployment.appId`) before the\n // build, so this only ships the deployment; plain studios use user-applications.\n if (workbench && organizationId && applicationId) {\n await deployWorkbenchApp({\n access: toAccess(studioManifest),\n app: cliConfig.app,\n applicationId,\n icon: appIcon,\n isApp: false,\n isAutoUpdating,\n isExternal: isExternallyHosted,\n label: 'Deploying studio',\n // Once the deployment is live, a metadata-sync failure must not delete\n // the studio.\n onDeployed: () => {\n rollbackApp = undefined\n },\n slug: workbench.slug,\n sourceDir,\n title: appTitle,\n version,\n visibility: workbench.visibility,\n workspaces: toWorkspaces(studioManifest),\n })\n const url = getApplicationUrl({id: applicationId, organizationId, type: 'studio'})\n logWorkbenchStudioDeployed({applicationId, cliConfig, output, url})\n if (isExternallyHosted)\n logExternalHost({built: flags.build, organizationId, output, sourceDir})\n return {\n action: applicationCreated ? 'create' : 'update',\n application: workbenchApp ?? null,\n payload,\n url,\n }\n }\n\n if (!application) return\n const location = await shipStudioDeployment({\n application,\n isAutoUpdating,\n isExternal,\n options,\n studioManifest,\n version,\n })\n\n return {\n action: studioCreated ? 'create' : 'update',\n application,\n payload,\n url: location,\n }\n } catch (err) {\n await rollbackApp?.()\n throw err\n }\n}\n\n/**\n * Finds the application a real deploy targets, registering a studio host when\n * none is configured. A dry run resolves and reports the target read-only instead.\n */\nasync function resolveStudioApplication(\n options: DeployAppOptions,\n {dryRun, reporter}: {dryRun: boolean; reporter: DeployCheckReporter},\n): Promise<{application: UserApplication | null; created: boolean}> {\n const {cliConfig, flags, output} = options\n const isExternal = !!flags.external\n const appId = getAppId(cliConfig)\n // Sets the title on a newly registered studio; blank falls back to undefined\n const title = flags.title?.trim() || undefined\n\n if (dryRun) {\n await checkStudioTarget(reporter, {\n appId,\n isExternal,\n projectId: cliConfig.api?.projectId,\n studioHost: cliConfig.studioHost,\n title,\n urlFlag: flags.url,\n })\n return {application: null, created: false}\n }\n\n const projectId = cliConfig.api?.projectId ?? ''\n // `created` is true when a configured-but-unregistered host was just registered.\n const {application, created} = await findUserApplicationForStudio({\n appId,\n isExternal,\n output,\n projectId,\n studioHost: cliConfig.studioHost,\n title,\n unattended: !!flags.yes,\n urlFlag: flags.url,\n })\n\n if (!application) {\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 const registered = await createStudioUserApplication({\n projectId,\n title,\n urlType: isExternal ? 'external' : 'internal',\n })\n deployDebug('Created user application', registered)\n return {application: registered, created: true}\n }\n\n deployDebug('Found user application', application)\n return {application, created}\n}\n\n/** Extracts the studio schema and manifest and uploads them to the schema store. */\nasync function uploadStudioSchema(\n options: DeployAppOptions,\n {applicationId, isExternal}: {applicationId?: string; isExternal: boolean},\n): Promise<StudioManifest | null> {\n const {cliConfig, flags, output, projectRoot, sourceDir} = options\n\n let studioManifest: StudioManifest | null = null\n try {\n studioManifest = await deployStudioSchemasAndManifests(\n {\n applicationId,\n configPath: projectRoot.path,\n isExternal,\n outPath: `${sourceDir}/static`,\n projectId: cliConfig.api?.projectId ?? '',\n schemaRequired: flags['schema-required'],\n verbose: flags.verbose,\n workDir: projectRoot.directory,\n },\n output,\n )\n } catch (error) {\n deployDebug('Error deploying studio schemas and manifests', error)\n if (error instanceof SchemaExtractionError && error.validation?.length) {\n output.error(formatSchemaValidation(error.validation), {exit: exitCodes.RUNTIME_ERROR})\n }\n output.error(`Error deploying studio schemas and manifests: ${error}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (!studioManifest) {\n output.error('Failed to generate studio manifest. Please check your schemas and manifests.', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n return studioManifest\n}\n\nasync function shipStudioDeployment({\n application,\n isAutoUpdating,\n isExternal,\n options,\n studioManifest,\n version,\n}: {\n application: UserApplication\n isAutoUpdating: boolean\n isExternal: boolean\n options: DeployAppOptions\n studioManifest: StudioManifest | null\n version: string\n}): Promise<string> {\n const {cliConfig, output, sourceDir} = options\n\n let tarball: Gzip | undefined\n if (!isExternal) {\n tarball = createTar({cwd: dirname(sourceDir)}, [basename(sourceDir)]).pipe(createGzip())\n }\n\n const spin = spinner(isExternal ? 'Registering studio' : 'Deploying to sanity.studio').start()\n let location: string\n try {\n ;({location} = await createDeployment({\n applicationId: application.id,\n isApp: false,\n isAutoUpdating,\n manifest: studioManifest,\n projectId: cliConfig.api?.projectId,\n tarball,\n version,\n }))\n } catch (error) {\n spin.fail()\n throw error\n }\n spin.succeed()\n\n const named = application.title ? ` — \"${application.title}\"` : ''\n output.log(\n isExternal\n ? `\\nSuccess! Studio registered${named}`\n : `\\nSuccess! Studio deployed to ${styleText('cyan', location)}${named}`,\n )\n\n if (getAppId(cliConfig)) return location\n\n const example = `Example:\nexport default defineCliConfig({\n //…\n deployment: {\n ${styleText('cyan', `appId: '${application.id}'`)},\n },\n //…\n})`\n output.log(`\\nAdd ${styleText('cyan', `appId: '${application.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 return location\n}\n\n/**\n * One `datasets` access entry per unique workspace dataset, with a `resourceId`\n * of `\"<projectId>.<dataset>\"`. Deduped, since workspaces can share a dataset.\n */\nfunction toAccess(manifest: StudioManifest | null): BrettAccess[] {\n const resourceIds = new Set(\n (manifest?.workspaces ?? []).map((w) => `${w.projectId}.${w.dataset}`),\n )\n return [...resourceIds].map(\n (resourceId) => ({resourceId, resourceType: 'dataset'}) satisfies BrettAccess,\n )\n}\n\nfunction toWorkspaces(manifest: StudioManifest | null): BrettWorkspace[] {\n return (manifest?.workspaces ?? []).map((workspace) => ({\n basePath: workspace.basePath,\n dataset: workspace.dataset,\n icon: workspace.icon,\n name: workspace.name,\n projectId: workspace.projectId,\n schemaDescriptorId: workspace.schemaDescriptorId,\n subtitle: workspace.subtitle,\n title: workspace.title,\n }))\n}\n\n/** Renders the workbench studio's deploy result; the appId hint shows only when none is configured. */\nfunction logWorkbenchStudioDeployed({\n applicationId,\n cliConfig,\n output,\n url,\n}: {\n applicationId: string\n cliConfig: DeployAppOptions['cliConfig']\n output: DeployAppOptions['output']\n url: string\n}): void {\n output.log(`\\nSuccess! Studio deployed to ${styleText('cyan', url)}`)\n if (getAppId(cliConfig)) return\n\n output.log(`\\nAdd ${styleText('cyan', `appId: '${applicationId}'`)}`)\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}\n\n/** Tells the customer what their host must do for the Dashboard to load the studio from it. */\nfunction logExternalHost({\n built,\n organizationId,\n output,\n sourceDir,\n}: {\n built: boolean\n organizationId: string\n output: DeployAppOptions['output']\n sourceDir: string\n}): void {\n const dir = `${relative(process.cwd(), sourceDir) || '.'}/`\n output.log(`\nThe Dashboard loads this studio from your host, which must:\n 1. Serve ${dir} unchanged at the root of its URL (/mf-manifest.json, /remoteEntry-*.js, /static/*)\n 2. Send Access-Control-Allow-Origin for ${getWorkbenchUrl(organizationId)}\n 3. Respond without cookies or a sign-in${built ? `\\n\\nThis deploy rebuilt ${dir}: copy it to your host before opening the studio in the Dashboard.` : ''}`)\n}\n\nfunction studioBuildSkipReason({\n build,\n isLegacyExternal,\n}: {\n build: boolean\n isLegacyExternal: boolean\n}) {\n if (isLegacyExternal) return 'Build skipped for externally hosted studios'\n if (!build) return 'Build skipped (--no-build) — validating existing output directory'\n return\n}\n"],"names":["basename","dirname","relative","styleText","createGzip","formatSchemaValidation","SchemaExtractionError","readIconFromPath","exitCodes","spinner","createStudio","deployWorkbenchApp","getApplicationUrl","getWorkbench","getWorkbenchUrl","toWorkbenchPayload","c","createTar","createDeployment","getAppId","NO_ORGANIZATION_ID","NO_PROJECT_ID","buildStudio","createStudioUserApplication","checkAutoUpdates","checkBuild","checkExternalUrl","checkPackageVersion","checkStudioTarget","verifyOutputDir","deployDebug","listDeploymentFiles","reportInterfaces","runDeploy","deployStudioSchemasAndManifests","findUserApplicationForStudio","STUDIO_PACKAGE","deployStudio","options","listFiles","flags","projectRoot","sourceDir","external","Promise","resolve","directory","run","runStudioDeployment","type","reporter","cliConfig","output","workDir","isExternal","workbench","isWorkbenchApp","projectId","api","organizationId","app","appId","dryRun","isLegacyExternal","appTitle","title","trim","slug","isAutoUpdating","version","moduleName","report","message","status","solution","application","studioCreated","workbenchApp","externalUrl","url","created","resolveStudioApplication","isExternallyHosted","build","exitCode","USAGE_ERROR","appIcon","icon","undefined","applicationId","applicationCreated","rollbackApp","name","visibility","id","rollback","autoUpdatesEnabled","calledFromDeploy","outDir","skipReason","studioBuildSkipReason","successMessage","interfaces","payload","studioManifest","uploadStudioSchema","access","toAccess","isApp","label","onDeployed","workspaces","toWorkspaces","logWorkbenchStudioDeployed","logExternalHost","built","action","location","shipStudioDeployment","err","studioHost","urlFlag","unattended","yes","log","registered","urlType","configPath","path","outPath","schemaRequired","verbose","error","validation","length","exit","RUNTIME_ERROR","tarball","cwd","pipe","spin","start","manifest","fail","succeed","named","example","resourceIds","Set","map","w","dataset","resourceId","resourceType","workspace","basePath","schemaDescriptorId","subtitle","dir","process"],"mappings":"AAAA,SAAQA,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,QAAO,YAAW;AACrD,SAAQC,SAAS,QAAO,YAAW;AACnC,SAAQC,UAAU,QAAkB,YAAW;AAE/C,SAAQC,sBAAsB,EAAEC,qBAAqB,QAAO,sCAAqC;AACjG,SAAQC,gBAAgB,QAAO,uCAAsC;AACrE,SAAQC,SAAS,QAAO,mBAAkB;AAC1C,SAAQC,OAAO,QAAO,sBAAqB;AAC3C,SAGEC,YAAY,EACZC,kBAAkB,EAClBC,iBAAiB,EACjBC,YAAY,EACZC,eAAe,EACfC,kBAAkB,QACb,+BAA8B;AAErC,SAAQC,KAAKC,SAAS,QAAO,MAAK;AAElC,SAAQC,gBAAgB,QAA6B,qCAAoC;AACzF,SAAQC,QAAQ,QAAO,sBAAqB;AAC5C,SAAQC,kBAAkB,EAAEC,aAAa,QAAO,8BAA6B;AAC7E,SAAQC,WAAW,QAAO,0BAAyB;AACnD,SAAQC,2BAA2B,QAAO,6BAA4B;AACtE,SACEC,gBAAgB,EAChBC,UAAU,EACVC,gBAAgB,EAChBC,mBAAmB,EACnBC,iBAAiB,EAEjBC,eAAe,QACV,oBAAmB;AAC1B,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,mBAAmB,EAAEC,gBAAgB,QAAO,sBAAqB;AACzE,SAA+CC,SAAS,QAAO,oBAAmB;AAClF,SAAQC,+BAA+B,QAAO,uCAAsC;AACpF,SAAQC,4BAA4B,QAAO,2BAA0B;AAGrE,MAAMC,iBAAiB;AAEvB,OAAO,SAASC,aAAaC,OAAyB;IACpD,OAAOL,UAAUK,SAAS;QACxBC,WAAW,CAAC,EAACC,KAAK,EAAEC,WAAW,EAAEC,SAAS,EAAC,GACzCF,MAAMG,QAAQ,GAAGC,QAAQC,OAAO,CAAC,EAAE,IAAId,oBAAoBW,WAAWD,YAAYK,SAAS;QAC7FC,KAAKC;QACLC,MAAM;IACR;AACF;AAEA,gFAAgF,GAChF,eAAeD,oBACbV,OAAyB,EACzBY,QAA6B;IAE7B,MAAM,EAACC,SAAS,EAAEX,KAAK,EAAEY,MAAM,EAAEV,SAAS,EAAC,GAAGJ;IAC9C,MAAMe,UAAUf,QAAQG,WAAW,CAACK,SAAS;IAC7C,MAAMQ,aAAa,CAAC,CAACd,MAAMG,QAAQ;IACnC,MAAMY,YAAY1C,aAAasC;IAC/B,MAAMK,iBAAiBD,cAAc;IACrC,MAAME,YAAYN,UAAUO,GAAG,EAAED;IACjC,MAAME,iBAAiBR,UAAUS,GAAG,EAAED;IACtC,MAAME,QAAQ1C,SAASgC;IACvB,MAAMW,SAAS,CAAC,CAACtB,KAAK,CAAC,UAAU;IACjC,4EAA4E;IAC5E,oDAAoD;IACpD,MAAMuB,mBAAmBT,cAAc,CAACE;IAExC,MAAMQ,WAAWT,YACbf,MAAMyB,KAAK,EAAEC,UAAUf,UAAUS,GAAG,EAAEK,OAAOC,UAAUX,UAAUY,IAAI,GACrE;IAEJ,MAAMC,iBAAiB5C,iBAAiB0B,UAAU;QAACC;QAAWX;IAAK;IAEnE,MAAM6B,UAAU,MAAM1C,oBAAoBuB,UAAU;QAClDoB,YAAYlC;QACZiB;IACF;IAEAH,SAASqB,MAAM,CACbd,YACI;QAACe,SAAS,CAAC,SAAS,EAAEf,WAAW;QAAEgB,QAAQ;IAAM,IACjD;QACED,SAASnD;QACTqD,UAAU;QACVD,QAAQ;IACV;IAGN,yEAAyE;IACzE,kDAAkD;IAClD,IAAIE,cAAsC;IAC1C,IAAIC,gBAAgB;IACpB,IAAIC;IACJ,IAAIC;IACJ,IAAIvB,WAAW;QACbL,SAASqB,MAAM,CACbZ,iBACI;YAACa,SAAS,CAAC,cAAc,EAAEb,gBAAgB;YAAEc,QAAQ;QAAM,IAC3D;YACED,SAASpD;YACTsD,UAAU;YACVD,QAAQ;QACV;QAENI,eACE,CAAA,MAAMjD,kBAAkBsB,UAAU;YAChCW;YACAL,gBAAgB;YAChBG;YACAQ,MAAMZ,UAAUY,IAAI;YACpBF,OAAOD;QACT,EAAC,GACAW;QACH,IAAIrB,YAAYwB,cAAcpD,iBAAiBwB,UAAU;YAACW;YAAOkB,KAAKvC,MAAMuC,GAAG;QAAA;IACjF,OAAO;;QACH,CAAA,EAACJ,WAAW,EAAEK,SAASJ,aAAa,EAAC,GAAG,MAAMK,yBAAyB3C,SAAS;YAChFwB;YACAZ;QACF,EAAC;IACH;IACA,4FAA4F;IAC5F,MAAMgC,qBAAqB5B,cAAc,CAAC,CAACuB,cAAcC;IAEzD,6EAA6E;IAC7E,kFAAkF;IAClF,IAAIvB,aAAa,CAACM,SAAS,CAACrB,MAAM2C,KAAK,EAAE;QACvCjC,SAASqB,MAAM,CAAC;YACda,UAAU5E,UAAU6E,WAAW;YAC/Bb,SAAS;YACTE,UAAU;YACVD,QAAQ;QACV;IACF;IAEA,oEAAoE;IACpE,MAAMa,UACJ,CAACxB,UAAUP,WAAWgC,OAAO,MAAMhF,iBAAiB8C,SAASE,UAAUgC,IAAI,IAAIC;IAEjF,0EAA0E;IAC1E,6EAA6E;IAC7E,IAAIC,gBAAgB5B;IACpB,IAAI6B,qBAAqB;IACzB,IAAIC;IACJ,IAAI,CAAC7B,UAAUP,aAAaI,kBAAkB,CAAC8B,eAAe;QAC5D,MAAMT,UAAU,MAAMtE,aAAa;YACjCoE;YACAc,MAAMrC,UAAUqC,IAAI;YACpBjC;YACAF;YACAU,MAAMZ,UAAUY,IAAI;YACpBF,OAAOD;YACP6B,YAAYtC,UAAUsC,UAAU;QAClC;QACAhB,eAAeG,QAAQL,WAAW;QAClCc,gBAAgBT,QAAQL,WAAW,CAACmB,EAAE;QACtCH,cAAcX,QAAQe,QAAQ;QAC9BL,qBAAqB;IACvB;IAEA,6EAA6E;IAC7E,uEAAuE;IACvE,IAAI;QACF,MAAMjE,WAAWyB,UAAU;YACzBiC,OAAO,IACL7D,YAAY;oBACVmE,eAAelC,YAAYkC,gBAAgBD;oBAC3CQ,oBAAoB5B;oBACpB6B,kBAAkB;oBAClB9C;oBACAX;oBACA0D,QAAQxD;oBACRU;oBACAC;gBACF;YACF8C,YAAYC,sBAAsB;gBAACjB,OAAO3C,MAAM2C,KAAK;gBAAEpB;YAAgB;YACvEsC,gBAAgB;QAClB;QAEA,IAAI,CAACtC,kBAAkB;YACrB,MAAMlC,gBAAgB;gBAAC2B;gBAAgBN;gBAAUR;YAAS;QAC5D;QAEA,MAAM4D,aAAa/C,YAAYvB,iBAAiBkB,UAAUK,aAAa;QAEvE,MAAMgD,UAAyB;YAC7B1C,OAAOA,SAAS;YAChBO;YACA,GAAIT,iBAAiB;gBAACA;YAAc,IAAI,CAAC,CAAC;YAC1C,GAAIF,YAAY;gBAACA;YAAS,IAAI,CAAC,CAAC;YAChCR,MAAM;YACNoB;YACA,GAAGtD,mBAAmBwC,WAAW;gBAAC+C;gBAAYrC,OAAOD;YAAQ,EAAE;QACjE;QAEA,iDAAiD;QACjD,IAAIF,QAAQ,OAAO;YAACa,aAAa;YAAM4B;QAAO;QAE9C,8EAA8E;QAC9E,+DAA+D;QAC/D,IAAI,CAAClC,SAAS;QAEd,MAAMmC,iBAAiB,MAAMC,mBAAmBnE,SAAS;YACvDmD,eAAelC,YAAYkC,gBAAgBD;YAC3ClC,YAAYS;QACd;QACA,0EAA0E;QAC1E,iFAAiF;QACjF,IAAIR,aAAaI,kBAAkB8B,eAAe;YAChD,MAAM9E,mBAAmB;gBACvB+F,QAAQC,SAASH;gBACjB5C,KAAKT,UAAUS,GAAG;gBAClB6B;gBACAF,MAAMD;gBACNsB,OAAO;gBACPxC;gBACAd,YAAY4B;gBACZ2B,OAAO;gBACP,uEAAuE;gBACvE,cAAc;gBACdC,YAAY;oBACVnB,cAAcH;gBAChB;gBACArB,MAAMZ,UAAUY,IAAI;gBACpBzB;gBACAuB,OAAOD;gBACPK;gBACAwB,YAAYtC,UAAUsC,UAAU;gBAChCkB,YAAYC,aAAaR;YAC3B;YACA,MAAMzB,MAAMnE,kBAAkB;gBAACkF,IAAIL;gBAAe9B;gBAAgBV,MAAM;YAAQ;YAChFgE,2BAA2B;gBAACxB;gBAAetC;gBAAWC;gBAAQ2B;YAAG;YACjE,IAAIG,oBACFgC,gBAAgB;gBAACC,OAAO3E,MAAM2C,KAAK;gBAAExB;gBAAgBP;gBAAQV;YAAS;YACxE,OAAO;gBACL0E,QAAQ1B,qBAAqB,WAAW;gBACxCf,aAAaE,gBAAgB;gBAC7B0B;gBACAxB;YACF;QACF;QAEA,IAAI,CAACJ,aAAa;QAClB,MAAM0C,WAAW,MAAMC,qBAAqB;YAC1C3C;YACAP;YACAd;YACAhB;YACAkE;YACAnC;QACF;QAEA,OAAO;YACL+C,QAAQxC,gBAAgB,WAAW;YACnCD;YACA4B;YACAxB,KAAKsC;QACP;IACF,EAAE,OAAOE,KAAK;QACZ,MAAM5B;QACN,MAAM4B;IACR;AACF;AAEA;;;CAGC,GACD,eAAetC,yBACb3C,OAAyB,EACzB,EAACwB,MAAM,EAAEZ,QAAQ,EAAmD;IAEpE,MAAM,EAACC,SAAS,EAAEX,KAAK,EAAEY,MAAM,EAAC,GAAGd;IACnC,MAAMgB,aAAa,CAAC,CAACd,MAAMG,QAAQ;IACnC,MAAMkB,QAAQ1C,SAASgC;IACvB,6EAA6E;IAC7E,MAAMc,QAAQzB,MAAMyB,KAAK,EAAEC,UAAUsB;IAErC,IAAI1B,QAAQ;QACV,MAAMlC,kBAAkBsB,UAAU;YAChCW;YACAP;YACAG,WAAWN,UAAUO,GAAG,EAAED;YAC1B+D,YAAYrE,UAAUqE,UAAU;YAChCvD;YACAwD,SAASjF,MAAMuC,GAAG;QACpB;QACA,OAAO;YAACJ,aAAa;YAAMK,SAAS;QAAK;IAC3C;IAEA,MAAMvB,YAAYN,UAAUO,GAAG,EAAED,aAAa;IAC9C,iFAAiF;IACjF,MAAM,EAACkB,WAAW,EAAEK,OAAO,EAAC,GAAG,MAAM7C,6BAA6B;QAChE0B;QACAP;QACAF;QACAK;QACA+D,YAAYrE,UAAUqE,UAAU;QAChCvD;QACAyD,YAAY,CAAC,CAAClF,MAAMmF,GAAG;QACvBF,SAASjF,MAAMuC,GAAG;IACpB;IAEA,IAAI,CAACJ,aAAa;QAChB,IAAIrB,YAAY;YACdF,OAAOwE,GAAG,CAAC;YACXxE,OAAOwE,GAAG,CAAC;QACb,OAAO;YACLxE,OAAOwE,GAAG,CAAC;YACXxE,OAAOwE,GAAG,CAAC;YACXxE,OAAOwE,GAAG,CAAC;QACb;QAEA,MAAMC,aAAa,MAAMtG,4BAA4B;YACnDkC;YACAQ;YACA6D,SAASxE,aAAa,aAAa;QACrC;QACAxB,YAAY,4BAA4B+F;QACxC,OAAO;YAAClD,aAAakD;YAAY7C,SAAS;QAAI;IAChD;IAEAlD,YAAY,0BAA0B6C;IACtC,OAAO;QAACA;QAAaK;IAAO;AAC9B;AAEA,kFAAkF,GAClF,eAAeyB,mBACbnE,OAAyB,EACzB,EAACmD,aAAa,EAAEnC,UAAU,EAAgD;IAE1E,MAAM,EAACH,SAAS,EAAEX,KAAK,EAAEY,MAAM,EAAEX,WAAW,EAAEC,SAAS,EAAC,GAAGJ;IAE3D,IAAIkE,iBAAwC;IAC5C,IAAI;QACFA,iBAAiB,MAAMtE,gCACrB;YACEuD;YACAsC,YAAYtF,YAAYuF,IAAI;YAC5B1E;YACA2E,SAAS,GAAGvF,UAAU,OAAO,CAAC;YAC9Be,WAAWN,UAAUO,GAAG,EAAED,aAAa;YACvCyE,gBAAgB1F,KAAK,CAAC,kBAAkB;YACxC2F,SAAS3F,MAAM2F,OAAO;YACtB9E,SAASZ,YAAYK,SAAS;QAChC,GACAM;IAEJ,EAAE,OAAOgF,OAAO;QACdtG,YAAY,gDAAgDsG;QAC5D,IAAIA,iBAAiB9H,yBAAyB8H,MAAMC,UAAU,EAAEC,QAAQ;YACtElF,OAAOgF,KAAK,CAAC/H,uBAAuB+H,MAAMC,UAAU,GAAG;gBAACE,MAAM/H,UAAUgI,aAAa;YAAA;QACvF;QACApF,OAAOgF,KAAK,CAAC,CAAC,8CAA8C,EAAEA,OAAO,EAAE;YACrEG,MAAM/H,UAAUgI,aAAa;QAC/B;IACF;IAEA,IAAI,CAAChC,gBAAgB;QACnBpD,OAAOgF,KAAK,CAAC,gFAAgF;YAC3FG,MAAM/H,UAAUgI,aAAa;QAC/B;IACF;IAEA,OAAOhC;AACT;AAEA,eAAec,qBAAqB,EAClC3C,WAAW,EACXP,cAAc,EACdd,UAAU,EACVhB,OAAO,EACPkE,cAAc,EACdnC,OAAO,EAQR;IACC,MAAM,EAAClB,SAAS,EAAEC,MAAM,EAAEV,SAAS,EAAC,GAAGJ;IAEvC,IAAImG;IACJ,IAAI,CAACnF,YAAY;QACfmF,UAAUxH,UAAU;YAACyH,KAAKzI,QAAQyC;QAAU,GAAG;YAAC1C,SAAS0C;SAAW,EAAEiG,IAAI,CAACvI;IAC7E;IAEA,MAAMwI,OAAOnI,QAAQ6C,aAAa,uBAAuB,8BAA8BuF,KAAK;IAC5F,IAAIxB;IACJ,IAAI;;QACA,CAAA,EAACA,QAAQ,EAAC,GAAG,MAAMnG,iBAAiB;YACpCuE,eAAed,YAAYmB,EAAE;YAC7Bc,OAAO;YACPxC;YACA0E,UAAUtC;YACV/C,WAAWN,UAAUO,GAAG,EAAED;YAC1BgF;YACApE;QACF,EAAC;IACH,EAAE,OAAO+D,OAAO;QACdQ,KAAKG,IAAI;QACT,MAAMX;IACR;IACAQ,KAAKI,OAAO;IAEZ,MAAMC,QAAQtE,YAAYV,KAAK,GAAG,CAAC,IAAI,EAAEU,YAAYV,KAAK,CAAC,CAAC,CAAC,GAAG;IAChEb,OAAOwE,GAAG,CACRtE,aACI,CAAC,4BAA4B,EAAE2F,OAAO,GACtC,CAAC,8BAA8B,EAAE9I,UAAU,QAAQkH,YAAY4B,OAAO;IAG5E,IAAI9H,SAASgC,YAAY,OAAOkE;IAEhC,MAAM6B,UAAU,CAAC;;;;IAIf,EAAE/I,UAAU,QAAQ,CAAC,QAAQ,EAAEwE,YAAYmB,EAAE,CAAC,CAAC,CAAC,EAAE;;;EAGpD,CAAC;IACD1C,OAAOwE,GAAG,CAAC,CAAC,MAAM,EAAEzH,UAAU,QAAQ,CAAC,QAAQ,EAAEwE,YAAYmB,EAAE,CAAC,CAAC,CAAC,GAAG;IACrE1C,OAAOwE,GAAG,CAAC,CAAC,+DAA+D,CAAC;IAC5ExE,OAAOwE,GAAG,CAAC,CAAC,qDAAqD,CAAC;IAClExE,OAAOwE,GAAG,CAAC,CAAC,EAAE,EAAEsB,SAAS;IAEzB,OAAO7B;AACT;AAEA;;;CAGC,GACD,SAASV,SAASmC,QAA+B;IAC/C,MAAMK,cAAc,IAAIC,IACtB,AAACN,CAAAA,UAAU/B,cAAc,EAAE,AAAD,EAAGsC,GAAG,CAAC,CAACC,IAAM,GAAGA,EAAE7F,SAAS,CAAC,CAAC,EAAE6F,EAAEC,OAAO,EAAE;IAEvE,OAAO;WAAIJ;KAAY,CAACE,GAAG,CACzB,CAACG,aAAgB,CAAA;YAACA;YAAYC,cAAc;QAAS,CAAA;AAEzD;AAEA,SAASzC,aAAa8B,QAA+B;IACnD,OAAO,AAACA,CAAAA,UAAU/B,cAAc,EAAE,AAAD,EAAGsC,GAAG,CAAC,CAACK,YAAe,CAAA;YACtDC,UAAUD,UAAUC,QAAQ;YAC5BJ,SAASG,UAAUH,OAAO;YAC1BhE,MAAMmE,UAAUnE,IAAI;YACpBK,MAAM8D,UAAU9D,IAAI;YACpBnC,WAAWiG,UAAUjG,SAAS;YAC9BmG,oBAAoBF,UAAUE,kBAAkB;YAChDC,UAAUH,UAAUG,QAAQ;YAC5B5F,OAAOyF,UAAUzF,KAAK;QACxB,CAAA;AACF;AAEA,qGAAqG,GACrG,SAASgD,2BAA2B,EAClCxB,aAAa,EACbtC,SAAS,EACTC,MAAM,EACN2B,GAAG,EAMJ;IACC3B,OAAOwE,GAAG,CAAC,CAAC,8BAA8B,EAAEzH,UAAU,QAAQ4E,MAAM;IACpE,IAAI5D,SAASgC,YAAY;IAEzBC,OAAOwE,GAAG,CAAC,CAAC,MAAM,EAAEzH,UAAU,QAAQ,CAAC,QAAQ,EAAEsF,cAAc,CAAC,CAAC,GAAG;IACpErC,OAAOwE,GAAG,CAAC,CAAC,+DAA+D,CAAC;IAC5ExE,OAAOwE,GAAG,CAAC,CAAC,qDAAqD,CAAC;AACpE;AAEA,6FAA6F,GAC7F,SAASV,gBAAgB,EACvBC,KAAK,EACLxD,cAAc,EACdP,MAAM,EACNV,SAAS,EAMV;IACC,MAAMoH,MAAM,GAAG5J,SAAS6J,QAAQrB,GAAG,IAAIhG,cAAc,IAAI,CAAC,CAAC;IAC3DU,OAAOwE,GAAG,CAAC,CAAC;;WAEH,EAAEkC,IAAI;0CACyB,EAAEhJ,gBAAgB6C,gBAAgB;yCACnC,EAAEwD,QAAQ,CAAC,wBAAwB,EAAE2C,IAAI,kEAAkE,CAAC,GAAG,IAAI;AAC5J;AAEA,SAAS1D,sBAAsB,EAC7BjB,KAAK,EACLpB,gBAAgB,EAIjB;IACC,IAAIA,kBAAkB,OAAO;IAC7B,IAAI,CAACoB,OAAO,OAAO;IACnB;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/deployStudio.ts"],"sourcesContent":["import {basename, dirname, join, relative} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip, type Gzip} from 'node:zlib'\n\nimport {findBlueprintFile, readBlueprint} from '@sanity/blueprints/resolve'\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {readIconFromPath} from '@sanity/cli-build/_internal/manifest'\nimport {exitCodes} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {\n type BrettAccess,\n type BrettWorkspace,\n createStudio,\n deployWorkbenchApp,\n getApplicationUrl,\n getWorkbench,\n getWorkbenchUrl,\n toWorkbenchPayload,\n} from '@sanity/workbench-cli/deploy'\nimport {type StudioManifest} from 'sanity'\nimport {c as createTar} from 'tar'\n\nimport {createDeployment, type UserApplication} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_ORGANIZATION_ID, NO_PROJECT_ID} from '../../util/errorMessages.js'\nimport {buildStudio} from '../build/buildStudio.js'\nimport {createStudioUserApplication} from './createUserApplication.js'\nimport {\n checkAutoUpdates,\n checkBuild,\n checkExternalUrl,\n checkPackageVersion,\n checkStudioTarget,\n type DeployCheckReporter,\n verifyOutputDir,\n} from './deployChecks.js'\nimport {deployDebug} from './deployDebug.js'\nimport {listDeploymentFiles, reportInterfaces} from './deploymentPlan.js'\nimport {type DeployPayload, type DeployResult, runDeploy} from './deployRunner.js'\nimport {deployStudioSchemasAndManifests} from './deployStudioSchemasAndManifests.js'\nimport {findUserApplicationForStudio} from './findUserApplication.js'\nimport {type DeployAppOptions} from './types.js'\n\nconst STUDIO_PACKAGE = 'sanity'\n\nexport function deployStudio(options: DeployAppOptions): Promise<void> {\n return runDeploy(options, {\n listFiles: ({flags, projectRoot, sourceDir}) =>\n flags.external ? Promise.resolve([]) : listDeploymentFiles(sourceDir, projectRoot.directory),\n run: runStudioDeployment,\n type: 'studio',\n })\n}\n\n/** Validates the deploy, extracts and uploads the schema, and ships the build. */\nasync function runStudioDeployment(\n options: DeployAppOptions,\n reporter: DeployCheckReporter,\n): Promise<DeployResult | void> {\n const {cliConfig, flags, output, sourceDir} = options\n const workDir = options.projectRoot.directory\n const isExternal = !!flags.external\n const workbench = getWorkbench(cliConfig)\n const isWorkbenchApp = workbench !== null\n const projectId = cliConfig.api?.projectId\n const organizationId = cliConfig.app?.organizationId\n const appId = getAppId(cliConfig)\n const dryRun = !!flags['dry-run']\n // A legacy external studio only registers its URL; a federated one is built\n // and deployed like a hosted one, minus the upload.\n const isLegacyExternal = isExternal && !isWorkbenchApp\n\n const appTitle = workbench\n ? flags.title?.trim() || cliConfig.app?.title?.trim() || workbench.slug\n : ''\n\n const isAutoUpdating = checkAutoUpdates(reporter, {cliConfig, flags})\n\n const version = await checkPackageVersion(reporter, {\n moduleName: STUDIO_PACKAGE,\n workDir,\n })\n\n reporter.report(\n projectId\n ? {message: `Project: ${projectId}`, status: 'pass'}\n : {\n message: NO_PROJECT_ID,\n solution: 'Add `api.projectId` to sanity.cli.ts',\n status: 'fail',\n },\n )\n\n if (await isBlueprintStudio(options.projectRoot.directory)) {\n reporter.report({\n message:\n 'Using the `deploy` command for a studio that is referenced by a blueprint is not allowed',\n solution: 'Deploy the studio using the `blueprints deploy` command',\n status: 'fail',\n })\n }\n\n // Workbench studios deploy to Brett (which needs the org); plain studios\n // resolve/create on user-applications, unchanged.\n let application: UserApplication | null = null\n let studioCreated = false\n let workbenchApp: {externalUrl?: string} | undefined\n let externalUrl: string | undefined\n if (workbench) {\n reporter.report(\n organizationId\n ? {message: `Organization: ${organizationId}`, status: 'pass'}\n : {\n message: NO_ORGANIZATION_ID,\n solution: 'Add `app.organizationId` to sanity.cli.ts',\n status: 'fail',\n },\n )\n workbenchApp = (\n await checkStudioTarget(reporter, {\n appId,\n isWorkbenchApp: true,\n organizationId,\n slug: workbench.slug,\n title: appTitle,\n })\n )?.application\n if (isExternal) externalUrl = checkExternalUrl(reporter, {appId, url: flags.url})\n } else {\n ;({application, created: studioCreated} = await resolveStudioApplication(options, {\n dryRun,\n reporter,\n }))\n }\n // A redeploy follows how the application was registered, so --external is only needed once.\n const isExternallyHosted = isExternal || !!workbenchApp?.externalUrl\n\n // A first deploy mints the app id and the build inlines it; --no-build would\n // ship an existing bundle carrying a different id, so it can't be a first deploy.\n if (workbench && !appId && !flags.build) {\n reporter.report({\n exitCode: exitCodes.USAGE_ERROR,\n message: 'A first deploy cannot skip the build (--no-build)',\n solution: 'Drop --no-build so the new application id is inlined into the build',\n status: 'fail',\n })\n }\n\n // Read up front so a bad icon path fails before we create or build.\n const appIcon =\n !dryRun && workbench?.icon ? await readIconFromPath(workDir, workbench.icon) : undefined\n\n // Create the studio before the build so the bundle carries its real id. A\n // redeploy already has it from `deployment.appId`; a dry run skips creation.\n let applicationId = appId\n let applicationCreated = false\n let rollbackApp: (() => Promise<void>) | undefined\n if (!dryRun && workbench && organizationId && !applicationId) {\n const created = await createStudio({\n externalUrl,\n name: workbench.name,\n organizationId,\n projectId,\n slug: workbench.slug,\n title: appTitle,\n visibility: workbench.visibility,\n })\n workbenchApp = created.application\n applicationId = created.application.id\n rollbackApp = created.rollback\n applicationCreated = true\n }\n\n // A record created above is stranded at its slug (and blocks retries) if any\n // step before it fully deploys fails, so undo the creation on failure.\n try {\n const built = await checkBuild(reporter, {\n build: () =>\n buildStudio({\n applicationId: workbench ? applicationId : undefined,\n autoUpdatesEnabled: isAutoUpdating,\n calledFromDeploy: true,\n cliConfig,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n }),\n skipReason: studioBuildSkipReason({build: flags.build, isLegacyExternal}),\n successMessage: 'Studio built',\n })\n\n let mfManifest = built?.mfManifest\n // A federated build has already read its manifest; anything else verifies the directory.\n if (mfManifest === undefined && !isLegacyExternal) {\n mfManifest = await verifyOutputDir({isWorkbenchApp, reporter, sourceDir})\n }\n\n const interfaces = workbench ? reportInterfaces(reporter, workbench) : null\n\n const payload: DeployPayload = {\n appId: appId ?? null,\n isAutoUpdating,\n ...(organizationId ? {organizationId} : {}),\n ...(projectId ? {projectId} : {}),\n type: 'studio',\n version,\n ...toWorkbenchPayload(workbench, {interfaces, title: appTitle}),\n }\n\n // Dry run stops here — everything below mutates.\n if (dryRun) return {application: null, payload}\n\n // A real deploy has already exited if anything failed; landing here without a\n // resolved version means the deploy target was never resolved.\n if (!version) return\n\n const studioManifest = await uploadStudioSchema(options, {\n applicationId: workbench ? applicationId : undefined,\n isExternal: isLegacyExternal,\n })\n // The studio was created (or resolved from `deployment.appId`) before the\n // build, so this only ships the deployment; plain studios use user-applications.\n if (workbench && organizationId && applicationId) {\n if (!mfManifest) throw new Error('The federated build produced no manifest.')\n await deployWorkbenchApp({\n access: toAccess(studioManifest),\n app: cliConfig.app,\n applicationId,\n icon: appIcon,\n isApp: false,\n isAutoUpdating,\n isExternal: isExternallyHosted,\n label: 'Deploying studio',\n mfManifest,\n // Once the deployment is live, a metadata-sync failure must not delete\n // the studio.\n onDeployed: () => {\n rollbackApp = undefined\n },\n slug: workbench.slug,\n sourceDir,\n title: appTitle,\n version,\n visibility: workbench.visibility,\n workspaces: toWorkspaces(studioManifest),\n })\n const url = getApplicationUrl({\n id: applicationId,\n organizationId,\n slug: workbench.slug,\n type: 'studio',\n })\n logWorkbenchStudioDeployed({applicationId, cliConfig, output, url})\n if (isExternallyHosted)\n logExternalHost({built: flags.build, organizationId, output, sourceDir})\n return {\n action: applicationCreated ? 'create' : 'update',\n application: workbenchApp ?? null,\n payload,\n url,\n }\n }\n\n if (!application) return\n const location = await shipStudioDeployment({\n application,\n isAutoUpdating,\n isExternal,\n options,\n studioManifest,\n version,\n })\n\n return {\n action: studioCreated ? 'create' : 'update',\n application,\n payload,\n url: location,\n }\n } catch (err) {\n await rollbackApp?.()\n throw err\n }\n}\n\n/**\n * Finds the application a real deploy targets, registering a studio host when\n * none is configured. A dry run resolves and reports the target read-only instead.\n */\nasync function resolveStudioApplication(\n options: DeployAppOptions,\n {dryRun, reporter}: {dryRun: boolean; reporter: DeployCheckReporter},\n): Promise<{application: UserApplication | null; created: boolean}> {\n const {cliConfig, flags, output} = options\n const isExternal = !!flags.external\n const appId = getAppId(cliConfig)\n // Sets the title on a newly registered studio; blank falls back to undefined\n const title = flags.title?.trim() || undefined\n\n if (dryRun) {\n await checkStudioTarget(reporter, {\n appId,\n isExternal,\n projectId: cliConfig.api?.projectId,\n studioHost: cliConfig.studioHost,\n title,\n urlFlag: flags.url,\n })\n return {application: null, created: false}\n }\n\n const projectId = cliConfig.api?.projectId ?? ''\n // `created` is true when a configured-but-unregistered host was just registered.\n const {application, created} = await findUserApplicationForStudio({\n appId,\n isExternal,\n output,\n projectId,\n studioHost: cliConfig.studioHost,\n title,\n unattended: !!flags.yes,\n urlFlag: flags.url,\n })\n\n if (!application) {\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 const registered = await createStudioUserApplication({\n projectId,\n title,\n urlType: isExternal ? 'external' : 'internal',\n })\n deployDebug('Created user application', registered)\n return {application: registered, created: true}\n }\n\n deployDebug('Found user application', application)\n return {application, created}\n}\n\n/** Extracts the studio schema and manifest and uploads them to the schema store. */\nasync function uploadStudioSchema(\n options: DeployAppOptions,\n {applicationId, isExternal}: {applicationId?: string; isExternal: boolean},\n): Promise<StudioManifest | null> {\n const {cliConfig, flags, output, projectRoot, sourceDir} = options\n\n let studioManifest: StudioManifest | null = null\n try {\n studioManifest = await deployStudioSchemasAndManifests(\n {\n applicationId,\n configPath: projectRoot.path,\n isExternal,\n outPath: `${sourceDir}/static`,\n projectId: cliConfig.api?.projectId ?? '',\n schemaRequired: flags['schema-required'],\n verbose: flags.verbose,\n workDir: projectRoot.directory,\n },\n output,\n )\n } catch (error) {\n deployDebug('Error deploying studio schemas and manifests', error)\n if (error instanceof SchemaExtractionError && error.validation?.length) {\n output.error(formatSchemaValidation(error.validation), {exit: exitCodes.RUNTIME_ERROR})\n }\n output.error(`Error deploying studio schemas and manifests: ${error}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (!studioManifest) {\n output.error('Failed to generate studio manifest. Please check your schemas and manifests.', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n return studioManifest\n}\n\nasync function shipStudioDeployment({\n application,\n isAutoUpdating,\n isExternal,\n options,\n studioManifest,\n version,\n}: {\n application: UserApplication\n isAutoUpdating: boolean\n isExternal: boolean\n options: DeployAppOptions\n studioManifest: StudioManifest | null\n version: string\n}): Promise<string> {\n const {cliConfig, output, sourceDir} = options\n\n let tarball: Gzip | undefined\n if (!isExternal) {\n tarball = createTar({cwd: dirname(sourceDir)}, [basename(sourceDir)]).pipe(createGzip())\n }\n\n const spin = spinner(isExternal ? 'Registering studio' : 'Deploying to sanity.studio').start()\n let location: string\n try {\n ;({location} = await createDeployment({\n applicationId: application.id,\n isApp: false,\n isAutoUpdating,\n manifest: studioManifest,\n projectId: cliConfig.api?.projectId,\n tarball,\n version,\n }))\n } catch (error) {\n spin.fail()\n throw error\n }\n spin.succeed()\n\n const named = application.title ? ` — \"${application.title}\"` : ''\n output.log(\n isExternal\n ? `\\nSuccess! Studio registered${named}`\n : `\\nSuccess! Studio deployed to ${styleText('cyan', location)}${named}`,\n )\n\n if (getAppId(cliConfig)) return location\n\n const example = `Example:\nexport default defineCliConfig({\n //…\n deployment: {\n ${styleText('cyan', `appId: '${application.id}'`)},\n },\n //…\n})`\n output.log(`\\nAdd ${styleText('cyan', `appId: '${application.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 return location\n}\n\n/**\n * One `datasets` access entry per unique workspace dataset, with a `resourceId`\n * of `\"<projectId>.<dataset>\"`. Deduped, since workspaces can share a dataset.\n */\nfunction toAccess(manifest: StudioManifest | null): BrettAccess[] {\n const resourceIds = new Set(\n (manifest?.workspaces ?? []).map((w) => `${w.projectId}.${w.dataset}`),\n )\n return [...resourceIds].map(\n (resourceId) => ({resourceId, resourceType: 'dataset'}) satisfies BrettAccess,\n )\n}\n\nfunction toWorkspaces(manifest: StudioManifest | null): BrettWorkspace[] {\n return (manifest?.workspaces ?? []).map((workspace) => ({\n basePath: workspace.basePath,\n dataset: workspace.dataset,\n icon: workspace.icon,\n name: workspace.name,\n projectId: workspace.projectId,\n schemaDescriptorId: workspace.schemaDescriptorId,\n subtitle: workspace.subtitle,\n title: workspace.title,\n }))\n}\n\n/** Renders the workbench studio's deploy result; the appId hint shows only when none is configured. */\nfunction logWorkbenchStudioDeployed({\n applicationId,\n cliConfig,\n output,\n url,\n}: {\n applicationId: string\n cliConfig: DeployAppOptions['cliConfig']\n output: DeployAppOptions['output']\n url: string\n}): void {\n output.log(`\\nSuccess! Studio deployed to ${styleText('cyan', url)}`)\n if (getAppId(cliConfig)) return\n\n output.log(`\\nAdd ${styleText('cyan', `appId: '${applicationId}'`)}`)\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}\n\n/** Tells the customer what their host must do for the Dashboard to load the studio from it. */\nfunction logExternalHost({\n built,\n organizationId,\n output,\n sourceDir,\n}: {\n built: boolean\n organizationId: string\n output: DeployAppOptions['output']\n sourceDir: string\n}): void {\n const dir = `${relative(process.cwd(), sourceDir) || '.'}/`\n output.log(`\nThe Dashboard loads this studio from your host, which must:\n 1. Serve ${dir} unchanged at the root of its URL (/mf-manifest.json, /remoteEntry-*.js, /static/*)\n 2. Send Access-Control-Allow-Origin for ${getWorkbenchUrl(organizationId)}\n 3. Respond without cookies or a sign-in${built ? `\\n\\nThis deploy rebuilt ${dir}: copy it to your host before opening the studio in the Dashboard.` : ''}`)\n}\n\nfunction studioBuildSkipReason({\n build,\n isLegacyExternal,\n}: {\n build: boolean\n isLegacyExternal: boolean\n}) {\n if (isLegacyExternal) return 'Build skipped for externally hosted studios'\n if (!build) return 'Build skipped (--no-build) — validating existing output directory'\n return\n}\n\n/**\n * Determine if the blueprint being deployed is referenced by a blueprint.\n * @param projectRootDir - The root directory of the studio\n */\nasync function isBlueprintStudio(projectRootDir: string): Promise<boolean> {\n try {\n const blueprintFile = findBlueprintFile(projectRootDir)\n if (!blueprintFile) return false\n\n const localBlueprint = await readBlueprint({\n path: blueprintFile,\n })\n\n const blueprintReferencesStudio = localBlueprint.resources.some((r) => {\n if (r.type === 'sanity.studio' && 'root' in r && typeof r.root === 'string') {\n return relative(join(dirname(blueprintFile), r.root), projectRootDir) === ''\n }\n\n return false\n })\n\n return blueprintReferencesStudio\n } catch {\n return false // fail open\n }\n}\n"],"names":["basename","dirname","join","relative","styleText","createGzip","findBlueprintFile","readBlueprint","formatSchemaValidation","SchemaExtractionError","readIconFromPath","exitCodes","spinner","createStudio","deployWorkbenchApp","getApplicationUrl","getWorkbench","getWorkbenchUrl","toWorkbenchPayload","c","createTar","createDeployment","getAppId","NO_ORGANIZATION_ID","NO_PROJECT_ID","buildStudio","createStudioUserApplication","checkAutoUpdates","checkBuild","checkExternalUrl","checkPackageVersion","checkStudioTarget","verifyOutputDir","deployDebug","listDeploymentFiles","reportInterfaces","runDeploy","deployStudioSchemasAndManifests","findUserApplicationForStudio","STUDIO_PACKAGE","deployStudio","options","listFiles","flags","projectRoot","sourceDir","external","Promise","resolve","directory","run","runStudioDeployment","type","reporter","cliConfig","output","workDir","isExternal","workbench","isWorkbenchApp","projectId","api","organizationId","app","appId","dryRun","isLegacyExternal","appTitle","title","trim","slug","isAutoUpdating","version","moduleName","report","message","status","solution","isBlueprintStudio","application","studioCreated","workbenchApp","externalUrl","url","created","resolveStudioApplication","isExternallyHosted","build","exitCode","USAGE_ERROR","appIcon","icon","undefined","applicationId","applicationCreated","rollbackApp","name","visibility","id","rollback","built","autoUpdatesEnabled","calledFromDeploy","outDir","skipReason","studioBuildSkipReason","successMessage","mfManifest","interfaces","payload","studioManifest","uploadStudioSchema","Error","access","toAccess","isApp","label","onDeployed","workspaces","toWorkspaces","logWorkbenchStudioDeployed","logExternalHost","action","location","shipStudioDeployment","err","studioHost","urlFlag","unattended","yes","log","registered","urlType","configPath","path","outPath","schemaRequired","verbose","error","validation","length","exit","RUNTIME_ERROR","tarball","cwd","pipe","spin","start","manifest","fail","succeed","named","example","resourceIds","Set","map","w","dataset","resourceId","resourceType","workspace","basePath","schemaDescriptorId","subtitle","dir","process","projectRootDir","blueprintFile","localBlueprint","blueprintReferencesStudio","resources","some","r","root"],"mappings":"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"}
@@ -16,21 +16,12 @@ const debug = subdebug('deployStudioSchemasAndManifests.worker');
16
16
  */ export async function deployStudioSchemasAndManifestsWorker(port, workerData) {
17
17
  const parsedWorkerData = deployStudioSchemasAndManifestsWorkerData.parse(workerData);
18
18
  const options = parsedWorkerData;
19
- options.workspaceManifestsHandler = async (workspaceManifests)=>{
20
- if (!options.isExternal || parsedWorkerData.schemaRequired) {
21
- const schemaInputs = workspaceManifests.map((manifest)=>({
22
- dataset: manifest.dataset,
23
- manifestSchema: manifest.schema,
24
- name: manifest.name,
25
- projectId: manifest.projectId,
26
- title: manifest.title
27
- }));
28
- // Updates the workspaces schemas to /schemas endpoint
29
- await updateWorkspacesSchemas({
30
- verbose: options.verbose,
31
- workspaces: schemaInputs
32
- });
33
- }
19
+ options.workspaceSchemaHandler = async (schemaInputs)=>{
20
+ // Updates the workspaces schemas to /schemas endpoint
21
+ await updateWorkspacesSchemas({
22
+ verbose: options.verbose,
23
+ workspaces: schemaInputs
24
+ });
34
25
  };
35
26
  try {
36
27
  const result = await workerBuildStudioSchemasAndManifests(options);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/deployStudioSchemasAndManifestsWorker.ts"],"sourcesContent":["import {\n extractValidationFromSchemaError,\n workerBuildStudioSchemasAndManifests,\n} from '@sanity/cli-build/_internal/extract'\nimport {type CreateWorkspaceManifest} from '@sanity/cli-build/_internal/manifest'\nimport {subdebug} from '@sanity/cli-core'\n\nimport {\n updateWorkspacesSchemas,\n type WorkspaceSchemaInput,\n} from '../schema/updateWorkspaceSchema.js'\nimport {\n deployStudioSchemasAndManifestsWorkerData,\n type DeployStudioSchemasAndManifestsWorkerMessage,\n} from './types.js'\n\nconst debug = subdebug('deployStudioSchemasAndManifests.worker')\n\n/**\n * The subset of `MessagePort` this worker needs, so the body can be driven\n * without a real thread.\n */\nexport interface DeployStudioSchemasAndManifestsPort {\n postMessage: (message: DeployStudioSchemasAndManifestsWorkerMessage) => void\n}\n\n/**\n * Body of `deployStudioSchemasAndManifests.worker.ts`, kept out of the thread entry point so it\n * can be exercised directly in tests.\n *\n * 1. Validates the worker data\n * 2. Builds the studio schemas and manifests, updating the `/schemas` endpoint along the way\n * 3. Posts either the resulting studio manifest or a serialized error back to the parent\n *\n * @param port - The port to post the result to\n * @param workerData - The unvalidated worker data handed to the worker\n */\nexport async function deployStudioSchemasAndManifestsWorker(\n port: DeployStudioSchemasAndManifestsPort,\n workerData: unknown,\n): Promise<void> {\n const parsedWorkerData = deployStudioSchemasAndManifestsWorkerData.parse(workerData)\n\n const options: Parameters<typeof workerBuildStudioSchemasAndManifests>[0] = parsedWorkerData\n\n options.workspaceManifestsHandler = async (workspaceManifests: CreateWorkspaceManifest[]) => {\n if (!options.isExternal || parsedWorkerData.schemaRequired) {\n const schemaInputs: WorkspaceSchemaInput[] = workspaceManifests.map((manifest) => ({\n dataset: manifest.dataset,\n manifestSchema: manifest.schema,\n name: manifest.name,\n projectId: manifest.projectId,\n title: manifest.title,\n }))\n\n // Updates the workspaces schemas to /schemas endpoint\n await updateWorkspacesSchemas({verbose: options.verbose, workspaces: schemaInputs})\n }\n }\n\n try {\n const result = await workerBuildStudioSchemasAndManifests(options)\n\n port.postMessage({\n studioManifest: result.studioManifest,\n type: 'success',\n })\n } catch (error) {\n debug('Error deploying studio schemas and manifests', error)\n const validation = await extractValidationFromSchemaError(error, options.workDir)\n port.postMessage({\n error: error instanceof Error ? error.message : String(error),\n type: 'error',\n validation,\n })\n }\n}\n"],"names":["extractValidationFromSchemaError","workerBuildStudioSchemasAndManifests","subdebug","updateWorkspacesSchemas","deployStudioSchemasAndManifestsWorkerData","debug","deployStudioSchemasAndManifestsWorker","port","workerData","parsedWorkerData","parse","options","workspaceManifestsHandler","workspaceManifests","isExternal","schemaRequired","schemaInputs","map","manifest","dataset","manifestSchema","schema","name","projectId","title","verbose","workspaces","result","postMessage","studioManifest","type","error","validation","workDir","Error","message","String"],"mappings":"AAAA,SACEA,gCAAgC,EAChCC,oCAAoC,QAC/B,sCAAqC;AAE5C,SAAQC,QAAQ,QAAO,mBAAkB;AAEzC,SACEC,uBAAuB,QAElB,qCAAoC;AAC3C,SACEC,yCAAyC,QAEpC,aAAY;AAEnB,MAAMC,QAAQH,SAAS;AAUvB;;;;;;;;;;CAUC,GACD,OAAO,eAAeI,sCACpBC,IAAyC,EACzCC,UAAmB;IAEnB,MAAMC,mBAAmBL,0CAA0CM,KAAK,CAACF;IAEzE,MAAMG,UAAsEF;IAE5EE,QAAQC,yBAAyB,GAAG,OAAOC;QACzC,IAAI,CAACF,QAAQG,UAAU,IAAIL,iBAAiBM,cAAc,EAAE;YAC1D,MAAMC,eAAuCH,mBAAmBI,GAAG,CAAC,CAACC,WAAc,CAAA;oBACjFC,SAASD,SAASC,OAAO;oBACzBC,gBAAgBF,SAASG,MAAM;oBAC/BC,MAAMJ,SAASI,IAAI;oBACnBC,WAAWL,SAASK,SAAS;oBAC7BC,OAAON,SAASM,KAAK;gBACvB,CAAA;YAEA,sDAAsD;YACtD,MAAMrB,wBAAwB;gBAACsB,SAASd,QAAQc,OAAO;gBAAEC,YAAYV;YAAY;QACnF;IACF;IAEA,IAAI;QACF,MAAMW,SAAS,MAAM1B,qCAAqCU;QAE1DJ,KAAKqB,WAAW,CAAC;YACfC,gBAAgBF,OAAOE,cAAc;YACrCC,MAAM;QACR;IACF,EAAE,OAAOC,OAAO;QACd1B,MAAM,gDAAgD0B;QACtD,MAAMC,aAAa,MAAMhC,iCAAiC+B,OAAOpB,QAAQsB,OAAO;QAChF1B,KAAKqB,WAAW,CAAC;YACfG,OAAOA,iBAAiBG,QAAQH,MAAMI,OAAO,GAAGC,OAAOL;YACvDD,MAAM;YACNE;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/deployStudioSchemasAndManifestsWorker.ts"],"sourcesContent":["import {\n extractValidationFromSchemaError,\n workerBuildStudioSchemasAndManifests,\n} from '@sanity/cli-build/_internal/extract'\nimport {subdebug} from '@sanity/cli-core'\n\nimport {updateWorkspacesSchemas} from '../schema/updateWorkspaceSchema.js'\nimport {\n deployStudioSchemasAndManifestsWorkerData,\n type DeployStudioSchemasAndManifestsWorkerMessage,\n} from './types.js'\n\nconst debug = subdebug('deployStudioSchemasAndManifests.worker')\n\n/**\n * The subset of `MessagePort` this worker needs, so the body can be driven\n * without a real thread.\n */\nexport interface DeployStudioSchemasAndManifestsPort {\n postMessage: (message: DeployStudioSchemasAndManifestsWorkerMessage) => void\n}\n\n/**\n * Body of `deployStudioSchemasAndManifests.worker.ts`, kept out of the thread entry point so it\n * can be exercised directly in tests.\n *\n * 1. Validates the worker data\n * 2. Builds the studio schemas and manifests, updating the `/schemas` endpoint along the way\n * 3. Posts either the resulting studio manifest or a serialized error back to the parent\n *\n * @param port - The port to post the result to\n * @param workerData - The unvalidated worker data handed to the worker\n */\nexport async function deployStudioSchemasAndManifestsWorker(\n port: DeployStudioSchemasAndManifestsPort,\n workerData: unknown,\n): Promise<void> {\n const parsedWorkerData = deployStudioSchemasAndManifestsWorkerData.parse(workerData)\n\n const options: Parameters<typeof workerBuildStudioSchemasAndManifests>[0] = parsedWorkerData\n\n options.workspaceSchemaHandler = async (schemaInputs) => {\n // Updates the workspaces schemas to /schemas endpoint\n await updateWorkspacesSchemas({verbose: options.verbose, workspaces: schemaInputs})\n }\n\n try {\n const result = await workerBuildStudioSchemasAndManifests(options)\n\n port.postMessage({\n studioManifest: result.studioManifest,\n type: 'success',\n })\n } catch (error) {\n debug('Error deploying studio schemas and manifests', error)\n const validation = await extractValidationFromSchemaError(error, options.workDir)\n port.postMessage({\n error: error instanceof Error ? error.message : String(error),\n type: 'error',\n validation,\n })\n }\n}\n"],"names":["extractValidationFromSchemaError","workerBuildStudioSchemasAndManifests","subdebug","updateWorkspacesSchemas","deployStudioSchemasAndManifestsWorkerData","debug","deployStudioSchemasAndManifestsWorker","port","workerData","parsedWorkerData","parse","options","workspaceSchemaHandler","schemaInputs","verbose","workspaces","result","postMessage","studioManifest","type","error","validation","workDir","Error","message","String"],"mappings":"AAAA,SACEA,gCAAgC,EAChCC,oCAAoC,QAC/B,sCAAqC;AAC5C,SAAQC,QAAQ,QAAO,mBAAkB;AAEzC,SAAQC,uBAAuB,QAAO,qCAAoC;AAC1E,SACEC,yCAAyC,QAEpC,aAAY;AAEnB,MAAMC,QAAQH,SAAS;AAUvB;;;;;;;;;;CAUC,GACD,OAAO,eAAeI,sCACpBC,IAAyC,EACzCC,UAAmB;IAEnB,MAAMC,mBAAmBL,0CAA0CM,KAAK,CAACF;IAEzE,MAAMG,UAAsEF;IAE5EE,QAAQC,sBAAsB,GAAG,OAAOC;QACtC,sDAAsD;QACtD,MAAMV,wBAAwB;YAACW,SAASH,QAAQG,OAAO;YAAEC,YAAYF;QAAY;IACnF;IAEA,IAAI;QACF,MAAMG,SAAS,MAAMf,qCAAqCU;QAE1DJ,KAAKU,WAAW,CAAC;YACfC,gBAAgBF,OAAOE,cAAc;YACrCC,MAAM;QACR;IACF,EAAE,OAAOC,OAAO;QACdf,MAAM,gDAAgDe;QACtD,MAAMC,aAAa,MAAMrB,iCAAiCoB,OAAOT,QAAQW,OAAO;QAChFf,KAAKU,WAAW,CAAC;YACfG,OAAOA,iBAAiBG,QAAQH,MAAMI,OAAO,GAAGC,OAAOL;YACvDD,MAAM;YACNE;QACF;IACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { getApplication, getApplicationUrl, listApplications } from '@sanity/workbench-cli/deploy';
1
+ import { getApplication, getApplicationUrl, getWorkbenchUrl, listApplications } from '@sanity/workbench-cli/deploy';
2
2
  import { getUserApplication, getUserApplications } from '../../services/userApplications.js';
3
3
  import { APP_ID_NOT_FOUND_IN_ORGANIZATION } from '../../util/errorMessages.js';
4
4
  import { normalizeUrl, validateUrl } from './urlUtils.js';
@@ -149,8 +149,9 @@ import { normalizeUrl, validateUrl } from './urlUtils.js';
149
149
  * can name its id instead of a create that would fail.
150
150
  *
151
151
  * @internal
152
- */ export async function resolveWorkbenchApp({ appId, organizationId, slug }) {
153
- if (appId) return resolveAppById(appId);
152
+ */ export async function resolveWorkbenchApp({ appId, hasAppView = true, organizationId, slug }) {
153
+ const getUrl = (application)=>hasAppView ? getApplicationUrl(application) : getWorkbenchUrl(application.organizationId);
154
+ if (appId) return resolveAppById(appId, getUrl);
154
155
  if (organizationId && slug) {
155
156
  const existing = (await listApplications(organizationId)).find((app)=>app.slug === slug);
156
157
  if (existing) {
@@ -158,7 +159,7 @@ import { normalizeUrl, validateUrl } from './urlUtils.js';
158
159
  appHost: slug,
159
160
  existing: {
160
161
  ...existing,
161
- url: getApplicationUrl(existing)
162
+ url: getUrl(existing)
162
163
  },
163
164
  type: 'slug-taken'
164
165
  };
@@ -180,12 +181,12 @@ import { normalizeUrl, validateUrl } from './urlUtils.js';
180
181
  type: 'would-create'
181
182
  } : resolution;
182
183
  }
183
- async function resolveAppById(appId) {
184
+ async function resolveAppById(appId, getUrl) {
184
185
  const application = await getApplication(appId);
185
186
  return application ? {
186
187
  application: {
187
188
  ...application,
188
- url: getApplicationUrl(application)
189
+ url: getUrl(application)
189
190
  },
190
191
  type: 'found'
191
192
  } : {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/resolveDeployTarget.ts"],"sourcesContent":["import {getApplication, getApplicationUrl, listApplications} from '@sanity/workbench-cli/deploy'\n\nimport {\n getUserApplication,\n getUserApplications,\n type UserApplication,\n type UserApplicationResolved,\n} from '../../services/userApplications.js'\nimport {APP_ID_NOT_FOUND_IN_ORGANIZATION} from '../../util/errorMessages.js'\nimport {normalizeUrl, validateUrl} from './urlUtils.js'\n\n/** The application fields a deploy-target verdict carries for reporting. */\nexport interface DeployTargetApp {\n id: string\n title: string | null\n type: 'coreApp' | 'studio'\n\n appHost?: string\n url?: string\n}\n\n/** A coreApp verdict also carries the organization, for the dashboard URL. */\ninterface DeployTargetCoreApp extends DeployTargetApp {\n organizationId: string\n}\n\n/**\n * The read-only outcome of resolving where a deploy would go.\n *\n * - `found` — the deploy targets this existing application\n * - `would-create` — nothing registered yet; a deploy would create it without prompting\n * - `needs-input` — config doesn't determine a target; a deploy would prompt\n * (`existing` lists the applications a prompt would offer)\n * - `invalid` — the configured target can never resolve (bad host, unknown appId)\n * - `blocked` — resolution requires config that's missing (projectId/organizationId)\n *\n * Transport errors (network, permissions) throw — they're not verdicts.\n *\n * The user-applications resolvers carry the full {@link UserApplication} (the\n * real deploy needs it); the workbench resolvers and the report only need\n * {@link DeployTargetApp}, so `App` defaults to that widened shape.\n */\ntype CommonDeployTargetResolution<App = DeployTargetApp> =\n | {application: App; type: 'found'}\n | {existing: App[]; type: 'needs-input'}\n | {message: string; reason: 'app-not-found' | 'invalid-host'; type: 'invalid'}\n | {message: string; type: 'blocked'}\n\nexport type StudioDeployTargetResolution<App = DeployTargetApp> =\n | CommonDeployTargetResolution<App>\n | {appHost: string; existing: App; type: 'slug-taken'}\n | {appHost: string; type: 'would-create'}\n\nexport type AppDeployTargetResolution<App = DeployTargetCoreApp> =\n | CommonDeployTargetResolution<App>\n | {appHost: string; existing: App; type: 'slug-taken'}\n | {appHost?: string; type: 'would-create'}\n\n/**\n * Owns the studio deploy-target rules: the --url flag over studioHost config,\n * appId over appHost precedence, external URL normalization and validation.\n * Both the real deploy and the dry run consume these verdicts.\n *\n * @internal\n */\nexport async function resolveStudioDeployTarget(options: {\n appId: string | undefined\n isExternal: boolean\n projectId: string | undefined\n studioHost: string | undefined\n urlFlag: string | undefined\n}): Promise<StudioDeployTargetResolution<UserApplication>> {\n const {appId, isExternal, projectId, studioHost, urlFlag} = options\n\n // appId wins over host config (and undeploy resolves it the same way): a\n // configured appId deploys even when studioHost is stale or invalid, so it's\n // resolved before any host validation.\n if (appId) {\n if (!projectId) {\n return {message: 'api.projectId is missing', type: 'blocked'}\n }\n const application = await getUserApplication({appId, isSdkApp: false, projectId})\n if (application) {\n return {application, type: 'found'}\n }\n return {\n message: `Cannot find app with app ID ${appId}`,\n reason: 'app-not-found',\n type: 'invalid',\n }\n }\n\n const {error: hostError, host: resolvedHost} = resolveAppHost({\n isExternal,\n studioHost,\n url: urlFlag,\n })\n if (hostError) {\n return {message: hostError, reason: 'invalid-host', type: 'invalid'}\n }\n\n // A host from config hasn't passed through the --url validation yet\n let appHost = resolvedHost\n if (appHost && isExternal) {\n appHost = normalizeUrl(appHost)\n const validation = validateUrl(appHost)\n if (validation !== true) {\n return {message: validation, reason: 'invalid-host', type: 'invalid'}\n }\n }\n\n if (appHost) {\n if (!projectId) {\n return {message: 'api.projectId is missing', type: 'blocked'}\n }\n const application = await getUserApplication({appHost, isSdkApp: false, projectId})\n if (application) {\n return {application, type: 'found'}\n }\n return {appHost, type: 'would-create'}\n }\n\n // Neither appId nor host configured — a deploy would prompt.\n // Without a project there is nothing to list; a deploy would still prompt.\n const existing = projectId ? await listStudioApplications(projectId, isExternal) : []\n return {existing, type: 'needs-input'}\n}\n\n/**\n * Owns the app deploy-target rules: appId lookup, falling back to listing the\n * organization's applications. Both the real deploy and the dry run consume\n * these verdicts.\n *\n * @internal\n */\nexport async function resolveAppDeployTarget(options: {\n appId: string | undefined\n create?: boolean\n organizationId: string | undefined\n}): Promise<AppDeployTargetResolution<UserApplicationResolved>> {\n const {appId, create, organizationId} = options\n\n if (appId) {\n const application = await getUserApplication({appId, isSdkApp: true})\n if (application) {\n return {application, type: 'found'}\n }\n return {\n message: `Cannot find app with app ID ${appId}`,\n reason: 'app-not-found',\n type: 'invalid',\n }\n }\n\n if (!organizationId) {\n return {message: 'app.organizationId is missing', type: 'blocked'}\n }\n\n if (create) {\n return {type: 'would-create'}\n }\n\n const existing = await getUserApplications({appType: 'coreApp', organizationId})\n if (existing?.length) {\n return {existing, type: 'needs-input'}\n }\n\n return {type: 'would-create'}\n}\n\n/**\n * The dry-run counterpart to a workbench app's create-on-deploy: without an\n * `appId`, an org already holding the slug resolves to that app, so the report\n * can name its id instead of a create that would fail.\n *\n * @internal\n */\nexport async function resolveWorkbenchApp({\n appId,\n organizationId,\n slug,\n}: {\n appId: string | undefined\n organizationId?: string\n slug?: string\n}): Promise<AppDeployTargetResolution> {\n if (appId) return resolveAppById(appId)\n\n if (organizationId && slug) {\n const existing = (await listApplications(organizationId)).find((app) => app.slug === slug)\n if (existing) {\n return {\n appHost: slug,\n existing: {...existing, url: getApplicationUrl(existing)},\n type: 'slug-taken',\n }\n }\n }\n\n return {appHost: slug, type: 'would-create'}\n}\n\n/**\n * {@link resolveWorkbenchApp} narrowed for a studio, whose slug is always configured.\n *\n * @internal\n */\nexport async function resolveWorkbenchStudio(options: {\n appId: string | undefined\n organizationId?: string\n slug: string\n}): Promise<StudioDeployTargetResolution> {\n const resolution = await resolveWorkbenchApp(options)\n return resolution.type === 'would-create'\n ? {appHost: options.slug, type: 'would-create'}\n : resolution\n}\n\nasync function resolveAppById(\n appId: string,\n): Promise<CommonDeployTargetResolution<DeployTargetCoreApp>> {\n const application = await getApplication(appId)\n return application\n ? {\n application: {...application, url: getApplicationUrl(application)},\n type: 'found',\n }\n : {message: APP_ID_NOT_FOUND_IN_ORGANIZATION, reason: 'app-not-found', type: 'invalid'}\n}\n\nasync function listStudioApplications(\n projectId: string,\n isExternal: boolean,\n): Promise<UserApplication[]> {\n const urlType = isExternal ? 'external' : 'internal'\n const applications = await getUserApplications({appType: 'studio', projectId})\n // External deploys should only see external studios and vice versa\n return applications?.filter((application) => application.urlType === urlType) ?? []\n}\n\nfunction resolveAppHost({\n isExternal,\n studioHost,\n url,\n}: {\n isExternal: boolean\n studioHost: string | undefined\n url: string | undefined\n}): {error?: string; host?: string} {\n if (!url) {\n return {host: studioHost}\n }\n\n if (isExternal) {\n const normalized = normalizeUrl(url)\n const validation = validateUrl(normalized)\n if (validation !== true) {\n return {error: validation}\n }\n return {host: 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 return {\n error: `\"${hostname}\" does not look like a sanity.studio hostname. Did you mean to use --external?`,\n }\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 return {\n error: `Invalid studio hostname \"${hostname}\". Hostnames can only contain letters, numbers, and hyphens.`,\n }\n }\n\n return {host: hostname}\n}\n"],"names":["getApplication","getApplicationUrl","listApplications","getUserApplication","getUserApplications","APP_ID_NOT_FOUND_IN_ORGANIZATION","normalizeUrl","validateUrl","resolveStudioDeployTarget","options","appId","isExternal","projectId","studioHost","urlFlag","message","type","application","isSdkApp","reason","error","hostError","host","resolvedHost","resolveAppHost","url","appHost","validation","existing","listStudioApplications","resolveAppDeployTarget","create","organizationId","appType","length","resolveWorkbenchApp","slug","resolveAppById","find","app","resolveWorkbenchStudio","resolution","urlType","applications","filter","normalized","hostname","replace","includes","test"],"mappings":"AAAA,SAAQA,cAAc,EAAEC,iBAAiB,EAAEC,gBAAgB,QAAO,+BAA8B;AAEhG,SACEC,kBAAkB,EAClBC,mBAAmB,QAGd,qCAAoC;AAC3C,SAAQC,gCAAgC,QAAO,8BAA6B;AAC5E,SAAQC,YAAY,EAAEC,WAAW,QAAO,gBAAe;AAiDvD;;;;;;CAMC,GACD,OAAO,eAAeC,0BAA0BC,OAM/C;IACC,MAAM,EAACC,KAAK,EAAEC,UAAU,EAAEC,SAAS,EAAEC,UAAU,EAAEC,OAAO,EAAC,GAAGL;IAE5D,yEAAyE;IACzE,6EAA6E;IAC7E,uCAAuC;IACvC,IAAIC,OAAO;QACT,IAAI,CAACE,WAAW;YACd,OAAO;gBAACG,SAAS;gBAA4BC,MAAM;YAAS;QAC9D;QACA,MAAMC,cAAc,MAAMd,mBAAmB;YAACO;YAAOQ,UAAU;YAAON;QAAS;QAC/E,IAAIK,aAAa;YACf,OAAO;gBAACA;gBAAaD,MAAM;YAAO;QACpC;QACA,OAAO;YACLD,SAAS,CAAC,4BAA4B,EAAEL,OAAO;YAC/CS,QAAQ;YACRH,MAAM;QACR;IACF;IAEA,MAAM,EAACI,OAAOC,SAAS,EAAEC,MAAMC,YAAY,EAAC,GAAGC,eAAe;QAC5Db;QACAE;QACAY,KAAKX;IACP;IACA,IAAIO,WAAW;QACb,OAAO;YAACN,SAASM;YAAWF,QAAQ;YAAgBH,MAAM;QAAS;IACrE;IAEA,oEAAoE;IACpE,IAAIU,UAAUH;IACd,IAAIG,WAAWf,YAAY;QACzBe,UAAUpB,aAAaoB;QACvB,MAAMC,aAAapB,YAAYmB;QAC/B,IAAIC,eAAe,MAAM;YACvB,OAAO;gBAACZ,SAASY;gBAAYR,QAAQ;gBAAgBH,MAAM;YAAS;QACtE;IACF;IAEA,IAAIU,SAAS;QACX,IAAI,CAACd,WAAW;YACd,OAAO;gBAACG,SAAS;gBAA4BC,MAAM;YAAS;QAC9D;QACA,MAAMC,cAAc,MAAMd,mBAAmB;YAACuB;YAASR,UAAU;YAAON;QAAS;QACjF,IAAIK,aAAa;YACf,OAAO;gBAACA;gBAAaD,MAAM;YAAO;QACpC;QACA,OAAO;YAACU;YAASV,MAAM;QAAc;IACvC;IAEA,6DAA6D;IAC7D,2EAA2E;IAC3E,MAAMY,WAAWhB,YAAY,MAAMiB,uBAAuBjB,WAAWD,cAAc,EAAE;IACrF,OAAO;QAACiB;QAAUZ,MAAM;IAAa;AACvC;AAEA;;;;;;CAMC,GACD,OAAO,eAAec,uBAAuBrB,OAI5C;IACC,MAAM,EAACC,KAAK,EAAEqB,MAAM,EAAEC,cAAc,EAAC,GAAGvB;IAExC,IAAIC,OAAO;QACT,MAAMO,cAAc,MAAMd,mBAAmB;YAACO;YAAOQ,UAAU;QAAI;QACnE,IAAID,aAAa;YACf,OAAO;gBAACA;gBAAaD,MAAM;YAAO;QACpC;QACA,OAAO;YACLD,SAAS,CAAC,4BAA4B,EAAEL,OAAO;YAC/CS,QAAQ;YACRH,MAAM;QACR;IACF;IAEA,IAAI,CAACgB,gBAAgB;QACnB,OAAO;YAACjB,SAAS;YAAiCC,MAAM;QAAS;IACnE;IAEA,IAAIe,QAAQ;QACV,OAAO;YAACf,MAAM;QAAc;IAC9B;IAEA,MAAMY,WAAW,MAAMxB,oBAAoB;QAAC6B,SAAS;QAAWD;IAAc;IAC9E,IAAIJ,UAAUM,QAAQ;QACpB,OAAO;YAACN;YAAUZ,MAAM;QAAa;IACvC;IAEA,OAAO;QAACA,MAAM;IAAc;AAC9B;AAEA;;;;;;CAMC,GACD,OAAO,eAAemB,oBAAoB,EACxCzB,KAAK,EACLsB,cAAc,EACdI,IAAI,EAKL;IACC,IAAI1B,OAAO,OAAO2B,eAAe3B;IAEjC,IAAIsB,kBAAkBI,MAAM;QAC1B,MAAMR,WAAW,AAAC,CAAA,MAAM1B,iBAAiB8B,eAAc,EAAGM,IAAI,CAAC,CAACC,MAAQA,IAAIH,IAAI,KAAKA;QACrF,IAAIR,UAAU;YACZ,OAAO;gBACLF,SAASU;gBACTR,UAAU;oBAAC,GAAGA,QAAQ;oBAAEH,KAAKxB,kBAAkB2B;gBAAS;gBACxDZ,MAAM;YACR;QACF;IACF;IAEA,OAAO;QAACU,SAASU;QAAMpB,MAAM;IAAc;AAC7C;AAEA;;;;CAIC,GACD,OAAO,eAAewB,uBAAuB/B,OAI5C;IACC,MAAMgC,aAAa,MAAMN,oBAAoB1B;IAC7C,OAAOgC,WAAWzB,IAAI,KAAK,iBACvB;QAACU,SAASjB,QAAQ2B,IAAI;QAAEpB,MAAM;IAAc,IAC5CyB;AACN;AAEA,eAAeJ,eACb3B,KAAa;IAEb,MAAMO,cAAc,MAAMjB,eAAeU;IACzC,OAAOO,cACH;QACEA,aAAa;YAAC,GAAGA,WAAW;YAAEQ,KAAKxB,kBAAkBgB;QAAY;QACjED,MAAM;IACR,IACA;QAACD,SAASV;QAAkCc,QAAQ;QAAiBH,MAAM;IAAS;AAC1F;AAEA,eAAea,uBACbjB,SAAiB,EACjBD,UAAmB;IAEnB,MAAM+B,UAAU/B,aAAa,aAAa;IAC1C,MAAMgC,eAAe,MAAMvC,oBAAoB;QAAC6B,SAAS;QAAUrB;IAAS;IAC5E,mEAAmE;IACnE,OAAO+B,cAAcC,OAAO,CAAC3B,cAAgBA,YAAYyB,OAAO,KAAKA,YAAY,EAAE;AACrF;AAEA,SAASlB,eAAe,EACtBb,UAAU,EACVE,UAAU,EACVY,GAAG,EAKJ;IACC,IAAI,CAACA,KAAK;QACR,OAAO;YAACH,MAAMT;QAAU;IAC1B;IAEA,IAAIF,YAAY;QACd,MAAMkC,aAAavC,aAAamB;QAChC,MAAME,aAAapB,YAAYsC;QAC/B,IAAIlB,eAAe,MAAM;YACvB,OAAO;gBAACP,OAAOO;YAAU;QAC3B;QACA,OAAO;YAACL,MAAMuB;QAAU;IAC1B;IAEA,mFAAmF;IACnF,MAAMC,WAAWrB,IAAIsB,OAAO,CAAC,iBAAiB,IAAIA,OAAO,CAAC,yBAAyB;IAEnF,yFAAyF;IACzF,IAAID,SAASE,QAAQ,CAAC,MAAM;QAC1B,OAAO;YACL5B,OAAO,CAAC,CAAC,EAAE0B,SAAS,8EAA8E,CAAC;QACrG;IACF;IAEA,+DAA+D;IAC/D,IAAI,CAAC,mCAAmCG,IAAI,CAACH,WAAW;QACtD,OAAO;YACL1B,OAAO,CAAC,yBAAyB,EAAE0B,SAAS,4DAA4D,CAAC;QAC3G;IACF;IAEA,OAAO;QAACxB,MAAMwB;IAAQ;AACxB"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/resolveDeployTarget.ts"],"sourcesContent":["import {\n type Application,\n getApplication,\n getApplicationUrl,\n getWorkbenchUrl,\n listApplications,\n} from '@sanity/workbench-cli/deploy'\n\nimport {\n getUserApplication,\n getUserApplications,\n type UserApplication,\n type UserApplicationResolved,\n} from '../../services/userApplications.js'\nimport {APP_ID_NOT_FOUND_IN_ORGANIZATION} from '../../util/errorMessages.js'\nimport {normalizeUrl, validateUrl} from './urlUtils.js'\n\n/** The application fields a deploy-target verdict carries for reporting. */\nexport interface DeployTargetApp {\n id: string\n title: string | null\n type: 'coreApp' | 'studio'\n\n appHost?: string\n url?: string\n}\n\n/** A coreApp verdict also carries the organization, for the dashboard URL. */\ninterface DeployTargetCoreApp extends DeployTargetApp {\n organizationId: string\n}\n\n/**\n * The read-only outcome of resolving where a deploy would go.\n *\n * - `found` — the deploy targets this existing application\n * - `would-create` — nothing registered yet; a deploy would create it without prompting\n * - `needs-input` — config doesn't determine a target; a deploy would prompt\n * (`existing` lists the applications a prompt would offer)\n * - `invalid` — the configured target can never resolve (bad host, unknown appId)\n * - `blocked` — resolution requires config that's missing (projectId/organizationId)\n *\n * Transport errors (network, permissions) throw — they're not verdicts.\n *\n * The user-applications resolvers carry the full {@link UserApplication} (the\n * real deploy needs it); the workbench resolvers and the report only need\n * {@link DeployTargetApp}, so `App` defaults to that widened shape.\n */\ntype CommonDeployTargetResolution<App = DeployTargetApp> =\n | {application: App; type: 'found'}\n | {existing: App[]; type: 'needs-input'}\n | {message: string; reason: 'app-not-found' | 'invalid-host'; type: 'invalid'}\n | {message: string; type: 'blocked'}\n\nexport type StudioDeployTargetResolution<App = DeployTargetApp> =\n | CommonDeployTargetResolution<App>\n | {appHost: string; existing: App; type: 'slug-taken'}\n | {appHost: string; type: 'would-create'}\n\nexport type AppDeployTargetResolution<App = DeployTargetCoreApp> =\n | CommonDeployTargetResolution<App>\n | {appHost: string; existing: App; type: 'slug-taken'}\n | {appHost?: string; type: 'would-create'}\n\n/**\n * Owns the studio deploy-target rules: the --url flag over studioHost config,\n * appId over appHost precedence, external URL normalization and validation.\n * Both the real deploy and the dry run consume these verdicts.\n *\n * @internal\n */\nexport async function resolveStudioDeployTarget(options: {\n appId: string | undefined\n isExternal: boolean\n projectId: string | undefined\n studioHost: string | undefined\n urlFlag: string | undefined\n}): Promise<StudioDeployTargetResolution<UserApplication>> {\n const {appId, isExternal, projectId, studioHost, urlFlag} = options\n\n // appId wins over host config (and undeploy resolves it the same way): a\n // configured appId deploys even when studioHost is stale or invalid, so it's\n // resolved before any host validation.\n if (appId) {\n if (!projectId) {\n return {message: 'api.projectId is missing', type: 'blocked'}\n }\n const application = await getUserApplication({appId, isSdkApp: false, projectId})\n if (application) {\n return {application, type: 'found'}\n }\n return {\n message: `Cannot find app with app ID ${appId}`,\n reason: 'app-not-found',\n type: 'invalid',\n }\n }\n\n const {error: hostError, host: resolvedHost} = resolveAppHost({\n isExternal,\n studioHost,\n url: urlFlag,\n })\n if (hostError) {\n return {message: hostError, reason: 'invalid-host', type: 'invalid'}\n }\n\n // A host from config hasn't passed through the --url validation yet\n let appHost = resolvedHost\n if (appHost && isExternal) {\n appHost = normalizeUrl(appHost)\n const validation = validateUrl(appHost)\n if (validation !== true) {\n return {message: validation, reason: 'invalid-host', type: 'invalid'}\n }\n }\n\n if (appHost) {\n if (!projectId) {\n return {message: 'api.projectId is missing', type: 'blocked'}\n }\n const application = await getUserApplication({appHost, isSdkApp: false, projectId})\n if (application) {\n return {application, type: 'found'}\n }\n return {appHost, type: 'would-create'}\n }\n\n // Neither appId nor host configured — a deploy would prompt.\n // Without a project there is nothing to list; a deploy would still prompt.\n const existing = projectId ? await listStudioApplications(projectId, isExternal) : []\n return {existing, type: 'needs-input'}\n}\n\n/**\n * Owns the app deploy-target rules: appId lookup, falling back to listing the\n * organization's applications. Both the real deploy and the dry run consume\n * these verdicts.\n *\n * @internal\n */\nexport async function resolveAppDeployTarget(options: {\n appId: string | undefined\n create?: boolean\n organizationId: string | undefined\n}): Promise<AppDeployTargetResolution<UserApplicationResolved>> {\n const {appId, create, organizationId} = options\n\n if (appId) {\n const application = await getUserApplication({appId, isSdkApp: true})\n if (application) {\n return {application, type: 'found'}\n }\n return {\n message: `Cannot find app with app ID ${appId}`,\n reason: 'app-not-found',\n type: 'invalid',\n }\n }\n\n if (!organizationId) {\n return {message: 'app.organizationId is missing', type: 'blocked'}\n }\n\n if (create) {\n return {type: 'would-create'}\n }\n\n const existing = await getUserApplications({appType: 'coreApp', organizationId})\n if (existing?.length) {\n return {existing, type: 'needs-input'}\n }\n\n return {type: 'would-create'}\n}\n\n/**\n * The dry-run counterpart to a workbench app's create-on-deploy: without an\n * `appId`, an org already holding the slug resolves to that app, so the report\n * can name its id instead of a create that would fail.\n *\n * @internal\n */\nexport async function resolveWorkbenchApp({\n appId,\n hasAppView = true,\n organizationId,\n slug,\n}: {\n appId: string | undefined\n hasAppView?: boolean\n organizationId?: string\n slug?: string\n}): Promise<AppDeployTargetResolution> {\n const getUrl = (application: Application) =>\n hasAppView ? getApplicationUrl(application) : getWorkbenchUrl(application.organizationId)\n\n if (appId) return resolveAppById(appId, getUrl)\n\n if (organizationId && slug) {\n const existing = (await listApplications(organizationId)).find((app) => app.slug === slug)\n if (existing) {\n return {\n appHost: slug,\n existing: {...existing, url: getUrl(existing)},\n type: 'slug-taken',\n }\n }\n }\n\n return {appHost: slug, type: 'would-create'}\n}\n\n/**\n * {@link resolveWorkbenchApp} narrowed for a studio, whose slug is always configured.\n *\n * @internal\n */\nexport async function resolveWorkbenchStudio(options: {\n appId: string | undefined\n organizationId?: string\n slug: string\n}): Promise<StudioDeployTargetResolution> {\n const resolution = await resolveWorkbenchApp(options)\n return resolution.type === 'would-create'\n ? {appHost: options.slug, type: 'would-create'}\n : resolution\n}\n\nasync function resolveAppById(\n appId: string,\n getUrl: (application: Application) => string,\n): Promise<CommonDeployTargetResolution<DeployTargetCoreApp>> {\n const application = await getApplication(appId)\n return application\n ? {\n application: {...application, url: getUrl(application)},\n type: 'found',\n }\n : {message: APP_ID_NOT_FOUND_IN_ORGANIZATION, reason: 'app-not-found', type: 'invalid'}\n}\n\nasync function listStudioApplications(\n projectId: string,\n isExternal: boolean,\n): Promise<UserApplication[]> {\n const urlType = isExternal ? 'external' : 'internal'\n const applications = await getUserApplications({appType: 'studio', projectId})\n // External deploys should only see external studios and vice versa\n return applications?.filter((application) => application.urlType === urlType) ?? []\n}\n\nfunction resolveAppHost({\n isExternal,\n studioHost,\n url,\n}: {\n isExternal: boolean\n studioHost: string | undefined\n url: string | undefined\n}): {error?: string; host?: string} {\n if (!url) {\n return {host: studioHost}\n }\n\n if (isExternal) {\n const normalized = normalizeUrl(url)\n const validation = validateUrl(normalized)\n if (validation !== true) {\n return {error: validation}\n }\n return {host: 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 return {\n error: `\"${hostname}\" does not look like a sanity.studio hostname. Did you mean to use --external?`,\n }\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 return {\n error: `Invalid studio hostname \"${hostname}\". Hostnames can only contain letters, numbers, and hyphens.`,\n }\n }\n\n return {host: hostname}\n}\n"],"names":["getApplication","getApplicationUrl","getWorkbenchUrl","listApplications","getUserApplication","getUserApplications","APP_ID_NOT_FOUND_IN_ORGANIZATION","normalizeUrl","validateUrl","resolveStudioDeployTarget","options","appId","isExternal","projectId","studioHost","urlFlag","message","type","application","isSdkApp","reason","error","hostError","host","resolvedHost","resolveAppHost","url","appHost","validation","existing","listStudioApplications","resolveAppDeployTarget","create","organizationId","appType","length","resolveWorkbenchApp","hasAppView","slug","getUrl","resolveAppById","find","app","resolveWorkbenchStudio","resolution","urlType","applications","filter","normalized","hostname","replace","includes","test"],"mappings":"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"}
@@ -7,6 +7,11 @@ export async function promptForAppTemplateSetup({ coupon, dataset, datasetDefaul
7
7
  const hasProjectFlag = Boolean(project || newProject);
8
8
  if (unattended || hasProjectFlag) {
9
9
  if (!project && !newProject) {
10
+ trace.log({
11
+ datasetName: '',
12
+ selectedOption: 'skip',
13
+ step: 'createOrSelectDataset'
14
+ });
10
15
  return {
11
16
  datasetName: '',
12
17
  displayName: '',
@@ -32,6 +37,12 @@ export async function promptForAppTemplateSetup({ coupon, dataset, datasetDefaul
32
37
  unattended,
33
38
  visibility
34
39
  });
40
+ trace.log({
41
+ datasetName: datasetResult.datasetName,
42
+ selectedOption: datasetResult.userAction,
43
+ step: 'createOrSelectDataset',
44
+ visibility
45
+ });
35
46
  return {
36
47
  datasetName: datasetResult.datasetName,
37
48
  displayName: projectResult.displayName,
@@ -68,6 +79,11 @@ export async function promptForAppTemplateSetup({ coupon, dataset, datasetDefaul
68
79
  selectedOption: 'skip',
69
80
  step: 'configureAppProject'
70
81
  });
82
+ trace.log({
83
+ datasetName: '',
84
+ selectedOption: 'skip',
85
+ step: 'createOrSelectDataset'
86
+ });
71
87
  return {
72
88
  datasetName: '',
73
89
  displayName: '',
@@ -101,6 +117,12 @@ export async function promptForAppTemplateSetup({ coupon, dataset, datasetDefaul
101
117
  unattended: false,
102
118
  visibility
103
119
  });
120
+ trace.log({
121
+ datasetName: datasetResult.datasetName,
122
+ selectedOption: datasetResult.userAction,
123
+ step: 'createOrSelectDataset',
124
+ visibility
125
+ });
104
126
  return {
105
127
  datasetName: datasetResult.datasetName,
106
128
  displayName: projectResult.displayName,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/actions/init/project/promptForAppTemplateSetup.ts"],"sourcesContent":["import {type SanityOrgUser, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {select, Separator} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {listProjects} from '../../../services/projects.js'\nimport {type InitStepResult} from '../../../telemetry/init.telemetry.js'\nimport {type InitContext} from '../types.js'\nimport {getOrCreateDataset} from './getOrCreateDataset.js'\nimport {getOrCreateProject} from './getOrCreateProject.js'\nimport {promptForProjectCreation} from './promptForProjectCreation.js'\n\nexport async function promptForAppTemplateSetup({\n coupon,\n dataset,\n datasetDefault,\n newProject,\n organization,\n organizationId,\n output,\n planId,\n project,\n trace,\n unattended,\n user,\n visibility,\n}: {\n coupon: string | undefined\n dataset: string | undefined\n datasetDefault: boolean\n newProject: string | undefined\n organization: string | undefined\n organizationId: string | undefined\n output: InitContext['output']\n planId: string | undefined\n project: string | undefined\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n unattended: boolean\n user: SanityOrgUser\n visibility: 'private' | 'public' | undefined\n}): Promise<{\n datasetName: string\n displayName: string\n organizationId?: string\n projectId: string\n}> {\n const hasProjectFlag = Boolean(project || newProject)\n\n if (unattended || hasProjectFlag) {\n if (!project && !newProject) {\n return {datasetName: '', displayName: '', projectId: ''}\n }\n const projectResult = await getOrCreateProject({\n coupon,\n newProject,\n organization,\n planId,\n project,\n unattended,\n user,\n })\n const datasetResult = await getOrCreateDataset({\n dataset,\n defaultConfig: datasetDefault || undefined,\n displayName: projectResult.displayName,\n output,\n projectId: projectResult.projectId,\n showDefaultConfigPrompt: false,\n unattended,\n visibility,\n })\n return {\n datasetName: datasetResult.datasetName,\n displayName: projectResult.displayName,\n organizationId: projectResult.organizationId,\n projectId: projectResult.projectId,\n }\n }\n\n const projects = (await listProjects()).toSorted((a, b) => b.createdAt.localeCompare(a.createdAt))\n\n const projectChoices = projects.map((p) => ({\n name: `${p.displayName} (${p.id})`,\n value: p.id,\n }))\n\n const SKIP_PROJECT = '__skip__'\n const NEW_PROJECT = '__new__'\n\n const selected = await select({\n choices: [\n {name: \"Skip — I'll configure later\", value: SKIP_PROJECT},\n {name: 'Create new project', value: NEW_PROJECT},\n ...(projectChoices.length > 0 ? [new Separator(), ...projectChoices] : []),\n ],\n message: 'Configure a project for this app?',\n })\n\n if (selected === SKIP_PROJECT) {\n trace.log({selectedOption: 'skip', step: 'configureAppProject'})\n return {datasetName: '', displayName: '', projectId: ''}\n }\n\n trace.log({\n selectedOption: selected === NEW_PROJECT ? 'create' : 'existing',\n step: 'configureAppProject',\n })\n\n const selectedProject = projects.find((p) => p.id === selected)\n const projectResult =\n selected === NEW_PROJECT\n ? await promptForProjectCreation({\n coupon,\n isUsersFirstProject: projects.length === 0,\n organizationId,\n organizations: [],\n planId,\n user,\n })\n : {\n displayName: selectedProject?.displayName ?? '',\n organizationId: selectedProject?.organizationId ?? undefined,\n projectId: selected,\n }\n\n const datasetResult = await getOrCreateDataset({\n dataset,\n defaultConfig: datasetDefault || undefined,\n displayName: projectResult.displayName,\n output,\n projectId: projectResult.projectId,\n showDefaultConfigPrompt: false,\n unattended: false,\n visibility,\n })\n return {\n datasetName: datasetResult.datasetName,\n displayName: projectResult.displayName,\n organizationId: projectResult.organizationId,\n projectId: projectResult.projectId,\n }\n}\n"],"names":["select","Separator","listProjects","getOrCreateDataset","getOrCreateProject","promptForProjectCreation","promptForAppTemplateSetup","coupon","dataset","datasetDefault","newProject","organization","organizationId","output","planId","project","trace","unattended","user","visibility","hasProjectFlag","Boolean","datasetName","displayName","projectId","projectResult","datasetResult","defaultConfig","undefined","showDefaultConfigPrompt","projects","toSorted","a","b","createdAt","localeCompare","projectChoices","map","p","name","id","value","SKIP_PROJECT","NEW_PROJECT","selected","choices","length","message","log","selectedOption","step","selectedProject","find","isUsersFirstProject","organizations"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/actions/init/project/promptForAppTemplateSetup.ts"],"sourcesContent":["import {type SanityOrgUser, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {select, Separator} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {listProjects} from '../../../services/projects.js'\nimport {type InitStepResult} from '../../../telemetry/init.telemetry.js'\nimport {type InitContext} from '../types.js'\nimport {getOrCreateDataset} from './getOrCreateDataset.js'\nimport {getOrCreateProject} from './getOrCreateProject.js'\nimport {promptForProjectCreation} from './promptForProjectCreation.js'\n\nexport async function promptForAppTemplateSetup({\n coupon,\n dataset,\n datasetDefault,\n newProject,\n organization,\n organizationId,\n output,\n planId,\n project,\n trace,\n unattended,\n user,\n visibility,\n}: {\n coupon: string | undefined\n dataset: string | undefined\n datasetDefault: boolean\n newProject: string | undefined\n organization: string | undefined\n organizationId: string | undefined\n output: InitContext['output']\n planId: string | undefined\n project: string | undefined\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n unattended: boolean\n user: SanityOrgUser\n visibility: 'private' | 'public' | undefined\n}): Promise<{\n datasetName: string\n displayName: string\n organizationId?: string\n projectId: string\n}> {\n const hasProjectFlag = Boolean(project || newProject)\n\n if (unattended || hasProjectFlag) {\n if (!project && !newProject) {\n trace.log({datasetName: '', selectedOption: 'skip', step: 'createOrSelectDataset'})\n return {datasetName: '', displayName: '', projectId: ''}\n }\n const projectResult = await getOrCreateProject({\n coupon,\n newProject,\n organization,\n planId,\n project,\n unattended,\n user,\n })\n const datasetResult = await getOrCreateDataset({\n dataset,\n defaultConfig: datasetDefault || undefined,\n displayName: projectResult.displayName,\n output,\n projectId: projectResult.projectId,\n showDefaultConfigPrompt: false,\n unattended,\n visibility,\n })\n trace.log({\n datasetName: datasetResult.datasetName,\n selectedOption: datasetResult.userAction,\n step: 'createOrSelectDataset',\n visibility,\n })\n return {\n datasetName: datasetResult.datasetName,\n displayName: projectResult.displayName,\n organizationId: projectResult.organizationId,\n projectId: projectResult.projectId,\n }\n }\n\n const projects = (await listProjects()).toSorted((a, b) => b.createdAt.localeCompare(a.createdAt))\n\n const projectChoices = projects.map((p) => ({\n name: `${p.displayName} (${p.id})`,\n value: p.id,\n }))\n\n const SKIP_PROJECT = '__skip__'\n const NEW_PROJECT = '__new__'\n\n const selected = await select({\n choices: [\n {name: \"Skip — I'll configure later\", value: SKIP_PROJECT},\n {name: 'Create new project', value: NEW_PROJECT},\n ...(projectChoices.length > 0 ? [new Separator(), ...projectChoices] : []),\n ],\n message: 'Configure a project for this app?',\n })\n\n if (selected === SKIP_PROJECT) {\n trace.log({selectedOption: 'skip', step: 'configureAppProject'})\n trace.log({datasetName: '', selectedOption: 'skip', step: 'createOrSelectDataset'})\n return {datasetName: '', displayName: '', projectId: ''}\n }\n\n trace.log({\n selectedOption: selected === NEW_PROJECT ? 'create' : 'existing',\n step: 'configureAppProject',\n })\n\n const selectedProject = projects.find((p) => p.id === selected)\n const projectResult =\n selected === NEW_PROJECT\n ? await promptForProjectCreation({\n coupon,\n isUsersFirstProject: projects.length === 0,\n organizationId,\n organizations: [],\n planId,\n user,\n })\n : {\n displayName: selectedProject?.displayName ?? '',\n organizationId: selectedProject?.organizationId ?? undefined,\n projectId: selected,\n }\n\n const datasetResult = await getOrCreateDataset({\n dataset,\n defaultConfig: datasetDefault || undefined,\n displayName: projectResult.displayName,\n output,\n projectId: projectResult.projectId,\n showDefaultConfigPrompt: false,\n unattended: false,\n visibility,\n })\n trace.log({\n datasetName: datasetResult.datasetName,\n selectedOption: datasetResult.userAction,\n step: 'createOrSelectDataset',\n visibility,\n })\n return {\n datasetName: datasetResult.datasetName,\n displayName: projectResult.displayName,\n organizationId: projectResult.organizationId,\n projectId: projectResult.projectId,\n }\n}\n"],"names":["select","Separator","listProjects","getOrCreateDataset","getOrCreateProject","promptForProjectCreation","promptForAppTemplateSetup","coupon","dataset","datasetDefault","newProject","organization","organizationId","output","planId","project","trace","unattended","user","visibility","hasProjectFlag","Boolean","log","datasetName","selectedOption","step","displayName","projectId","projectResult","datasetResult","defaultConfig","undefined","showDefaultConfigPrompt","userAction","projects","toSorted","a","b","createdAt","localeCompare","projectChoices","map","p","name","id","value","SKIP_PROJECT","NEW_PROJECT","selected","choices","length","message","selectedProject","find","isUsersFirstProject","organizations"],"mappings":"AACA,SAAQA,MAAM,EAAEC,SAAS,QAAO,sBAAqB;AAGrD,SAAQC,YAAY,QAAO,gCAA+B;AAG1D,SAAQC,kBAAkB,QAAO,0BAAyB;AAC1D,SAAQC,kBAAkB,QAAO,0BAAyB;AAC1D,SAAQC,wBAAwB,QAAO,gCAA+B;AAEtE,OAAO,eAAeC,0BAA0B,EAC9CC,MAAM,EACNC,OAAO,EACPC,cAAc,EACdC,UAAU,EACVC,YAAY,EACZC,cAAc,EACdC,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,KAAK,EACLC,UAAU,EACVC,IAAI,EACJC,UAAU,EAeX;IAMC,MAAMC,iBAAiBC,QAAQN,WAAWL;IAE1C,IAAIO,cAAcG,gBAAgB;QAChC,IAAI,CAACL,WAAW,CAACL,YAAY;YAC3BM,MAAMM,GAAG,CAAC;gBAACC,aAAa;gBAAIC,gBAAgB;gBAAQC,MAAM;YAAuB;YACjF,OAAO;gBAACF,aAAa;gBAAIG,aAAa;gBAAIC,WAAW;YAAE;QACzD;QACA,MAAMC,gBAAgB,MAAMxB,mBAAmB;YAC7CG;YACAG;YACAC;YACAG;YACAC;YACAE;YACAC;QACF;QACA,MAAMW,gBAAgB,MAAM1B,mBAAmB;YAC7CK;YACAsB,eAAerB,kBAAkBsB;YACjCL,aAAaE,cAAcF,WAAW;YACtCb;YACAc,WAAWC,cAAcD,SAAS;YAClCK,yBAAyB;YACzBf;YACAE;QACF;QACAH,MAAMM,GAAG,CAAC;YACRC,aAAaM,cAAcN,WAAW;YACtCC,gBAAgBK,cAAcI,UAAU;YACxCR,MAAM;YACNN;QACF;QACA,OAAO;YACLI,aAAaM,cAAcN,WAAW;YACtCG,aAAaE,cAAcF,WAAW;YACtCd,gBAAgBgB,cAAchB,cAAc;YAC5Ce,WAAWC,cAAcD,SAAS;QACpC;IACF;IAEA,MAAMO,WAAW,AAAC,CAAA,MAAMhC,cAAa,EAAGiC,QAAQ,CAAC,CAACC,GAAGC,IAAMA,EAAEC,SAAS,CAACC,aAAa,CAACH,EAAEE,SAAS;IAEhG,MAAME,iBAAiBN,SAASO,GAAG,CAAC,CAACC,IAAO,CAAA;YAC1CC,MAAM,GAAGD,EAAEhB,WAAW,CAAC,EAAE,EAAEgB,EAAEE,EAAE,CAAC,CAAC,CAAC;YAClCC,OAAOH,EAAEE,EAAE;QACb,CAAA;IAEA,MAAME,eAAe;IACrB,MAAMC,cAAc;IAEpB,MAAMC,WAAW,MAAMhD,OAAO;QAC5BiD,SAAS;YACP;gBAACN,MAAM;gBAA+BE,OAAOC;YAAY;YACzD;gBAACH,MAAM;gBAAsBE,OAAOE;YAAW;eAC3CP,eAAeU,MAAM,GAAG,IAAI;gBAAC,IAAIjD;mBAAgBuC;aAAe,GAAG,EAAE;SAC1E;QACDW,SAAS;IACX;IAEA,IAAIH,aAAaF,cAAc;QAC7B9B,MAAMM,GAAG,CAAC;YAACE,gBAAgB;YAAQC,MAAM;QAAqB;QAC9DT,MAAMM,GAAG,CAAC;YAACC,aAAa;YAAIC,gBAAgB;YAAQC,MAAM;QAAuB;QACjF,OAAO;YAACF,aAAa;YAAIG,aAAa;YAAIC,WAAW;QAAE;IACzD;IAEAX,MAAMM,GAAG,CAAC;QACRE,gBAAgBwB,aAAaD,cAAc,WAAW;QACtDtB,MAAM;IACR;IAEA,MAAM2B,kBAAkBlB,SAASmB,IAAI,CAAC,CAACX,IAAMA,EAAEE,EAAE,KAAKI;IACtD,MAAMpB,gBACJoB,aAAaD,cACT,MAAM1C,yBAAyB;QAC7BE;QACA+C,qBAAqBpB,SAASgB,MAAM,KAAK;QACzCtC;QACA2C,eAAe,EAAE;QACjBzC;QACAI;IACF,KACA;QACEQ,aAAa0B,iBAAiB1B,eAAe;QAC7Cd,gBAAgBwC,iBAAiBxC,kBAAkBmB;QACnDJ,WAAWqB;IACb;IAEN,MAAMnB,gBAAgB,MAAM1B,mBAAmB;QAC7CK;QACAsB,eAAerB,kBAAkBsB;QACjCL,aAAaE,cAAcF,WAAW;QACtCb;QACAc,WAAWC,cAAcD,SAAS;QAClCK,yBAAyB;QACzBf,YAAY;QACZE;IACF;IACAH,MAAMM,GAAG,CAAC;QACRC,aAAaM,cAAcN,WAAW;QACtCC,gBAAgBK,cAAcI,UAAU;QACxCR,MAAM;QACNN;IACF;IACA,OAAO;QACLI,aAAaM,cAAcN,WAAW;QACtCG,aAAaE,cAAcF,WAAW;QACtCd,gBAAgBgB,cAAchB,cAAc;QAC5Ce,WAAWC,cAAcD,SAAS;IACpC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/schema/deploySchemas.ts"],"sourcesContent":["import {SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {type ManifestSchemaType} from '@sanity/cli-build/_internal/manifest'\nimport {studioWorkerTask} from '@sanity/cli-core'\nimport {type SchemaValidationProblemGroup} from '@sanity/types'\nimport {type Workspace} from 'sanity'\n\nimport {type ExtractWorkspaceWorkerData} from './types.js'\nimport {updateWorkspacesSchemas, type WorkspaceSchemaInput} from './updateWorkspaceSchema.js'\n\ninterface DeploySchemasOptions {\n verbose: boolean\n workDir: string\n\n tag?: string\n workspaceName?: string\n}\n\ntype WorkspaceWithManifest = Workspace & {manifestSchema: ManifestSchemaType[]}\n\ntype ExtractWorkspaceWorkerMessage =\n | {\n error: string\n type: 'error'\n validation?: SchemaValidationProblemGroup[]\n }\n | {\n type: 'success'\n workspaces: WorkspaceWithManifest[]\n }\n\nexport async function deploySchemas(options: DeploySchemasOptions): Promise<void> {\n const {tag, verbose, workDir, workspaceName} = options\n\n const result = await studioWorkerTask<ExtractWorkspaceWorkerMessage>(\n new URL('extractSanityWorkspace.worker.js', import.meta.url),\n {\n name: 'extractSanityWorkspace',\n studioRootPath: workDir,\n workerData: {\n configPath: workDir,\n workDir,\n } satisfies ExtractWorkspaceWorkerData,\n },\n )\n\n if (result.type === 'error') {\n throw new SchemaExtractionError(result.error, result.validation)\n }\n\n const workspaces: WorkspaceSchemaInput[] = result.workspaces\n .filter((workspace) => !workspaceName || workspace.name === workspaceName)\n .map((workspace) => ({\n dataset: workspace.dataset,\n manifestSchema: workspace.manifestSchema,\n name: workspace.name,\n projectId: workspace.projectId,\n title: workspace.title,\n }))\n\n if (workspaces.length === 0) {\n const error = workspaceName\n ? new Error(`Found no workspaces named \"${workspaceName}\"`)\n : new Error('No workspaces found')\n throw error\n }\n\n await updateWorkspacesSchemas({\n tag,\n verbose,\n workspaces,\n })\n}\n"],"names":["SchemaExtractionError","studioWorkerTask","updateWorkspacesSchemas","deploySchemas","options","tag","verbose","workDir","workspaceName","result","URL","url","name","studioRootPath","workerData","configPath","type","error","validation","workspaces","filter","workspace","map","dataset","manifestSchema","projectId","title","length","Error"],"mappings":"AAAA,SAAQA,qBAAqB,QAAO,sCAAqC;AAEzE,SAAQC,gBAAgB,QAAO,mBAAkB;AAKjD,SAAQC,uBAAuB,QAAkC,6BAA4B;AAuB7F,OAAO,eAAeC,cAAcC,OAA6B;IAC/D,MAAM,EAACC,GAAG,EAAEC,OAAO,EAAEC,OAAO,EAAEC,aAAa,EAAC,GAAGJ;IAE/C,MAAMK,SAAS,MAAMR,iBACnB,IAAIS,IAAI,oCAAoC,YAAYC,GAAG,GAC3D;QACEC,MAAM;QACNC,gBAAgBN;QAChBO,YAAY;YACVC,YAAYR;YACZA;QACF;IACF;IAGF,IAAIE,OAAOO,IAAI,KAAK,SAAS;QAC3B,MAAM,IAAIhB,sBAAsBS,OAAOQ,KAAK,EAAER,OAAOS,UAAU;IACjE;IAEA,MAAMC,aAAqCV,OAAOU,UAAU,CACzDC,MAAM,CAAC,CAACC,YAAc,CAACb,iBAAiBa,UAAUT,IAAI,KAAKJ,eAC3Dc,GAAG,CAAC,CAACD,YAAe,CAAA;YACnBE,SAASF,UAAUE,OAAO;YAC1BC,gBAAgBH,UAAUG,cAAc;YACxCZ,MAAMS,UAAUT,IAAI;YACpBa,WAAWJ,UAAUI,SAAS;YAC9BC,OAAOL,UAAUK,KAAK;QACxB,CAAA;IAEF,IAAIP,WAAWQ,MAAM,KAAK,GAAG;QAC3B,MAAMV,QAAQT,gBACV,IAAIoB,MAAM,CAAC,2BAA2B,EAAEpB,cAAc,CAAC,CAAC,IACxD,IAAIoB,MAAM;QACd,MAAMX;IACR;IAEA,MAAMf,wBAAwB;QAC5BG;QACAC;QACAa;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/schema/deploySchemas.ts"],"sourcesContent":["import {SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {\n type ManifestSchemaType,\n type WorkspaceSchemaInput,\n} from '@sanity/cli-build/_internal/manifest'\nimport {studioWorkerTask} from '@sanity/cli-core'\nimport {type SchemaValidationProblemGroup} from '@sanity/types'\nimport {type Workspace} from 'sanity'\n\nimport {type ExtractWorkspaceWorkerData} from './types.js'\nimport {updateWorkspacesSchemas} from './updateWorkspaceSchema.js'\n\ninterface DeploySchemasOptions {\n verbose: boolean\n workDir: string\n\n tag?: string\n workspaceName?: string\n}\n\ntype WorkspaceWithManifest = Workspace & {manifestSchema: ManifestSchemaType[]}\n\ntype ExtractWorkspaceWorkerMessage =\n | {\n error: string\n type: 'error'\n validation?: SchemaValidationProblemGroup[]\n }\n | {\n type: 'success'\n workspaces: WorkspaceWithManifest[]\n }\n\nexport async function deploySchemas(options: DeploySchemasOptions): Promise<void> {\n const {tag, verbose, workDir, workspaceName} = options\n\n const result = await studioWorkerTask<ExtractWorkspaceWorkerMessage>(\n new URL('extractSanityWorkspace.worker.js', import.meta.url),\n {\n name: 'extractSanityWorkspace',\n studioRootPath: workDir,\n workerData: {\n configPath: workDir,\n workDir,\n } satisfies ExtractWorkspaceWorkerData,\n },\n )\n\n if (result.type === 'error') {\n throw new SchemaExtractionError(result.error, result.validation)\n }\n\n const workspaces: WorkspaceSchemaInput[] = result.workspaces\n .filter((workspace) => !workspaceName || workspace.name === workspaceName)\n .map((workspace) => ({\n dataset: workspace.dataset,\n manifestSchema: workspace.manifestSchema,\n name: workspace.name,\n projectId: workspace.projectId,\n title: workspace.title,\n }))\n\n if (workspaces.length === 0) {\n const error = workspaceName\n ? new Error(`Found no workspaces named \"${workspaceName}\"`)\n : new Error('No workspaces found')\n throw error\n }\n\n await updateWorkspacesSchemas({\n tag,\n verbose,\n workspaces,\n })\n}\n"],"names":["SchemaExtractionError","studioWorkerTask","updateWorkspacesSchemas","deploySchemas","options","tag","verbose","workDir","workspaceName","result","URL","url","name","studioRootPath","workerData","configPath","type","error","validation","workspaces","filter","workspace","map","dataset","manifestSchema","projectId","title","length","Error"],"mappings":"AAAA,SAAQA,qBAAqB,QAAO,sCAAqC;AAKzE,SAAQC,gBAAgB,QAAO,mBAAkB;AAKjD,SAAQC,uBAAuB,QAAO,6BAA4B;AAuBlE,OAAO,eAAeC,cAAcC,OAA6B;IAC/D,MAAM,EAACC,GAAG,EAAEC,OAAO,EAAEC,OAAO,EAAEC,aAAa,EAAC,GAAGJ;IAE/C,MAAMK,SAAS,MAAMR,iBACnB,IAAIS,IAAI,oCAAoC,YAAYC,GAAG,GAC3D;QACEC,MAAM;QACNC,gBAAgBN;QAChBO,YAAY;YACVC,YAAYR;YACZA;QACF;IACF;IAGF,IAAIE,OAAOO,IAAI,KAAK,SAAS;QAC3B,MAAM,IAAIhB,sBAAsBS,OAAOQ,KAAK,EAAER,OAAOS,UAAU;IACjE;IAEA,MAAMC,aAAqCV,OAAOU,UAAU,CACzDC,MAAM,CAAC,CAACC,YAAc,CAACb,iBAAiBa,UAAUT,IAAI,KAAKJ,eAC3Dc,GAAG,CAAC,CAACD,YAAe,CAAA;YACnBE,SAASF,UAAUE,OAAO;YAC1BC,gBAAgBH,UAAUG,cAAc;YACxCZ,MAAMS,UAAUT,IAAI;YACpBa,WAAWJ,UAAUI,SAAS;YAC9BC,OAAOL,UAAUK,KAAK;QACxB,CAAA;IAEF,IAAIP,WAAWQ,MAAM,KAAK,GAAG;QAC3B,MAAMV,QAAQT,gBACV,IAAIoB,MAAM,CAAC,2BAA2B,EAAEpB,cAAc,CAAC,CAAC,IACxD,IAAIoB,MAAM;QACd,MAAMX;IACR;IAEA,MAAMf,wBAAwB;QAC5BG;QACAC;QACAa;IACF;AACF"}