@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/actions/build/writeSanityRuntime.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {tryFindStudioConfigPath} from '@sanity/cli-core'\nimport {watch as chokidarWatch, type FSWatcher} from 'chokidar'\n\nimport {buildDebug} from './buildDebug.js'\nimport {decorateIndexWithAutoGeneratedWarning} from './decorateIndexWithAutoGeneratedWarning.js'\nimport {decorateIndexWithBridgeScript} from './decorateIndexWithBridgeScript.js'\nimport {getEntryModule} from './getEntryModule.js'\nimport {getPossibleDocumentComponentLocations} from './getPossibleDocumentComponentLocations.js'\nimport {renderDocument} from './renderDocument.js'\n\ninterface RuntimeOptions {\n cwd: string\n reactStrictMode: boolean\n watch: boolean\n\n basePath?: string\n entry?: string\n isApp?: boolean\n}\n\n/**\n * Generates the `.sanity/runtime` directory, and optionally watches for custom\n * document files, rebuilding when they change\n *\n * @param options - Current working directory (Sanity root dir), and whether or not to watch\n * @returns A watcher instance if watch is enabled, undefined otherwise\n * @internal\n */\nexport async function writeSanityRuntime(options: RuntimeOptions): Promise<FSWatcher | undefined> {\n const {basePath, cwd, entry, isApp, reactStrictMode, watch} = options\n const runtimeDir = path.join(cwd, '.sanity', 'runtime')\n\n buildDebug('Making runtime directory')\n await fs.mkdir(runtimeDir, {recursive: true})\n\n async function renderAndWriteDocument() {\n buildDebug('Rendering document template')\n const indexHtml = decorateIndexWithBridgeScript(\n decorateIndexWithAutoGeneratedWarning(\n await renderDocument({\n isApp,\n props: {\n basePath: basePath || '/',\n entryPath: `/${path.relative(cwd, path.join(runtimeDir, 'app.js'))}`,\n },\n studioRootPath: cwd,\n }),\n ),\n )\n\n buildDebug('Writing index.html to runtime directory')\n await fs.writeFile(path.join(runtimeDir, 'index.html'), indexHtml)\n }\n\n let watcher: FSWatcher | undefined\n\n if (watch) {\n watcher = chokidarWatch(getPossibleDocumentComponentLocations(cwd)).on('all', () =>\n renderAndWriteDocument(),\n )\n }\n\n await renderAndWriteDocument()\n\n buildDebug('Writing app.js to runtime directory')\n let relativeConfigLocation: string | null = null\n if (!isApp) {\n const studioConfigPath = await tryFindStudioConfigPath(cwd)\n relativeConfigLocation = studioConfigPath ? path.relative(runtimeDir, studioConfigPath) : null\n }\n\n const relativeEntry = cwd ? path.resolve(cwd, entry || './src/App') : entry\n const appJsContent = getEntryModule({\n basePath,\n entry: relativeEntry,\n isApp,\n reactStrictMode,\n relativeConfigLocation,\n })\n await fs.writeFile(path.join(runtimeDir, 'app.js'), appJsContent)\n\n return watcher\n}\n"],"names":["fs","path","tryFindStudioConfigPath","watch","chokidarWatch","buildDebug","decorateIndexWithAutoGeneratedWarning","decorateIndexWithBridgeScript","getEntryModule","getPossibleDocumentComponentLocations","renderDocument","writeSanityRuntime","options","basePath","cwd","entry","isApp","reactStrictMode","runtimeDir","join","mkdir","recursive","renderAndWriteDocument","indexHtml","props","entryPath","relative","studioRootPath","writeFile","watcher","on","relativeConfigLocation","studioConfigPath","relativeEntry","resolve","appJsContent"],"mappings":"AAAA,OAAOA,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,SAAQC,uBAAuB,QAAO,mBAAkB;AACxD,SAAQC,SAASC,aAAa,QAAuB,WAAU;AAE/D,SAAQC,UAAU,QAAO,kBAAiB;AAC1C,SAAQC,qCAAqC,QAAO,6CAA4C;AAChG,SAAQC,6BAA6B,QAAO,qCAAoC;AAChF,SAAQC,cAAc,QAAO,sBAAqB;AAClD,SAAQC,qCAAqC,QAAO,6CAA4C;AAChG,SAAQC,cAAc,QAAO,sBAAqB;AAYlD;;;;;;;CAOC,GACD,OAAO,eAAeC,mBAAmBC,OAAuB;IAC9D,MAAM,EAACC,QAAQ,EAAEC,GAAG,EAAEC,KAAK,EAAEC,KAAK,EAAEC,eAAe,EAAEd,KAAK,EAAC,GAAGS;IAC9D,MAAMM,aAAajB,KAAKkB,IAAI,CAACL,KAAK,WAAW;IAE7CT,WAAW;IACX,MAAML,GAAGoB,KAAK,CAACF,YAAY;QAACG,WAAW;IAAI;IAE3C,eAAeC;QACbjB,WAAW;QACX,MAAMkB,YAAYhB,8BAChBD,sCACE,MAAMI,eAAe;YACnBM;YACAQ,OAAO;gBACLX,UAAUA,YAAY;gBACtBY,WAAW,CAAC,CAAC,EAAExB,KAAKyB,QAAQ,CAACZ,KAAKb,KAAKkB,IAAI,CAACD,YAAY,YAAY;YACtE;YACAS,gBAAgBb;QAClB;QAIJT,WAAW;QACX,MAAML,GAAG4B,SAAS,CAAC3B,KAAKkB,IAAI,CAACD,YAAY,eAAeK;IAC1D;IAEA,IAAIM;IAEJ,IAAI1B,OAAO;QACT0B,UAAUzB,cAAcK,sCAAsCK,MAAMgB,EAAE,CAAC,OAAO,IAC5ER;IAEJ;IAEA,MAAMA;IAENjB,WAAW;IACX,IAAI0B,yBAAwC;IAC5C,IAAI,CAACf,OAAO;QACV,MAAMgB,mBAAmB,MAAM9B,wBAAwBY;QACvDiB,yBAAyBC,mBAAmB/B,KAAKyB,QAAQ,CAACR,YAAYc,oBAAoB;IAC5F;IAEA,MAAMC,gBAAgBnB,MAAMb,KAAKiC,OAAO,CAACpB,KAAKC,SAAS,eAAeA;IACtE,MAAMoB,eAAe3B,eAAe;QAClCK;QACAE,OAAOkB;QACPjB;QACAC;QACAc;IACF;IACA,MAAM/B,GAAG4B,SAAS,CAAC3B,KAAKkB,IAAI,CAACD,YAAY,WAAWiB;IAEpD,OAAON;AACT"}
1
+ {"version":3,"sources":["../../../src/actions/build/writeSanityRuntime.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {tryFindStudioConfigPath} from '@sanity/cli-core'\nimport {watch as chokidarWatch, type FSWatcher} from 'chokidar'\n\nimport {toForwardSlashes} from '../../util/toForwardSlashes.js'\nimport {buildDebug} from './buildDebug.js'\nimport {decorateIndexWithAutoGeneratedWarning} from './decorateIndexWithAutoGeneratedWarning.js'\nimport {decorateIndexWithBridgeScript} from './decorateIndexWithBridgeScript.js'\nimport {getEntryModule} from './getEntryModule.js'\nimport {getPossibleDocumentComponentLocations} from './getPossibleDocumentComponentLocations.js'\nimport {renderDocument} from './renderDocument.js'\n\ninterface RuntimeOptions {\n cwd: string\n reactStrictMode: boolean\n watch: boolean\n\n basePath?: string\n entry?: string\n isApp?: boolean\n}\n\n/**\n * Generates the `.sanity/runtime` directory, and optionally watches for custom\n * document files, rebuilding when they change\n *\n * @param options - Current working directory (Sanity root dir), and whether or not to watch\n * @returns A watcher instance if watch is enabled, undefined otherwise\n * @internal\n */\nexport async function writeSanityRuntime(options: RuntimeOptions): Promise<FSWatcher | undefined> {\n const {basePath, cwd, entry, isApp, reactStrictMode, watch} = options\n const runtimeDir = path.join(cwd, '.sanity', 'runtime')\n\n buildDebug('Making runtime directory')\n await fs.mkdir(runtimeDir, {recursive: true})\n\n async function renderAndWriteDocument() {\n buildDebug('Rendering document template')\n const indexHtml = decorateIndexWithBridgeScript(\n decorateIndexWithAutoGeneratedWarning(\n await renderDocument({\n isApp,\n props: {\n basePath: basePath || '/',\n entryPath: `/${toForwardSlashes(path.relative(cwd, path.join(runtimeDir, 'app.js')))}`,\n },\n studioRootPath: cwd,\n }),\n ),\n )\n\n buildDebug('Writing index.html to runtime directory')\n await fs.writeFile(path.join(runtimeDir, 'index.html'), indexHtml)\n }\n\n let watcher: FSWatcher | undefined\n\n if (watch) {\n watcher = chokidarWatch(getPossibleDocumentComponentLocations(cwd)).on('all', () =>\n renderAndWriteDocument(),\n )\n }\n\n await renderAndWriteDocument()\n\n buildDebug('Writing app.js to runtime directory')\n let relativeConfigLocation: string | null = null\n if (!isApp) {\n const studioConfigPath = await tryFindStudioConfigPath(cwd)\n relativeConfigLocation = studioConfigPath\n ? toForwardSlashes(path.relative(runtimeDir, studioConfigPath))\n : null\n }\n\n const relativeEntry = toForwardSlashes(\n path.relative(runtimeDir, path.resolve(cwd, entry || './src/App')),\n )\n const appJsContent = getEntryModule({\n basePath,\n entry: relativeEntry,\n isApp,\n reactStrictMode,\n relativeConfigLocation,\n })\n await fs.writeFile(path.join(runtimeDir, 'app.js'), appJsContent)\n\n return watcher\n}\n"],"names":["fs","path","tryFindStudioConfigPath","watch","chokidarWatch","toForwardSlashes","buildDebug","decorateIndexWithAutoGeneratedWarning","decorateIndexWithBridgeScript","getEntryModule","getPossibleDocumentComponentLocations","renderDocument","writeSanityRuntime","options","basePath","cwd","entry","isApp","reactStrictMode","runtimeDir","join","mkdir","recursive","renderAndWriteDocument","indexHtml","props","entryPath","relative","studioRootPath","writeFile","watcher","on","relativeConfigLocation","studioConfigPath","relativeEntry","resolve","appJsContent"],"mappings":"AAAA,OAAOA,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,SAAQC,uBAAuB,QAAO,mBAAkB;AACxD,SAAQC,SAASC,aAAa,QAAuB,WAAU;AAE/D,SAAQC,gBAAgB,QAAO,iCAAgC;AAC/D,SAAQC,UAAU,QAAO,kBAAiB;AAC1C,SAAQC,qCAAqC,QAAO,6CAA4C;AAChG,SAAQC,6BAA6B,QAAO,qCAAoC;AAChF,SAAQC,cAAc,QAAO,sBAAqB;AAClD,SAAQC,qCAAqC,QAAO,6CAA4C;AAChG,SAAQC,cAAc,QAAO,sBAAqB;AAYlD;;;;;;;CAOC,GACD,OAAO,eAAeC,mBAAmBC,OAAuB;IAC9D,MAAM,EAACC,QAAQ,EAAEC,GAAG,EAAEC,KAAK,EAAEC,KAAK,EAAEC,eAAe,EAAEf,KAAK,EAAC,GAAGU;IAC9D,MAAMM,aAAalB,KAAKmB,IAAI,CAACL,KAAK,WAAW;IAE7CT,WAAW;IACX,MAAMN,GAAGqB,KAAK,CAACF,YAAY;QAACG,WAAW;IAAI;IAE3C,eAAeC;QACbjB,WAAW;QACX,MAAMkB,YAAYhB,8BAChBD,sCACE,MAAMI,eAAe;YACnBM;YACAQ,OAAO;gBACLX,UAAUA,YAAY;gBACtBY,WAAW,CAAC,CAAC,EAAErB,iBAAiBJ,KAAK0B,QAAQ,CAACZ,KAAKd,KAAKmB,IAAI,CAACD,YAAY,aAAa;YACxF;YACAS,gBAAgBb;QAClB;QAIJT,WAAW;QACX,MAAMN,GAAG6B,SAAS,CAAC5B,KAAKmB,IAAI,CAACD,YAAY,eAAeK;IAC1D;IAEA,IAAIM;IAEJ,IAAI3B,OAAO;QACT2B,UAAU1B,cAAcM,sCAAsCK,MAAMgB,EAAE,CAAC,OAAO,IAC5ER;IAEJ;IAEA,MAAMA;IAENjB,WAAW;IACX,IAAI0B,yBAAwC;IAC5C,IAAI,CAACf,OAAO;QACV,MAAMgB,mBAAmB,MAAM/B,wBAAwBa;QACvDiB,yBAAyBC,mBACrB5B,iBAAiBJ,KAAK0B,QAAQ,CAACR,YAAYc,qBAC3C;IACN;IAEA,MAAMC,gBAAgB7B,iBACpBJ,KAAK0B,QAAQ,CAACR,YAAYlB,KAAKkC,OAAO,CAACpB,KAAKC,SAAS;IAEvD,MAAMoB,eAAe3B,eAAe;QAClCK;QACAE,OAAOkB;QACPjB;QACAC;QACAc;IACF;IACA,MAAMhC,GAAG6B,SAAS,CAAC5B,KAAKmB,IAAI,CAACD,YAAY,WAAWiB;IAEpD,OAAON;AACT"}
@@ -1,4 +1,4 @@
1
- import semverCompare from 'semver-compare';
1
+ import semver from 'semver';
2
2
  import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
