@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/util/getLocalPackageVersion.ts"],"sourcesContent":["import {join, normalize as normalizePath} from 'node:path'\n\nimport resolveFrom from 'resolve-from'\n\nimport {readPackageJson} from './readPackageJson.js'\n\n/**\n * Get the version of a package installed locally.\n *\n * @param moduleId - The name of the package in npm.\n * @param workDir - The working directory to resolve the module from.\n * @returns The version of the package installed locally.\n * @internal\n */\nexport async function getLocalPackageVersion(\n moduleId: string,\n workDir: string,\n): Promise<string | undefined> {\n const fromPath = workDir || process.cwd()\n const modulePath = resolveFrom.silent(fromPath, join(moduleId, 'package.json'))\n if (modulePath) {\n const pkg = await readPackageJson(modulePath)\n return pkg.version\n }\n\n // In the case of packages with an `exports` key, we may not be able to resolve `package.json`.\n // If this happens, try to resolve the module itself and look for the last occurence of the\n // package name, then append `package.json` to that path\n const pathSegment = normalizePath(moduleId)\n const parentPath = resolveFrom.silent(fromPath, moduleId)\n if (!parentPath) {\n return undefined\n }\n\n const moduleRoot = parentPath.slice(0, parentPath.lastIndexOf(pathSegment) + pathSegment.length)\n const manifestPath = join(moduleRoot, 'package.json')\n const pkg = await readPackageJson(manifestPath)\n return pkg.version\n}\n"],"names":["join","normalize","normalizePath","resolveFrom","readPackageJson","getLocalPackageVersion","moduleId","workDir","fromPath","process","cwd","modulePath","silent","pkg","version","pathSegment","parentPath","undefined","moduleRoot","slice","lastIndexOf","length","manifestPath"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,aAAaC,aAAa,QAAO,YAAW;AAE1D,OAAOC,iBAAiB,eAAc;AAEtC,SAAQC,eAAe,QAAO,uBAAsB;AAEpD;;;;;;;CAOC,GACD,OAAO,eAAeC,uBACpBC,QAAgB,EAChBC,OAAe;IAEf,MAAMC,WAAWD,WAAWE,QAAQC,GAAG;IACvC,MAAMC,aAAaR,YAAYS,MAAM,CAACJ,UAAUR,KAAKM,UAAU;IAC/D,IAAIK,YAAY;QACd,MAAME,MAAM,MAAMT,gBAAgBO;QAClC,OAAOE,IAAIC,OAAO;IACpB;IAEA,+FAA+F;IAC/F,2FAA2F;IAC3F,wDAAwD;IACxD,MAAMC,cAAcb,cAAcI;IAClC,MAAMU,aAAab,YAAYS,MAAM,CAACJ,UAAUF;IAChD,IAAI,CAACU,YAAY;QACf,OAAOC;IACT;IAEA,MAAMC,aAAaF,WAAWG,KAAK,CAAC,GAAGH,WAAWI,WAAW,CAACL,eAAeA,YAAYM,MAAM;IAC/F,MAAMC,eAAetB,KAAKkB,YAAY;IACtC,MAAML,MAAM,MAAMT,gBAAgBkB;IAClC,OAAOT,IAAIC,OAAO;AACpB"}
1
+ {"version":3,"sources":["../../src/util/getLocalPackageVersion.ts"],"sourcesContent":["import {join, normalize, resolve} from 'node:path'\nimport {fileURLToPath, pathToFileURL} from 'node:url'\n\nimport {readPackageJson} from '@sanity/cli-core'\nimport {moduleResolve} from 'import-meta-resolve'\n\n/**\n * Get the version of a package installed locally.\n *\n * @param moduleName - The name of the package in npm.\n * @param workDir - The working directory to resolve the module from. (aka project root)\n * @returns The version of the package installed locally.\n * @internal\n */\nexport async function getLocalPackageVersion(\n moduleName: string,\n workDir: string,\n): Promise<string | null> {\n try {\n const dirUrl = pathToFileURL(resolve(workDir, 'noop.js'))\n\n let packageJsonUrl: URL\n try {\n packageJsonUrl = moduleResolve(`${moduleName}/package.json`, dirUrl)\n } catch (err: unknown) {\n if (isErrPackagePathNotExported(err)) {\n // Fallback: resolve main entry point and derive package root\n const mainUrl = moduleResolve(moduleName, dirUrl)\n const mainPath = fileURLToPath(mainUrl)\n const normalizedName = normalize(moduleName)\n const idx = mainPath.lastIndexOf(normalizedName)\n const moduleRoot = mainPath.slice(0, idx + normalizedName.length)\n packageJsonUrl = pathToFileURL(join(moduleRoot, 'package.json'))\n } else {\n throw err\n }\n }\n\n return (await readPackageJson(packageJsonUrl)).version\n } catch {\n return null\n }\n}\n\nfunction isErrPackagePathNotExported(err: unknown): boolean {\n return err instanceof Error && 'code' in err && err.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED'\n}\n"],"names":["join","normalize","resolve","fileURLToPath","pathToFileURL","readPackageJson","moduleResolve","getLocalPackageVersion","moduleName","workDir","dirUrl","packageJsonUrl","err","isErrPackagePathNotExported","mainUrl","mainPath","normalizedName","idx","lastIndexOf","moduleRoot","slice","length","version","Error","code"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,SAAS,EAAEC,OAAO,QAAO,YAAW;AAClD,SAAQC,aAAa,EAAEC,aAAa,QAAO,WAAU;AAErD,SAAQC,eAAe,QAAO,mBAAkB;AAChD,SAAQC,aAAa,QAAO,sBAAqB;AAEjD;;;;;;;CAOC,GACD,OAAO,eAAeC,uBACpBC,UAAkB,EAClBC,OAAe;IAEf,IAAI;QACF,MAAMC,SAASN,cAAcF,QAAQO,SAAS;QAE9C,IAAIE;QACJ,IAAI;YACFA,iBAAiBL,cAAc,GAAGE,WAAW,aAAa,CAAC,EAAEE;QAC/D,EAAE,OAAOE,KAAc;YACrB,IAAIC,4BAA4BD,MAAM;gBACpC,6DAA6D;gBAC7D,MAAME,UAAUR,cAAcE,YAAYE;gBAC1C,MAAMK,WAAWZ,cAAcW;gBAC/B,MAAME,iBAAiBf,UAAUO;gBACjC,MAAMS,MAAMF,SAASG,WAAW,CAACF;gBACjC,MAAMG,aAAaJ,SAASK,KAAK,CAAC,GAAGH,MAAMD,eAAeK,MAAM;gBAChEV,iBAAiBP,cAAcJ,KAAKmB,YAAY;YAClD,OAAO;gBACL,MAAMP;YACR;QACF;QAEA,OAAO,AAAC,CAAA,MAAMP,gBAAgBM,eAAc,EAAGW,OAAO;IACxD,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,SAAST,4BAA4BD,GAAY;IAC/C,OAAOA,eAAeW,SAAS,UAAUX,OAAOA,IAAIY,IAAI,KAAK;AAC/D"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/getProjectDefaults.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport getGitConfig from '@rexxars/gitconfiglocal'\nimport {getCliToken, subdebug} from '@sanity/cli-core'\nimport {getGitUserInfo} from 'git-user-info'\nimport promiseProps from 'promise-props-recursive'\n\nimport {getCliUser} from '../services/user.js'\n\nconst debug = subdebug('getProjectDefaults')\n\nexport interface ProjectDefaults {\n author: string | undefined\n description: string\n gitRemote: string\n license: string\n projectName: string\n}\n\nexport function getProjectDefaults({\n isPlugin,\n workDir,\n}: {\n isPlugin: boolean\n workDir: string\n}): Promise<ProjectDefaults> {\n const cwd = process.cwd()\n const isSanityRoot = workDir === cwd\n\n return promiseProps({\n license: 'UNLICENSED',\n\n author: getUserInfo(),\n\n // Don't try to use git remote from main Sanity project for plugins\n gitRemote: isPlugin && isSanityRoot ? '' : resolveGitRemote(cwd),\n\n // Don't try to guess plugin name if we're initing from Sanity root\n projectName: isPlugin && isSanityRoot ? '' : path.basename(cwd),\n\n // If we're initing a plugin, don't use description from Sanity readme\n description: getProjectDescription({isPlugin, isSanityRoot, outputDir: cwd}),\n })\n}\n\nasync function resolveGitRemote(cwd: string): Promise<string | undefined> {\n try {\n await fs.stat(path.join(cwd, '.git'))\n const cfg = await getGitConfig(cwd)\n return cfg.remote && cfg.remote.origin && cfg.remote.origin.url\n } catch {\n return undefined\n }\n}\n\nasync function getUserInfo(): Promise<string | undefined> {\n const user = await getGitUserInfo()\n if (!user) {\n return getSanityUserInfo()\n }\n\n if (user.name && user.email) {\n return `${user.name} <${user.email}>`\n }\n\n return undefined\n}\n\nasync function getSanityUserInfo(): Promise<string | undefined> {\n const hasToken = Boolean(getCliToken())\n if (!hasToken) {\n return undefined\n }\n\n try {\n const user = await getCliUser()\n return user ? `${user.name} <${user.email}>` : undefined\n } catch {\n return undefined\n }\n}\n\nasync function getProjectDescription({\n isPlugin,\n isSanityRoot,\n outputDir,\n}: {\n isPlugin: boolean\n isSanityRoot: boolean\n outputDir: string\n}): Promise<string> {\n const tryResolve = isSanityRoot && !isPlugin\n if (!tryResolve) {\n return ''\n }\n\n // Try to grab a project description from a standard GitHub-generated readme\n try {\n const readmePath = path.join(outputDir, 'README.md')\n const readme = await fs.readFile(readmePath, {encoding: 'utf8'})\n const match = readme.match(/^# .*?\\n+(\\w.*?)(?:$|\\n)/)\n return ((match && match[1]) || '').replace(/\\.$/, '') || ''\n } catch (err) {\n debug(`Error getting project description: ${err}`)\n return ''\n }\n}\n"],"names":["fs","path","getGitConfig","getCliToken","subdebug","getGitUserInfo","promiseProps","getCliUser","debug","getProjectDefaults","isPlugin","workDir","cwd","process","isSanityRoot","license","author","getUserInfo","gitRemote","resolveGitRemote","projectName","basename","description","getProjectDescription","outputDir","stat","join","cfg","remote","origin","url","undefined","user","getSanityUserInfo","name","email","hasToken","Boolean","tryResolve","readmePath","readme","readFile","encoding","match","replace","err"],"mappings":"AAAA,OAAOA,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,OAAOC,kBAAkB,0BAAyB;AAClD,SAAQC,WAAW,EAAEC,QAAQ,QAAO,mBAAkB;AACtD,SAAQC,cAAc,QAAO,gBAAe;AAC5C,OAAOC,kBAAkB,0BAAyB;AAElD,SAAQC,UAAU,QAAO,sBAAqB;AAE9C,MAAMC,QAAQJ,SAAS;AAUvB,OAAO,SAASK,mBAAmB,EACjCC,QAAQ,EACRC,OAAO,EAIR;IACC,MAAMC,MAAMC,QAAQD,GAAG;IACvB,MAAME,eAAeH,YAAYC;IAEjC,OAAON,aAAa;QAClBS,SAAS;QAETC,QAAQC;QAER,mEAAmE;QACnEC,WAAWR,YAAYI,eAAe,KAAKK,iBAAiBP;QAE5D,mEAAmE;QACnEQ,aAAaV,YAAYI,eAAe,KAAKb,KAAKoB,QAAQ,CAACT;QAE3D,sEAAsE;QACtEU,aAAaC,sBAAsB;YAACb;YAAUI;YAAcU,WAAWZ;QAAG;IAC5E;AACF;AAEA,eAAeO,iBAAiBP,GAAW;IACzC,IAAI;QACF,MAAMZ,GAAGyB,IAAI,CAACxB,KAAKyB,IAAI,CAACd,KAAK;QAC7B,MAAMe,MAAM,MAAMzB,aAAaU;QAC/B,OAAOe,IAAIC,MAAM,IAAID,IAAIC,MAAM,CAACC,MAAM,IAAIF,IAAIC,MAAM,CAACC,MAAM,CAACC,GAAG;IACjE,EAAE,OAAM;QACN,OAAOC;IACT;AACF;AAEA,eAAed;IACb,MAAMe,OAAO,MAAM3B;IACnB,IAAI,CAAC2B,MAAM;QACT,OAAOC;IACT;IAEA,IAAID,KAAKE,IAAI,IAAIF,KAAKG,KAAK,EAAE;QAC3B,OAAO,GAAGH,KAAKE,IAAI,CAAC,EAAE,EAAEF,KAAKG,KAAK,CAAC,CAAC,CAAC;IACvC;IAEA,OAAOJ;AACT;AAEA,eAAeE;IACb,MAAMG,WAAWC,QAAQlC;IACzB,IAAI,CAACiC,UAAU;QACb,OAAOL;IACT;IAEA,IAAI;QACF,MAAMC,OAAO,MAAMzB;QACnB,OAAOyB,OAAO,GAAGA,KAAKE,IAAI,CAAC,EAAE,EAAEF,KAAKG,KAAK,CAAC,CAAC,CAAC,GAAGJ;IACjD,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AAEA,eAAeR,sBAAsB,EACnCb,QAAQ,EACRI,YAAY,EACZU,SAAS,EAKV;IACC,MAAMc,aAAaxB,gBAAgB,CAACJ;IACpC,IAAI,CAAC4B,YAAY;QACf,OAAO;IACT;IAEA,4EAA4E;IAC5E,IAAI;QACF,MAAMC,aAAatC,KAAKyB,IAAI,CAACF,WAAW;QACxC,MAAMgB,SAAS,MAAMxC,GAAGyC,QAAQ,CAACF,YAAY;YAACG,UAAU;QAAM;QAC9D,MAAMC,QAAQH,OAAOG,KAAK,CAAC;QAC3B,OAAO,AAAC,CAAA,AAACA,SAASA,KAAK,CAAC,EAAE,IAAK,EAAC,EAAGC,OAAO,CAAC,OAAO,OAAO;IAC3D,EAAE,OAAOC,KAAK;QACZrC,MAAM,CAAC,mCAAmC,EAAEqC,KAAK;QACjD,OAAO;IACT;AACF"}
1
+ {"version":3,"sources":["../../src/util/getProjectDefaults.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport getGitConfig from '@rexxars/gitconfiglocal'\nimport {getCliToken, subdebug} from '@sanity/cli-core'\nimport {getGitUserInfo} from 'git-user-info'\nimport promiseProps from 'promise-props-recursive'\n\nimport {getCliUser} from '../services/user.js'\n\nconst debug = subdebug('getProjectDefaults')\n\ninterface ProjectDefaults {\n author: string | undefined\n description: string\n gitRemote: string\n license: string\n projectName: string\n}\n\nexport function getProjectDefaults({\n isPlugin,\n workDir,\n}: {\n isPlugin: boolean\n workDir: string\n}): Promise<ProjectDefaults> {\n const cwd = process.cwd()\n const isSanityRoot = workDir === cwd\n\n return promiseProps({\n license: 'UNLICENSED',\n\n author: getUserInfo(),\n\n // Don't try to use git remote from main Sanity project for plugins\n gitRemote: isPlugin && isSanityRoot ? '' : resolveGitRemote(cwd),\n\n // Don't try to guess plugin name if we're initing from Sanity root\n projectName: isPlugin && isSanityRoot ? '' : path.basename(cwd),\n\n // If we're initing a plugin, don't use description from Sanity readme\n description: getProjectDescription({isPlugin, isSanityRoot, outputDir: cwd}),\n })\n}\n\nasync function resolveGitRemote(cwd: string): Promise<string | undefined> {\n try {\n await fs.stat(path.join(cwd, '.git'))\n const cfg = await getGitConfig(cwd)\n return cfg.remote && cfg.remote.origin && cfg.remote.origin.url\n } catch {\n return undefined\n }\n}\n\nasync function getUserInfo(): Promise<string | undefined> {\n const user = await getGitUserInfo()\n if (!user) {\n return getSanityUserInfo()\n }\n\n if (user.name && user.email) {\n return `${user.name} <${user.email}>`\n }\n\n return undefined\n}\n\nasync function getSanityUserInfo(): Promise<string | undefined> {\n const hasToken = Boolean(getCliToken())\n if (!hasToken) {\n return undefined\n }\n\n try {\n const user = await getCliUser()\n return user ? `${user.name} <${user.email}>` : undefined\n } catch {\n return undefined\n }\n}\n\nasync function getProjectDescription({\n isPlugin,\n isSanityRoot,\n outputDir,\n}: {\n isPlugin: boolean\n isSanityRoot: boolean\n outputDir: string\n}): Promise<string> {\n const tryResolve = isSanityRoot && !isPlugin\n if (!tryResolve) {\n return ''\n }\n\n // Try to grab a project description from a standard GitHub-generated readme\n try {\n const readmePath = path.join(outputDir, 'README.md')\n const readme = await fs.readFile(readmePath, {encoding: 'utf8'})\n const match = readme.match(/^# .*?\\n+(\\w.*?)(?:$|\\n)/)\n return ((match && match[1]) || '').replace(/\\.$/, '') || ''\n } catch (err) {\n debug(`Error getting project description: ${err}`)\n return ''\n }\n}\n"],"names":["fs","path","getGitConfig","getCliToken","subdebug","getGitUserInfo","promiseProps","getCliUser","debug","getProjectDefaults","isPlugin","workDir","cwd","process","isSanityRoot","license","author","getUserInfo","gitRemote","resolveGitRemote","projectName","basename","description","getProjectDescription","outputDir","stat","join","cfg","remote","origin","url","undefined","user","getSanityUserInfo","name","email","hasToken","Boolean","tryResolve","readmePath","readme","readFile","encoding","match","replace","err"],"mappings":"AAAA,OAAOA,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,OAAOC,kBAAkB,0BAAyB;AAClD,SAAQC,WAAW,EAAEC,QAAQ,QAAO,mBAAkB;AACtD,SAAQC,cAAc,QAAO,gBAAe;AAC5C,OAAOC,kBAAkB,0BAAyB;AAElD,SAAQC,UAAU,QAAO,sBAAqB;AAE9C,MAAMC,QAAQJ,SAAS;AAUvB,OAAO,SAASK,mBAAmB,EACjCC,QAAQ,EACRC,OAAO,EAIR;IACC,MAAMC,MAAMC,QAAQD,GAAG;IACvB,MAAME,eAAeH,YAAYC;IAEjC,OAAON,aAAa;QAClBS,SAAS;QAETC,QAAQC;QAER,mEAAmE;QACnEC,WAAWR,YAAYI,eAAe,KAAKK,iBAAiBP;QAE5D,mEAAmE;QACnEQ,aAAaV,YAAYI,eAAe,KAAKb,KAAKoB,QAAQ,CAACT;QAE3D,sEAAsE;QACtEU,aAAaC,sBAAsB;YAACb;YAAUI;YAAcU,WAAWZ;QAAG;IAC5E;AACF;AAEA,eAAeO,iBAAiBP,GAAW;IACzC,IAAI;QACF,MAAMZ,GAAGyB,IAAI,CAACxB,KAAKyB,IAAI,CAACd,KAAK;QAC7B,MAAMe,MAAM,MAAMzB,aAAaU;QAC/B,OAAOe,IAAIC,MAAM,IAAID,IAAIC,MAAM,CAACC,MAAM,IAAIF,IAAIC,MAAM,CAACC,MAAM,CAACC,GAAG;IACjE,EAAE,OAAM;QACN,OAAOC;IACT;AACF;AAEA,eAAed;IACb,MAAMe,OAAO,MAAM3B;IACnB,IAAI,CAAC2B,MAAM;QACT,OAAOC;IACT;IAEA,IAAID,KAAKE,IAAI,IAAIF,KAAKG,KAAK,EAAE;QAC3B,OAAO,GAAGH,KAAKE,IAAI,CAAC,EAAE,EAAEF,KAAKG,KAAK,CAAC,CAAC,CAAC;IACvC;IAEA,OAAOJ;AACT;AAEA,eAAeE;IACb,MAAMG,WAAWC,QAAQlC;IACzB,IAAI,CAACiC,UAAU;QACb,OAAOL;IACT;IAEA,IAAI;QACF,MAAMC,OAAO,MAAMzB;QACnB,OAAOyB,OAAO,GAAGA,KAAKE,IAAI,CAAC,EAAE,EAAEF,KAAKG,KAAK,CAAC,CAAC,CAAC,GAAGJ;IACjD,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AAEA,eAAeR,sBAAsB,EACnCb,QAAQ,EACRI,YAAY,EACZU,SAAS,EAKV;IACC,MAAMc,aAAaxB,gBAAgB,CAACJ;IACpC,IAAI,CAAC4B,YAAY;QACf,OAAO;IACT;IAEA,4EAA4E;IAC5E,IAAI;QACF,MAAMC,aAAatC,KAAKyB,IAAI,CAACF,WAAW;QACxC,MAAMgB,SAAS,MAAMxC,GAAGyC,QAAQ,CAACF,YAAY;YAACG,UAAU;QAAM;QAC9D,MAAMC,QAAQH,OAAOG,KAAK,CAAC;QAC3B,OAAO,AAAC,CAAA,AAACA,SAASA,KAAK,CAAC,EAAE,IAAK,EAAC,EAAGC,OAAO,CAAC,OAAO,OAAO;IAC3D,EAAE,OAAOC,KAAK;QACZrC,MAAM,CAAC,mCAAmC,EAAEqC,KAAK;QACjD,OAAO;IACT;AACF"}
@@ -24,6 +24,7 @@ import { toInt } from './toInt.js';
24
24
  httpHost,
25
25
  httpPort,
26
26
  isApp,
27
+ schemaExtraction: cliConfig?.schemaExtraction,
27
28
  vite: cliConfig?.vite
28
29
  };
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/getSharedServerConfig.ts"],"sourcesContent":["import {type CliConfig, getSanityEnvVar} from '@sanity/cli-core'\n\nimport {ensureTrailingSlash} from './ensureTrailingSlash.js'\nimport {toInt} from './toInt.js'\n\ninterface GetSharedServerConfigOptions {\n flags: {host?: string; port?: number | string}\n workDir: string\n\n cliConfig?: CliConfig\n}\n\nexport interface GetSharedServerConfigResult {\n basePath: string\n cwd: string\n httpHost: string\n httpPort: number\n vite: CliConfig['vite']\n\n entry?: string\n isApp?: boolean\n}\n\n/**\n * @internal\n *\n * Resolves the shared configuration for the dev/preview server using:\n *\n * - CLI flags\n * - Environment variables\n * - User build config\n * - Default configuration\n */\nexport function getSharedServerConfig({\n cliConfig,\n flags,\n workDir,\n}: GetSharedServerConfigOptions): GetSharedServerConfigResult {\n // Order of preference: CLI flags, environment variables, user build config, default config\n const isApp = cliConfig && 'app' in cliConfig\n\n const httpHost =\n flags.host ||\n getSanityEnvVar('SERVER_HOSTNAME', isApp ?? false) ||\n cliConfig?.server?.hostname ||\n 'localhost'\n\n const httpPort = toInt(\n flags.port || getSanityEnvVar('SERVER_PORT', isApp ?? false) || cliConfig?.server?.port,\n 3333,\n )\n\n const basePath = ensureTrailingSlash(\n getSanityEnvVar('BASEPATH', isApp ?? false) ?? (cliConfig?.project?.basePath || '/'),\n )\n\n const entry = cliConfig?.app?.entry\n\n return {\n basePath,\n cwd: workDir,\n entry,\n httpHost,\n httpPort,\n isApp,\n vite: cliConfig?.vite,\n }\n}\n"],"names":["getSanityEnvVar","ensureTrailingSlash","toInt","getSharedServerConfig","cliConfig","flags","workDir","isApp","httpHost","host","server","hostname","httpPort","port","basePath","project","entry","app","cwd","vite"],"mappings":"AAAA,SAAwBA,eAAe,QAAO,mBAAkB;AAEhE,SAAQC,mBAAmB,QAAO,2BAA0B;AAC5D,SAAQC,KAAK,QAAO,aAAY;AAoBhC;;;;;;;;;CASC,GACD,OAAO,SAASC,sBAAsB,EACpCC,SAAS,EACTC,KAAK,EACLC,OAAO,EACsB;IAC7B,2FAA2F;IAC3F,MAAMC,QAAQH,aAAa,SAASA;IAEpC,MAAMI,WACJH,MAAMI,IAAI,IACVT,gBAAgB,mBAAmBO,SAAS,UAC5CH,WAAWM,QAAQC,YACnB;IAEF,MAAMC,WAAWV,MACfG,MAAMQ,IAAI,IAAIb,gBAAgB,eAAeO,SAAS,UAAUH,WAAWM,QAAQG,MACnF;IAGF,MAAMC,WAAWb,oBACfD,gBAAgB,YAAYO,SAAS,UAAWH,CAAAA,WAAWW,SAASD,YAAY,GAAE;IAGpF,MAAME,QAAQZ,WAAWa,KAAKD;IAE9B,OAAO;QACLF;QACAI,KAAKZ;QACLU;QACAR;QACAI;QACAL;QACAY,MAAMf,WAAWe;IACnB;AACF"}
1
+ {"version":3,"sources":["../../src/util/getSharedServerConfig.ts"],"sourcesContent":["import {type CliConfig, getSanityEnvVar} from '@sanity/cli-core'\n\nimport {ensureTrailingSlash} from './ensureTrailingSlash.js'\nimport {toInt} from './toInt.js'\n\ninterface GetSharedServerConfigOptions {\n flags: {host?: string; port?: number | string}\n workDir: string\n\n cliConfig?: CliConfig\n}\n\nexport interface GetSharedServerConfigResult {\n basePath: string\n cwd: string\n httpHost: string\n httpPort: number\n schemaExtraction: CliConfig['schemaExtraction']\n vite: CliConfig['vite']\n\n entry?: string\n isApp?: boolean\n}\n\n/**\n * @internal\n *\n * Resolves the shared configuration for the dev/preview server using:\n *\n * - CLI flags\n * - Environment variables\n * - User build config\n * - Default configuration\n */\nexport function getSharedServerConfig({\n cliConfig,\n flags,\n workDir,\n}: GetSharedServerConfigOptions): GetSharedServerConfigResult {\n // Order of preference: CLI flags, environment variables, user build config, default config\n const isApp = cliConfig && 'app' in cliConfig\n\n const httpHost =\n flags.host ||\n getSanityEnvVar('SERVER_HOSTNAME', isApp ?? false) ||\n cliConfig?.server?.hostname ||\n 'localhost'\n\n const httpPort = toInt(\n flags.port || getSanityEnvVar('SERVER_PORT', isApp ?? false) || cliConfig?.server?.port,\n 3333,\n )\n\n const basePath = ensureTrailingSlash(\n getSanityEnvVar('BASEPATH', isApp ?? false) ?? (cliConfig?.project?.basePath || '/'),\n )\n\n const entry = cliConfig?.app?.entry\n\n return {\n basePath,\n cwd: workDir,\n entry,\n httpHost,\n httpPort,\n isApp,\n schemaExtraction: cliConfig?.schemaExtraction,\n vite: cliConfig?.vite,\n }\n}\n"],"names":["getSanityEnvVar","ensureTrailingSlash","toInt","getSharedServerConfig","cliConfig","flags","workDir","isApp","httpHost","host","server","hostname","httpPort","port","basePath","project","entry","app","cwd","schemaExtraction","vite"],"mappings":"AAAA,SAAwBA,eAAe,QAAO,mBAAkB;AAEhE,SAAQC,mBAAmB,QAAO,2BAA0B;AAC5D,SAAQC,KAAK,QAAO,aAAY;AAqBhC;;;;;;;;;CASC,GACD,OAAO,SAASC,sBAAsB,EACpCC,SAAS,EACTC,KAAK,EACLC,OAAO,EACsB;IAC7B,2FAA2F;IAC3F,MAAMC,QAAQH,aAAa,SAASA;IAEpC,MAAMI,WACJH,MAAMI,IAAI,IACVT,gBAAgB,mBAAmBO,SAAS,UAC5CH,WAAWM,QAAQC,YACnB;IAEF,MAAMC,WAAWV,MACfG,MAAMQ,IAAI,IAAIb,gBAAgB,eAAeO,SAAS,UAAUH,WAAWM,QAAQG,MACnF;IAGF,MAAMC,WAAWb,oBACfD,gBAAgB,YAAYO,SAAS,UAAWH,CAAAA,WAAWW,SAASD,YAAY,GAAE;IAGpF,MAAME,QAAQZ,WAAWa,KAAKD;IAE9B,OAAO;QACLF;QACAI,KAAKZ;QACLU;QACAR;QACAI;QACAL;QACAY,kBAAkBf,WAAWe;QAC7BC,MAAMhB,WAAWgB;IACnB;AACF"}
@@ -6,7 +6,7 @@ export function getWorkspace(workspaces, workspaceName) {
6
6
  return workspaces[0];
7
7
  }
8
8
  if (!workspaceName) {
9
- throw new Error(`Multiple workspaces found. Please specify which workspace to use with "--workspace". Available workspaces: ${workspaces.map((w)=>w.name).join(', ')}`);
9
+ throw new Error(`Multiple workspaces found. Please specify which workspace to use with '--workspace' or with the schemaExtraction.workspace config prop. Available workspaces: ${workspaces.map((w)=>w.name).join(', ')}`);
10
10
  }
11
11
  const workspace = workspaces.find((w)=>w.name === workspaceName);
12
12
  if (!workspace) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/getWorkspace.ts"],"sourcesContent":["export function getWorkspace<T extends {name: string}>(workspaces: T[], workspaceName?: string) {\n if (workspaces.length === 0) {\n throw new Error('No workspaces found')\n }\n\n if (workspaces.length === 1) {\n return workspaces[0]\n }\n\n if (!workspaceName) {\n throw new Error(\n `Multiple workspaces found. Please specify which workspace to use with \"--workspace\". Available workspaces: ${workspaces.map((w) => w.name).join(', ')}`,\n )\n }\n\n const workspace = workspaces.find((w) => w.name === workspaceName)\n\n if (!workspace) {\n throw new Error(\n `Could not find \"${workspaceName}\" workspace. Available workspaces: ${workspaces.map((w) => w.name).join(', ')}`,\n )\n }\n\n return workspace\n}\n"],"names":["getWorkspace","workspaces","workspaceName","length","Error","map","w","name","join","workspace","find"],"mappings":"AAAA,OAAO,SAASA,aAAuCC,UAAe,EAAEC,aAAsB;IAC5F,IAAID,WAAWE,MAAM,KAAK,GAAG;QAC3B,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAIH,WAAWE,MAAM,KAAK,GAAG;QAC3B,OAAOF,UAAU,CAAC,EAAE;IACtB;IAEA,IAAI,CAACC,eAAe;QAClB,MAAM,IAAIE,MACR,CAAC,2GAA2G,EAAEH,WAAWI,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEC,IAAI,CAAC,OAAO;IAE5J;IAEA,MAAMC,YAAYR,WAAWS,IAAI,CAAC,CAACJ,IAAMA,EAAEC,IAAI,KAAKL;IAEpD,IAAI,CAACO,WAAW;QACd,MAAM,IAAIL,MACR,CAAC,gBAAgB,EAAEF,cAAc,mCAAmC,EAAED,WAAWI,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEC,IAAI,CAAC,OAAO;IAEpH;IAEA,OAAOC;AACT"}
1
+ {"version":3,"sources":["../../src/util/getWorkspace.ts"],"sourcesContent":["export function getWorkspace<T extends {name: string}>(workspaces: T[], workspaceName?: string) {\n if (workspaces.length === 0) {\n throw new Error('No workspaces found')\n }\n\n if (workspaces.length === 1) {\n return workspaces[0]\n }\n\n if (!workspaceName) {\n throw new Error(\n `Multiple workspaces found. Please specify which workspace to use with '--workspace' or with the schemaExtraction.workspace config prop. Available workspaces: ${workspaces.map((w) => w.name).join(', ')}`,\n )\n }\n\n const workspace = workspaces.find((w) => w.name === workspaceName)\n\n if (!workspace) {\n throw new Error(\n `Could not find \"${workspaceName}\" workspace. Available workspaces: ${workspaces.map((w) => w.name).join(', ')}`,\n )\n }\n\n return workspace\n}\n"],"names":["getWorkspace","workspaces","workspaceName","length","Error","map","w","name","join","workspace","find"],"mappings":"AAAA,OAAO,SAASA,aAAuCC,UAAe,EAAEC,aAAsB;IAC5F,IAAID,WAAWE,MAAM,KAAK,GAAG;QAC3B,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAIH,WAAWE,MAAM,KAAK,GAAG;QAC3B,OAAOF,UAAU,CAAC,EAAE;IACtB;IAEA,IAAI,CAACC,eAAe;QAClB,MAAM,IAAIE,MACR,CAAC,8JAA8J,EAAEH,WAAWI,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEC,IAAI,CAAC,OAAO;IAE/M;IAEA,MAAMC,YAAYR,WAAWS,IAAI,CAAC,CAACJ,IAAMA,EAAEC,IAAI,KAAKL;IAEpD,IAAI,CAACO,WAAW;QACd,MAAM,IAAIL,MACR,CAAC,gBAAgB,EAAEF,cAAc,mCAAmC,EAAED,WAAWI,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEC,IAAI,CAAC,OAAO;IAEpH;IAEA,OAAOC;AACT"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Detects errors thrown by Sanity's `resolveConfig()` / `getStudioWorkspaces()` where
3
+ * schema validation problems are embedded on the thrown error object as `schema._validation`.
4
+ *
5
+ * The return type asserts both the full `Schema` (needed by validateSchema.worker.ts) and
6
+ * that `_validation` is a `SchemaValidationProblemGroup[]` array (validated by the guard).
7
+ */ export function isSchemaError(err) {
8
+ return err !== null && typeof err === 'object' && 'schema' in err && err.schema !== null && typeof err.schema === 'object' && '_validation' in err.schema && Array.isArray(err.schema._validation);
9
+ }
10
+
11
+ //# sourceMappingURL=isSchemaError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/util/isSchemaError.ts"],"sourcesContent":["import {type Schema, type SchemaValidationProblemGroup} from '@sanity/types'\n\n/**\n * Detects errors thrown by Sanity's `resolveConfig()` / `getStudioWorkspaces()` where\n * schema validation problems are embedded on the thrown error object as `schema._validation`.\n *\n * The return type asserts both the full `Schema` (needed by validateSchema.worker.ts) and\n * that `_validation` is a `SchemaValidationProblemGroup[]` array (validated by the guard).\n */\nexport function isSchemaError(\n err: unknown,\n): err is {schema: Schema & {_validation: SchemaValidationProblemGroup[]}} {\n return (\n err !== null &&\n typeof err === 'object' &&\n 'schema' in err &&\n err.schema !== null &&\n typeof err.schema === 'object' &&\n '_validation' in err.schema &&\n Array.isArray(err.schema._validation)\n )\n}\n"],"names":["isSchemaError","err","schema","Array","isArray","_validation"],"mappings":"AAEA;;;;;;CAMC,GACD,OAAO,SAASA,cACdC,GAAY;IAEZ,OACEA,QAAQ,QACR,OAAOA,QAAQ,YACf,YAAYA,OACZA,IAAIC,MAAM,KAAK,QACf,OAAOD,IAAIC,MAAM,KAAK,YACtB,iBAAiBD,IAAIC,MAAM,IAC3BC,MAAMC,OAAO,CAACH,IAAIC,MAAM,CAACG,WAAW;AAExC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Checks if a buffer contains a TAR archive by looking for the `ustar` magic
3
+ * bytes at offset 257–261.
4
+ *
5
+ * @internal
6
+ */ export const isTar = (buf)=>buf.length >= 262 && buf[257] === 0x75 && buf[258] === 0x73 && buf[259] === 0x74 && buf[260] === 0x61 && buf[261] === 0x72;
7
+
8
+ //# sourceMappingURL=isTar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/util/isTar.ts"],"sourcesContent":["/**\n * Checks if a buffer contains a TAR archive by looking for the `ustar` magic\n * bytes at offset 257–261.\n *\n * @internal\n */\nexport const isTar = (buf: Buffer): boolean =>\n buf.length >= 262 &&\n buf[257] === 0x75 &&\n buf[258] === 0x73 &&\n buf[259] === 0x74 &&\n buf[260] === 0x61 &&\n buf[261] === 0x72\n"],"names":["isTar","buf","length"],"mappings":"AAAA;;;;;CAKC,GACD,OAAO,MAAMA,QAAQ,CAACC,MACpBA,IAAIC,MAAM,IAAI,OACdD,GAAG,CAAC,IAAI,KAAK,QACbA,GAAG,CAAC,IAAI,KAAK,QACbA,GAAG,CAAC,IAAI,KAAK,QACbA,GAAG,CAAC,IAAI,KAAK,QACbA,GAAG,CAAC,IAAI,KAAK,KAAI"}
@@ -0,0 +1,44 @@
1
+ import { execa } from 'execa';
2
+ import { getPartialEnvWithNpmPath } from './packageManagerChoice.js';
3
+ /**
4
+ * Resolves the peer dependencies of a package by querying the npm registry.
5
+ *
6
+ * @param packageName - Package name with version (e.g. "next-sanity\@11")
7
+ * @param cwd - Working directory (used to resolve local npm paths)
8
+ * @returns Array of peer dependency strings (e.g. ["next\@^15.0.0", "react\@^19.0.0"])
9
+ */ export async function getPeerDependencies(packageName, cwd) {
10
+ let stdout;
11
+ try {
12
+ const result = await execa('npm', [
13
+ 'view',
14
+ packageName,
15
+ 'peerDependencies',
16
+ '--json'
17
+ ], {
18
+ cwd,
19
+ encoding: 'utf8',
20
+ env: getPartialEnvWithNpmPath(cwd)
21
+ });
22
+ stdout = result.stdout;
23
+ } catch (error) {
24
+ throw new Error(`Failed to resolve peer dependencies for ${packageName}`, {
25
+ cause: error
26
+ });
27
+ }
28
+ if (!stdout.trim()) {
29
+ return [];
30
+ }
31
+ try {
32
+ const peerDeps = JSON.parse(stdout);
33
+ if (!peerDeps || typeof peerDeps !== 'object') {
34
+ return [];
35
+ }
36
+ return Object.entries(peerDeps).map(([name, range])=>`${name}@${range}`);
37
+ } catch (error) {
38
+ throw new Error(`Failed to resolve peer dependencies for ${packageName}`, {
39
+ cause: error
40
+ });
41
+ }
42
+ }
43
+
44
+ //# sourceMappingURL=getPeerDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/util/packageManager/getPeerDependencies.ts"],"sourcesContent":["import {execa} from 'execa'\n\nimport {getPartialEnvWithNpmPath} from './packageManagerChoice.js'\n\n/**\n * Resolves the peer dependencies of a package by querying the npm registry.\n *\n * @param packageName - Package name with version (e.g. \"next-sanity\\@11\")\n * @param cwd - Working directory (used to resolve local npm paths)\n * @returns Array of peer dependency strings (e.g. [\"next\\@^15.0.0\", \"react\\@^19.0.0\"])\n */\nexport async function getPeerDependencies(packageName: string, cwd: string): Promise<string[]> {\n let stdout: string\n try {\n const result = await execa('npm', ['view', packageName, 'peerDependencies', '--json'], {\n cwd,\n encoding: 'utf8',\n env: getPartialEnvWithNpmPath(cwd),\n })\n stdout = result.stdout\n } catch (error) {\n throw new Error(`Failed to resolve peer dependencies for ${packageName}`, {cause: error})\n }\n\n if (!stdout.trim()) {\n return []\n }\n\n try {\n const peerDeps: Record<string, string> | null = JSON.parse(stdout)\n if (!peerDeps || typeof peerDeps !== 'object') {\n return []\n }\n return Object.entries(peerDeps).map(([name, range]) => `${name}@${range}`)\n } catch (error) {\n throw new Error(`Failed to resolve peer dependencies for ${packageName}`, {cause: error})\n }\n}\n"],"names":["execa","getPartialEnvWithNpmPath","getPeerDependencies","packageName","cwd","stdout","result","encoding","env","error","Error","cause","trim","peerDeps","JSON","parse","Object","entries","map","name","range"],"mappings":"AAAA,SAAQA,KAAK,QAAO,QAAO;AAE3B,SAAQC,wBAAwB,QAAO,4BAA2B;AAElE;;;;;;CAMC,GACD,OAAO,eAAeC,oBAAoBC,WAAmB,EAAEC,GAAW;IACxE,IAAIC;IACJ,IAAI;QACF,MAAMC,SAAS,MAAMN,MAAM,OAAO;YAAC;YAAQG;YAAa;YAAoB;SAAS,EAAE;YACrFC;YACAG,UAAU;YACVC,KAAKP,yBAAyBG;QAChC;QACAC,SAASC,OAAOD,MAAM;IACxB,EAAE,OAAOI,OAAO;QACd,MAAM,IAAIC,MAAM,CAAC,wCAAwC,EAAEP,aAAa,EAAE;YAACQ,OAAOF;QAAK;IACzF;IAEA,IAAI,CAACJ,OAAOO,IAAI,IAAI;QAClB,OAAO,EAAE;IACX;IAEA,IAAI;QACF,MAAMC,WAA0CC,KAAKC,KAAK,CAACV;QAC3D,IAAI,CAACQ,YAAY,OAAOA,aAAa,UAAU;YAC7C,OAAO,EAAE;QACX;QACA,OAAOG,OAAOC,OAAO,CAACJ,UAAUK,GAAG,CAAC,CAAC,CAACC,MAAMC,MAAM,GAAK,GAAGD,KAAK,CAAC,EAAEC,OAAO;IAC3E,EAAE,OAAOX,OAAO;QACd,MAAM,IAAIC,MAAM,CAAC,wCAAwC,EAAEP,aAAa,EAAE;YAACQ,OAAOF;QAAK;IACzF;AACF"}
@@ -0,0 +1,225 @@
1
+ import semver from 'semver';
2
+ import { getGlobalUninstallCommand, getLocalRemoveCommand, getLocalUpdateCommand } from './commands.js';
3
+ /**
4
+ * Analyzes package information and workspace configuration to detect potential issues.
5
+ */ export function analyzeIssues(packages, workspace, globals) {
6
+ const issues = [];
7
+ // When multiple lockfiles exist, the "winning" lockfile is arbitrary (based on
8
+ // detection priority order), so fall back to workspace-level signals instead.
9
+ const pm = workspace.hasMultipleLockfiles || !workspace.lockfile ? inferPackageManager(workspace) : workspace.lockfile.type;
10
+ const updateOptions = {
11
+ yarnBerry: workspace.yarnBerry
12
+ };
13
+ // Check for multiple lockfiles
14
+ if (workspace.hasMultipleLockfiles) {
15
+ issues.push({
16
+ message: 'Multiple lockfiles found. This can cause inconsistent installations.',
17
+ packageName: null,
18
+ severity: 'warning',
19
+ suggestion: 'Remove all but one lockfile and use a single package manager.',
20
+ type: 'multiple-lockfiles'
21
+ });
22
+ }
23
+ // Check each package for issues
24
+ for (const [name, info] of Object.entries(packages)){
25
+ if (!info) continue;
26
+ // override-in-effect
27
+ if (info.override) {
28
+ issues.push({
29
+ message: `${name} has an override (${info.override.mechanism}) set to ${info.override.versionRange}.`,
30
+ packageName: name,
31
+ severity: 'info',
32
+ suggestion: null,
33
+ type: 'override-in-effect'
34
+ });
35
+ }
36
+ // declared-not-installed — skip when an override is in effect, since the
37
+ // override may explain the unusual state and the user already sees override-in-effect.
38
+ // Also skip @sanity/cli when sanity is installed — the CLI-specific section below
39
+ // produces more specific diagnostics (conflicting/redundant/cli-not-installed).
40
+ const cliSectionWillHandle = name === '@sanity/cli' && Boolean(packages.sanity?.installed?.cliDependencyRange);
41
+ if (info.declared && !info.installed && !info.override && !cliSectionWillHandle) {
42
+ issues.push({
43
+ message: `${name} is declared in package.json but not installed.`,
44
+ packageName: name,
45
+ severity: 'error',
46
+ suggestion: `Run: ${pm} install`,
47
+ type: 'declared-not-installed'
48
+ });
49
+ }
50
+ // global-local-mismatch — only warn on major version differences
51
+ // Check all global installations, not just the first match.
52
+ // Skip @sanity/cli here — global-cli-incompatible (below) handles it with
53
+ // better context by checking against sanity's actual required range.
54
+ if (info.installed && name !== '@sanity/cli') {
55
+ const localMajor = semver.parse(info.installed.version)?.major;
56
+ if (localMajor !== undefined) {
57
+ for (const globalMatch of globals.filter((g)=>g.packageName === name)){
58
+ const globalMajor = semver.parse(globalMatch.version)?.major;
59
+ if (globalMajor !== undefined && globalMajor !== localMajor) {
60
+ issues.push({
61
+ message: `${name} version mismatch: global ${globalMatch.version} (${globalMatch.packageManager}) vs local ${info.installed.version}.`,
62
+ packageName: name,
63
+ severity: globalMatch.isActive ? 'warning' : 'info',
64
+ suggestion: `Run: ${getGlobalUninstallCommand(globalMatch.packageManager, name)}`,
65
+ type: 'global-local-mismatch'
66
+ });
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ // Check @sanity/cli compatibility with sanity
73
+ const sanityInfo = packages.sanity;
74
+ const cliInfo = packages['@sanity/cli'];
75
+ if (sanityInfo?.installed?.cliDependencyRange) {
76
+ const expectedCliRange = sanityInfo.installed.cliDependencyRange;
77
+ // Normalize pinned versions (e.g. "5.33.0" → "^5.33.0") for satisfies checks.
78
+ // Already-ranged values like "^5.33.0" pass through unchanged.
79
+ // Note: sanity always uses caret ranges in practice. The pinned→caret conversion
80
+ // is a defensive fallback — if sanity ever pinned an exact version, caret semantics
81
+ // (any compatible minor/patch) are the expected behavior for CLI compatibility.
82
+ const compatRange = toCaretRange(expectedCliRange);
83
+ // Check if @sanity/cli is explicitly declared with an incompatible version.
84
+ // Skip when the declared range uses a non-semver protocol (workspace:*, file:,
85
+ // portal:, link:) — these are local package references, not version conflicts.
86
+ if (cliInfo?.declared && !isNonSemverProtocol(cliInfo.declared.versionRange)) {
87
+ const declaredRange = cliInfo.declared.versionRange;
88
+ // Only flag as redundant when every version in the declared range also
89
+ // satisfies the required range. semver.subset('^5.0.0', '^5.33.0') → false,
90
+ // so a too-wide range is correctly classified as conflicting.
91
+ if (safeSubset(declaredRange, expectedCliRange)) {
92
+ issues.push({
93
+ message: `@sanity/cli is listed as a dependency but is already provided by sanity. Remove it to avoid version conflicts.`,
94
+ packageName: '@sanity/cli',
95
+ severity: 'info',
96
+ suggestion: `Run: ${getLocalRemoveCommand(pm, '@sanity/cli')}`,
97
+ type: 'redundant-cli-dependency'
98
+ });
99
+ } else {
100
+ issues.push({
101
+ message: `@sanity/cli is declared as ${declaredRange} but sanity requires ${expectedCliRange}. Sanity provides @sanity/cli automatically — removing the explicit declaration lets sanity manage the correct version.`,
102
+ packageName: '@sanity/cli',
103
+ severity: 'error',
104
+ suggestion: `Run: ${getLocalRemoveCommand(pm, '@sanity/cli')}`,
105
+ type: 'conflicting-cli-dependency'
106
+ });
107
+ }
108
+ }
109
+ // Check if installed @sanity/cli satisfies sanity's requirement.
110
+ // Skip if we already flagged a conflicting declaration — that's the root cause.
111
+ // Skip if an override is in effect — the user already knows about it, and
112
+ // suggesting an update would be misleading since the override controls the version.
113
+ const hasConflictingDeclaration = issues.some((i)=>i.type === 'conflicting-cli-dependency');
114
+ if (cliInfo?.installed && !hasConflictingDeclaration && !cliInfo.override) {
115
+ const installedVersion = cliInfo.installed.version;
116
+ if (!safeSatisfies(installedVersion, compatRange)) {
117
+ issues.push({
118
+ message: `Installed @sanity/cli@${installedVersion} does not satisfy sanity's requirement of ${compatRange}.`,
119
+ packageName: '@sanity/cli',
120
+ severity: 'error',
121
+ suggestion: `Run: ${getLocalUpdateCommand(pm, '@sanity/cli', updateOptions)}`,
122
+ type: 'cli-version-incompatible'
123
+ });
124
+ }
125
+ }
126
+ // Check if @sanity/cli is missing entirely (not declared, not installed)
127
+ // This indicates a broken node_modules state since sanity depends on @sanity/cli.
128
+ if (!cliInfo?.installed && !cliInfo?.declared && !cliInfo?.override) {
129
+ issues.push({
130
+ message: `@sanity/cli is not installed. It is required by sanity@${sanityInfo.installed.version}.`,
131
+ packageName: '@sanity/cli',
132
+ severity: 'error',
133
+ suggestion: `Run: ${pm} install`,
134
+ type: 'cli-not-installed'
135
+ });
136
+ }
137
+ // Check global @sanity/cli compatibility with local sanity
138
+ for (const global of globals){
139
+ if (global.packageName !== '@sanity/cli') continue;
140
+ if (!safeSatisfies(global.version, compatRange)) {
141
+ issues.push({
142
+ message: `Global @sanity/cli@${global.version} (installed via ${global.packageManager}) is incompatible with local sanity@${sanityInfo.installed.version} (requires @sanity/cli ${compatRange}).`,
143
+ packageName: '@sanity/cli',
144
+ severity: global.isActive ? 'warning' : 'info',
145
+ suggestion: `Run: ${getGlobalUninstallCommand(global.packageManager, '@sanity/cli')}`,
146
+ type: 'global-cli-incompatible'
147
+ });
148
+ }
149
+ }
150
+ }
151
+ return issues;
152
+ }
153
+ /**
154
+ * Protocols and prefixes that are not semver ranges.
155
+ * Includes local package references (workspace:, file:, portal:, link:),
156
+ * catalog: which may appear as an unresolved range when pnpm catalog lookup fails,
157
+ * and git/URL-based dependency specifiers.
158
+ */ const NON_SEMVER_PROTOCOLS = [
159
+ 'workspace:',
160
+ 'file:',
161
+ 'portal:',
162
+ 'link:',
163
+ 'catalog:',
164
+ 'git+',
165
+ 'git:',
166
+ 'github:',
167
+ 'https:',
168
+ 'http:'
169
+ ];
170
+ function isNonSemverProtocol(range) {
171
+ return NON_SEMVER_PROTOCOLS.some((p)=>range.startsWith(p));
172
+ }
173
+ /**
174
+ * Infers the package manager from workspace info when no lockfile is present.
175
+ * Uses both the workspace type (which captures workspace config markers like
176
+ * pnpm-workspace.yaml) and the yarnBerry flag (which captures .yarnrc.yml
177
+ * even for standalone projects).
178
+ */ function inferPackageManager(workspace) {
179
+ if (workspace.type.startsWith('pnpm')) return 'pnpm';
180
+ if (workspace.type.startsWith('yarn')) return 'yarn';
181
+ if (workspace.type.startsWith('bun')) return 'bun';
182
+ if (workspace.yarnBerry) return 'yarn';
183
+ if (workspace.bunfig) return 'bun';
184
+ return 'npm';
185
+ }
186
+ /**
187
+ * Safe wrapper around semver.satisfies that returns false for non-semver
188
+ * versions or ranges (workspace:*, catalog:, file:, git URLs) instead of throwing.
189
+ * Uses includePrerelease so that pre-release versions (e.g. 5.0.0-rc.1) are
190
+ * correctly matched against caret ranges like ^5.0.0-rc.1.
191
+ */ function safeSatisfies(version, range) {
192
+ try {
193
+ return semver.satisfies(version, range, {
194
+ includePrerelease: true
195
+ });
196
+ } catch {
197
+ return false;
198
+ }
199
+ }
200
+ /**
201
+ * Safe wrapper around semver.subset that returns false for non-semver ranges
202
+ * like workspace:*, catalog:, file:, or git URLs instead of throwing.
203
+ */ function safeSubset(sub, sup) {
204
+ try {
205
+ return semver.subset(sub, sup) ?? false;
206
+ } catch {
207
+ return false;
208
+ }
209
+ }
210
+ /**
211
+ * Converts a pinned version like "5.33.0" to "^5.33.0".
212
+ * If it's already a range (^, ~, \>=, etc.), returns as-is.
213
+ */ function toCaretRange(range) {
214
+ // If it's already a range operator, return as-is
215
+ if (/^[\^~><!=]/.test(range) || range.includes(' ')) {
216
+ return range;
217
+ }
218
+ // If it's a plain version like "5.33.0", treat as ^5.33.0
219
+ if (semver.valid(range)) {
220
+ return `^${range}`;
221
+ }
222
+ return range;
223
+ }
224
+
225
+ //# sourceMappingURL=analyzeIssues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/util/packageManager/installationInfo/analyzeIssues.ts"],"sourcesContent":["import semver from 'semver'\n\nimport {\n getGlobalUninstallCommand,\n getLocalRemoveCommand,\n getLocalUpdateCommand,\n} from './commands.js'\nimport {\n type GlobalInstallation,\n type Issue,\n type LockfileType,\n type PackageInfo,\n type SanityPackage,\n type WorkspaceInfo,\n} from './types.js'\n\n/**\n * Analyzes package information and workspace configuration to detect potential issues.\n */\nexport function analyzeIssues(\n packages: Partial<Record<SanityPackage, PackageInfo>>,\n workspace: WorkspaceInfo,\n globals: GlobalInstallation[],\n): Issue[] {\n const issues: Issue[] = []\n // When multiple lockfiles exist, the \"winning\" lockfile is arbitrary (based on\n // detection priority order), so fall back to workspace-level signals instead.\n const pm: LockfileType =\n workspace.hasMultipleLockfiles || !workspace.lockfile\n ? inferPackageManager(workspace)\n : workspace.lockfile.type\n const updateOptions = {yarnBerry: workspace.yarnBerry}\n\n // Check for multiple lockfiles\n if (workspace.hasMultipleLockfiles) {\n issues.push({\n message: 'Multiple lockfiles found. This can cause inconsistent installations.',\n packageName: null,\n severity: 'warning',\n suggestion: 'Remove all but one lockfile and use a single package manager.',\n type: 'multiple-lockfiles',\n })\n }\n\n // Check each package for issues\n for (const [name, info] of Object.entries(packages) as [\n SanityPackage,\n PackageInfo | undefined,\n ][]) {\n if (!info) continue\n\n // override-in-effect\n if (info.override) {\n issues.push({\n message: `${name} has an override (${info.override.mechanism}) set to ${info.override.versionRange}.`,\n packageName: name,\n severity: 'info',\n suggestion: null,\n type: 'override-in-effect',\n })\n }\n\n // declared-not-installed — skip when an override is in effect, since the\n // override may explain the unusual state and the user already sees override-in-effect.\n // Also skip @sanity/cli when sanity is installed — the CLI-specific section below\n // produces more specific diagnostics (conflicting/redundant/cli-not-installed).\n const cliSectionWillHandle =\n name === '@sanity/cli' && Boolean(packages.sanity?.installed?.cliDependencyRange)\n if (info.declared && !info.installed && !info.override && !cliSectionWillHandle) {\n issues.push({\n message: `${name} is declared in package.json but not installed.`,\n packageName: name,\n severity: 'error',\n suggestion: `Run: ${pm} install`,\n type: 'declared-not-installed',\n })\n }\n\n // global-local-mismatch — only warn on major version differences\n // Check all global installations, not just the first match.\n // Skip @sanity/cli here — global-cli-incompatible (below) handles it with\n // better context by checking against sanity's actual required range.\n if (info.installed && name !== '@sanity/cli') {\n const localMajor = semver.parse(info.installed.version)?.major\n if (localMajor !== undefined) {\n for (const globalMatch of globals.filter((g) => g.packageName === name)) {\n const globalMajor = semver.parse(globalMatch.version)?.major\n if (globalMajor !== undefined && globalMajor !== localMajor) {\n issues.push({\n message: `${name} version mismatch: global ${globalMatch.version} (${globalMatch.packageManager}) vs local ${info.installed.version}.`,\n packageName: name,\n severity: globalMatch.isActive ? 'warning' : 'info',\n suggestion: `Run: ${getGlobalUninstallCommand(globalMatch.packageManager, name)}`,\n type: 'global-local-mismatch',\n })\n }\n }\n }\n }\n }\n\n // Check @sanity/cli compatibility with sanity\n const sanityInfo = packages.sanity\n const cliInfo = packages['@sanity/cli']\n\n if (sanityInfo?.installed?.cliDependencyRange) {\n const expectedCliRange = sanityInfo.installed.cliDependencyRange\n // Normalize pinned versions (e.g. \"5.33.0\" → \"^5.33.0\") for satisfies checks.\n // Already-ranged values like \"^5.33.0\" pass through unchanged.\n // Note: sanity always uses caret ranges in practice. The pinned→caret conversion\n // is a defensive fallback — if sanity ever pinned an exact version, caret semantics\n // (any compatible minor/patch) are the expected behavior for CLI compatibility.\n const compatRange = toCaretRange(expectedCliRange)\n\n // Check if @sanity/cli is explicitly declared with an incompatible version.\n // Skip when the declared range uses a non-semver protocol (workspace:*, file:,\n // portal:, link:) — these are local package references, not version conflicts.\n if (cliInfo?.declared && !isNonSemverProtocol(cliInfo.declared.versionRange)) {\n const declaredRange = cliInfo.declared.versionRange\n // Only flag as redundant when every version in the declared range also\n // satisfies the required range. semver.subset('^5.0.0', '^5.33.0') → false,\n // so a too-wide range is correctly classified as conflicting.\n if (safeSubset(declaredRange, expectedCliRange)) {\n issues.push({\n message: `@sanity/cli is listed as a dependency but is already provided by sanity. Remove it to avoid version conflicts.`,\n packageName: '@sanity/cli',\n severity: 'info',\n suggestion: `Run: ${getLocalRemoveCommand(pm, '@sanity/cli')}`,\n type: 'redundant-cli-dependency',\n })\n } else {\n issues.push({\n message: `@sanity/cli is declared as ${declaredRange} but sanity requires ${expectedCliRange}. Sanity provides @sanity/cli automatically — removing the explicit declaration lets sanity manage the correct version.`,\n packageName: '@sanity/cli',\n severity: 'error',\n suggestion: `Run: ${getLocalRemoveCommand(pm, '@sanity/cli')}`,\n type: 'conflicting-cli-dependency',\n })\n }\n }\n\n // Check if installed @sanity/cli satisfies sanity's requirement.\n // Skip if we already flagged a conflicting declaration — that's the root cause.\n // Skip if an override is in effect — the user already knows about it, and\n // suggesting an update would be misleading since the override controls the version.\n const hasConflictingDeclaration = issues.some((i) => i.type === 'conflicting-cli-dependency')\n if (cliInfo?.installed && !hasConflictingDeclaration && !cliInfo.override) {\n const installedVersion = cliInfo.installed.version\n if (!safeSatisfies(installedVersion, compatRange)) {\n issues.push({\n message: `Installed @sanity/cli@${installedVersion} does not satisfy sanity's requirement of ${compatRange}.`,\n packageName: '@sanity/cli',\n severity: 'error',\n suggestion: `Run: ${getLocalUpdateCommand(pm, '@sanity/cli', updateOptions)}`,\n type: 'cli-version-incompatible',\n })\n }\n }\n\n // Check if @sanity/cli is missing entirely (not declared, not installed)\n // This indicates a broken node_modules state since sanity depends on @sanity/cli.\n if (!cliInfo?.installed && !cliInfo?.declared && !cliInfo?.override) {\n issues.push({\n message: `@sanity/cli is not installed. It is required by sanity@${sanityInfo.installed.version}.`,\n packageName: '@sanity/cli',\n severity: 'error',\n suggestion: `Run: ${pm} install`,\n type: 'cli-not-installed',\n })\n }\n\n // Check global @sanity/cli compatibility with local sanity\n for (const global of globals) {\n if (global.packageName !== '@sanity/cli') continue\n\n if (!safeSatisfies(global.version, compatRange)) {\n issues.push({\n message: `Global @sanity/cli@${global.version} (installed via ${global.packageManager}) is incompatible with local sanity@${sanityInfo.installed.version} (requires @sanity/cli ${compatRange}).`,\n packageName: '@sanity/cli',\n severity: global.isActive ? 'warning' : 'info',\n suggestion: `Run: ${getGlobalUninstallCommand(global.packageManager, '@sanity/cli')}`,\n type: 'global-cli-incompatible',\n })\n }\n }\n }\n\n return issues\n}\n\n/**\n * Protocols and prefixes that are not semver ranges.\n * Includes local package references (workspace:, file:, portal:, link:),\n * catalog: which may appear as an unresolved range when pnpm catalog lookup fails,\n * and git/URL-based dependency specifiers.\n */\nconst NON_SEMVER_PROTOCOLS = [\n 'workspace:',\n 'file:',\n 'portal:',\n 'link:',\n 'catalog:',\n 'git+',\n 'git:',\n 'github:',\n 'https:',\n 'http:',\n]\n\nfunction isNonSemverProtocol(range: string): boolean {\n return NON_SEMVER_PROTOCOLS.some((p) => range.startsWith(p))\n}\n\n/**\n * Infers the package manager from workspace info when no lockfile is present.\n * Uses both the workspace type (which captures workspace config markers like\n * pnpm-workspace.yaml) and the yarnBerry flag (which captures .yarnrc.yml\n * even for standalone projects).\n */\nfunction inferPackageManager(workspace: WorkspaceInfo): LockfileType {\n if (workspace.type.startsWith('pnpm')) return 'pnpm'\n if (workspace.type.startsWith('yarn')) return 'yarn'\n if (workspace.type.startsWith('bun')) return 'bun'\n if (workspace.yarnBerry) return 'yarn'\n if (workspace.bunfig) return 'bun'\n return 'npm'\n}\n\n/**\n * Safe wrapper around semver.satisfies that returns false for non-semver\n * versions or ranges (workspace:*, catalog:, file:, git URLs) instead of throwing.\n * Uses includePrerelease so that pre-release versions (e.g. 5.0.0-rc.1) are\n * correctly matched against caret ranges like ^5.0.0-rc.1.\n */\nfunction safeSatisfies(version: string, range: string): boolean {\n try {\n return semver.satisfies(version, range, {includePrerelease: true})\n } catch {\n return false\n }\n}\n\n/**\n * Safe wrapper around semver.subset that returns false for non-semver ranges\n * like workspace:*, catalog:, file:, or git URLs instead of throwing.\n */\nfunction safeSubset(sub: string, sup: string): boolean {\n try {\n return semver.subset(sub, sup) ?? false\n } catch {\n return false\n }\n}\n\n/**\n * Converts a pinned version like \"5.33.0\" to \"^5.33.0\".\n * If it's already a range (^, ~, \\>=, etc.), returns as-is.\n */\nfunction toCaretRange(range: string): string {\n // If it's already a range operator, return as-is\n if (/^[\\^~><!=]/.test(range) || range.includes(' ')) {\n return range\n }\n // If it's a plain version like \"5.33.0\", treat as ^5.33.0\n if (semver.valid(range)) {\n return `^${range}`\n }\n return range\n}\n"],"names":["semver","getGlobalUninstallCommand","getLocalRemoveCommand","getLocalUpdateCommand","analyzeIssues","packages","workspace","globals","issues","pm","hasMultipleLockfiles","lockfile","inferPackageManager","type","updateOptions","yarnBerry","push","message","packageName","severity","suggestion","name","info","Object","entries","override","mechanism","versionRange","cliSectionWillHandle","Boolean","sanity","installed","cliDependencyRange","declared","localMajor","parse","version","major","undefined","globalMatch","filter","g","globalMajor","packageManager","isActive","sanityInfo","cliInfo","expectedCliRange","compatRange","toCaretRange","isNonSemverProtocol","declaredRange","safeSubset","hasConflictingDeclaration","some","i","installedVersion","safeSatisfies","global","NON_SEMVER_PROTOCOLS","range","p","startsWith","bunfig","satisfies","includePrerelease","sub","sup","subset","test","includes","valid"],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { getYarnMajorVersion } from '@sanity/cli-core/package-manager';
2
+ export function getGlobalUninstallCommand(pm, packageName) {
3
+ switch(pm){
4
+ case 'bun':
5
+ {
6
+ return `bun remove -g ${packageName}`;
7
+ }
8
+ case 'npm':
9
+ {
10
+ return `npm uninstall -g ${packageName}`;
11
+ }
12
+ case 'pnpm':
13
+ {
14
+ return `pnpm remove -g ${packageName}`;
15
+ }
16
+ case 'yarn':
17
+ {
18
+ // The pm is 'yarn' because queryYarnGlobals found the package, meaning
19
+ // it was installed with Yarn Classic (`yarn global add`). Only Yarn
20
+ // Classic can uninstall it — the project's yarn version is irrelevant.
21
+ return `yarn global remove ${packageName}`;
22
+ }
23
+ }
24
+ }
25
+ export function getLocalUpdateCommand(pm, packageName, options) {
26
+ switch(pm){
27
+ case 'bun':
28
+ {
29
+ return `bun update ${packageName}`;
30
+ }
31
+ case 'npm':
32
+ {
33
+ return `npm update ${packageName}`;
34
+ }
35
+ case 'pnpm':
36
+ {
37
+ return `pnpm update ${packageName}`;
38
+ }
39
+ case 'yarn':
40
+ {
41
+ // Prefer project-level detection (.yarnrc.yml) over process user-agent,
42
+ // since the doctor command may be invoked via a different package manager.
43
+ const isBerry = options?.yarnBerry ?? isYarnBerryFromProcess();
44
+ return `yarn ${isBerry ? 'up' : 'upgrade'} ${packageName}`;
45
+ }
46
+ }
47
+ }
48
+ function isYarnBerryFromProcess() {
49
+ const yarnMajor = getYarnMajorVersion();
50
+ return yarnMajor !== undefined && yarnMajor >= 2;
51
+ }
52
+ export function getLocalRemoveCommand(pm, packageName) {
53
+ switch(pm){
54
+ case 'bun':
55
+ {
56
+ return `bun remove ${packageName}`;
57
+ }
58
+ case 'npm':
59
+ {
60
+ return `npm uninstall ${packageName}`;
61
+ }
62
+ case 'pnpm':
63
+ {
64
+ return `pnpm remove ${packageName}`;
65
+ }
66
+ case 'yarn':
67
+ {
68
+ return `yarn remove ${packageName}`;
69
+ }
70
+ }
71
+ }
72
+
73
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/util/packageManager/installationInfo/commands.ts"],"sourcesContent":["import {getYarnMajorVersion} from '@sanity/cli-core/package-manager'\n\nimport {type LockfileType} from './types.js'\n\ninterface CommandOptions {\n /** Whether the project uses Yarn Berry (v2+), determined from .yarnrc.yml. */\n yarnBerry?: boolean\n}\n\nexport function getGlobalUninstallCommand(pm: LockfileType, packageName: string): string {\n switch (pm) {\n case 'bun': {\n return `bun remove -g ${packageName}`\n }\n case 'npm': {\n return `npm uninstall -g ${packageName}`\n }\n case 'pnpm': {\n return `pnpm remove -g ${packageName}`\n }\n case 'yarn': {\n // The pm is 'yarn' because queryYarnGlobals found the package, meaning\n // it was installed with Yarn Classic (`yarn global add`). Only Yarn\n // Classic can uninstall it — the project's yarn version is irrelevant.\n return `yarn global remove ${packageName}`\n }\n }\n}\n\nexport function getLocalUpdateCommand(\n pm: LockfileType,\n packageName: string,\n options?: CommandOptions,\n): string {\n switch (pm) {\n case 'bun': {\n return `bun update ${packageName}`\n }\n case 'npm': {\n return `npm update ${packageName}`\n }\n case 'pnpm': {\n return `pnpm update ${packageName}`\n }\n case 'yarn': {\n // Prefer project-level detection (.yarnrc.yml) over process user-agent,\n // since the doctor command may be invoked via a different package manager.\n const isBerry = options?.yarnBerry ?? isYarnBerryFromProcess()\n return `yarn ${isBerry ? 'up' : 'upgrade'} ${packageName}`\n }\n }\n}\n\nfunction isYarnBerryFromProcess(): boolean {\n const yarnMajor = getYarnMajorVersion()\n return yarnMajor !== undefined && yarnMajor >= 2\n}\n\nexport function getLocalRemoveCommand(pm: LockfileType, packageName: string): string {\n switch (pm) {\n case 'bun': {\n return `bun remove ${packageName}`\n }\n case 'npm': {\n return `npm uninstall ${packageName}`\n }\n case 'pnpm': {\n return `pnpm remove ${packageName}`\n }\n case 'yarn': {\n return `yarn remove ${packageName}`\n }\n }\n}\n"],"names":["getYarnMajorVersion","getGlobalUninstallCommand","pm","packageName","getLocalUpdateCommand","options","isBerry","yarnBerry","isYarnBerryFromProcess","yarnMajor","undefined","getLocalRemoveCommand"],"mappings":"AAAA,SAAQA,mBAAmB,QAAO,mCAAkC;AASpE,OAAO,SAASC,0BAA0BC,EAAgB,EAAEC,WAAmB;IAC7E,OAAQD;QACN,KAAK;YAAO;gBACV,OAAO,CAAC,cAAc,EAAEC,aAAa;YACvC;QACA,KAAK;YAAO;gBACV,OAAO,CAAC,iBAAiB,EAAEA,aAAa;YAC1C;QACA,KAAK;YAAQ;gBACX,OAAO,CAAC,eAAe,EAAEA,aAAa;YACxC;QACA,KAAK;YAAQ;gBACX,uEAAuE;gBACvE,oEAAoE;gBACpE,uEAAuE;gBACvE,OAAO,CAAC,mBAAmB,EAAEA,aAAa;YAC5C;IACF;AACF;AAEA,OAAO,SAASC,sBACdF,EAAgB,EAChBC,WAAmB,EACnBE,OAAwB;IAExB,OAAQH;QACN,KAAK;YAAO;gBACV,OAAO,CAAC,WAAW,EAAEC,aAAa;YACpC;QACA,KAAK;YAAO;gBACV,OAAO,CAAC,WAAW,EAAEA,aAAa;YACpC;QACA,KAAK;YAAQ;gBACX,OAAO,CAAC,YAAY,EAAEA,aAAa;YACrC;QACA,KAAK;YAAQ;gBACX,wEAAwE;gBACxE,2EAA2E;gBAC3E,MAAMG,UAAUD,SAASE,aAAaC;gBACtC,OAAO,CAAC,KAAK,EAAEF,UAAU,OAAO,UAAU,CAAC,EAAEH,aAAa;YAC5D;IACF;AACF;AAEA,SAASK;IACP,MAAMC,YAAYT;IAClB,OAAOS,cAAcC,aAAaD,aAAa;AACjD;AAEA,OAAO,SAASE,sBAAsBT,EAAgB,EAAEC,WAAmB;IACzE,OAAQD;QACN,KAAK;YAAO;gBACV,OAAO,CAAC,WAAW,EAAEC,aAAa;YACpC;QACA,KAAK;YAAO;gBACV,OAAO,CAAC,cAAc,EAAEA,aAAa;YACvC;QACA,KAAK;YAAQ;gBACX,OAAO,CAAC,YAAY,EAAEA,aAAa;YACrC;QACA,KAAK;YAAQ;gBACX,OAAO,CAAC,YAAY,EAAEA,aAAa;YACrC;IACF;AACF"}
@@ -0,0 +1,66 @@
1
+ import { getRunningPackageManager } from '@sanity/cli-core/package-manager';
2
+ import { analyzeIssues } from './analyzeIssues.js';
3
+ import { detectGlobalInstallations } from './detectGlobals.js';
4
+ import { collectPackageInfo } from './detectPackages.js';
5
+ import { detectWorkspace } from './detectWorkspace.js';
6
+ const SANITY_PACKAGES = [
7
+ 'sanity',
8
+ '@sanity/cli'
9
+ ];
10
+ /**
11
+ * Main entry point for detecting CLI installation status.
12
+ * Gathers information about workspace configuration, package declarations,
13
+ * installed versions, global installations, and potential issues.
14
+ */ export async function detectCliInstallation(options) {
15
+ const cwd = options?.cwd ?? process.cwd();
16
+ // Run detection in parallel where possible
17
+ const [workspace, globalInstallations] = await Promise.all([
18
+ detectWorkspace(cwd),
19
+ detectGlobalInstallations()
20
+ ]);
21
+ // Collect package info for both sanity packages
22
+ const packageInfoResults = await Promise.all(SANITY_PACKAGES.map(async (name)=>{
23
+ const info = await collectPackageInfo(name, cwd, workspace);
24
+ return [
25
+ name,
26
+ info
27
+ ];
28
+ }));
29
+ const packages = Object.fromEntries(packageInfoResults.filter(([, info])=>info.declared || info.override || info.installed));
30
+ // Detect execution context
31
+ const currentExecution = detectExecutionContext(globalInstallations);
32
+ // Analyze for issues
33
+ const issues = analyzeIssues(packages, workspace, globalInstallations);
34
+ return {
35
+ currentExecution,
36
+ globalInstallations,
37
+ issues,
38
+ packages,
39
+ workspace
40
+ };
41
+ }
42
+ function detectExecutionContext(globalInstallations) {
43
+ // Try to determine how we're running
44
+ const binaryPath = process.argv[1] ?? null;
45
+ // Check npm_config_user_agent for package manager
46
+ const packageManager = getRunningPackageManager() ?? null;
47
+ // Determine if we're running from global, local, or npx
48
+ let resolvedFrom = 'unknown';
49
+ if (binaryPath) {
50
+ // Check if running via npx
51
+ if (process.env.npm_execpath?.includes('npx') || binaryPath.includes('/_npx/') || binaryPath.includes('\\_npx\\')) {
52
+ resolvedFrom = 'npx';
53
+ } else if (binaryPath.includes('node_modules')) {
54
+ resolvedFrom = 'local';
55
+ } else if (globalInstallations.some((g)=>g.isActive)) {
56
+ resolvedFrom = 'global';
57
+ }
58
+ }
59
+ return {
60
+ binaryPath,
61
+ packageManager,
62
+ resolvedFrom
63
+ };
64
+ }
65
+
66
+ //# sourceMappingURL=detectCliInstallation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/util/packageManager/installationInfo/detectCliInstallation.ts"],"sourcesContent":["import {getRunningPackageManager} from '@sanity/cli-core/package-manager'\n\nimport {analyzeIssues} from './analyzeIssues.js'\nimport {detectGlobalInstallations} from './detectGlobals.js'\nimport {collectPackageInfo} from './detectPackages.js'\nimport {detectWorkspace} from './detectWorkspace.js'\nimport {type CliInstallationInfo, type ExecutionContext, type SanityPackage} from './types.js'\n\nconst SANITY_PACKAGES: SanityPackage[] = ['sanity', '@sanity/cli']\n\ninterface DetectCliInstallationOptions {\n cwd?: string\n}\n\n/**\n * Main entry point for detecting CLI installation status.\n * Gathers information about workspace configuration, package declarations,\n * installed versions, global installations, and potential issues.\n */\nexport async function detectCliInstallation(\n options?: DetectCliInstallationOptions,\n): Promise<CliInstallationInfo> {\n const cwd = options?.cwd ?? process.cwd()\n\n // Run detection in parallel where possible\n const [workspace, globalInstallations] = await Promise.all([\n detectWorkspace(cwd),\n detectGlobalInstallations(),\n ])\n\n // Collect package info for both sanity packages\n const packageInfoResults = await Promise.all(\n SANITY_PACKAGES.map(async (name) => {\n const info = await collectPackageInfo(name, cwd, workspace)\n return [name, info] as const\n }),\n )\n\n const packages: Partial<Record<SanityPackage, CliInstallationInfo['packages'][SanityPackage]>> =\n Object.fromEntries(\n packageInfoResults.filter(([, info]) => info.declared || info.override || info.installed),\n )\n\n // Detect execution context\n const currentExecution = detectExecutionContext(globalInstallations)\n\n // Analyze for issues\n const issues = analyzeIssues(packages, workspace, globalInstallations)\n\n return {\n currentExecution,\n globalInstallations,\n issues,\n packages,\n workspace,\n }\n}\n\nfunction detectExecutionContext(\n globalInstallations: CliInstallationInfo['globalInstallations'],\n): ExecutionContext {\n // Try to determine how we're running\n const binaryPath = process.argv[1] ?? null\n\n // Check npm_config_user_agent for package manager\n const packageManager: ExecutionContext['packageManager'] = getRunningPackageManager() ?? null\n\n // Determine if we're running from global, local, or npx\n let resolvedFrom: ExecutionContext['resolvedFrom'] = 'unknown'\n\n if (binaryPath) {\n // Check if running via npx\n if (\n process.env.npm_execpath?.includes('npx') ||\n binaryPath.includes('/_npx/') ||\n binaryPath.includes('\\\\_npx\\\\')\n ) {\n resolvedFrom = 'npx'\n }\n // Check if running from node_modules (local install).\n // process.argv[1] for npm globals is the symlink path (e.g. /usr/local/bin/sanity),\n // not the resolved target, so this won't match global installs.\n else if (binaryPath.includes('node_modules')) {\n resolvedFrom = 'local'\n }\n // Fallback: if there's an active global installation, classify as global.\n // This covers all PM-specific bin paths (npm, pnpm, yarn, bun) since\n // markActiveInstallation already identifies the active PM using bin dir checks.\n else if (globalInstallations.some((g) => g.isActive)) {\n resolvedFrom = 'global'\n }\n }\n\n return {\n binaryPath,\n packageManager,\n resolvedFrom,\n }\n}\n"],"names":["getRunningPackageManager","analyzeIssues","detectGlobalInstallations","collectPackageInfo","detectWorkspace","SANITY_PACKAGES","detectCliInstallation","options","cwd","process","workspace","globalInstallations","Promise","all","packageInfoResults","map","name","info","packages","Object","fromEntries","filter","declared","override","installed","currentExecution","detectExecutionContext","issues","binaryPath","argv","packageManager","resolvedFrom","env","npm_execpath","includes","some","g","isActive"],"mappings":"AAAA,SAAQA,wBAAwB,QAAO,mCAAkC;AAEzE,SAAQC,aAAa,QAAO,qBAAoB;AAChD,SAAQC,yBAAyB,QAAO,qBAAoB;AAC5D,SAAQC,kBAAkB,QAAO,sBAAqB;AACtD,SAAQC,eAAe,QAAO,uBAAsB;AAGpD,MAAMC,kBAAmC;IAAC;IAAU;CAAc;AAMlE;;;;CAIC,GACD,OAAO,eAAeC,sBACpBC,OAAsC;IAEtC,MAAMC,MAAMD,SAASC,OAAOC,QAAQD,GAAG;IAEvC,2CAA2C;IAC3C,MAAM,CAACE,WAAWC,oBAAoB,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACzDT,gBAAgBI;QAChBN;KACD;IAED,gDAAgD;IAChD,MAAMY,qBAAqB,MAAMF,QAAQC,GAAG,CAC1CR,gBAAgBU,GAAG,CAAC,OAAOC;QACzB,MAAMC,OAAO,MAAMd,mBAAmBa,MAAMR,KAAKE;QACjD,OAAO;YAACM;YAAMC;SAAK;IACrB;IAGF,MAAMC,WACJC,OAAOC,WAAW,CAChBN,mBAAmBO,MAAM,CAAC,CAAC,GAAGJ,KAAK,GAAKA,KAAKK,QAAQ,IAAIL,KAAKM,QAAQ,IAAIN,KAAKO,SAAS;IAG5F,2BAA2B;IAC3B,MAAMC,mBAAmBC,uBAAuBf;IAEhD,qBAAqB;IACrB,MAAMgB,SAAS1B,cAAciB,UAAUR,WAAWC;IAElD,OAAO;QACLc;QACAd;QACAgB;QACAT;QACAR;IACF;AACF;AAEA,SAASgB,uBACPf,mBAA+D;IAE/D,qCAAqC;IACrC,MAAMiB,aAAanB,QAAQoB,IAAI,CAAC,EAAE,IAAI;IAEtC,kDAAkD;IAClD,MAAMC,iBAAqD9B,8BAA8B;IAEzF,wDAAwD;IACxD,IAAI+B,eAAiD;IAErD,IAAIH,YAAY;QACd,2BAA2B;QAC3B,IACEnB,QAAQuB,GAAG,CAACC,YAAY,EAAEC,SAAS,UACnCN,WAAWM,QAAQ,CAAC,aACpBN,WAAWM,QAAQ,CAAC,aACpB;YACAH,eAAe;QACjB,OAIK,IAAIH,WAAWM,QAAQ,CAAC,iBAAiB;YAC5CH,eAAe;QACjB,OAIK,IAAIpB,oBAAoBwB,IAAI,CAAC,CAACC,IAAMA,EAAEC,QAAQ,GAAG;YACpDN,eAAe;QACjB;IACF;IAEA,OAAO;QACLH;QACAE;QACAC;IACF;AACF"}