@sanity/cli 7.2.2 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/bin/run.js +3 -12
  2. package/dist/actions/auth/authServer.js +37 -20
  3. package/dist/actions/auth/authServer.js.map +1 -1
  4. package/dist/actions/backup/assertDatasetExist.js +3 -3
  5. package/dist/actions/backup/assertDatasetExist.js.map +1 -1
  6. package/dist/actions/build/buildApp.js +15 -5
  7. package/dist/actions/build/buildApp.js.map +1 -1
  8. package/dist/actions/build/buildStaticFiles.js +57 -5
  9. package/dist/actions/build/buildStaticFiles.js.map +1 -1
  10. package/dist/actions/build/buildStudio.js +13 -5
  11. package/dist/actions/build/buildStudio.js.map +1 -1
  12. package/dist/actions/build/handlePrereleaseVersions.js +2 -2
  13. package/dist/actions/build/handlePrereleaseVersions.js.map +1 -1
  14. package/dist/actions/dataset/resolveDataset.js +2 -2
  15. package/dist/actions/dataset/resolveDataset.js.map +1 -1
  16. package/dist/actions/deploy/deployApp.js +43 -5
  17. package/dist/actions/deploy/deployApp.js.map +1 -1
  18. package/dist/actions/deploy/deployStudio.js +14 -2
  19. package/dist/actions/deploy/deployStudio.js.map +1 -1
  20. package/dist/actions/deploy/viewDeployment.js +32 -0
  21. package/dist/actions/deploy/viewDeployment.js.map +1 -0
  22. package/dist/actions/dev/devAction.js +219 -4
  23. package/dist/actions/dev/devAction.js.map +1 -1
  24. package/dist/actions/dev/registration/deriveInterfaces.js +46 -0
  25. package/dist/actions/dev/registration/deriveInterfaces.js.map +1 -0
  26. package/dist/actions/dev/registration/extractDevServerManifest.js +30 -0
  27. package/dist/actions/dev/registration/extractDevServerManifest.js.map +1 -0
  28. package/dist/actions/dev/registration/interfaceSetId.js +41 -0
  29. package/dist/actions/dev/registration/interfaceSetId.js.map +1 -0
  30. package/dist/actions/dev/registration/startDevManifestWatcher.js +104 -0
  31. package/dist/actions/dev/registration/startDevManifestWatcher.js.map +1 -0
  32. package/dist/actions/dev/registration/startDevServerRegistration.js +121 -0
  33. package/dist/actions/dev/registration/startDevServerRegistration.js.map +1 -0
  34. package/dist/actions/dev/servers/getDashboardAppUrl.js.map +1 -0
  35. package/dist/actions/dev/servers/getDevServerConfig.js +45 -0
  36. package/dist/actions/dev/servers/getDevServerConfig.js.map +1 -0
  37. package/dist/actions/dev/servers/startAppDevServer.js +78 -0
  38. package/dist/actions/dev/servers/startAppDevServer.js.map +1 -0
  39. package/dist/actions/dev/{startStudioDevServer.js → servers/startStudioDevServer.js} +20 -16
  40. package/dist/actions/dev/servers/startStudioDevServer.js.map +1 -0
  41. package/dist/actions/dev/types.js +7 -1
  42. package/dist/actions/dev/types.js.map +1 -1
  43. package/dist/actions/dev/workbench/startWorkbenchDevServer.js +276 -0
  44. package/dist/actions/dev/workbench/startWorkbenchDevServer.js.map +1 -0
  45. package/dist/actions/dev/workbench/writeWorkbenchRuntime.js +66 -0
  46. package/dist/actions/dev/workbench/writeWorkbenchRuntime.js.map +1 -0
  47. package/dist/actions/init/bootstrapLocalTemplate.js +15 -3
  48. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
  49. package/dist/actions/init/bootstrapTemplate.js +3 -2
  50. package/dist/actions/init/bootstrapTemplate.js.map +1 -1
  51. package/dist/actions/init/createAppCliConfig.js +5 -2
  52. package/dist/actions/init/createAppCliConfig.js.map +1 -1
  53. package/dist/actions/init/createCliConfig.js +5 -3
  54. package/dist/actions/init/createCliConfig.js.map +1 -1
  55. package/dist/actions/init/createStudioConfig.js.map +1 -1
  56. package/dist/actions/init/initAction.js +11 -4
  57. package/dist/actions/init/initAction.js.map +1 -1
  58. package/dist/actions/init/initApp.js +2 -1
  59. package/dist/actions/init/initApp.js.map +1 -1
  60. package/dist/actions/init/initStudio.js +2 -1
  61. package/dist/actions/init/initStudio.js.map +1 -1
  62. package/dist/actions/init/scaffoldTemplate.js +3 -2
  63. package/dist/actions/init/scaffoldTemplate.js.map +1 -1
  64. package/dist/actions/init/templates/pageBuilder.js +1 -1
  65. package/dist/actions/init/templates/pageBuilder.js.map +1 -1
  66. package/dist/actions/init/types.js +1 -0
  67. package/dist/actions/init/types.js.map +1 -1
  68. package/dist/actions/manifest/{extractAppManifest.js → extractCoreAppManifest.js} +30 -11
  69. package/dist/actions/manifest/extractCoreAppManifest.js.map +1 -0
  70. package/dist/actions/manifest/extractManifest.js +7 -7
  71. package/dist/actions/manifest/extractManifest.js.map +1 -1
  72. package/dist/actions/manifest/iconResolver.js +2 -3
  73. package/dist/actions/manifest/iconResolver.js.map +1 -1
  74. package/dist/actions/manifest/sanitizeIcon.js +13 -0
  75. package/dist/actions/manifest/sanitizeIcon.js.map +1 -0
  76. package/dist/actions/manifest/types.js +4 -9
  77. package/dist/actions/manifest/types.js.map +1 -1
  78. package/dist/actions/manifest/writeManifestFile.js +1 -1
  79. package/dist/actions/manifest/writeManifestFile.js.map +1 -1
  80. package/dist/actions/mcp/editorConfigs.js +26 -2
  81. package/dist/actions/mcp/editorConfigs.js.map +1 -1
  82. package/dist/actions/mcp/setupMCP.js +24 -25
  83. package/dist/actions/mcp/setupMCP.js.map +1 -1
  84. package/dist/actions/mcp/types.js.map +1 -1
  85. package/dist/actions/skills/configureSkills.js +49 -0
  86. package/dist/actions/skills/configureSkills.js.map +1 -0
  87. package/dist/actions/skills/readSkillState.js +40 -5
  88. package/dist/actions/skills/readSkillState.js.map +1 -1
  89. package/dist/actions/skills/setupSkills.js +47 -6
  90. package/dist/actions/skills/setupSkills.js.map +1 -1
  91. package/dist/actions/skills/skillCandidates.js +40 -0
  92. package/dist/actions/skills/skillCandidates.js.map +1 -0
  93. package/dist/actions/telemetry/telemetryDisclosure.js +2 -3
  94. package/dist/actions/telemetry/telemetryDisclosure.js.map +1 -1
  95. package/dist/actions/tokens/validateRole.js +3 -3
  96. package/dist/actions/tokens/validateRole.js.map +1 -1
  97. package/dist/commands/backups/disable.js +1 -1
  98. package/dist/commands/backups/disable.js.map +1 -1
  99. package/dist/commands/backups/download.js +1 -1
  100. package/dist/commands/backups/download.js.map +1 -1
  101. package/dist/commands/backups/enable.js +1 -1
  102. package/dist/commands/backups/enable.js.map +1 -1
  103. package/dist/commands/backups/list.js +1 -1
  104. package/dist/commands/backups/list.js.map +1 -1
  105. package/dist/commands/datasets/embeddings/disable.js +1 -0
  106. package/dist/commands/datasets/embeddings/disable.js.map +1 -1
  107. package/dist/commands/datasets/embeddings/enable.js +1 -0
  108. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  109. package/dist/commands/datasets/embeddings/status.js +1 -0
  110. package/dist/commands/datasets/embeddings/status.js.map +1 -1
  111. package/dist/commands/dev.js +11 -1
  112. package/dist/commands/dev.js.map +1 -1
  113. package/dist/commands/init.js +7 -0
  114. package/dist/commands/init.js.map +1 -1
  115. package/dist/commands/manifest/extract.js +7 -2
  116. package/dist/commands/manifest/extract.js.map +1 -1
  117. package/dist/commands/mcp/configure.js +1 -0
  118. package/dist/commands/mcp/configure.js.map +1 -1
  119. package/dist/commands/skills/install.js +40 -0
  120. package/dist/commands/skills/install.js.map +1 -0
  121. package/dist/commands/tokens/add.js +1 -1
  122. package/dist/commands/tokens/add.js.map +1 -1
  123. package/dist/exports/index.d.ts +6 -0
  124. package/dist/exports/index.js +8 -0
  125. package/dist/exports/index.js.map +1 -1
  126. package/dist/exports/runtime.d.ts +41 -0
  127. package/dist/exports/runtime.js +13 -0
  128. package/dist/exports/runtime.js.map +1 -0
  129. package/dist/hooks/prerun/setupTelemetry.js +3 -1
  130. package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
  131. package/dist/server/devServer.js +8 -3
  132. package/dist/server/devServer.js.map +1 -1
  133. package/dist/services/documents.js +0 -1
  134. package/dist/services/documents.js.map +1 -1
  135. package/dist/telemetry/skills.telemetry.js +8 -0
  136. package/dist/telemetry/skills.telemetry.js.map +1 -0
  137. package/dist/util/compareDependencyVersions.js +1 -1
  138. package/dist/util/compareDependencyVersions.js.map +1 -1
  139. package/dist/util/determineIsApp.js +12 -1
  140. package/dist/util/determineIsApp.js.map +1 -1
  141. package/dist/util/getSharedServerConfig.js +2 -1
  142. package/dist/util/getSharedServerConfig.js.map +1 -1
  143. package/dist/util/resolveReactStrictMode.js +11 -0
  144. package/dist/util/resolveReactStrictMode.js.map +1 -0
  145. package/oclif.config.js +2 -1
  146. package/oclif.manifest.json +119 -86
  147. package/package.json +27 -18
  148. package/templates/page-builder/schemaTypes/index.js +1 -1
  149. package/dist/actions/build/checkRequiredDependencies.js +0 -124
  150. package/dist/actions/build/checkRequiredDependencies.js.map +0 -1
  151. package/dist/actions/build/getAutoUpdatesImportMap.js +0 -66
  152. package/dist/actions/build/getAutoUpdatesImportMap.js.map +0 -1
  153. package/dist/actions/dev/getDashboardAppUrl.js.map +0 -1
  154. package/dist/actions/dev/getDevServerConfig.js +0 -32
  155. package/dist/actions/dev/getDevServerConfig.js.map +0 -1
  156. package/dist/actions/dev/startAppDevServer.js +0 -59
  157. package/dist/actions/dev/startAppDevServer.js.map +0 -1
  158. package/dist/actions/dev/startStudioDevServer.js.map +0 -1
  159. package/dist/actions/manifest/extractAppManifest.js.map +0 -1
  160. /package/dist/actions/dev/{getDashboardAppUrl.js → servers/getDashboardAppUrl.js} +0 -0