3
3
  const purpose = 'Transform react-icons v2 imports to v3 form';
4
4
  const description = `
@@ -21,7 +21,7 @@ export const reactIconsV3 = {
21
21
  if (!dependencyVersion) {
22
22
  throw new Error('Could not find react-icons declared as dependency in package.json');
23
23
  }
24
- if (semverCompare(dependencyVersion, '3.0.0') < 0) {
24
+ if (semver.compare(dependencyVersion, '3.0.0') < 0) {
25
25
  throw new Error('react-icons declared in package.json dependencies is lower than 3.0.0');
26
26
  }
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/codemods/reactIconsV3.ts"],"sourcesContent":["import semverCompare from 'semver-compare'\n\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {type CodeMod} from './types.js'\n\nconst purpose = 'Transform react-icons v2 imports to v3 form'\nconst description = `\nModifies all found react-icons import and require statements from their v2 form\nto the path structure used in react-icons v3. For instance:\n\nfrom: import {MdPerson} from 'react-icons/lib/md'\n to: import {MdPerson} from 'react-icons/md'\n\nfrom: import PersonIcon from 'react-icons/lib/md/person'\n to: import {MdPerson as PersonIcon} from 'react-icons/md'\n`.trim()\n\nexport const reactIconsV3: CodeMod = {\n description,\n filename: 'reactIconsV3.js',\n purpose,\n verify: async (context) => {\n const {workDir} = context\n\n const dependencyVersion = await getLocalPackageVersion('react-icons', workDir)\n if (!dependencyVersion) {\n throw new Error('Could not find react-icons declared as dependency in package.json')\n }\n\n if (semverCompare(dependencyVersion, '3.0.0') < 0) {\n throw new Error('react-icons declared in package.json dependencies is lower than 3.0.0')\n }\n },\n}\n"],"names":["semverCompare","getLocalPackageVersion","purpose","description","trim","reactIconsV3","filename","verify","context","workDir","dependencyVersion","Error"],"mappings":"AAAA,OAAOA,mBAAmB,iBAAgB;AAE1C,SAAQC,sBAAsB,QAAO,uCAAsC;AAG3E,MAAMC,UAAU;AAChB,MAAMC,cAAc,CAAC;;;;;;;;;AASrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,eAAwB;IACnCF;IACAG,UAAU;IACVJ;IACAK,QAAQ,OAAOC;QACb,MAAM,EAACC,OAAO,EAAC,GAAGD;QAElB,MAAME,oBAAoB,MAAMT,uBAAuB,eAAeQ;QACtE,IAAI,CAACC,mBAAmB;YACtB,MAAM,IAAIC,MAAM;QAClB;QAEA,IAAIX,cAAcU,mBAAmB,WAAW,GAAG;YACjD,MAAM,IAAIC,MAAM;QAClB;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/actions/codemods/reactIconsV3.ts"],"sourcesContent":["import semver from 'semver'\n\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {type CodeMod} from './types.js'\n\nconst purpose = 'Transform react-icons v2 imports to v3 form'\nconst description = `\nModifies all found react-icons import and require statements from their v2 form\nto the path structure used in react-icons v3. For instance:\n\nfrom: import {MdPerson} from 'react-icons/lib/md'\n to: import {MdPerson} from 'react-icons/md'\n\nfrom: import PersonIcon from 'react-icons/lib/md/person'\n to: import {MdPerson as PersonIcon} from 'react-icons/md'\n`.trim()\n\nexport const reactIconsV3: CodeMod = {\n description,\n filename: 'reactIconsV3.js',\n purpose,\n verify: async (context) => {\n const {workDir} = context\n\n const dependencyVersion = await getLocalPackageVersion('react-icons', workDir)\n if (!dependencyVersion) {\n throw new Error('Could not find react-icons declared as dependency in package.json')\n }\n\n if (semver.compare(dependencyVersion, '3.0.0') < 0) {\n throw new Error('react-icons declared in package.json dependencies is lower than 3.0.0')\n }\n },\n}\n"],"names":["semver","getLocalPackageVersion","purpose","description","trim","reactIconsV3","filename","verify","context","workDir","dependencyVersion","Error","compare"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAE3B,SAAQC,sBAAsB,QAAO,uCAAsC;AAG3E,MAAMC,UAAU;AAChB,MAAMC,cAAc,CAAC;;;;;;;;;AASrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,eAAwB;IACnCF;IACAG,UAAU;IACVJ;IACAK,QAAQ,OAAOC;QACb,MAAM,EAACC,OAAO,EAAC,GAAGD;QAElB,MAAME,oBAAoB,MAAMT,uBAAuB,eAAeQ;QACtE,IAAI,CAACC,mBAAmB;YACtB,MAAM,IAAIC,MAAM;QAClB;QAEA,IAAIX,OAAOY,OAAO,CAACF,mBAAmB,WAAW,GAAG;YAClD,MAAM,IAAIC,MAAM;QAClB;IACF;AACF,EAAC"}
@@ -15,7 +15,7 @@ const debug = subdebug('dataset:create');
15
15
  * @returns Promise resolving when dataset is created
16
16
  * @throws Error if dataset creation fails
17
17
  */ export async function createDataset(options) {
18
- const { datasetName, forcePublic = false, isUnattended = false, output, projectFeatures, projectId, visibility } = options;
18
+ const { datasetName, embeddings, embeddingsProjection, forcePublic = false, isUnattended = false, output, projectFeatures, projectId, visibility } = options;
19
19
  const canCreatePrivate = projectFeatures.includes('privateDataset') && !forcePublic;
20
20
  // Determine the appropriate ACL mode
21
21
  const aclMode = await determineDatasetAclMode({
@@ -29,6 +29,12 @@ const debug = subdebug('dataset:create');
29
29
  const newDataset = await createDatasetService({
30
30
  aclMode,
31
31
  datasetName,
32
+ embeddings: embeddings ? {
33
+ enabled: true,
34
+ ...embeddingsProjection ? {
35
+ projection: embeddingsProjection
36
+ } : {}
37
+ } : undefined,
32
38
  projectId
33
39
  });
34
40
  spin.succeed();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/dataset/create.ts"],"sourcesContent":["import {type Output, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type DatasetAclMode, DatasetResponse} from '@sanity/client'\n\nimport {createDataset as createDatasetService} from '../../services/datasets.js'\nimport {determineDatasetAclMode} from './determineDatasetAclMode.js'\n\nconst debug = subdebug('dataset:create')\n\n/**\n * Options for creating a dataset\n */\nexport interface CreateDatasetOptions {\n /**\n * Name of the dataset to create\n */\n datasetName: string\n\n /**\n * Output instance for logging\n */\n output: Output\n\n /**\n * Array of project features to determine capabilities\n * Used to check if private datasets are available\n */\n projectFeatures: string[]\n\n /**\n * Project ID where the dataset will be created\n */\n projectId: string\n\n /**\n * Whether to force disable private dataset creation\n * Used when default config is selected (which forces public datasets)\n */\n forcePublic?: boolean\n\n /**\n * Whether to run in unattended mode (no prompts)\n */\n isUnattended?: boolean\n\n /**\n * Requested visibility mode from flags/options\n */\n visibility?: string\n}\n\n/**\n * Creates a new dataset with the appropriate ACL mode.\n *\n * This action handles the business logic for:\n * - Determining the appropriate ACL mode based on project capabilities\n * - Creating the dataset via the service layer\n * - Handling errors and providing user feedback\n *\n * @param options - Configuration options\n * @returns Promise resolving when dataset is created\n * @throws Error if dataset creation fails\n */\nexport async function createDataset(options: CreateDatasetOptions): Promise<DatasetResponse> {\n const {\n datasetName,\n forcePublic = false,\n isUnattended = false,\n output,\n projectFeatures,\n projectId,\n visibility,\n } = options\n\n const canCreatePrivate = projectFeatures.includes('privateDataset') && !forcePublic\n\n // Determine the appropriate ACL mode\n const aclMode: DatasetAclMode = await determineDatasetAclMode({\n canCreatePrivate,\n isUnattended,\n output,\n visibility,\n })\n\n try {\n const spin = spinner('Creating dataset').start()\n const newDataset = await createDatasetService({\n aclMode,\n datasetName,\n projectId,\n })\n spin.succeed()\n output.log(`Dataset created successfully`)\n return newDataset\n } catch (error) {\n debug('Error creating dataset', {datasetName, error})\n throw error\n }\n}\n"],"names":["subdebug","spinner","createDataset","createDatasetService","determineDatasetAclMode","debug","options","datasetName","forcePublic","isUnattended","output","projectFeatures","projectId","visibility","canCreatePrivate","includes","aclMode","spin","start","newDataset","succeed","log","error"],"mappings":"AAAA,SAAqBA,QAAQ,QAAO,mBAAkB;AACtD,SAAQC,OAAO,QAAO,sBAAqB;AAG3C,SAAQC,iBAAiBC,oBAAoB,QAAO,6BAA4B;AAChF,SAAQC,uBAAuB,QAAO,+BAA8B;AAEpE,MAAMC,QAAQL,SAAS;AA4CvB;;;;;;;;;;;CAWC,GACD,OAAO,eAAeE,cAAcI,OAA6B;IAC/D,MAAM,EACJC,WAAW,EACXC,cAAc,KAAK,EACnBC,eAAe,KAAK,EACpBC,MAAM,EACNC,eAAe,EACfC,SAAS,EACTC,UAAU,EACX,GAAGP;IAEJ,MAAMQ,mBAAmBH,gBAAgBI,QAAQ,CAAC,qBAAqB,CAACP;IAExE,qCAAqC;IACrC,MAAMQ,UAA0B,MAAMZ,wBAAwB;QAC5DU;QACAL;QACAC;QACAG;IACF;IAEA,IAAI;QACF,MAAMI,OAAOhB,QAAQ,oBAAoBiB,KAAK;QAC9C,MAAMC,aAAa,MAAMhB,qBAAqB;YAC5Ca;YACAT;YACAK;QACF;QACAK,KAAKG,OAAO;QACZV,OAAOW,GAAG,CAAC,CAAC,4BAA4B,CAAC;QACzC,OAAOF;IACT,EAAE,OAAOG,OAAO;QACdjB,MAAM,0BAA0B;YAACE;YAAae;QAAK;QACnD,MAAMA;IACR;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/dataset/create.ts"],"sourcesContent":["import {type Output, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type DatasetAclMode, DatasetResponse} from '@sanity/client'\n\nimport {createDataset as createDatasetService} from '../../services/datasets.js'\nimport {determineDatasetAclMode} from './determineDatasetAclMode.js'\n\nconst debug = subdebug('dataset:create')\n\n/**\n * Options for creating a dataset\n */\ninterface CreateDatasetOptions {\n /**\n * Name of the dataset to create\n */\n datasetName: string\n\n /**\n * Output instance for logging\n */\n output: Output\n\n /**\n * Array of project features to determine capabilities\n * Used to check if private datasets are available\n */\n projectFeatures: string[]\n\n /**\n * Project ID where the dataset will be created\n */\n projectId: string\n\n /**\n * Whether to enable embeddings for the new dataset\n */\n embeddings?: boolean\n\n /**\n * GROQ projection for embeddings indexing (e.g. \"\\{ title, body \\}\")\n * Only used when embeddings is true\n */\n embeddingsProjection?: string\n\n /**\n * Whether to force disable private dataset creation\n * Used when default config is selected (which forces public datasets)\n */\n forcePublic?: boolean\n\n /**\n * Whether to run in unattended mode (no prompts)\n */\n isUnattended?: boolean\n\n /**\n * Requested visibility mode from flags/options\n */\n visibility?: string\n}\n\n/**\n * Creates a new dataset with the appropriate ACL mode.\n *\n * This action handles the business logic for:\n * - Determining the appropriate ACL mode based on project capabilities\n * - Creating the dataset via the service layer\n * - Handling errors and providing user feedback\n *\n * @param options - Configuration options\n * @returns Promise resolving when dataset is created\n * @throws Error if dataset creation fails\n */\nexport async function createDataset(options: CreateDatasetOptions): Promise<DatasetResponse> {\n const {\n datasetName,\n embeddings,\n embeddingsProjection,\n forcePublic = false,\n isUnattended = false,\n output,\n projectFeatures,\n projectId,\n visibility,\n } = options\n\n const canCreatePrivate = projectFeatures.includes('privateDataset') && !forcePublic\n\n // Determine the appropriate ACL mode\n const aclMode: DatasetAclMode = await determineDatasetAclMode({\n canCreatePrivate,\n isUnattended,\n output,\n visibility,\n })\n\n try {\n const spin = spinner('Creating dataset').start()\n const newDataset = await createDatasetService({\n aclMode,\n datasetName,\n embeddings: embeddings\n ? {enabled: true, ...(embeddingsProjection ? {projection: embeddingsProjection} : {})}\n : undefined,\n projectId,\n })\n spin.succeed()\n output.log(`Dataset created successfully`)\n return newDataset\n } catch (error) {\n debug('Error creating dataset', {datasetName, error})\n throw error\n }\n}\n"],"names":["subdebug","spinner","createDataset","createDatasetService","determineDatasetAclMode","debug","options","datasetName","embeddings","embeddingsProjection","forcePublic","isUnattended","output","projectFeatures","projectId","visibility","canCreatePrivate","includes","aclMode","spin","start","newDataset","enabled","projection","undefined","succeed","log","error"],"mappings":"AAAA,SAAqBA,QAAQ,QAAO,mBAAkB;AACtD,SAAQC,OAAO,QAAO,sBAAqB;AAG3C,SAAQC,iBAAiBC,oBAAoB,QAAO,6BAA4B;AAChF,SAAQC,uBAAuB,QAAO,+BAA8B;AAEpE,MAAMC,QAAQL,SAAS;AAuDvB;;;;;;;;;;;CAWC,GACD,OAAO,eAAeE,cAAcI,OAA6B;IAC/D,MAAM,EACJC,WAAW,EACXC,UAAU,EACVC,oBAAoB,EACpBC,cAAc,KAAK,EACnBC,eAAe,KAAK,EACpBC,MAAM,EACNC,eAAe,EACfC,SAAS,EACTC,UAAU,EACX,GAAGT;IAEJ,MAAMU,mBAAmBH,gBAAgBI,QAAQ,CAAC,qBAAqB,CAACP;IAExE,qCAAqC;IACrC,MAAMQ,UAA0B,MAAMd,wBAAwB;QAC5DY;QACAL;QACAC;QACAG;IACF;IAEA,IAAI;QACF,MAAMI,OAAOlB,QAAQ,oBAAoBmB,KAAK;QAC9C,MAAMC,aAAa,MAAMlB,qBAAqB;YAC5Ce;YACAX;YACAC,YAAYA,aACR;gBAACc,SAAS;gBAAM,GAAIb,uBAAuB;oBAACc,YAAYd;gBAAoB,IAAI,CAAC,CAAC;YAAC,IACnFe;YACJV;QACF;QACAK,KAAKM,OAAO;QACZb,OAAOc,GAAG,CAAC,CAAC,4BAA4B,CAAC;QACzC,OAAOL;IACT,EAAE,OAAOM,OAAO;QACdtB,MAAM,0BAA0B;YAACE;YAAaoB;QAAK;QACnD,MAAMA;IACR;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/dataset/determineDatasetAclMode.ts"],"sourcesContent":["import {type Output} from '@sanity/cli-core'\nimport {type DatasetAclMode} from '@sanity/client'\n\nimport {promptForDatasetAclMode} from '../../prompts/promptForDatasetAclMode.js'\n\n/**\n * Options for determining the ACL mode for a dataset\n */\nexport interface DetermineDatasetAclModeOptions {\n /**\n * Whether the project has the capability to create private datasets\n */\n canCreatePrivate: boolean\n /**\n * Output instance for logging warnings\n */\n output: Output\n\n /**\n * Whether to run in unattended mode (no prompts)\n */\n isUnattended?: boolean\n /**\n * Requested visibility mode from flags/options\n */\n visibility?: string\n}\n\n/**\n * Determines the appropriate ACL mode for a dataset based on project capabilities\n * and user preferences.\n *\n * This action handles the business logic for:\n * - Validating requested visibility against project capabilities\n * - Falling back to public when private is not available\n * - Prompting user when necessary\n * - Warning user about limitations\n *\n * @param options - Configuration options\n * @returns Promise resolving to the determined ACL mode\n */\nexport async function determineDatasetAclMode(\n options: DetermineDatasetAclModeOptions,\n): Promise<DatasetAclMode> {\n const {canCreatePrivate, isUnattended = false, output, visibility} = options\n\n // Handle explicit custom/public requests\n if (visibility === 'custom' || visibility === 'public') {\n return visibility\n }\n\n // Handle private visibility request\n if (visibility === 'private') {\n if (canCreatePrivate) {\n return 'private'\n }\n\n output.warn('Private datasets are not available for this project. Creating as public.')\n\n return 'public'\n }\n\n // No explicit request - determine based on capabilities and mode\n if (isUnattended || !canCreatePrivate) {\n return 'public'\n }\n\n // Interactive mode with private capability - prompt user\n return promptForDatasetAclMode(output)\n}\n"],"names":["promptForDatasetAclMode","determineDatasetAclMode","options","canCreatePrivate","isUnattended","output","visibility","warn"],"mappings":"AAGA,SAAQA,uBAAuB,QAAO,2CAA0C;AAyBhF;;;;;;;;;;;;CAYC,GACD,OAAO,eAAeC,wBACpBC,OAAuC;IAEvC,MAAM,EAACC,gBAAgB,EAAEC,eAAe,KAAK,EAAEC,MAAM,EAAEC,UAAU,EAAC,GAAGJ;IAErE,yCAAyC;IACzC,IAAII,eAAe,YAAYA,eAAe,UAAU;QACtD,OAAOA;IACT;IAEA,oCAAoC;IACpC,IAAIA,eAAe,WAAW;QAC5B,IAAIH,kBAAkB;YACpB,OAAO;QACT;QAEAE,OAAOE,IAAI,CAAC;QAEZ,OAAO;IACT;IAEA,iEAAiE;IACjE,IAAIH,gBAAgB,CAACD,kBAAkB;QACrC,OAAO;IACT;IAEA,yDAAyD;IACzD,OAAOH,wBAAwBK;AACjC"}
1
+ {"version":3,"sources":["../../../src/actions/dataset/determineDatasetAclMode.ts"],"sourcesContent":["import {type Output} from '@sanity/cli-core'\nimport {type DatasetAclMode} from '@sanity/client'\n\nimport {promptForDatasetAclMode} from '../../prompts/promptForDatasetAclMode.js'\n\n/**\n * Options for determining the ACL mode for a dataset\n */\ninterface DetermineDatasetAclModeOptions {\n /**\n * Whether the project has the capability to create private datasets\n */\n canCreatePrivate: boolean\n /**\n * Output instance for logging warnings\n */\n output: Output\n\n /**\n * Whether to run in unattended mode (no prompts)\n */\n isUnattended?: boolean\n /**\n * Requested visibility mode from flags/options\n */\n visibility?: string\n}\n\n/**\n * Determines the appropriate ACL mode for a dataset based on project capabilities\n * and user preferences.\n *\n * This action handles the business logic for:\n * - Validating requested visibility against project capabilities\n * - Falling back to public when private is not available\n * - Prompting user when necessary\n * - Warning user about limitations\n *\n * @param options - Configuration options\n * @returns Promise resolving to the determined ACL mode\n */\nexport async function determineDatasetAclMode(\n options: DetermineDatasetAclModeOptions,\n): Promise<DatasetAclMode> {\n const {canCreatePrivate, isUnattended = false, output, visibility} = options\n\n // Handle explicit custom/public requests\n if (visibility === 'custom' || visibility === 'public') {\n return visibility\n }\n\n // Handle private visibility request\n if (visibility === 'private') {\n if (canCreatePrivate) {\n return 'private'\n }\n\n output.warn('Private datasets are not available for this project. Creating as public.')\n\n return 'public'\n }\n\n // No explicit request - determine based on capabilities and mode\n if (isUnattended || !canCreatePrivate) {\n return 'public'\n }\n\n // Interactive mode with private capability - prompt user\n return promptForDatasetAclMode(output)\n}\n"],"names":["promptForDatasetAclMode","determineDatasetAclMode","options","canCreatePrivate","isUnattended","output","visibility","warn"],"mappings":"AAGA,SAAQA,uBAAuB,QAAO,2CAA0C;AAyBhF;;;;;;;;;;;;CAYC,GACD,OAAO,eAAeC,wBACpBC,OAAuC;IAEvC,MAAM,EAACC,gBAAgB,EAAEC,eAAe,KAAK,EAAEC,MAAM,EAAEC,UAAU,EAAC,GAAGJ;IAErE,yCAAyC;IACzC,IAAII,eAAe,YAAYA,eAAe,UAAU;QACtD,OAAOA;IACT;IAEA,oCAAoC;IACpC,IAAIA,eAAe,WAAW;QAC5B,IAAIH,kBAAkB;YACpB,OAAO;QACT;QAEAE,OAAOE,IAAI,CAAC;QAEZ,OAAO;IACT;IAEA,iEAAiE;IACjE,IAAIH,gBAAgB,CAACD,kBAAkB;QACrC,OAAO;IACT;IAEA,yDAAyD;IACzD,OAAOH,wBAAwBK;AACjC"}
@@ -0,0 +1,26 @@
1
+ import { promptForDataset } from '../../prompts/promptForDataset.js';
2
+ import { listDatasets } from '../../services/datasets.js';
3
+ import { assertDatasetExists } from '../backup/assertDatasetExist.js';
4
+ /**
5
+ * Lists datasets for a project, validates the given dataset name (or prompts
6
+ * the user to pick one), and returns the resolved name together with the full
7
+ * dataset list.
8
+ */ export async function resolveDataset({ dataset, projectId }) {
9
+ const datasets = await listDatasets(projectId);
10
+ if (datasets.length === 0) {
11
+ throw new Error('No datasets found in this project.');
12
+ }
13
+ if (dataset) {
14
+ assertDatasetExists(datasets, dataset);
15
+ } else {
16
+ dataset = await promptForDataset({
17
+ datasets
18
+ });
19
+ }
20
+ return {
21
+ dataset,
22
+ datasets
23
+ };
24
+ }
25
+
26
+ //# sourceMappingURL=resolveDataset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/dataset/resolveDataset.ts"],"sourcesContent":["import {type DatasetsResponse} from '@sanity/client'\n\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {assertDatasetExists} from '../backup/assertDatasetExist.js'\n\ninterface ResolveDatasetOptions {\n projectId: string\n\n dataset?: string\n}\n\ninterface ResolveDatasetResult {\n dataset: string\n datasets: DatasetsResponse\n}\n\n/**\n * Lists datasets for a project, validates the given dataset name (or prompts\n * the user to pick one), and returns the resolved name together with the full\n * dataset list.\n */\nexport async function resolveDataset({\n dataset,\n projectId,\n}: ResolveDatasetOptions): Promise<ResolveDatasetResult> {\n const datasets = await listDatasets(projectId)\n\n if (datasets.length === 0) {\n throw new Error('No datasets found in this project.')\n }\n\n if (dataset) {\n assertDatasetExists(datasets, dataset)\n } else {\n dataset = await promptForDataset({datasets})\n }\n\n return {dataset, datasets}\n}\n"],"names":["promptForDataset","listDatasets","assertDatasetExists","resolveDataset","dataset","projectId","datasets","length","Error"],"mappings":"AAEA,SAAQA,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,YAAY,QAAO,6BAA4B;AACvD,SAAQC,mBAAmB,QAAO,kCAAiC;AAanE;;;;CAIC,GACD,OAAO,eAAeC,eAAe,EACnCC,OAAO,EACPC,SAAS,EACa;IACtB,MAAMC,WAAW,MAAML,aAAaI;IAEpC,IAAIC,SAASC,MAAM,KAAK,GAAG;QACzB,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAIJ,SAAS;QACXF,oBAAoBI,UAAUF;IAChC,OAAO;QACLA,UAAU,MAAMJ,iBAAiB;YAACM;QAAQ;IAC5C;IAEA,OAAO;QAACF;QAASE;IAAQ;AAC3B"}
@@ -0,0 +1,22 @@
1
+ import { inspect } from 'node:util';
2
+ import { ux } from '@oclif/core';
3
+ export function formatObject(obj) {
4
+ return inspect(obj, {
5
+ colors: true,
6
+ depth: +Infinity
7
+ });
8
+ }
9
+ export function printKeyValue(obj) {
10
+ let printedLines = 0;
11
+ for (const key of Object.keys(obj)){
12
+ if (obj[key] !== undefined) {
13
+ ux.stdout(` ${key}: ${formatObject(obj[key])}`);
14
+ printedLines++;
15
+ }
16
+ }
17
+ if (printedLines > 0) {
18
+ ux.stdout('');
19
+ }
20
+ }
21
+
22
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/debug/formatters.ts"],"sourcesContent":["import {inspect} from 'node:util'\n\nimport {ux} from '@oclif/core'\n\nexport function formatObject(obj: unknown): string {\n return inspect(obj, {colors: true, depth: +Infinity})\n}\n\nexport function printKeyValue(obj: Record<string, unknown>): void {\n let printedLines = 0\n for (const key of Object.keys(obj)) {\n if (obj[key] !== undefined) {\n ux.stdout(` ${key}: ${formatObject(obj[key])}`)\n printedLines++\n }\n }\n\n if (printedLines > 0) {\n ux.stdout('')\n }\n}\n"],"names":["inspect","ux","formatObject","obj","colors","depth","Infinity","printKeyValue","printedLines","key","Object","keys","undefined","stdout"],"mappings":"AAAA,SAAQA,OAAO,QAAO,YAAW;AAEjC,SAAQC,EAAE,QAAO,cAAa;AAE9B,OAAO,SAASC,aAAaC,GAAY;IACvC,OAAOH,QAAQG,KAAK;QAACC,QAAQ;QAAMC,OAAO,CAACC;IAAQ;AACrD;AAEA,OAAO,SAASC,cAAcJ,GAA4B;IACxD,IAAIK,eAAe;IACnB,KAAK,MAAMC,OAAOC,OAAOC,IAAI,CAACR,KAAM;QAClC,IAAIA,GAAG,CAACM,IAAI,KAAKG,WAAW;YAC1BX,GAAGY,MAAM,CAAC,CAAC,EAAE,EAAEJ,IAAI,EAAE,EAAEP,aAAaC,GAAG,CAACM,IAAI,GAAG;YAC/CD;QACF;IACF;IAEA,IAAIA,eAAe,GAAG;QACpBP,GAAGY,MAAM,CAAC;IACZ;AACF"}
@@ -2,6 +2,7 @@ import { CLIError } from '@oclif/core/errors';
2
2
  import { input } from '@sanity/cli-core/ux';
3
3
  import { createUserApplication } from '../../services/userApplications.js';
4
4
  import { deployDebug } from './deployDebug.js';
5
+ import { normalizeUrl, validateUrl } from './urlUtils.js';
5
6
  // TODO: replace with `Promise.withResolvers()` once it lands in node 22
6
7
  function promiseWithResolvers() {
7
8
  let resolve;
@@ -16,21 +17,33 @@ function promiseWithResolvers() {
16
17
  resolve
17
18
  };
18
19
  }
19
- export async function createStudioUserApplication(projectId) {
20
+ export async function createStudioUserApplication(options) {
21
+ const { projectId, urlType = 'internal' } = options;
20
22
  const { promise, resolve } = promiseWithResolvers();
23
+ const isExternal = urlType === 'external';
21
24
  await input({
22
- message: 'Studio hostname (<value>.sanity.studio):',
25
+ message: isExternal ? 'Studio URL (https://...):' : 'Studio hostname (<value>.sanity.studio):',
23
26
  // if a string is returned here, it is relayed to the user and prompt allows
24
27
  // the user to try again until this function returns true
25
28
  validate: async (inp)=>{
26
- const appHost = inp.replace(/\.sanity\.studio$/i, '');
29
+ let appHost;
30
+ if (isExternal) {
31
+ const normalized = normalizeUrl(inp);
32
+ const validation = validateUrl(normalized);
33
+ if (validation !== true) {
34
+ return validation;
35
+ }
36
+ appHost = normalized;
37
+ } else {
38
+ appHost = inp.replace(/\.sanity\.studio$/i, '');
39
+ }
27
40
  try {
28
41
  const response = await createUserApplication({
29
42
  appType: 'studio',
30
43
  body: {
31
44
  appHost,
32
45
  type: 'studio',
33
- urlType: 'internal'
46
+ urlType
34
47
  },
35
48
  projectId
36
49
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/createStudioUserApplication.ts"],"sourcesContent":["import {CLIError} from '@oclif/core/errors'\nimport {input} from '@sanity/cli-core/ux'\n\nimport {createUserApplication, type UserApplication} from '../../services/userApplications.js'\nimport {deployDebug} from './deployDebug.js'\n\n// TODO: replace with `Promise.withResolvers()` once it lands in node 22\nfunction promiseWithResolvers<T>() {\n let resolve!: (t: T) => void\n let reject!: (err: unknown) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n return {promise, reject, resolve}\n}\n\nexport async function createStudioUserApplication(projectId: string) {\n const {promise, resolve} = promiseWithResolvers<UserApplication>()\n\n await input({\n message: 'Studio hostname (<value>.sanity.studio):',\n // if a string is returned here, it is relayed to the user and prompt allows\n // the user to try again until this function returns true\n validate: async (inp: string) => {\n const appHost = inp.replace(/\\.sanity\\.studio$/i, '')\n try {\n const response = await createUserApplication({\n appType: 'studio',\n body: {\n appHost,\n type: 'studio',\n urlType: 'internal',\n },\n projectId,\n })\n resolve(response)\n return true\n } catch (e) {\n // if the name is taken, it should return a 409 so we relay to the user\n if ([402, 409].includes(e?.statusCode)) {\n return e?.response?.body?.message || 'Bad request' // just in case\n }\n\n deployDebug('Error creating user application', e)\n // otherwise, it's a fatal error\n throw new CLIError('Error creating user application', {exit: 1})\n }\n },\n })\n\n return await promise\n}\n"],"names":["CLIError","input","createUserApplication","deployDebug","promiseWithResolvers","resolve","reject","promise","Promise","res","rej","createStudioUserApplication","projectId","message","validate","inp","appHost","replace","response","appType","body","type","urlType","e","includes","statusCode","exit"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,KAAK,QAAO,sBAAqB;AAEzC,SAAQC,qBAAqB,QAA6B,qCAAoC;AAC9F,SAAQC,WAAW,QAAO,mBAAkB;AAE5C,wEAAwE;AACxE,SAASC;IACP,IAAIC;IACJ,IAAIC;IACJ,MAAMC,UAAU,IAAIC,QAAW,CAACC,KAAKC;QACnCL,UAAUI;QACVH,SAASI;IACX;IACA,OAAO;QAACH;QAASD;QAAQD;IAAO;AAClC;AAEA,OAAO,eAAeM,4BAA4BC,SAAiB;IACjE,MAAM,EAACL,OAAO,EAAEF,OAAO,EAAC,GAAGD;IAE3B,MAAMH,MAAM;QACVY,SAAS;QACT,4EAA4E;QAC5E,yDAAyD;QACzDC,UAAU,OAAOC;YACf,MAAMC,UAAUD,IAAIE,OAAO,CAAC,sBAAsB;YAClD,IAAI;gBACF,MAAMC,WAAW,MAAMhB,sBAAsB;oBAC3CiB,SAAS;oBACTC,MAAM;wBACJJ;wBACAK,MAAM;wBACNC,SAAS;oBACX;oBACAV;gBACF;gBACAP,QAAQa;gBACR,OAAO;YACT,EAAE,OAAOK,GAAG;gBACV,uEAAuE;gBACvE,IAAI;oBAAC;oBAAK;iBAAI,CAACC,QAAQ,CAACD,GAAGE,aAAa;oBACtC,OAAOF,GAAGL,UAAUE,MAAMP,WAAW,cAAc,eAAe;;gBACpE;gBAEAV,YAAY,mCAAmCoB;gBAC/C,gCAAgC;gBAChC,MAAM,IAAIvB,SAAS,mCAAmC;oBAAC0B,MAAM;gBAAC;YAChE;QACF;IACF;IAEA,OAAO,MAAMnB;AACf"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/createStudioUserApplication.ts"],"sourcesContent":["import {CLIError} from '@oclif/core/errors'\nimport {input} from '@sanity/cli-core/ux'\n\nimport {createUserApplication, type UserApplication} from '../../services/userApplications.js'\nimport {deployDebug} from './deployDebug.js'\nimport {normalizeUrl, validateUrl} from './urlUtils.js'\n\n// TODO: replace with `Promise.withResolvers()` once it lands in node 22\nfunction promiseWithResolvers<T>() {\n let resolve!: (t: T) => void\n let reject!: (err: unknown) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n return {promise, reject, resolve}\n}\n\ninterface CreateStudioUserApplicationOptions {\n projectId: string\n\n urlType?: 'external' | 'internal'\n}\n\nexport async function createStudioUserApplication(options: CreateStudioUserApplicationOptions) {\n const {projectId, urlType = 'internal'} = options\n const {promise, resolve} = promiseWithResolvers<UserApplication>()\n\n const isExternal = urlType === 'external'\n\n await input({\n message: isExternal ? 'Studio URL (https://...):' : 'Studio hostname (<value>.sanity.studio):',\n // if a string is returned here, it is relayed to the user and prompt allows\n // the user to try again until this function returns true\n validate: async (inp: string) => {\n let appHost: string\n\n if (isExternal) {\n const normalized = normalizeUrl(inp)\n const validation = validateUrl(normalized)\n if (validation !== true) {\n return validation\n }\n appHost = normalized\n } else {\n appHost = inp.replace(/\\.sanity\\.studio$/i, '')\n }\n\n try {\n const response = await createUserApplication({\n appType: 'studio',\n body: {\n appHost,\n type: 'studio',\n urlType,\n },\n projectId,\n })\n resolve(response)\n return true\n } catch (e) {\n // if the name is taken, it should return a 409 so we relay to the user\n if ([402, 409].includes(e?.statusCode)) {\n return e?.response?.body?.message || 'Bad request' // just in case\n }\n\n deployDebug('Error creating user application', e)\n // otherwise, it's a fatal error\n throw new CLIError('Error creating user application', {exit: 1})\n }\n },\n })\n\n return await promise\n}\n"],"names":["CLIError","input","createUserApplication","deployDebug","normalizeUrl","validateUrl","promiseWithResolvers","resolve","reject","promise","Promise","res","rej","createStudioUserApplication","options","projectId","urlType","isExternal","message","validate","inp","appHost","normalized","validation","replace","response","appType","body","type","e","includes","statusCode","exit"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,KAAK,QAAO,sBAAqB;AAEzC,SAAQC,qBAAqB,QAA6B,qCAAoC;AAC9F,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,YAAY,EAAEC,WAAW,QAAO,gBAAe;AAEvD,wEAAwE;AACxE,SAASC;IACP,IAAIC;IACJ,IAAIC;IACJ,MAAMC,UAAU,IAAIC,QAAW,CAACC,KAAKC;QACnCL,UAAUI;QACVH,SAASI;IACX;IACA,OAAO;QAACH;QAASD;QAAQD;IAAO;AAClC;AAQA,OAAO,eAAeM,4BAA4BC,OAA2C;IAC3F,MAAM,EAACC,SAAS,EAAEC,UAAU,UAAU,EAAC,GAAGF;IAC1C,MAAM,EAACL,OAAO,EAAEF,OAAO,EAAC,GAAGD;IAE3B,MAAMW,aAAaD,YAAY;IAE/B,MAAMf,MAAM;QACViB,SAASD,aAAa,8BAA8B;QACpD,4EAA4E;QAC5E,yDAAyD;QACzDE,UAAU,OAAOC;YACf,IAAIC;YAEJ,IAAIJ,YAAY;gBACd,MAAMK,aAAalB,aAAagB;gBAChC,MAAMG,aAAalB,YAAYiB;gBAC/B,IAAIC,eAAe,MAAM;oBACvB,OAAOA;gBACT;gBACAF,UAAUC;YACZ,OAAO;gBACLD,UAAUD,IAAII,OAAO,CAAC,sBAAsB;YAC9C;YAEA,IAAI;gBACF,MAAMC,WAAW,MAAMvB,sBAAsB;oBAC3CwB,SAAS;oBACTC,MAAM;wBACJN;wBACAO,MAAM;wBACNZ;oBACF;oBACAD;gBACF;gBACAR,QAAQkB;gBACR,OAAO;YACT,EAAE,OAAOI,GAAG;gBACV,uEAAuE;gBACvE,IAAI;oBAAC;oBAAK;iBAAI,CAACC,QAAQ,CAACD,GAAGE,aAAa;oBACtC,OAAOF,GAAGJ,UAAUE,MAAMT,WAAW,cAAc,eAAe;;gBACpE;gBAEAf,YAAY,mCAAmC0B;gBAC/C,gCAAgC;gBAChC,MAAM,IAAI7B,SAAS,mCAAmC;oBAACgC,MAAM;gBAAC;YAChE;QACF;IACF;IAEA,OAAO,MAAMvB;AACf"}
@@ -4,11 +4,11 @@ import { createGzip } from 'node:zlib';
4
4
  import { CLIError } from '@oclif/core/errors';
5
5
  import { spinner } from '@sanity/cli-core/ux';
6
6
  import { pack } from 'tar-fs';
7
- import { createDeployment } from '../../services/userApplications.js';
7
+ import { createDeployment, updateUserApplication } from '../../services/userApplications.js';
8
8
  import { getAppId } from '../../util/appId.js';
9
9
  import { NO_ORGANIZATION_ID } from '../../util/errorMessages.js';
10
- import { readModuleVersion } from '../../util/readModuleVersion.js';
11
- import { warnAboutMissingAppId } from '../../util/warnAboutMissingAppId.js';
10
+ import { getErrorMessage } from '../../util/getErrorMessage.js';
11
+ import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
12
12
  import { buildApp } from '../build/buildApp.js';
13
13
  import { shouldAutoUpdate } from '../build/shouldAutoUpdate.js';
14
14
  import { extractAppManifest } from '../manifest/extractAppManifest.js';
@@ -21,7 +21,8 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
21
21
  *
22
22
  * @internal
23
23
  */ export async function deployApp(options) {
24
- const { cliConfig, exit, flags, output, sourceDir, workDir } = options;
24
+ const { cliConfig, flags, output, projectRoot, sourceDir } = options;
25
+ const workDir = projectRoot.directory;
25
26
  const organizationId = cliConfig.app?.organizationId;
26
27
  const appId = getAppId(cliConfig);
27
28
  const isAutoUpdating = shouldAutoUpdate({
@@ -29,7 +30,7 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
29
30
  flags,
30
31
  output
31
32
  });
32
- const installedSdkVersion = await readModuleVersion(sourceDir, '@sanity/sdk-react');
33
+ const installedSdkVersion = await getLocalPackageVersion('@sanity/sdk-react', workDir);
33
34
  if (!installedSdkVersion) {
34
35
  output.error(`Failed to find installed @sanity/sdk-react version`, {
35
36
  exit: 1
@@ -42,6 +43,11 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
42
43
  });
43
44
  return;
44
45
  }
46
+ if (flags.external) {
47
+ output.error('Deploying an app to an external host is not supported.', {
48
+ exit: 1
49
+ });
50
+ }
45
51
  let spin = spinner('Verifying local content...');
46
52
  try {
47
53
  let userApplication = await findUserApplicationForApp({
@@ -55,21 +61,14 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
55
61
  userApplication = await createUserApplicationForApp(organizationId);
56
62
  deployDebug(`User application created`, userApplication);
57
63
  }
58
- // Warn about missing app ID if auto updates are enabled
59
- if (isAutoUpdating && !appId) {
60
- warnAboutMissingAppId({
61
- appType: 'app',
62
- output
63
- });
64
- }
65
64
  // Always build the project, unless --no-build is passed
66
65
  const shouldBuild = flags.build;
67
66
  if (shouldBuild) {
68
67
  deployDebug(`Building app`);
69
68
  await buildApp({
70
69
  autoUpdatesEnabled: isAutoUpdating,
70
+ calledFromDeploy: true,
71
71
  cliConfig,
72
- exit,
73
72
  flags,
74
73
  outDir: sourceDir,
75
74
  output,
@@ -100,14 +99,41 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
100
99
  let manifest;
101
100
  try {
102
101
  manifest = await extractAppManifest({
103
- flags,
104
102
  workDir
105
103
  });
106
104
  } catch (err) {
107
- const message = err instanceof Error ? err.message : String(err);
108
105
  deployDebug('Error extracting app manifest', err);
106
+ const message = getErrorMessage(err);
107
+ // manifests aren't strictly essential, so continue deploy
109
108
  output.warn(`Error extracting app manifest: ${message}`);
110
109
  }
110
+ // Sync app title from manifest when it has changed (Brett user-applications)
111
+ if (manifest?.title !== undefined && manifest.title !== userApplication.title) {
112
+ deployDebug('Updating application title from manifest', {
113
+ from: userApplication.title,
114
+ to: manifest.title
115
+ });
116
+ const existing = userApplication.title;
117
+ output.log(existing ? `Updating title from "${existing}" to "${manifest.title}"` : `Setting application title to "${manifest.title}"`);
118
+ spin = spinner(`Updating application title`).start();
119
+ try {
120
+ userApplication = await updateUserApplication({
121
+ applicationId: userApplication.id,
122
+ appType: 'coreApp',
123
+ body: {
124
+ title: manifest.title
125
+ }
126
+ });
127
+ spin.succeed();
128
+ } catch (err) {
129
+ spin.fail();
130
+ const message = getErrorMessage(err);
131
+ deployDebug('Error updating application title', {
132
+ message
133
+ });
134
+ output.warn(`Error updating application title: ${message}`);
135
+ }
136
+ }
111
137
  spin = spinner('Deploying...').start();
112
138
  await createDeployment({
113
139
  applicationId: userApplication.id,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/deployApp.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_ORGANIZATION_ID} from '../../util/errorMessages.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildApp} from '../build/buildApp.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {extractAppManifest} from '../manifest/extractAppManifest.js'\nimport {type AppManifest} from '../manifest/types.js'\nimport {checkDir} from './checkDir.js'\nimport {createUserApplicationForApp} from './createUserApplicationForApp.js'\nimport {deployDebug} from './deployDebug.js'\nimport {findUserApplicationForApp} from './findUserApplicationForApp.js'\nimport {type DeployAppOptions} from './types.js'\n\n/**\n * Deploy a Sanity application.\n *\n * @internal\n */\nexport async function deployApp(options: DeployAppOptions) {\n const {cliConfig, exit, flags, output, sourceDir, workDir} = options\n\n const organizationId = cliConfig.app?.organizationId\n const appId = getAppId(cliConfig)\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n const installedSdkVersion = await readModuleVersion(sourceDir, '@sanity/sdk-react')\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n if (!organizationId) {\n output.error(NO_ORGANIZATION_ID, {exit: 1})\n return\n }\n\n let spin = spinner('Verifying local content...')\n\n try {\n let userApplication = await findUserApplicationForApp({\n cliConfig,\n organizationId,\n output,\n })\n\n deployDebug(`User application found`, userApplication)\n\n if (!userApplication) {\n deployDebug(`No user application found. Creating a new one`)\n\n userApplication = await createUserApplicationForApp(organizationId)\n deployDebug(`User application created`, userApplication)\n }\n\n // Warn about missing app ID if auto updates are enabled\n if (isAutoUpdating && !appId) {\n warnAboutMissingAppId({appType: 'app', output})\n }\n\n // Always build the project, unless --no-build is passed\n const shouldBuild = flags.build\n if (shouldBuild) {\n deployDebug(`Building app`)\n await buildApp({\n autoUpdatesEnabled: isAutoUpdating,\n cliConfig,\n exit,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await checkDir(sourceDir)\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error('Error checking directory', {exit: 1})\n return\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n const tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n let manifest: AppManifest | undefined\n try {\n manifest = await extractAppManifest({flags, workDir})\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n deployDebug('Error extracting app manifest', err)\n output.warn(`Error extracting app manifest: ${message}`)\n }\n\n spin = spinner('Deploying...').start()\n await createDeployment({\n applicationId: userApplication.id,\n isApp: true,\n isAutoUpdating,\n manifest,\n tarball,\n version: installedSdkVersion,\n })\n\n spin.succeed()\n\n // And let the user know we're done\n output.log(`\\n🚀 ${styleText('bold', 'Success!')} Application deployed`)\n\n if (!appId) {\n output.log(`\\n════ ${styleText('bold', 'Next step:')} ════`)\n output.log(\n styleText(\n 'bold',\n '\\nAdd the deployment.appId to your sanity.cli.js or sanity.cli.ts file:',\n ),\n )\n output.log(`\n${styleText(\n 'dim',\n `app: {\n // your application config here…\n}`,\n)},\n${styleText(\n ['bold', 'green'],\n `deployment: {\n appId: '${userApplication.id}',\n}\\n`,\n)}`)\n }\n } catch (error) {\n spin.clear()\n // Don't throw generic error if user cancels\n if (error.name === 'ExitPromptError') {\n output.error('Deployment cancelled by user', {exit: 1})\n return\n }\n // If the error is a CLIError, we can just output the message & error options (if any), while ensuring we exit\n if (error instanceof CLIError) {\n const {message, ...errorOptions} = error\n output.error(message, {...errorOptions, exit: 1})\n return\n }\n\n deployDebug('Error deploying application', error)\n output.error(`Error deploying application: ${error}`, {exit: 1})\n }\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","spinner","pack","createDeployment","getAppId","NO_ORGANIZATION_ID","readModuleVersion","warnAboutMissingAppId","buildApp","shouldAutoUpdate","extractAppManifest","checkDir","createUserApplicationForApp","deployDebug","findUserApplicationForApp","deployApp","options","cliConfig","exit","flags","output","sourceDir","workDir","organizationId","app","appId","isAutoUpdating","installedSdkVersion","error","spin","userApplication","appType","shouldBuild","build","autoUpdatesEnabled","outDir","start","succeed","err","fail","parentDir","base","tarball","entries","pipe","manifest","message","Error","String","warn","applicationId","id","isApp","version","log","clear","name","errorOptions"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/deployApp.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment, updateUserApplication} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_ORGANIZATION_ID} from '../../util/errorMessages.js'\nimport {getErrorMessage} from '../../util/getErrorMessage.js'\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {buildApp} from '../build/buildApp.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {extractAppManifest} from '../manifest/extractAppManifest.js'\nimport {type AppManifest} from '../manifest/types.js'\nimport {checkDir} from './checkDir.js'\nimport {createUserApplicationForApp} from './createUserApplicationForApp.js'\nimport {deployDebug} from './deployDebug.js'\nimport {findUserApplicationForApp} from './findUserApplicationForApp.js'\nimport {type DeployAppOptions} from './types.js'\n\n/**\n * Deploy a Sanity application.\n *\n * @internal\n */\nexport async function deployApp(options: DeployAppOptions) {\n const {cliConfig, flags, output, projectRoot, sourceDir} = options\n\n const workDir = projectRoot.directory\n\n const organizationId = cliConfig.app?.organizationId\n const appId = getAppId(cliConfig)\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n const installedSdkVersion = await getLocalPackageVersion('@sanity/sdk-react', workDir)\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n if (!organizationId) {\n output.error(NO_ORGANIZATION_ID, {exit: 1})\n return\n }\n\n if (flags.external) {\n output.error('Deploying an app to an external host is not supported.', {exit: 1})\n }\n\n let spin = spinner('Verifying local content...')\n\n try {\n let userApplication = await findUserApplicationForApp({\n cliConfig,\n organizationId,\n output,\n })\n\n deployDebug(`User application found`, userApplication)\n\n if (!userApplication) {\n deployDebug(`No user application found. Creating a new one`)\n\n userApplication = await createUserApplicationForApp(organizationId)\n deployDebug(`User application created`, userApplication)\n }\n\n // Always build the project, unless --no-build is passed\n const shouldBuild = flags.build\n if (shouldBuild) {\n deployDebug(`Building app`)\n await buildApp({\n autoUpdatesEnabled: isAutoUpdating,\n calledFromDeploy: true,\n cliConfig,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await checkDir(sourceDir)\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error('Error checking directory', {exit: 1})\n return\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n const tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n let manifest: AppManifest | undefined\n try {\n manifest = await extractAppManifest({workDir})\n } catch (err) {\n deployDebug('Error extracting app manifest', err)\n const message = getErrorMessage(err)\n // manifests aren't strictly essential, so continue deploy\n output.warn(`Error extracting app manifest: ${message}`)\n }\n\n // Sync app title from manifest when it has changed (Brett user-applications)\n if (manifest?.title !== undefined && manifest.title !== userApplication.title) {\n deployDebug('Updating application title from manifest', {\n from: userApplication.title,\n to: manifest.title,\n })\n const existing = userApplication.title\n output.log(\n existing\n ? `Updating title from \"${existing}\" to \"${manifest.title}\"`\n : `Setting application title to \"${manifest.title}\"`,\n )\n spin = spinner(`Updating application title`).start()\n try {\n userApplication = await updateUserApplication({\n applicationId: userApplication.id,\n appType: 'coreApp',\n body: {title: manifest.title},\n })\n spin.succeed()\n } catch (err) {\n spin.fail()\n const message = getErrorMessage(err)\n deployDebug('Error updating application title', {message})\n output.warn(`Error updating application title: ${message}`)\n }\n }\n\n spin = spinner('Deploying...').start()\n await createDeployment({\n applicationId: userApplication.id,\n isApp: true,\n isAutoUpdating,\n manifest,\n tarball,\n version: installedSdkVersion,\n })\n\n spin.succeed()\n\n // And let the user know we're done\n output.log(`\\n🚀 ${styleText('bold', 'Success!')} Application deployed`)\n\n if (!appId) {\n output.log(`\\n════ ${styleText('bold', 'Next step:')} ════`)\n output.log(\n styleText(\n 'bold',\n '\\nAdd the deployment.appId to your sanity.cli.js or sanity.cli.ts file:',\n ),\n )\n output.log(`\n${styleText(\n 'dim',\n `app: {\n // your application config here…\n}`,\n)},\n${styleText(\n ['bold', 'green'],\n `deployment: {\n appId: '${userApplication.id}',\n}\\n`,\n)}`)\n }\n } catch (error) {\n spin.clear()\n // Don't throw generic error if user cancels\n if (error.name === 'ExitPromptError') {\n output.error('Deployment cancelled by user', {exit: 1})\n return\n }\n // If the error is a CLIError, we can just output the message & error options (if any), while ensuring we exit\n if (error instanceof CLIError) {\n const {message, ...errorOptions} = error\n output.error(message, {...errorOptions, exit: 1})\n return\n }\n\n deployDebug('Error deploying application', error)\n output.error(`Error deploying application: ${error}`, {exit: 1})\n }\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","spinner","pack","createDeployment","updateUserApplication","getAppId","NO_ORGANIZATION_ID","getErrorMessage","getLocalPackageVersion","buildApp","shouldAutoUpdate","extractAppManifest","checkDir","createUserApplicationForApp","deployDebug","findUserApplicationForApp","deployApp","options","cliConfig","flags","output","projectRoot","sourceDir","workDir","directory","organizationId","app","appId","isAutoUpdating","installedSdkVersion","error","exit","external","spin","userApplication","shouldBuild","build","autoUpdatesEnabled","calledFromDeploy","outDir","start","succeed","err","fail","parentDir","base","tarball","entries","pipe","manifest","message","warn","title","undefined","from","to","existing","log","applicationId","id","appType","body","isApp","version","clear","name","errorOptions"],"mappings":"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"}
