@sanity/cli 6.0.0-alpha.9 → 6.0.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 (600) hide show
  1. package/README.md +602 -258
  2. package/bin/run.js +2 -0
  3. package/dist/SanityHelp.js +51 -23
  4. package/dist/SanityHelp.js.map +1 -1
  5. package/dist/actions/auth/authServer.js +28 -22
  6. package/dist/actions/auth/authServer.js.map +1 -1
  7. package/dist/actions/auth/login/getProvider.js +49 -38
  8. package/dist/actions/auth/login/getProvider.js.map +1 -1
  9. package/dist/actions/auth/login/getSSOProvider.js +25 -19
  10. package/dist/actions/auth/login/getSSOProvider.js.map +1 -1
  11. package/dist/actions/auth/login/login.js +12 -33
  12. package/dist/actions/auth/login/login.js.map +1 -1
  13. package/dist/actions/auth/types.js.map +1 -1
  14. package/dist/actions/backup/downloadAsset.js +9 -9
  15. package/dist/actions/backup/downloadAsset.js.map +1 -1
  16. package/dist/actions/backup/downloadDocument.js +8 -8
  17. package/dist/actions/backup/downloadDocument.js.map +1 -1
  18. package/dist/actions/build/buildApp.js +55 -18
  19. package/dist/actions/build/buildApp.js.map +1 -1
  20. package/dist/actions/build/buildStaticFiles.js +3 -2
  21. package/dist/actions/build/buildStaticFiles.js.map +1 -1
  22. package/dist/actions/build/buildStudio.js +72 -44
  23. package/dist/actions/build/buildStudio.js.map +1 -1
  24. package/dist/actions/build/buildVendorDependencies.js +18 -52
  25. package/dist/actions/build/buildVendorDependencies.js.map +1 -1
  26. package/dist/actions/build/checkRequiredDependencies.js +13 -8
  27. package/dist/actions/build/checkRequiredDependencies.js.map +1 -1
  28. package/dist/actions/build/checkStudioDependencyVersions.js +19 -17
  29. package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -1
  30. package/dist/actions/build/createExternalFromImportMap.js +1 -1
  31. package/dist/actions/build/createExternalFromImportMap.js.map +1 -1
  32. package/dist/actions/build/determineBasePath.js +5 -2
  33. package/dist/actions/build/determineBasePath.js.map +1 -1
  34. package/dist/actions/build/getViteConfig.js +47 -4
  35. package/dist/actions/build/getViteConfig.js.map +1 -1
  36. package/dist/actions/build/handlePrereleaseVersions.js +44 -0
  37. package/dist/actions/build/handlePrereleaseVersions.js.map +1 -0
  38. package/dist/actions/build/renderDocument.js +6 -10
  39. package/dist/actions/build/renderDocument.js.map +1 -1
  40. package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js +4 -4
  41. package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js.map +1 -1
  42. package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js +3 -3
  43. package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js.map +1 -1
  44. package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js +1 -0
  45. package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js.map +1 -1
  46. package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js +2 -2
  47. package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js.map +1 -1
  48. package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js +1 -1
  49. package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js.map +1 -1
  50. package/dist/actions/build/shouldAutoUpdate.js +2 -0
  51. package/dist/actions/build/shouldAutoUpdate.js.map +1 -1
  52. package/dist/actions/build/types.js.map +1 -1
  53. package/dist/actions/build/writeFavicons.js +3 -5
  54. package/dist/actions/build/writeFavicons.js.map +1 -1
  55. package/dist/actions/build/writeSanityRuntime.js +4 -3
  56. package/dist/actions/build/writeSanityRuntime.js.map +1 -1
  57. package/dist/actions/codemods/reactIconsV3.js +2 -2
  58. package/dist/actions/codemods/reactIconsV3.js.map +1 -1
  59. package/dist/actions/dataset/create.js +7 -1
  60. package/dist/actions/dataset/create.js.map +1 -1
  61. package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -1
  62. package/dist/actions/dataset/resolveDataset.js +26 -0
  63. package/dist/actions/dataset/resolveDataset.js.map +1 -0
  64. package/dist/actions/debug/formatters.js +22 -0
  65. package/dist/actions/debug/formatters.js.map +1 -0
  66. package/dist/actions/deploy/createStudioUserApplication.js +17 -4
  67. package/dist/actions/deploy/createStudioUserApplication.js.map +1 -1
  68. package/dist/actions/deploy/deployApp.js +41 -15
  69. package/dist/actions/deploy/deployApp.js.map +1 -1
  70. package/dist/actions/deploy/deployStudio.js +92 -44
  71. package/dist/actions/deploy/deployStudio.js.map +1 -1
  72. package/dist/actions/deploy/deployStudioSchemasAndManifests.js +55 -0
  73. package/dist/actions/deploy/deployStudioSchemasAndManifests.js.map +1 -0
  74. package/dist/actions/deploy/deployStudioSchemasAndManifests.worker.js +120 -0
  75. package/dist/actions/deploy/deployStudioSchemasAndManifests.worker.js.map +1 -0
  76. package/dist/actions/deploy/findUserApplicationForStudio.js +35 -12
  77. package/dist/actions/deploy/findUserApplicationForStudio.js.map +1 -1
  78. package/dist/actions/deploy/types.js +10 -1
  79. package/dist/actions/deploy/types.js.map +1 -1
  80. package/dist/actions/deploy/urlUtils.js +21 -0
  81. package/dist/actions/deploy/urlUtils.js.map +1 -0
  82. package/dist/actions/dev/getDashboardAppUrl.js +48 -0
  83. package/dist/actions/dev/getDashboardAppUrl.js.map +1 -0
  84. package/dist/actions/dev/getDevServerConfig.js +7 -3
  85. package/dist/actions/dev/getDevServerConfig.js.map +1 -1
  86. package/dist/actions/dev/startAppDevServer.js +3 -3
  87. package/dist/actions/dev/startAppDevServer.js.map +1 -1
  88. package/dist/actions/dev/startStudioDevServer.js +14 -14
  89. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  90. package/dist/actions/doctor/checks/cliInstallation.js +56 -0
  91. package/dist/actions/doctor/checks/cliInstallation.js.map +1 -0
  92. package/dist/actions/doctor/checks/index.js +16 -0
  93. package/dist/actions/doctor/checks/index.js.map +1 -0
  94. package/dist/actions/doctor/runDoctorChecks.js +56 -0
  95. package/dist/actions/doctor/runDoctorChecks.js.map +1 -0
  96. package/dist/actions/doctor/types.js +3 -0
  97. package/dist/actions/doctor/types.js.map +1 -0
  98. package/dist/actions/documents/types.js.map +1 -1
  99. package/dist/actions/documents/validate.js +11 -2
  100. package/dist/actions/documents/validate.js.map +1 -1
  101. package/dist/actions/documents/validateDocuments.worker.js +4 -4
  102. package/dist/actions/documents/validateDocuments.worker.js.map +1 -1
  103. package/dist/actions/documents/validation/reporters/jsonReporter.js +1 -1
  104. package/dist/actions/documents/validation/reporters/jsonReporter.js.map +1 -1
  105. package/dist/actions/documents/validation/reporters/ndjsonReporter.js +1 -1
  106. package/dist/actions/documents/validation/reporters/ndjsonReporter.js.map +1 -1
  107. package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js +1 -1
  108. package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js.map +1 -1
  109. package/dist/actions/documents/validation/reporters/prettyReporter/tree.js +108 -0
  110. package/dist/actions/documents/validation/reporters/prettyReporter/tree.js.map +1 -0
  111. package/dist/actions/graphql/SchemaError.js +4 -26
  112. package/dist/actions/graphql/SchemaError.js.map +1 -1
  113. package/dist/actions/graphql/__tests__/fixtures/many-self-refs.js +540 -0
  114. package/dist/actions/graphql/__tests__/fixtures/many-self-refs.js.map +1 -0
  115. package/dist/actions/graphql/__tests__/fixtures/test-studio.js +1143 -0
  116. package/dist/actions/graphql/__tests__/fixtures/test-studio.js.map +1 -0
  117. package/dist/actions/graphql/__tests__/fixtures/union-refs.js +591 -0
  118. package/dist/actions/graphql/__tests__/fixtures/union-refs.js.map +1 -0
  119. package/dist/actions/graphql/__tests__/helpers.js +23 -0
  120. package/dist/actions/graphql/__tests__/helpers.js.map +1 -0
  121. package/dist/actions/graphql/extractFromSanitySchema.js +5 -5
  122. package/dist/actions/graphql/extractFromSanitySchema.js.map +1 -1
  123. package/dist/actions/graphql/extractGraphQLAPIs.js +150 -0
  124. package/dist/actions/graphql/extractGraphQLAPIs.js.map +1 -0
  125. package/dist/actions/graphql/extractGraphQLAPIs.worker.js +12 -0
  126. package/dist/actions/graphql/extractGraphQLAPIs.worker.js.map +1 -0
  127. package/dist/actions/graphql/gen1/generateTypeFilters.js +1 -1
  128. package/dist/actions/graphql/gen1/generateTypeFilters.js.map +1 -1
  129. package/dist/actions/graphql/gen1/generateTypeQueries.js +2 -1
  130. package/dist/actions/graphql/gen1/generateTypeQueries.js.map +1 -1
  131. package/dist/actions/graphql/gen1/index.js +5 -5
  132. package/dist/actions/graphql/gen1/index.js.map +1 -1
  133. package/dist/actions/graphql/gen2/generateTypeQueries.js +1 -1
  134. package/dist/actions/graphql/gen2/generateTypeQueries.js.map +1 -1
  135. package/dist/actions/graphql/gen2/index.js +6 -6
  136. package/dist/actions/graphql/gen2/index.js.map +1 -1
  137. package/dist/actions/graphql/gen3/generateTypeQueries.js +3 -4
  138. package/dist/actions/graphql/gen3/generateTypeQueries.js.map +1 -1
  139. package/dist/actions/graphql/gen3/index.js +6 -7
  140. package/dist/actions/graphql/gen3/index.js.map +1 -1
  141. package/dist/actions/graphql/getGraphQLAPIs.js +15 -57
  142. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  143. package/dist/actions/graphql/getGraphQLAPIs.worker.js +75 -106
  144. package/dist/actions/graphql/getGraphQLAPIs.worker.js.map +1 -1
  145. package/dist/actions/graphql/helpers.js +13 -0
  146. package/dist/actions/graphql/helpers.js.map +1 -1
  147. package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js +187 -0
  148. package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js.map +1 -0
  149. package/dist/actions/graphql/types.js +1 -1
  150. package/dist/actions/graphql/types.js.map +1 -1
  151. package/dist/actions/init/bootstrapLocalTemplate.js +10 -8
  152. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
  153. package/dist/actions/init/bootstrapRemoteTemplate.js +6 -5
  154. package/dist/actions/init/bootstrapRemoteTemplate.js.map +1 -1
  155. package/dist/actions/init/bootstrapTemplate.js.map +1 -1
  156. package/dist/actions/init/checkNextJsReactCompatibility.js +1 -1
  157. package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -1
  158. package/dist/actions/init/createAppCliConfig.js.map +1 -1
  159. package/dist/actions/init/createCliConfig.js.map +1 -1
  160. package/dist/actions/init/createPackageManifest.js +21 -9
  161. package/dist/actions/init/createPackageManifest.js.map +1 -1
  162. package/dist/actions/init/remoteTemplate.js +1 -2
  163. package/dist/actions/init/remoteTemplate.js.map +1 -1
  164. package/dist/actions/init/sdkAppDependencies.js +19 -0
  165. package/dist/actions/init/sdkAppDependencies.js.map +1 -0
  166. package/dist/actions/init/studioDependencies.js.map +1 -0
  167. package/dist/actions/init/templates/appQuickstart.js +1 -22
  168. package/dist/actions/init/templates/appQuickstart.js.map +1 -1
  169. package/dist/actions/init/templates/appSanityUi.js +3 -22
  170. package/dist/actions/init/templates/appSanityUi.js.map +1 -1
  171. package/dist/actions/init/types.js.map +1 -1
  172. package/dist/actions/manifest/SchemaIcon.js +6 -4
  173. package/dist/actions/manifest/SchemaIcon.js.map +1 -1
  174. package/dist/actions/manifest/blockTypeTransformer.js +67 -0
  175. package/dist/actions/manifest/blockTypeTransformer.js.map +1 -0
  176. package/dist/actions/manifest/debug.js +4 -0
  177. package/dist/actions/manifest/debug.js.map +1 -0
  178. package/dist/actions/manifest/extractAppManifest.js +39 -22
  179. package/dist/actions/manifest/extractAppManifest.js.map +1 -1
  180. package/dist/actions/manifest/extractManifest.js +27 -78
  181. package/dist/actions/manifest/extractManifest.js.map +1 -1
  182. package/dist/actions/manifest/extractManifest.worker.js +30 -0
  183. package/dist/actions/manifest/extractManifest.worker.js.map +1 -0
  184. package/dist/actions/manifest/extractWorkspaceManifest.js +31 -372
  185. package/dist/actions/manifest/extractWorkspaceManifest.js.map +1 -1
  186. package/dist/actions/manifest/iconResolver.js +30 -0
  187. package/dist/actions/manifest/iconResolver.js.map +1 -0
  188. package/dist/actions/manifest/referenceTransformer.js +51 -0
  189. package/dist/actions/manifest/referenceTransformer.js.map +1 -0
  190. package/dist/actions/manifest/schemaTypeHelpers.js +2 -2
  191. package/dist/actions/manifest/schemaTypeHelpers.js.map +1 -1
  192. package/dist/actions/manifest/schemaTypeTransformer.js +168 -0
  193. package/dist/actions/manifest/schemaTypeTransformer.js.map +1 -0
  194. package/dist/actions/manifest/transformerUtils.js +40 -0
  195. package/dist/actions/manifest/transformerUtils.js.map +1 -0
  196. package/dist/actions/manifest/types.js +5 -0
  197. package/dist/actions/manifest/types.js.map +1 -1
  198. package/dist/actions/manifest/validationTransformer.js +84 -0
  199. package/dist/actions/manifest/validationTransformer.js.map +1 -0
  200. package/dist/actions/manifest/writeManifestFile.js +30 -0
  201. package/dist/actions/manifest/writeManifestFile.js.map +1 -0
  202. package/dist/actions/manifest/writeWorkspaceFiles.js +30 -0
  203. package/dist/actions/manifest/writeWorkspaceFiles.js.map +1 -0
  204. package/dist/actions/mcp/detectAvailableEditors.js +16 -4
  205. package/dist/actions/mcp/detectAvailableEditors.js.map +1 -1
  206. package/dist/actions/mcp/editorConfigs.js +64 -6
  207. package/dist/actions/mcp/editorConfigs.js.map +1 -1
  208. package/dist/actions/mcp/setupMCP.js.map +1 -1
  209. package/dist/actions/mcp/writeMCPConfig.js +27 -15
  210. package/dist/actions/mcp/writeMCPConfig.js.map +1 -1
  211. package/dist/actions/media/buildNdjsonIndex.js +32 -0
  212. package/dist/actions/media/buildNdjsonIndex.js.map +1 -0
  213. package/dist/actions/media/importAspects.js +2 -11
  214. package/dist/actions/media/importAspects.js.map +1 -1
  215. package/dist/actions/media/importMedia.js +22 -18
  216. package/dist/actions/media/importMedia.js.map +1 -1
  217. package/dist/actions/organizations/findOrganizationByUserName.js +5 -0
  218. package/dist/actions/organizations/findOrganizationByUserName.js.map +1 -0
  219. package/dist/actions/organizations/getOrganization.js +3 -2
  220. package/dist/actions/organizations/getOrganization.js.map +1 -1
  221. package/dist/actions/organizations/getOrganizationChoices.js +27 -19
  222. package/dist/actions/organizations/getOrganizationChoices.js.map +1 -1
  223. package/dist/actions/organizations/types.js +3 -0
  224. package/dist/actions/organizations/types.js.map +1 -0
  225. package/dist/actions/projects/getManageUrl.js +1 -2
  226. package/dist/actions/projects/getManageUrl.js.map +1 -1
  227. package/dist/actions/schema/deleteSchemaAction.js +14 -30
  228. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  229. package/dist/actions/schema/deploySchemas.js +22 -91
  230. package/dist/actions/schema/deploySchemas.js.map +1 -1
  231. package/dist/actions/schema/extractSanitySchema.worker.js +0 -5
  232. package/dist/actions/schema/extractSanitySchema.worker.js.map +1 -1
  233. package/dist/actions/schema/extractSanityWorkspace.worker.js +24 -0
  234. package/dist/actions/schema/extractSanityWorkspace.worker.js.map +1 -0
  235. package/dist/actions/schema/extractSchema.js +8 -40
  236. package/dist/actions/schema/extractSchema.js.map +1 -1
  237. package/dist/actions/schema/extractSchemaWatcher.js +128 -0
  238. package/dist/actions/schema/extractSchemaWatcher.js.map +1 -0
  239. package/dist/actions/schema/formatSchemaValidation.js +5 -1
  240. package/dist/actions/schema/formatSchemaValidation.js.map +1 -1
  241. package/dist/actions/schema/getExtractOptions.js +16 -0
  242. package/dist/actions/schema/getExtractOptions.js.map +1 -0
  243. package/dist/actions/schema/listSchemas.js +53 -56
  244. package/dist/actions/schema/listSchemas.js.map +1 -1
  245. package/dist/actions/schema/matchSchemaPattern.js +22 -0
  246. package/dist/actions/schema/matchSchemaPattern.js.map +1 -0
  247. package/dist/actions/schema/runSchemaExtraction.js +39 -0
  248. package/dist/actions/schema/runSchemaExtraction.js.map +1 -0
  249. package/dist/actions/schema/types.js +8 -0
  250. package/dist/actions/schema/types.js.map +1 -1
  251. package/dist/actions/schema/uniqueWorkspaces.worker.js +24 -0
  252. package/dist/actions/schema/uniqueWorkspaces.worker.js.map +1 -0
  253. package/dist/actions/schema/updateWorkspaceSchema.js +63 -0
  254. package/dist/actions/schema/updateWorkspaceSchema.js.map +1 -0
  255. package/dist/actions/schema/uploadSchemaToLexicon.js +87 -0
  256. package/dist/actions/schema/uploadSchemaToLexicon.js.map +1 -0
  257. package/dist/actions/schema/utils/SchemaExtractionError.js +10 -0
  258. package/dist/actions/schema/utils/SchemaExtractionError.js.map +1 -0
  259. package/dist/actions/schema/utils/schemaStoreValidation.js +1 -15
  260. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  261. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +1 -1
  262. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -1
  263. package/dist/actions/schema/validateSchema.worker.js +1 -8
  264. package/dist/actions/schema/validateSchema.worker.js.map +1 -1
  265. package/dist/actions/schema/watchExtractSchema.js +72 -0
  266. package/dist/actions/schema/watchExtractSchema.js.map +1 -0
  267. package/dist/actions/telemetry/isTrueish.js +10 -0
  268. package/dist/actions/telemetry/isTrueish.js.map +1 -0
  269. package/dist/actions/telemetry/resolveConsent.js +2 -1
  270. package/dist/actions/telemetry/resolveConsent.js.map +1 -1
  271. package/dist/actions/telemetry/setConsent.js +2 -1
  272. package/dist/actions/telemetry/setConsent.js.map +1 -1
  273. package/dist/actions/users/getMembersForProject.js.map +1 -1
  274. package/dist/actions/users/getPendingInvitations.js +1 -1
  275. package/dist/actions/users/getPendingInvitations.js.map +1 -1
  276. package/dist/actions/users/types.js.map +1 -1
  277. package/dist/actions/versions/filterSanityModules.js.map +1 -1
  278. package/dist/actions/versions/findSanityModulesVersions.js +2 -3
  279. package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
  280. package/dist/actions/versions/getFormatters.js +1 -1
  281. package/dist/actions/versions/getFormatters.js.map +1 -1
  282. package/dist/actions/versions/tryFindLatestVersion.js +1 -1
  283. package/dist/actions/versions/tryFindLatestVersion.js.map +1 -1
  284. package/dist/commands/backup/disable.js +22 -7
  285. package/dist/commands/backup/disable.js.map +1 -1
  286. package/dist/commands/backup/download.js +19 -10
  287. package/dist/commands/backup/download.js.map +1 -1
  288. package/dist/commands/backup/enable.js +22 -7
  289. package/dist/commands/backup/enable.js.map +1 -1
  290. package/dist/commands/backup/list.js +20 -8
  291. package/dist/commands/backup/list.js.map +1 -1
  292. package/dist/commands/build.js +2 -5
  293. package/dist/commands/build.js.map +1 -1
  294. package/dist/commands/cors/add.js +20 -7
  295. package/dist/commands/cors/add.js.map +1 -1
  296. package/dist/commands/cors/delete.js +22 -7
  297. package/dist/commands/cors/delete.js.map +1 -1
  298. package/dist/commands/cors/list.js +22 -7
  299. package/dist/commands/cors/list.js.map +1 -1
  300. package/dist/commands/dataset/alias/create.js +26 -7
  301. package/dist/commands/dataset/alias/create.js.map +1 -1
  302. package/dist/commands/dataset/alias/delete.js +20 -7
  303. package/dist/commands/dataset/alias/delete.js.map +1 -1
  304. package/dist/commands/dataset/alias/link.js +20 -7
  305. package/dist/commands/dataset/alias/link.js.map +1 -1
  306. package/dist/commands/dataset/alias/unlink.js +20 -7
  307. package/dist/commands/dataset/alias/unlink.js.map +1 -1
  308. package/dist/commands/dataset/copy.js +45 -30
  309. package/dist/commands/dataset/copy.js.map +1 -1
  310. package/dist/commands/dataset/create.js +32 -7
  311. package/dist/commands/dataset/create.js.map +1 -1
  312. package/dist/commands/dataset/delete.js +16 -7
  313. package/dist/commands/dataset/delete.js.map +1 -1
  314. package/dist/commands/dataset/embeddings/disable.js +77 -0
  315. package/dist/commands/dataset/embeddings/disable.js.map +1 -0
  316. package/dist/commands/dataset/embeddings/enable.js +141 -0
  317. package/dist/commands/dataset/embeddings/enable.js.map +1 -0
  318. package/dist/commands/dataset/embeddings/status.js +72 -0
  319. package/dist/commands/dataset/embeddings/status.js.map +1 -0
  320. package/dist/commands/dataset/export.js +25 -16
  321. package/dist/commands/dataset/export.js.map +1 -1
  322. package/dist/commands/dataset/import.js +306 -1
  323. package/dist/commands/dataset/import.js.map +1 -1
  324. package/dist/commands/dataset/list.js +22 -7
  325. package/dist/commands/dataset/list.js.map +1 -1
  326. package/dist/commands/dataset/visibility/get.js +18 -7
  327. package/dist/commands/dataset/visibility/get.js.map +1 -1
  328. package/dist/commands/dataset/visibility/set.js +22 -7
  329. package/dist/commands/dataset/visibility/set.js.map +1 -1
  330. package/dist/commands/debug.js +4 -2
  331. package/dist/commands/debug.js.map +1 -1
  332. package/dist/commands/deploy.js +22 -11
  333. package/dist/commands/deploy.js.map +1 -1
  334. package/dist/commands/dev.js +2 -4
  335. package/dist/commands/dev.js.map +1 -1
  336. package/dist/commands/doctor.js +125 -0
  337. package/dist/commands/doctor.js.map +1 -0
  338. package/dist/commands/documents/create.js +19 -12
  339. package/dist/commands/documents/create.js.map +1 -1
  340. package/dist/commands/documents/delete.js +19 -12
  341. package/dist/commands/documents/delete.js.map +1 -1
  342. package/dist/commands/documents/get.js +17 -12
  343. package/dist/commands/documents/get.js.map +1 -1
  344. package/dist/commands/documents/query.js +26 -18
  345. package/dist/commands/documents/query.js.map +1 -1
  346. package/dist/commands/documents/validate.js +32 -10
  347. package/dist/commands/documents/validate.js.map +1 -1
  348. package/dist/commands/graphql/deploy.js +58 -30
  349. package/dist/commands/graphql/deploy.js.map +1 -1
  350. package/dist/commands/graphql/list.js +15 -7
  351. package/dist/commands/graphql/list.js.map +1 -1
  352. package/dist/commands/graphql/undeploy.js +37 -19
  353. package/dist/commands/graphql/undeploy.js.map +1 -1
  354. package/dist/commands/hook/attempt.js +22 -7
  355. package/dist/commands/hook/attempt.js.map +1 -1
  356. package/dist/commands/hook/create.js +23 -8
  357. package/dist/commands/hook/create.js.map +1 -1
  358. package/dist/commands/hook/delete.js +22 -7
  359. package/dist/commands/hook/delete.js.map +1 -1
  360. package/dist/commands/hook/list.js +22 -7
  361. package/dist/commands/hook/list.js.map +1 -1
  362. package/dist/commands/hook/logs.js +21 -8
  363. package/dist/commands/hook/logs.js.map +1 -1
  364. package/dist/commands/init.js +46 -28
  365. package/dist/commands/init.js.map +1 -1
  366. package/dist/commands/login.js +19 -6
  367. package/dist/commands/login.js.map +1 -1
  368. package/dist/commands/logout.js +8 -6
  369. package/dist/commands/logout.js.map +1 -1
  370. package/dist/commands/manage.js +0 -1
  371. package/dist/commands/manage.js.map +1 -1
  372. package/dist/commands/manifest/extract.js +14 -10
  373. package/dist/commands/manifest/extract.js.map +1 -1
  374. package/dist/commands/mcp/configure.js +1 -1
  375. package/dist/commands/mcp/configure.js.map +1 -1
  376. package/dist/commands/media/create-aspect.js +4 -4
  377. package/dist/commands/media/create-aspect.js.map +1 -1
  378. package/dist/commands/media/delete-aspect.js +9 -7
  379. package/dist/commands/media/delete-aspect.js.map +1 -1
  380. package/dist/commands/media/deploy-aspect.js +22 -9
  381. package/dist/commands/media/deploy-aspect.js.map +1 -1
  382. package/dist/commands/media/export.js +9 -7
  383. package/dist/commands/media/export.js.map +1 -1
  384. package/dist/commands/media/import.js +10 -8
  385. package/dist/commands/media/import.js.map +1 -1
  386. package/dist/commands/preview.js +2 -4
  387. package/dist/commands/preview.js.map +1 -1
  388. package/dist/commands/projects/list.js +2 -1
  389. package/dist/commands/projects/list.js.map +1 -1
  390. package/dist/commands/schema/delete.js +33 -34
  391. package/dist/commands/schema/delete.js.map +1 -1
  392. package/dist/commands/schema/deploy.js +19 -30
  393. package/dist/commands/schema/deploy.js.map +1 -1
  394. package/dist/commands/schema/extract.js +32 -4
  395. package/dist/commands/schema/extract.js.map +1 -1
  396. package/dist/commands/schema/list.js +10 -31
  397. package/dist/commands/schema/list.js.map +1 -1
  398. package/dist/commands/tokens/add.js +24 -7
  399. package/dist/commands/tokens/add.js.map +1 -1
  400. package/dist/commands/tokens/delete.js +20 -7
  401. package/dist/commands/tokens/delete.js.map +1 -1
  402. package/dist/commands/tokens/list.js +20 -7
  403. package/dist/commands/tokens/list.js.map +1 -1
  404. package/dist/commands/users/invite.js +24 -7
  405. package/dist/commands/users/invite.js.map +1 -1
  406. package/dist/commands/users/list.js +76 -33
  407. package/dist/commands/users/list.js.map +1 -1
  408. package/dist/commands/versions.js +1 -1
  409. package/dist/commands/versions.js.map +1 -1
  410. package/dist/config/createCliConfig.js +1 -2
  411. package/dist/config/createCliConfig.js.map +1 -1
  412. package/dist/exports/_internal.d.ts +132 -0
  413. package/dist/exports/_internal.js +4 -0
  414. package/dist/exports/_internal.js.map +1 -0
  415. package/dist/exports/index.d.ts +113 -0
  416. package/dist/exports/index.js +6 -0
  417. package/dist/exports/index.js.map +1 -0
  418. package/dist/hooks/init/checkForUpdates.js +14 -0
  419. package/dist/hooks/init/checkForUpdates.js.map +1 -0
  420. package/dist/hooks/prerun/flushTelemetry.worker.js +1 -1
  421. package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -1
  422. package/dist/hooks/prerun/injectEnvVariables.js +9 -1
  423. package/dist/hooks/prerun/injectEnvVariables.js.map +1 -1
  424. package/dist/hooks/prerun/setupTelemetry.js +9 -3
  425. package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
  426. package/dist/prompts/promptForProject.js +64 -0
  427. package/dist/prompts/promptForProject.js.map +1 -0
  428. package/dist/{actions/auth/login/promptProviders.js → prompts/promptForProviders.js} +3 -3
  429. package/dist/prompts/promptForProviders.js.map +1 -0
  430. package/dist/prompts/selectMediaLibrary.js +1 -1
  431. package/dist/prompts/selectMediaLibrary.js.map +1 -1
  432. package/dist/server/devServer.js +4 -2
  433. package/dist/server/devServer.js.map +1 -1
  434. package/dist/server/previewServer.js +2 -2
  435. package/dist/server/previewServer.js.map +1 -1
  436. package/dist/server/vite/plugin-schema-extraction.js +201 -0
  437. package/dist/server/vite/plugin-schema-extraction.js.map +1 -0
  438. package/dist/server/vite/plugin-typegen.js +217 -0
  439. package/dist/server/vite/plugin-typegen.js.map +1 -0
  440. package/dist/services/auth.js +42 -3
  441. package/dist/services/auth.js.map +1 -1
  442. package/dist/services/datasets.js +7 -5
  443. package/dist/services/datasets.js.map +1 -1
  444. package/dist/services/docs.js +2 -2
  445. package/dist/services/docs.js.map +1 -1
  446. package/dist/services/embeddings.js +25 -0
  447. package/dist/services/embeddings.js.map +1 -0
  448. package/dist/services/getUrlHeaders.js +7 -18
  449. package/dist/services/getUrlHeaders.js.map +1 -1
  450. package/dist/services/grants.js +13 -0
  451. package/dist/services/grants.js.map +1 -0
  452. package/dist/services/graphql.js +1 -1
  453. package/dist/services/graphql.js.map +1 -1
  454. package/dist/services/projects.js +4 -2
  455. package/dist/services/projects.js.map +1 -1
  456. package/dist/services/schemas.js +1 -1
  457. package/dist/services/schemas.js.map +1 -1
  458. package/dist/services/telemetry.js +2 -1
  459. package/dist/services/telemetry.js.map +1 -1
  460. package/dist/services/userApplications.js +21 -6
  461. package/dist/services/userApplications.js.map +1 -1
  462. package/dist/telemetry/extractSchema.telemetry.js +10 -0
  463. package/dist/telemetry/extractSchema.telemetry.js.map +1 -1
  464. package/dist/types/grants.js +3 -0
  465. package/dist/types/grants.js.map +1 -0
  466. package/dist/types.js +3 -0
  467. package/dist/types.js.map +1 -1
  468. package/dist/util/checkProjectPermissions.js +21 -0
  469. package/dist/util/checkProjectPermissions.js.map +1 -0
  470. package/dist/util/cliClient.js +5 -3
  471. package/dist/util/cliClient.js.map +1 -1
  472. package/dist/util/compareDependencyVersions.js +74 -38
  473. package/dist/util/compareDependencyVersions.js.map +1 -1
  474. package/dist/util/createExpiringConfig.js +64 -0
  475. package/dist/util/createExpiringConfig.js.map +1 -0
  476. package/dist/util/detectFramework.js +135 -0
  477. package/dist/util/detectFramework.js.map +1 -0
  478. package/dist/util/errorMessages.js +0 -1
  479. package/dist/util/errorMessages.js.map +1 -1
  480. package/dist/util/extractDocumentsFromNdjsonOrTarball.js +1 -2
  481. package/dist/util/extractDocumentsFromNdjsonOrTarball.js.map +1 -1
  482. package/dist/util/getCliVersion.js +1 -1
  483. package/dist/util/getCliVersion.js.map +1 -1
  484. package/dist/util/getLocalPackageVersion.js +31 -23
  485. package/dist/util/getLocalPackageVersion.js.map +1 -1
  486. package/dist/util/getProjectDefaults.js.map +1 -1
  487. package/dist/util/getSharedServerConfig.js +1 -0
  488. package/dist/util/getSharedServerConfig.js.map +1 -1
  489. package/dist/util/getWorkspace.js +1 -1
  490. package/dist/util/getWorkspace.js.map +1 -1
  491. package/dist/util/isSchemaError.js +11 -0
  492. package/dist/util/isSchemaError.js.map +1 -0
  493. package/dist/util/isTar.js +8 -0
  494. package/dist/util/isTar.js.map +1 -0
  495. package/dist/util/packageManager/getPeerDependencies.js +44 -0
  496. package/dist/util/packageManager/getPeerDependencies.js.map +1 -0
  497. package/dist/util/packageManager/installationInfo/analyzeIssues.js +225 -0
  498. package/dist/util/packageManager/installationInfo/analyzeIssues.js.map +1 -0
  499. package/dist/util/packageManager/installationInfo/commands.js +73 -0
  500. package/dist/util/packageManager/installationInfo/commands.js.map +1 -0
  501. package/dist/util/packageManager/installationInfo/detectCliInstallation.js +66 -0
  502. package/dist/util/packageManager/installationInfo/detectCliInstallation.js.map +1 -0
  503. package/dist/util/packageManager/installationInfo/detectGlobals.js +295 -0
  504. package/dist/util/packageManager/installationInfo/detectGlobals.js.map +1 -0
  505. package/dist/util/packageManager/installationInfo/detectPackages.js +190 -0
  506. package/dist/util/packageManager/installationInfo/detectPackages.js.map +1 -0
  507. package/dist/util/packageManager/installationInfo/detectWorkspace.js +192 -0
  508. package/dist/util/packageManager/installationInfo/detectWorkspace.js.map +1 -0
  509. package/dist/util/packageManager/installationInfo/index.js +4 -0
  510. package/dist/util/packageManager/installationInfo/index.js.map +1 -0
  511. package/dist/util/packageManager/installationInfo/readJsonFile.js +14 -0
  512. package/dist/util/packageManager/installationInfo/readJsonFile.js.map +1 -0
  513. package/dist/util/packageManager/installationInfo/resolveVersionRange.js +42 -0
  514. package/dist/util/packageManager/installationInfo/resolveVersionRange.js.map +1 -0
  515. package/dist/util/packageManager/installationInfo/types.js +3 -0
  516. package/dist/util/packageManager/installationInfo/types.js.map +1 -0
  517. package/dist/util/packageManager/packageManagerChoice.js +1 -20
  518. package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
  519. package/dist/util/packageManager/upgradePackages.js +4 -1
  520. package/dist/util/packageManager/upgradePackages.js.map +1 -1
  521. package/dist/util/promiseRaceWithTimeout.js +28 -0
  522. package/dist/util/promiseRaceWithTimeout.js.map +1 -0
  523. package/dist/util/readdirRecursive.js.map +1 -1
  524. package/dist/util/resolveLatestVersions.js +2 -2
  525. package/dist/util/resolveLatestVersions.js.map +1 -1
  526. package/dist/util/sharedFlags.js +54 -0
  527. package/dist/util/sharedFlags.js.map +1 -0
  528. package/dist/util/telemetry/cleanupOldTelemetryFiles.js +30 -0
  529. package/dist/util/telemetry/cleanupOldTelemetryFiles.js.map +1 -0
  530. package/dist/util/telemetry/createTelemetryStore.js +95 -0
  531. package/dist/util/telemetry/createTelemetryStore.js.map +1 -0
  532. package/dist/util/telemetry/createTraceId.js +10 -0
  533. package/dist/util/telemetry/createTraceId.js.map +1 -0
  534. package/dist/util/telemetry/findTelemetryFiles.js +35 -0
  535. package/dist/util/telemetry/findTelemetryFiles.js.map +1 -0
  536. package/dist/util/telemetry/flushTelemetryFiles.js +118 -0
  537. package/dist/util/telemetry/flushTelemetryFiles.js.map +1 -0
  538. package/dist/util/telemetry/generateTelemetryFilePath.js +30 -0
  539. package/dist/util/telemetry/generateTelemetryFilePath.js.map +1 -0
  540. package/dist/util/telemetry/logger.js +59 -0
  541. package/dist/util/telemetry/logger.js.map +1 -0
  542. package/dist/util/telemetry/readNDJSON.js +28 -0
  543. package/dist/util/telemetry/readNDJSON.js.map +1 -0
  544. package/dist/util/telemetry/telemetryStoreDebug.js +7 -0
  545. package/dist/util/telemetry/telemetryStoreDebug.js.map +1 -0
  546. package/dist/util/telemetry/trace.js +150 -0
  547. package/dist/util/telemetry/trace.js.map +1 -0
  548. package/dist/util/toForwardSlashes.js +8 -0
  549. package/dist/util/toForwardSlashes.js.map +1 -0
  550. package/dist/util/update/fetchLatestVersion.js +21 -0
  551. package/dist/util/update/fetchLatestVersion.js.map +1 -0
  552. package/dist/util/update/getUpdateCommand.js +20 -0
  553. package/dist/util/update/getUpdateCommand.js.map +1 -0
  554. package/dist/util/update/isInstalledUsingYarn.js +17 -0
  555. package/dist/util/update/isInstalledUsingYarn.js.map +1 -0
  556. package/dist/util/update/showNotificationUpdate.js +31 -0
  557. package/dist/util/update/showNotificationUpdate.js.map +1 -0
  558. package/dist/util/update/updateChecker.js +60 -0
  559. package/dist/util/update/updateChecker.js.map +1 -0
  560. package/dist/util/update/updateCheckerDebug.js +4 -0
  561. package/dist/util/update/updateCheckerDebug.js.map +1 -0
  562. package/oclif.config.js +1 -0
  563. package/oclif.manifest.json +900 -107
  564. package/package.json +72 -71
  565. package/static/favicons/apple-touch-icon.png +0 -0
  566. package/static/favicons/favicon-192.png +0 -0
  567. package/static/favicons/favicon-512.png +0 -0
  568. package/static/favicons/favicon-96.png +0 -0
  569. package/static/favicons/favicon.ico +0 -0
  570. package/static/favicons/favicon.svg +12 -0
  571. package/dist/actions/auth/login/promptProviders.js.map +0 -1
  572. package/dist/actions/dev/getCoreAppUrl.js +0 -10
  573. package/dist/actions/dev/getCoreAppUrl.js.map +0 -1
  574. package/dist/actions/schema/schemaStoreTypes.js +0 -19
  575. package/dist/actions/schema/schemaStoreTypes.js.map +0 -1
  576. package/dist/actions/schema/utils/manifestExtractor.js +0 -33
  577. package/dist/actions/schema/utils/manifestExtractor.js.map +0 -1
  578. package/dist/actions/schema/utils/manifestReader.js +0 -71
  579. package/dist/actions/schema/utils/manifestReader.js.map +0 -1
  580. package/dist/index.d.ts +0 -2326
  581. package/dist/index.js +0 -6
  582. package/dist/index.js.map +0 -1
  583. package/dist/studioDependencies.js.map +0 -1
  584. package/dist/typings/deepSortObject.d.js +0 -2
  585. package/dist/typings/deepSortObject.d.js.map +0 -1
  586. package/dist/util/findNdjsonEntry.js +0 -21
  587. package/dist/util/findNdjsonEntry.js.map +0 -1
  588. package/dist/util/importStudioConfig.js +0 -40
  589. package/dist/util/importStudioConfig.js.map +0 -1
  590. package/dist/util/readModuleVersion.js +0 -15
  591. package/dist/util/readModuleVersion.js.map +0 -1
  592. package/dist/util/readPackageJson.js +0 -44
  593. package/dist/util/readPackageJson.js.map +0 -1
  594. package/dist/util/readPackageManifest.js +0 -46
  595. package/dist/util/readPackageManifest.js.map +0 -1
  596. package/dist/util/uniqBy.js +0 -14
  597. package/dist/util/uniqBy.js.map +0 -1
  598. package/dist/util/workerChannels.js +0 -172
  599. package/dist/util/workerChannels.js.map +0 -1
  600. /package/dist/{studioDependencies.js → actions/init/studioDependencies.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/manage.ts"],"sourcesContent":["import {type FlagInput} from '@oclif/core/interfaces'\nimport {getStudioConfig, SanityCommand} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {getManageUrl} from '../actions/projects/getManageUrl.js'\n\nexport class ManageCommand extends SanityCommand<typeof ManageCommand> {\n static override description = 'Opens project management interface in your 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(ManageCommand)\n\n const cliConfig = await this.getCliConfig()\n // Read the projectId from the CLI config\n let projectId = cliConfig?.api?.projectId\n\n if (!projectId) {\n const projectRoot = await this.getProjectRoot()\n // TODO: Move this to a util or baseclass\n const config = await getStudioConfig(projectRoot.directory, {resolvePlugins: false})\n if (!Array.isArray(config) && config.projectId) {\n projectId = config.projectId\n }\n }\n\n const url = getManageUrl(projectId)\n\n this.log(`Opening ${url}`)\n await open(url)\n }\n}\n"],"names":["getStudioConfig","SanityCommand","open","getManageUrl","ManageCommand","description","flags","run","parse","cliConfig","getCliConfig","projectId","api","projectRoot","getProjectRoot","config","directory","resolvePlugins","Array","isArray","url","log"],"mappings":"AACA,SAAQA,eAAe,EAAEC,aAAa,QAAO,mBAAkB;AAC/D,OAAOC,UAAU,OAAM;AAEvB,SAAQC,YAAY,QAAO,sCAAqC;AAEhE,OAAO,MAAMC,sBAAsBH;IACjC,OAAgBI,cAAc,yDAAwD;IACtF,OAAgBC,QAAQ,CAAC,EAAqB;IAE9C,MAAaC,MAAqB;QAChC,8CAA8C;QAC9C,MAAM,IAAI,CAACC,KAAK,CAACJ;QAEjB,MAAMK,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,yCAAyC;QACzC,IAAIC,YAAYF,WAAWG,KAAKD;QAEhC,IAAI,CAACA,WAAW;YACd,MAAME,cAAc,MAAM,IAAI,CAACC,cAAc;YAC7C,yCAAyC;YACzC,MAAMC,SAAS,MAAMf,gBAAgBa,YAAYG,SAAS,EAAE;gBAACC,gBAAgB;YAAK;YAClF,IAAI,CAACC,MAAMC,OAAO,CAACJ,WAAWA,OAAOJ,SAAS,EAAE;gBAC9CA,YAAYI,OAAOJ,SAAS;YAC9B;QACF;QAEA,MAAMS,MAAMjB,aAAaQ;QAEzB,IAAI,CAACU,GAAG,CAAC,CAAC,QAAQ,EAAED,KAAK;QACzB,MAAMlB,KAAKkB;IACb;AACF"}
1
+ {"version":3,"sources":["../../src/commands/manage.ts"],"sourcesContent":["import {type FlagInput} from '@oclif/core/interfaces'\nimport {getStudioConfig, SanityCommand} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {getManageUrl} from '../actions/projects/getManageUrl.js'\n\nexport class ManageCommand extends SanityCommand<typeof ManageCommand> {\n static override description = 'Opens project management interface in your 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(ManageCommand)\n\n const cliConfig = await this.getCliConfig()\n // Read the projectId from the CLI config\n let projectId = cliConfig?.api?.projectId\n\n if (!projectId) {\n const projectRoot = await this.getProjectRoot()\n const config = await getStudioConfig(projectRoot.directory, {resolvePlugins: false})\n if (!Array.isArray(config) && config.projectId) {\n projectId = config.projectId\n }\n }\n\n const url = getManageUrl(projectId)\n\n this.log(`Opening ${url}`)\n await open(url)\n }\n}\n"],"names":["getStudioConfig","SanityCommand","open","getManageUrl","ManageCommand","description","flags","run","parse","cliConfig","getCliConfig","projectId","api","projectRoot","getProjectRoot","config","directory","resolvePlugins","Array","isArray","url","log"],"mappings":"AACA,SAAQA,eAAe,EAAEC,aAAa,QAAO,mBAAkB;AAC/D,OAAOC,UAAU,OAAM;AAEvB,SAAQC,YAAY,QAAO,sCAAqC;AAEhE,OAAO,MAAMC,sBAAsBH;IACjC,OAAgBI,cAAc,yDAAwD;IACtF,OAAgBC,QAAQ,CAAC,EAAqB;IAE9C,MAAaC,MAAqB;QAChC,8CAA8C;QAC9C,MAAM,IAAI,CAACC,KAAK,CAACJ;QAEjB,MAAMK,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,yCAAyC;QACzC,IAAIC,YAAYF,WAAWG,KAAKD;QAEhC,IAAI,CAACA,WAAW;YACd,MAAME,cAAc,MAAM,IAAI,CAACC,cAAc;YAC7C,MAAMC,SAAS,MAAMf,gBAAgBa,YAAYG,SAAS,EAAE;gBAACC,gBAAgB;YAAK;YAClF,IAAI,CAACC,MAAMC,OAAO,CAACJ,WAAWA,OAAOJ,SAAS,EAAE;gBAC9CA,YAAYI,OAAOJ,SAAS;YAC9B;QACF;QAEA,MAAMS,MAAMjB,aAAaQ;QAEzB,IAAI,CAACU,GAAG,CAAC,CAAC,QAAQ,EAAED,KAAK;QACzB,MAAMlB,KAAKkB;IACb;AACF"}
@@ -1,6 +1,9 @@
1
1
  import { Flags } from '@oclif/core';
2
2
  import { SanityCommand } from '@sanity/cli-core';
3
- import { extractManifestSafe } from '../../actions/manifest/extractManifest.js';
3
+ import { manifestDebug } from '../../actions/manifest/debug.js';
4
+ import { extractManifest } from '../../actions/manifest/extractManifest.js';
5
+ import { formatSchemaValidation } from '../../actions/schema/formatSchemaValidation.js';
6
+ import { SchemaExtractionError } from '../../actions/schema/utils/SchemaExtractionError.js';
4
7
  const description = `
5
8
  Extracts the studio configuration as one or more JSON manifest files.
6
9
 
@@ -20,20 +23,21 @@ export class ExtractManifestCommand extends SanityCommand {
20
23
  ];
21
24
  static flags = {
22
25
  path: Flags.string({
23
- default: '/dist/static',
26
+ default: 'dist/static',
24
27
  description: 'Optional path to specify destination directory of the manifest files'
25
28
  })
26
29
  };
27
30
  async run() {
28
31
  const { flags } = await this.parse(ExtractManifestCommand);
29
- const workDir = (await this.getProjectRoot()).directory;
30
- const error = await extractManifestSafe({
31
- flags,
32
- output: this.output,
33
- workDir
34
- });
35
- if (error) {
36
- this.error(`Failed to extract manifest:\n${error.message}`, {
32
+ try {
33
+ await extractManifest(flags.path);
34
+ } catch (error) {
35
+ manifestDebug('Error extracting manifest in command', error);
36
+ if (error instanceof SchemaExtractionError && error.validation && error.validation.length > 0) {
37
+ this.output.log(formatSchemaValidation(error.validation));
38
+ this.exit(1);
39
+ }
40
+ this.error(`Failed to extract manifest:\n${error instanceof Error ? error.message : String(error)}`, {
37
41
  exit: 1
38
42
  });
39
43
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/manifest/extract.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {extractManifestSafe} from '../../actions/manifest/extractManifest.js'\n\nconst description = `\nExtracts the studio configuration as one or more JSON manifest files.\n\n**Note**: This command is experimental and subject to change. It is currently intended for use with Create only.\n`.trim()\n\nexport class ExtractManifestCommand extends SanityCommand<typeof ExtractManifestCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Extracts manifests',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --path /public/static',\n description: 'Extracts manifests into /public/static',\n },\n ]\n\n static override flags = {\n path: Flags.string({\n default: '/dist/static',\n description: 'Optional path to specify destination directory of the manifest files',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ExtractManifestCommand)\n const workDir = (await this.getProjectRoot()).directory\n\n const error = await extractManifestSafe({\n flags,\n output: this.output,\n workDir,\n })\n\n if (error) {\n this.error(`Failed to extract manifest:\\n${error.message}`, {exit: 1})\n }\n }\n}\n"],"names":["Flags","SanityCommand","extractManifestSafe","description","trim","ExtractManifestCommand","examples","command","flags","path","string","default","run","parse","workDir","getProjectRoot","directory","error","output","message","exit"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,mBAAmB,QAAO,4CAA2C;AAE7E,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,+BAA+BJ;IAC1C,OAAgBE,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtBC,MAAMT,MAAMU,MAAM,CAAC;YACjBC,SAAS;YACTR,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACK,KAAK,CAACR;QACjC,MAAMS,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QAEvD,MAAMC,QAAQ,MAAMf,oBAAoB;YACtCM;YACAU,QAAQ,IAAI,CAACA,MAAM;YACnBJ;QACF;QAEA,IAAIG,OAAO;YACT,IAAI,CAACA,KAAK,CAAC,CAAC,6BAA6B,EAAEA,MAAME,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACtE;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/manifest/extract.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {manifestDebug} from '../../actions/manifest/debug.js'\nimport {extractManifest} from '../../actions/manifest/extractManifest.js'\nimport {formatSchemaValidation} from '../../actions/schema/formatSchemaValidation.js'\nimport {SchemaExtractionError} from '../../actions/schema/utils/SchemaExtractionError.js'\n\nconst description = `\nExtracts the studio configuration as one or more JSON manifest files.\n\n**Note**: This command is experimental and subject to change. It is currently intended for use with Create only.\n`.trim()\n\nexport class ExtractManifestCommand extends SanityCommand<typeof ExtractManifestCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Extracts manifests',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --path /public/static',\n description: 'Extracts manifests into /public/static',\n },\n ]\n\n static override flags = {\n path: Flags.string({\n default: 'dist/static',\n description: 'Optional path to specify destination directory of the manifest files',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ExtractManifestCommand)\n\n try {\n await extractManifest(flags.path)\n } catch (error) {\n manifestDebug('Error extracting manifest in command', error)\n if (\n error instanceof SchemaExtractionError &&\n error.validation &&\n error.validation.length > 0\n ) {\n this.output.log(formatSchemaValidation(error.validation))\n this.exit(1)\n }\n\n this.error(\n `Failed to extract manifest:\\n${error instanceof Error ? error.message : String(error)}`,\n {exit: 1},\n )\n }\n }\n}\n"],"names":["Flags","SanityCommand","manifestDebug","extractManifest","formatSchemaValidation","SchemaExtractionError","description","trim","ExtractManifestCommand","examples","command","flags","path","string","default","run","parse","error","validation","length","output","log","exit","Error","message","String"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,aAAa,QAAO,kCAAiC;AAC7D,SAAQC,eAAe,QAAO,4CAA2C;AACzE,SAAQC,sBAAsB,QAAO,iDAAgD;AACrF,SAAQC,qBAAqB,QAAO,sDAAqD;AAEzF,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,+BAA+BP;IAC1C,OAAgBK,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtBC,MAAMZ,MAAMa,MAAM,CAAC;YACjBC,SAAS;YACTR,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACK,KAAK,CAACR;QAEjC,IAAI;YACF,MAAML,gBAAgBQ,MAAMC,IAAI;QAClC,EAAE,OAAOK,OAAO;YACdf,cAAc,wCAAwCe;YACtD,IACEA,iBAAiBZ,yBACjBY,MAAMC,UAAU,IAChBD,MAAMC,UAAU,CAACC,MAAM,GAAG,GAC1B;gBACA,IAAI,CAACC,MAAM,CAACC,GAAG,CAACjB,uBAAuBa,MAAMC,UAAU;gBACvD,IAAI,CAACI,IAAI,CAAC;YACZ;YAEA,IAAI,CAACL,KAAK,CACR,CAAC,6BAA6B,EAAEA,iBAAiBM,QAAQN,MAAMO,OAAO,GAAGC,OAAOR,QAAQ,EACxF;gBAACK,MAAM;YAAC;QAEZ;IACF;AACF"}
@@ -2,7 +2,7 @@ import { SanityCommand } from '@sanity/cli-core';
2
2
  import { setupMCP } from '../../actions/mcp/setupMCP.js';
3
3
  import { MCPConfigureTrace } from '../../telemetry/mcp.telemetry.js';
4
4
  export class ConfigureMcpCommand extends SanityCommand {
5
- static description = 'Configure Sanity MCP server for AI editors (Cursor, VS Code, Claude Code)';
5
+ static description = 'Configure Sanity MCP server for AI editors (Claude Code, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, VS Code)';
6
6
  static examples = [
7
7
  {
8
8
  command: '<%= config.bin %> <%= command.id %>',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/mcp/configure.ts"],"sourcesContent":["import {SanityCommand} from '@sanity/cli-core'\n\nimport {setupMCP} from '../../actions/mcp/setupMCP.js'\nimport {MCPConfigureTrace} from '../../telemetry/mcp.telemetry.js'\n\nexport class ConfigureMcpCommand extends SanityCommand<typeof ConfigureMcpCommand> {\n static override description =\n 'Configure Sanity MCP server for AI editors (Cursor, VS Code, Claude Code)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Configure Sanity MCP server for detected AI editors',\n },\n ]\n\n public async run(): Promise<void> {\n const trace = this.telemetry.trace(MCPConfigureTrace)\n trace.start()\n const mcpResult = await setupMCP(true)\n\n trace.log({\n configuredEditors: mcpResult.configuredEditors,\n detectedEditors: mcpResult.detectedEditors,\n })\n\n if (mcpResult.error) {\n trace.error(mcpResult.error)\n } else {\n trace.complete()\n }\n }\n}\n"],"names":["SanityCommand","setupMCP","MCPConfigureTrace","ConfigureMcpCommand","description","examples","command","run","trace","telemetry","start","mcpResult","log","configuredEditors","detectedEditors","error","complete"],"mappings":"AAAA,SAAQA,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,QAAQ,QAAO,gCAA+B;AACtD,SAAQC,iBAAiB,QAAO,mCAAkC;AAElE,OAAO,MAAMC,4BAA4BH;IACvC,OAAgBI,cACd,4EAA2E;IAE7E,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAMC,QAAQ,IAAI,CAACC,SAAS,CAACD,KAAK,CAACN;QACnCM,MAAME,KAAK;QACX,MAAMC,YAAY,MAAMV,SAAS;QAEjCO,MAAMI,GAAG,CAAC;YACRC,mBAAmBF,UAAUE,iBAAiB;YAC9CC,iBAAiBH,UAAUG,eAAe;QAC5C;QAEA,IAAIH,UAAUI,KAAK,EAAE;YACnBP,MAAMO,KAAK,CAACJ,UAAUI,KAAK;QAC7B,OAAO;YACLP,MAAMQ,QAAQ;QAChB;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/mcp/configure.ts"],"sourcesContent":["import {SanityCommand} from '@sanity/cli-core'\n\nimport {setupMCP} from '../../actions/mcp/setupMCP.js'\nimport {MCPConfigureTrace} from '../../telemetry/mcp.telemetry.js'\n\nexport class ConfigureMcpCommand extends SanityCommand<typeof ConfigureMcpCommand> {\n static override description =\n 'Configure Sanity MCP server for AI editors (Claude Code, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, VS Code)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Configure Sanity MCP server for detected AI editors',\n },\n ]\n\n public async run(): Promise<void> {\n const trace = this.telemetry.trace(MCPConfigureTrace)\n trace.start()\n const mcpResult = await setupMCP(true)\n\n trace.log({\n configuredEditors: mcpResult.configuredEditors,\n detectedEditors: mcpResult.detectedEditors,\n })\n\n if (mcpResult.error) {\n trace.error(mcpResult.error)\n } else {\n trace.complete()\n }\n }\n}\n"],"names":["SanityCommand","setupMCP","MCPConfigureTrace","ConfigureMcpCommand","description","examples","command","run","trace","telemetry","start","mcpResult","log","configuredEditors","detectedEditors","error","complete"],"mappings":"AAAA,SAAQA,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,QAAQ,QAAO,gCAA+B;AACtD,SAAQC,iBAAiB,QAAO,mCAAkC;AAElE,OAAO,MAAMC,4BAA4BH;IACvC,OAAgBI,cACd,uHAAsH;IAExH,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAMC,QAAQ,IAAI,CAACC,SAAS,CAACD,KAAK,CAACN;QACnCM,MAAME,KAAK;QACX,MAAMC,YAAY,MAAMV,SAAS;QAEjCO,MAAMI,GAAG,CAAC;YACRC,mBAAmBF,UAAUE,iBAAiB;YAC9CC,iBAAiBH,UAAUG,eAAe;QAC5C;QAEA,IAAIH,UAAUI,KAAK,EAAE;YACnBP,MAAMO,KAAK,CAACJ,UAAUI,KAAK;QAC7B,OAAO;YACLP,MAAMQ,QAAQ;QAChB;IACF;AACF"}
@@ -1,10 +1,10 @@
1
- import fs, { mkdir } from 'node:fs/promises';
1
+ import fs, { access, mkdir } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { styleText } from 'node:util';
4
- import { fileExists, SanityCommand, subdebug } from '@sanity/cli-core';
4
+ import { SanityCommand, subdebug } from '@sanity/cli-core';
5
5
  import { input } from '@sanity/cli-core/ux';
6
6
  import { createPublishedId } from '@sanity/id-utils';
7
- import { camelCase } from 'lodash-es';
7
+ import camelCase from 'lodash-es/camelCase.js';
8
8
  import { getMediaLibraryConfig } from '../../actions/media/getMediaLibraryConfig.js';
9
9
  import { NO_MEDIA_LIBRARY_ASPECTS_PATH } from '../../util/errorMessages.js';
10
10
  const createAspectDebug = subdebug('media:create-aspect');
@@ -38,7 +38,7 @@ export class MediaCreateAspectCommand extends SanityCommand {
38
38
  await mkdir(path.resolve(mediaLibrary.aspectsPath), {
39
39
  recursive: true
40
40
  });
41
- const destinationPathExists = await fileExists(destinationPath);
41
+ const destinationPathExists = await access(destinationPath).then(()=>true, ()=>false);
42
42
  if (destinationPathExists) {
43
43
  this.error(`A file already exists at ${styleText('bold', relativeDestinationPath)}`, {
44
44
  exit: 1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/create-aspect.ts"],"sourcesContent":["import fs, {mkdir} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {fileExists, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\nimport {createPublishedId} from '@sanity/id-utils'\nimport {camelCase} from 'lodash-es'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\n\nconst createAspectDebug = subdebug('media:create-aspect')\n\nexport class MediaCreateAspectCommand extends SanityCommand<typeof MediaCreateAspectCommand> {\n static override description = 'Create a new aspect definition file'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new aspect definition file',\n },\n ]\n\n public async run(): Promise<void> {\n const cliConfig = await this.getCliConfig()\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n if (mediaLibrary?.aspectsPath === undefined) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: 1})\n }\n\n try {\n const title = await input({\n message: 'Title',\n })\n\n const name = await input({\n default: createPublishedId(camelCase(title)),\n message: 'Name',\n })\n\n const safeName = createPublishedId(camelCase(name))\n const destinationPath = path.resolve(mediaLibrary.aspectsPath, `${safeName}.ts`)\n const relativeDestinationPath = path.relative(process.cwd(), destinationPath)\n\n await mkdir(path.resolve(mediaLibrary.aspectsPath), {\n recursive: true,\n })\n\n const destinationPathExists = await fileExists(destinationPath)\n if (destinationPathExists) {\n this.error(`A file already exists at ${styleText('bold', relativeDestinationPath)}`, {\n exit: 1,\n })\n }\n\n await fs.writeFile(\n destinationPath,\n template({\n name: safeName,\n title,\n }),\n )\n\n this.log(\n `${styleText('green', '✓')} Aspect created! ${styleText('bold', relativeDestinationPath)}`,\n )\n this.log()\n this.log('Next steps:')\n this.log(\n `Open ${styleText('bold', relativeDestinationPath)} in your code editor and customize the aspect.`,\n )\n this.log()\n this.log('Deploy this aspect by running:')\n this.log(styleText('bold', `sanity media deploy-aspect ${safeName}`))\n this.log()\n this.log('Deploy all aspects by running:')\n this.log(styleText('bold', `sanity media deploy-aspect --all`))\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n createAspectDebug('Failed to create aspect', error)\n this.error(`Failed to create aspect: ${message}`, {exit: 1})\n }\n }\n}\n\nfunction template({name, title}: {name: string; title: string}) {\n return `import {defineAssetAspect, defineField} from 'sanity'\n\nexport default defineAssetAspect({\n name: '${name}',\n title: '${title}',\n type: 'object',\n fields: [\n defineField({\n name: 'string',\n title: 'Plain String',\n type: 'string',\n }),\n ],\n})\n`\n}\n"],"names":["fs","mkdir","path","styleText","fileExists","SanityCommand","subdebug","input","createPublishedId","camelCase","getMediaLibraryConfig","NO_MEDIA_LIBRARY_ASPECTS_PATH","createAspectDebug","MediaCreateAspectCommand","description","examples","command","run","cliConfig","getCliConfig","mediaLibrary","aspectsPath","undefined","error","exit","title","message","name","default","safeName","destinationPath","resolve","relativeDestinationPath","relative","process","cwd","recursive","destinationPathExists","writeFile","template","log","Error","String"],"mappings":"AAAA,OAAOA,MAAKC,KAAK,QAAO,mBAAkB;AAC1C,OAAOC,UAAU,YAAW;AAC5B,SAAQC,SAAS,QAAO,YAAW;AAEnC,SAAQC,UAAU,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACpE,SAAQC,KAAK,QAAO,sBAAqB;AACzC,SAAQC,iBAAiB,QAAO,mBAAkB;AAClD,SAAQC,SAAS,QAAO,YAAW;AAEnC,SAAQC,qBAAqB,QAAO,+CAA8C;AAClF,SAAQC,6BAA6B,QAAO,8BAA6B;AAEzE,MAAMC,oBAAoBN,SAAS;AAEnC,OAAO,MAAMO,iCAAiCR;IAC5C,OAAgBS,cAAc,sCAAqC;IAEnE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,MAAMC,eAAeV,sBAAsBQ;QAC3C,IAAIE,cAAcC,gBAAgBC,WAAW;YAC3C,IAAI,CAACC,KAAK,CAACZ,+BAA+B;gBAACa,MAAM;YAAC;QACpD;QAEA,IAAI;YACF,MAAMC,QAAQ,MAAMlB,MAAM;gBACxBmB,SAAS;YACX;YAEA,MAAMC,OAAO,MAAMpB,MAAM;gBACvBqB,SAASpB,kBAAkBC,UAAUgB;gBACrCC,SAAS;YACX;YAEA,MAAMG,WAAWrB,kBAAkBC,UAAUkB;YAC7C,MAAMG,kBAAkB5B,KAAK6B,OAAO,CAACX,aAAaC,WAAW,EAAE,GAAGQ,SAAS,GAAG,CAAC;YAC/E,MAAMG,0BAA0B9B,KAAK+B,QAAQ,CAACC,QAAQC,GAAG,IAAIL;YAE7D,MAAM7B,MAAMC,KAAK6B,OAAO,CAACX,aAAaC,WAAW,GAAG;gBAClDe,WAAW;YACb;YAEA,MAAMC,wBAAwB,MAAMjC,WAAW0B;YAC/C,IAAIO,uBAAuB;gBACzB,IAAI,CAACd,KAAK,CAAC,CAAC,yBAAyB,EAAEpB,UAAU,QAAQ6B,0BAA0B,EAAE;oBACnFR,MAAM;gBACR;YACF;YAEA,MAAMxB,GAAGsC,SAAS,CAChBR,iBACAS,SAAS;gBACPZ,MAAME;gBACNJ;YACF;YAGF,IAAI,CAACe,GAAG,CACN,GAAGrC,UAAU,SAAS,KAAK,iBAAiB,EAAEA,UAAU,QAAQ6B,0BAA0B;YAE5F,IAAI,CAACQ,GAAG;YACR,IAAI,CAACA,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CACN,CAAC,KAAK,EAAErC,UAAU,QAAQ6B,yBAAyB,8CAA8C,CAAC;YAEpG,IAAI,CAACQ,GAAG;YACR,IAAI,CAACA,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAACrC,UAAU,QAAQ,CAAC,2BAA2B,EAAE0B,UAAU;YACnE,IAAI,CAACW,GAAG;YACR,IAAI,CAACA,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAACrC,UAAU,QAAQ,CAAC,gCAAgC,CAAC;QAC/D,EAAE,OAAOoB,OAAO;YACd,MAAMG,UAAUH,iBAAiBkB,QAAQlB,MAAMG,OAAO,GAAGgB,OAAOnB;YAChEX,kBAAkB,2BAA2BW;YAC7C,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEG,SAAS,EAAE;gBAACF,MAAM;YAAC;QAC5D;IACF;AACF;AAEA,SAASe,SAAS,EAACZ,IAAI,EAAEF,KAAK,EAAgC;IAC5D,OAAO,CAAC;;;SAGD,EAAEE,KAAK;UACN,EAAEF,MAAM;;;;;;;;;;AAUlB,CAAC;AACD"}
1
+ {"version":3,"sources":["../../../src/commands/media/create-aspect.ts"],"sourcesContent":["import fs, {access, mkdir} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\nimport {createPublishedId} from '@sanity/id-utils'\nimport camelCase from 'lodash-es/camelCase.js'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\n\nconst createAspectDebug = subdebug('media:create-aspect')\n\nexport class MediaCreateAspectCommand extends SanityCommand<typeof MediaCreateAspectCommand> {\n static override description = 'Create a new aspect definition file'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new aspect definition file',\n },\n ]\n\n public async run(): Promise<void> {\n const cliConfig = await this.getCliConfig()\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n if (mediaLibrary?.aspectsPath === undefined) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: 1})\n }\n\n try {\n const title = await input({\n message: 'Title',\n })\n\n const name = await input({\n default: createPublishedId(camelCase(title)),\n message: 'Name',\n })\n\n const safeName = createPublishedId(camelCase(name))\n const destinationPath = path.resolve(mediaLibrary.aspectsPath, `${safeName}.ts`)\n const relativeDestinationPath = path.relative(process.cwd(), destinationPath)\n\n await mkdir(path.resolve(mediaLibrary.aspectsPath), {\n recursive: true,\n })\n\n const destinationPathExists = await access(destinationPath).then(\n () => true,\n () => false,\n )\n if (destinationPathExists) {\n this.error(`A file already exists at ${styleText('bold', relativeDestinationPath)}`, {\n exit: 1,\n })\n }\n\n await fs.writeFile(\n destinationPath,\n template({\n name: safeName,\n title,\n }),\n )\n\n this.log(\n `${styleText('green', '✓')} Aspect created! ${styleText('bold', relativeDestinationPath)}`,\n )\n this.log()\n this.log('Next steps:')\n this.log(\n `Open ${styleText('bold', relativeDestinationPath)} in your code editor and customize the aspect.`,\n )\n this.log()\n this.log('Deploy this aspect by running:')\n this.log(styleText('bold', `sanity media deploy-aspect ${safeName}`))\n this.log()\n this.log('Deploy all aspects by running:')\n this.log(styleText('bold', `sanity media deploy-aspect --all`))\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n createAspectDebug('Failed to create aspect', error)\n this.error(`Failed to create aspect: ${message}`, {exit: 1})\n }\n }\n}\n\nfunction template({name, title}: {name: string; title: string}) {\n return `import {defineAssetAspect, defineField} from 'sanity'\n\nexport default defineAssetAspect({\n name: '${name}',\n title: '${title}',\n type: 'object',\n fields: [\n defineField({\n name: 'string',\n title: 'Plain String',\n type: 'string',\n }),\n ],\n})\n`\n}\n"],"names":["fs","access","mkdir","path","styleText","SanityCommand","subdebug","input","createPublishedId","camelCase","getMediaLibraryConfig","NO_MEDIA_LIBRARY_ASPECTS_PATH","createAspectDebug","MediaCreateAspectCommand","description","examples","command","run","cliConfig","getCliConfig","mediaLibrary","aspectsPath","undefined","error","exit","title","message","name","default","safeName","destinationPath","resolve","relativeDestinationPath","relative","process","cwd","recursive","destinationPathExists","then","writeFile","template","log","Error","String"],"mappings":"AAAA,OAAOA,MAAKC,MAAM,EAAEC,KAAK,QAAO,mBAAkB;AAClD,OAAOC,UAAU,YAAW;AAC5B,SAAQC,SAAS,QAAO,YAAW;AAEnC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,QAAO,sBAAqB;AACzC,SAAQC,iBAAiB,QAAO,mBAAkB;AAClD,OAAOC,eAAe,yBAAwB;AAE9C,SAAQC,qBAAqB,QAAO,+CAA8C;AAClF,SAAQC,6BAA6B,QAAO,8BAA6B;AAEzE,MAAMC,oBAAoBN,SAAS;AAEnC,OAAO,MAAMO,iCAAiCR;IAC5C,OAAgBS,cAAc,sCAAqC;IAEnE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,MAAMC,eAAeV,sBAAsBQ;QAC3C,IAAIE,cAAcC,gBAAgBC,WAAW;YAC3C,IAAI,CAACC,KAAK,CAACZ,+BAA+B;gBAACa,MAAM;YAAC;QACpD;QAEA,IAAI;YACF,MAAMC,QAAQ,MAAMlB,MAAM;gBACxBmB,SAAS;YACX;YAEA,MAAMC,OAAO,MAAMpB,MAAM;gBACvBqB,SAASpB,kBAAkBC,UAAUgB;gBACrCC,SAAS;YACX;YAEA,MAAMG,WAAWrB,kBAAkBC,UAAUkB;YAC7C,MAAMG,kBAAkB3B,KAAK4B,OAAO,CAACX,aAAaC,WAAW,EAAE,GAAGQ,SAAS,GAAG,CAAC;YAC/E,MAAMG,0BAA0B7B,KAAK8B,QAAQ,CAACC,QAAQC,GAAG,IAAIL;YAE7D,MAAM5B,MAAMC,KAAK4B,OAAO,CAACX,aAAaC,WAAW,GAAG;gBAClDe,WAAW;YACb;YAEA,MAAMC,wBAAwB,MAAMpC,OAAO6B,iBAAiBQ,IAAI,CAC9D,IAAM,MACN,IAAM;YAER,IAAID,uBAAuB;gBACzB,IAAI,CAACd,KAAK,CAAC,CAAC,yBAAyB,EAAEnB,UAAU,QAAQ4B,0BAA0B,EAAE;oBACnFR,MAAM;gBACR;YACF;YAEA,MAAMxB,GAAGuC,SAAS,CAChBT,iBACAU,SAAS;gBACPb,MAAME;gBACNJ;YACF;YAGF,IAAI,CAACgB,GAAG,CACN,GAAGrC,UAAU,SAAS,KAAK,iBAAiB,EAAEA,UAAU,QAAQ4B,0BAA0B;YAE5F,IAAI,CAACS,GAAG;YACR,IAAI,CAACA,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CACN,CAAC,KAAK,EAAErC,UAAU,QAAQ4B,yBAAyB,8CAA8C,CAAC;YAEpG,IAAI,CAACS,GAAG;YACR,IAAI,CAACA,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAACrC,UAAU,QAAQ,CAAC,2BAA2B,EAAEyB,UAAU;YACnE,IAAI,CAACY,GAAG;YACR,IAAI,CAACA,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAACrC,UAAU,QAAQ,CAAC,gCAAgC,CAAC;QAC/D,EAAE,OAAOmB,OAAO;YACd,MAAMG,UAAUH,iBAAiBmB,QAAQnB,MAAMG,OAAO,GAAGiB,OAAOpB;YAChEX,kBAAkB,2BAA2BW;YAC7C,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEG,SAAS,EAAE;gBAACF,MAAM;YAAC;QAC5D;IACF;AACF;AAEA,SAASgB,SAAS,EAACb,IAAI,EAAEF,KAAK,EAAgC;IAC5D,OAAO,CAAC;;;SAGD,EAAEE,KAAK;UACN,EAAEF,MAAM;;;;;;;;;;AAUlB,CAAC;AACD"}
@@ -2,9 +2,10 @@ import { styleText } from 'node:util';
2
2
  import { Args, Flags } from '@oclif/core';
3
3
  import { SanityCommand, subdebug } from '@sanity/cli-core';
4
4
  import { confirm } from '@sanity/cli-core/ux';
5
+ import { promptForProject } from '../../prompts/promptForProject.js';
5
6
  import { selectMediaLibrary } from '../../prompts/selectMediaLibrary.js';
6
7
  import { deleteAspect } from '../../services/mediaLibraries.js';
7
- import { NO_PROJECT_ID } from '../../util/errorMessages.js';
8
+ import { getProjectIdFlag } from '../../util/sharedFlags.js';
8
9
  const deleteAspectDebug = subdebug('media:delete-aspect');
9
10
  export class MediaDeleteAspectCommand extends SanityCommand {
10
11
  static args = {
@@ -21,6 +22,10 @@ export class MediaDeleteAspectCommand extends SanityCommand {
21
22
  }
22
23
  ];
23
24
  static flags = {
25
+ ...getProjectIdFlag({
26
+ description: 'Project ID to delete media aspect from',
27
+ semantics: 'override'
28
+ }),
24
29
  'media-library-id': Flags.string({
25
30
  description: 'The id of the target media library',
26
31
  required: false
@@ -36,12 +41,9 @@ export class MediaDeleteAspectCommand extends SanityCommand {
36
41
  async run() {
37
42
  const { aspectName } = this.args;
38
43
  const { 'media-library-id': mediaLibraryIdFlag, yes: skipConfirmation } = this.flags;
39
- const projectId = await this.getProjectId();
40
- if (!projectId) {
41
- this.error(NO_PROJECT_ID, {
42
- exit: 1
43
- });
44
- }
44
+ const projectId = await this.getProjectId({
45
+ fallback: ()=>promptForProject({})
46
+ });
45
47
  try {
46
48
  let mediaLibraryId = mediaLibraryIdFlag;
47
49
  if (!mediaLibraryId) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/delete-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deleteAspect} from '../../services/mediaLibraries.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst deleteAspectDebug = subdebug('media:delete-aspect')\n\nexport class MediaDeleteAspectCommand extends SanityCommand<typeof MediaDeleteAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to delete',\n required: true,\n }),\n }\n\n static override description = 'Undeploy an aspect'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Delete the aspect named \"someAspect\"',\n },\n ]\n\n static override flags = {\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n yes: Flags.boolean({\n aliases: ['y'],\n description: 'Skip confirmation prompt',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {'media-library-id': mediaLibraryIdFlag, yes: skipConfirmation} = this.flags\n\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n try {\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n if (!skipConfirmation) {\n const confirmed = await confirm({\n default: false,\n message: `Are you absolutely sure you want to undeploy the ${aspectName} aspect from the \"${mediaLibraryId}\" media library?`,\n })\n\n if (!confirmed) {\n this.log('Operation cancelled')\n return\n }\n }\n\n const response = await deleteAspect({\n aspectName,\n mediaLibraryId,\n projectId,\n })\n\n if (response.results.length === 0) {\n this.warn(styleText('bold', `There's no deployed aspect with that name`))\n this.log(` - ${aspectName}`)\n return\n }\n\n this.log()\n this.log(`${styleText('green', '✓')} ${styleText('bold', 'Deleted aspect')}`)\n this.log(` - ${aspectName}`)\n\n // TODO: Find existing aspect definition files matching the undeployed aspect name and offer\n // to delete them.\n } catch (error) {\n const err = error as Error\n deleteAspectDebug('Failed to delete aspect', err)\n this.error(\n styleText('bold', 'Failed to delete aspect') +\n `\\n - ${aspectName}\\n\\n${styleText('red', err.message)}`,\n {\n exit: 1,\n },\n )\n }\n }\n}\n"],"names":["styleText","Args","Flags","SanityCommand","subdebug","confirm","selectMediaLibrary","deleteAspect","NO_PROJECT_ID","deleteAspectDebug","MediaDeleteAspectCommand","args","aspectName","string","description","required","examples","command","flags","yes","boolean","aliases","run","mediaLibraryIdFlag","skipConfirmation","projectId","getProjectId","error","exit","mediaLibraryId","confirmed","default","message","log","response","results","length","warn","err"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,kBAAkB,QAAO,sCAAqC;AACtE,SAAQC,YAAY,QAAO,mCAAkC;AAC7D,SAAQC,aAAa,QAAO,8BAA6B;AAEzD,MAAMC,oBAAoBL,SAAS;AAEnC,OAAO,MAAMM,iCAAiCP;IAC5C,OAAgBQ,OAAO;QACrBC,YAAYX,KAAKY,MAAM,CAAC;YACtBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,qBAAoB;IAElD,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,oBAAoBhB,MAAMW,MAAM,CAAC;YAC/BC,aAAa;YACbC,UAAU;QACZ;QACAI,KAAKjB,MAAMkB,OAAO,CAAC;YACjBC,SAAS;gBAAC;aAAI;YACdP,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,MAAaO,MAAqB;QAChC,MAAM,EAACV,UAAU,EAAC,GAAG,IAAI,CAACD,IAAI;QAC9B,MAAM,EAAC,oBAAoBY,kBAAkB,EAAEJ,KAAKK,gBAAgB,EAAC,GAAG,IAAI,CAACN,KAAK;QAElF,MAAMO,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,IAAI,CAACD,WAAW;YACd,IAAI,CAACE,KAAK,CAACnB,eAAe;gBAACoB,MAAM;YAAC;QACpC;QAEA,IAAI;YACF,IAAIC,iBAAiBN;YACrB,IAAI,CAACM,gBAAgB;gBACnBA,iBAAiB,MAAMvB,mBAAmBmB;YAC5C;YAEA,IAAI,CAACD,kBAAkB;gBACrB,MAAMM,YAAY,MAAMzB,QAAQ;oBAC9B0B,SAAS;oBACTC,SAAS,CAAC,iDAAiD,EAAEpB,WAAW,kBAAkB,EAAEiB,eAAe,gBAAgB,CAAC;gBAC9H;gBAEA,IAAI,CAACC,WAAW;oBACd,IAAI,CAACG,GAAG,CAAC;oBACT;gBACF;YACF;YAEA,MAAMC,WAAW,MAAM3B,aAAa;gBAClCK;gBACAiB;gBACAJ;YACF;YAEA,IAAIS,SAASC,OAAO,CAACC,MAAM,KAAK,GAAG;gBACjC,IAAI,CAACC,IAAI,CAACrC,UAAU,QAAQ,CAAC,yCAAyC,CAAC;gBACvE,IAAI,CAACiC,GAAG,CAAC,CAAC,IAAI,EAAErB,YAAY;gBAC5B;YACF;YAEA,IAAI,CAACqB,GAAG;YACR,IAAI,CAACA,GAAG,CAAC,GAAGjC,UAAU,SAAS,KAAK,CAAC,EAAEA,UAAU,QAAQ,mBAAmB;YAC5E,IAAI,CAACiC,GAAG,CAAC,CAAC,IAAI,EAAErB,YAAY;QAE5B,4FAA4F;QAC5F,kBAAkB;QACpB,EAAE,OAAOe,OAAO;YACd,MAAMW,MAAMX;YACZlB,kBAAkB,2BAA2B6B;YAC7C,IAAI,CAACX,KAAK,CACR3B,UAAU,QAAQ,6BAChB,CAAC,MAAM,EAAEY,WAAW,IAAI,EAAEZ,UAAU,OAAOsC,IAAIN,OAAO,GAAG,EAC3D;gBACEJ,MAAM;YACR;QAEJ;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/media/delete-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deleteAspect} from '../../services/mediaLibraries.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteAspectDebug = subdebug('media:delete-aspect')\n\nexport class MediaDeleteAspectCommand extends SanityCommand<typeof MediaDeleteAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to delete',\n required: true,\n }),\n }\n\n static override description = 'Undeploy an aspect'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Delete the aspect named \"someAspect\"',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete media aspect from',\n semantics: 'override',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n yes: Flags.boolean({\n aliases: ['y'],\n description: 'Skip confirmation prompt',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {'media-library-id': mediaLibraryIdFlag, yes: skipConfirmation} = this.flags\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n try {\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n if (!skipConfirmation) {\n const confirmed = await confirm({\n default: false,\n message: `Are you absolutely sure you want to undeploy the ${aspectName} aspect from the \"${mediaLibraryId}\" media library?`,\n })\n\n if (!confirmed) {\n this.log('Operation cancelled')\n return\n }\n }\n\n const response = await deleteAspect({\n aspectName,\n mediaLibraryId,\n projectId,\n })\n\n if (response.results.length === 0) {\n this.warn(styleText('bold', `There's no deployed aspect with that name`))\n this.log(` - ${aspectName}`)\n return\n }\n\n this.log()\n this.log(`${styleText('green', '✓')} ${styleText('bold', 'Deleted aspect')}`)\n this.log(` - ${aspectName}`)\n\n // TODO: Find existing aspect definition files matching the undeployed aspect name and offer\n // to delete them.\n } catch (error) {\n const err = error as Error\n deleteAspectDebug('Failed to delete aspect', err)\n this.error(\n styleText('bold', 'Failed to delete aspect') +\n `\\n - ${aspectName}\\n\\n${styleText('red', err.message)}`,\n {\n exit: 1,\n },\n )\n }\n }\n}\n"],"names":["styleText","Args","Flags","SanityCommand","subdebug","confirm","promptForProject","selectMediaLibrary","deleteAspect","getProjectIdFlag","deleteAspectDebug","MediaDeleteAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","yes","boolean","aliases","run","mediaLibraryIdFlag","skipConfirmation","projectId","getProjectId","fallback","mediaLibraryId","confirmed","default","message","log","response","results","length","warn","error","err","exit"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,kBAAkB,QAAO,sCAAqC;AACtE,SAAQC,YAAY,QAAO,mCAAkC;AAC7D,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,oBAAoBN,SAAS;AAEnC,OAAO,MAAMO,iCAAiCR;IAC5C,OAAgBS,OAAO;QACrBC,YAAYZ,KAAKa,MAAM,CAAC;YACtBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,qBAAoB;IAElD,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;QACF,oBAAoBlB,MAAMY,MAAM,CAAC;YAC/BC,aAAa;YACbC,UAAU;QACZ;QACAK,KAAKnB,MAAMoB,OAAO,CAAC;YACjBC,SAAS;gBAAC;aAAI;YACdR,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,MAAaQ,MAAqB;QAChC,MAAM,EAACX,UAAU,EAAC,GAAG,IAAI,CAACD,IAAI;QAC9B,MAAM,EAAC,oBAAoBa,kBAAkB,EAAEJ,KAAKK,gBAAgB,EAAC,GAAG,IAAI,CAACP,KAAK;QAElF,MAAMQ,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YAACC,UAAU,IAAMvB,iBAAiB,CAAC;QAAE;QAE/E,IAAI;YACF,IAAIwB,iBAAiBL;YACrB,IAAI,CAACK,gBAAgB;gBACnBA,iBAAiB,MAAMvB,mBAAmBoB;YAC5C;YAEA,IAAI,CAACD,kBAAkB;gBACrB,MAAMK,YAAY,MAAM1B,QAAQ;oBAC9B2B,SAAS;oBACTC,SAAS,CAAC,iDAAiD,EAAEpB,WAAW,kBAAkB,EAAEiB,eAAe,gBAAgB,CAAC;gBAC9H;gBAEA,IAAI,CAACC,WAAW;oBACd,IAAI,CAACG,GAAG,CAAC;oBACT;gBACF;YACF;YAEA,MAAMC,WAAW,MAAM3B,aAAa;gBAClCK;gBACAiB;gBACAH;YACF;YAEA,IAAIQ,SAASC,OAAO,CAACC,MAAM,KAAK,GAAG;gBACjC,IAAI,CAACC,IAAI,CAACtC,UAAU,QAAQ,CAAC,yCAAyC,CAAC;gBACvE,IAAI,CAACkC,GAAG,CAAC,CAAC,IAAI,EAAErB,YAAY;gBAC5B;YACF;YAEA,IAAI,CAACqB,GAAG;YACR,IAAI,CAACA,GAAG,CAAC,GAAGlC,UAAU,SAAS,KAAK,CAAC,EAAEA,UAAU,QAAQ,mBAAmB;YAC5E,IAAI,CAACkC,GAAG,CAAC,CAAC,IAAI,EAAErB,YAAY;QAE5B,4FAA4F;QAC5F,kBAAkB;QACpB,EAAE,OAAO0B,OAAO;YACd,MAAMC,MAAMD;YACZ7B,kBAAkB,2BAA2B8B;YAC7C,IAAI,CAACD,KAAK,CACRvC,UAAU,QAAQ,6BAChB,CAAC,MAAM,EAAEa,WAAW,IAAI,EAAEb,UAAU,OAAOwC,IAAIP,OAAO,GAAG,EAC3D;gBACEQ,MAAM;YACR;QAEJ;IACF;AACF"}
@@ -1,14 +1,16 @@
1
1
  import { styleText } from 'node:util';
2
2
  import { Args, Flags } from '@oclif/core';
3
- import { SanityCommand, subdebug } from '@sanity/cli-core';
3
+ import { ProjectRootNotFoundError, SanityCommand, subdebug } from '@sanity/cli-core';
4
4
  import { spinner } from '@sanity/cli-core/ux';
5
5
  import { isAssetAspect } from '@sanity/types';
6
6
  import { getMediaLibraryConfig } from '../../actions/media/getMediaLibraryConfig.js';
7
7
  import { importAspects } from '../../actions/media/importAspects.js';
8
+ import { promptForProject } from '../../prompts/promptForProject.js';
8
9
  import { selectMediaLibrary } from '../../prompts/selectMediaLibrary.js';
9
10
  import { deployAspects } from '../../services/mediaLibraries.js';
10
- import { NO_MEDIA_LIBRARY_ASPECTS_PATH, NO_PROJECT_ID } from '../../util/errorMessages.js';
11
+ import { NO_MEDIA_LIBRARY_ASPECTS_PATH } from '../../util/errorMessages.js';
11
12
  import { pluralize } from '../../util/pluralize.js';
13
+ import { getProjectIdFlag } from '../../util/sharedFlags.js';
12
14
  const deployAspectDebug = subdebug('media:deploy-aspect');
13
15
  export class MediaDeployAspectCommand extends SanityCommand {
14
16
  static args = {
@@ -29,6 +31,10 @@ export class MediaDeployAspectCommand extends SanityCommand {
29
31
  }
30
32
  ];
31
33
  static flags = {
34
+ ...getProjectIdFlag({
35
+ description: 'Project ID to deploy media aspect to',
36
+ semantics: 'override'
37
+ }),
32
38
  all: Flags.boolean({
33
39
  description: 'Deploy all aspects',
34
40
  required: false
@@ -53,19 +59,26 @@ export class MediaDeployAspectCommand extends SanityCommand {
53
59
  exit: 1
54
60
  });
55
61
  }
56
- const cliConfig = await this.getCliConfig();
62
+ let cliConfig;
63
+ try {
64
+ cliConfig = await this.getCliConfig();
65
+ } catch (err) {
66
+ if (err instanceof ProjectRootNotFoundError) {
67
+ this.error('This command must be run from within a Sanity project directory (requires media library configuration)', {
68
+ exit: 1
69
+ });
70
+ }
71
+ throw err;
72
+ }
57
73
  const mediaLibrary = getMediaLibraryConfig(cliConfig);
58
74
  if (!mediaLibrary?.aspectsPath) {
59
75
  this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {
60
76
  exit: 1
61
77
  });
62
78
  }
63
- const projectId = await this.getProjectId();
64
- if (!projectId) {
65
- this.error(NO_PROJECT_ID, {
66
- exit: 1
67
- });
68
- }
79
+ const projectId = await this.getProjectId({
80
+ fallback: ()=>promptForProject({})
81
+ });
69
82
  try {
70
83
  // Determine target media library
71
84
  let mediaLibraryId = mediaLibraryIdFlag;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/deploy-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isAssetAspect, type SchemaValidationProblem} from '@sanity/types'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {importAspects} from '../../actions/media/importAspects.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deployAspects} from '../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH, NO_PROJECT_ID} from '../../util/errorMessages.js'\nimport {pluralize} from '../../util/pluralize.js'\n\nconst deployAspectDebug = subdebug('media:deploy-aspect')\n\nexport class MediaDeployAspectCommand extends SanityCommand<typeof MediaDeployAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to deploy',\n required: false,\n }),\n }\n\n static override description = 'Deploy an aspect'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Deploy the aspect named \"someAspect\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --all',\n description: 'Deploy all aspects',\n },\n ]\n\n static override flags = {\n all: Flags.boolean({\n description: 'Deploy all aspects',\n required: false,\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {all, 'media-library-id': mediaLibraryIdFlag} = this.flags\n\n // Validation: must provide either aspect name or --all flag\n if (!all && !aspectName) {\n this.error(\n 'Specify an aspect name, or use the `--all` option to deploy all aspect definitions.',\n {exit: 1},\n )\n }\n\n // Validation: cannot provide both aspect name and --all flag\n if (all && aspectName) {\n this.error('Specified both an aspect name and `--all`.', {exit: 1})\n }\n\n const cliConfig = await this.getCliConfig()\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n\n if (!mediaLibrary?.aspectsPath) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: 1})\n }\n\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n try {\n // Determine target media library\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n // Import and validate aspects\n const spin = spinner('Loading aspect definitions').start()\n const result = await importAspects({\n aspectsPath: mediaLibrary.aspectsPath,\n filterAspects: (aspect) => {\n if (all) {\n return true\n }\n\n if (typeof aspect === 'object' && aspect !== null && '_id' in aspect) {\n return aspect._id === aspectName\n }\n\n return false\n },\n })\n spin.stop()\n\n // Handle invalid aspects\n if (result.invalid.length > 0) {\n this.logToStderr('')\n this.warn(\n styleText(\n 'bold',\n `Skipped ${result.invalid.length} invalid ${pluralize('aspect', result.invalid.length)}`,\n ),\n )\n this.logToStderr(this.formatAspectList(result.invalid))\n }\n\n // Check if we found the requested aspect (when not using --all)\n if (!all && result.valid.length === 0 && result.invalid.length === 0) {\n this.log()\n this.error(`Could not find aspect: ${styleText('bold', aspectName ?? '')}`, {exit: 1})\n }\n\n // Deploy valid aspects\n if (result.valid.length === 0) {\n this.logToStderr('')\n this.warn('No valid aspects to deploy')\n return\n }\n\n const deploySpin = spinner(\n `Deploying ${result.valid.length} ${pluralize('aspect', result.valid.length)}`,\n ).start()\n\n const deployResponse = await deployAspects({\n aspects: result.valid.map((a) => a.aspect),\n mediaLibraryId,\n })\n\n deploySpin.succeed()\n\n // Display success message\n this.log()\n this.log(\n `${styleText('green', '✓')} ${styleText('bold', `Deployed ${result.valid.length} ${pluralize('aspect', result.valid.length)}`)}`,\n )\n this.log(this.formatAspectList(result.valid))\n\n deployAspectDebug('Deployed aspects', {\n count: result.valid.length,\n results: deployResponse.results,\n })\n } catch (error) {\n const err = error as Error\n deployAspectDebug('Failed to deploy aspects', {\n all,\n aspectName,\n error: err,\n mediaLibraryId: mediaLibraryIdFlag,\n })\n this.error(\n styleText('bold', 'Failed to deploy aspects') + `\\n\\n${styleText('red', err.message)}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n /**\n * Format a list of aspects for display\n */\n private formatAspectList(\n aspects: Array<{\n aspect: unknown\n filename: string\n validationErrors?: SchemaValidationProblem[][]\n }>,\n ): string {\n return aspects\n .map(({aspect, filename, validationErrors = []}) => {\n const label = isAssetAspect(aspect) ? aspect._id : 'Unnamed aspect'\n\n // Flatten the nested validation errors and extract messages\n const simplifiedErrors = validationErrors.flatMap((group) =>\n group.map(({message}) => message),\n )\n\n const errorLabel =\n simplifiedErrors.length > 0 ? ` ${styleText('bgRed', simplifiedErrors[0])}` : ''\n\n const remainingErrorsCount = simplifiedErrors.length - 1\n const remainingErrorsLabel =\n remainingErrorsCount > 0\n ? styleText(\n 'italic',\n ` and ${remainingErrorsCount} other ${pluralize('error', remainingErrorsCount)}`,\n )\n : ''\n\n return ` - ${label} ${styleText('dim', filename)}${errorLabel}${remainingErrorsLabel}`\n })\n .join('\\n')\n }\n}\n"],"names":["styleText","Args","Flags","SanityCommand","subdebug","spinner","isAssetAspect","getMediaLibraryConfig","importAspects","selectMediaLibrary","deployAspects","NO_MEDIA_LIBRARY_ASPECTS_PATH","NO_PROJECT_ID","pluralize","deployAspectDebug","MediaDeployAspectCommand","args","aspectName","string","description","required","examples","command","flags","all","boolean","run","mediaLibraryIdFlag","error","exit","cliConfig","getCliConfig","mediaLibrary","aspectsPath","projectId","getProjectId","mediaLibraryId","spin","start","result","filterAspects","aspect","_id","stop","invalid","length","logToStderr","warn","formatAspectList","valid","log","deploySpin","deployResponse","aspects","map","a","succeed","count","results","err","message","filename","validationErrors","label","simplifiedErrors","flatMap","group","errorLabel","remainingErrorsCount","remainingErrorsLabel","join"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/deploy-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {type CliConfig, ProjectRootNotFoundError, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isAssetAspect, type SchemaValidationProblem} from '@sanity/types'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {importAspects} from '../../actions/media/importAspects.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deployAspects} from '../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\nimport {pluralize} from '../../util/pluralize.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deployAspectDebug = subdebug('media:deploy-aspect')\n\nexport class MediaDeployAspectCommand extends SanityCommand<typeof MediaDeployAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to deploy',\n required: false,\n }),\n }\n\n static override description = 'Deploy an aspect'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Deploy the aspect named \"someAspect\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --all',\n description: 'Deploy all aspects',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to deploy media aspect to',\n semantics: 'override',\n }),\n all: Flags.boolean({\n description: 'Deploy all aspects',\n required: false,\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {all, 'media-library-id': mediaLibraryIdFlag} = this.flags\n\n // Validation: must provide either aspect name or --all flag\n if (!all && !aspectName) {\n this.error(\n 'Specify an aspect name, or use the `--all` option to deploy all aspect definitions.',\n {exit: 1},\n )\n }\n\n // Validation: cannot provide both aspect name and --all flag\n if (all && aspectName) {\n this.error('Specified both an aspect name and `--all`.', {exit: 1})\n }\n\n let cliConfig: CliConfig\n try {\n cliConfig = await this.getCliConfig()\n } catch (err) {\n if (err instanceof ProjectRootNotFoundError) {\n this.error(\n 'This command must be run from within a Sanity project directory (requires media library configuration)',\n {exit: 1},\n )\n }\n throw err\n }\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n\n if (!mediaLibrary?.aspectsPath) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: 1})\n }\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n try {\n // Determine target media library\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n // Import and validate aspects\n const spin = spinner('Loading aspect definitions').start()\n const result = await importAspects({\n aspectsPath: mediaLibrary.aspectsPath,\n filterAspects: (aspect) => {\n if (all) {\n return true\n }\n\n if (typeof aspect === 'object' && aspect !== null && '_id' in aspect) {\n return aspect._id === aspectName\n }\n\n return false\n },\n })\n spin.stop()\n\n // Handle invalid aspects\n if (result.invalid.length > 0) {\n this.logToStderr('')\n this.warn(\n styleText(\n 'bold',\n `Skipped ${result.invalid.length} invalid ${pluralize('aspect', result.invalid.length)}`,\n ),\n )\n this.logToStderr(this.formatAspectList(result.invalid))\n }\n\n // Check if we found the requested aspect (when not using --all)\n if (!all && result.valid.length === 0 && result.invalid.length === 0) {\n this.log()\n this.error(`Could not find aspect: ${styleText('bold', aspectName ?? '')}`, {exit: 1})\n }\n\n // Deploy valid aspects\n if (result.valid.length === 0) {\n this.logToStderr('')\n this.warn('No valid aspects to deploy')\n return\n }\n\n const deploySpin = spinner(\n `Deploying ${result.valid.length} ${pluralize('aspect', result.valid.length)}`,\n ).start()\n\n const deployResponse = await deployAspects({\n aspects: result.valid.map((a) => a.aspect),\n mediaLibraryId,\n })\n\n deploySpin.succeed()\n\n // Display success message\n this.log()\n this.log(\n `${styleText('green', '✓')} ${styleText('bold', `Deployed ${result.valid.length} ${pluralize('aspect', result.valid.length)}`)}`,\n )\n this.log(this.formatAspectList(result.valid))\n\n deployAspectDebug('Deployed aspects', {\n count: result.valid.length,\n results: deployResponse.results,\n })\n } catch (error) {\n const err = error as Error\n deployAspectDebug('Failed to deploy aspects', {\n all,\n aspectName,\n error: err,\n mediaLibraryId: mediaLibraryIdFlag,\n })\n this.error(\n styleText('bold', 'Failed to deploy aspects') + `\\n\\n${styleText('red', err.message)}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n /**\n * Format a list of aspects for display\n */\n private formatAspectList(\n aspects: Array<{\n aspect: unknown\n filename: string\n validationErrors?: SchemaValidationProblem[][]\n }>,\n ): string {\n return aspects\n .map(({aspect, filename, validationErrors = []}) => {\n const label = isAssetAspect(aspect) ? aspect._id : 'Unnamed aspect'\n\n // Flatten the nested validation errors and extract messages\n const simplifiedErrors = validationErrors.flatMap((group) =>\n group.map(({message}) => message),\n )\n\n const errorLabel =\n simplifiedErrors.length > 0 ? ` ${styleText('bgRed', simplifiedErrors[0])}` : ''\n\n const remainingErrorsCount = simplifiedErrors.length - 1\n const remainingErrorsLabel =\n remainingErrorsCount > 0\n ? styleText(\n 'italic',\n ` and ${remainingErrorsCount} other ${pluralize('error', remainingErrorsCount)}`,\n )\n : ''\n\n return ` - ${label} ${styleText('dim', filename)}${errorLabel}${remainingErrorsLabel}`\n })\n .join('\\n')\n }\n}\n"],"names":["styleText","Args","Flags","ProjectRootNotFoundError","SanityCommand","subdebug","spinner","isAssetAspect","getMediaLibraryConfig","importAspects","promptForProject","selectMediaLibrary","deployAspects","NO_MEDIA_LIBRARY_ASPECTS_PATH","pluralize","getProjectIdFlag","deployAspectDebug","MediaDeployAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","all","boolean","run","mediaLibraryIdFlag","error","exit","cliConfig","getCliConfig","err","mediaLibrary","aspectsPath","projectId","getProjectId","fallback","mediaLibraryId","spin","start","result","filterAspects","aspect","_id","stop","invalid","length","logToStderr","warn","formatAspectList","valid","log","deploySpin","deployResponse","aspects","map","a","succeed","count","results","message","filename","validationErrors","label","simplifiedErrors","flatMap","group","errorLabel","remainingErrorsCount","remainingErrorsLabel","join"],"mappings":"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"}
@@ -6,9 +6,10 @@ import { boxen, input, spinner } from '@sanity/cli-core/ux';
6
6
  import { exportDataset } from '@sanity/export';
7
7
  import prettyMs from 'pretty-ms';
8
8
  import { promptForMediaLibrary } from '../../prompts/promptForMediaLibrary.js';
9
+ import { promptForProject } from '../../prompts/promptForProject.js';
9
10
  import { getMediaLibraries } from '../../services/mediaLibraries.js';
10
11
  import { absolutify } from '../../util/absolutify.js';
11
- import { NO_PROJECT_ID } from '../../util/errorMessages.js';
12
+ import { getProjectIdFlag } from '../../util/sharedFlags.js';
12
13
  const noop = ()=>null;
13
14
  const exportDebug = subdebug('media:export');
14
15
  export class MediaExportCommand extends SanityCommand {
@@ -33,6 +34,10 @@ export class MediaExportCommand extends SanityCommand {
33
34
  }
34
35
  ];
35
36
  static flags = {
37
+ ...getProjectIdFlag({
38
+ description: 'Project ID to export media from',
39
+ semantics: 'override'
40
+ }),
36
41
  'asset-concurrency': Flags.integer({
37
42
  default: 8,
38
43
  description: 'Concurrent number of asset downloads'
@@ -52,12 +57,9 @@ export class MediaExportCommand extends SanityCommand {
52
57
  async run() {
53
58
  const { args, flags } = await this.parse(MediaExportCommand);
54
59
  const { destination: targetDestination } = args;
55
- const projectId = await this.getProjectId();
56
- if (!projectId) {
57
- this.error(NO_PROJECT_ID, {
58
- exit: 1
59
- });
60
- }
60
+ const projectId = await this.getProjectId({
61
+ fallback: ()=>promptForProject({})
62
+ });
61
63
  const projectClient = await getProjectCliClient({
62
64
  apiVersion: 'v2025-02-19',
63
65
  projectId,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/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 {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport prettyMs from 'pretty-ms'\n\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('media:export')\n\nexport class MediaExportCommand extends SanityCommand<typeof MediaExportCommand> {\n static override args = {\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export an archive of all file and image assets including their aspect data from the target media library. Video assets are excluded from the export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Export media library interactively',\n },\n {\n command: '<%= config.bin %> <%= command.id %> output.tar.gz',\n description: 'Export media library to output.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --media-library-id my-library-id',\n description: 'Export specific media library',\n },\n ]\n\n static override flags = {\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaExportCommand)\n const {destination: targetDestination} = args\n\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {\n exit: 1,\n })\n }\n\n const projectClient = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n projectId,\n requireUser: true,\n })\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n exportDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: 1})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n exportDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\nmediaLibraryId: ${mediaLibraryId.padEnd(37)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = await this.promptForDestination({mediaLibraryId})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, mediaLibraryId, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n client: projectClient,\n compress: !flags['no-compress'],\n mediaLibraryId,\n onProgress,\n outputPath,\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 succeed()\n\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\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 mediaLibraryId: 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 this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n\n const finalPath = looksLikeFile\n ? dstPath\n : path.join(dstPath, `${mediaLibraryId}-export.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: {\n mediaLibraryId: string\n workDir?: string\n }): Promise<string> {\n const {mediaLibraryId, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${mediaLibraryId}-export.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","promptForMediaLibrary","getMediaLibraries","absolutify","NO_PROJECT_ID","noop","exportDebug","MediaExportCommand","args","destination","string","description","examples","command","flags","integer","default","boolean","overwrite","run","parse","targetDestination","projectId","getProjectId","error","exit","projectClient","apiVersion","requireUser","mediaLibraries","Error","message","length","mediaLibraryId","some","library","id","log","padEnd","borderColor","borderStyle","destinationPath","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","client","compress","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","finalPath","join","finalPathStats","options","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/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 {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport prettyMs from 'pretty-ms'\n\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('media:export')\n\nexport class MediaExportCommand extends SanityCommand<typeof MediaExportCommand> {\n static override args = {\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export an archive of all file and image assets including their aspect data from the target media library. Video assets are excluded from the export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Export media library interactively',\n },\n {\n command: '<%= config.bin %> <%= command.id %> output.tar.gz',\n description: 'Export media library to output.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --media-library-id my-library-id',\n description: 'Export specific media library',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to export media from',\n semantics: 'override',\n }),\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaExportCommand)\n const {destination: targetDestination} = args\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n const projectClient = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n projectId,\n requireUser: true,\n })\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n exportDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: 1})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n exportDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\nmediaLibraryId: ${mediaLibraryId.padEnd(37)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = await this.promptForDestination({mediaLibraryId})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, mediaLibraryId, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n client: projectClient,\n compress: !flags['no-compress'],\n mediaLibraryId,\n onProgress,\n outputPath,\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 succeed()\n\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\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 mediaLibraryId: 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 this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n\n const finalPath = looksLikeFile\n ? dstPath\n : path.join(dstPath, `${mediaLibraryId}-export.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: {\n mediaLibraryId: string\n workDir?: string\n }): Promise<string> {\n const {mediaLibraryId, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${mediaLibraryId}-export.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","promptForMediaLibrary","promptForProject","getMediaLibraries","absolutify","getProjectIdFlag","noop","exportDebug","MediaExportCommand","args","destination","string","description","examples","command","flags","semantics","integer","default","boolean","overwrite","run","parse","targetDestination","projectId","getProjectId","fallback","projectClient","apiVersion","requireUser","mediaLibraries","error","Error","message","exit","length","mediaLibraryId","some","library","id","log","padEnd","borderColor","borderStyle","destinationPath","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","client","compress","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","finalPath","join","finalPathStats","options","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
@@ -6,8 +6,9 @@ import { pipe, scan, tap } from 'rxjs';
6
6
  import { importer } from '../../actions/media/importMedia.js';
7
7
  import { importMediaDebug } from '../../actions/media/importMediaDebug.js';
8
8
  import { promptForMediaLibrary } from '../../prompts/promptForMediaLibrary.js';
9
+ import { promptForProject } from '../../prompts/promptForProject.js';
9
10
  import { getMediaLibraries } from '../../services/mediaLibraries.js';
10
- import { NO_PROJECT_ID } from '../../util/errorMessages.js';
11
+ import { getProjectIdFlag } from '../../util/sharedFlags.js';
11
12
  export class MediaImportCommand extends SanityCommand {
12
13
  static args = {
13
14
  source: Args.string({
@@ -31,6 +32,10 @@ export class MediaImportCommand extends SanityCommand {
31
32
  }
32
33
  ];
33
34
  static flags = {
35
+ ...getProjectIdFlag({
36
+ description: 'Project ID to import media to',
37
+ semantics: 'override'
38
+ }),
34
39
  'media-library-id': Flags.string({
35
40
  description: 'The id of the target media library'
36
41
  }),
@@ -42,14 +47,11 @@ export class MediaImportCommand extends SanityCommand {
42
47
  const { args, flags } = await this.parse(MediaImportCommand);
43
48
  const { source } = args;
44
49
  const replaceAspects = flags['replace-aspects'];
45
- const projectId = await this.getProjectId();
46
- const cliConfig = await this.getCliConfig();
50
+ const projectId = await this.getProjectId({
51
+ fallback: ()=>promptForProject({})
52
+ });
53
+ const cliConfig = await this.tryGetCliConfig();
47
54
  const dataset = cliConfig.api?.dataset;
48
- if (!projectId) {
49
- this.error(NO_PROJECT_ID, {
50
- exit: 1
51
- });
52
- }
53
55
  let mediaLibraries;
54
56
  try {
55
57
  mediaLibraries = await getMediaLibraries(projectId);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/import.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand} from '@sanity/cli-core'\nimport {boxen, spinner} from '@sanity/cli-core/ux'\nimport {SanityClient} from '@sanity/client'\nimport {type OperatorFunction, pipe, scan, tap} from 'rxjs'\n\nimport {importer, type State} from '../../actions/media/importMedia.js'\nimport {importMediaDebug} from '../../actions/media/importMediaDebug.js'\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nexport class MediaImportCommand extends SanityCommand<typeof MediaImportCommand> {\n static override args = {\n source: Args.string({\n description: 'Image file or folder to import from',\n required: true,\n }),\n }\n\n static override description = 'Import a set of assets to the target media library.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> products',\n description: 'Import all assets from the \"products\" directory',\n },\n {\n command: '<%= config.bin %> <%= command.id %> gallery.tar.gz',\n description: 'Import all assets from \"gallery\" archive',\n },\n {\n command: '<%= config.bin %> <%= command.id %> products --replace-aspects',\n description: 'Import all assets from the \"products\" directory and replace aspects',\n },\n ]\n\n static override flags = {\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'replace-aspects': Flags.boolean({\n description:\n 'Replace existing aspect data. All versions will be replaced (e.g. published and draft aspect data)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaImportCommand)\n const {source} = args\n const replaceAspects = flags['replace-aspects']\n\n const projectId = await this.getProjectId()\n const cliConfig = await this.getCliConfig()\n const dataset = cliConfig.api?.dataset\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {\n exit: 1,\n })\n }\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n importMediaDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: 1})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n importMediaDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {exit: 1})\n }\n\n const projectClient = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n dataset,\n perspective: 'drafts',\n projectId,\n requestTagPrefix: 'sanity.mediaLibraryCli.import',\n requireUser: true,\n '~experimental_resource': {\n id: mediaLibraryId,\n type: 'media-library',\n },\n })\n\n this.log(\n boxen(\n `\n Importing to media library: ${mediaLibraryId.padEnd(37)}\n Importing from path: ${source}\n `,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n const spin = spinner('Beginning import…').start()\n\n await this.importAssets({projectClient, replaceAspects, source, spin})\n }\n\n private async importAssets(options: {\n projectClient: SanityClient\n replaceAspects: boolean\n source: string\n spin: ReturnType<typeof spinner>\n }): Promise<void> {\n const {projectClient, replaceAspects, source, spin} = options\n\n return new Promise<void>((resolve, reject) => {\n const subscription = importer({\n client: projectClient,\n replaceAspects,\n sourcePath: source,\n spinner: spin,\n })\n .pipe(this.reportResult(spin))\n .subscribe({\n complete: () => {\n resolve()\n },\n error: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n spin.stop()\n reject(new Error(message))\n },\n })\n\n // Cleanup on Ctrl+C\n process.once('SIGINT', () => {\n subscription.unsubscribe()\n spin.fail('Import interrupted.')\n process.exit(130)\n })\n }).catch((error) => {\n this.error(styleText('red', error.message), {exit: 1})\n })\n }\n\n private reportResult(\n spin: ReturnType<typeof spinner>,\n ): OperatorFunction<State, [number, State | undefined]> {\n let previousState: State | undefined\n\n return pipe(\n scan<State, [number, State | undefined]>(\n (processedAssetsCount, state) => [processedAssetsCount[0] + 1, state],\n [0, undefined],\n ),\n tap({\n complete: () => spin.succeed(`Imported ${previousState?.fileCount} assets`),\n next: ([processedAssetsCount, state]) => {\n previousState = state\n spin.text = `${processedAssetsCount} of ${state?.fileCount} assets imported ${styleText('dim', state?.asset.originalFilename ?? '')}`\n },\n }),\n )\n }\n}\n"],"names":["styleText","Args","Flags","getProjectCliClient","SanityCommand","boxen","spinner","pipe","scan","tap","importer","importMediaDebug","promptForMediaLibrary","getMediaLibraries","NO_PROJECT_ID","MediaImportCommand","args","source","string","description","required","examples","command","flags","boolean","run","parse","replaceAspects","projectId","getProjectId","cliConfig","getCliConfig","dataset","api","error","exit","mediaLibraries","Error","message","length","mediaLibraryId","some","library","id","projectClient","apiVersion","perspective","requestTagPrefix","requireUser","type","log","padEnd","borderColor","borderStyle","spin","start","importAssets","options","Promise","resolve","reject","subscription","client","sourcePath","reportResult","subscribe","complete","String","stop","process","once","unsubscribe","fail","catch","previousState","processedAssetsCount","state","undefined","succeed","fileCount","next","text","asset","originalFilename"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/import.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand} from '@sanity/cli-core'\nimport {boxen, spinner} from '@sanity/cli-core/ux'\nimport {SanityClient} from '@sanity/client'\nimport {type OperatorFunction, pipe, scan, tap} from 'rxjs'\n\nimport {importer, type State} from '../../actions/media/importMedia.js'\nimport {importMediaDebug} from '../../actions/media/importMediaDebug.js'\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nexport class MediaImportCommand extends SanityCommand<typeof MediaImportCommand> {\n static override args = {\n source: Args.string({\n description: 'Image file or folder to import from',\n required: true,\n }),\n }\n\n static override description = 'Import a set of assets to the target media library.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> products',\n description: 'Import all assets from the \"products\" directory',\n },\n {\n command: '<%= config.bin %> <%= command.id %> gallery.tar.gz',\n description: 'Import all assets from \"gallery\" archive',\n },\n {\n command: '<%= config.bin %> <%= command.id %> products --replace-aspects',\n description: 'Import all assets from the \"products\" directory and replace aspects',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to import media to',\n semantics: 'override',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'replace-aspects': Flags.boolean({\n description:\n 'Replace existing aspect data. All versions will be replaced (e.g. published and draft aspect data)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaImportCommand)\n const {source} = args\n const replaceAspects = flags['replace-aspects']\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n const cliConfig = await this.tryGetCliConfig()\n const dataset = cliConfig.api?.dataset\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n importMediaDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: 1})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n importMediaDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {exit: 1})\n }\n\n const projectClient = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n dataset,\n perspective: 'drafts',\n projectId,\n requestTagPrefix: 'sanity.mediaLibraryCli.import',\n requireUser: true,\n '~experimental_resource': {\n id: mediaLibraryId,\n type: 'media-library',\n },\n })\n\n this.log(\n boxen(\n `\n Importing to media library: ${mediaLibraryId.padEnd(37)}\n Importing from path: ${source}\n `,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n const spin = spinner('Beginning import…').start()\n\n await this.importAssets({projectClient, replaceAspects, source, spin})\n }\n\n private async importAssets(options: {\n projectClient: SanityClient\n replaceAspects: boolean\n source: string\n spin: ReturnType<typeof spinner>\n }): Promise<void> {\n const {projectClient, replaceAspects, source, spin} = options\n\n return new Promise<void>((resolve, reject) => {\n const subscription = importer({\n client: projectClient,\n replaceAspects,\n sourcePath: source,\n spinner: spin,\n })\n .pipe(this.reportResult(spin))\n .subscribe({\n complete: () => {\n resolve()\n },\n error: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n spin.stop()\n reject(new Error(message))\n },\n })\n\n // Cleanup on Ctrl+C\n process.once('SIGINT', () => {\n subscription.unsubscribe()\n spin.fail('Import interrupted.')\n process.exit(130)\n })\n }).catch((error) => {\n this.error(styleText('red', error.message), {exit: 1})\n })\n }\n\n private reportResult(\n spin: ReturnType<typeof spinner>,\n ): OperatorFunction<State, [number, State | undefined]> {\n let previousState: State | undefined\n\n return pipe(\n scan<State, [number, State | undefined]>(\n (processedAssetsCount, state) => [processedAssetsCount[0] + 1, state],\n [0, undefined],\n ),\n tap({\n complete: () => spin.succeed(`Imported ${previousState?.fileCount} assets`),\n next: ([processedAssetsCount, state]) => {\n previousState = state\n spin.text = `${processedAssetsCount} of ${state?.fileCount} assets imported ${styleText('dim', state?.asset.originalFilename ?? '')}`\n },\n }),\n )\n }\n}\n"],"names":["styleText","Args","Flags","getProjectCliClient","SanityCommand","boxen","spinner","pipe","scan","tap","importer","importMediaDebug","promptForMediaLibrary","promptForProject","getMediaLibraries","getProjectIdFlag","MediaImportCommand","args","source","string","description","required","examples","command","flags","semantics","boolean","run","parse","replaceAspects","projectId","getProjectId","fallback","cliConfig","tryGetCliConfig","dataset","api","mediaLibraries","error","Error","message","exit","length","mediaLibraryId","some","library","id","projectClient","apiVersion","perspective","requestTagPrefix","requireUser","type","log","padEnd","borderColor","borderStyle","spin","start","importAssets","options","Promise","resolve","reject","subscription","client","sourcePath","reportResult","subscribe","complete","String","stop","process","once","unsubscribe","fail","catch","previousState","processedAssetsCount","state","undefined","succeed","fileCount","next","text","asset","originalFilename"],"mappings":"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"}
@@ -21,12 +21,10 @@ export class PreviewCommand extends SanityCommand {
21
21
  ];
22
22
  static flags = {
23
23
  host: Flags.string({
24
- default: 'localhost',
25
- description: 'The local network interface at which to listen.'
24
+ description: '[default: localhost] The local network interface at which to listen.'
26
25
  }),
27
26
  port: Flags.string({
28
- default: '3333',
29
- description: 'TCP port to start server on.'
27
+ description: '[default: 3333] TCP port to start server on.'
30
28
  })
31
29
  };
32
30
  async run() {