@@ -132,6 +132,7 @@ export async function initAction(options, context) {
132
132
  const mcpResult = await setupMCP({
133
133
  editors: detectedEditors,
134
134
  mode: options.mcpMode,
135
+ output,
135
136
  skillsMode: options.skillsMode
136
137
  });
137
138
  trace.log({
@@ -148,7 +149,8 @@ export async function initAction(options, context) {
148
149
  if (mcpResult.skillsToInstall.length === 0) return;
149
150
  try {
150
151
  const skillsResult = await setupSkills({
151
- agents: mcpResult.skillsToInstall
152
+ agents: mcpResult.skillsToInstall,
153
+ output
152
154
  });
153
155
  trace.log({
154
156
  installedAgents: skillsResult.installedAgents,
@@ -165,6 +167,9 @@ export async function initAction(options, context) {
165
167
  trace.error(err);
166
168
  }
167
169
  }
170
+ // Install skills right after the MCP/skills prompt so the progress + result
171
+ // surface in sequence, rather than trailing the studio "Success!" output.
172
+ await installSkills();
168
173
  const { alreadyConfiguredEditors } = mcpResult;
169
174
  if (alreadyConfiguredEditors.length > 0) {
170
175
  const label = alreadyConfiguredEditors.length === 1 ? `${alreadyConfiguredEditors[0]} already configured for Sanity MCP` : `${alreadyConfiguredEditors.length} editors already configured for Sanity MCP`;
@@ -212,7 +217,6 @@ export async function initAction(options, context) {
212
217
  trace,
213
218
  workDir
214
219
  });
215
- await installSkills();
216
220
  trace.complete();
217
221
  return;
218
222
  }
@@ -229,10 +233,13 @@ export async function initAction(options, context) {
229
233
  outputPath
230
234
  });
231
235
  await writeStagingEnvIfNeeded(output, outputPath);
232
- await installSkills();
233
236
  trace.complete();
234
237
  return;
235
238
  }
239
+ // Workbench is opt-in (no prompt): the flag swaps the scaffolded
240
+ // `sanity.cli.*` over to `unstable_defineApp` — the branded app is the sole
241
+ // workbench opt-in.
242
+ const workbench = flagOrDefault(options.unstableWorkbench, false);
236
243
  const sharedParams = {
237
244
  defaults,
238
245
  mcpConfigured,
@@ -243,6 +250,7 @@ export async function initAction(options, context) {
243
250
  remoteTemplateInfo,
244
251
  sluggedName,
245
252
  trace,
253
+ workbench,
246
254
  workDir
247
255
  };
248
256
  await (isAppTemplate ? initApp({
@@ -256,7 +264,6 @@ export async function initAction(options, context) {
256
264
  isFirstProject,
257
265
  projectId
258
266
  }));
259
- await installSkills();
260
267
  trace.complete();
261
268
  }
262
269
  function checkFlagsInUnattendedMode(options, { isAppTemplate, isNextJs }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/initAction.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type SanityOrgUser, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {logSymbols, spinner} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\nimport {type Framework, frameworks} from '@vercel/frameworks'\nimport deburr from 'lodash-es/deburr.js'\n\nimport {promptForConfigFiles} from '../../prompts/init/nextjs.js'\nimport {getCliUser} from '../../services/user.js'\nimport {CLIInitStepCompleted, type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {detectFrameworkRecord} from '../../util/detectFramework.js'\nimport {getProjectDefaults} from '../../util/getProjectDefaults.js'\nimport {validateSession} from '../auth/ensureAuthenticated.js'\nimport {getProviderName} from '../auth/getProviderName.js'\nimport {login} from '../auth/login/login.js'\nimport {detectAvailableEditors} from '../mcp/detectAvailableEditors.js'\nimport {setupMCP} from '../mcp/setupMCP.js'\nimport {setupSkills} from '../skills/setupSkills.js'\nimport {checkNextJsReactCompatibility} from './checkNextJsReactCompatibility.js'\nimport {determineAppTemplate} from './determineAppTemplate.js'\nimport {createOrAppendEnvVars} from './env/createOrAppendEnvVars.js'\nimport {initApp} from './initApp.js'\nimport {InitError} from './initError.js'\nimport {flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded} from './initHelpers.js'\nimport {initNextJs} from './initNextJs.js'\nimport {initStudio} from './initStudio.js'\nimport {getPlan} from './plan/getPlan.js'\nimport {createProjectFromName} from './project/createProjectFromName.js'\nimport {getProjectDetails} from './project/getProjectDetails.js'\nimport {getProjectOutputPath} from './project/getProjectOutputPath.js'\nimport {checkIsRemoteTemplate, getGitHubRepoInfo, type RepoInfo} from './remoteTemplate.js'\nimport {type InitContext, type InitOptions} from './types.js'\n\nconst debug = subdebug('init')\n\nexport async function initAction(options: InitOptions, context: InitContext): Promise<void> {\n const {output, workDir} = context\n\n if (options.argType) {\n throw new InitError(\n options.argType === 'plugin'\n ? 'Initializing plugins through the CLI is no longer supported'\n : `Unknown init type \"${options.argType}\"`,\n 1,\n )\n }\n\n const trace = context.telemetry.trace(CLIInitStepCompleted)\n\n if (options.reconfigure) {\n throw new InitError('--reconfigure is deprecated - manual configuration is now required', 1)\n }\n\n if (options.project && options.organization) {\n throw new InitError(\n 'You have specified both a project and an organization. To move a project to an organization please visit https://www.sanity.io/manage',\n 1,\n )\n }\n\n const defaultConfig = options.datasetDefault\n let showDefaultConfigPrompt = !defaultConfig\n if (options.dataset || options.visibility || options.datasetDefault || options.unattended) {\n showDefaultConfigPrompt = false\n }\n\n const detectedFramework = await detectFrameworkRecord({\n frameworkList: frameworks as readonly Framework[],\n rootPath: workDir,\n })\n const isNextJs = detectedFramework?.slug === 'nextjs'\n\n let remoteTemplateInfo: RepoInfo | undefined\n if (options.template && checkIsRemoteTemplate(options.template)) {\n remoteTemplateInfo = await getGitHubRepoInfo(options.template, options.templateToken)\n }\n\n if (detectedFramework && detectedFramework.slug !== 'sanity' && remoteTemplateInfo) {\n throw new InitError(\n `A remote template cannot be used with a detected framework. Detected: ${detectedFramework.name}`,\n 1,\n )\n }\n\n const isAppTemplate = options.template ? determineAppTemplate(options.template) : false\n\n if (options.unattended) {\n checkFlagsInUnattendedMode(options, {isAppTemplate, isNextJs})\n }\n\n trace.start()\n trace.log({\n flags: {\n bare: options.bare,\n coupon: options.coupon,\n defaultConfig,\n env: options.env,\n git: typeof options.git === 'string' ? options.git : undefined,\n plan: options.projectPlan,\n reconfigure: options.reconfigure,\n unattended: options.unattended,\n },\n step: 'start',\n })\n\n const planId = await getPlan(options, output, trace)\n\n let envFilenameDefault = '.env'\n if (detectedFramework && detectedFramework.slug === 'nextjs') {\n envFilenameDefault = '.env.local'\n }\n const envFilename = typeof options.env === 'string' ? options.env : envFilenameDefault\n\n const {user} = await ensureAuthenticated(options, output, trace)\n if (!isAppTemplate) {\n output.log(`${logSymbols.success} Fetching existing projects`)\n output.log('')\n }\n\n let newProject: string | undefined\n if (options.projectName) {\n newProject = await createProjectFromName({\n coupon: options.coupon,\n createProjectName: options.projectName,\n dataset: options.dataset,\n organization: options.organization,\n planId,\n user,\n visibility: options.visibility,\n })\n }\n\n const {datasetName, displayName, isFirstProject, organizationId, projectId} =\n await getProjectDetails({\n coupon: options.coupon,\n dataset: options.dataset,\n datasetDefault: options.datasetDefault,\n isAppTemplate,\n newProject,\n organization: options.organization,\n output,\n planId,\n project: options.project,\n showDefaultConfigPrompt,\n trace,\n unattended: options.unattended,\n user,\n visibility: options.visibility,\n })\n\n if (options.bare) {\n output.log(`${logSymbols.success} Below are your project details`)\n output.log('')\n output.log(`Project ID: ${styleText('cyan', projectId)}`)\n output.log(`Dataset: ${styleText('cyan', datasetName)}`)\n output.log(\n `\\nYou can find your project on Sanity Manage — https://www.sanity.io/manage/project/${projectId}\\n`,\n )\n trace.complete()\n return\n }\n\n // Detect editors once, then share the result with MCP and skills setup so\n // we don't pay the detection cost (filesystem probes + CLI execa calls) twice.\n const detectedEditors =\n options.mcpMode === 'skip' && options.skillsMode === 'skip'\n ? []\n : await detectAvailableEditors()\n\n const mcpResult = await setupMCP({\n editors: detectedEditors,\n mode: options.mcpMode,\n skillsMode: options.skillsMode,\n })\n\n trace.log({\n configuredEditors: mcpResult.configuredEditors,\n detectedEditors: mcpResult.detectedEditors,\n skipped: mcpResult.skipped,\n step: 'mcpSetup',\n })\n if (mcpResult.error) {\n trace.error(mcpResult.error)\n }\n const mcpConfigured = mcpResult.configuredEditors\n\n async function installSkills(): Promise<void> {\n if (mcpResult.skillsToInstall.length === 0) return\n try {\n const skillsResult = await setupSkills({agents: mcpResult.skillsToInstall})\n trace.log({\n installedAgents: skillsResult.installedAgents,\n skipped: skillsResult.skipped,\n step: 'skillsSetup',\n })\n if (skillsResult.error) {\n trace.error(skillsResult.error)\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n debug('Unexpected error from setupSkills %O', err)\n output.warn(`Could not install Sanity agent skills: ${err.message}`)\n trace.error(err)\n }\n }\n\n const {alreadyConfiguredEditors} = mcpResult\n if (alreadyConfiguredEditors.length > 0) {\n const label =\n alreadyConfiguredEditors.length === 1\n ? `${alreadyConfiguredEditors[0]} already configured for Sanity MCP`\n : `${alreadyConfiguredEditors.length} editors already configured for Sanity MCP`\n spinner(label).start().succeed()\n }\n\n let initNext = flagOrDefault(options.nextjsAddConfigFiles, false)\n if (isNextJs && shouldPrompt(options.unattended, options.nextjsAddConfigFiles)) {\n initNext = await promptForConfigFiles()\n }\n\n trace.log({\n detectedFramework: detectedFramework?.name,\n selectedOption: initNext ? 'yes' : 'no',\n step: 'useDetectedFramework',\n })\n\n const sluggedName = deburr(displayName.toLowerCase())\n .replaceAll(/\\s+/g, '-')\n .replaceAll(/[^a-z0-9-]/g, '')\n\n const initFramework = initNext\n\n const defaults = await getProjectDefaults({isPlugin: false, workDir})\n\n const outputPath = await getProjectOutputPath({\n initFramework,\n outputPath: options.outputPath,\n sluggedName,\n unattended: options.unattended,\n useEnv: Boolean(options.env),\n workDir,\n })\n\n if (isNextJs) {\n await checkNextJsReactCompatibility({\n detectedFramework,\n output,\n outputPath,\n })\n }\n\n if (initNext) {\n await initNextJs({\n datasetName,\n detectedFramework,\n envFilename,\n mcpConfigured,\n options,\n output,\n projectId,\n trace,\n workDir,\n })\n await installSkills()\n trace.complete()\n return\n }\n\n if (options.env) {\n await createOrAppendEnvVars({\n envVars: {\n DATASET: datasetName,\n PROJECT_ID: projectId,\n },\n filename: envFilename,\n framework: detectedFramework,\n log: false,\n output,\n outputPath,\n })\n await writeStagingEnvIfNeeded(output, outputPath)\n await installSkills()\n trace.complete()\n return\n }\n\n const sharedParams = {\n defaults,\n mcpConfigured,\n options,\n organizationId,\n output,\n outputPath,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workDir,\n }\n\n await (isAppTemplate\n ? initApp({...sharedParams, datasetName, projectId})\n : initStudio({\n ...sharedParams,\n datasetName,\n displayName,\n isFirstProject,\n projectId,\n }))\n\n await installSkills()\n\n trace.complete()\n}\n\nfunction checkFlagsInUnattendedMode(\n options: InitOptions,\n {isAppTemplate, isNextJs}: {isAppTemplate: boolean; isNextJs: boolean},\n): void {\n debug('Unattended mode, validating required options')\n\n if (options.projectName && !options.organization) {\n throw new InitError('`--project-name` requires `--organization <id>` in unattended mode', 1)\n }\n\n if (isAppTemplate) {\n if (!options.outputPath) {\n throw new InitError('`--output-path` must be specified in unattended mode', 1)\n }\n\n const hasProjectFlag = Boolean(options.project || options.projectName)\n\n if (!hasProjectFlag && !options.organization) {\n throw new InitError(\n 'The --organization flag is required for app templates in unattended mode. ' +\n 'Use --organization <id>, or pass --project <id> / --project-name <name>.',\n 1,\n )\n }\n\n return\n }\n\n if (!isNextJs && !options.bare && !options.outputPath) {\n throw new InitError('`--output-path` must be specified in unattended mode', 1)\n }\n\n if (!options.project && !options.projectName) {\n throw new InitError(\n '`--project <id>` or `--project-name <name>` must be specified in unattended mode',\n 1,\n )\n }\n}\n\nasync function ensureAuthenticated(\n options: InitOptions,\n output: InitContext['output'],\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>,\n): Promise<{user: SanityOrgUser}> {\n const user = await validateSession()\n\n if (user) {\n trace.log({alreadyLoggedIn: true, step: 'login'})\n output.log(\n `${logSymbols.success} You are logged in as ${user.email} using ${getProviderName(user.provider)}`,\n )\n return {user}\n }\n\n if (options.unattended) {\n throw new InitError(\n 'Must be logged in to run this command in unattended mode, run `sanity login`',\n 1,\n )\n }\n\n trace.log({step: 'login'})\n\n try {\n await login({\n output,\n telemetry: trace.newContext('login'),\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new InitError(`Login failed: ${message}`, 1)\n }\n\n const loggedInUser = await getCliUser()\n\n output.log(\n `${logSymbols.success} You are logged in as ${loggedInUser.email} using ${getProviderName(loggedInUser.provider)}`,\n )\n return {user: loggedInUser}\n}\n"],"names":["styleText","subdebug","logSymbols","spinner","frameworks","deburr","promptForConfigFiles","getCliUser","CLIInitStepCompleted","detectFrameworkRecord","getProjectDefaults","validateSession","getProviderName","login","detectAvailableEditors","setupMCP","setupSkills","checkNextJsReactCompatibility","determineAppTemplate","createOrAppendEnvVars","initApp","InitError","flagOrDefault","shouldPrompt","writeStagingEnvIfNeeded","initNextJs","initStudio","getPlan","createProjectFromName","getProjectDetails","getProjectOutputPath","checkIsRemoteTemplate","getGitHubRepoInfo","debug","initAction","options","context","output","workDir","argType","trace","telemetry","reconfigure","project","organization","defaultConfig","datasetDefault","showDefaultConfigPrompt","dataset","visibility","unattended","detectedFramework","frameworkList","rootPath","isNextJs","slug","remoteTemplateInfo","template","templateToken","name","isAppTemplate","checkFlagsInUnattendedMode","start","log","flags","bare","coupon","env","git","undefined","plan","projectPlan","step","planId","envFilenameDefault","envFilename","user","ensureAuthenticated","success","newProject","projectName","createProjectName","datasetName","displayName","isFirstProject","organizationId","projectId","complete","detectedEditors","mcpMode","skillsMode","mcpResult","editors","mode","configuredEditors","skipped","error","mcpConfigured","installSkills","skillsToInstall","length","skillsResult","agents","installedAgents","err","Error","String","warn","message","alreadyConfiguredEditors","label","succeed","initNext","nextjsAddConfigFiles","selectedOption","sluggedName","toLowerCase","replaceAll","initFramework","defaults","isPlugin","outputPath","useEnv","Boolean","envVars","DATASET","PROJECT_ID","filename","framework","sharedParams","hasProjectFlag","alreadyLoggedIn","email","provider","newContext","loggedInUser"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAA4BC,QAAQ,QAAqC,mBAAkB;AAC3F,SAAQC,UAAU,EAAEC,OAAO,QAAO,sBAAqB;AAEvD,SAAwBC,UAAU,QAAO,qBAAoB;AAC7D,OAAOC,YAAY,sBAAqB;AAExC,SAAQC,oBAAoB,QAAO,+BAA8B;AACjE,SAAQC,UAAU,QAAO,yBAAwB;AACjD,SAAQC,oBAAoB,QAA4B,oCAAmC;AAC3F,SAAQC,qBAAqB,QAAO,gCAA+B;AACnE,SAAQC,kBAAkB,QAAO,mCAAkC;AACnE,SAAQC,eAAe,QAAO,iCAAgC;AAC9D,SAAQC,eAAe,QAAO,6BAA4B;AAC1D,SAAQC,KAAK,QAAO,yBAAwB;AAC5C,SAAQC,sBAAsB,QAAO,mCAAkC;AACvE,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,WAAW,QAAO,2BAA0B;AACpD,SAAQC,6BAA6B,QAAO,qCAAoC;AAChF,SAAQC,oBAAoB,QAAO,4BAA2B;AAC9D,SAAQC,qBAAqB,QAAO,iCAAgC;AACpE,SAAQC,OAAO,QAAO,eAAc;AACpC,SAAQC,SAAS,QAAO,iBAAgB;AACxC,SAAQC,aAAa,EAAEC,YAAY,EAAEC,uBAAuB,QAAO,mBAAkB;AACrF,SAAQC,UAAU,QAAO,kBAAiB;AAC1C,SAAQC,UAAU,QAAO,kBAAiB;AAC1C,SAAQC,OAAO,QAAO,oBAAmB;AACzC,SAAQC,qBAAqB,QAAO,qCAAoC;AACxE,SAAQC,iBAAiB,QAAO,iCAAgC;AAChE,SAAQC,oBAAoB,QAAO,oCAAmC;AACtE,SAAQC,qBAAqB,EAAEC,iBAAiB,QAAsB,sBAAqB;AAG3F,MAAMC,QAAQhC,SAAS;AAEvB,OAAO,eAAeiC,WAAWC,OAAoB,EAAEC,OAAoB;IACzE,MAAM,EAACC,MAAM,EAAEC,OAAO,EAAC,GAAGF;IAE1B,IAAID,QAAQI,OAAO,EAAE;QACnB,MAAM,IAAIlB,UACRc,QAAQI,OAAO,KAAK,WAChB,gEACA,CAAC,mBAAmB,EAAEJ,QAAQI,OAAO,CAAC,CAAC,CAAC,EAC5C;IAEJ;IAEA,MAAMC,QAAQJ,QAAQK,SAAS,CAACD,KAAK,CAAChC;IAEtC,IAAI2B,QAAQO,WAAW,EAAE;QACvB,MAAM,IAAIrB,UAAU,sEAAsE;IAC5F;IAEA,IAAIc,QAAQQ,OAAO,IAAIR,QAAQS,YAAY,EAAE;QAC3C,MAAM,IAAIvB,UACR,yIACA;IAEJ;IAEA,MAAMwB,gBAAgBV,QAAQW,cAAc;IAC5C,IAAIC,0BAA0B,CAACF;IAC/B,IAAIV,QAAQa,OAAO,IAAIb,QAAQc,UAAU,IAAId,QAAQW,cAAc,IAAIX,QAAQe,UAAU,EAAE;QACzFH,0BAA0B;IAC5B;IAEA,MAAMI,oBAAoB,MAAM1C,sBAAsB;QACpD2C,eAAehD;QACfiD,UAAUf;IACZ;IACA,MAAMgB,WAAWH,mBAAmBI,SAAS;IAE7C,IAAIC;IACJ,IAAIrB,QAAQsB,QAAQ,IAAI1B,sBAAsBI,QAAQsB,QAAQ,GAAG;QAC/DD,qBAAqB,MAAMxB,kBAAkBG,QAAQsB,QAAQ,EAAEtB,QAAQuB,aAAa;IACtF;IAEA,IAAIP,qBAAqBA,kBAAkBI,IAAI,KAAK,YAAYC,oBAAoB;QAClF,MAAM,IAAInC,UACR,CAAC,sEAAsE,EAAE8B,kBAAkBQ,IAAI,EAAE,EACjG;IAEJ;IAEA,MAAMC,gBAAgBzB,QAAQsB,QAAQ,GAAGvC,qBAAqBiB,QAAQsB,QAAQ,IAAI;IAElF,IAAItB,QAAQe,UAAU,EAAE;QACtBW,2BAA2B1B,SAAS;YAACyB;YAAeN;QAAQ;IAC9D;IAEAd,MAAMsB,KAAK;IACXtB,MAAMuB,GAAG,CAAC;QACRC,OAAO;YACLC,MAAM9B,QAAQ8B,IAAI;YAClBC,QAAQ/B,QAAQ+B,MAAM;YACtBrB;YACAsB,KAAKhC,QAAQgC,GAAG;YAChBC,KAAK,OAAOjC,QAAQiC,GAAG,KAAK,WAAWjC,QAAQiC,GAAG,GAAGC;YACrDC,MAAMnC,QAAQoC,WAAW;YACzB7B,aAAaP,QAAQO,WAAW;YAChCQ,YAAYf,QAAQe,UAAU;QAChC;QACAsB,MAAM;IACR;IAEA,MAAMC,SAAS,MAAM9C,QAAQQ,SAASE,QAAQG;IAE9C,IAAIkC,qBAAqB;IACzB,IAAIvB,qBAAqBA,kBAAkBI,IAAI,KAAK,UAAU;QAC5DmB,qBAAqB;IACvB;IACA,MAAMC,cAAc,OAAOxC,QAAQgC,GAAG,KAAK,WAAWhC,QAAQgC,GAAG,GAAGO;IAEpE,MAAM,EAACE,IAAI,EAAC,GAAG,MAAMC,oBAAoB1C,SAASE,QAAQG;IAC1D,IAAI,CAACoB,eAAe;QAClBvB,OAAO0B,GAAG,CAAC,GAAG7D,WAAW4E,OAAO,CAAC,2BAA2B,CAAC;QAC7DzC,OAAO0B,GAAG,CAAC;IACb;IAEA,IAAIgB;IACJ,IAAI5C,QAAQ6C,WAAW,EAAE;QACvBD,aAAa,MAAMnD,sBAAsB;YACvCsC,QAAQ/B,QAAQ+B,MAAM;YACtBe,mBAAmB9C,QAAQ6C,WAAW;YACtChC,SAASb,QAAQa,OAAO;YACxBJ,cAAcT,QAAQS,YAAY;YAClC6B;YACAG;YACA3B,YAAYd,QAAQc,UAAU;QAChC;IACF;IAEA,MAAM,EAACiC,WAAW,EAAEC,WAAW,EAAEC,cAAc,EAAEC,cAAc,EAAEC,SAAS,EAAC,GACzE,MAAMzD,kBAAkB;QACtBqC,QAAQ/B,QAAQ+B,MAAM;QACtBlB,SAASb,QAAQa,OAAO;QACxBF,gBAAgBX,QAAQW,cAAc;QACtCc;QACAmB;QACAnC,cAAcT,QAAQS,YAAY;QAClCP;QACAoC;QACA9B,SAASR,QAAQQ,OAAO;QACxBI;QACAP;QACAU,YAAYf,QAAQe,UAAU;QAC9B0B;QACA3B,YAAYd,QAAQc,UAAU;IAChC;IAEF,IAAId,QAAQ8B,IAAI,EAAE;QAChB5B,OAAO0B,GAAG,CAAC,GAAG7D,WAAW4E,OAAO,CAAC,+BAA+B,CAAC;QACjEzC,OAAO0B,GAAG,CAAC;QACX1B,OAAO0B,GAAG,CAAC,CAAC,YAAY,EAAE/D,UAAU,QAAQsF,YAAY;QACxDjD,OAAO0B,GAAG,CAAC,CAAC,SAAS,EAAE/D,UAAU,QAAQkF,cAAc;QACvD7C,OAAO0B,GAAG,CACR,CAAC,oFAAoF,EAAEuB,UAAU,EAAE,CAAC;QAEtG9C,MAAM+C,QAAQ;QACd;IACF;IAEA,0EAA0E;IAC1E,+EAA+E;IAC/E,MAAMC,kBACJrD,QAAQsD,OAAO,KAAK,UAAUtD,QAAQuD,UAAU,KAAK,SACjD,EAAE,GACF,MAAM5E;IAEZ,MAAM6E,YAAY,MAAM5E,SAAS;QAC/B6E,SAASJ;QACTK,MAAM1D,QAAQsD,OAAO;QACrBC,YAAYvD,QAAQuD,UAAU;IAChC;IAEAlD,MAAMuB,GAAG,CAAC;QACR+B,mBAAmBH,UAAUG,iBAAiB;QAC9CN,iBAAiBG,UAAUH,eAAe;QAC1CO,SAASJ,UAAUI,OAAO;QAC1BvB,MAAM;IACR;IACA,IAAImB,UAAUK,KAAK,EAAE;QACnBxD,MAAMwD,KAAK,CAACL,UAAUK,KAAK;IAC7B;IACA,MAAMC,gBAAgBN,UAAUG,iBAAiB;IAEjD,eAAeI;QACb,IAAIP,UAAUQ,eAAe,CAACC,MAAM,KAAK,GAAG;QAC5C,IAAI;YACF,MAAMC,eAAe,MAAMrF,YAAY;gBAACsF,QAAQX,UAAUQ,eAAe;YAAA;YACzE3D,MAAMuB,GAAG,CAAC;gBACRwC,iBAAiBF,aAAaE,eAAe;gBAC7CR,SAASM,aAAaN,OAAO;gBAC7BvB,MAAM;YACR;YACA,IAAI6B,aAAaL,KAAK,EAAE;gBACtBxD,MAAMwD,KAAK,CAACK,aAAaL,KAAK;YAChC;QACF,EAAE,OAAOA,OAAO;YACd,MAAMQ,MAAMR,iBAAiBS,QAAQT,QAAQ,IAAIS,MAAMC,OAAOV;YAC9D/D,MAAM,wCAAwCuE;YAC9CnE,OAAOsE,IAAI,CAAC,CAAC,uCAAuC,EAAEH,IAAII,OAAO,EAAE;YACnEpE,MAAMwD,KAAK,CAACQ;QACd;IACF;IAEA,MAAM,EAACK,wBAAwB,EAAC,GAAGlB;IACnC,IAAIkB,yBAAyBT,MAAM,GAAG,GAAG;QACvC,MAAMU,QACJD,yBAAyBT,MAAM,KAAK,IAChC,GAAGS,wBAAwB,CAAC,EAAE,CAAC,kCAAkC,CAAC,GAClE,GAAGA,yBAAyBT,MAAM,CAAC,0CAA0C,CAAC;QACpFjG,QAAQ2G,OAAOhD,KAAK,GAAGiD,OAAO;IAChC;IAEA,IAAIC,WAAW1F,cAAca,QAAQ8E,oBAAoB,EAAE;IAC3D,IAAI3D,YAAY/B,aAAaY,QAAQe,UAAU,EAAEf,QAAQ8E,oBAAoB,GAAG;QAC9ED,WAAW,MAAM1G;IACnB;IAEAkC,MAAMuB,GAAG,CAAC;QACRZ,mBAAmBA,mBAAmBQ;QACtCuD,gBAAgBF,WAAW,QAAQ;QACnCxC,MAAM;IACR;IAEA,MAAM2C,cAAc9G,OAAO8E,YAAYiC,WAAW,IAC/CC,UAAU,CAAC,QAAQ,KACnBA,UAAU,CAAC,eAAe;IAE7B,MAAMC,gBAAgBN;IAEtB,MAAMO,WAAW,MAAM7G,mBAAmB;QAAC8G,UAAU;QAAOlF;IAAO;IAEnE,MAAMmF,aAAa,MAAM3F,qBAAqB;QAC5CwF;QACAG,YAAYtF,QAAQsF,UAAU;QAC9BN;QACAjE,YAAYf,QAAQe,UAAU;QAC9BwE,QAAQC,QAAQxF,QAAQgC,GAAG;QAC3B7B;IACF;IAEA,IAAIgB,UAAU;QACZ,MAAMrC,8BAA8B;YAClCkC;YACAd;YACAoF;QACF;IACF;IAEA,IAAIT,UAAU;QACZ,MAAMvF,WAAW;YACfyD;YACA/B;YACAwB;YACAsB;YACA9D;YACAE;YACAiD;YACA9C;YACAF;QACF;QACA,MAAM4D;QACN1D,MAAM+C,QAAQ;QACd;IACF;IAEA,IAAIpD,QAAQgC,GAAG,EAAE;QACf,MAAMhD,sBAAsB;YAC1ByG,SAAS;gBACPC,SAAS3C;gBACT4C,YAAYxC;YACd;YACAyC,UAAUpD;YACVqD,WAAW7E;YACXY,KAAK;YACL1B;YACAoF;QACF;QACA,MAAMjG,wBAAwBa,QAAQoF;QACtC,MAAMvB;QACN1D,MAAM+C,QAAQ;QACd;IACF;IAEA,MAAM0C,eAAe;QACnBV;QACAtB;QACA9D;QACAkD;QACAhD;QACAoF;QACAjE;QACA2D;QACA3E;QACAF;IACF;IAEA,MAAOsB,CAAAA,gBACHxC,QAAQ;QAAC,GAAG6G,YAAY;QAAE/C;QAAaI;IAAS,KAChD5D,WAAW;QACT,GAAGuG,YAAY;QACf/C;QACAC;QACAC;QACAE;IACF,EAAC;IAEL,MAAMY;IAEN1D,MAAM+C,QAAQ;AAChB;AAEA,SAAS1B,2BACP1B,OAAoB,EACpB,EAACyB,aAAa,EAAEN,QAAQ,EAA8C;IAEtErB,MAAM;IAEN,IAAIE,QAAQ6C,WAAW,IAAI,CAAC7C,QAAQS,YAAY,EAAE;QAChD,MAAM,IAAIvB,UAAU,sEAAsE;IAC5F;IAEA,IAAIuC,eAAe;QACjB,IAAI,CAACzB,QAAQsF,UAAU,EAAE;YACvB,MAAM,IAAIpG,UAAU,wDAAwD;QAC9E;QAEA,MAAM6G,iBAAiBP,QAAQxF,QAAQQ,OAAO,IAAIR,QAAQ6C,WAAW;QAErE,IAAI,CAACkD,kBAAkB,CAAC/F,QAAQS,YAAY,EAAE;YAC5C,MAAM,IAAIvB,UACR,+EACE,4EACF;QAEJ;QAEA;IACF;IAEA,IAAI,CAACiC,YAAY,CAACnB,QAAQ8B,IAAI,IAAI,CAAC9B,QAAQsF,UAAU,EAAE;QACrD,MAAM,IAAIpG,UAAU,wDAAwD;IAC9E;IAEA,IAAI,CAACc,QAAQQ,OAAO,IAAI,CAACR,QAAQ6C,WAAW,EAAE;QAC5C,MAAM,IAAI3D,UACR,oFACA;IAEJ;AACF;AAEA,eAAewD,oBACb1C,OAAoB,EACpBE,MAA6B,EAC7BG,KAA8D;IAE9D,MAAMoC,OAAO,MAAMjE;IAEnB,IAAIiE,MAAM;QACRpC,MAAMuB,GAAG,CAAC;YAACoE,iBAAiB;YAAM3D,MAAM;QAAO;QAC/CnC,OAAO0B,GAAG,CACR,GAAG7D,WAAW4E,OAAO,CAAC,sBAAsB,EAAEF,KAAKwD,KAAK,CAAC,OAAO,EAAExH,gBAAgBgE,KAAKyD,QAAQ,GAAG;QAEpG,OAAO;YAACzD;QAAI;IACd;IAEA,IAAIzC,QAAQe,UAAU,EAAE;QACtB,MAAM,IAAI7B,UACR,gFACA;IAEJ;IAEAmB,MAAMuB,GAAG,CAAC;QAACS,MAAM;IAAO;IAExB,IAAI;QACF,MAAM3D,MAAM;YACVwB;YACAI,WAAWD,MAAM8F,UAAU,CAAC;QAC9B;IACF,EAAE,OAAOtC,OAAO;QACd,MAAMY,UAAUZ,iBAAiBS,QAAQT,MAAMY,OAAO,GAAGF,OAAOV;QAChE,MAAM,IAAI3E,UAAU,CAAC,cAAc,EAAEuF,SAAS,EAAE;IAClD;IAEA,MAAM2B,eAAe,MAAMhI;IAE3B8B,OAAO0B,GAAG,CACR,GAAG7D,WAAW4E,OAAO,CAAC,sBAAsB,EAAEyD,aAAaH,KAAK,CAAC,OAAO,EAAExH,gBAAgB2H,aAAaF,QAAQ,GAAG;IAEpH,OAAO;QAACzD,MAAM2D;IAAY;AAC5B"}
1
+ {"version":3,"sources":["../../../src/actions/init/initAction.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type SanityOrgUser, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {logSymbols, spinner} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\nimport {type Framework, frameworks} from '@vercel/frameworks'\nimport deburr from 'lodash-es/deburr.js'\n\nimport {promptForConfigFiles} from '../../prompts/init/nextjs.js'\nimport {getCliUser} from '../../services/user.js'\nimport {CLIInitStepCompleted, type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {detectFrameworkRecord} from '../../util/detectFramework.js'\nimport {getProjectDefaults} from '../../util/getProjectDefaults.js'\nimport {validateSession} from '../auth/ensureAuthenticated.js'\nimport {getProviderName} from '../auth/getProviderName.js'\nimport {login} from '../auth/login/login.js'\nimport {detectAvailableEditors} from '../mcp/detectAvailableEditors.js'\nimport {setupMCP} from '../mcp/setupMCP.js'\nimport {setupSkills} from '../skills/setupSkills.js'\nimport {checkNextJsReactCompatibility} from './checkNextJsReactCompatibility.js'\nimport {determineAppTemplate} from './determineAppTemplate.js'\nimport {createOrAppendEnvVars} from './env/createOrAppendEnvVars.js'\nimport {initApp} from './initApp.js'\nimport {InitError} from './initError.js'\nimport {flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded} from './initHelpers.js'\nimport {initNextJs} from './initNextJs.js'\nimport {initStudio} from './initStudio.js'\nimport {getPlan} from './plan/getPlan.js'\nimport {createProjectFromName} from './project/createProjectFromName.js'\nimport {getProjectDetails} from './project/getProjectDetails.js'\nimport {getProjectOutputPath} from './project/getProjectOutputPath.js'\nimport {checkIsRemoteTemplate, getGitHubRepoInfo, type RepoInfo} from './remoteTemplate.js'\nimport {type InitContext, type InitOptions} from './types.js'\n\nconst debug = subdebug('init')\n\nexport async function initAction(options: InitOptions, context: InitContext): Promise<void> {\n const {output, workDir} = context\n\n if (options.argType) {\n throw new InitError(\n options.argType === 'plugin'\n ? 'Initializing plugins through the CLI is no longer supported'\n : `Unknown init type \"${options.argType}\"`,\n 1,\n )\n }\n\n const trace = context.telemetry.trace(CLIInitStepCompleted)\n\n if (options.reconfigure) {\n throw new InitError('--reconfigure is deprecated - manual configuration is now required', 1)\n }\n\n if (options.project && options.organization) {\n throw new InitError(\n 'You have specified both a project and an organization. To move a project to an organization please visit https://www.sanity.io/manage',\n 1,\n )\n }\n\n const defaultConfig = options.datasetDefault\n let showDefaultConfigPrompt = !defaultConfig\n if (options.dataset || options.visibility || options.datasetDefault || options.unattended) {\n showDefaultConfigPrompt = false\n }\n\n const detectedFramework = await detectFrameworkRecord({\n frameworkList: frameworks as readonly Framework[],\n rootPath: workDir,\n })\n const isNextJs = detectedFramework?.slug === 'nextjs'\n\n let remoteTemplateInfo: RepoInfo | undefined\n if (options.template && checkIsRemoteTemplate(options.template)) {\n remoteTemplateInfo = await getGitHubRepoInfo(options.template, options.templateToken)\n }\n\n if (detectedFramework && detectedFramework.slug !== 'sanity' && remoteTemplateInfo) {\n throw new InitError(\n `A remote template cannot be used with a detected framework. Detected: ${detectedFramework.name}`,\n 1,\n )\n }\n\n const isAppTemplate = options.template ? determineAppTemplate(options.template) : false\n\n if (options.unattended) {\n checkFlagsInUnattendedMode(options, {isAppTemplate, isNextJs})\n }\n\n trace.start()\n trace.log({\n flags: {\n bare: options.bare,\n coupon: options.coupon,\n defaultConfig,\n env: options.env,\n git: typeof options.git === 'string' ? options.git : undefined,\n plan: options.projectPlan,\n reconfigure: options.reconfigure,\n unattended: options.unattended,\n },\n step: 'start',\n })\n\n const planId = await getPlan(options, output, trace)\n\n let envFilenameDefault = '.env'\n if (detectedFramework && detectedFramework.slug === 'nextjs') {\n envFilenameDefault = '.env.local'\n }\n const envFilename = typeof options.env === 'string' ? options.env : envFilenameDefault\n\n const {user} = await ensureAuthenticated(options, output, trace)\n if (!isAppTemplate) {\n output.log(`${logSymbols.success} Fetching existing projects`)\n output.log('')\n }\n\n let newProject: string | undefined\n if (options.projectName) {\n newProject = await createProjectFromName({\n coupon: options.coupon,\n createProjectName: options.projectName,\n dataset: options.dataset,\n organization: options.organization,\n planId,\n user,\n visibility: options.visibility,\n })\n }\n\n const {datasetName, displayName, isFirstProject, organizationId, projectId} =\n await getProjectDetails({\n coupon: options.coupon,\n dataset: options.dataset,\n datasetDefault: options.datasetDefault,\n isAppTemplate,\n newProject,\n organization: options.organization,\n output,\n planId,\n project: options.project,\n showDefaultConfigPrompt,\n trace,\n unattended: options.unattended,\n user,\n visibility: options.visibility,\n })\n\n if (options.bare) {\n output.log(`${logSymbols.success} Below are your project details`)\n output.log('')\n output.log(`Project ID: ${styleText('cyan', projectId)}`)\n output.log(`Dataset: ${styleText('cyan', datasetName)}`)\n output.log(\n `\\nYou can find your project on Sanity Manage — https://www.sanity.io/manage/project/${projectId}\\n`,\n )\n trace.complete()\n return\n }\n\n // Detect editors once, then share the result with MCP and skills setup so\n // we don't pay the detection cost (filesystem probes + CLI execa calls) twice.\n const detectedEditors =\n options.mcpMode === 'skip' && options.skillsMode === 'skip'\n ? []\n : await detectAvailableEditors()\n\n const mcpResult = await setupMCP({\n editors: detectedEditors,\n mode: options.mcpMode,\n output,\n skillsMode: options.skillsMode,\n })\n\n trace.log({\n configuredEditors: mcpResult.configuredEditors,\n detectedEditors: mcpResult.detectedEditors,\n skipped: mcpResult.skipped,\n step: 'mcpSetup',\n })\n if (mcpResult.error) {\n trace.error(mcpResult.error)\n }\n const mcpConfigured = mcpResult.configuredEditors\n\n async function installSkills(): Promise<void> {\n if (mcpResult.skillsToInstall.length === 0) return\n try {\n const skillsResult = await setupSkills({agents: mcpResult.skillsToInstall, output})\n trace.log({\n installedAgents: skillsResult.installedAgents,\n skipped: skillsResult.skipped,\n step: 'skillsSetup',\n })\n if (skillsResult.error) {\n trace.error(skillsResult.error)\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n debug('Unexpected error from setupSkills %O', err)\n output.warn(`Could not install Sanity agent skills: ${err.message}`)\n trace.error(err)\n }\n }\n\n // Install skills right after the MCP/skills prompt so the progress + result\n // surface in sequence, rather than trailing the studio \"Success!\" output.\n await installSkills()\n\n const {alreadyConfiguredEditors} = mcpResult\n if (alreadyConfiguredEditors.length > 0) {\n const label =\n alreadyConfiguredEditors.length === 1\n ? `${alreadyConfiguredEditors[0]} already configured for Sanity MCP`\n : `${alreadyConfiguredEditors.length} editors already configured for Sanity MCP`\n spinner(label).start().succeed()\n }\n\n let initNext = flagOrDefault(options.nextjsAddConfigFiles, false)\n if (isNextJs && shouldPrompt(options.unattended, options.nextjsAddConfigFiles)) {\n initNext = await promptForConfigFiles()\n }\n\n trace.log({\n detectedFramework: detectedFramework?.name,\n selectedOption: initNext ? 'yes' : 'no',\n step: 'useDetectedFramework',\n })\n\n const sluggedName = deburr(displayName.toLowerCase())\n .replaceAll(/\\s+/g, '-')\n .replaceAll(/[^a-z0-9-]/g, '')\n\n const initFramework = initNext\n\n const defaults = await getProjectDefaults({isPlugin: false, workDir})\n\n const outputPath = await getProjectOutputPath({\n initFramework,\n outputPath: options.outputPath,\n sluggedName,\n unattended: options.unattended,\n useEnv: Boolean(options.env),\n workDir,\n })\n\n if (isNextJs) {\n await checkNextJsReactCompatibility({\n detectedFramework,\n output,\n outputPath,\n })\n }\n\n if (initNext) {\n await initNextJs({\n datasetName,\n detectedFramework,\n envFilename,\n mcpConfigured,\n options,\n output,\n projectId,\n trace,\n workDir,\n })\n trace.complete()\n return\n }\n\n if (options.env) {\n await createOrAppendEnvVars({\n envVars: {\n DATASET: datasetName,\n PROJECT_ID: projectId,\n },\n filename: envFilename,\n framework: detectedFramework,\n log: false,\n output,\n outputPath,\n })\n await writeStagingEnvIfNeeded(output, outputPath)\n trace.complete()\n return\n }\n\n // Workbench is opt-in (no prompt): the flag swaps the scaffolded\n // `sanity.cli.*` over to `unstable_defineApp` — the branded app is the sole\n // workbench opt-in.\n const workbench = flagOrDefault(options.unstableWorkbench, false)\n\n const sharedParams = {\n defaults,\n mcpConfigured,\n options,\n organizationId,\n output,\n outputPath,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workbench,\n workDir,\n }\n\n await (isAppTemplate\n ? initApp({...sharedParams, datasetName, projectId})\n : initStudio({\n ...sharedParams,\n datasetName,\n displayName,\n isFirstProject,\n projectId,\n }))\n\n trace.complete()\n}\n\nfunction checkFlagsInUnattendedMode(\n options: InitOptions,\n {isAppTemplate, isNextJs}: {isAppTemplate: boolean; isNextJs: boolean},\n): void {\n debug('Unattended mode, validating required options')\n\n if (options.projectName && !options.organization) {\n throw new InitError('`--project-name` requires `--organization <id>` in unattended mode', 1)\n }\n\n if (isAppTemplate) {\n if (!options.outputPath) {\n throw new InitError('`--output-path` must be specified in unattended mode', 1)\n }\n\n const hasProjectFlag = Boolean(options.project || options.projectName)\n\n if (!hasProjectFlag && !options.organization) {\n throw new InitError(\n 'The --organization flag is required for app templates in unattended mode. ' +\n 'Use --organization <id>, or pass --project <id> / --project-name <name>.',\n 1,\n )\n }\n\n return\n }\n\n if (!isNextJs && !options.bare && !options.outputPath) {\n throw new InitError('`--output-path` must be specified in unattended mode', 1)\n }\n\n if (!options.project && !options.projectName) {\n throw new InitError(\n '`--project <id>` or `--project-name <name>` must be specified in unattended mode',\n 1,\n )\n }\n}\n\nasync function ensureAuthenticated(\n options: InitOptions,\n output: InitContext['output'],\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>,\n): Promise<{user: SanityOrgUser}> {\n const user = await validateSession()\n\n if (user) {\n trace.log({alreadyLoggedIn: true, step: 'login'})\n output.log(\n `${logSymbols.success} You are logged in as ${user.email} using ${getProviderName(user.provider)}`,\n )\n return {user}\n }\n\n if (options.unattended) {\n throw new InitError(\n 'Must be logged in to run this command in unattended mode, run `sanity login`',\n 1,\n )\n }\n\n trace.log({step: 'login'})\n\n try {\n await login({\n output,\n telemetry: trace.newContext('login'),\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new InitError(`Login failed: ${message}`, 1)\n }\n\n const loggedInUser = await getCliUser()\n\n output.log(\n `${logSymbols.success} You are logged in as ${loggedInUser.email} using ${getProviderName(loggedInUser.provider)}`,\n )\n return {user: loggedInUser}\n}\n"],"names":["styleText","subdebug","logSymbols","spinner","frameworks","deburr","promptForConfigFiles","getCliUser","CLIInitStepCompleted","detectFrameworkRecord","getProjectDefaults","validateSession","getProviderName","login","detectAvailableEditors","setupMCP","setupSkills","checkNextJsReactCompatibility","determineAppTemplate","createOrAppendEnvVars","initApp","InitError","flagOrDefault","shouldPrompt","writeStagingEnvIfNeeded","initNextJs","initStudio","getPlan","createProjectFromName","getProjectDetails","getProjectOutputPath","checkIsRemoteTemplate","getGitHubRepoInfo","debug","initAction","options","context","output","workDir","argType","trace","telemetry","reconfigure","project","organization","defaultConfig","datasetDefault","showDefaultConfigPrompt","dataset","visibility","unattended","detectedFramework","frameworkList","rootPath","isNextJs","slug","remoteTemplateInfo","template","templateToken","name","isAppTemplate","checkFlagsInUnattendedMode","start","log","flags","bare","coupon","env","git","undefined","plan","projectPlan","step","planId","envFilenameDefault","envFilename","user","ensureAuthenticated","success","newProject","projectName","createProjectName","datasetName","displayName","isFirstProject","organizationId","projectId","complete","detectedEditors","mcpMode","skillsMode","mcpResult","editors","mode","configuredEditors","skipped","error","mcpConfigured","installSkills","skillsToInstall","length","skillsResult","agents","installedAgents","err","Error","String","warn","message","alreadyConfiguredEditors","label","succeed","initNext","nextjsAddConfigFiles","selectedOption","sluggedName","toLowerCase","replaceAll","initFramework","defaults","isPlugin","outputPath","useEnv","Boolean","envVars","DATASET","PROJECT_ID","filename","framework","workbench","unstableWorkbench","sharedParams","hasProjectFlag","alreadyLoggedIn","email","provider","newContext","loggedInUser"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { logSymbols } from '@sanity/cli-core/ux';
3
3
  import { InitError } from './initError.js';
4
4
  import { getPostInitMCPPrompt } from './initHelpers.js';
5
5
  import { scaffoldAndInstall, selectTemplate } from './scaffoldTemplate.js';
6
- export async function initApp({ datasetName, defaults, mcpConfigured, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, trace, workDir }) {
6
+ export async function initApp({ datasetName, defaults, mcpConfigured, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, trace, workbench, workDir }) {
7
7
  const { template: resolvedTemplate, templateName, useTypeScript } = await selectTemplate({
8
8
  options,
9
9
  remoteTemplateInfo,
@@ -26,6 +26,7 @@ export async function initApp({ datasetName, defaults, mcpConfigured, options, o
26
26
  templateName,
27
27
  trace,
28
28
  useTypeScript,
29
+ workbench,
29
30
  workDir
30
31
  });
31
32
  const isCurrentDir = outputPath === workDir;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/initApp.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type Output, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {InitError} from './initError.js'\nimport {getPostInitMCPPrompt} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {scaffoldAndInstall, selectTemplate} from './scaffoldTemplate.js'\nimport {type InitOptions} from './types.js'\n\nexport async function initApp({\n datasetName,\n defaults,\n mcpConfigured,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n mcpConfigured: EditorName[]\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n workDir: string\n}): Promise<void> {\n const {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n } = await selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n })\n\n if (!remoteTemplateInfo && !resolvedTemplate) {\n throw new InitError(`Template \"${templateName}\" not found`, 1)\n }\n\n await scaffoldAndInstall({\n datasetName,\n defaults,\n displayName: '',\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n templateName,\n trace,\n useTypeScript,\n workDir,\n })\n\n const isCurrentDir = outputPath === workDir\n const goToProjectDir = `\\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`\n\n //output for custom apps here\n output.log(\n `${logSymbols.success} ${styleText(['green', 'bold'], 'Success!')} Your custom app has been scaffolded.`,\n )\n if (!isCurrentDir) output.log(goToProjectDir)\n\n if (projectId && datasetName) {\n output.log(\n `\\nConfigured with project ${styleText('cyan', projectId)} and dataset ${styleText('cyan', datasetName)}.`,\n )\n output.log(\n 'Edit `src/App.tsx` to change these values or add more project / dataset pairs to your config.',\n )\n } else {\n output.log(\n `\\n${styleText('bold', 'Next')}, configure the project(s) and dataset(s) your app should work with in \\`src/App.tsx\\`.`,\n )\n }\n output.log('\\nRefer to our documentation for a walkthrough:')\n output.log(\n styleText(['blue', 'underline'], 'https://www.sanity.io/docs/app-sdk/sdk-configuration'),\n )\n if (mcpConfigured && mcpConfigured.length > 0) {\n const message = await getPostInitMCPPrompt(mcpConfigured)\n output.log(`\\n${message}`)\n output.log(`\\nLearn more: ${styleText('cyan', 'https://mcp.sanity.io')}`)\n output.log(\n `\\nHave feedback? Tell us in the community: ${styleText('cyan', 'https://www.sanity.io/community/join')}`,\n )\n }\n output.log('\\n')\n output.log(`Other helpful commands:`)\n output.log(`npx sanity docs browse to open the documentation in a browser`)\n output.log(`npx sanity dev to start the development server for your app`)\n output.log(`npx sanity deploy to deploy your app`)\n}\n"],"names":["styleText","logSymbols","InitError","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","initApp","datasetName","defaults","mcpConfigured","options","organizationId","output","outputPath","projectId","remoteTemplateInfo","sluggedName","trace","workDir","template","resolvedTemplate","templateName","useTypeScript","displayName","isCurrentDir","goToProjectDir","log","success","length","message"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAGnC,SAAQC,UAAU,QAAO,sBAAqB;AAK9C,SAAQC,SAAS,QAAO,iBAAgB;AACxC,SAAQC,oBAAoB,QAAO,mBAAkB;AAErD,SAAQC,kBAAkB,EAAEC,cAAc,QAAO,wBAAuB;AAGxE,OAAO,eAAeC,QAAQ,EAC5BC,WAAW,EACXC,QAAQ,EACRC,aAAa,EACbC,OAAO,EACPC,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,SAAS,EACTC,kBAAkB,EAClBC,WAAW,EACXC,KAAK,EACLC,OAAO,EAcR;IACC,MAAM,EACJC,UAAUC,gBAAgB,EAC1BC,YAAY,EACZC,aAAa,EACd,GAAG,MAAMjB,eAAe;QACvBK;QACAK;QACAE;IACF;IAEA,IAAI,CAACF,sBAAsB,CAACK,kBAAkB;QAC5C,MAAM,IAAIlB,UAAU,CAAC,UAAU,EAAEmB,aAAa,WAAW,CAAC,EAAE;IAC9D;IAEA,MAAMjB,mBAAmB;QACvBG;QACAC;QACAe,aAAa;QACbb;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAK;QACAJ;QACAK;QACAJ;IACF;IAEA,MAAMM,eAAeX,eAAeK;IACpC,MAAMO,iBAAiB,CAAC,GAAG,EAAEzB,UAAU,QAAQ,CAAC,GAAG,EAAEa,YAAY,EAAE,2CAA2C,CAAC;IAE/G,6BAA6B;IAC7BD,OAAOc,GAAG,CACR,GAAGzB,WAAW0B,OAAO,CAAC,CAAC,EAAE3B,UAAU;QAAC;QAAS;KAAO,EAAE,YAAY,qCAAqC,CAAC;IAE1G,IAAI,CAACwB,cAAcZ,OAAOc,GAAG,CAACD;IAE9B,IAAIX,aAAaP,aAAa;QAC5BK,OAAOc,GAAG,CACR,CAAC,0BAA0B,EAAE1B,UAAU,QAAQc,WAAW,aAAa,EAAEd,UAAU,QAAQO,aAAa,CAAC,CAAC;QAE5GK,OAAOc,GAAG,CACR;IAEJ,OAAO;QACLd,OAAOc,GAAG,CACR,CAAC,EAAE,EAAE1B,UAAU,QAAQ,QAAQ,uFAAuF,CAAC;IAE3H;IACAY,OAAOc,GAAG,CAAC;IACXd,OAAOc,GAAG,CACR1B,UAAU;QAAC;QAAQ;KAAY,EAAE;IAEnC,IAAIS,iBAAiBA,cAAcmB,MAAM,GAAG,GAAG;QAC7C,MAAMC,UAAU,MAAM1B,qBAAqBM;QAC3CG,OAAOc,GAAG,CAAC,CAAC,EAAE,EAAEG,SAAS;QACzBjB,OAAOc,GAAG,CAAC,CAAC,cAAc,EAAE1B,UAAU,QAAQ,0BAA0B;QACxEY,OAAOc,GAAG,CACR,CAAC,2CAA2C,EAAE1B,UAAU,QAAQ,yCAAyC;IAE7G;IACAY,OAAOc,GAAG,CAAC;IACXd,OAAOc,GAAG,CAAC,CAAC,uBAAuB,CAAC;IACpCd,OAAOc,GAAG,CAAC,CAAC,iEAAiE,CAAC;IAC9Ed,OAAOc,GAAG,CAAC,CAAC,uEAAuE,CAAC;IACpFd,OAAOc,GAAG,CAAC,CAAC,6CAA6C,CAAC;AAC5D"}
1
+ {"version":3,"sources":["../../../src/actions/init/initApp.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type Output, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {InitError} from './initError.js'\nimport {getPostInitMCPPrompt} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {scaffoldAndInstall, selectTemplate} from './scaffoldTemplate.js'\nimport {type InitOptions} from './types.js'\n\nexport async function initApp({\n datasetName,\n defaults,\n mcpConfigured,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workbench,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n mcpConfigured: EditorName[]\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n workbench: boolean\n workDir: string\n}): Promise<void> {\n const {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n } = await selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n })\n\n if (!remoteTemplateInfo && !resolvedTemplate) {\n throw new InitError(`Template \"${templateName}\" not found`, 1)\n }\n\n await scaffoldAndInstall({\n datasetName,\n defaults,\n displayName: '',\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n templateName,\n trace,\n useTypeScript,\n workbench,\n workDir,\n })\n\n const isCurrentDir = outputPath === workDir\n const goToProjectDir = `\\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`\n\n //output for custom apps here\n output.log(\n `${logSymbols.success} ${styleText(['green', 'bold'], 'Success!')} Your custom app has been scaffolded.`,\n )\n if (!isCurrentDir) output.log(goToProjectDir)\n\n if (projectId && datasetName) {\n output.log(\n `\\nConfigured with project ${styleText('cyan', projectId)} and dataset ${styleText('cyan', datasetName)}.`,\n )\n output.log(\n 'Edit `src/App.tsx` to change these values or add more project / dataset pairs to your config.',\n )\n } else {\n output.log(\n `\\n${styleText('bold', 'Next')}, configure the project(s) and dataset(s) your app should work with in \\`src/App.tsx\\`.`,\n )\n }\n output.log('\\nRefer to our documentation for a walkthrough:')\n output.log(\n styleText(['blue', 'underline'], 'https://www.sanity.io/docs/app-sdk/sdk-configuration'),\n )\n if (mcpConfigured && mcpConfigured.length > 0) {\n const message = await getPostInitMCPPrompt(mcpConfigured)\n output.log(`\\n${message}`)\n output.log(`\\nLearn more: ${styleText('cyan', 'https://mcp.sanity.io')}`)\n output.log(\n `\\nHave feedback? Tell us in the community: ${styleText('cyan', 'https://www.sanity.io/community/join')}`,\n )\n }\n output.log('\\n')\n output.log(`Other helpful commands:`)\n output.log(`npx sanity docs browse to open the documentation in a browser`)\n output.log(`npx sanity dev to start the development server for your app`)\n output.log(`npx sanity deploy to deploy your app`)\n}\n"],"names":["styleText","logSymbols","InitError","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","initApp","datasetName","defaults","mcpConfigured","options","organizationId","output","outputPath","projectId","remoteTemplateInfo","sluggedName","trace","workbench","workDir","template","resolvedTemplate","templateName","useTypeScript","displayName","isCurrentDir","goToProjectDir","log","success","length","message"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAGnC,SAAQC,UAAU,QAAO,sBAAqB;AAK9C,SAAQC,SAAS,QAAO,iBAAgB;AACxC,SAAQC,oBAAoB,QAAO,mBAAkB;AAErD,SAAQC,kBAAkB,EAAEC,cAAc,QAAO,wBAAuB;AAGxE,OAAO,eAAeC,QAAQ,EAC5BC,WAAW,EACXC,QAAQ,EACRC,aAAa,EACbC,OAAO,EACPC,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,SAAS,EACTC,kBAAkB,EAClBC,WAAW,EACXC,KAAK,EACLC,SAAS,EACTC,OAAO,EAeR;IACC,MAAM,EACJC,UAAUC,gBAAgB,EAC1BC,YAAY,EACZC,aAAa,EACd,GAAG,MAAMlB,eAAe;QACvBK;QACAK;QACAE;IACF;IAEA,IAAI,CAACF,sBAAsB,CAACM,kBAAkB;QAC5C,MAAM,IAAInB,UAAU,CAAC,UAAU,EAAEoB,aAAa,WAAW,CAAC,EAAE;IAC9D;IAEA,MAAMlB,mBAAmB;QACvBG;QACAC;QACAgB,aAAa;QACbd;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAM;QACAL;QACAM;QACAL;QACAC;IACF;IAEA,MAAMM,eAAeZ,eAAeM;IACpC,MAAMO,iBAAiB,CAAC,GAAG,EAAE1B,UAAU,QAAQ,CAAC,GAAG,EAAEa,YAAY,EAAE,2CAA2C,CAAC;IAE/G,6BAA6B;IAC7BD,OAAOe,GAAG,CACR,GAAG1B,WAAW2B,OAAO,CAAC,CAAC,EAAE5B,UAAU;QAAC;QAAS;KAAO,EAAE,YAAY,qCAAqC,CAAC;IAE1G,IAAI,CAACyB,cAAcb,OAAOe,GAAG,CAACD;IAE9B,IAAIZ,aAAaP,aAAa;QAC5BK,OAAOe,GAAG,CACR,CAAC,0BAA0B,EAAE3B,UAAU,QAAQc,WAAW,aAAa,EAAEd,UAAU,QAAQO,aAAa,CAAC,CAAC;QAE5GK,OAAOe,GAAG,CACR;IAEJ,OAAO;QACLf,OAAOe,GAAG,CACR,CAAC,EAAE,EAAE3B,UAAU,QAAQ,QAAQ,uFAAuF,CAAC;IAE3H;IACAY,OAAOe,GAAG,CAAC;IACXf,OAAOe,GAAG,CACR3B,UAAU;QAAC;QAAQ;KAAY,EAAE;IAEnC,IAAIS,iBAAiBA,cAAcoB,MAAM,GAAG,GAAG;QAC7C,MAAMC,UAAU,MAAM3B,qBAAqBM;QAC3CG,OAAOe,GAAG,CAAC,CAAC,EAAE,EAAEG,SAAS;QACzBlB,OAAOe,GAAG,CAAC,CAAC,cAAc,EAAE3B,UAAU,QAAQ,0BAA0B;QACxEY,OAAOe,GAAG,CACR,CAAC,2CAA2C,EAAE3B,UAAU,QAAQ,yCAAyC;IAE7G;IACAY,OAAOe,GAAG,CAAC;IACXf,OAAOe,GAAG,CAAC,CAAC,uBAAuB,CAAC;IACpCf,OAAOe,GAAG,CAAC,CAAC,iEAAiE,CAAC;IAC9Ef,OAAOe,GAAG,CAAC,CAAC,uEAAuE,CAAC;IACpFf,OAAOe,GAAG,CAAC,CAAC,6CAA6C,CAAC;AAC5D"}
@@ -12,7 +12,7 @@ async function promptForDatasetImport(message) {
12
12
  message: message || 'This template includes a sample dataset, would you like to use it?'
13
13
  });
14
14
  }
15
- export async function initStudio({ datasetName, defaults, displayName, isFirstProject, mcpConfigured, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, trace, workDir }) {
15
+ export async function initStudio({ datasetName, defaults, displayName, isFirstProject, mcpConfigured, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, trace, workbench, workDir }) {
16
16
  const { importDataset, unattended } = options;
17
17
  const { template: resolvedTemplate, templateName, useTypeScript } = await selectTemplate({
18
18
  options,
@@ -48,6 +48,7 @@ export async function initStudio({ datasetName, defaults, displayName, isFirstPr
48
48
  templateName,
49
49
  trace,
50
50
  useTypeScript,
51
+ workbench,
51
52
  workDir
52
53
  });
53
54
  // Prompt for dataset import (if a dataset is defined)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/initStudio.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {getCliToken, type Output, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {updateProjectInitializedAt} from '../../services/projects.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {type PackageManager} from '../../util/packageManager/packageManagerChoice.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {InitError} from './initError.js'\nimport {getPostInitMCPPrompt} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {scaffoldAndInstall, selectTemplate} from './scaffoldTemplate.js'\nimport {type InitOptions} from './types.js'\n\nconst debug = subdebug('init')\n\nasync function promptForDatasetImport(message?: string): Promise<boolean> {\n return confirm({\n default: true,\n message: message || 'This template includes a sample dataset, would you like to use it?',\n })\n}\n\nexport async function initStudio({\n datasetName,\n defaults,\n displayName,\n isFirstProject,\n mcpConfigured,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n displayName: string\n isFirstProject: boolean\n mcpConfigured: EditorName[]\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n workDir: string\n}): Promise<void> {\n const {importDataset, unattended} = options\n const {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n } = await selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n })\n\n if (!remoteTemplateInfo && !resolvedTemplate) {\n throw new InitError(`Template \"${templateName}\" not found`, 1)\n }\n\n // If the template has a sample dataset, prompt the user whether or not we should import it\n const shouldImport =\n resolvedTemplate?.datasetUrl &&\n (importDataset ??\n (!unattended && (await promptForDatasetImport(resolvedTemplate.importPrompt))))\n\n trace.log({\n selectedOption: shouldImport ? 'yes' : 'no',\n step: 'importTemplateDataset',\n })\n\n try {\n await updateProjectInitializedAt(projectId)\n } catch (err) {\n // Non-critical update\n debug('Failed to update cliInitializedAt metadata', err)\n }\n\n const {pkgManager} = await scaffoldAndInstall({\n datasetName,\n defaults,\n displayName,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n templateName,\n trace,\n useTypeScript,\n workDir,\n })\n\n // Prompt for dataset import (if a dataset is defined)\n if (shouldImport && resolvedTemplate?.datasetUrl) {\n const token = await getCliToken()\n if (!token) {\n throw new InitError('Authentication required to import dataset', 1)\n }\n // eslint-disable-next-line no-restricted-syntax\n const {ImportDatasetCommand} = await import('../../commands/datasets/import.js')\n await ImportDatasetCommand.run(\n [\n resolvedTemplate.datasetUrl,\n '--project-id',\n projectId,\n '--dataset',\n datasetName,\n '--token',\n token,\n '--missing',\n ],\n {\n root: outputPath,\n },\n )\n\n output.log('')\n output.log('If you want to delete the imported data, use')\n output.log(` ${styleText('cyan', `npx sanity dataset delete ${datasetName}`)}`)\n output.log('and create a new clean dataset with')\n output.log(` ${styleText('cyan', `npx sanity dataset create <name>`)}\\n`)\n }\n\n const devCommandMap: Record<PackageManager, string> = {\n bun: 'bun dev',\n manual: 'npm run dev',\n npm: 'npm run dev',\n pnpm: 'pnpm dev',\n yarn: 'yarn dev',\n }\n const devCommand = devCommandMap[pkgManager]\n\n const isCurrentDir = outputPath === workDir\n const goToProjectDir = `\\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`\n\n //output for Studios here\n output.log(`\\u2705 ${styleText(['green', 'bold'], 'Success!')} Your Studio has been created.`)\n if (!isCurrentDir) output.log(goToProjectDir)\n output.log(\n `\\nGet started by running ${styleText('cyan', devCommand)} to launch your Studio's development server`,\n )\n if (mcpConfigured && mcpConfigured.length > 0) {\n const message = await getPostInitMCPPrompt(mcpConfigured)\n output.log(`\\n${message}`)\n output.log(`\\nLearn more: ${styleText('cyan', 'https://mcp.sanity.io')}`)\n output.log(\n `\\nHave feedback? Tell us in the community: ${styleText('cyan', 'https://www.sanity.io/community/join')}`,\n )\n }\n output.log('\\n')\n output.log(`Other helpful commands:`)\n output.log(`npx sanity docs browse to open the documentation in a browser`)\n output.log(`npx sanity manage to open the project settings in a browser`)\n output.log(`npx sanity help to explore the CLI manual`)\n\n if (isFirstProject) {\n trace.log({selectedOption: 'yes', step: 'sendCommunityInvite'})\n\n const DISCORD_INVITE_LINK = 'https://www.sanity.io/community/join'\n\n output.log(`\\nJoin the Sanity community: ${styleText('cyan', DISCORD_INVITE_LINK)}`)\n output.log('We look forward to seeing you there!\\n')\n }\n}\n"],"names":["styleText","getCliToken","subdebug","confirm","updateProjectInitializedAt","InitError","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","debug","promptForDatasetImport","message","default","initStudio","datasetName","defaults","displayName","isFirstProject","mcpConfigured","options","organizationId","output","outputPath","projectId","remoteTemplateInfo","sluggedName","trace","workDir","importDataset","unattended","template","resolvedTemplate","templateName","useTypeScript","shouldImport","datasetUrl","importPrompt","log","selectedOption","step","err","pkgManager","token","ImportDatasetCommand","run","root","devCommandMap","bun","manual","npm","pnpm","yarn","devCommand","isCurrentDir","goToProjectDir","length","DISCORD_INVITE_LINK"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/init/initStudio.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {getCliToken, type Output, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {updateProjectInitializedAt} from '../../services/projects.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {type PackageManager} from '../../util/packageManager/packageManagerChoice.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {InitError} from './initError.js'\nimport {getPostInitMCPPrompt} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {scaffoldAndInstall, selectTemplate} from './scaffoldTemplate.js'\nimport {type InitOptions} from './types.js'\n\nconst debug = subdebug('init')\n\nasync function promptForDatasetImport(message?: string): Promise<boolean> {\n return confirm({\n default: true,\n message: message || 'This template includes a sample dataset, would you like to use it?',\n })\n}\n\nexport async function initStudio({\n datasetName,\n defaults,\n displayName,\n isFirstProject,\n mcpConfigured,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workbench,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n displayName: string\n isFirstProject: boolean\n mcpConfigured: EditorName[]\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n workbench: boolean\n workDir: string\n}): Promise<void> {\n const {importDataset, unattended} = options\n const {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n } = await selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n })\n\n if (!remoteTemplateInfo && !resolvedTemplate) {\n throw new InitError(`Template \"${templateName}\" not found`, 1)\n }\n\n // If the template has a sample dataset, prompt the user whether or not we should import it\n const shouldImport =\n resolvedTemplate?.datasetUrl &&\n (importDataset ??\n (!unattended && (await promptForDatasetImport(resolvedTemplate.importPrompt))))\n\n trace.log({\n selectedOption: shouldImport ? 'yes' : 'no',\n step: 'importTemplateDataset',\n })\n\n try {\n await updateProjectInitializedAt(projectId)\n } catch (err) {\n // Non-critical update\n debug('Failed to update cliInitializedAt metadata', err)\n }\n\n const {pkgManager} = await scaffoldAndInstall({\n datasetName,\n defaults,\n displayName,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n templateName,\n trace,\n useTypeScript,\n workbench,\n workDir,\n })\n\n // Prompt for dataset import (if a dataset is defined)\n if (shouldImport && resolvedTemplate?.datasetUrl) {\n const token = await getCliToken()\n if (!token) {\n throw new InitError('Authentication required to import dataset', 1)\n }\n // eslint-disable-next-line no-restricted-syntax\n const {ImportDatasetCommand} = await import('../../commands/datasets/import.js')\n await ImportDatasetCommand.run(\n [\n resolvedTemplate.datasetUrl,\n '--project-id',\n projectId,\n '--dataset',\n datasetName,\n '--token',\n token,\n '--missing',\n ],\n {\n root: outputPath,\n },\n )\n\n output.log('')\n output.log('If you want to delete the imported data, use')\n output.log(` ${styleText('cyan', `npx sanity dataset delete ${datasetName}`)}`)\n output.log('and create a new clean dataset with')\n output.log(` ${styleText('cyan', `npx sanity dataset create <name>`)}\\n`)\n }\n\n const devCommandMap: Record<PackageManager, string> = {\n bun: 'bun dev',\n manual: 'npm run dev',\n npm: 'npm run dev',\n pnpm: 'pnpm dev',\n yarn: 'yarn dev',\n }\n const devCommand = devCommandMap[pkgManager]\n\n const isCurrentDir = outputPath === workDir\n const goToProjectDir = `\\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`\n\n //output for Studios here\n output.log(`\\u2705 ${styleText(['green', 'bold'], 'Success!')} Your Studio has been created.`)\n if (!isCurrentDir) output.log(goToProjectDir)\n output.log(\n `\\nGet started by running ${styleText('cyan', devCommand)} to launch your Studio's development server`,\n )\n if (mcpConfigured && mcpConfigured.length > 0) {\n const message = await getPostInitMCPPrompt(mcpConfigured)\n output.log(`\\n${message}`)\n output.log(`\\nLearn more: ${styleText('cyan', 'https://mcp.sanity.io')}`)\n output.log(\n `\\nHave feedback? Tell us in the community: ${styleText('cyan', 'https://www.sanity.io/community/join')}`,\n )\n }\n output.log('\\n')\n output.log(`Other helpful commands:`)\n output.log(`npx sanity docs browse to open the documentation in a browser`)\n output.log(`npx sanity manage to open the project settings in a browser`)\n output.log(`npx sanity help to explore the CLI manual`)\n\n if (isFirstProject) {\n trace.log({selectedOption: 'yes', step: 'sendCommunityInvite'})\n\n const DISCORD_INVITE_LINK = 'https://www.sanity.io/community/join'\n\n output.log(`\\nJoin the Sanity community: ${styleText('cyan', DISCORD_INVITE_LINK)}`)\n output.log('We look forward to seeing you there!\\n')\n }\n}\n"],"names":["styleText","getCliToken","subdebug","confirm","updateProjectInitializedAt","InitError","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","debug","promptForDatasetImport","message","default","initStudio","datasetName","defaults","displayName","isFirstProject","mcpConfigured","options","organizationId","output","outputPath","projectId","remoteTemplateInfo","sluggedName","trace","workbench","workDir","importDataset","unattended","template","resolvedTemplate","templateName","useTypeScript","shouldImport","datasetUrl","importPrompt","log","selectedOption","step","err","pkgManager","token","ImportDatasetCommand","run","root","devCommandMap","bun","manual","npm","pnpm","yarn","devCommand","isCurrentDir","goToProjectDir","length","DISCORD_INVITE_LINK"],"mappings":"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"}
@@ -74,7 +74,7 @@ export async function selectTemplate({ options, remoteTemplateInfo, trace }) {
74
74
  useTypeScript
75
75
  };
76
76
  }
77
- export async function scaffoldAndInstall({ datasetName, defaults, displayName, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, templateName, trace, useTypeScript, workDir }) {
77
+ export async function scaffoldAndInstall({ datasetName, defaults, displayName, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, templateName, trace, useTypeScript, workbench, workDir }) {
78
78
  const { autoUpdates, git, overwriteFiles, packageManager, templateToken, unattended } = options;
79
79
  const noGit = typeof git === 'boolean' && !git ? true : undefined;
80
80
  await bootstrapTemplate({
@@ -90,7 +90,8 @@ export async function scaffoldAndInstall({ datasetName, defaults, displayName, o
90
90
  projectName: displayName || defaults.projectName,
91
91
  remoteTemplateInfo,
92
92
  templateName,
93
- useTypeScript
93
+ useTypeScript,
94
+ workbench
94
95
  });
95
96
  const pkgManager = await resolvePackageManager({
96
97
  interactive: !unattended,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/scaffoldTemplate.ts"],"sourcesContent":["import {type Output, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {promptForTypeScript} from '../../prompts/init/promptForTypescript.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {getSanityEnv} from '../../util/getSanityEnv.js'\nimport {installDeclaredPackages} from '../../util/packageManager/installPackages.js'\nimport {type PackageManager} from '../../util/packageManager/packageManagerChoice.js'\nimport {bootstrapTemplate} from './bootstrapTemplate.js'\nimport {tryGitInit} from './git.js'\nimport {flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {resolvePackageManager} from './resolvePackageManager.js'\nimport templates from './templates/index.js'\nimport {type InitOptions, type ProjectTemplate} from './types.js'\n\ninterface SelectedTemplate {\n template: ProjectTemplate | undefined\n templateName: string\n useTypeScript: boolean\n}\n\ninterface TemplateChoice {\n name: string\n value: string\n}\n\nconst baseTemplateChoices: TemplateChoice[] = [\n {name: 'Clean project with no predefined schema types', value: 'clean'},\n {name: 'Blog (schema)', value: 'blog'},\n {name: 'E-commerce (Shopify)', value: 'shopify'},\n {name: 'Movie project (schema + sample data)', value: 'moviedb'},\n]\n\nconst stagingTemplateChoices: TemplateChoice[] = [\n {name: 'Page Builder (presets)', value: 'page-builder'},\n]\n\nexport function getTemplateChoices(env: string): TemplateChoice[] {\n return env === 'production'\n ? baseTemplateChoices\n : [...baseTemplateChoices, ...stagingTemplateChoices]\n}\n\nasync function promptForTemplate(params: {\n template?: string\n unattended: boolean\n}): Promise<string> {\n const defaultTemplate = params.unattended || params.template ? params.template || 'clean' : null\n if (defaultTemplate) {\n return defaultTemplate\n }\n\n return select({\n choices: getTemplateChoices(getSanityEnv()),\n message: 'Select project template',\n })\n}\n\nexport async function selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n}: {\n options: InitOptions\n remoteTemplateInfo: RepoInfo | undefined\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n}): Promise<SelectedTemplate> {\n const {template, typescript, unattended} = options\n const templateName = await promptForTemplate({template, unattended})\n trace.log({\n selectedOption: templateName,\n step: 'selectProjectTemplate',\n })\n\n const resolvedTemplate = templates[templateName]\n\n let useTypeScript = flagOrDefault(typescript, true)\n if (!remoteTemplateInfo && resolvedTemplate && resolvedTemplate.typescriptOnly === true) {\n useTypeScript = true\n } else if (shouldPrompt(unattended, typescript)) {\n useTypeScript = await promptForTypeScript()\n trace.log({\n selectedOption: useTypeScript ? 'yes' : 'no',\n step: 'useTypeScript',\n })\n }\n\n return {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n }\n}\n\nexport async function scaffoldAndInstall({\n datasetName,\n defaults,\n displayName,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n templateName,\n trace,\n useTypeScript,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n displayName: string\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n templateName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n useTypeScript: boolean\n workDir: string\n}): Promise<{pkgManager: PackageManager}> {\n const {autoUpdates, git, overwriteFiles, packageManager, templateToken, unattended} = options\n const noGit = typeof git === 'boolean' && !git ? true : undefined\n\n await bootstrapTemplate({\n autoUpdates,\n bearerToken: templateToken,\n dataset: datasetName,\n organizationId,\n output,\n outputPath,\n overwriteFiles,\n packageName: sluggedName,\n projectId,\n projectName: displayName || defaults.projectName,\n remoteTemplateInfo,\n templateName,\n useTypeScript,\n })\n\n const pkgManager = await resolvePackageManager({\n interactive: !unattended,\n output,\n packageManager: packageManager as PackageManager,\n targetDir: outputPath,\n })\n\n trace.log({\n selectedOption: pkgManager,\n step: 'selectPackageManager',\n })\n\n // Now for the slow part... installing dependencies\n await installDeclaredPackages(outputPath, pkgManager, {\n output,\n workDir,\n })\n\n const useGit = !noGit && (git === undefined || Boolean(git))\n const commitMessage = git\n await writeStagingEnvIfNeeded(output, outputPath)\n\n // Try initializing a git repository\n if (useGit) {\n tryGitInit(outputPath, typeof commitMessage === 'string' ? commitMessage : undefined)\n }\n\n return {pkgManager}\n}\n"],"names":["select","promptForTypeScript","getSanityEnv","installDeclaredPackages","bootstrapTemplate","tryGitInit","flagOrDefault","shouldPrompt","writeStagingEnvIfNeeded","resolvePackageManager","templates","baseTemplateChoices","name","value","stagingTemplateChoices","getTemplateChoices","env","promptForTemplate","params","defaultTemplate","unattended","template","choices","message","selectTemplate","options","remoteTemplateInfo","trace","typescript","templateName","log","selectedOption","step","resolvedTemplate","useTypeScript","typescriptOnly","scaffoldAndInstall","datasetName","defaults","displayName","organizationId","output","outputPath","projectId","sluggedName","workDir","autoUpdates","git","overwriteFiles","packageManager","templateToken","noGit","undefined","bearerToken","dataset","packageName","projectName","pkgManager","interactive","targetDir","useGit","Boolean","commitMessage"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/init/scaffoldTemplate.ts"],"sourcesContent":["import {type Output, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {promptForTypeScript} from '../../prompts/init/promptForTypescript.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {getSanityEnv} from '../../util/getSanityEnv.js'\nimport {installDeclaredPackages} from '../../util/packageManager/installPackages.js'\nimport {type PackageManager} from '../../util/packageManager/packageManagerChoice.js'\nimport {bootstrapTemplate} from './bootstrapTemplate.js'\nimport {tryGitInit} from './git.js'\nimport {flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {resolvePackageManager} from './resolvePackageManager.js'\nimport templates from './templates/index.js'\nimport {type InitOptions, type ProjectTemplate} from './types.js'\n\ninterface SelectedTemplate {\n template: ProjectTemplate | undefined\n templateName: string\n useTypeScript: boolean\n}\n\ninterface TemplateChoice {\n name: string\n value: string\n}\n\nconst baseTemplateChoices: TemplateChoice[] = [\n {name: 'Clean project with no predefined schema types', value: 'clean'},\n {name: 'Blog (schema)', value: 'blog'},\n {name: 'E-commerce (Shopify)', value: 'shopify'},\n {name: 'Movie project (schema + sample data)', value: 'moviedb'},\n]\n\nconst stagingTemplateChoices: TemplateChoice[] = [\n {name: 'Page Builder (presets)', value: 'page-builder'},\n]\n\nexport function getTemplateChoices(env: string): TemplateChoice[] {\n return env === 'production'\n ? baseTemplateChoices\n : [...baseTemplateChoices, ...stagingTemplateChoices]\n}\n\nasync function promptForTemplate(params: {\n template?: string\n unattended: boolean\n}): Promise<string> {\n const defaultTemplate = params.unattended || params.template ? params.template || 'clean' : null\n if (defaultTemplate) {\n return defaultTemplate\n }\n\n return select({\n choices: getTemplateChoices(getSanityEnv()),\n message: 'Select project template',\n })\n}\n\nexport async function selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n}: {\n options: InitOptions\n remoteTemplateInfo: RepoInfo | undefined\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n}): Promise<SelectedTemplate> {\n const {template, typescript, unattended} = options\n const templateName = await promptForTemplate({template, unattended})\n trace.log({\n selectedOption: templateName,\n step: 'selectProjectTemplate',\n })\n\n const resolvedTemplate = templates[templateName]\n\n let useTypeScript = flagOrDefault(typescript, true)\n if (!remoteTemplateInfo && resolvedTemplate && resolvedTemplate.typescriptOnly === true) {\n useTypeScript = true\n } else if (shouldPrompt(unattended, typescript)) {\n useTypeScript = await promptForTypeScript()\n trace.log({\n selectedOption: useTypeScript ? 'yes' : 'no',\n step: 'useTypeScript',\n })\n }\n\n return {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n }\n}\n\nexport async function scaffoldAndInstall({\n datasetName,\n defaults,\n displayName,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n templateName,\n trace,\n useTypeScript,\n workbench,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n displayName: string\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n templateName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n useTypeScript: boolean\n workbench: boolean\n workDir: string\n}): Promise<{pkgManager: PackageManager}> {\n const {autoUpdates, git, overwriteFiles, packageManager, templateToken, unattended} = options\n const noGit = typeof git === 'boolean' && !git ? true : undefined\n\n await bootstrapTemplate({\n autoUpdates,\n bearerToken: templateToken,\n dataset: datasetName,\n organizationId,\n output,\n outputPath,\n overwriteFiles,\n packageName: sluggedName,\n projectId,\n projectName: displayName || defaults.projectName,\n remoteTemplateInfo,\n templateName,\n useTypeScript,\n workbench,\n })\n\n const pkgManager = await resolvePackageManager({\n interactive: !unattended,\n output,\n packageManager: packageManager as PackageManager,\n targetDir: outputPath,\n })\n\n trace.log({\n selectedOption: pkgManager,\n step: 'selectPackageManager',\n })\n\n // Now for the slow part... installing dependencies\n await installDeclaredPackages(outputPath, pkgManager, {\n output,\n workDir,\n })\n\n const useGit = !noGit && (git === undefined || Boolean(git))\n const commitMessage = git\n await writeStagingEnvIfNeeded(output, outputPath)\n\n // Try initializing a git repository\n if (useGit) {\n tryGitInit(outputPath, typeof commitMessage === 'string' ? commitMessage : undefined)\n }\n\n return {pkgManager}\n}\n"],"names":["select","promptForTypeScript","getSanityEnv","installDeclaredPackages","bootstrapTemplate","tryGitInit","flagOrDefault","shouldPrompt","writeStagingEnvIfNeeded","resolvePackageManager","templates","baseTemplateChoices","name","value","stagingTemplateChoices","getTemplateChoices","env","promptForTemplate","params","defaultTemplate","unattended","template","choices","message","selectTemplate","options","remoteTemplateInfo","trace","typescript","templateName","log","selectedOption","step","resolvedTemplate","useTypeScript","typescriptOnly","scaffoldAndInstall","datasetName","defaults","displayName","organizationId","output","outputPath","projectId","sluggedName","workbench","workDir","autoUpdates","git","overwriteFiles","packageManager","templateToken","noGit","undefined","bearerToken","dataset","packageName","projectName","pkgManager","interactive","targetDir","useGit","Boolean","commitMessage"],"mappings":"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"}
@@ -24,7 +24,7 @@ export default defineConfig({
24
24
  const pageBuilderTemplate = {
25
25
  configTemplate,
26
26
  dependencies: {
27
- '@sanity/presets': '^0.4.1'
27
+ '@sanity/presets': '^0.5.0'
28
28
  }
29
29
  };
30
30
  export default pageBuilderTemplate;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/actions/init/templates/pageBuilder.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst configTemplate = `\nimport {defineConfig} from 'sanity'\nimport {structureTool} from 'sanity/structure'\nimport {visionTool} from '@sanity/vision'\nimport {schemaTypes} from './schemaTypes'\n\nexport default defineConfig({\n name: '%sourceName%',\n title: '%projectName%',\n\n projectId: '%projectId%',\n dataset: '%dataset%',\n\n plugins: [\n structureTool(),\n visionTool(),\n ],\n\n schema: {\n types: schemaTypes,\n },\n})\n`\n\nconst pageBuilderTemplate: ProjectTemplate = {\n configTemplate,\n dependencies: {\n '@sanity/presets': '^0.4.1',\n },\n}\n\nexport default pageBuilderTemplate\n"],"names":["configTemplate","pageBuilderTemplate","dependencies"],"mappings":"AAEA,MAAMA,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsBxB,CAAC;AAED,MAAMC,sBAAuC;IAC3CD;IACAE,cAAc;QACZ,mBAAmB;IACrB;AACF;AAEA,eAAeD,oBAAmB"}
1
+ {"version":3,"sources":["../../../../src/actions/init/templates/pageBuilder.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst configTemplate = `\nimport {defineConfig} from 'sanity'\nimport {structureTool} from 'sanity/structure'\nimport {visionTool} from '@sanity/vision'\nimport {schemaTypes} from './schemaTypes'\n\nexport default defineConfig({\n name: '%sourceName%',\n title: '%projectName%',\n\n projectId: '%projectId%',\n dataset: '%dataset%',\n\n plugins: [\n structureTool(),\n visionTool(),\n ],\n\n schema: {\n types: schemaTypes,\n },\n})\n`\n\nconst pageBuilderTemplate: ProjectTemplate = {\n configTemplate,\n dependencies: {\n '@sanity/presets': '^0.5.0',\n },\n}\n\nexport default pageBuilderTemplate\n"],"names":["configTemplate","pageBuilderTemplate","dependencies"],"mappings":"AAEA,MAAMA,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsBxB,CAAC;AAED,MAAMC,sBAAuC;IAC3CD;IACAE,cAAc;QACZ,mBAAmB;IACrB;AACF;AAEA,eAAeD,oBAAmB"}
@@ -43,6 +43,7 @@ export function flagsToInitOptions(flags, isUnattended, args, mcpMode, skillsMod
43
43
  templateToken: flags['template-token'],
44
44
  typescript: flags.typescript,
45
45
  unattended: isUnattended,
46
+ unstableWorkbench: flags['unstable--workbench'],
46
47
  visibility: narrowVisibility(flags.visibility)
47
48
  };
48
49
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/types.ts"],"sourcesContent":["import {type CLITelemetryStore, type Output} from '@sanity/cli-core'\nimport {type Framework} from '@vercel/frameworks'\n\nimport {type GenerateConfigOptions} from './createStudioConfig.js'\n\nexport type VersionedFramework = Framework & {\n detectedVersion?: string\n}\n\nexport interface ProjectTemplate {\n configTemplate?: ((variables: GenerateConfigOptions['variables']) => string) | string\n datasetUrl?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n entry?: string\n importPrompt?: string\n scripts?: Record<string, string>\n type?: 'commonjs' | 'module'\n typescriptOnly?: boolean\n}\n\nexport interface InitOptions {\n autoUpdates: boolean\n bare: boolean\n datasetDefault: boolean\n fromCreate: boolean\n mcpMode: 'auto' | 'prompt' | 'skip'\n skillsMode: 'auto' | 'prompt' | 'skip'\n unattended: boolean\n\n argType?: string\n coupon?: string\n dataset?: string\n env?: string\n git?: boolean | string\n importDataset?: boolean\n nextjsAddConfigFiles?: boolean\n nextjsAppendEnv?: boolean\n nextjsEmbedStudio?: boolean\n organization?: string\n outputPath?: string\n overwriteFiles?: boolean\n packageManager?: 'npm' | 'pnpm' | 'yarn'\n project?: string\n projectName?: string\n projectPlan?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n templateToken?: string\n typescript?: boolean\n visibility?: 'private' | 'public'\n}\n\nexport interface InitContext {\n output: Output\n telemetry: CLITelemetryStore\n workDir: string\n}\n\ninterface InitCommandFlags {\n 'auto-updates': boolean\n bare: boolean\n 'dataset-default': boolean\n 'from-create': boolean\n mcp: boolean\n 'no-git': boolean\n skills: boolean\n\n coupon?: string\n 'create-project'?: string\n dataset?: string\n env?: string\n git?: string\n 'import-dataset'?: boolean\n 'nextjs-add-config-files'?: boolean\n 'nextjs-append-env'?: boolean\n 'nextjs-embed-studio'?: boolean\n organization?: string\n 'output-path'?: string\n 'overwrite-files'?: boolean\n 'package-manager'?: string\n project?: string\n 'project-name'?: string\n 'project-plan'?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n 'template-token'?: string\n typescript?: boolean\n visibility?: string\n}\n\ninterface InitCommandArgs {\n type?: string\n}\n\nconst VALID_PACKAGE_MANAGERS = new Set<string>(['npm', 'pnpm', 'yarn'])\nfunction narrowPackageManager(value: string | undefined): InitOptions['packageManager'] {\n return value !== undefined && VALID_PACKAGE_MANAGERS.has(value)\n ? (value as InitOptions['packageManager'])\n : undefined\n}\n\nconst VALID_VISIBILITIES = new Set<string>(['private', 'public'])\nfunction narrowVisibility(value: string | undefined): InitOptions['visibility'] {\n return value !== undefined && VALID_VISIBILITIES.has(value)\n ? (value as InitOptions['visibility'])\n : undefined\n}\n\nexport function flagsToInitOptions(\n flags: InitCommandFlags,\n isUnattended: boolean,\n args: InitCommandArgs | undefined,\n mcpMode: InitOptions['mcpMode'],\n skillsMode: InitOptions['skillsMode'],\n): InitOptions {\n return {\n argType: args?.type,\n autoUpdates: flags['auto-updates'],\n bare: flags.bare,\n coupon: flags.coupon,\n dataset: flags.dataset,\n datasetDefault: flags['dataset-default'],\n env: flags.env,\n fromCreate: flags['from-create'],\n git: flags['no-git'] ? false : flags.git,\n importDataset: flags['import-dataset'],\n mcpMode,\n nextjsAddConfigFiles: flags['nextjs-add-config-files'],\n nextjsAppendEnv: flags['nextjs-append-env'],\n nextjsEmbedStudio: flags['nextjs-embed-studio'],\n organization: flags.organization,\n outputPath: flags['output-path'],\n overwriteFiles: flags['overwrite-files'],\n packageManager: narrowPackageManager(flags['package-manager']),\n project: flags.project,\n projectName: flags['project-name'] ?? flags['create-project'],\n projectPlan: flags['project-plan'],\n provider: flags.provider,\n reconfigure: flags.reconfigure,\n skillsMode,\n template: flags.template,\n templateToken: flags['template-token'],\n typescript: flags.typescript,\n unattended: isUnattended,\n visibility: narrowVisibility(flags.visibility),\n }\n}\n"],"names":["VALID_PACKAGE_MANAGERS","Set","narrowPackageManager","value","undefined","has","VALID_VISIBILITIES","narrowVisibility","flagsToInitOptions","flags","isUnattended","args","mcpMode","skillsMode","argType","type","autoUpdates","bare","coupon","dataset","datasetDefault","env","fromCreate","git","importDataset","nextjsAddConfigFiles","nextjsAppendEnv","nextjsEmbedStudio","organization","outputPath","overwriteFiles","packageManager","project","projectName","projectPlan","provider","reconfigure","template","templateToken","typescript","unattended","visibility"],"mappings":"AAiGA,MAAMA,yBAAyB,IAAIC,IAAY;IAAC;IAAO;IAAQ;CAAO;AACtE,SAASC,qBAAqBC,KAAyB;IACrD,OAAOA,UAAUC,aAAaJ,uBAAuBK,GAAG,CAACF,SACpDA,QACDC;AACN;AAEA,MAAME,qBAAqB,IAAIL,IAAY;IAAC;IAAW;CAAS;AAChE,SAASM,iBAAiBJ,KAAyB;IACjD,OAAOA,UAAUC,aAAaE,mBAAmBD,GAAG,CAACF,SAChDA,QACDC;AACN;AAEA,OAAO,SAASI,mBACdC,KAAuB,EACvBC,YAAqB,EACrBC,IAAiC,EACjCC,OAA+B,EAC/BC,UAAqC;IAErC,OAAO;QACLC,SAASH,MAAMI;QACfC,aAAaP,KAAK,CAAC,eAAe;QAClCQ,MAAMR,MAAMQ,IAAI;QAChBC,QAAQT,MAAMS,MAAM;QACpBC,SAASV,MAAMU,OAAO;QACtBC,gBAAgBX,KAAK,CAAC,kBAAkB;QACxCY,KAAKZ,MAAMY,GAAG;QACdC,YAAYb,KAAK,CAAC,cAAc;QAChCc,KAAKd,KAAK,CAAC,SAAS,GAAG,QAAQA,MAAMc,GAAG;QACxCC,eAAef,KAAK,CAAC,iBAAiB;QACtCG;QACAa,sBAAsBhB,KAAK,CAAC,0BAA0B;QACtDiB,iBAAiBjB,KAAK,CAAC,oBAAoB;QAC3CkB,mBAAmBlB,KAAK,CAAC,sBAAsB;QAC/CmB,cAAcnB,MAAMmB,YAAY;QAChCC,YAAYpB,KAAK,CAAC,cAAc;QAChCqB,gBAAgBrB,KAAK,CAAC,kBAAkB;QACxCsB,gBAAgB7B,qBAAqBO,KAAK,CAAC,kBAAkB;QAC7DuB,SAASvB,MAAMuB,OAAO;QACtBC,aAAaxB,KAAK,CAAC,eAAe,IAAIA,KAAK,CAAC,iBAAiB;QAC7DyB,aAAazB,KAAK,CAAC,eAAe;QAClC0B,UAAU1B,MAAM0B,QAAQ;QACxBC,aAAa3B,MAAM2B,WAAW;QAC9BvB;QACAwB,UAAU5B,MAAM4B,QAAQ;QACxBC,eAAe7B,KAAK,CAAC,iBAAiB;QACtC8B,YAAY9B,MAAM8B,UAAU;QAC5BC,YAAY9B;QACZ+B,YAAYlC,iBAAiBE,MAAMgC,UAAU;IAC/C;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/init/types.ts"],"sourcesContent":["import {type CLITelemetryStore, type Output} from '@sanity/cli-core'\nimport {type Framework} from '@vercel/frameworks'\n\nimport {type GenerateConfigOptions} from './createStudioConfig.js'\n\nexport type VersionedFramework = Framework & {\n detectedVersion?: string\n}\n\nexport interface ProjectTemplate {\n configTemplate?: ((variables: GenerateConfigOptions['variables']) => string) | string\n datasetUrl?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n entry?: string\n importPrompt?: string\n scripts?: Record<string, string>\n type?: 'commonjs' | 'module'\n typescriptOnly?: boolean\n}\n\nexport interface InitOptions {\n autoUpdates: boolean\n bare: boolean\n datasetDefault: boolean\n fromCreate: boolean\n mcpMode: 'auto' | 'prompt' | 'skip'\n skillsMode: 'auto' | 'prompt' | 'skip'\n unattended: boolean\n\n argType?: string\n coupon?: string\n dataset?: string\n env?: string\n git?: boolean | string\n importDataset?: boolean\n nextjsAddConfigFiles?: boolean\n nextjsAppendEnv?: boolean\n nextjsEmbedStudio?: boolean\n organization?: string\n outputPath?: string\n overwriteFiles?: boolean\n packageManager?: 'npm' | 'pnpm' | 'yarn'\n project?: string\n projectName?: string\n projectPlan?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n templateToken?: string\n typescript?: boolean\n unstableWorkbench?: boolean\n visibility?: 'private' | 'public'\n}\n\nexport interface InitContext {\n output: Output\n telemetry: CLITelemetryStore\n workDir: string\n}\n\ninterface InitCommandFlags {\n 'auto-updates': boolean\n bare: boolean\n 'dataset-default': boolean\n 'from-create': boolean\n mcp: boolean\n 'no-git': boolean\n skills: boolean\n\n coupon?: string\n 'create-project'?: string\n dataset?: string\n env?: string\n git?: string\n 'import-dataset'?: boolean\n 'nextjs-add-config-files'?: boolean\n 'nextjs-append-env'?: boolean\n 'nextjs-embed-studio'?: boolean\n organization?: string\n 'output-path'?: string\n 'overwrite-files'?: boolean\n 'package-manager'?: string\n project?: string\n 'project-name'?: string\n 'project-plan'?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n 'template-token'?: string\n typescript?: boolean\n 'unstable--workbench'?: boolean\n visibility?: string\n}\n\ninterface InitCommandArgs {\n type?: string\n}\n\nconst VALID_PACKAGE_MANAGERS = new Set<string>(['npm', 'pnpm', 'yarn'])\nfunction narrowPackageManager(value: string | undefined): InitOptions['packageManager'] {\n return value !== undefined && VALID_PACKAGE_MANAGERS.has(value)\n ? (value as InitOptions['packageManager'])\n : undefined\n}\n\nconst VALID_VISIBILITIES = new Set<string>(['private', 'public'])\nfunction narrowVisibility(value: string | undefined): InitOptions['visibility'] {\n return value !== undefined && VALID_VISIBILITIES.has(value)\n ? (value as InitOptions['visibility'])\n : undefined\n}\n\nexport function flagsToInitOptions(\n flags: InitCommandFlags,\n isUnattended: boolean,\n args: InitCommandArgs | undefined,\n mcpMode: InitOptions['mcpMode'],\n skillsMode: InitOptions['skillsMode'],\n): InitOptions {\n return {\n argType: args?.type,\n autoUpdates: flags['auto-updates'],\n bare: flags.bare,\n coupon: flags.coupon,\n dataset: flags.dataset,\n datasetDefault: flags['dataset-default'],\n env: flags.env,\n fromCreate: flags['from-create'],\n git: flags['no-git'] ? false : flags.git,\n importDataset: flags['import-dataset'],\n mcpMode,\n nextjsAddConfigFiles: flags['nextjs-add-config-files'],\n nextjsAppendEnv: flags['nextjs-append-env'],\n nextjsEmbedStudio: flags['nextjs-embed-studio'],\n organization: flags.organization,\n outputPath: flags['output-path'],\n overwriteFiles: flags['overwrite-files'],\n packageManager: narrowPackageManager(flags['package-manager']),\n project: flags.project,\n projectName: flags['project-name'] ?? flags['create-project'],\n projectPlan: flags['project-plan'],\n provider: flags.provider,\n reconfigure: flags.reconfigure,\n skillsMode,\n template: flags.template,\n templateToken: flags['template-token'],\n typescript: flags.typescript,\n unattended: isUnattended,\n unstableWorkbench: flags['unstable--workbench'],\n visibility: narrowVisibility(flags.visibility),\n }\n}\n"],"names":["VALID_PACKAGE_MANAGERS","Set","narrowPackageManager","value","undefined","has","VALID_VISIBILITIES","narrowVisibility","flagsToInitOptions","flags","isUnattended","args","mcpMode","skillsMode","argType","type","autoUpdates","bare","coupon","dataset","datasetDefault","env","fromCreate","git","importDataset","nextjsAddConfigFiles","nextjsAppendEnv","nextjsEmbedStudio","organization","outputPath","overwriteFiles","packageManager","project","projectName","projectPlan","provider","reconfigure","template","templateToken","typescript","unattended","unstableWorkbench","visibility"],"mappings":"AAmGA,MAAMA,yBAAyB,IAAIC,IAAY;IAAC;IAAO;IAAQ;CAAO;AACtE,SAASC,qBAAqBC,KAAyB;IACrD,OAAOA,UAAUC,aAAaJ,uBAAuBK,GAAG,CAACF,SACpDA,QACDC;AACN;AAEA,MAAME,qBAAqB,IAAIL,IAAY;IAAC;IAAW;CAAS;AAChE,SAASM,iBAAiBJ,KAAyB;IACjD,OAAOA,UAAUC,aAAaE,mBAAmBD,GAAG,CAACF,SAChDA,QACDC;AACN;AAEA,OAAO,SAASI,mBACdC,KAAuB,EACvBC,YAAqB,EACrBC,IAAiC,EACjCC,OAA+B,EAC/BC,UAAqC;IAErC,OAAO;QACLC,SAASH,MAAMI;QACfC,aAAaP,KAAK,CAAC,eAAe;QAClCQ,MAAMR,MAAMQ,IAAI;QAChBC,QAAQT,MAAMS,MAAM;QACpBC,SAASV,MAAMU,OAAO;QACtBC,gBAAgBX,KAAK,CAAC,kBAAkB;QACxCY,KAAKZ,MAAMY,GAAG;QACdC,YAAYb,KAAK,CAAC,cAAc;QAChCc,KAAKd,KAAK,CAAC,SAAS,GAAG,QAAQA,MAAMc,GAAG;QACxCC,eAAef,KAAK,CAAC,iBAAiB;QACtCG;QACAa,sBAAsBhB,KAAK,CAAC,0BAA0B;QACtDiB,iBAAiBjB,KAAK,CAAC,oBAAoB;QAC3CkB,mBAAmBlB,KAAK,CAAC,sBAAsB;QAC/CmB,cAAcnB,MAAMmB,YAAY;QAChCC,YAAYpB,KAAK,CAAC,cAAc;QAChCqB,gBAAgBrB,KAAK,CAAC,kBAAkB;QACxCsB,gBAAgB7B,qBAAqBO,KAAK,CAAC,kBAAkB;QAC7DuB,SAASvB,MAAMuB,OAAO;QACtBC,aAAaxB,KAAK,CAAC,eAAe,IAAIA,KAAK,CAAC,iBAAiB;QAC7DyB,aAAazB,KAAK,CAAC,eAAe;QAClC0B,UAAU1B,MAAM0B,QAAQ;QACxBC,aAAa3B,MAAM2B,WAAW;QAC9BvB;QACAwB,UAAU5B,MAAM4B,QAAQ;QACxBC,eAAe7B,KAAK,CAAC,iBAAiB;QACtC8B,YAAY9B,MAAM8B,UAAU;QAC5BC,YAAY9B;QACZ+B,mBAAmBhC,KAAK,CAAC,sBAAsB;QAC/CiC,YAAYnC,iBAAiBE,MAAMiC,UAAU;IAC/C;AACF"}
@@ -1,13 +1,27 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { relative, resolve } from 'node:path';
3
- import { getCliConfig } from '@sanity/cli-core';
3
+ import { doImport, getCliConfigUncached } from '@sanity/cli-core';
4
4
  import { spinner } from '@sanity/cli-core/ux';
5
5
  import { getErrorMessage } from '../../util/getErrorMessage.js';
6
6
  import { coreAppManifestSchema } from './types.js';
7
+ const sanitizeIconPath = new URL('sanitizeIcon.js', import.meta.url).href;
8
+ /**
9
+ * Lazy-load {@link sanitizeIconFn} so `isomorphic-dompurify` (and its jsdom
10
+ * dependency) stays out of the CLI's eager import graph. The studio manifest
11
+ * resolver lazy-loads its icon machinery for the same reason; this path runs in
12
+ * the main process (not the manifest worker), so only an app deploy that
13
+ * actually has an icon pays the cost.
14
+ */ async function lazySanitizeIcon() {
15
+ const mod = await doImport(sanitizeIconPath);
16
+ return mod.sanitizeIcon;
17
+ }
7
18
  /**
8
19
  * Resolves app.icon from config (a file path) to an SVG string for the manifest.
9
20
  * The manifest expects the SVG string inline, not a path.
10
- * Brett sanitizes SVGs so it's skipped here.
21
+ *
22
+ * The file is sanitized through the same allowlist as the studio manifest's
23
+ * icon resolver (see {@link lazySanitizeIcon}) so both manifest paths inline the
24
+ * same trusted subset of SVG markup.
11
25
  */ async function readIconFromPath(workDir, iconPath) {
12
26
  const resolvedPath = resolve(workDir, iconPath);
13
27
  const pathRelativeToWorkDir = relative(workDir, resolvedPath);
@@ -27,16 +41,15 @@ import { coreAppManifestSchema } from './types.js';
27
41
  if (!/<svg[\s>]/i.test(trimmed)) {
28
42
  throw new Error(`Icon file at "${iconPath}" does not contain an SVG element. App manifest icons must be SVG files.`);
29
43
  }
30
- return trimmed;
44
+ const sanitizeIcon = await lazySanitizeIcon();
45
+ return sanitizeIcon(trimmed);
31
46
  }
32
47
  /**
33
- *
34
- * This functions slightly differently from the studio manifest extraction function.
35
- * We don't need to parse very complicated information like schemas and tools.
36
- * The app icon in config is a file path (e.g. relative to project root); its content is read and inlined in the manifest.
37
- */ export async function extractAppManifest(options) {
48
+ * Unlike studio manifest extraction, skips schema/tool parsing. The config's
49
+ * `app.icon` is a file path; its content is read and inlined in the manifest.
50
+ */ export async function extractCoreAppManifest(options) {
38
51
  const { workDir } = options;
39
- const { app } = await getCliConfig(workDir);
52
+ const { app } = await getCliConfigUncached(workDir);
40
53
  if (!app) {
41
54
  return undefined;
42
55
  }
@@ -57,7 +70,13 @@ import { coreAppManifestSchema } from './types.js';
57
70
  } : {},
58
71
  ...app.title ? {
59
72
  title: app.title
60
- } : {}
73
+ } : {},
74
+ ...app.group ? {
75
+ group: app.group
76
+ } : {},
77
+ ...app.priority === undefined ? {} : {
78
+ priority: app.priority
79
+ }
61
80
  });
62
81
  spin.succeed(`Extracted manifest`);
63
82
  return manifest;
@@ -68,4 +87,4 @@ import { coreAppManifestSchema } from './types.js';
68
87
  }
69
88
  }
70
89
 
71
- //# sourceMappingURL=extractAppManifest.js.map
90
+ //# sourceMappingURL=extractCoreAppManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/manifest/extractCoreAppManifest.ts"],"sourcesContent":["import {readFile} from 'node:fs/promises'\nimport {relative, resolve} from 'node:path'\n\nimport {doImport, getCliConfigUncached} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {getErrorMessage} from '../../util/getErrorMessage.js'\nimport {type sanitizeIcon as sanitizeIconFn} from './sanitizeIcon.js'\nimport {type CoreAppManifest, coreAppManifestSchema} from './types.js'\n\ninterface ExtractCoreAppManifestOptions {\n workDir: string\n}\n\nconst sanitizeIconPath = new URL('sanitizeIcon.js', import.meta.url).href\n\n/**\n * Lazy-load {@link sanitizeIconFn} so `isomorphic-dompurify` (and its jsdom\n * dependency) stays out of the CLI's eager import graph. The studio manifest\n * resolver lazy-loads its icon machinery for the same reason; this path runs in\n * the main process (not the manifest worker), so only an app deploy that\n * actually has an icon pays the cost.\n */\nasync function lazySanitizeIcon(): Promise<typeof sanitizeIconFn> {\n const mod = await doImport(sanitizeIconPath)\n return mod.sanitizeIcon\n}\n\n/**\n * Resolves app.icon from config (a file path) to an SVG string for the manifest.\n * The manifest expects the SVG string inline, not a path.\n *\n * The file is sanitized through the same allowlist as the studio manifest's\n * icon resolver (see {@link lazySanitizeIcon}) so both manifest paths inline the\n * same trusted subset of SVG markup.\n */\nasync function readIconFromPath(workDir: string, iconPath: string): Promise<string> {\n const resolvedPath = resolve(workDir, iconPath)\n const pathRelativeToWorkDir = relative(workDir, resolvedPath)\n if (pathRelativeToWorkDir.startsWith('..')) {\n throw new Error(\n `Icon path \"${iconPath}\" resolves outside the project directory and is not allowed.`,\n )\n }\n\n let content: string\n try {\n content = await readFile(resolvedPath, 'utf8')\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new Error(\n `Could not read icon file at \"${iconPath}\" (resolved: ${resolvedPath}): ${message}`,\n {cause: err},\n )\n }\n\n const trimmed = content.trim()\n if (!/<svg[\\s>]/i.test(trimmed)) {\n throw new Error(\n `Icon file at \"${iconPath}\" does not contain an SVG element. App manifest icons must be SVG files.`,\n )\n }\n\n const sanitizeIcon = await lazySanitizeIcon()\n return sanitizeIcon(trimmed)\n}\n\n/**\n * Unlike studio manifest extraction, skips schema/tool parsing. The config's\n * `app.icon` is a file path; its content is read and inlined in the manifest.\n */\nexport async function extractCoreAppManifest(\n options: ExtractCoreAppManifestOptions,\n): Promise<CoreAppManifest | undefined> {\n const {workDir} = options\n const {app} = await getCliConfigUncached(workDir)\n if (!app) {\n return undefined\n }\n\n const spin = spinner('Extracting manifest').start()\n\n try {\n let icon: string | undefined\n if (app.icon) {\n icon = await readIconFromPath(workDir, app.icon)\n }\n\n if (!icon && !app.title) {\n spin.succeed('Manifest creation skipped: no icon or title found in app configuration')\n return undefined\n }\n\n const manifest: CoreAppManifest = coreAppManifestSchema.parse({\n version: '1',\n ...(icon ? {icon} : {}),\n ...(app.title ? {title: app.title} : {}),\n ...(app.group ? {group: app.group} : {}),\n ...(app.priority === undefined ? {} : {priority: app.priority}),\n })\n\n spin.succeed(`Extracted manifest`)\n\n return manifest\n } catch (err) {\n const message = getErrorMessage(err)\n spin.fail(message)\n throw err\n }\n}\n"],"names":["readFile","relative","resolve","doImport","getCliConfigUncached","spinner","getErrorMessage","coreAppManifestSchema","sanitizeIconPath","URL","url","href","lazySanitizeIcon","mod","sanitizeIcon","readIconFromPath","workDir","iconPath","resolvedPath","pathRelativeToWorkDir","startsWith","Error","content","err","message","String","cause","trimmed","trim","test","extractCoreAppManifest","options","app","undefined","spin","start","icon","title","succeed","manifest","parse","version","group","priority","fail"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AACzC,SAAQC,QAAQ,EAAEC,OAAO,QAAO,YAAW;AAE3C,SAAQC,QAAQ,EAAEC,oBAAoB,QAAO,mBAAkB;AAC/D,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,eAAe,QAAO,gCAA+B;AAE7D,SAA8BC,qBAAqB,QAAO,aAAY;AAMtE,MAAMC,mBAAmB,IAAIC,IAAI,mBAAmB,YAAYC,GAAG,EAAEC,IAAI;AAEzE;;;;;;CAMC,GACD,eAAeC;IACb,MAAMC,MAAM,MAAMV,SAASK;IAC3B,OAAOK,IAAIC,YAAY;AACzB;AAEA;;;;;;;CAOC,GACD,eAAeC,iBAAiBC,OAAe,EAAEC,QAAgB;IAC/D,MAAMC,eAAehB,QAAQc,SAASC;IACtC,MAAME,wBAAwBlB,SAASe,SAASE;IAChD,IAAIC,sBAAsBC,UAAU,CAAC,OAAO;QAC1C,MAAM,IAAIC,MACR,CAAC,WAAW,EAAEJ,SAAS,4DAA4D,CAAC;IAExF;IAEA,IAAIK;IACJ,IAAI;QACFA,UAAU,MAAMtB,SAASkB,cAAc;IACzC,EAAE,OAAOK,KAAK;QACZ,MAAMC,UAAUD,eAAeF,QAAQE,IAAIC,OAAO,GAAGC,OAAOF;QAC5D,MAAM,IAAIF,MACR,CAAC,6BAA6B,EAAEJ,SAAS,aAAa,EAAEC,aAAa,GAAG,EAAEM,SAAS,EACnF;YAACE,OAAOH;QAAG;IAEf;IAEA,MAAMI,UAAUL,QAAQM,IAAI;IAC5B,IAAI,CAAC,aAAaC,IAAI,CAACF,UAAU;QAC/B,MAAM,IAAIN,MACR,CAAC,cAAc,EAAEJ,SAAS,wEAAwE,CAAC;IAEvG;IAEA,MAAMH,eAAe,MAAMF;IAC3B,OAAOE,aAAaa;AACtB;AAEA;;;CAGC,GACD,OAAO,eAAeG,uBACpBC,OAAsC;IAEtC,MAAM,EAACf,OAAO,EAAC,GAAGe;IAClB,MAAM,EAACC,GAAG,EAAC,GAAG,MAAM5B,qBAAqBY;IACzC,IAAI,CAACgB,KAAK;QACR,OAAOC;IACT;IAEA,MAAMC,OAAO7B,QAAQ,uBAAuB8B,KAAK;IAEjD,IAAI;QACF,IAAIC;QACJ,IAAIJ,IAAII,IAAI,EAAE;YACZA,OAAO,MAAMrB,iBAAiBC,SAASgB,IAAII,IAAI;QACjD;QAEA,IAAI,CAACA,QAAQ,CAACJ,IAAIK,KAAK,EAAE;YACvBH,KAAKI,OAAO,CAAC;YACb,OAAOL;QACT;QAEA,MAAMM,WAA4BhC,sBAAsBiC,KAAK,CAAC;YAC5DC,SAAS;YACT,GAAIL,OAAO;gBAACA;YAAI,IAAI,CAAC,CAAC;YACtB,GAAIJ,IAAIK,KAAK,GAAG;gBAACA,OAAOL,IAAIK,KAAK;YAAA,IAAI,CAAC,CAAC;YACvC,GAAIL,IAAIU,KAAK,GAAG;gBAACA,OAAOV,IAAIU,KAAK;YAAA,IAAI,CAAC,CAAC;YACvC,GAAIV,IAAIW,QAAQ,KAAKV,YAAY,CAAC,IAAI;gBAACU,UAAUX,IAAIW,QAAQ;YAAA,CAAC;QAChE;QAEAT,KAAKI,OAAO,CAAC,CAAC,kBAAkB,CAAC;QAEjC,OAAOC;IACT,EAAE,OAAOhB,KAAK;QACZ,MAAMC,UAAUlB,gBAAgBiB;QAChCW,KAAKU,IAAI,CAACpB;QACV,MAAMD;IACR;AACF"}
@@ -1,14 +1,14 @@
1
1
  import { SchemaExtractionError } from '@sanity/cli-build/_internal/extract';
2
- import { findProjectRoot, getTimer, studioWorkerTask } from '@sanity/cli-core';
2
+ import { getTimer, studioWorkerTask } from '@sanity/cli-core';
3
3
  import { spinner } from '@sanity/cli-core/ux';
4
4
  import { manifestDebug } from './debug.js';
5
5
  import { writeManifestFile } from './writeManifestFile.js';
6
6
  const CREATE_TIMER = 'create-manifest';
7
- export async function extractManifest(outPath) {
8
- const projectRoot = await findProjectRoot(process.cwd());
9
- manifestDebug('Project root %o', projectRoot);
10
- const workDir = projectRoot.directory;
11
- const configPath = projectRoot.path;
7
+ export async function extractManifest({ outPath, path, workDir }) {
8
+ manifestDebug('Project root %o', {
9
+ directory: workDir,
10
+ path
11
+ });
12
12
  const timer = getTimer();
13
13
  timer.start(CREATE_TIMER);
14
14
  const spin = spinner('Extracting manifest').start();
@@ -17,7 +17,7 @@ export async function extractManifest(outPath) {
17
17
  name: 'extractManifest',
18
18
  studioRootPath: workDir,
19
19
  workerData: {
20
- configPath,
20
+ configPath: path,
21
21
  workDir
22
22
  }
23
23
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/manifest/extractManifest.ts"],"sourcesContent":["import {\n type ExtractSchemaWorkerError,\n SchemaExtractionError,\n} from '@sanity/cli-build/_internal/extract'\nimport {findProjectRoot, getTimer, studioWorkerTask} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {manifestDebug} from './debug.js'\nimport {type CreateWorkspaceManifest, type ExtractManifestWorkerData} from './types'\nimport {writeManifestFile} from './writeManifestFile.js'\n\nconst CREATE_TIMER = 'create-manifest'\n\ninterface ExtractManifestWorkerResult {\n type: 'success'\n workspaceManifests: CreateWorkspaceManifest[]\n}\n\ntype ExtractManifestWorkerMessage = ExtractManifestWorkerResult | ExtractSchemaWorkerError\n\nexport async function extractManifest(outPath: string): Promise<void> {\n const projectRoot = await findProjectRoot(process.cwd())\n\n manifestDebug('Project root %o', projectRoot)\n\n const workDir = projectRoot.directory\n const configPath = projectRoot.path\n\n const timer = getTimer()\n timer.start(CREATE_TIMER)\n const spin = spinner('Extracting manifest').start()\n\n try {\n const result = await studioWorkerTask<ExtractManifestWorkerMessage>(\n new URL('extractManifest.worker.js', import.meta.url),\n {\n name: 'extractManifest',\n studioRootPath: workDir,\n workerData: {configPath, workDir} satisfies ExtractManifestWorkerData,\n },\n )\n\n manifestDebug('Result %o', result)\n\n if (result.type === 'error') {\n throw new SchemaExtractionError(result.error, result.validation)\n }\n\n await writeManifestFile({\n outPath,\n workDir,\n workspaceManifests: result.workspaceManifests,\n })\n\n const manifestDuration = timer.end(CREATE_TIMER)\n\n spin.succeed(`Extracted manifest (${manifestDuration.toFixed(0)}ms)`)\n } catch (err) {\n manifestDebug('Error extracting manifest', err)\n spin.fail()\n\n throw err\n }\n}\n"],"names":["SchemaExtractionError","findProjectRoot","getTimer","studioWorkerTask","spinner","manifestDebug","writeManifestFile","CREATE_TIMER","extractManifest","outPath","projectRoot","process","cwd","workDir","directory","configPath","path","timer","start","spin","result","URL","url","name","studioRootPath","workerData","type","error","validation","workspaceManifests","manifestDuration","end","succeed","toFixed","err","fail"],"mappings":"AAAA,SAEEA,qBAAqB,QAChB,sCAAqC;AAC5C,SAAQC,eAAe,EAAEC,QAAQ,EAAEC,gBAAgB,QAAO,mBAAkB;AAC5E,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,aAAa,QAAO,aAAY;AAExC,SAAQC,iBAAiB,QAAO,yBAAwB;AAExD,MAAMC,eAAe;AASrB,OAAO,eAAeC,gBAAgBC,OAAe;IACnD,MAAMC,cAAc,MAAMT,gBAAgBU,QAAQC,GAAG;IAErDP,cAAc,mBAAmBK;IAEjC,MAAMG,UAAUH,YAAYI,SAAS;IACrC,MAAMC,aAAaL,YAAYM,IAAI;IAEnC,MAAMC,QAAQf;IACde,MAAMC,KAAK,CAACX;IACZ,MAAMY,OAAOf,QAAQ,uBAAuBc,KAAK;IAEjD,IAAI;QACF,MAAME,SAAS,MAAMjB,iBACnB,IAAIkB,IAAI,6BAA6B,YAAYC,GAAG,GACpD;YACEC,MAAM;YACNC,gBAAgBX;YAChBY,YAAY;gBAACV;gBAAYF;YAAO;QAClC;QAGFR,cAAc,aAAae;QAE3B,IAAIA,OAAOM,IAAI,KAAK,SAAS;YAC3B,MAAM,IAAI1B,sBAAsBoB,OAAOO,KAAK,EAAEP,OAAOQ,UAAU;QACjE;QAEA,MAAMtB,kBAAkB;YACtBG;YACAI;YACAgB,oBAAoBT,OAAOS,kBAAkB;QAC/C;QAEA,MAAMC,mBAAmBb,MAAMc,GAAG,CAACxB;QAEnCY,KAAKa,OAAO,CAAC,CAAC,oBAAoB,EAAEF,iBAAiBG,OAAO,CAAC,GAAG,GAAG,CAAC;IACtE,EAAE,OAAOC,KAAK;QACZ7B,cAAc,6BAA6B6B;QAC3Cf,KAAKgB,IAAI;QAET,MAAMD;IACR;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/manifest/extractManifest.ts"],"sourcesContent":["import {\n type ExtractSchemaWorkerError,\n SchemaExtractionError,\n} from '@sanity/cli-build/_internal/extract'\nimport {getTimer, studioWorkerTask} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {manifestDebug} from './debug.js'\nimport {type CreateWorkspaceManifest, type ExtractManifestWorkerData} from './types'\nimport {writeManifestFile, type WriteManifestFileOptions} from './writeManifestFile.js'\n\nconst CREATE_TIMER = 'create-manifest'\n\ninterface ExtractManifestWorkerResult {\n type: 'success'\n workspaceManifests: CreateWorkspaceManifest[]\n}\n\ntype ExtractManifestWorkerMessage = ExtractManifestWorkerResult | ExtractSchemaWorkerError\n\ninterface ExtractManifestOptions extends Pick<WriteManifestFileOptions, 'outPath' | 'workDir'> {\n /** Absolute path to the studio's `sanity.config.(ts|js)` entry file. */\n path: string\n}\n\nexport async function extractManifest({\n outPath,\n path,\n workDir,\n}: ExtractManifestOptions): Promise<void> {\n manifestDebug('Project root %o', {directory: workDir, path})\n\n const timer = getTimer()\n timer.start(CREATE_TIMER)\n const spin = spinner('Extracting manifest').start()\n\n try {\n const result = await studioWorkerTask<ExtractManifestWorkerMessage>(\n new URL('extractManifest.worker.js', import.meta.url),\n {\n name: 'extractManifest',\n studioRootPath: workDir,\n workerData: {configPath: path, workDir} satisfies ExtractManifestWorkerData,\n },\n )\n\n manifestDebug('Result %o', result)\n\n if (result.type === 'error') {\n throw new SchemaExtractionError(result.error, result.validation)\n }\n\n await writeManifestFile({\n outPath,\n workDir,\n workspaceManifests: result.workspaceManifests,\n })\n\n const manifestDuration = timer.end(CREATE_TIMER)\n\n spin.succeed(`Extracted manifest (${manifestDuration.toFixed(0)}ms)`)\n } catch (err) {\n manifestDebug('Error extracting manifest', err)\n spin.fail()\n\n throw err\n }\n}\n"],"names":["SchemaExtractionError","getTimer","studioWorkerTask","spinner","manifestDebug","writeManifestFile","CREATE_TIMER","extractManifest","outPath","path","workDir","directory","timer","start","spin","result","URL","url","name","studioRootPath","workerData","configPath","type","error","validation","workspaceManifests","manifestDuration","end","succeed","toFixed","err","fail"],"mappings":"AAAA,SAEEA,qBAAqB,QAChB,sCAAqC;AAC5C,SAAQC,QAAQ,EAAEC,gBAAgB,QAAO,mBAAkB;AAC3D,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,aAAa,QAAO,aAAY;AAExC,SAAQC,iBAAiB,QAAsC,yBAAwB;AAEvF,MAAMC,eAAe;AAcrB,OAAO,eAAeC,gBAAgB,EACpCC,OAAO,EACPC,IAAI,EACJC,OAAO,EACgB;IACvBN,cAAc,mBAAmB;QAACO,WAAWD;QAASD;IAAI;IAE1D,MAAMG,QAAQX;IACdW,MAAMC,KAAK,CAACP;IACZ,MAAMQ,OAAOX,QAAQ,uBAAuBU,KAAK;IAEjD,IAAI;QACF,MAAME,SAAS,MAAMb,iBACnB,IAAIc,IAAI,6BAA6B,YAAYC,GAAG,GACpD;YACEC,MAAM;YACNC,gBAAgBT;YAChBU,YAAY;gBAACC,YAAYZ;gBAAMC;YAAO;QACxC;QAGFN,cAAc,aAAaW;QAE3B,IAAIA,OAAOO,IAAI,KAAK,SAAS;YAC3B,MAAM,IAAItB,sBAAsBe,OAAOQ,KAAK,EAAER,OAAOS,UAAU;QACjE;QAEA,MAAMnB,kBAAkB;YACtBG;YACAE;YACAe,oBAAoBV,OAAOU,kBAAkB;QAC/C;QAEA,MAAMC,mBAAmBd,MAAMe,GAAG,CAACrB;QAEnCQ,KAAKc,OAAO,CAAC,CAAC,oBAAoB,EAAEF,iBAAiBG,OAAO,CAAC,GAAG,GAAG,CAAC;IACtE,EAAE,OAAOC,KAAK;QACZ1B,cAAc,6BAA6B0B;QAC3ChB,KAAKiB,IAAI;QAET,MAAMD;IACR;AACF"}
@@ -1,8 +1,7 @@
1
1
  import { resolveLocalPackage } from '@sanity/cli-core';
2
- import DOMPurify from 'isomorphic-dompurify';
3
2
  import { manifestDebug } from './debug.js';
4
- import { config } from './purifyConfig.js';
5
3
  import { resolveSchemaIcon } from './resolveSchemaIcon.js';
4
+ import { sanitizeIcon } from './sanitizeIcon.js';
6
5
  /**
7
6
  * Resolves an icon to a sanitized HTML string.
8
7
  * Uses react-dom/server to capture styles during SSR.
@@ -27,7 +26,7 @@ import { resolveSchemaIcon } from './resolveSchemaIcon.js';
27
26
  chunks.push(value);
28
27
  }
29
28
  const html = new TextDecoder().decode(Buffer.concat(chunks));
30
- return DOMPurify.sanitize(html.trim(), config);
29
+ return sanitizeIcon(html);
31
30
  } catch (error) {
32
31
  manifestDebug('Error resolving icon', error);
33
32
  return null;