@@ -7,24 +7,31 @@ import { pack } from 'tar-fs';
7
7
  import { createDeployment } from '../../services/userApplications.js';
8
8
  import { getAppId } from '../../util/appId.js';
9
9
  import { NO_PROJECT_ID } from '../../util/errorMessages.js';
10
- import { readModuleVersion } from '../../util/readModuleVersion.js';
10
+ import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
11
11
  import { buildStudio } from '../build/buildStudio.js';
12
12
  import { shouldAutoUpdate } from '../build/shouldAutoUpdate.js';
13
+ import { formatSchemaValidation } from '../schema/formatSchemaValidation.js';
14
+ import { SchemaExtractionError } from '../schema/utils/SchemaExtractionError.js';
13
15
  import { checkDir } from './checkDir.js';
14
16
  import { createStudioUserApplication } from './createStudioUserApplication.js';
15
17
  import { deployDebug } from './deployDebug.js';
18
+ import { deployStudioSchemasAndManifests } from './deployStudioSchemasAndManifests.js';
16
19
  import { findUserApplicationForStudio } from './findUserApplicationForStudio.js';
17
20
  export async function deployStudio(options) {
18
- const { cliConfig, exit, flags, output, sourceDir, workDir } = options;
21
+ const { cliConfig, flags, output, projectRoot, sourceDir } = options;
22
+ const workDir = projectRoot.directory;
23
+ const configPath = projectRoot.path;
19
24
  const appHost = cliConfig.studioHost;
20
25
  const appId = getAppId(cliConfig);
21
26
  const projectId = cliConfig.api?.projectId;
22
- const installedSanityVersion = await readModuleVersion(sourceDir, 'sanity');
27
+ const installedSanityVersion = await getLocalPackageVersion('sanity', workDir);
23
28
  const isAutoUpdating = shouldAutoUpdate({
24
29
  cliConfig,
25
30
  flags,
26
31
  output
27
32
  });
33
+ const isExternal = !!flags.external;
34
+ const urlType = isExternal ? 'external' : 'internal';
28
35
  if (!installedSanityVersion) {
29
36
  output.error(`Failed to find installed sanity version`, {
30
37
  exit: 1
@@ -43,77 +50,118 @@ export async function deployStudio(options) {
43
50
  appHost,
44
51
  appId,
45
52
  output,
46
- projectId
53
+ projectId,
54
+ urlType
47
55
  });
48
56
  if (!userApplication) {
49
- // otherwise, prompt the user for a hostname
50
- output.log('Your project has not been assigned a studio hostname.');
51
- output.log('To deploy your Sanity Studio to our hosted sanity.studio service,');
52
- output.log('you will need one. Please enter the part you want to use.');
53
- userApplication = await createStudioUserApplication(projectId);
57
+ if (isExternal) {
58
+ output.log('Your project has not been registered with an external studio URL.');
59
+ output.log('Please enter the full URL where your studio is hosted.');
60
+ } else {
61
+ output.log('Your project has not been assigned a studio hostname.');
62
+ output.log('To deploy your Sanity Studio to our hosted sanity.studio service,');
63
+ output.log('you will need one. Please enter the subdomain you want to use.');
64
+ }
65
+ userApplication = await createStudioUserApplication({
66
+ projectId,
67
+ urlType
68
+ });
54
69
  deployDebug('Created user application', userApplication);
55
70
  }
56
71
  deployDebug('Found user application', userApplication);
57
- // Always build the project, unless --no-build is passed
58
- const shouldBuild = flags.build;
72
+ // Always build the project, unless --no-build is passed or --external is passed
73
+ const shouldBuild = flags.build && !isExternal;
59
74
  if (shouldBuild) {
60
75
  deployDebug(`Building studio`);
61
76
  await buildStudio({
62
77
  autoUpdatesEnabled: isAutoUpdating,
78
+ calledFromDeploy: true,
63
79
  cliConfig,
64
- exit,
65
80
  flags,
66
81
  outDir: sourceDir,
67
82
  output,
68
83
  workDir
69
84
  });
70
85
  }
71
- // TODO: Implement schema deployment
72
- // await deploySchemasAction(
73
- // {
74
- // 'extract-manifest': shouldBuild,
75
- // 'manifest-dir': `${sourceDir}/static`,
76
- // 'schema-required': flags['schema-required'],
77
- // 'verbose': flags.verbose,
78
- // },
79
- // {...context, manifestExtractor: createManifestExtractor(context)},
80
- // )
81
- // Ensure that the directory exists, is a directory and seems to have valid content
82
- spin = spin.start();
86
+ let studioManifest = null;
83
87
  try {
84
- await checkDir(sourceDir);
85
- spin.succeed();
86
- } catch (err) {
87
- spin.fail();
88
- deployDebug('Error checking directory', err);
89
- output.error('Error checking directory', {
88
+ studioManifest = await deployStudioSchemasAndManifests({
89
+ configPath,
90
+ isExternal,
91
+ outPath: `${sourceDir}/static`,
92
+ projectId,
93
+ schemaRequired: flags['schema-required'],
94
+ verbose: flags.verbose,
95
+ workDir
96
+ });
97
+ } catch (error) {
98
+ deployDebug('Error deploying studio schemas and manifests', error);
99
+ if (error instanceof SchemaExtractionError) {
100
+ output.error(formatSchemaValidation(error.validation || []), {
101
+ exit: 1
102
+ });
103
+ }
104
+ output.error(`Error deploying studio schemas and manifests: ${error}`, {
90
105
  exit: 1
91
106
  });
92
107
  }
93
- // Create a tarball of the given directory
94
- const parentDir = dirname(sourceDir);
95
- const base = basename(sourceDir);
96
- const tarball = pack(parentDir, {
97
- entries: [
98
- base
99
- ]
100
- }).pipe(createGzip());
101
- spin = spinner('Deploying to sanity.studio').start();
108
+ if (!studioManifest) {
109
+ output.error('Failed to generate studio manifest. Please check your schemas and manifests.', {
110
+ exit: 1
111
+ });
112
+ }
113
+ let tarball;
114
+ if (!isExternal) {
115
+ // Ensure that the directory exists, is a directory and seems to have valid content
116
+ spin = spin.start();
117
+ try {
118
+ await checkDir(sourceDir);
119
+ spin.succeed();
120
+ } catch (err) {
121
+ spin.fail();
122
+ deployDebug('Error checking directory', err);
123
+ output.error('Error checking directory', {
124
+ exit: 1
125
+ });
126
+ }
127
+ // Create a tarball of the given directory
128
+ const parentDir = dirname(sourceDir);
129
+ const base = basename(sourceDir);
130
+ tarball = pack(parentDir, {
131
+ entries: [
132
+ base
133
+ ]
134
+ }).pipe(createGzip());
135
+ }
136
+ spin = spinner(isExternal ? 'Registering studio' : 'Deploying to sanity.studio').start();
102
137
  const { location } = await createDeployment({
103
138
  applicationId: userApplication.id,
104
139
  isApp: false,
105
140
  isAutoUpdating,
141
+ manifest: studioManifest,
106
142
  projectId,
107
143
  tarball,
108
144
  version: installedSanityVersion
109
145
  });
110
146
  spin.succeed();
111
- // And let the user know we're done
112
- output.log(`\nSuccess! Studio deployed to ${styleText('cyan', location || 'unknown URL')}`);
147
+ if (isExternal) {
148
+ output.log(`\nSuccess! Studio registered`);
149
+ } else {
150
+ output.log(`\nSuccess! Studio deployed to ${styleText('cyan', location)}`);
151
+ }
113
152
  if (!appId) {
114
- output.log(`\nAdd ${styleText('cyan', `deployment: { appId: '${userApplication.id}' }`)}`);
115
- output.log(`to sanity.cli.js or sanity.cli.ts`);
116
- output.log(`to avoid prompting on next deploy.`);
153
+ const example = `Example:
154
+ export default defineCliConfig({
155
+ //…
156
+ deployment: {
157
+ ${styleText('cyan', `appId: '${userApplication.id}'`)},
158
+ },
159
+ //…
160
+ })`;
161
+ output.log(`\nAdd ${styleText('cyan', `appId: '${userApplication.id}'`)}`);
162
+ output.log(`to the \`deployment\` section in sanity.cli.js or sanity.cli.ts`);
163
+ output.log(`to avoid prompting for application id on next deploy.`);
164
+ output.log(`\n${example}`);
117
165
  }
118
166
  } catch (error) {
119
167
  // if the error is a CLIError, we can just output the message and exit