@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
@@ -0,0 +1,295 @@
1
+ import path from 'node:path';
2
+ import { execa } from 'execa';
3
+ import which from 'which';
4
+ const SANITY_PACKAGES = [
5
+ 'sanity',
6
+ '@sanity/cli'
7
+ ];
8
+ /**
9
+ * Tries to parse JSON from command output that may contain non-JSON prefix lines
10
+ * (e.g. npm warnings printed before JSON). Returns null if parsing fails.
11
+ */ function tryParseJson(stdout) {
12
+ // First, try parsing the full output
13
+ try {
14
+ return JSON.parse(stdout);
15
+ } catch {
16
+ // Fall through
17
+ }
18
+ // Try to find the start of JSON content (first { or [)
19
+ const jsonStart = stdout.search(/[{[]/);
20
+ if (jsonStart > 0) {
21
+ try {
22
+ return JSON.parse(stdout.slice(jsonStart));
23
+ } catch {
24
+ // Fall through
25
+ }
26
+ }
27
+ return null;
28
+ }
29
+ /**
30
+ * Detects global installations of sanity and \@sanity/cli across all package managers.
31
+ * Runs queries in parallel for efficiency.
32
+ */ export async function detectGlobalInstallations() {
33
+ // Query all package managers in parallel
34
+ const [activeBinaryPath, npmResult, pnpmResult, yarnGlobals, bunGlobals] = await Promise.all([
35
+ // Find which binary is active in PATH
36
+ findActiveBinaryPath(),
37
+ queryNpmGlobals(),
38
+ queryPnpmGlobals(),
39
+ queryYarnGlobals(),
40
+ queryBunGlobals()
41
+ ]);
42
+ const allGlobals = [
43
+ ...npmResult.globals,
44
+ ...pnpmResult.globals,
45
+ ...yarnGlobals,
46
+ ...bunGlobals
47
+ ];
48
+ // Mark which installation is active
49
+ return markActiveInstallation(allGlobals, activeBinaryPath, npmResult.libDir, pnpmResult.binDir);
50
+ }
51
+ async function findActiveBinaryPath() {
52
+ try {
53
+ return await which('sanity');
54
+ } catch {
55
+ return null;
56
+ }
57
+ }
58
+ async function queryNpmGlobals() {
59
+ try {
60
+ const result = await execa('npm', [
61
+ 'list',
62
+ '-g',
63
+ '--depth=0',
64
+ '--json'
65
+ ], {
66
+ reject: false,
67
+ timeout: 10_000
68
+ });
69
+ if (!result.stdout) {
70
+ return {
71
+ globals: [],
72
+ libDir: null
73
+ };
74
+ }
75
+ const output = tryParseJson(result.stdout);
76
+ if (!output) {
77
+ return {
78
+ globals: [],
79
+ libDir: null
80
+ };
81
+ }
82
+ const globals = [];
83
+ for (const pkg of SANITY_PACKAGES){
84
+ const dep = output.dependencies?.[pkg];
85
+ if (dep) {
86
+ globals.push({
87
+ isActive: false,
88
+ packageManager: 'npm',
89
+ packageName: pkg,
90
+ // npm's `resolved` is a tarball URL, not a filesystem path.
91
+ path: null,
92
+ version: dep.version
93
+ });
94
+ }
95
+ }
96
+ return {
97
+ globals,
98
+ libDir: output.path ?? null
99
+ };
100
+ } catch {
101
+ return {
102
+ globals: [],
103
+ libDir: null
104
+ };
105
+ }
106
+ }
107
+ async function queryPnpmGlobals() {
108
+ try {
109
+ // Query pnpm global bin dir and global packages in parallel
110
+ const [binResult, listResult] = await Promise.all([
111
+ execa('pnpm', [
112
+ 'bin',
113
+ '-g'
114
+ ], {
115
+ reject: false,
116
+ timeout: 10_000
117
+ }),
118
+ execa('pnpm', [
119
+ 'list',
120
+ '-g',
121
+ '--depth=0',
122
+ '--json'
123
+ ], {
124
+ reject: false,
125
+ timeout: 10_000
126
+ })
127
+ ]);
128
+ const binDir = binResult.stdout?.trim() || null;
129
+ if (!listResult.stdout) {
130
+ return {
131
+ binDir,
132
+ globals: []
133
+ };
134
+ }
135
+ const output = tryParseJson(listResult.stdout);
136
+ if (!output) {
137
+ return {
138
+ binDir,
139
+ globals: []
140
+ };
141
+ }
142
+ const globals = [];
143
+ for (const project of output){
144
+ if (!project.dependencies) continue;
145
+ for (const pkg of SANITY_PACKAGES){
146
+ const dep = project.dependencies[pkg];
147
+ if (dep) {
148
+ globals.push({
149
+ isActive: false,
150
+ packageManager: 'pnpm',
151
+ packageName: pkg,
152
+ path: dep.path || null,
153
+ version: dep.version
154
+ });
155
+ }
156
+ }
157
+ }
158
+ return {
159
+ binDir,
160
+ globals
161
+ };
162
+ } catch {
163
+ return {
164
+ binDir: null,
165
+ globals: []
166
+ };
167
+ }
168
+ }
169
+ async function queryYarnGlobals() {
170
+ // `yarn global list` only works with Yarn Classic (v1).
171
+ // Yarn Berry (v2+) removed global installs entirely — the command errors or
172
+ // produces no output. Because `reject: false` is set, the call returns
173
+ // empty stdout and we gracefully return []. This means Yarn Berry global
174
+ // installations (if any exist via third-party plugins) are invisible here.
175
+ // A version check (via getYarnMajorVersion) could skip the call entirely,
176
+ // but since it already degrades gracefully the cost is just a failed exec.
177
+ try {
178
+ const result = await execa('yarn', [
179
+ 'global',
180
+ 'list',
181
+ '--json'
182
+ ], {
183
+ reject: false,
184
+ timeout: 10_000
185
+ });
186
+ if (!result.stdout) {
187
+ return [];
188
+ }
189
+ // Yarn outputs NDJSON - one JSON object per line
190
+ const globals = [];
191
+ const lines = result.stdout.split('\n').filter(Boolean);
192
+ for (const line of lines){
193
+ try {
194
+ const entry = JSON.parse(line);
195
+ if (entry.type === 'info' && entry.data) {
196
+ // Yarn classic emits: "\"sanity@3.67.0\" has binaries:\n - sanity"
197
+ // Extract the quoted "package@version" portion.
198
+ for (const pkg of SANITY_PACKAGES){
199
+ const prefix = `"${pkg}@`;
200
+ if (entry.data.startsWith(prefix)) {
201
+ const closingQuote = entry.data.indexOf('"', prefix.length);
202
+ if (closingQuote !== -1) {
203
+ globals.push({
204
+ isActive: false,
205
+ packageManager: 'yarn',
206
+ packageName: pkg,
207
+ path: null,
208
+ version: entry.data.slice(prefix.length, closingQuote)
209
+ });
210
+ }
211
+ }
212
+ }
213
+ }
214
+ } catch {
215
+ // Skip malformed lines
216
+ }
217
+ }
218
+ return globals;
219
+ } catch {
220
+ return [];
221
+ }
222
+ }
223
+ // As of Bun 1.2, `bun pm ls` does not support --json or -g flags.
224
+ // Skip the subprocess call entirely to avoid wasted latency on every run.
225
+ // Re-enable when bun implements JSON output (see oven-sh/bun#26222).
226
+ async function queryBunGlobals() {
227
+ return [];
228
+ }
229
+ function markActiveInstallation(globals, activeBinaryPath, npmLibDir, pnpmBinDir) {
230
+ if (!activeBinaryPath) {
231
+ return globals;
232
+ }
233
+ // Determine which package manager the active binary belongs to.
234
+ // For npm and pnpm, we verify against their actual reported directories
235
+ // rather than relying on path substring matching which breaks with
236
+ // custom install locations.
237
+ let activePackageManager = null;
238
+ // bun — check default ~/.bun/ path, then fall back to BUN_INSTALL env var
239
+ // for users with a custom installation directory.
240
+ if (isInBunDir(activeBinaryPath)) {
241
+ activePackageManager = 'bun';
242
+ } else if (pnpmBinDir && isInPnpmBinDir(activeBinaryPath, pnpmBinDir)) {
243
+ activePackageManager = 'pnpm';
244
+ } else if (activeBinaryPath.includes('/.yarn/') || activeBinaryPath.includes('\\.yarn\\') || activeBinaryPath.includes('/.config/yarn/')) {
245
+ activePackageManager = 'yarn';
246
+ } else if (npmLibDir && isInNpmBinDir(activeBinaryPath, npmLibDir)) {
247
+ activePackageManager = 'npm';
248
+ }
249
+ return globals.map((g)=>({
250
+ ...g,
251
+ // Mark as active if it's from the detected package manager.
252
+ // Both `sanity` and `@sanity/cli` provide a `sanity` binary,
253
+ // so either package from the active pm is considered active.
254
+ isActive: g.packageManager === activePackageManager
255
+ }));
256
+ }
257
+ /**
258
+ * Checks whether a binary path is inside pnpm's global bin directory.
259
+ * `pnpm bin -g` returns the directory where global binaries are linked.
260
+ */ function isInPnpmBinDir(binaryPath, pnpmBinDir) {
261
+ const binaryDir = path.dirname(path.normalize(binaryPath));
262
+ return binaryDir === path.normalize(pnpmBinDir);
263
+ }
264
+ /**
265
+ * Checks whether a binary path is inside npm's global bin directory.
266
+ * On Unix: lib is at `<prefix>/lib`, bins at `<prefix>/bin` (sibling dirs).
267
+ * On Windows: lib and bins share the same directory.
268
+ */ function isInBunDir(binaryPath) {
269
+ // Default ~/.bun/ location
270
+ if (binaryPath.includes('/.bun/') || binaryPath.includes('\\.bun\\')) {
271
+ return true;
272
+ }
273
+ // Custom BUN_INSTALL directory (e.g. BUN_INSTALL=/opt/bun)
274
+ const bunInstall = process.env.BUN_INSTALL;
275
+ if (bunInstall) {
276
+ const binaryDir = path.dirname(path.normalize(binaryPath));
277
+ const bunBinDir = path.join(path.normalize(bunInstall), 'bin');
278
+ if (binaryDir === bunBinDir) {
279
+ return true;
280
+ }
281
+ }
282
+ return false;
283
+ }
284
+ function isInNpmBinDir(binaryPath, npmLibDir) {
285
+ // Normalize paths first — on Windows, path.dirname preserves forward slashes
286
+ // but path.join converts to backslashes, causing mismatches without this.
287
+ const binaryDir = path.dirname(path.normalize(binaryPath));
288
+ const normalizedLibDir = path.normalize(npmLibDir);
289
+ // Unix: bins at <prefix>/bin, lib at <prefix>/lib → sibling directories
290
+ const unixBinDir = path.join(path.dirname(normalizedLibDir), 'bin');
291
+ // Windows: bins and lib share the same directory
292
+ return binaryDir === unixBinDir || binaryDir === normalizedLibDir;
293
+ }
294
+
295
+ //# sourceMappingURL=detectGlobals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/util/packageManager/installationInfo/detectGlobals.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {execa} from 'execa'\nimport which from 'which'\n\nimport {type GlobalInstallation, type LockfileType, type SanityPackage} from './types.js'\n\nconst SANITY_PACKAGES: SanityPackage[] = ['sanity', '@sanity/cli']\n\n/**\n * Tries to parse JSON from command output that may contain non-JSON prefix lines\n * (e.g. npm warnings printed before JSON). Returns null if parsing fails.\n */\nfunction tryParseJson<T>(stdout: string): T | null {\n // First, try parsing the full output\n try {\n return JSON.parse(stdout) as T\n } catch {\n // Fall through\n }\n\n // Try to find the start of JSON content (first { or [)\n const jsonStart = stdout.search(/[{[]/)\n if (jsonStart > 0) {\n try {\n return JSON.parse(stdout.slice(jsonStart)) as T\n } catch {\n // Fall through\n }\n }\n\n return null\n}\n\ninterface NpmListOutput {\n dependencies?: Record<\n string,\n {\n resolved?: string\n version: string\n }\n >\n /** Global lib directory (e.g. /usr/local/lib on Unix). */\n path?: string\n}\n\ninterface NpmGlobalsResult {\n globals: GlobalInstallation[]\n /** npm's global lib directory, used to verify the active binary belongs to npm. */\n libDir: string | null\n}\n\ninterface PnpmListProject {\n dependencies?: Record<string, {path?: string; version: string}>\n path?: string\n}\n\n/**\n * Detects global installations of sanity and \\@sanity/cli across all package managers.\n * Runs queries in parallel for efficiency.\n */\nexport async function detectGlobalInstallations(): Promise<GlobalInstallation[]> {\n // Query all package managers in parallel\n const [activeBinaryPath, npmResult, pnpmResult, yarnGlobals, bunGlobals] = await Promise.all([\n // Find which binary is active in PATH\n findActiveBinaryPath(),\n queryNpmGlobals(),\n queryPnpmGlobals(),\n queryYarnGlobals(),\n queryBunGlobals(),\n ])\n\n const allGlobals = [...npmResult.globals, ...pnpmResult.globals, ...yarnGlobals, ...bunGlobals]\n\n // Mark which installation is active\n return markActiveInstallation(allGlobals, activeBinaryPath, npmResult.libDir, pnpmResult.binDir)\n}\n\nasync function findActiveBinaryPath(): Promise<string | null> {\n try {\n return await which('sanity')\n } catch {\n return null\n }\n}\n\nasync function queryNpmGlobals(): Promise<NpmGlobalsResult> {\n try {\n const result = await execa('npm', ['list', '-g', '--depth=0', '--json'], {\n reject: false,\n timeout: 10_000,\n })\n\n if (!result.stdout) {\n return {globals: [], libDir: null}\n }\n\n const output = tryParseJson<NpmListOutput>(result.stdout)\n if (!output) {\n return {globals: [], libDir: null}\n }\n\n const globals: GlobalInstallation[] = []\n\n for (const pkg of SANITY_PACKAGES) {\n const dep = output.dependencies?.[pkg]\n if (dep) {\n globals.push({\n isActive: false, // Will be set later\n packageManager: 'npm',\n packageName: pkg,\n // npm's `resolved` is a tarball URL, not a filesystem path.\n path: null,\n version: dep.version,\n })\n }\n }\n\n return {globals, libDir: output.path ?? null}\n } catch {\n return {globals: [], libDir: null}\n }\n}\n\ninterface PnpmGlobalsResult {\n /** pnpm's global bin directory, used to verify the active binary belongs to pnpm. */\n binDir: string | null\n globals: GlobalInstallation[]\n}\n\nasync function queryPnpmGlobals(): Promise<PnpmGlobalsResult> {\n try {\n // Query pnpm global bin dir and global packages in parallel\n const [binResult, listResult] = await Promise.all([\n execa('pnpm', ['bin', '-g'], {reject: false, timeout: 10_000}),\n execa('pnpm', ['list', '-g', '--depth=0', '--json'], {reject: false, timeout: 10_000}),\n ])\n\n const binDir = binResult.stdout?.trim() || null\n\n if (!listResult.stdout) {\n return {binDir, globals: []}\n }\n\n const output = tryParseJson<PnpmListProject[]>(listResult.stdout)\n if (!output) {\n return {binDir, globals: []}\n }\n\n const globals: GlobalInstallation[] = []\n\n for (const project of output) {\n if (!project.dependencies) continue\n for (const pkg of SANITY_PACKAGES) {\n const dep = project.dependencies[pkg]\n if (dep) {\n globals.push({\n isActive: false,\n packageManager: 'pnpm',\n packageName: pkg,\n path: dep.path || null,\n version: dep.version,\n })\n }\n }\n }\n\n return {binDir, globals}\n } catch {\n return {binDir: null, globals: []}\n }\n}\n\nasync function queryYarnGlobals(): Promise<GlobalInstallation[]> {\n // `yarn global list` only works with Yarn Classic (v1).\n // Yarn Berry (v2+) removed global installs entirely — the command errors or\n // produces no output. Because `reject: false` is set, the call returns\n // empty stdout and we gracefully return []. This means Yarn Berry global\n // installations (if any exist via third-party plugins) are invisible here.\n // A version check (via getYarnMajorVersion) could skip the call entirely,\n // but since it already degrades gracefully the cost is just a failed exec.\n try {\n const result = await execa('yarn', ['global', 'list', '--json'], {\n reject: false,\n timeout: 10_000,\n })\n\n if (!result.stdout) {\n return []\n }\n\n // Yarn outputs NDJSON - one JSON object per line\n const globals: GlobalInstallation[] = []\n const lines = result.stdout.split('\\n').filter(Boolean)\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line) as {data: string; type: string}\n if (entry.type === 'info' && entry.data) {\n // Yarn classic emits: \"\\\"sanity@3.67.0\\\" has binaries:\\n - sanity\"\n // Extract the quoted \"package@version\" portion.\n for (const pkg of SANITY_PACKAGES) {\n const prefix = `\"${pkg}@`\n if (entry.data.startsWith(prefix)) {\n const closingQuote = entry.data.indexOf('\"', prefix.length)\n if (closingQuote !== -1) {\n globals.push({\n isActive: false,\n packageManager: 'yarn',\n packageName: pkg,\n path: null,\n version: entry.data.slice(prefix.length, closingQuote),\n })\n }\n }\n }\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n return globals\n } catch {\n return []\n }\n}\n\n// As of Bun 1.2, `bun pm ls` does not support --json or -g flags.\n// Skip the subprocess call entirely to avoid wasted latency on every run.\n// Re-enable when bun implements JSON output (see oven-sh/bun#26222).\nasync function queryBunGlobals(): Promise<GlobalInstallation[]> {\n return []\n}\n\nfunction markActiveInstallation(\n globals: GlobalInstallation[],\n activeBinaryPath: string | null,\n npmLibDir: string | null,\n pnpmBinDir: string | null,\n): GlobalInstallation[] {\n if (!activeBinaryPath) {\n return globals\n }\n\n // Determine which package manager the active binary belongs to.\n // For npm and pnpm, we verify against their actual reported directories\n // rather than relying on path substring matching which breaks with\n // custom install locations.\n let activePackageManager: LockfileType | null = null\n\n // bun — check default ~/.bun/ path, then fall back to BUN_INSTALL env var\n // for users with a custom installation directory.\n if (isInBunDir(activeBinaryPath)) {\n activePackageManager = 'bun'\n }\n // pnpm — verify against pnpm's actual global bin dir from `pnpm bin -g`.\n // This works regardless of PNPM_HOME configuration.\n else if (pnpmBinDir && isInPnpmBinDir(activeBinaryPath, pnpmBinDir)) {\n activePackageManager = 'pnpm'\n }\n // yarn — unlike npm/pnpm, Yarn Classic has no reliable command to query its\n // global bin directory. `yarn global bin` exists but its output varies by\n // platform and configuration. Fall back to known path patterns.\n // TODO: Query `yarn global bin` for more accurate detection, similar to\n // how pnpm uses `pnpm bin -g`. Custom $YARN_DIR or non-standard install\n // locations will not be detected by these patterns.\n else if (\n activeBinaryPath.includes('/.yarn/') ||\n activeBinaryPath.includes('\\\\.yarn\\\\') ||\n activeBinaryPath.includes('/.config/yarn/')\n ) {\n activePackageManager = 'yarn'\n }\n // npm — verify the binary is actually in npm's global bin directory.\n // `npm list -g --json` reports a `path` (the global lib dir, e.g. /usr/local/lib).\n // On Unix, bins are at <prefix>/bin (sibling of lib). On Windows, bins are in\n // the same directory as lib. When npmLibDir is null (npm didn't report a path),\n // we can't verify — leave activePackageManager as null rather than guessing,\n // since incorrectly marking npm as active could misclassify local installs.\n else if (npmLibDir && isInNpmBinDir(activeBinaryPath, npmLibDir)) {\n activePackageManager = 'npm'\n }\n\n return globals.map((g) => ({\n ...g,\n // Mark as active if it's from the detected package manager.\n // Both `sanity` and `@sanity/cli` provide a `sanity` binary,\n // so either package from the active pm is considered active.\n isActive: g.packageManager === activePackageManager,\n }))\n}\n\n/**\n * Checks whether a binary path is inside pnpm's global bin directory.\n * `pnpm bin -g` returns the directory where global binaries are linked.\n */\nfunction isInPnpmBinDir(binaryPath: string, pnpmBinDir: string): boolean {\n const binaryDir = path.dirname(path.normalize(binaryPath))\n return binaryDir === path.normalize(pnpmBinDir)\n}\n\n/**\n * Checks whether a binary path is inside npm's global bin directory.\n * On Unix: lib is at `<prefix>/lib`, bins at `<prefix>/bin` (sibling dirs).\n * On Windows: lib and bins share the same directory.\n */\nfunction isInBunDir(binaryPath: string): boolean {\n // Default ~/.bun/ location\n if (binaryPath.includes('/.bun/') || binaryPath.includes('\\\\.bun\\\\')) {\n return true\n }\n // Custom BUN_INSTALL directory (e.g. BUN_INSTALL=/opt/bun)\n const bunInstall = process.env.BUN_INSTALL\n if (bunInstall) {\n const binaryDir = path.dirname(path.normalize(binaryPath))\n const bunBinDir = path.join(path.normalize(bunInstall), 'bin')\n if (binaryDir === bunBinDir) {\n return true\n }\n }\n return false\n}\n\nfunction isInNpmBinDir(binaryPath: string, npmLibDir: string): boolean {\n // Normalize paths first — on Windows, path.dirname preserves forward slashes\n // but path.join converts to backslashes, causing mismatches without this.\n const binaryDir = path.dirname(path.normalize(binaryPath))\n const normalizedLibDir = path.normalize(npmLibDir)\n // Unix: bins at <prefix>/bin, lib at <prefix>/lib → sibling directories\n const unixBinDir = path.join(path.dirname(normalizedLibDir), 'bin')\n // Windows: bins and lib share the same directory\n return binaryDir === unixBinDir || binaryDir === normalizedLibDir\n}\n"],"names":["path","execa","which","SANITY_PACKAGES","tryParseJson","stdout","JSON","parse","jsonStart","search","slice","detectGlobalInstallations","activeBinaryPath","npmResult","pnpmResult","yarnGlobals","bunGlobals","Promise","all","findActiveBinaryPath","queryNpmGlobals","queryPnpmGlobals","queryYarnGlobals","queryBunGlobals","allGlobals","globals","markActiveInstallation","libDir","binDir","result","reject","timeout","output","pkg","dep","dependencies","push","isActive","packageManager","packageName","version","binResult","listResult","trim","project","lines","split","filter","Boolean","line","entry","type","data","prefix","startsWith","closingQuote","indexOf","length","npmLibDir","pnpmBinDir","activePackageManager","isInBunDir","isInPnpmBinDir","includes","isInNpmBinDir","map","g","binaryPath","binaryDir","dirname","normalize","bunInstall","process","env","BUN_INSTALL","bunBinDir","join","normalizedLibDir","unixBinDir"],"mappings":"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"}
@@ -0,0 +1,190 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { fileURLToPath, pathToFileURL } from 'node:url';
4
+ import { resolve as resolveImport } from 'import-meta-resolve';
5
+ import { readJsonFile } from './readJsonFile.js';
6
+ import { resolveVersionRange } from './resolveVersionRange.js';
7
+ /**
8
+ * Finds where a package is declared in the workspace, walking up from startDir.
9
+ * Resolves catalog: protocol if used.
10
+ */ export async function findPackageDeclaration(packageName, startDir, workspaceInfo) {
11
+ let currentDir = path.resolve(startDir);
12
+ const fsRoot = path.parse(currentDir).root;
13
+ // Walk up until we pass the workspace root
14
+ while(currentDir !== fsRoot){
15
+ const packageJsonPath = path.join(currentDir, 'package.json');
16
+ const packageJson = await readJsonFile(packageJsonPath);
17
+ if (packageJson) {
18
+ // Check dependencies and devDependencies only.
19
+ // peerDependencies are excluded because they are not auto-installed —
20
+ // flagging them as declared-not-installed would be a false positive
21
+ // (common in Sanity plugins that list sanity as a peer dep).
22
+ const depTypes = [
23
+ 'dependencies',
24
+ 'devDependencies'
25
+ ];
26
+ for (const depType of depTypes){
27
+ const deps = packageJson[depType];
28
+ if (deps && packageName in deps) {
29
+ const declaredVersionRange = deps[packageName];
30
+ const versionRange = await resolveVersionRange(declaredVersionRange, packageName, workspaceInfo);
31
+ return {
32
+ declaredVersionRange,
33
+ dependencyType: depType,
34
+ packageJsonPath,
35
+ versionRange
36
+ };
37
+ }
38
+ }
39
+ }
40
+ // Stop at workspace root
41
+ if (currentDir === workspaceInfo.root) {
42
+ break;
43
+ }
44
+ currentDir = path.dirname(currentDir);
45
+ }
46
+ return null;
47
+ }
48
+ /**
49
+ * Finds if a package has an override/resolution defined in the workspace root.
50
+ * Checks npm overrides, yarn resolutions, and pnpm overrides.
51
+ */ export async function findPackageOverride(packageName, workspaceInfo) {
52
+ const rootPackageJsonPath = path.join(workspaceInfo.root, 'package.json');
53
+ const packageJson = await readJsonFile(rootPackageJsonPath);
54
+ if (!packageJson) {
55
+ return null;
56
+ }
57
+ // Check npm/pnpm overrides
58
+ if (packageJson.overrides && packageName in packageJson.overrides) {
59
+ return {
60
+ mechanism: 'npm-overrides',
61
+ packageJsonPath: rootPackageJsonPath,
62
+ versionRange: packageJson.overrides[packageName]
63
+ };
64
+ }
65
+ // Check pnpm.overrides (alternative location)
66
+ if (packageJson.pnpm?.overrides && packageName in packageJson.pnpm.overrides) {
67
+ return {
68
+ mechanism: 'pnpm-overrides',
69
+ packageJsonPath: rootPackageJsonPath,
70
+ versionRange: packageJson.pnpm.overrides[packageName]
71
+ };
72
+ }
73
+ // Check yarn resolutions
74
+ if (packageJson.resolutions && packageName in packageJson.resolutions) {
75
+ return {
76
+ mechanism: 'yarn-resolutions',
77
+ packageJsonPath: rootPackageJsonPath,
78
+ versionRange: packageJson.resolutions[packageName]
79
+ };
80
+ }
81
+ return null;
82
+ }
83
+ /**
84
+ * Finds installed package in node_modules, walking up from startDir.
85
+ * Also extracts \@sanity/cli dependency range from sanity package if applicable.
86
+ *
87
+ * Handles both hoisted (npm/yarn) and nested (pnpm) node_modules structures.
88
+ */ export async function findInstalledPackage(packageName, startDir, workspaceRoot) {
89
+ let currentDir = path.resolve(startDir);
90
+ const fsRoot = path.parse(currentDir).root;
91
+ while(currentDir !== fsRoot){
92
+ // First, check the top-level node_modules (works for npm, yarn, and hoisted pnpm)
93
+ const result = await findPackageInNodeModules(packageName, path.join(currentDir, 'node_modules'));
94
+ if (result) {
95
+ return result;
96
+ }
97
+ // For @sanity/cli, use Node's module resolution from sanity's location.
98
+ // This handles all package manager layouts (pnpm nested deps, hoisting, etc.)
99
+ if (packageName === '@sanity/cli') {
100
+ const sanityPath = await resolvePackagePath(path.join(currentDir, 'node_modules', 'sanity'));
101
+ if (sanityPath) {
102
+ const nestedResult = await resolveCliFromSanity(sanityPath);
103
+ if (nestedResult) {
104
+ return nestedResult;
105
+ }
106
+ }
107
+ }
108
+ // Stop at workspace root
109
+ if (currentDir === workspaceRoot) {
110
+ break;
111
+ }
112
+ currentDir = path.dirname(currentDir);
113
+ }
114
+ return null;
115
+ }
116
+ /**
117
+ * Looks for a package in a specific node_modules directory.
118
+ */ async function findPackageInNodeModules(packageName, nodeModulesDir) {
119
+ const packagePath = path.join(nodeModulesDir, packageName);
120
+ const resolvedPath = await resolvePackagePath(packagePath);
121
+ if (!resolvedPath) {
122
+ return null;
123
+ }
124
+ const packageJsonPath = path.join(resolvedPath, 'package.json');
125
+ const packageJson = await readJsonFile(packageJsonPath);
126
+ if (!packageJson?.version) {
127
+ return null;
128
+ }
129
+ let cliDependencyRange = null;
130
+ // If this is the sanity package, extract @sanity/cli dependency
131
+ if (packageName === 'sanity') {
132
+ cliDependencyRange = packageJson.dependencies?.['@sanity/cli'] ?? null;
133
+ }
134
+ return {
135
+ cliDependencyRange,
136
+ path: resolvedPath,
137
+ version: packageJson.version
138
+ };
139
+ }
140
+ /**
141
+ * Resolves a package path, following symlinks (pnpm uses symlinks).
142
+ * Returns null if the path doesn't exist.
143
+ */ async function resolvePackagePath(packagePath) {
144
+ try {
145
+ // Use realpath to follow symlinks (important for pnpm)
146
+ return await fs.realpath(packagePath);
147
+ } catch {
148
+ return null;
149
+ }
150
+ }
151
+ /**
152
+ * Uses Node's module resolution to find \@sanity/cli from sanity's location.
153
+ * This is more robust than manually traversing directories as it handles
154
+ * all package manager layouts (pnpm nested deps, hoisting variations, etc.)
155
+ */ async function resolveCliFromSanity(sanityPath) {
156
+ try {
157
+ // Resolve @sanity/cli/package.json from sanity's perspective
158
+ const sanityPkgUrl = pathToFileURL(path.join(sanityPath, 'package.json')).href;
159
+ const cliPkgUrl = resolveImport('@sanity/cli/package.json', sanityPkgUrl);
160
+ const cliPkgPath = fileURLToPath(cliPkgUrl);
161
+ const cliPath = path.dirname(cliPkgPath);
162
+ const packageJson = await readJsonFile(cliPkgPath);
163
+ if (!packageJson?.version) {
164
+ return null;
165
+ }
166
+ return {
167
+ cliDependencyRange: null,
168
+ path: cliPath,
169
+ version: packageJson.version
170
+ };
171
+ } catch {
172
+ return null;
173
+ }
174
+ }
175
+ /**
176
+ * Collects all package info (declaration, override, installed) for a package.
177
+ */ export async function collectPackageInfo(packageName, startDir, workspaceInfo) {
178
+ const [declared, override, installed] = await Promise.all([
179
+ findPackageDeclaration(packageName, startDir, workspaceInfo),
180
+ findPackageOverride(packageName, workspaceInfo),
181
+ findInstalledPackage(packageName, startDir, workspaceInfo.root)
182
+ ]);
183
+ return {
184
+ declared,
185
+ installed,
186
+ override
187
+ };
188
+ }
189
+
190
+ //# sourceMappingURL=detectPackages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/util/packageManager/installationInfo/detectPackages.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {fileURLToPath, pathToFileURL} from 'node:url'\n\nimport {resolve as resolveImport} from 'import-meta-resolve'\n\nimport {readJsonFile} from './readJsonFile.js'\nimport {resolveVersionRange} from './resolveVersionRange.js'\nimport {\n type InstalledPackage,\n type PackageDeclaration,\n type PackageInfo,\n type PackageOverride,\n type SanityPackage,\n type WorkspaceInfo,\n} from './types.js'\n\ninterface PackageJson {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n name?: string\n overrides?: Record<string, string>\n pnpm?: {\n overrides?: Record<string, string>\n }\n resolutions?: Record<string, string>\n version?: string\n}\n\n/**\n * Finds where a package is declared in the workspace, walking up from startDir.\n * Resolves catalog: protocol if used.\n */\nexport async function findPackageDeclaration(\n packageName: SanityPackage,\n startDir: string,\n workspaceInfo: WorkspaceInfo,\n): Promise<PackageDeclaration | null> {\n let currentDir = path.resolve(startDir)\n const fsRoot = path.parse(currentDir).root\n\n // Walk up until we pass the workspace root\n while (currentDir !== fsRoot) {\n const packageJsonPath = path.join(currentDir, 'package.json')\n const packageJson = await readJsonFile<PackageJson>(packageJsonPath)\n\n if (packageJson) {\n // Check dependencies and devDependencies only.\n // peerDependencies are excluded because they are not auto-installed —\n // flagging them as declared-not-installed would be a false positive\n // (common in Sanity plugins that list sanity as a peer dep).\n const depTypes = ['dependencies', 'devDependencies'] as const\n for (const depType of depTypes) {\n const deps = packageJson[depType]\n if (deps && packageName in deps) {\n const declaredVersionRange = deps[packageName]\n const versionRange = await resolveVersionRange(\n declaredVersionRange,\n packageName,\n workspaceInfo,\n )\n\n return {\n declaredVersionRange,\n dependencyType: depType,\n packageJsonPath,\n versionRange,\n }\n }\n }\n }\n\n // Stop at workspace root\n if (currentDir === workspaceInfo.root) {\n break\n }\n\n currentDir = path.dirname(currentDir)\n }\n\n return null\n}\n\n/**\n * Finds if a package has an override/resolution defined in the workspace root.\n * Checks npm overrides, yarn resolutions, and pnpm overrides.\n */\nexport async function findPackageOverride(\n packageName: SanityPackage,\n workspaceInfo: WorkspaceInfo,\n): Promise<PackageOverride | null> {\n const rootPackageJsonPath = path.join(workspaceInfo.root, 'package.json')\n const packageJson = await readJsonFile<PackageJson>(rootPackageJsonPath)\n\n if (!packageJson) {\n return null\n }\n\n // Check npm/pnpm overrides\n if (packageJson.overrides && packageName in packageJson.overrides) {\n return {\n mechanism: 'npm-overrides',\n packageJsonPath: rootPackageJsonPath,\n versionRange: packageJson.overrides[packageName],\n }\n }\n\n // Check pnpm.overrides (alternative location)\n if (packageJson.pnpm?.overrides && packageName in packageJson.pnpm.overrides) {\n return {\n mechanism: 'pnpm-overrides',\n packageJsonPath: rootPackageJsonPath,\n versionRange: packageJson.pnpm.overrides[packageName],\n }\n }\n\n // Check yarn resolutions\n if (packageJson.resolutions && packageName in packageJson.resolutions) {\n return {\n mechanism: 'yarn-resolutions',\n packageJsonPath: rootPackageJsonPath,\n versionRange: packageJson.resolutions[packageName],\n }\n }\n\n return null\n}\n\n/**\n * Finds installed package in node_modules, walking up from startDir.\n * Also extracts \\@sanity/cli dependency range from sanity package if applicable.\n *\n * Handles both hoisted (npm/yarn) and nested (pnpm) node_modules structures.\n */\nexport async function findInstalledPackage(\n packageName: SanityPackage,\n startDir: string,\n workspaceRoot: string,\n): Promise<InstalledPackage | null> {\n let currentDir = path.resolve(startDir)\n const fsRoot = path.parse(currentDir).root\n\n while (currentDir !== fsRoot) {\n // First, check the top-level node_modules (works for npm, yarn, and hoisted pnpm)\n const result = await findPackageInNodeModules(\n packageName,\n path.join(currentDir, 'node_modules'),\n )\n if (result) {\n return result\n }\n\n // For @sanity/cli, use Node's module resolution from sanity's location.\n // This handles all package manager layouts (pnpm nested deps, hoisting, etc.)\n if (packageName === '@sanity/cli') {\n const sanityPath = await resolvePackagePath(path.join(currentDir, 'node_modules', 'sanity'))\n if (sanityPath) {\n const nestedResult = await resolveCliFromSanity(sanityPath)\n if (nestedResult) {\n return nestedResult\n }\n }\n }\n\n // Stop at workspace root\n if (currentDir === workspaceRoot) {\n break\n }\n\n currentDir = path.dirname(currentDir)\n }\n\n return null\n}\n\n/**\n * Looks for a package in a specific node_modules directory.\n */\nasync function findPackageInNodeModules(\n packageName: SanityPackage,\n nodeModulesDir: string,\n): Promise<InstalledPackage | null> {\n const packagePath = path.join(nodeModulesDir, packageName)\n const resolvedPath = await resolvePackagePath(packagePath)\n\n if (!resolvedPath) {\n return null\n }\n\n const packageJsonPath = path.join(resolvedPath, 'package.json')\n const packageJson = await readJsonFile<PackageJson>(packageJsonPath)\n\n if (!packageJson?.version) {\n return null\n }\n\n let cliDependencyRange: string | null = null\n\n // If this is the sanity package, extract @sanity/cli dependency\n if (packageName === 'sanity') {\n cliDependencyRange = packageJson.dependencies?.['@sanity/cli'] ?? null\n }\n\n return {\n cliDependencyRange,\n path: resolvedPath,\n version: packageJson.version,\n }\n}\n\n/**\n * Resolves a package path, following symlinks (pnpm uses symlinks).\n * Returns null if the path doesn't exist.\n */\nasync function resolvePackagePath(packagePath: string): Promise<string | null> {\n try {\n // Use realpath to follow symlinks (important for pnpm)\n return await fs.realpath(packagePath)\n } catch {\n return null\n }\n}\n\n/**\n * Uses Node's module resolution to find \\@sanity/cli from sanity's location.\n * This is more robust than manually traversing directories as it handles\n * all package manager layouts (pnpm nested deps, hoisting variations, etc.)\n */\nasync function resolveCliFromSanity(sanityPath: string): Promise<InstalledPackage | null> {\n try {\n // Resolve @sanity/cli/package.json from sanity's perspective\n const sanityPkgUrl = pathToFileURL(path.join(sanityPath, 'package.json')).href\n const cliPkgUrl = resolveImport('@sanity/cli/package.json', sanityPkgUrl)\n const cliPkgPath = fileURLToPath(cliPkgUrl)\n const cliPath = path.dirname(cliPkgPath)\n\n const packageJson = await readJsonFile<PackageJson>(cliPkgPath)\n if (!packageJson?.version) {\n return null\n }\n\n return {\n cliDependencyRange: null,\n path: cliPath,\n version: packageJson.version,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Collects all package info (declaration, override, installed) for a package.\n */\nexport async function collectPackageInfo(\n packageName: SanityPackage,\n startDir: string,\n workspaceInfo: WorkspaceInfo,\n): Promise<PackageInfo> {\n const [declared, override, installed] = await Promise.all([\n findPackageDeclaration(packageName, startDir, workspaceInfo),\n findPackageOverride(packageName, workspaceInfo),\n findInstalledPackage(packageName, startDir, workspaceInfo.root),\n ])\n\n return {declared, installed, override}\n}\n"],"names":["fs","path","fileURLToPath","pathToFileURL","resolve","resolveImport","readJsonFile","resolveVersionRange","findPackageDeclaration","packageName","startDir","workspaceInfo","currentDir","fsRoot","parse","root","packageJsonPath","join","packageJson","depTypes","depType","deps","declaredVersionRange","versionRange","dependencyType","dirname","findPackageOverride","rootPackageJsonPath","overrides","mechanism","pnpm","resolutions","findInstalledPackage","workspaceRoot","result","findPackageInNodeModules","sanityPath","resolvePackagePath","nestedResult","resolveCliFromSanity","nodeModulesDir","packagePath","resolvedPath","version","cliDependencyRange","dependencies","realpath","sanityPkgUrl","href","cliPkgUrl","cliPkgPath","cliPath","collectPackageInfo","declared","override","installed","Promise","all"],"mappings":"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"}