@sanity/cli 6.3.1 → 6.4.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 (193) hide show
  1. package/README.md +311 -452
  2. package/dist/actions/build/decorateIndexWithStagingScript.js +16 -0
  3. package/dist/actions/build/decorateIndexWithStagingScript.js.map +1 -0
  4. package/dist/actions/build/writeSanityRuntime.js +3 -2
  5. package/dist/actions/build/writeSanityRuntime.js.map +1 -1
  6. package/dist/actions/dataset/create.js +4 -0
  7. package/dist/actions/dataset/create.js.map +1 -1
  8. package/dist/actions/deploy/findUserApplicationForApp.js +1 -0
  9. package/dist/actions/deploy/findUserApplicationForApp.js.map +1 -1
  10. package/dist/actions/deploy/types.js +1 -1
  11. package/dist/actions/deploy/types.js.map +1 -1
  12. package/dist/actions/init/bootstrapLocalTemplate.js +16 -1
  13. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
  14. package/dist/actions/init/initApp.js +72 -0
  15. package/dist/actions/init/initApp.js.map +1 -0
  16. package/dist/actions/init/initHelpers.js +37 -0
  17. package/dist/actions/init/initHelpers.js.map +1 -0
  18. package/dist/actions/init/initNextJs.js +246 -0
  19. package/dist/actions/init/initNextJs.js.map +1 -0
  20. package/dist/actions/init/initStudio.js +127 -0
  21. package/dist/actions/init/initStudio.js.map +1 -0
  22. package/dist/actions/init/scaffoldTemplate.js +114 -0
  23. package/dist/actions/init/scaffoldTemplate.js.map +1 -0
  24. package/dist/actions/init/templates/appQuickstart.js +2 -1
  25. package/dist/actions/init/templates/appQuickstart.js.map +1 -1
  26. package/dist/actions/init/templates/appSanityUi.js +2 -1
  27. package/dist/actions/init/templates/appSanityUi.js.map +1 -1
  28. package/dist/actions/init/templates/nextjs/index.js +1 -2
  29. package/dist/actions/init/templates/nextjs/index.js.map +1 -1
  30. package/dist/actions/init/templates/shopify.js +6 -6
  31. package/dist/actions/init/templates/shopify.js.map +1 -1
  32. package/dist/actions/init/templates/shopifyOnline.js +2 -2
  33. package/dist/actions/init/templates/shopifyOnline.js.map +1 -1
  34. package/dist/actions/manifest/types.js +1 -1
  35. package/dist/actions/manifest/types.js.map +1 -1
  36. package/dist/actions/mcp/detectAvailableEditors.js +16 -3
  37. package/dist/actions/mcp/detectAvailableEditors.js.map +1 -1
  38. package/dist/actions/mcp/editorConfigs.js +192 -132
  39. package/dist/actions/mcp/editorConfigs.js.map +1 -1
  40. package/dist/actions/mcp/setupMCP.js +4 -1
  41. package/dist/actions/mcp/setupMCP.js.map +1 -1
  42. package/dist/actions/mcp/writeMCPConfig.js +2 -2
  43. package/dist/actions/mcp/writeMCPConfig.js.map +1 -1
  44. package/dist/actions/schema/extractSchema.js +5 -7
  45. package/dist/actions/schema/extractSchema.js.map +1 -1
  46. package/dist/actions/schema/types.js +3 -3
  47. package/dist/actions/schema/types.js.map +1 -1
  48. package/dist/actions/users/validateEmail.js +2 -2
  49. package/dist/actions/users/validateEmail.js.map +1 -1
  50. package/dist/commands/backups/disable.js +1 -1
  51. package/dist/commands/backups/disable.js.map +1 -1
  52. package/dist/commands/backups/download.js +1 -1
  53. package/dist/commands/backups/download.js.map +1 -1
  54. package/dist/commands/backups/enable.js +1 -1
  55. package/dist/commands/backups/enable.js.map +1 -1
  56. package/dist/commands/backups/list.js +1 -1
  57. package/dist/commands/backups/list.js.map +1 -1
  58. package/dist/commands/build.js +1 -1
  59. package/dist/commands/build.js.map +1 -1
  60. package/dist/commands/cors/add.js +1 -1
  61. package/dist/commands/cors/add.js.map +1 -1
  62. package/dist/commands/cors/delete.js +1 -1
  63. package/dist/commands/cors/delete.js.map +1 -1
  64. package/dist/commands/cors/list.js +2 -2
  65. package/dist/commands/cors/list.js.map +1 -1
  66. package/dist/commands/datasets/alias/create.js +1 -1
  67. package/dist/commands/datasets/alias/create.js.map +1 -1
  68. package/dist/commands/datasets/alias/delete.js +1 -1
  69. package/dist/commands/datasets/alias/delete.js.map +1 -1
  70. package/dist/commands/datasets/alias/link.js +1 -1
  71. package/dist/commands/datasets/alias/link.js.map +1 -1
  72. package/dist/commands/datasets/alias/unlink.js +1 -1
  73. package/dist/commands/datasets/alias/unlink.js.map +1 -1
  74. package/dist/commands/datasets/copy.js +15 -1
  75. package/dist/commands/datasets/copy.js.map +1 -1
  76. package/dist/commands/datasets/create.js +1 -1
  77. package/dist/commands/datasets/create.js.map +1 -1
  78. package/dist/commands/datasets/delete.js +1 -1
  79. package/dist/commands/datasets/delete.js.map +1 -1
  80. package/dist/commands/datasets/embeddings/enable.js +11 -0
  81. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  82. package/dist/commands/datasets/export.js +2 -2
  83. package/dist/commands/datasets/export.js.map +1 -1
  84. package/dist/commands/datasets/list.js +2 -2
  85. package/dist/commands/datasets/list.js.map +1 -1
  86. package/dist/commands/debug.js +1 -1
  87. package/dist/commands/debug.js.map +1 -1
  88. package/dist/commands/deploy.js +3 -3
  89. package/dist/commands/deploy.js.map +1 -1
  90. package/dist/commands/dev.js +5 -5
  91. package/dist/commands/dev.js.map +1 -1
  92. package/dist/commands/docs/browse.js +1 -1
  93. package/dist/commands/docs/browse.js.map +1 -1
  94. package/dist/commands/documents/delete.js +1 -1
  95. package/dist/commands/documents/delete.js.map +1 -1
  96. package/dist/commands/exec.js +2 -2
  97. package/dist/commands/exec.js.map +1 -1
  98. package/dist/commands/graphql/deploy.js +2 -2
  99. package/dist/commands/graphql/deploy.js.map +1 -1
  100. package/dist/commands/graphql/list.js +2 -2
  101. package/dist/commands/graphql/list.js.map +1 -1
  102. package/dist/commands/hooks/create.js +2 -2
  103. package/dist/commands/hooks/create.js.map +1 -1
  104. package/dist/commands/hooks/delete.js +5 -5
  105. package/dist/commands/hooks/delete.js.map +1 -1
  106. package/dist/commands/hooks/list.js +3 -3
  107. package/dist/commands/hooks/list.js.map +1 -1
  108. package/dist/commands/hooks/logs.js +5 -5
  109. package/dist/commands/hooks/logs.js.map +1 -1
  110. package/dist/commands/init.js +175 -490
  111. package/dist/commands/init.js.map +1 -1
  112. package/dist/commands/install.js +1 -1
  113. package/dist/commands/install.js.map +1 -1
  114. package/dist/commands/learn.js +1 -1
  115. package/dist/commands/learn.js.map +1 -1
  116. package/dist/commands/login.js +1 -1
  117. package/dist/commands/login.js.map +1 -1
  118. package/dist/commands/logout.js +1 -1
  119. package/dist/commands/logout.js.map +1 -1
  120. package/dist/commands/manage.js +1 -1
  121. package/dist/commands/manage.js.map +1 -1
  122. package/dist/commands/manifest/extract.js +2 -2
  123. package/dist/commands/manifest/extract.js.map +1 -1
  124. package/dist/commands/mcp/configure.js +1 -1
  125. package/dist/commands/mcp/configure.js.map +1 -1
  126. package/dist/commands/media/delete-aspect.js +1 -1
  127. package/dist/commands/media/delete-aspect.js.map +1 -1
  128. package/dist/commands/media/export.js +1 -1
  129. package/dist/commands/media/export.js.map +1 -1
  130. package/dist/commands/preview.js +3 -3
  131. package/dist/commands/preview.js.map +1 -1
  132. package/dist/commands/projects/list.js +4 -2
  133. package/dist/commands/projects/list.js.map +1 -1
  134. package/dist/commands/schemas/deploy.js +3 -4
  135. package/dist/commands/schemas/deploy.js.map +1 -1
  136. package/dist/commands/schemas/extract.js +3 -3
  137. package/dist/commands/schemas/extract.js.map +1 -1
  138. package/dist/commands/schemas/list.js +4 -5
  139. package/dist/commands/schemas/list.js.map +1 -1
  140. package/dist/commands/telemetry/disable.js +2 -2
  141. package/dist/commands/telemetry/disable.js.map +1 -1
  142. package/dist/commands/telemetry/enable.js +2 -2
  143. package/dist/commands/telemetry/enable.js.map +1 -1
  144. package/dist/commands/telemetry/status.js +2 -2
  145. package/dist/commands/telemetry/status.js.map +1 -1
  146. package/dist/commands/tokens/add.js +1 -1
  147. package/dist/commands/tokens/add.js.map +1 -1
  148. package/dist/commands/tokens/delete.js +1 -1
  149. package/dist/commands/tokens/delete.js.map +1 -1
  150. package/dist/commands/tokens/list.js +2 -2
  151. package/dist/commands/tokens/list.js.map +1 -1
  152. package/dist/commands/users/list.js +1 -1
  153. package/dist/commands/users/list.js.map +1 -1
  154. package/dist/commands/versions.js +1 -1
  155. package/dist/commands/versions.js.map +1 -1
  156. package/dist/hooks/prerun/injectEnvVariables.js +3 -5
  157. package/dist/hooks/prerun/injectEnvVariables.js.map +1 -1
  158. package/dist/server/vite/plugin-sanity-build-entries.js +3 -2
  159. package/dist/server/vite/plugin-sanity-build-entries.js.map +1 -1
  160. package/dist/services/datasets.js +2 -1
  161. package/dist/services/datasets.js.map +1 -1
  162. package/dist/telemetry/init.telemetry.js.map +1 -1
  163. package/dist/util/packageManager/installationInfo/detectPackages.js +13 -7
  164. package/dist/util/packageManager/installationInfo/detectPackages.js.map +1 -1
  165. package/dist/util/telemetry/createTelemetryStore.js +27 -12
  166. package/dist/util/telemetry/createTelemetryStore.js.map +1 -1
  167. package/dist/util/update/fetchUpdateInfo.js +40 -0
  168. package/dist/util/update/fetchUpdateInfo.js.map +1 -0
  169. package/dist/util/update/fetchUpdateInfo.worker.js +19 -0
  170. package/dist/util/update/fetchUpdateInfo.worker.js.map +1 -0
  171. package/dist/util/update/getRunnerUpdateCommand.js +33 -0
  172. package/dist/util/update/getRunnerUpdateCommand.js.map +1 -0
  173. package/dist/util/update/getUpdateCommand.js +6 -7
  174. package/dist/util/update/getUpdateCommand.js.map +1 -1
  175. package/dist/util/update/packageRunner.js +10 -0
  176. package/dist/util/update/packageRunner.js.map +1 -0
  177. package/dist/util/update/resolveRunnerPackage.js +45 -0
  178. package/dist/util/update/resolveRunnerPackage.js.map +1 -0
  179. package/dist/util/update/resolveUpdateTarget.js +31 -0
  180. package/dist/util/update/resolveUpdateTarget.js.map +1 -0
  181. package/dist/util/update/showNotificationUpdate.js +8 -6
  182. package/dist/util/update/showNotificationUpdate.js.map +1 -1
  183. package/dist/util/update/updateChecker.js +73 -38
  184. package/dist/util/update/updateChecker.js.map +1 -1
  185. package/dist/util/validateProjection.js +121 -0
  186. package/dist/util/validateProjection.js.map +1 -0
  187. package/oclif.manifest.json +698 -681
  188. package/package.json +24 -23
  189. package/templates/app-quickstart/src/App.tsx +2 -2
  190. package/templates/app-sanity-ui/src/App.tsx +2 -2
  191. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +1 -1
  192. package/dist/util/update/fetchLatestVersion.js +0 -21
  193. package/dist/util/update/fetchLatestVersion.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/datasets/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {boxen, input, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport prettyMs from 'pretty-ms'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('dataset:export')\n\nexport class DatasetExportCommand extends SanityCommand<typeof DatasetExportCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the dataset to export',\n }),\n // Args are order dependent\n // eslint-disable-next-line perfectionist/sort-objects\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export dataset to local filesystem as a gzipped tarball. Assets failing with HTTP status codes 401, 403 and 404 upon download are ignored and excluded from export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> moviedb localPath.tar.gz',\n description: 'Export dataset \"moviedb\" to localPath.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> moviedb assetless.tar.gz --no-assets',\n description: 'Export dataset without assets',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --raw',\n description: 'Export raw documents without asset reference rewriting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --types products,shops',\n description: 'Export specific document types',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to export dataset from',\n semantics: 'override',\n }),\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n mode: Flags.string({\n default: 'stream',\n description:\n 'Mode to export documents with `cursor` might be more performant for larger datasets, but might not be as accurate if the dataset is being modified during export',\n options: ['stream', 'cursor'],\n }),\n 'no-assets': Flags.boolean({\n default: false,\n description: 'Export only non-asset documents and remove references to image assets',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n 'no-drafts': Flags.boolean({\n default: false,\n description: 'Export only published versions of documents',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n raw: Flags.boolean({\n default: false,\n description: 'Extract only documents, without rewriting asset references',\n }),\n types: Flags.string({\n description: 'Defines which document types to export (comma-separated)',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:export']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DatasetExportCommand)\n const {destination: targetDestination, name: targetDataset} = args\n\n // Get project configuration\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const projectClient = await getProjectCliClient({\n apiVersion: '2023-05-26',\n projectId,\n requireUser: true,\n })\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n exportDebug('Error listing datasets', error)\n this.error(`Failed to list datasets:\\n${error instanceof Error ? error.message : error}`, {\n exit: 1,\n })\n }\n\n // Determine dataset name\n let dataset = targetDataset\n if (!dataset) {\n try {\n // Get default dataset from config (only available when running from a project directory)\n const cliConfig = await this.tryGetCliConfig()\n const defaultDataset = cliConfig.api?.dataset\n\n if (defaultDataset) {\n dataset = defaultDataset\n this.log(`Using default dataset: ${dataset}`)\n } else {\n dataset = await promptForDataset({allowCreation: false, datasets})\n }\n } catch (error) {\n exportDebug('Error selecting dataset', error)\n this.error(`Failed to select dataset:\\n${error instanceof Error ? error.message : error}`, {\n exit: 1,\n })\n }\n }\n\n // Validate dataset name\n const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: 1})\n }\n\n // Verify existence of dataset before trying to export from it\n if (!datasets.some((set) => set.name === dataset)) {\n this.error(`Dataset with name \"${dataset}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\ndataset: ${dataset.padEnd(46)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n // Determine output path\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = await this.promptForDestination({dataset})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, dataset, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n // Prepare export options\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n assets: !flags['no-assets'],\n client: projectClient,\n compress: !flags['no-compress'],\n dataset,\n drafts: !flags['no-drafts'],\n mode: flags.mode === 'cursor' || flags.mode === 'stream' ? flags.mode : undefined,\n onProgress,\n outputPath,\n raw: flags.raw,\n types: flags.types ? flags.types.split(',') : undefined,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: 1})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n // Complete previous step\n succeed()\n\n // Start new step\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n // Update current step with progress info\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n dataset: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n const errorWithCode = err as Error & {code?: string}\n if (errorWithCode.code === 'EACCES') {\n this.error(\n `Permission denied: Cannot create directory \"${createPath}\". Please check write permissions.`,\n {\n exit: 1,\n },\n )\n } else {\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n }\n\n const finalPath = looksLikeFile ? dstPath : path.join(dstPath, `${dataset}.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Use --overwrite flag to overwrite it.`, {\n exit: 1,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {dataset: string; workDir?: string}): Promise<string> {\n const {dataset, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${dataset}.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","getProjectCliClient","SanityCommand","subdebug","boxen","input","spinner","exportDataset","prettyMs","validateDatasetName","promptForDataset","promptForProject","listDatasets","absolutify","getProjectIdFlag","noop","exportDebug","DatasetExportCommand","args","name","string","description","destination","examples","command","flags","semantics","integer","default","mode","options","boolean","overwrite","raw","types","hiddenAliases","run","parse","targetDestination","targetDataset","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectClient","apiVersion","requireUser","datasets","error","Error","message","exit","dataset","cliConfig","tryGetCliConfig","defaultDataset","api","log","allowCreation","dsError","some","set","padEnd","borderColor","borderStyle","destinationPath","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","assets","client","compress","drafts","undefined","split","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","process","stdout","dstPath","isAbsolute","resolve","cwd","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","errorWithCode","code","finalPath","join","finalPathStats","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/datasets/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {boxen, input, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport prettyMs from 'pretty-ms'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('dataset:export')\n\nexport class DatasetExportCommand extends SanityCommand<typeof DatasetExportCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the dataset to export',\n }),\n // Args are order dependent\n // eslint-disable-next-line perfectionist/sort-objects\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export a dataset to a local gzipped tarball. Assets returning 401, 403, or 404 are excluded from the export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> moviedb localPath.tar.gz',\n description: 'Export dataset \"moviedb\" to localPath.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> moviedb assetless.tar.gz --no-assets',\n description: 'Export dataset without assets',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --raw',\n description: 'Export raw documents without asset reference rewriting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --types products,shops',\n description: 'Export specific document types',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to export dataset from',\n semantics: 'override',\n }),\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n mode: Flags.string({\n default: 'stream',\n description:\n \"Export mode ('cursor' is faster for large datasets but may miss concurrent changes)\",\n options: ['stream', 'cursor'],\n }),\n 'no-assets': Flags.boolean({\n default: false,\n description: 'Export only non-asset documents and remove references to image assets',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n 'no-drafts': Flags.boolean({\n default: false,\n description: 'Export only published versions of documents',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n raw: Flags.boolean({\n default: false,\n description: 'Extract only documents, without rewriting asset references',\n }),\n types: Flags.string({\n description: 'Defines which document types to export (comma-separated)',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:export']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DatasetExportCommand)\n const {destination: targetDestination, name: targetDataset} = args\n\n // Get project configuration\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const projectClient = await getProjectCliClient({\n apiVersion: '2023-05-26',\n projectId,\n requireUser: true,\n })\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n exportDebug('Error listing datasets', error)\n this.error(`Failed to list datasets:\\n${error instanceof Error ? error.message : error}`, {\n exit: 1,\n })\n }\n\n // Determine dataset name\n let dataset = targetDataset\n if (!dataset) {\n try {\n // Get default dataset from config (only available when running from a project directory)\n const cliConfig = await this.tryGetCliConfig()\n const defaultDataset = cliConfig.api?.dataset\n\n if (defaultDataset) {\n dataset = defaultDataset\n this.log(`Using default dataset: ${dataset}`)\n } else {\n dataset = await promptForDataset({allowCreation: false, datasets})\n }\n } catch (error) {\n exportDebug('Error selecting dataset', error)\n this.error(`Failed to select dataset:\\n${error instanceof Error ? error.message : error}`, {\n exit: 1,\n })\n }\n }\n\n // Validate dataset name\n const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: 1})\n }\n\n // Verify existence of dataset before trying to export from it\n if (!datasets.some((set) => set.name === dataset)) {\n this.error(`Dataset with name \"${dataset}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\ndataset: ${dataset.padEnd(46)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n // Determine output path\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = await this.promptForDestination({dataset})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, dataset, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n // Prepare export options\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n assets: !flags['no-assets'],\n client: projectClient,\n compress: !flags['no-compress'],\n dataset,\n drafts: !flags['no-drafts'],\n mode: flags.mode === 'cursor' || flags.mode === 'stream' ? flags.mode : undefined,\n onProgress,\n outputPath,\n raw: flags.raw,\n types: flags.types ? flags.types.split(',') : undefined,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: 1})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n // Complete previous step\n succeed()\n\n // Start new step\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n // Update current step with progress info\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n dataset: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n const errorWithCode = err as Error & {code?: string}\n if (errorWithCode.code === 'EACCES') {\n this.error(\n `Permission denied: Cannot create directory \"${createPath}\". Please check write permissions.`,\n {\n exit: 1,\n },\n )\n } else {\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n }\n\n const finalPath = looksLikeFile ? dstPath : path.join(dstPath, `${dataset}.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Use --overwrite flag to overwrite it.`, {\n exit: 1,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {dataset: string; workDir?: string}): Promise<string> {\n const {dataset, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${dataset}.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","getProjectCliClient","SanityCommand","subdebug","boxen","input","spinner","exportDataset","prettyMs","validateDatasetName","promptForDataset","promptForProject","listDatasets","absolutify","getProjectIdFlag","noop","exportDebug","DatasetExportCommand","args","name","string","description","destination","examples","command","flags","semantics","integer","default","mode","options","boolean","overwrite","raw","types","hiddenAliases","run","parse","targetDestination","targetDataset","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectClient","apiVersion","requireUser","datasets","error","Error","message","exit","dataset","cliConfig","tryGetCliConfig","defaultDataset","api","log","allowCreation","dsError","some","set","padEnd","borderColor","borderStyle","destinationPath","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","assets","client","compress","drafts","undefined","split","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","process","stdout","dstPath","isAbsolute","resolve","cwd","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","errorWithCode","code","finalPath","join","finalPathStats","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
@@ -4,11 +4,11 @@ import { listDatasetAliases, listDatasets } from '../../services/datasets.js';
4
4
  import { getProjectIdFlag } from '../../util/sharedFlags.js';
5
5
  const listDatasetDebug = subdebug('dataset:list');
6
6
  export class ListDatasetCommand extends SanityCommand {
7
- static description = 'List datasets of your project';
7
+ static description = 'List datasets for the project';
8
8
  static examples = [
9
9
  {
10
10
  command: '<%= config.bin %> <%= command.id %>',
11
- description: 'List datasets of your project'
11
+ description: 'List datasets for the project'
12
12
  },
13
13
  {
14
14
  command: '<%= config.bin %> <%= command.id %> --project-id abc123',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/datasets/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasetAliases, listDatasets} from '../../services/datasets.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listDatasetDebug = subdebug('dataset:list')\n\nexport class ListDatasetCommand extends SanityCommand<typeof ListDatasetCommand> {\n static override description = 'List datasets of your project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List datasets of your project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List datasets for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list datasets for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:list']\n\n public async run(): Promise<void> {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const [datasets, aliases] = await Promise.allSettled([\n listDatasets(projectId),\n listDatasetAliases(projectId),\n ])\n\n if (datasets.status === 'rejected') {\n const err = datasets.reason as Error\n listDatasetDebug(`Error listing datasets for project ${projectId}`, err)\n this.error(`Dataset list retrieval failed: ${err.message}`, {exit: 1})\n }\n\n const datasetList = datasets.value\n if (datasetList.length === 0) {\n this.log('No datasets found for this project.')\n } else {\n for (const dataset of datasetList) {\n this.log(dataset.name)\n }\n }\n\n if (aliases.status === 'fulfilled' && aliases.value.length > 0) {\n for (const alias of aliases.value) {\n const targetDataset = alias.datasetName || '<unlinked>'\n this.log(`~${alias.name} -> ${targetDataset}`)\n }\n } else if (aliases.status === 'rejected') {\n listDatasetDebug(`Warning: Could not fetch aliases for project ${projectId}`, aliases.reason)\n }\n }\n}\n"],"names":["SanityCommand","subdebug","promptForProject","listDatasetAliases","listDatasets","getProjectIdFlag","listDatasetDebug","ListDatasetCommand","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","datasets","aliases","Promise","allSettled","status","err","reason","error","message","exit","datasetList","value","length","log","dataset","name","alias","targetDataset","datasetName"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,kBAAkB,EAAEC,YAAY,QAAO,6BAA4B;AAC3E,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBL,SAAS;AAElC,OAAO,MAAMM,2BAA2BP;IACtC,OAAgBQ,cAAc,gCAA+B;IAE7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAqB;QAChC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRf,iBAAiB;oBACfgB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,MAAM,CAACC,UAAUC,QAAQ,GAAG,MAAMC,QAAQC,UAAU,CAAC;YACnDpB,aAAaW;YACbZ,mBAAmBY;SACpB;QAED,IAAIM,SAASI,MAAM,KAAK,YAAY;YAClC,MAAMC,MAAML,SAASM,MAAM;YAC3BrB,iBAAiB,CAAC,mCAAmC,EAAES,WAAW,EAAEW;YACpE,IAAI,CAACE,KAAK,CAAC,CAAC,+BAA+B,EAAEF,IAAIG,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACtE;QAEA,MAAMC,cAAcV,SAASW,KAAK;QAClC,IAAID,YAAYE,MAAM,KAAK,GAAG;YAC5B,IAAI,CAACC,GAAG,CAAC;QACX,OAAO;YACL,KAAK,MAAMC,WAAWJ,YAAa;gBACjC,IAAI,CAACG,GAAG,CAACC,QAAQC,IAAI;YACvB;QACF;QAEA,IAAId,QAAQG,MAAM,KAAK,eAAeH,QAAQU,KAAK,CAACC,MAAM,GAAG,GAAG;YAC9D,KAAK,MAAMI,SAASf,QAAQU,KAAK,CAAE;gBACjC,MAAMM,gBAAgBD,MAAME,WAAW,IAAI;gBAC3C,IAAI,CAACL,GAAG,CAAC,CAAC,CAAC,EAAEG,MAAMD,IAAI,CAAC,IAAI,EAAEE,eAAe;YAC/C;QACF,OAAO,IAAIhB,QAAQG,MAAM,KAAK,YAAY;YACxCnB,iBAAiB,CAAC,6CAA6C,EAAES,WAAW,EAAEO,QAAQK,MAAM;QAC9F;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/datasets/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasetAliases, listDatasets} from '../../services/datasets.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listDatasetDebug = subdebug('dataset:list')\n\nexport class ListDatasetCommand extends SanityCommand<typeof ListDatasetCommand> {\n static override description = 'List datasets for the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List datasets for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List datasets for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list datasets for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:list']\n\n public async run(): Promise<void> {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const [datasets, aliases] = await Promise.allSettled([\n listDatasets(projectId),\n listDatasetAliases(projectId),\n ])\n\n if (datasets.status === 'rejected') {\n const err = datasets.reason as Error\n listDatasetDebug(`Error listing datasets for project ${projectId}`, err)\n this.error(`Dataset list retrieval failed: ${err.message}`, {exit: 1})\n }\n\n const datasetList = datasets.value\n if (datasetList.length === 0) {\n this.log('No datasets found for this project.')\n } else {\n for (const dataset of datasetList) {\n this.log(dataset.name)\n }\n }\n\n if (aliases.status === 'fulfilled' && aliases.value.length > 0) {\n for (const alias of aliases.value) {\n const targetDataset = alias.datasetName || '<unlinked>'\n this.log(`~${alias.name} -> ${targetDataset}`)\n }\n } else if (aliases.status === 'rejected') {\n listDatasetDebug(`Warning: Could not fetch aliases for project ${projectId}`, aliases.reason)\n }\n }\n}\n"],"names":["SanityCommand","subdebug","promptForProject","listDatasetAliases","listDatasets","getProjectIdFlag","listDatasetDebug","ListDatasetCommand","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","datasets","aliases","Promise","allSettled","status","err","reason","error","message","exit","datasetList","value","length","log","dataset","name","alias","targetDataset","datasetName"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,kBAAkB,EAAEC,YAAY,QAAO,6BAA4B;AAC3E,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBL,SAAS;AAElC,OAAO,MAAMM,2BAA2BP;IACtC,OAAgBQ,cAAc,gCAA+B;IAE7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAqB;QAChC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRf,iBAAiB;oBACfgB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,MAAM,CAACC,UAAUC,QAAQ,GAAG,MAAMC,QAAQC,UAAU,CAAC;YACnDpB,aAAaW;YACbZ,mBAAmBY;SACpB;QAED,IAAIM,SAASI,MAAM,KAAK,YAAY;YAClC,MAAMC,MAAML,SAASM,MAAM;YAC3BrB,iBAAiB,CAAC,mCAAmC,EAAES,WAAW,EAAEW;YACpE,IAAI,CAACE,KAAK,CAAC,CAAC,+BAA+B,EAAEF,IAAIG,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACtE;QAEA,MAAMC,cAAcV,SAASW,KAAK;QAClC,IAAID,YAAYE,MAAM,KAAK,GAAG;YAC5B,IAAI,CAACC,GAAG,CAAC;QACX,OAAO;YACL,KAAK,MAAMC,WAAWJ,YAAa;gBACjC,IAAI,CAACG,GAAG,CAACC,QAAQC,IAAI;YACvB;QACF;QAEA,IAAId,QAAQG,MAAM,KAAK,eAAeH,QAAQU,KAAK,CAACC,MAAM,GAAG,GAAG;YAC9D,KAAK,MAAMI,SAASf,QAAQU,KAAK,CAAE;gBACjC,MAAMM,gBAAgBD,MAAME,WAAW,IAAI;gBAC3C,IAAI,CAACL,GAAG,CAAC,CAAC,CAAC,EAAEG,MAAMD,IAAI,CAAC,IAAI,EAAEE,eAAe;YAC/C;QACF,OAAO,IAAIhB,QAAQG,MAAM,KAAK,YAAY;YACxCnB,iBAAiB,CAAC,6CAA6C,EAAES,WAAW,EAAEO,QAAQK,MAAM;QAC9F;IACF;AACF"}
@@ -4,7 +4,7 @@ import { ProjectRootNotFoundError, SanityCommand } from '@sanity/cli-core';
4
4
  import { gatherAuthInfo, gatherCliInfo, gatherProjectInfo, gatherResolvedWorkspaces, gatherStudioWorkspaces, gatherUserInfo } from '../actions/debug/gatherDebugInfo.js';
5
5
  import { formatKeyValue, sectionHeader } from '../actions/debug/output.js';
6
6
  export class Debug extends SanityCommand {
7
- static description = 'Provides diagnostic info for Sanity Studio troubleshooting';
7
+ static description = 'Print diagnostic info for troubleshooting';
8
8
  static examples = [
9
9
  '<%= config.bin %> <%= command.id %>',
10
10
  '<%= config.bin %> <%= command.id %> --secrets'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/debug.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {ProjectRootNotFoundError, SanityCommand} from '@sanity/cli-core'\n\nimport {\n gatherAuthInfo,\n gatherCliInfo,\n gatherProjectInfo,\n gatherResolvedWorkspaces,\n gatherStudioWorkspaces,\n gatherUserInfo,\n} from '../actions/debug/gatherDebugInfo.js'\nimport {formatKeyValue, sectionHeader} from '../actions/debug/output.js'\nimport {type StudioWorkspace, type UserInfo} from '../actions/debug/types.js'\n\ntype ConfigLoadResult<T> = {error: Error; value?: never} | {error?: never; value: T}\n\nexport class Debug extends SanityCommand<typeof Debug> {\n static override description = 'Provides diagnostic info for Sanity Studio troubleshooting'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --secrets',\n ]\n\n static override flags = {\n secrets: Flags.boolean({\n default: false,\n description: 'Include API keys in output',\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Show full error details including stack traces',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = this\n\n let projectDirectory: string | undefined\n try {\n const projectRoot = await this.getProjectRoot()\n projectDirectory = projectRoot.directory\n } catch (err) {\n if (!(err instanceof ProjectRootNotFoundError)) throw err\n }\n\n // Try loading CLI config, capturing errors\n let cliConfigLoad: ConfigLoadResult<Awaited<ReturnType<typeof this.getCliConfig>>> | undefined\n if (projectDirectory) {\n try {\n cliConfigLoad = {value: await this.getCliConfig()}\n } catch (err) {\n cliConfigLoad = {error: err instanceof Error ? err : new Error(String(err))}\n }\n }\n\n const projectId = cliConfigLoad?.value?.api?.projectId\n\n // Gather project info once, shared between Project and Studio sections\n const project = projectDirectory ? await gatherProjectInfo(projectDirectory) : undefined\n\n // Pre-load studio workspaces so we know if the config is valid\n let studioLoad: ConfigLoadResult<StudioWorkspace[]> | undefined\n if (project?.studioConfigPath && projectDirectory) {\n try {\n studioLoad = {value: await gatherStudioWorkspaces(projectDirectory)}\n } catch (err) {\n studioLoad = {error: err instanceof Error ? err : new Error(String(err))}\n }\n }\n\n // Section 1: User\n const user = await this.printUserSection(projectId)\n const userId = user instanceof Error ? undefined : user.id\n\n // Section 2: Authentication (only when logged in)\n await this.printAuthSection(flags.secrets)\n\n // Section 3: CLI\n await this.printCliSection()\n\n // Section 4: Project\n this.printProjectSection(project, cliConfigLoad, studioLoad)\n\n // Section 5: Studio (when studio config file exists)\n if (projectDirectory && project?.studioConfigPath && studioLoad) {\n await this.printStudioSection(projectDirectory, studioLoad, flags.verbose, projectId, userId)\n }\n }\n\n private async printAuthSection(includeSecrets: boolean): Promise<void> {\n const auth = await gatherAuthInfo(includeSecrets)\n if (!auth.hasToken) return\n\n this.log(sectionHeader('Authentication'))\n const padTo = 10 // \"Auth token\" is the longest key\n this.log(formatKeyValue('Auth token', auth.authToken, {padTo}))\n this.log(formatKeyValue('User type', auth.userType, {padTo}))\n\n if (!includeSecrets) {\n this.log(' (run with --secrets to reveal token)')\n }\n this.log('')\n }\n\n private async printCliSection(): Promise<void> {\n this.log(sectionHeader('CLI'))\n\n try {\n const cliInfo = await gatherCliInfo()\n const padTo = 9 // \"Installed\" is the longest key\n this.log(formatKeyValue('Version', cliInfo.version, {padTo}))\n this.log(formatKeyValue('Installed', cliInfo.installContext, {padTo}))\n } catch {\n this.log(` ${styleText('red', 'Unable to determine CLI version')}`)\n }\n this.log('')\n }\n\n private printConfigStatus(\n label: string,\n fileName: string | undefined,\n loadResult: ConfigLoadResult<unknown> | undefined,\n padTo: number,\n ): void {\n if (!fileName) {\n this.log(formatKeyValue(label, `${styleText('red', '\\u274C')} not found`, {padTo}))\n return\n }\n\n if (loadResult?.error) {\n this.log(\n formatKeyValue(\n label,\n `${styleText('yellow', '\\u26A0\\uFE0F')} ${styleText('yellow', fileName)} (has errors)`,\n {padTo},\n ),\n )\n } else {\n this.log(\n formatKeyValue(label, `${styleText('green', '\\u2705')} ${styleText('yellow', fileName)}`, {\n padTo,\n }),\n )\n }\n }\n\n private printProjectSection(\n project: Awaited<ReturnType<typeof gatherProjectInfo>>,\n cliConfigLoad: ConfigLoadResult<unknown> | undefined,\n studioLoad: ConfigLoadResult<unknown> | undefined,\n ): void {\n this.log(sectionHeader('Project'))\n\n if (!project) {\n this.log(' No project found\\n')\n return\n }\n\n const padTo = 14\n this.log(formatKeyValue('Root path', project.rootPath, {padTo}))\n this.printConfigStatus('CLI config', project.cliConfigPath, cliConfigLoad, padTo)\n this.printConfigStatus('Studio config', project.studioConfigPath, studioLoad, padTo)\n this.log('')\n }\n\n private async printStudioSection(\n projectDirectory: string,\n studioLoad: ConfigLoadResult<StudioWorkspace[]>,\n verbose: boolean,\n projectId: string | undefined,\n userId: string | undefined,\n ): Promise<void> {\n this.log(sectionHeader('Studio'))\n\n if (studioLoad.error) {\n this.log(` ${styleText('red', 'Failed to load studio configuration:')}`)\n if (verbose) {\n this.log(` ${studioLoad.error.stack ?? studioLoad.error.message}\\n`)\n } else {\n this.log(` ${truncate(studioLoad.error.message)}\\n`)\n }\n return\n }\n\n this.log(' Workspaces:')\n for (const ws of studioLoad.value) {\n const label = ws.name ?? 'default'\n this.log(` ${label}`)\n this.log(formatKeyValue('Project ID', ws.projectId, {indent: 6, padTo: 10}))\n this.log(formatKeyValue('Dataset', ws.dataset, {indent: 6, padTo: 10}))\n }\n\n // Full resolution: try to resolve plugins and get roles\n try {\n const resolved = await gatherResolvedWorkspaces(projectDirectory, userId)\n\n this.log('')\n this.log(' Resolved configuration:')\n for (const ws of resolved) {\n this.log(` ${ws.name} (${ws.title})`)\n if (ws.roles.length > 0) {\n this.log(formatKeyValue('Roles', ws.roles, {indent: 6, padTo: 5}))\n }\n }\n } catch (err) {\n this.log('')\n if (verbose && err instanceof Error && err.stack) {\n this.log(` ${styleText('dim', 'Unable to resolve full studio configuration:')}`)\n this.log(` ${styleText('dim', err.stack)}`)\n } else {\n const reason = truncate(err instanceof Error ? err.message : String(err))\n this.log(\n ` ${styleText('dim', `(unable to resolve full studio configuration: ${reason})`)}`,\n )\n }\n }\n this.log('')\n }\n\n private async printUserSection(projectId: string | undefined): Promise<Error | UserInfo> {\n this.log(`\\n${sectionHeader('User')}`)\n\n const user = await gatherUserInfo(projectId)\n if (user instanceof Error) {\n this.log(` ${user.message}\\n`)\n return user\n }\n\n const padTo = 8 // \"Provider\" is the longest key\n this.log(formatKeyValue('Name', user.name, {padTo}))\n this.log(formatKeyValue('Email', user.email, {padTo}))\n this.log(formatKeyValue('ID', user.id, {padTo}))\n this.log(formatKeyValue('Provider', user.provider, {padTo}))\n this.log('')\n return user\n }\n}\n\nconst MAX_ERROR_LENGTH = 200\n\nfunction truncate(str: string): string {\n const collapsed = str.replaceAll(/\\s*\\n\\s*/g, ' ').trim()\n if (collapsed.length <= MAX_ERROR_LENGTH) return collapsed\n return `${collapsed.slice(0, MAX_ERROR_LENGTH)}...`\n}\n"],"names":["styleText","Flags","ProjectRootNotFoundError","SanityCommand","gatherAuthInfo","gatherCliInfo","gatherProjectInfo","gatherResolvedWorkspaces","gatherStudioWorkspaces","gatherUserInfo","formatKeyValue","sectionHeader","Debug","description","examples","flags","secrets","boolean","default","verbose","run","projectDirectory","projectRoot","getProjectRoot","directory","err","cliConfigLoad","value","getCliConfig","error","Error","String","projectId","api","project","undefined","studioLoad","studioConfigPath","user","printUserSection","userId","id","printAuthSection","printCliSection","printProjectSection","printStudioSection","includeSecrets","auth","hasToken","log","padTo","authToken","userType","cliInfo","version","installContext","printConfigStatus","label","fileName","loadResult","rootPath","cliConfigPath","stack","message","truncate","ws","name","indent","dataset","resolved","title","roles","length","reason","email","provider","MAX_ERROR_LENGTH","str","collapsed","replaceAll","trim","slice"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/debug.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {ProjectRootNotFoundError, SanityCommand} from '@sanity/cli-core'\n\nimport {\n gatherAuthInfo,\n gatherCliInfo,\n gatherProjectInfo,\n gatherResolvedWorkspaces,\n gatherStudioWorkspaces,\n gatherUserInfo,\n} from '../actions/debug/gatherDebugInfo.js'\nimport {formatKeyValue, sectionHeader} from '../actions/debug/output.js'\nimport {type StudioWorkspace, type UserInfo} from '../actions/debug/types.js'\n\ntype ConfigLoadResult<T> = {error: Error; value?: never} | {error?: never; value: T}\n\nexport class Debug extends SanityCommand<typeof Debug> {\n static override description = 'Print diagnostic info for troubleshooting'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --secrets',\n ]\n\n static override flags = {\n secrets: Flags.boolean({\n default: false,\n description: 'Include API keys in output',\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Show full error details including stack traces',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = this\n\n let projectDirectory: string | undefined\n try {\n const projectRoot = await this.getProjectRoot()\n projectDirectory = projectRoot.directory\n } catch (err) {\n if (!(err instanceof ProjectRootNotFoundError)) throw err\n }\n\n // Try loading CLI config, capturing errors\n let cliConfigLoad: ConfigLoadResult<Awaited<ReturnType<typeof this.getCliConfig>>> | undefined\n if (projectDirectory) {\n try {\n cliConfigLoad = {value: await this.getCliConfig()}\n } catch (err) {\n cliConfigLoad = {error: err instanceof Error ? err : new Error(String(err))}\n }\n }\n\n const projectId = cliConfigLoad?.value?.api?.projectId\n\n // Gather project info once, shared between Project and Studio sections\n const project = projectDirectory ? await gatherProjectInfo(projectDirectory) : undefined\n\n // Pre-load studio workspaces so we know if the config is valid\n let studioLoad: ConfigLoadResult<StudioWorkspace[]> | undefined\n if (project?.studioConfigPath && projectDirectory) {\n try {\n studioLoad = {value: await gatherStudioWorkspaces(projectDirectory)}\n } catch (err) {\n studioLoad = {error: err instanceof Error ? err : new Error(String(err))}\n }\n }\n\n // Section 1: User\n const user = await this.printUserSection(projectId)\n const userId = user instanceof Error ? undefined : user.id\n\n // Section 2: Authentication (only when logged in)\n await this.printAuthSection(flags.secrets)\n\n // Section 3: CLI\n await this.printCliSection()\n\n // Section 4: Project\n this.printProjectSection(project, cliConfigLoad, studioLoad)\n\n // Section 5: Studio (when studio config file exists)\n if (projectDirectory && project?.studioConfigPath && studioLoad) {\n await this.printStudioSection(projectDirectory, studioLoad, flags.verbose, projectId, userId)\n }\n }\n\n private async printAuthSection(includeSecrets: boolean): Promise<void> {\n const auth = await gatherAuthInfo(includeSecrets)\n if (!auth.hasToken) return\n\n this.log(sectionHeader('Authentication'))\n const padTo = 10 // \"Auth token\" is the longest key\n this.log(formatKeyValue('Auth token', auth.authToken, {padTo}))\n this.log(formatKeyValue('User type', auth.userType, {padTo}))\n\n if (!includeSecrets) {\n this.log(' (run with --secrets to reveal token)')\n }\n this.log('')\n }\n\n private async printCliSection(): Promise<void> {\n this.log(sectionHeader('CLI'))\n\n try {\n const cliInfo = await gatherCliInfo()\n const padTo = 9 // \"Installed\" is the longest key\n this.log(formatKeyValue('Version', cliInfo.version, {padTo}))\n this.log(formatKeyValue('Installed', cliInfo.installContext, {padTo}))\n } catch {\n this.log(` ${styleText('red', 'Unable to determine CLI version')}`)\n }\n this.log('')\n }\n\n private printConfigStatus(\n label: string,\n fileName: string | undefined,\n loadResult: ConfigLoadResult<unknown> | undefined,\n padTo: number,\n ): void {\n if (!fileName) {\n this.log(formatKeyValue(label, `${styleText('red', '\\u274C')} not found`, {padTo}))\n return\n }\n\n if (loadResult?.error) {\n this.log(\n formatKeyValue(\n label,\n `${styleText('yellow', '\\u26A0\\uFE0F')} ${styleText('yellow', fileName)} (has errors)`,\n {padTo},\n ),\n )\n } else {\n this.log(\n formatKeyValue(label, `${styleText('green', '\\u2705')} ${styleText('yellow', fileName)}`, {\n padTo,\n }),\n )\n }\n }\n\n private printProjectSection(\n project: Awaited<ReturnType<typeof gatherProjectInfo>>,\n cliConfigLoad: ConfigLoadResult<unknown> | undefined,\n studioLoad: ConfigLoadResult<unknown> | undefined,\n ): void {\n this.log(sectionHeader('Project'))\n\n if (!project) {\n this.log(' No project found\\n')\n return\n }\n\n const padTo = 14\n this.log(formatKeyValue('Root path', project.rootPath, {padTo}))\n this.printConfigStatus('CLI config', project.cliConfigPath, cliConfigLoad, padTo)\n this.printConfigStatus('Studio config', project.studioConfigPath, studioLoad, padTo)\n this.log('')\n }\n\n private async printStudioSection(\n projectDirectory: string,\n studioLoad: ConfigLoadResult<StudioWorkspace[]>,\n verbose: boolean,\n projectId: string | undefined,\n userId: string | undefined,\n ): Promise<void> {\n this.log(sectionHeader('Studio'))\n\n if (studioLoad.error) {\n this.log(` ${styleText('red', 'Failed to load studio configuration:')}`)\n if (verbose) {\n this.log(` ${studioLoad.error.stack ?? studioLoad.error.message}\\n`)\n } else {\n this.log(` ${truncate(studioLoad.error.message)}\\n`)\n }\n return\n }\n\n this.log(' Workspaces:')\n for (const ws of studioLoad.value) {\n const label = ws.name ?? 'default'\n this.log(` ${label}`)\n this.log(formatKeyValue('Project ID', ws.projectId, {indent: 6, padTo: 10}))\n this.log(formatKeyValue('Dataset', ws.dataset, {indent: 6, padTo: 10}))\n }\n\n // Full resolution: try to resolve plugins and get roles\n try {\n const resolved = await gatherResolvedWorkspaces(projectDirectory, userId)\n\n this.log('')\n this.log(' Resolved configuration:')\n for (const ws of resolved) {\n this.log(` ${ws.name} (${ws.title})`)\n if (ws.roles.length > 0) {\n this.log(formatKeyValue('Roles', ws.roles, {indent: 6, padTo: 5}))\n }\n }\n } catch (err) {\n this.log('')\n if (verbose && err instanceof Error && err.stack) {\n this.log(` ${styleText('dim', 'Unable to resolve full studio configuration:')}`)\n this.log(` ${styleText('dim', err.stack)}`)\n } else {\n const reason = truncate(err instanceof Error ? err.message : String(err))\n this.log(\n ` ${styleText('dim', `(unable to resolve full studio configuration: ${reason})`)}`,\n )\n }\n }\n this.log('')\n }\n\n private async printUserSection(projectId: string | undefined): Promise<Error | UserInfo> {\n this.log(`\\n${sectionHeader('User')}`)\n\n const user = await gatherUserInfo(projectId)\n if (user instanceof Error) {\n this.log(` ${user.message}\\n`)\n return user\n }\n\n const padTo = 8 // \"Provider\" is the longest key\n this.log(formatKeyValue('Name', user.name, {padTo}))\n this.log(formatKeyValue('Email', user.email, {padTo}))\n this.log(formatKeyValue('ID', user.id, {padTo}))\n this.log(formatKeyValue('Provider', user.provider, {padTo}))\n this.log('')\n return user\n }\n}\n\nconst MAX_ERROR_LENGTH = 200\n\nfunction truncate(str: string): string {\n const collapsed = str.replaceAll(/\\s*\\n\\s*/g, ' ').trim()\n if (collapsed.length <= MAX_ERROR_LENGTH) return collapsed\n return `${collapsed.slice(0, MAX_ERROR_LENGTH)}...`\n}\n"],"names":["styleText","Flags","ProjectRootNotFoundError","SanityCommand","gatherAuthInfo","gatherCliInfo","gatherProjectInfo","gatherResolvedWorkspaces","gatherStudioWorkspaces","gatherUserInfo","formatKeyValue","sectionHeader","Debug","description","examples","flags","secrets","boolean","default","verbose","run","projectDirectory","projectRoot","getProjectRoot","directory","err","cliConfigLoad","value","getCliConfig","error","Error","String","projectId","api","project","undefined","studioLoad","studioConfigPath","user","printUserSection","userId","id","printAuthSection","printCliSection","printProjectSection","printStudioSection","includeSecrets","auth","hasToken","log","padTo","authToken","userType","cliInfo","version","installContext","printConfigStatus","label","fileName","loadResult","rootPath","cliConfigPath","stack","message","truncate","ws","name","indent","dataset","resolved","title","roles","length","reason","email","provider","MAX_ERROR_LENGTH","str","collapsed","replaceAll","trim","slice"],"mappings":"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"}
@@ -41,7 +41,7 @@ export class DeployCommand extends SanityCommand {
41
41
  build: Flags.boolean({
42
42
  allowNo: true,
43
43
  default: true,
44
- description: "Don't build the studio prior to deploy, instead deploying the version currently in `dist/`"
44
+ description: 'Build the studio before deploying (use --no-build to deploy existing `dist/` output)'
45
45
  }),
46
46
  external: Flags.boolean({
47
47
  default: false,
@@ -55,11 +55,11 @@ export class DeployCommand extends SanityCommand {
55
55
  minify: Flags.boolean({
56
56
  allowNo: true,
57
57
  default: true,
58
- description: 'Skip minifying built JavaScript (speeds up build, increases size of bundle)'
58
+ description: 'Minify built JavaScript (use --no-minify to skip for faster builds)'
59
59
  }),
60
60
  'schema-required': Flags.boolean({
61
61
  default: false,
62
- description: 'Fail-fast deployment if schema store fails'
62
+ description: 'Fail if schema deployment fails'
63
63
  }),
64
64
  'source-maps': Flags.boolean({
65
65
  default: false,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/deploy.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {deployApp} from '../actions/deploy/deployApp.js'\nimport {deployDebug} from '../actions/deploy/deployDebug.js'\nimport {deployStudio} from '../actions/deploy/deployStudio.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\nimport {dirIsEmptyOrNonExistent} from '../util/dirIsEmptyOrNonExistent.js'\n\nexport class DeployCommand extends SanityCommand<typeof DeployCommand> {\n static override args = {\n sourceDir: Args.directory({\n description: 'Source directory',\n }),\n }\n\n static override description = 'Builds and deploys Sanity Studio or application to Sanity hosting'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Build and deploy the studio to Sanity hosting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --no-minify --source-maps',\n description: 'Deploys non-minified build with source maps',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --schema-required',\n description:\n 'Fail fast on schema store fails - for when other services rely on the stored schema',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --external',\n description: 'Register an externally hosted studio (studioHost contains full URL)',\n },\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n deprecated: true,\n description: 'Automatically update the studio to the latest version',\n }),\n build: Flags.boolean({\n allowNo: true,\n default: true,\n description:\n \"Don't build the studio prior to deploy, instead deploying the version currently in `dist/`\",\n }),\n external: Flags.boolean({\n default: false,\n description: 'Register an externally hosted studio',\n exclusive: ['source-maps', 'minify', 'build'],\n }),\n minify: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Skip minifying built JavaScript (speeds up build, increases size of bundle)',\n }),\n 'schema-required': Flags.boolean({\n default: false,\n description: 'Fail-fast deployment if schema store fails',\n }),\n 'source-maps': Flags.boolean({\n default: false,\n description: 'Enable source maps for built bundles (increases size of bundle)',\n }),\n url: Flags.string({\n description:\n 'Studio URL for deployment. For external studios, the full URL. For hosted studios, the hostname (e.g. \"my-studio\" or \"my-studio.sanity.studio\")',\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Enable verbose logging',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Unattended mode, answers \"yes\" to any \"yes/no\" prompt and otherwise uses defaults',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeployCommand)\n\n const cliConfig = await this.getCliConfig()\n const projectRoot = await this.getProjectRoot()\n\n const isApp = determineIsApp(cliConfig)\n\n const defaultOutputDir = path.resolve(path.join(projectRoot.directory, 'dist'))\n const sourceDir = path.resolve(process.cwd(), this.args.sourceDir || defaultOutputDir)\n\n // Skip the directory check if the studio is externally hosted\n if (this.args.sourceDir && this.args.sourceDir !== 'dist' && !flags.external) {\n let relativeOutput = path.relative(process.cwd(), sourceDir)\n if (relativeOutput[0] !== '.') {\n relativeOutput = `./${relativeOutput}`\n }\n\n const isEmpty = await dirIsEmptyOrNonExistent(sourceDir)\n // Prompt to delete the directory if it's not empty\n const shouldProceed =\n isEmpty ||\n (await confirm({\n default: false,\n message: `\"${relativeOutput}\" is not empty, do you want to proceed?`,\n }))\n\n if (!shouldProceed) {\n this.output.error('Cancelled.', {exit: 1})\n }\n\n this.output.log(`Building to ${relativeOutput}\\n`)\n }\n\n if (isApp) {\n deployDebug('Deploying app')\n await deployApp({\n cliConfig,\n flags,\n output: this.output,\n projectRoot,\n sourceDir,\n })\n } else {\n deployDebug('Deploying studio')\n await deployStudio({\n cliConfig,\n flags,\n output: this.output,\n projectRoot,\n sourceDir,\n })\n }\n }\n}\n"],"names":["path","Args","Flags","SanityCommand","confirm","deployApp","deployDebug","deployStudio","determineIsApp","dirIsEmptyOrNonExistent","DeployCommand","args","sourceDir","directory","description","examples","command","flags","boolean","allowNo","deprecated","build","default","external","exclusive","minify","url","string","verbose","yes","char","run","parse","cliConfig","getCliConfig","projectRoot","getProjectRoot","isApp","defaultOutputDir","resolve","join","process","cwd","relativeOutput","relative","isEmpty","shouldProceed","message","output","error","exit","log"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/deploy.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {deployApp} from '../actions/deploy/deployApp.js'\nimport {deployDebug} from '../actions/deploy/deployDebug.js'\nimport {deployStudio} from '../actions/deploy/deployStudio.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\nimport {dirIsEmptyOrNonExistent} from '../util/dirIsEmptyOrNonExistent.js'\n\nexport class DeployCommand extends SanityCommand<typeof DeployCommand> {\n static override args = {\n sourceDir: Args.directory({\n description: 'Source directory',\n }),\n }\n\n static override description = 'Builds and deploys Sanity Studio or application to Sanity hosting'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Build and deploy the studio to Sanity hosting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --no-minify --source-maps',\n description: 'Deploys non-minified build with source maps',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --schema-required',\n description:\n 'Fail fast on schema store fails - for when other services rely on the stored schema',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --external',\n description: 'Register an externally hosted studio (studioHost contains full URL)',\n },\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n deprecated: true,\n description: 'Automatically update the studio to the latest version',\n }),\n build: Flags.boolean({\n allowNo: true,\n default: true,\n description:\n 'Build the studio before deploying (use --no-build to deploy existing `dist/` output)',\n }),\n external: Flags.boolean({\n default: false,\n description: 'Register an externally hosted studio',\n exclusive: ['source-maps', 'minify', 'build'],\n }),\n minify: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Minify built JavaScript (use --no-minify to skip for faster builds)',\n }),\n 'schema-required': Flags.boolean({\n default: false,\n description: 'Fail if schema deployment fails',\n }),\n 'source-maps': Flags.boolean({\n default: false,\n description: 'Enable source maps for built bundles (increases size of bundle)',\n }),\n url: Flags.string({\n description:\n 'Studio URL for deployment. For external studios, the full URL. For hosted studios, the hostname (e.g. \"my-studio\" or \"my-studio.sanity.studio\")',\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Enable verbose logging',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Unattended mode, answers \"yes\" to any \"yes/no\" prompt and otherwise uses defaults',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeployCommand)\n\n const cliConfig = await this.getCliConfig()\n const projectRoot = await this.getProjectRoot()\n\n const isApp = determineIsApp(cliConfig)\n\n const defaultOutputDir = path.resolve(path.join(projectRoot.directory, 'dist'))\n const sourceDir = path.resolve(process.cwd(), this.args.sourceDir || defaultOutputDir)\n\n // Skip the directory check if the studio is externally hosted\n if (this.args.sourceDir && this.args.sourceDir !== 'dist' && !flags.external) {\n let relativeOutput = path.relative(process.cwd(), sourceDir)\n if (relativeOutput[0] !== '.') {\n relativeOutput = `./${relativeOutput}`\n }\n\n const isEmpty = await dirIsEmptyOrNonExistent(sourceDir)\n // Prompt to delete the directory if it's not empty\n const shouldProceed =\n isEmpty ||\n (await confirm({\n default: false,\n message: `\"${relativeOutput}\" is not empty, do you want to proceed?`,\n }))\n\n if (!shouldProceed) {\n this.output.error('Cancelled.', {exit: 1})\n }\n\n this.output.log(`Building to ${relativeOutput}\\n`)\n }\n\n if (isApp) {\n deployDebug('Deploying app')\n await deployApp({\n cliConfig,\n flags,\n output: this.output,\n projectRoot,\n sourceDir,\n })\n } else {\n deployDebug('Deploying studio')\n await deployStudio({\n cliConfig,\n flags,\n output: this.output,\n projectRoot,\n sourceDir,\n })\n }\n }\n}\n"],"names":["path","Args","Flags","SanityCommand","confirm","deployApp","deployDebug","deployStudio","determineIsApp","dirIsEmptyOrNonExistent","DeployCommand","args","sourceDir","directory","description","examples","command","flags","boolean","allowNo","deprecated","build","default","external","exclusive","minify","url","string","verbose","yes","char","run","parse","cliConfig","getCliConfig","projectRoot","getProjectRoot","isApp","defaultOutputDir","resolve","join","process","cwd","relativeOutput","relative","isEmpty","shouldProceed","message","output","error","exit","log"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { devAction } from '../actions/dev/devAction.js';
5
5
  import { devDebug } from '../actions/dev/devDebug.js';
6
6
  import { determineIsApp } from '../util/determineIsApp.js';
7
7
  export class DevCommand extends SanityCommand {
8
- static description = 'Starts a local development server for Sanity Studio with live reloading';
8
+ static description = 'Start a local development server with live reloading';
9
9
  static examples = [
10
10
  '<%= config.bin %> <%= command.id %> --host=0.0.0.0',
11
11
  '<%= config.bin %> <%= command.id %> --port=1942',
@@ -14,17 +14,17 @@ export class DevCommand extends SanityCommand {
14
14
  static flags = {
15
15
  'auto-updates': Flags.boolean({
16
16
  allowNo: true,
17
- description: 'Automatically update Sanity Studio dependencies.'
17
+ description: 'Automatically update Sanity Studio dependencies'
18
18
  }),
19
19
  host: Flags.string({
20
- description: '[default: localhost] The local network interface at which to listen.'
20
+ description: 'Local network interface to listen on (default: localhost)'
21
21
  }),
22
22
  'load-in-dashboard': Flags.boolean({
23
23
  allowNo: true,
24
- description: 'Load the app/studio in the Sanity dashboard.'
24
+ description: 'Load the app/studio in the Sanity dashboard'
25
25
  }),
26
26
  port: Flags.string({
27
- description: '[default: 3333] TCP port to start server on.'
27
+ description: 'TCP port to start server on (default: 3333)'
28
28
  })
29
29
  };
30
30
  async run() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {devAction} from '../actions/dev/devAction.js'\nimport {devDebug} from '../actions/dev/devDebug.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\n\nexport class DevCommand extends SanityCommand<typeof DevCommand> {\n static override description =\n 'Starts a local development server for Sanity Studio with live reloading'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> --load-in-dashboard',\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n description: 'Automatically update Sanity Studio dependencies.',\n }),\n host: Flags.string({\n description: '[default: localhost] The local network interface at which to listen.',\n }),\n 'load-in-dashboard': Flags.boolean({\n allowNo: true,\n description: 'Load the app/studio in the Sanity dashboard.',\n }),\n port: Flags.string({\n description: '[default: 3333] TCP port to start server on.',\n }),\n }\n\n public async run(): Promise<{close?: () => Promise<void>}> {\n const {flags} = await this.parse(DevCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n const isApp = determineIsApp(cliConfig)\n\n // load-in-dashboard is defaulted to true for apps.\n if (isApp && flags['load-in-dashboard'] === undefined) {\n flags['load-in-dashboard'] = true\n } else if (flags['load-in-dashboard'] === undefined) {\n // For non-apps, load-in-dashboard is defaulted to false.\n flags['load-in-dashboard'] = false\n }\n\n try {\n const result = await devAction({\n cliConfig,\n flags,\n isApp,\n output: this.output,\n workDir,\n })\n return result\n } catch (error) {\n devDebug(`Failed to start dev server`, error)\n this.output.error(\n styleText(['red', 'bgBlack'], `Failed to start dev server: ${error.message}`),\n {\n exit: 1,\n },\n )\n }\n }\n}\n"],"names":["styleText","Flags","SanityCommand","devAction","devDebug","determineIsApp","DevCommand","description","examples","flags","boolean","allowNo","host","string","port","run","parse","workDir","getProjectRoot","directory","cliConfig","getCliConfig","isApp","undefined","result","output","error","message","exit"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,SAAS,QAAO,8BAA6B;AACrD,SAAQC,QAAQ,QAAO,6BAA4B;AACnD,SAAQC,cAAc,QAAO,4BAA2B;AAExD,OAAO,MAAMC,mBAAmBJ;IAC9B,OAAgBK,cACd,0EAAyE;IAE3E,OAAgBC,WAAW;QACzB;QACA;QACA;KACD,CAAA;IAED,OAAgBC,QAAQ;QACtB,gBAAgBR,MAAMS,OAAO,CAAC;YAC5BC,SAAS;YACTJ,aAAa;QACf;QACAK,MAAMX,MAAMY,MAAM,CAAC;YACjBN,aAAa;QACf;QACA,qBAAqBN,MAAMS,OAAO,CAAC;YACjCC,SAAS;YACTJ,aAAa;QACf;QACAO,MAAMb,MAAMY,MAAM,CAAC;YACjBN,aAAa;QACf;IACF,EAAC;IAED,MAAaQ,MAA8C;QACzD,MAAM,EAACN,KAAK,EAAC,GAAG,MAAM,IAAI,CAACO,KAAK,CAACV;QAEjC,MAAMW,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QACvD,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,MAAMC,QAAQjB,eAAee;QAE7B,mDAAmD;QACnD,IAAIE,SAASb,KAAK,CAAC,oBAAoB,KAAKc,WAAW;YACrDd,KAAK,CAAC,oBAAoB,GAAG;QAC/B,OAAO,IAAIA,KAAK,CAAC,oBAAoB,KAAKc,WAAW;YACnD,yDAAyD;YACzDd,KAAK,CAAC,oBAAoB,GAAG;QAC/B;QAEA,IAAI;YACF,MAAMe,SAAS,MAAMrB,UAAU;gBAC7BiB;gBACAX;gBACAa;gBACAG,QAAQ,IAAI,CAACA,MAAM;gBACnBR;YACF;YACA,OAAOO;QACT,EAAE,OAAOE,OAAO;YACdtB,SAAS,CAAC,0BAA0B,CAAC,EAAEsB;YACvC,IAAI,CAACD,MAAM,CAACC,KAAK,CACf1B,UAAU;gBAAC;gBAAO;aAAU,EAAE,CAAC,4BAA4B,EAAE0B,MAAMC,OAAO,EAAE,GAC5E;gBACEC,MAAM;YACR;QAEJ;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {devAction} from '../actions/dev/devAction.js'\nimport {devDebug} from '../actions/dev/devDebug.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\n\nexport class DevCommand extends SanityCommand<typeof DevCommand> {\n static override description = 'Start a local development server with live reloading'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> --load-in-dashboard',\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n description: 'Automatically update Sanity Studio dependencies',\n }),\n host: Flags.string({\n description: 'Local network interface to listen on (default: localhost)',\n }),\n 'load-in-dashboard': Flags.boolean({\n allowNo: true,\n description: 'Load the app/studio in the Sanity dashboard',\n }),\n port: Flags.string({\n description: 'TCP port to start server on (default: 3333)',\n }),\n }\n\n public async run(): Promise<{close?: () => Promise<void>}> {\n const {flags} = await this.parse(DevCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n const isApp = determineIsApp(cliConfig)\n\n // load-in-dashboard is defaulted to true for apps.\n if (isApp && flags['load-in-dashboard'] === undefined) {\n flags['load-in-dashboard'] = true\n } else if (flags['load-in-dashboard'] === undefined) {\n // For non-apps, load-in-dashboard is defaulted to false.\n flags['load-in-dashboard'] = false\n }\n\n try {\n const result = await devAction({\n cliConfig,\n flags,\n isApp,\n output: this.output,\n workDir,\n })\n return result\n } catch (error) {\n devDebug(`Failed to start dev server`, error)\n this.output.error(\n styleText(['red', 'bgBlack'], `Failed to start dev server: ${error.message}`),\n {\n exit: 1,\n },\n )\n }\n }\n}\n"],"names":["styleText","Flags","SanityCommand","devAction","devDebug","determineIsApp","DevCommand","description","examples","flags","boolean","allowNo","host","string","port","run","parse","workDir","getProjectRoot","directory","cliConfig","getCliConfig","isApp","undefined","result","output","error","message","exit"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,SAAS,QAAO,8BAA6B;AACrD,SAAQC,QAAQ,QAAO,6BAA4B;AACnD,SAAQC,cAAc,QAAO,4BAA2B;AAExD,OAAO,MAAMC,mBAAmBJ;IAC9B,OAAgBK,cAAc,uDAAsD;IAEpF,OAAgBC,WAAW;QACzB;QACA;QACA;KACD,CAAA;IAED,OAAgBC,QAAQ;QACtB,gBAAgBR,MAAMS,OAAO,CAAC;YAC5BC,SAAS;YACTJ,aAAa;QACf;QACAK,MAAMX,MAAMY,MAAM,CAAC;YACjBN,aAAa;QACf;QACA,qBAAqBN,MAAMS,OAAO,CAAC;YACjCC,SAAS;YACTJ,aAAa;QACf;QACAO,MAAMb,MAAMY,MAAM,CAAC;YACjBN,aAAa;QACf;IACF,EAAC;IAED,MAAaQ,MAA8C;QACzD,MAAM,EAACN,KAAK,EAAC,GAAG,MAAM,IAAI,CAACO,KAAK,CAACV;QAEjC,MAAMW,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QACvD,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,MAAMC,QAAQjB,eAAee;QAE7B,mDAAmD;QACnD,IAAIE,SAASb,KAAK,CAAC,oBAAoB,KAAKc,WAAW;YACrDd,KAAK,CAAC,oBAAoB,GAAG;QAC/B,OAAO,IAAIA,KAAK,CAAC,oBAAoB,KAAKc,WAAW;YACnD,yDAAyD;YACzDd,KAAK,CAAC,oBAAoB,GAAG;QAC/B;QAEA,IAAI;YACF,MAAMe,SAAS,MAAMrB,UAAU;gBAC7BiB;gBACAX;gBACAa;gBACAG,QAAQ,IAAI,CAACA,MAAM;gBACnBR;YACF;YACA,OAAOO;QACT,EAAE,OAAOE,OAAO;YACdtB,SAAS,CAAC,0BAA0B,CAAC,EAAEsB;YACvC,IAAI,CAACD,MAAM,CAACC,KAAK,CACf1B,UAAU;gBAAC;gBAAO;aAAU,EAAE,CAAC,4BAA4B,EAAE0B,MAAMC,OAAO,EAAE,GAC5E;gBACEC,MAAM;YACR;QAEJ;IACF;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { Command } from '@oclif/core';
2
2
  import open from 'open';
3
3
  export class DocsBrowseCommand extends Command {
4
- static description = 'Open Sanity docs in a web browser';
4
+ static description = 'Open Sanity docs in your browser';
5
5
  static flags = {};
6
6
  async run() {
7
7
  // Parse to ensure no invalid flags are passed
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/docs/browse.ts"],"sourcesContent":["import {Command} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport open from 'open'\n\nexport class DocsBrowseCommand extends Command {\n static override description = 'Open Sanity docs in a web browser'\n static override flags = {} satisfies FlagInput\n\n public async run(): Promise<void> {\n // Parse to ensure no invalid flags are passed\n await this.parse(DocsBrowseCommand)\n\n const url = 'https://www.sanity.io/docs'\n\n this.log(`Opening ${url}`)\n await open(url)\n }\n}\n"],"names":["Command","open","DocsBrowseCommand","description","flags","run","parse","url","log"],"mappings":"AAAA,SAAQA,OAAO,QAAO,cAAa;AAEnC,OAAOC,UAAU,OAAM;AAEvB,OAAO,MAAMC,0BAA0BF;IACrC,OAAgBG,cAAc,oCAAmC;IACjE,OAAgBC,QAAQ,CAAC,EAAqB;IAE9C,MAAaC,MAAqB;QAChC,8CAA8C;QAC9C,MAAM,IAAI,CAACC,KAAK,CAACJ;QAEjB,MAAMK,MAAM;QAEZ,IAAI,CAACC,GAAG,CAAC,CAAC,QAAQ,EAAED,KAAK;QACzB,MAAMN,KAAKM;IACb;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/docs/browse.ts"],"sourcesContent":["import {Command} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport open from 'open'\n\nexport class DocsBrowseCommand extends Command {\n static override description = 'Open Sanity docs in your browser'\n static override flags = {} satisfies FlagInput\n\n public async run(): Promise<void> {\n // Parse to ensure no invalid flags are passed\n await this.parse(DocsBrowseCommand)\n\n const url = 'https://www.sanity.io/docs'\n\n this.log(`Opening ${url}`)\n await open(url)\n }\n}\n"],"names":["Command","open","DocsBrowseCommand","description","flags","run","parse","url","log"],"mappings":"AAAA,SAAQA,OAAO,QAAO,cAAa;AAEnC,OAAOC,UAAU,OAAM;AAEvB,OAAO,MAAMC,0BAA0BF;IACrC,OAAgBG,cAAc,mCAAkC;IAChE,OAAgBC,QAAQ,CAAC,EAAqB;IAE9C,MAAaC,MAAqB;QAChC,8CAA8C;QAC9C,MAAM,IAAI,CAACC,KAAK,CAACJ;QAEjB,MAAMK,MAAM;QAEZ,IAAI,CAACC,GAAG,CAAC,CAAC,QAAQ,EAAED,KAAK;QACzB,MAAMN,KAAKM;IACb;AACF"}
@@ -15,7 +15,7 @@ export class DeleteDocumentCommand extends SanityCommand {
15
15
  required: false
16
16
  })
17
17
  };
18
- static description = 'Delete one or more documents from the projects configured dataset';
18
+ static description = "Delete one or more documents from the project's configured dataset";
19
19
  static examples = [
20
20
  {
21
21
  command: '<%= config.bin %> <%= command.id %> myDocId',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/documents/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteDocumentDebug = subdebug('documents:delete')\n\nexport class DeleteDocumentCommand extends SanityCommand<typeof DeleteDocumentCommand> {\n static override args = {\n id: Args.string({\n description: 'Document ID to delete',\n required: true,\n }),\n ids: Args.string({\n description: 'Additional document IDs to delete',\n required: false,\n }),\n }\n\n static override description = 'Delete one or more documents from the projects configured dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> myDocId',\n description: 'Delete the document with the ID \"myDocId\"',\n },\n {\n command: \"<%= config.bin %> <%= command.id %> 'myDocId'\",\n description: 'ID wrapped in double or single quote works equally well',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset=blog someDocId',\n description: 'Delete document with ID \"someDocId\" from dataset \"blog\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> doc1 doc2',\n description: 'Delete the document with ID \"doc1\" and \"doc2\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> myDocId --project-id abc123',\n description: 'Delete a document from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({description: 'Project ID to delete from', semantics: 'override'}),\n ...getDatasetFlag({description: 'Dataset to delete from', semantics: 'override'}),\n }\n\n static override hiddenAliases: string[] = ['document:delete']\n\n // Disable strict mode to allow for more flexible input\n // This is needed for supporting multiple document IDs\n static override strict = false\n\n public async run(): Promise<void> {\n const {args, argv, flags} = await this.parse(DeleteDocumentCommand)\n const {id} = args\n const {dataset} = flags\n\n // Collect all document IDs from args and argv\n const ids = [id, ...argv.slice(1)].filter(Boolean) as string[]\n\n if (ids.length === 0) {\n this.error('Document ID must be specified', {exit: 1})\n }\n\n // Get project configuration (may not exist when running outside a project directory)\n const cliConfig = await this.tryGetCliConfig()\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n\n try {\n const projectClient = await getProjectCliClient({\n apiVersion: DOCUMENTS_API_VERSION,\n dataset: targetDataset,\n projectId,\n requireUser: true,\n })\n\n const transaction = projectClient.transaction()\n for (const id of ids) {\n transaction.delete(id)\n }\n const {results} = await transaction.commit()\n const deleted = results.filter((res) => res.operation === 'delete').map((res) => res.id)\n const notFound = ids.filter((id) => !deleted.includes(id))\n\n if (deleted.length > 0) {\n this.log(`Deleted ${deleted.length} ${deleted.length === 1 ? 'document' : 'documents'}`)\n }\n\n if (notFound.length > 0) {\n this.error(\n `${notFound.length === 1 ? 'Document' : 'Documents'} not found: ${notFound.join(', ')}`,\n {\n exit: 1,\n },\n )\n }\n } catch (error) {\n const err = error as Error\n deleteDocumentDebug(`Error deleting documents ${ids.join(', ')}`, err)\n this.error(\n `Failed to delete ${ids.length} ${ids.length === 1 ? 'document' : 'documents'}: ${err.message}`,\n {\n exit: 1,\n },\n )\n }\n }\n}\n"],"names":["Args","getProjectCliClient","SanityCommand","subdebug","DOCUMENTS_API_VERSION","promptForProject","getDatasetFlag","getProjectIdFlag","deleteDocumentDebug","DeleteDocumentCommand","args","id","string","description","required","ids","examples","command","flags","semantics","hiddenAliases","strict","run","argv","parse","dataset","slice","filter","Boolean","length","error","exit","cliConfig","tryGetCliConfig","projectId","getProjectId","fallback","api","targetDataset","projectClient","apiVersion","requireUser","transaction","delete","results","commit","deleted","res","operation","map","notFound","includes","log","join","err","message"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/documents/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteDocumentDebug = subdebug('documents:delete')\n\nexport class DeleteDocumentCommand extends SanityCommand<typeof DeleteDocumentCommand> {\n static override args = {\n id: Args.string({\n description: 'Document ID to delete',\n required: true,\n }),\n ids: Args.string({\n description: 'Additional document IDs to delete',\n required: false,\n }),\n }\n\n static override description = \"Delete one or more documents from the project's configured dataset\"\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> myDocId',\n description: 'Delete the document with the ID \"myDocId\"',\n },\n {\n command: \"<%= config.bin %> <%= command.id %> 'myDocId'\",\n description: 'ID wrapped in double or single quote works equally well',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset=blog someDocId',\n description: 'Delete document with ID \"someDocId\" from dataset \"blog\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> doc1 doc2',\n description: 'Delete the document with ID \"doc1\" and \"doc2\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> myDocId --project-id abc123',\n description: 'Delete a document from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({description: 'Project ID to delete from', semantics: 'override'}),\n ...getDatasetFlag({description: 'Dataset to delete from', semantics: 'override'}),\n }\n\n static override hiddenAliases: string[] = ['document:delete']\n\n // Disable strict mode to allow for more flexible input\n // This is needed for supporting multiple document IDs\n static override strict = false\n\n public async run(): Promise<void> {\n const {args, argv, flags} = await this.parse(DeleteDocumentCommand)\n const {id} = args\n const {dataset} = flags\n\n // Collect all document IDs from args and argv\n const ids = [id, ...argv.slice(1)].filter(Boolean) as string[]\n\n if (ids.length === 0) {\n this.error('Document ID must be specified', {exit: 1})\n }\n\n // Get project configuration (may not exist when running outside a project directory)\n const cliConfig = await this.tryGetCliConfig()\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n\n try {\n const projectClient = await getProjectCliClient({\n apiVersion: DOCUMENTS_API_VERSION,\n dataset: targetDataset,\n projectId,\n requireUser: true,\n })\n\n const transaction = projectClient.transaction()\n for (const id of ids) {\n transaction.delete(id)\n }\n const {results} = await transaction.commit()\n const deleted = results.filter((res) => res.operation === 'delete').map((res) => res.id)\n const notFound = ids.filter((id) => !deleted.includes(id))\n\n if (deleted.length > 0) {\n this.log(`Deleted ${deleted.length} ${deleted.length === 1 ? 'document' : 'documents'}`)\n }\n\n if (notFound.length > 0) {\n this.error(\n `${notFound.length === 1 ? 'Document' : 'Documents'} not found: ${notFound.join(', ')}`,\n {\n exit: 1,\n },\n )\n }\n } catch (error) {\n const err = error as Error\n deleteDocumentDebug(`Error deleting documents ${ids.join(', ')}`, err)\n this.error(\n `Failed to delete ${ids.length} ${ids.length === 1 ? 'document' : 'documents'}: ${err.message}`,\n {\n exit: 1,\n },\n )\n }\n }\n}\n"],"names":["Args","getProjectCliClient","SanityCommand","subdebug","DOCUMENTS_API_VERSION","promptForProject","getDatasetFlag","getProjectIdFlag","deleteDocumentDebug","DeleteDocumentCommand","args","id","string","description","required","ids","examples","command","flags","semantics","hiddenAliases","strict","run","argv","parse","dataset","slice","filter","Boolean","length","error","exit","cliConfig","tryGetCliConfig","projectId","getProjectId","fallback","api","targetDataset","projectClient","apiVersion","requireUser","transaction","delete","results","commit","deleted","res","operation","map","notFound","includes","log","join","err","message"],"mappings":"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"}
@@ -31,11 +31,11 @@ export class ExecCommand extends SanityCommand {
31
31
  static flags = {
32
32
  'mock-browser-env': Flags.boolean({
33
33
  default: false,
34
- description: 'Mocks a browser-like environment using jsdom'
34
+ description: 'Mock a browser environment with jsdom'
35
35
  }),
36
36
  'with-user-token': Flags.boolean({
37
37
  default: false,
38
- description: 'Prime access token from CLI config into getCliClient()'
38
+ description: 'Include your auth token in getCliClient()'
39
39
  })
40
40
  };
41
41
  static strict = false;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/exec.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {execScript} from '../actions/exec/execScript.js'\n\nexport class ExecCommand extends SanityCommand<typeof ExecCommand> {\n static override args = {\n script: Args.file({\n description: 'Path to the script to execute',\n exists: true,\n required: true,\n }),\n }\n\n static override description = 'Executes a script within the Sanity Studio context'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> some/script.js',\n description: 'Run the script at some/script.js in Sanity context',\n },\n {\n command: '<%= config.bin %> <%= command.id %> migrations/fullname.ts --with-user-token',\n description:\n \"Run the script at migrations/fullname.ts and configure `getCliClient()` from `sanity/cli` to include the current user's token\",\n },\n {\n command: '<%= config.bin %> <%= command.id %> scripts/browserScript.js --mock-browser-env',\n description: 'Run the script at scripts/browserScript.js in a mock browser environment',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --mock-browser-env myscript.js -- --dry-run positional-argument',\n description:\n \"Pass arbitrary arguments to scripts by separating them with a `--`. Arguments are available in `process.argv` as they would in regular node scripts (eg the following command would yield a `process.argv` of: `['/path/to/node', '/path/to/myscript.js', '--dry-run', 'positional-argument']`)\",\n },\n ]\n\n static override flags = {\n 'mock-browser-env': Flags.boolean({\n default: false,\n description: 'Mocks a browser-like environment using jsdom',\n }),\n 'with-user-token': Flags.boolean({\n default: false,\n description: 'Prime access token from CLI config into getCliClient()',\n }),\n }\n\n static override strict = false\n\n public async run(): Promise<void> {\n const {args, argv, flags} = await this.parse(ExecCommand)\n const {directory: workDir} = await this.getProjectRoot()\n\n await execScript({\n extraArguments: (argv as string[]).slice(1), // Remove the script path from argv\n flags,\n scriptPath: args.script,\n workDir,\n })\n }\n}\n"],"names":["Args","Flags","SanityCommand","execScript","ExecCommand","args","script","file","description","exists","required","examples","command","flags","boolean","default","strict","run","argv","parse","directory","workDir","getProjectRoot","extraArguments","slice","scriptPath"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,UAAU,QAAO,gCAA+B;AAExD,OAAO,MAAMC,oBAAoBF;IAC/B,OAAgBG,OAAO;QACrBC,QAAQN,KAAKO,IAAI,CAAC;YAChBC,aAAa;YACbC,QAAQ;YACRC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBF,cAAc,qDAAoD;IAElF,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aACE;QACJ;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SACE;YACFJ,aACE;QACJ;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtB,oBAAoBZ,MAAMa,OAAO,CAAC;YAChCC,SAAS;YACTP,aAAa;QACf;QACA,mBAAmBP,MAAMa,OAAO,CAAC;YAC/BC,SAAS;YACTP,aAAa;QACf;IACF,EAAC;IAED,OAAgBQ,SAAS,MAAK;IAE9B,MAAaC,MAAqB;QAChC,MAAM,EAACZ,IAAI,EAAEa,IAAI,EAAEL,KAAK,EAAC,GAAG,MAAM,IAAI,CAACM,KAAK,CAACf;QAC7C,MAAM,EAACgB,WAAWC,OAAO,EAAC,GAAG,MAAM,IAAI,CAACC,cAAc;QAEtD,MAAMnB,WAAW;YACfoB,gBAAgB,AAACL,KAAkBM,KAAK,CAAC;YACzCX;YACAY,YAAYpB,KAAKC,MAAM;YACvBe;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/commands/exec.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {execScript} from '../actions/exec/execScript.js'\n\nexport class ExecCommand extends SanityCommand<typeof ExecCommand> {\n static override args = {\n script: Args.file({\n description: 'Path to the script to execute',\n exists: true,\n required: true,\n }),\n }\n\n static override description = 'Executes a script within the Sanity Studio context'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> some/script.js',\n description: 'Run the script at some/script.js in Sanity context',\n },\n {\n command: '<%= config.bin %> <%= command.id %> migrations/fullname.ts --with-user-token',\n description:\n \"Run the script at migrations/fullname.ts and configure `getCliClient()` from `sanity/cli` to include the current user's token\",\n },\n {\n command: '<%= config.bin %> <%= command.id %> scripts/browserScript.js --mock-browser-env',\n description: 'Run the script at scripts/browserScript.js in a mock browser environment',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --mock-browser-env myscript.js -- --dry-run positional-argument',\n description:\n \"Pass arbitrary arguments to scripts by separating them with a `--`. Arguments are available in `process.argv` as they would in regular node scripts (eg the following command would yield a `process.argv` of: `['/path/to/node', '/path/to/myscript.js', '--dry-run', 'positional-argument']`)\",\n },\n ]\n\n static override flags = {\n 'mock-browser-env': Flags.boolean({\n default: false,\n description: 'Mock a browser environment with jsdom',\n }),\n 'with-user-token': Flags.boolean({\n default: false,\n description: 'Include your auth token in getCliClient()',\n }),\n }\n\n static override strict = false\n\n public async run(): Promise<void> {\n const {args, argv, flags} = await this.parse(ExecCommand)\n const {directory: workDir} = await this.getProjectRoot()\n\n await execScript({\n extraArguments: (argv as string[]).slice(1), // Remove the script path from argv\n flags,\n scriptPath: args.script,\n workDir,\n })\n }\n}\n"],"names":["Args","Flags","SanityCommand","execScript","ExecCommand","args","script","file","description","exists","required","examples","command","flags","boolean","default","strict","run","argv","parse","directory","workDir","getProjectRoot","extraArguments","slice","scriptPath"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,UAAU,QAAO,gCAA+B;AAExD,OAAO,MAAMC,oBAAoBF;IAC/B,OAAgBG,OAAO;QACrBC,QAAQN,KAAKO,IAAI,CAAC;YAChBC,aAAa;YACbC,QAAQ;YACRC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBF,cAAc,qDAAoD;IAElF,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aACE;QACJ;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SACE;YACFJ,aACE;QACJ;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtB,oBAAoBZ,MAAMa,OAAO,CAAC;YAChCC,SAAS;YACTP,aAAa;QACf;QACA,mBAAmBP,MAAMa,OAAO,CAAC;YAC/BC,SAAS;YACTP,aAAa;QACf;IACF,EAAC;IAED,OAAgBQ,SAAS,MAAK;IAE9B,MAAaC,MAAqB;QAChC,MAAM,EAACZ,IAAI,EAAEa,IAAI,EAAEL,KAAK,EAAC,GAAG,MAAM,IAAI,CAACM,KAAK,CAACf;QAC7C,MAAM,EAACgB,WAAWC,OAAO,EAAC,GAAG,MAAM,IAAI,CAACC,cAAc;QAEtD,MAAMnB,WAAW;YACfoB,gBAAgB,AAACL,KAAkBM,KAAK,CAAC;YACzCX;YACAY,YAAYpB,KAAKC,MAAM;YACvBe;QACF;IACF;AACF"}
@@ -45,7 +45,7 @@ export class GraphQLDeployCommand extends SanityCommand {
45
45
  ];
46
46
  static flags = {
47
47
  api: Flags.string({
48
- description: 'Only deploy API with this ID. Can be specified multiple times.',
48
+ description: 'Only deploy API with this ID (can be specified multiple times)',
49
49
  multiple: true
50
50
  }),
51
51
  ...getDatasetFlag({
@@ -78,7 +78,7 @@ export class GraphQLDeployCommand extends SanityCommand {
78
78
  description: 'Deploy API(s) to given tag (defaults to "default")'
79
79
  }),
80
80
  'with-union-cache': Flags.boolean({
81
- description: 'Enable union cache that optimizes schema generation for schemas with many self referencing types'
81
+ description: 'Cache union types (faster for schemas with many self-references)'
82
82
  })
83
83
  };
84
84
  async run() {