@sanity/cli 6.0.0-alpha.9 → 6.1.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 (613) hide show
  1. package/README.md +602 -291
  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 +34 -13
  205. package/dist/actions/mcp/detectAvailableEditors.js.map +1 -1
  206. package/dist/actions/mcp/editorConfigs.js +231 -109
  207. package/dist/actions/mcp/editorConfigs.js.map +1 -1
  208. package/dist/actions/mcp/promptForMCPSetup.js +16 -7
  209. package/dist/actions/mcp/promptForMCPSetup.js.map +1 -1
  210. package/dist/actions/mcp/setupMCP.js +62 -23
  211. package/dist/actions/mcp/setupMCP.js.map +1 -1
  212. package/dist/actions/mcp/types.js.map +1 -1
  213. package/dist/actions/mcp/validateEditorTokens.js +56 -0
  214. package/dist/actions/mcp/validateEditorTokens.js.map +1 -0
  215. package/dist/actions/mcp/writeMCPConfig.js +27 -15
  216. package/dist/actions/mcp/writeMCPConfig.js.map +1 -1
  217. package/dist/actions/media/buildNdjsonIndex.js +32 -0
  218. package/dist/actions/media/buildNdjsonIndex.js.map +1 -0
  219. package/dist/actions/media/importAspects.js +2 -11
  220. package/dist/actions/media/importAspects.js.map +1 -1
  221. package/dist/actions/media/importMedia.js +22 -18
  222. package/dist/actions/media/importMedia.js.map +1 -1
  223. package/dist/actions/organizations/findOrganizationByUserName.js +5 -0
  224. package/dist/actions/organizations/findOrganizationByUserName.js.map +1 -0
  225. package/dist/actions/organizations/getOrganization.js +3 -2
  226. package/dist/actions/organizations/getOrganization.js.map +1 -1
  227. package/dist/actions/organizations/getOrganizationChoices.js +27 -19
  228. package/dist/actions/organizations/getOrganizationChoices.js.map +1 -1
  229. package/dist/actions/organizations/types.js +3 -0
  230. package/dist/actions/organizations/types.js.map +1 -0
  231. package/dist/actions/projects/getManageUrl.js +1 -2
  232. package/dist/actions/projects/getManageUrl.js.map +1 -1
  233. package/dist/actions/schema/deleteSchemaAction.js +14 -30
  234. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  235. package/dist/actions/schema/deploySchemas.js +22 -91
  236. package/dist/actions/schema/deploySchemas.js.map +1 -1
  237. package/dist/actions/schema/extractSanitySchema.worker.js +0 -5
  238. package/dist/actions/schema/extractSanitySchema.worker.js.map +1 -1
  239. package/dist/actions/schema/extractSanityWorkspace.worker.js +24 -0
  240. package/dist/actions/schema/extractSanityWorkspace.worker.js.map +1 -0
  241. package/dist/actions/schema/extractSchema.js +8 -40
  242. package/dist/actions/schema/extractSchema.js.map +1 -1
  243. package/dist/actions/schema/extractSchemaWatcher.js +128 -0
  244. package/dist/actions/schema/extractSchemaWatcher.js.map +1 -0
  245. package/dist/actions/schema/formatSchemaValidation.js +5 -1
  246. package/dist/actions/schema/formatSchemaValidation.js.map +1 -1
  247. package/dist/actions/schema/getExtractOptions.js +16 -0
  248. package/dist/actions/schema/getExtractOptions.js.map +1 -0
  249. package/dist/actions/schema/listSchemas.js +53 -56
  250. package/dist/actions/schema/listSchemas.js.map +1 -1
  251. package/dist/actions/schema/matchSchemaPattern.js +22 -0
  252. package/dist/actions/schema/matchSchemaPattern.js.map +1 -0
  253. package/dist/actions/schema/runSchemaExtraction.js +39 -0
  254. package/dist/actions/schema/runSchemaExtraction.js.map +1 -0
  255. package/dist/actions/schema/types.js +8 -0
  256. package/dist/actions/schema/types.js.map +1 -1
  257. package/dist/actions/schema/uniqueWorkspaces.worker.js +24 -0
  258. package/dist/actions/schema/uniqueWorkspaces.worker.js.map +1 -0
  259. package/dist/actions/schema/updateWorkspaceSchema.js +63 -0
  260. package/dist/actions/schema/updateWorkspaceSchema.js.map +1 -0
  261. package/dist/actions/schema/uploadSchemaToLexicon.js +87 -0
  262. package/dist/actions/schema/uploadSchemaToLexicon.js.map +1 -0
  263. package/dist/actions/schema/utils/SchemaExtractionError.js +10 -0
  264. package/dist/actions/schema/utils/SchemaExtractionError.js.map +1 -0
  265. package/dist/actions/schema/utils/schemaStoreValidation.js +1 -15
  266. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  267. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +1 -1
  268. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -1
  269. package/dist/actions/schema/validateSchema.worker.js +1 -8
  270. package/dist/actions/schema/validateSchema.worker.js.map +1 -1
  271. package/dist/actions/schema/watchExtractSchema.js +72 -0
  272. package/dist/actions/schema/watchExtractSchema.js.map +1 -0
  273. package/dist/actions/telemetry/isTrueish.js +10 -0
  274. package/dist/actions/telemetry/isTrueish.js.map +1 -0
  275. package/dist/actions/telemetry/resolveConsent.js +2 -1
  276. package/dist/actions/telemetry/resolveConsent.js.map +1 -1
  277. package/dist/actions/telemetry/setConsent.js +2 -1
  278. package/dist/actions/telemetry/setConsent.js.map +1 -1
  279. package/dist/actions/telemetry/telemetryDebug.js +2 -2
  280. package/dist/actions/telemetry/telemetryDebug.js.map +1 -1
  281. package/dist/actions/users/getMembersForProject.js.map +1 -1
  282. package/dist/actions/users/getPendingInvitations.js +1 -1
  283. package/dist/actions/users/getPendingInvitations.js.map +1 -1
  284. package/dist/actions/users/types.js.map +1 -1
  285. package/dist/actions/versions/filterSanityModules.js.map +1 -1
  286. package/dist/actions/versions/findSanityModulesVersions.js +2 -3
  287. package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
  288. package/dist/actions/versions/getFormatters.js +1 -1
  289. package/dist/actions/versions/getFormatters.js.map +1 -1
  290. package/dist/actions/versions/tryFindLatestVersion.js +1 -1
  291. package/dist/actions/versions/tryFindLatestVersion.js.map +1 -1
  292. package/dist/commands/backup/disable.js +22 -7
  293. package/dist/commands/backup/disable.js.map +1 -1
  294. package/dist/commands/backup/download.js +19 -10
  295. package/dist/commands/backup/download.js.map +1 -1
  296. package/dist/commands/backup/enable.js +22 -7
  297. package/dist/commands/backup/enable.js.map +1 -1
  298. package/dist/commands/backup/list.js +20 -8
  299. package/dist/commands/backup/list.js.map +1 -1
  300. package/dist/commands/build.js +2 -5
  301. package/dist/commands/build.js.map +1 -1
  302. package/dist/commands/cors/add.js +20 -7
  303. package/dist/commands/cors/add.js.map +1 -1
  304. package/dist/commands/cors/delete.js +22 -7
  305. package/dist/commands/cors/delete.js.map +1 -1
  306. package/dist/commands/cors/list.js +22 -7
  307. package/dist/commands/cors/list.js.map +1 -1
  308. package/dist/commands/dataset/alias/create.js +26 -7
  309. package/dist/commands/dataset/alias/create.js.map +1 -1
  310. package/dist/commands/dataset/alias/delete.js +20 -7
  311. package/dist/commands/dataset/alias/delete.js.map +1 -1
  312. package/dist/commands/dataset/alias/link.js +20 -7
  313. package/dist/commands/dataset/alias/link.js.map +1 -1
  314. package/dist/commands/dataset/alias/unlink.js +20 -7
  315. package/dist/commands/dataset/alias/unlink.js.map +1 -1
  316. package/dist/commands/dataset/copy.js +45 -30
  317. package/dist/commands/dataset/copy.js.map +1 -1
  318. package/dist/commands/dataset/create.js +32 -7
  319. package/dist/commands/dataset/create.js.map +1 -1
  320. package/dist/commands/dataset/delete.js +16 -7
  321. package/dist/commands/dataset/delete.js.map +1 -1
  322. package/dist/commands/dataset/embeddings/disable.js +77 -0
  323. package/dist/commands/dataset/embeddings/disable.js.map +1 -0
  324. package/dist/commands/dataset/embeddings/enable.js +141 -0
  325. package/dist/commands/dataset/embeddings/enable.js.map +1 -0
  326. package/dist/commands/dataset/embeddings/status.js +72 -0
  327. package/dist/commands/dataset/embeddings/status.js.map +1 -0
  328. package/dist/commands/dataset/export.js +25 -16
  329. package/dist/commands/dataset/export.js.map +1 -1
  330. package/dist/commands/dataset/import.js +306 -1
  331. package/dist/commands/dataset/import.js.map +1 -1
  332. package/dist/commands/dataset/list.js +22 -7
  333. package/dist/commands/dataset/list.js.map +1 -1
  334. package/dist/commands/dataset/visibility/get.js +18 -7
  335. package/dist/commands/dataset/visibility/get.js.map +1 -1
  336. package/dist/commands/dataset/visibility/set.js +22 -7
  337. package/dist/commands/dataset/visibility/set.js.map +1 -1
  338. package/dist/commands/debug.js +4 -2
  339. package/dist/commands/debug.js.map +1 -1
  340. package/dist/commands/deploy.js +22 -11
  341. package/dist/commands/deploy.js.map +1 -1
  342. package/dist/commands/dev.js +2 -4
  343. package/dist/commands/dev.js.map +1 -1
  344. package/dist/commands/doctor.js +125 -0
  345. package/dist/commands/doctor.js.map +1 -0
  346. package/dist/commands/documents/create.js +19 -12
  347. package/dist/commands/documents/create.js.map +1 -1
  348. package/dist/commands/documents/delete.js +19 -12
  349. package/dist/commands/documents/delete.js.map +1 -1
  350. package/dist/commands/documents/get.js +17 -12
  351. package/dist/commands/documents/get.js.map +1 -1
  352. package/dist/commands/documents/query.js +26 -18
  353. package/dist/commands/documents/query.js.map +1 -1
  354. package/dist/commands/documents/validate.js +32 -10
  355. package/dist/commands/documents/validate.js.map +1 -1
  356. package/dist/commands/graphql/deploy.js +58 -30
  357. package/dist/commands/graphql/deploy.js.map +1 -1
  358. package/dist/commands/graphql/list.js +15 -7
  359. package/dist/commands/graphql/list.js.map +1 -1
  360. package/dist/commands/graphql/undeploy.js +37 -19
  361. package/dist/commands/graphql/undeploy.js.map +1 -1
  362. package/dist/commands/hook/attempt.js +22 -7
  363. package/dist/commands/hook/attempt.js.map +1 -1
  364. package/dist/commands/hook/create.js +23 -8
  365. package/dist/commands/hook/create.js.map +1 -1
  366. package/dist/commands/hook/delete.js +22 -7
  367. package/dist/commands/hook/delete.js.map +1 -1
  368. package/dist/commands/hook/list.js +22 -7
  369. package/dist/commands/hook/list.js.map +1 -1
  370. package/dist/commands/hook/logs.js +21 -8
  371. package/dist/commands/hook/logs.js.map +1 -1
  372. package/dist/commands/init.js +55 -32
  373. package/dist/commands/init.js.map +1 -1
  374. package/dist/commands/login.js +19 -6
  375. package/dist/commands/login.js.map +1 -1
  376. package/dist/commands/logout.js +8 -6
  377. package/dist/commands/logout.js.map +1 -1
  378. package/dist/commands/manage.js +0 -1
  379. package/dist/commands/manage.js.map +1 -1
  380. package/dist/commands/manifest/extract.js +14 -10
  381. package/dist/commands/manifest/extract.js.map +1 -1
  382. package/dist/commands/mcp/configure.js +4 -2
  383. package/dist/commands/mcp/configure.js.map +1 -1
  384. package/dist/commands/media/create-aspect.js +4 -4
  385. package/dist/commands/media/create-aspect.js.map +1 -1
  386. package/dist/commands/media/delete-aspect.js +9 -7
  387. package/dist/commands/media/delete-aspect.js.map +1 -1
  388. package/dist/commands/media/deploy-aspect.js +22 -9
  389. package/dist/commands/media/deploy-aspect.js.map +1 -1
  390. package/dist/commands/media/export.js +9 -7
  391. package/dist/commands/media/export.js.map +1 -1
  392. package/dist/commands/media/import.js +10 -8
  393. package/dist/commands/media/import.js.map +1 -1
  394. package/dist/commands/preview.js +5 -8
  395. package/dist/commands/preview.js.map +1 -1
  396. package/dist/commands/projects/list.js +2 -1
  397. package/dist/commands/projects/list.js.map +1 -1
  398. package/dist/commands/schema/delete.js +33 -34
  399. package/dist/commands/schema/delete.js.map +1 -1
  400. package/dist/commands/schema/deploy.js +19 -30
  401. package/dist/commands/schema/deploy.js.map +1 -1
  402. package/dist/commands/schema/extract.js +32 -4
  403. package/dist/commands/schema/extract.js.map +1 -1
  404. package/dist/commands/schema/list.js +10 -31
  405. package/dist/commands/schema/list.js.map +1 -1
  406. package/dist/commands/tokens/add.js +24 -7
  407. package/dist/commands/tokens/add.js.map +1 -1
  408. package/dist/commands/tokens/delete.js +20 -7
  409. package/dist/commands/tokens/delete.js.map +1 -1
  410. package/dist/commands/tokens/list.js +20 -7
  411. package/dist/commands/tokens/list.js.map +1 -1
  412. package/dist/commands/users/invite.js +24 -7
  413. package/dist/commands/users/invite.js.map +1 -1
  414. package/dist/commands/users/list.js +76 -33
  415. package/dist/commands/users/list.js.map +1 -1
  416. package/dist/commands/versions.js +1 -1
  417. package/dist/commands/versions.js.map +1 -1
  418. package/dist/config/createCliConfig.js +1 -2
  419. package/dist/config/createCliConfig.js.map +1 -1
  420. package/dist/exports/_internal.d.ts +132 -0
  421. package/dist/exports/_internal.js +4 -0
  422. package/dist/exports/_internal.js.map +1 -0
  423. package/dist/exports/index.d.ts +113 -0
  424. package/dist/exports/index.js +6 -0
  425. package/dist/exports/index.js.map +1 -0
  426. package/dist/hooks/init/checkForUpdates.js +14 -0
  427. package/dist/hooks/init/checkForUpdates.js.map +1 -0
  428. package/dist/hooks/prerun/flushTelemetry.worker.js +1 -1
  429. package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -1
  430. package/dist/hooks/prerun/injectEnvVariables.js +9 -1
  431. package/dist/hooks/prerun/injectEnvVariables.js.map +1 -1
  432. package/dist/hooks/prerun/setupTelemetry.js +16 -10
  433. package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
  434. package/dist/prompts/promptForProject.js +64 -0
  435. package/dist/prompts/promptForProject.js.map +1 -0
  436. package/dist/{actions/auth/login/promptProviders.js → prompts/promptForProviders.js} +3 -3
  437. package/dist/prompts/promptForProviders.js.map +1 -0
  438. package/dist/prompts/selectMediaLibrary.js +1 -1
  439. package/dist/prompts/selectMediaLibrary.js.map +1 -1
  440. package/dist/server/devServer.js +4 -2
  441. package/dist/server/devServer.js.map +1 -1
  442. package/dist/server/previewServer.js +2 -2
  443. package/dist/server/previewServer.js.map +1 -1
  444. package/dist/server/vite/plugin-schema-extraction.js +201 -0
  445. package/dist/server/vite/plugin-schema-extraction.js.map +1 -0
  446. package/dist/server/vite/plugin-typegen.js +217 -0
  447. package/dist/server/vite/plugin-typegen.js.map +1 -0
  448. package/dist/services/auth.js +42 -3
  449. package/dist/services/auth.js.map +1 -1
  450. package/dist/services/datasets.js +7 -5
  451. package/dist/services/datasets.js.map +1 -1
  452. package/dist/services/docs.js +2 -2
  453. package/dist/services/docs.js.map +1 -1
  454. package/dist/services/embeddings.js +25 -0
  455. package/dist/services/embeddings.js.map +1 -0
  456. package/dist/services/getUrlHeaders.js +7 -18
  457. package/dist/services/getUrlHeaders.js.map +1 -1
  458. package/dist/services/grants.js +13 -0
  459. package/dist/services/grants.js.map +1 -0
  460. package/dist/services/graphql.js +1 -1
  461. package/dist/services/graphql.js.map +1 -1
  462. package/dist/services/mcp.js +55 -1
  463. package/dist/services/mcp.js.map +1 -1
  464. package/dist/services/projects.js +4 -2
  465. package/dist/services/projects.js.map +1 -1
  466. package/dist/services/schemas.js +1 -1
  467. package/dist/services/schemas.js.map +1 -1
  468. package/dist/services/telemetry.js +2 -1
  469. package/dist/services/telemetry.js.map +1 -1
  470. package/dist/services/userApplications.js +21 -6
  471. package/dist/services/userApplications.js.map +1 -1
  472. package/dist/telemetry/extractSchema.telemetry.js +10 -0
  473. package/dist/telemetry/extractSchema.telemetry.js.map +1 -1
  474. package/dist/types/grants.js +3 -0
  475. package/dist/types/grants.js.map +1 -0
  476. package/dist/types.js +3 -0
  477. package/dist/types.js.map +1 -1
  478. package/dist/util/checkProjectPermissions.js +21 -0
  479. package/dist/util/checkProjectPermissions.js.map +1 -0
  480. package/dist/util/cliClient.js +5 -3
  481. package/dist/util/cliClient.js.map +1 -1
  482. package/dist/util/compareDependencyVersions.js +74 -38
  483. package/dist/util/compareDependencyVersions.js.map +1 -1
  484. package/dist/util/createExpiringConfig.js +64 -0
  485. package/dist/util/createExpiringConfig.js.map +1 -0
  486. package/dist/util/detectFramework.js +135 -0
  487. package/dist/util/detectFramework.js.map +1 -0
  488. package/dist/util/errorMessages.js +0 -1
  489. package/dist/util/errorMessages.js.map +1 -1
  490. package/dist/util/extractDocumentsFromNdjsonOrTarball.js +1 -2
  491. package/dist/util/extractDocumentsFromNdjsonOrTarball.js.map +1 -1
  492. package/dist/util/getCliVersion.js +1 -1
  493. package/dist/util/getCliVersion.js.map +1 -1
  494. package/dist/util/getLocalPackageVersion.js +33 -23
  495. package/dist/util/getLocalPackageVersion.js.map +1 -1
  496. package/dist/util/getProjectDefaults.js +22 -28
  497. package/dist/util/getProjectDefaults.js.map +1 -1
  498. package/dist/util/getSharedServerConfig.js +1 -0
  499. package/dist/util/getSharedServerConfig.js.map +1 -1
  500. package/dist/util/getWorkspace.js +1 -1
  501. package/dist/util/getWorkspace.js.map +1 -1
  502. package/dist/util/gitConfig.js +45 -0
  503. package/dist/util/gitConfig.js.map +1 -0
  504. package/dist/util/isSchemaError.js +11 -0
  505. package/dist/util/isSchemaError.js.map +1 -0
  506. package/dist/util/isTar.js +8 -0
  507. package/dist/util/isTar.js.map +1 -0
  508. package/dist/util/packageManager/getPeerDependencies.js +44 -0
  509. package/dist/util/packageManager/getPeerDependencies.js.map +1 -0
  510. package/dist/util/packageManager/installationInfo/analyzeIssues.js +225 -0
  511. package/dist/util/packageManager/installationInfo/analyzeIssues.js.map +1 -0
  512. package/dist/util/packageManager/installationInfo/commands.js +73 -0
  513. package/dist/util/packageManager/installationInfo/commands.js.map +1 -0
  514. package/dist/util/packageManager/installationInfo/detectCliInstallation.js +66 -0
  515. package/dist/util/packageManager/installationInfo/detectCliInstallation.js.map +1 -0
  516. package/dist/util/packageManager/installationInfo/detectGlobals.js +295 -0
  517. package/dist/util/packageManager/installationInfo/detectGlobals.js.map +1 -0
  518. package/dist/util/packageManager/installationInfo/detectPackages.js +190 -0
  519. package/dist/util/packageManager/installationInfo/detectPackages.js.map +1 -0
  520. package/dist/util/packageManager/installationInfo/detectWorkspace.js +192 -0
  521. package/dist/util/packageManager/installationInfo/detectWorkspace.js.map +1 -0
  522. package/dist/util/packageManager/installationInfo/index.js +4 -0
  523. package/dist/util/packageManager/installationInfo/index.js.map +1 -0
  524. package/dist/util/packageManager/installationInfo/readJsonFile.js +14 -0
  525. package/dist/util/packageManager/installationInfo/readJsonFile.js.map +1 -0
  526. package/dist/util/packageManager/installationInfo/resolveVersionRange.js +42 -0
  527. package/dist/util/packageManager/installationInfo/resolveVersionRange.js.map +1 -0
  528. package/dist/util/packageManager/installationInfo/types.js +3 -0
  529. package/dist/util/packageManager/installationInfo/types.js.map +1 -0
  530. package/dist/util/packageManager/packageManagerChoice.js +1 -20
  531. package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
  532. package/dist/util/packageManager/upgradePackages.js +4 -1
  533. package/dist/util/packageManager/upgradePackages.js.map +1 -1
  534. package/dist/util/promiseRaceWithTimeout.js +28 -0
  535. package/dist/util/promiseRaceWithTimeout.js.map +1 -0
  536. package/dist/util/readdirRecursive.js.map +1 -1
  537. package/dist/util/resolveLatestVersions.js +2 -2
  538. package/dist/util/resolveLatestVersions.js.map +1 -1
  539. package/dist/util/sharedFlags.js +54 -0
  540. package/dist/util/sharedFlags.js.map +1 -0
  541. package/dist/util/telemetry/cleanupOldTelemetryFiles.js +30 -0
  542. package/dist/util/telemetry/cleanupOldTelemetryFiles.js.map +1 -0
  543. package/dist/util/telemetry/createTelemetryStore.js +95 -0
  544. package/dist/util/telemetry/createTelemetryStore.js.map +1 -0
  545. package/dist/util/telemetry/createTraceId.js +10 -0
  546. package/dist/util/telemetry/createTraceId.js.map +1 -0
  547. package/dist/util/telemetry/findTelemetryFiles.js +35 -0
  548. package/dist/util/telemetry/findTelemetryFiles.js.map +1 -0
  549. package/dist/util/telemetry/flushTelemetryFiles.js +118 -0
  550. package/dist/util/telemetry/flushTelemetryFiles.js.map +1 -0
  551. package/dist/util/telemetry/generateTelemetryFilePath.js +30 -0
  552. package/dist/util/telemetry/generateTelemetryFilePath.js.map +1 -0
  553. package/dist/util/telemetry/logger.js +59 -0
  554. package/dist/util/telemetry/logger.js.map +1 -0
  555. package/dist/util/telemetry/readNDJSON.js +28 -0
  556. package/dist/util/telemetry/readNDJSON.js.map +1 -0
  557. package/dist/util/telemetry/telemetryStoreDebug.js +7 -0
  558. package/dist/util/telemetry/telemetryStoreDebug.js.map +1 -0
  559. package/dist/util/telemetry/trace.js +150 -0
  560. package/dist/util/telemetry/trace.js.map +1 -0
  561. package/dist/util/toForwardSlashes.js +8 -0
  562. package/dist/util/toForwardSlashes.js.map +1 -0
  563. package/dist/util/update/fetchLatestVersion.js +21 -0
  564. package/dist/util/update/fetchLatestVersion.js.map +1 -0
  565. package/dist/util/update/getUpdateCommand.js +20 -0
  566. package/dist/util/update/getUpdateCommand.js.map +1 -0
  567. package/dist/util/update/isInstalledUsingYarn.js +17 -0
  568. package/dist/util/update/isInstalledUsingYarn.js.map +1 -0
  569. package/dist/util/update/showNotificationUpdate.js +31 -0
  570. package/dist/util/update/showNotificationUpdate.js.map +1 -0
  571. package/dist/util/update/updateChecker.js +60 -0
  572. package/dist/util/update/updateChecker.js.map +1 -0
  573. package/dist/util/update/updateCheckerDebug.js +4 -0
  574. package/dist/util/update/updateCheckerDebug.js.map +1 -0
  575. package/oclif.config.js +1 -0
  576. package/oclif.manifest.json +1285 -492
  577. package/package.json +72 -73
  578. package/static/favicons/apple-touch-icon.png +0 -0
  579. package/static/favicons/favicon-192.png +0 -0
  580. package/static/favicons/favicon-512.png +0 -0
  581. package/static/favicons/favicon-96.png +0 -0
  582. package/static/favicons/favicon.ico +0 -0
  583. package/static/favicons/favicon.svg +12 -0
  584. package/dist/actions/auth/login/promptProviders.js.map +0 -1
  585. package/dist/actions/dev/getCoreAppUrl.js +0 -10
  586. package/dist/actions/dev/getCoreAppUrl.js.map +0 -1
  587. package/dist/actions/schema/schemaStoreTypes.js +0 -19
  588. package/dist/actions/schema/schemaStoreTypes.js.map +0 -1
  589. package/dist/actions/schema/utils/manifestExtractor.js +0 -33
  590. package/dist/actions/schema/utils/manifestExtractor.js.map +0 -1
  591. package/dist/actions/schema/utils/manifestReader.js +0 -71
  592. package/dist/actions/schema/utils/manifestReader.js.map +0 -1
  593. package/dist/index.d.ts +0 -2326
  594. package/dist/index.js +0 -6
  595. package/dist/index.js.map +0 -1
  596. package/dist/studioDependencies.js.map +0 -1
  597. package/dist/typings/deepSortObject.d.js +0 -2
  598. package/dist/typings/deepSortObject.d.js.map +0 -1
  599. package/dist/util/findNdjsonEntry.js +0 -21
  600. package/dist/util/findNdjsonEntry.js.map +0 -1
  601. package/dist/util/importStudioConfig.js +0 -40
  602. package/dist/util/importStudioConfig.js.map +0 -1
  603. package/dist/util/readModuleVersion.js +0 -15
  604. package/dist/util/readModuleVersion.js.map +0 -1
  605. package/dist/util/readPackageJson.js +0 -44
  606. package/dist/util/readPackageJson.js.map +0 -1
  607. package/dist/util/readPackageManifest.js +0 -46
  608. package/dist/util/readPackageManifest.js.map +0 -1
  609. package/dist/util/uniqBy.js +0 -14
  610. package/dist/util/uniqBy.js.map +0 -1
  611. package/dist/util/workerChannels.js +0 -172
  612. package/dist/util/workerChannels.js.map +0 -1
  613. /package/dist/{studioDependencies.js → actions/init/studioDependencies.js} +0 -0
@@ -0,0 +1,24 @@
1
+ import { isMainThread, parentPort, workerData } from 'node:worker_threads';
2
+ import { getStudioWorkspaces, safeStructuredClone } from '@sanity/cli-core';
3
+ import { extractWorkspaceWorkerData } from './types.js';
4
+ import { extractValidationFromSchemaError } from './utils/extractValidationFromSchemaError.js';
5
+ if (isMainThread || !parentPort) {
6
+ throw new Error('Should only be run in a worker!');
7
+ }
8
+ const { configPath, workDir } = extractWorkspaceWorkerData.parse(workerData);
9
+ try {
10
+ const workspaces = await getStudioWorkspaces(configPath);
11
+ parentPort.postMessage({
12
+ type: 'success',
13
+ workspaces: safeStructuredClone(workspaces)
14
+ });
15
+ } catch (error) {
16
+ const validation = await extractValidationFromSchemaError(error, workDir);
17
+ parentPort.postMessage({
18
+ error: error instanceof Error ? error.message : String(error),
19
+ type: 'error',
20
+ validation
21
+ });
22
+ }
23
+
24
+ //# sourceMappingURL=extractSanityWorkspace.worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/schema/extractSanityWorkspace.worker.ts"],"sourcesContent":["import {isMainThread, parentPort, workerData} from 'node:worker_threads'\n\nimport {getStudioWorkspaces, safeStructuredClone} from '@sanity/cli-core'\n\nimport {extractWorkspaceWorkerData} from './types.js'\nimport {extractValidationFromSchemaError} from './utils/extractValidationFromSchemaError.js'\n\nif (isMainThread || !parentPort) {\n throw new Error('Should only be run in a worker!')\n}\n\nconst {configPath, workDir} = extractWorkspaceWorkerData.parse(workerData)\n\ntry {\n const workspaces = await getStudioWorkspaces(configPath)\n\n parentPort.postMessage({\n type: 'success',\n workspaces: safeStructuredClone(workspaces),\n })\n} catch (error) {\n const validation = await extractValidationFromSchemaError(error, workDir)\n parentPort.postMessage({\n error: error instanceof Error ? error.message : String(error),\n type: 'error',\n validation,\n })\n}\n"],"names":["isMainThread","parentPort","workerData","getStudioWorkspaces","safeStructuredClone","extractWorkspaceWorkerData","extractValidationFromSchemaError","Error","configPath","workDir","parse","workspaces","postMessage","type","error","validation","message","String"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,UAAU,EAAEC,UAAU,QAAO,sBAAqB;AAExE,SAAQC,mBAAmB,EAAEC,mBAAmB,QAAO,mBAAkB;AAEzE,SAAQC,0BAA0B,QAAO,aAAY;AACrD,SAAQC,gCAAgC,QAAO,8CAA6C;AAE5F,IAAIN,gBAAgB,CAACC,YAAY;IAC/B,MAAM,IAAIM,MAAM;AAClB;AAEA,MAAM,EAACC,UAAU,EAAEC,OAAO,EAAC,GAAGJ,2BAA2BK,KAAK,CAACR;AAE/D,IAAI;IACF,MAAMS,aAAa,MAAMR,oBAAoBK;IAE7CP,WAAWW,WAAW,CAAC;QACrBC,MAAM;QACNF,YAAYP,oBAAoBO;IAClC;AACF,EAAE,OAAOG,OAAO;IACd,MAAMC,aAAa,MAAMT,iCAAiCQ,OAAOL;IACjER,WAAWW,WAAW,CAAC;QACrBE,OAAOA,iBAAiBP,QAAQO,MAAME,OAAO,GAAGC,OAAOH;QACvDD,MAAM;QACNE;IACF;AACF"}
@@ -1,59 +1,27 @@
1
- import { mkdir, writeFile } from 'node:fs/promises';
2
- import { join, resolve } from 'node:path';
3
1
  import { exit } from '@oclif/core/errors';
4
- import { getCliTelemetry, studioWorkerTask } from '@sanity/cli-core';
2
+ import { getCliTelemetry } from '@sanity/cli-core';
5
3
  import { spinner } from '@sanity/cli-core/ux';
6
4
  import { SchemaExtractedTrace } from '../../telemetry/extractSchema.telemetry.js';
7
5
  import { formatSchemaValidation } from './formatSchemaValidation.js';
6
+ import { runSchemaExtraction } from './runSchemaExtraction.js';
8
7
  import { schemasExtractDebug } from './utils/debug.js';
9
- const FILENAME = 'schema.json';
10
- class SchemaExtractionError extends Error {
11
- validation;
12
- constructor(message, validation){
13
- super(message);
14
- this.name = 'SchemaExtractionError';
15
- this.validation = validation;
16
- }
17
- }
8
+ import { SchemaExtractionError } from './utils/SchemaExtractionError.js';
18
9
  export async function extractSchema(options) {
19
- const { flags, output, projectRoot } = options;
20
- const { 'enforce-required-fields': enforceRequiredFields, format, path, workspace: workspaceName } = flags;
10
+ const { extractOptions, output } = options;
11
+ const { enforceRequiredFields, format, outputPath } = extractOptions;
21
12
  const spin = spinner(enforceRequiredFields ? 'Extracting schema with enforced required fields' : 'Extracting schema').start();
22
- const workDir = projectRoot.directory;
23
13
  const trace = getCliTelemetry().trace(SchemaExtractedTrace);
24
14
  trace.start();
25
15
  try {
26
- if (format !== 'groq-type-nodes') {
27
- throw new Error(`Unsupported format: "${format}"`);
28
- }
29
- const result = await studioWorkerTask(new URL('extractSanitySchema.worker.js', import.meta.url), {
30
- name: 'extractSanitySchema',
31
- studioRootPath: workDir,
32
- workerData: {
33
- configPath: projectRoot.path,
34
- enforceRequiredFields,
35
- workDir,
36
- workspaceName
37
- }
38
- });
39
- if (result.type === 'error') {
40
- throw new SchemaExtractionError(result.error, result.validation);
41
- }
42
- const schema = result.schema;
16
+ spin.text = `Writing schema to ${outputPath}`;
17
+ const schema = await runSchemaExtraction(extractOptions);
43
18
  trace.log({
44
19
  enforceRequiredFields,
45
20
  schemaAllTypesCount: schema.length,
46
21
  schemaDocumentTypesCount: schema.filter((type)=>type.type === 'document').length,
47
- schemaFormat: flags.format || 'groq-type-nodes',
22
+ schemaFormat: format,
48
23
  schemaTypesCount: schema.filter((type)=>type.type === 'type').length
49
24
  });
50
- const outputDir = path ? resolve(join(workDir, path)) : workDir;
51
- const outputPath = join(outputDir, FILENAME);
52
- await mkdir(outputDir, {
53
- recursive: true
54
- });
55
- spin.text = `Writing schema to ${outputPath}`;
56
- await writeFile(outputPath, `${JSON.stringify(schema, null, 2)}\n`);
57
25
  spin.succeed(enforceRequiredFields ? `Extracted schema to ${outputPath} with enforced required fields` : `Extracted schema to ${outputPath}`);
58
26
  trace.complete();
59
27
  } catch (err) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/schema/extractSchema.ts"],"sourcesContent":["import {mkdir, writeFile} from 'node:fs/promises'\nimport {join, resolve} from 'node:path'\n\nimport {exit} from '@oclif/core/errors'\nimport {\n getCliTelemetry,\n type Output,\n type ProjectRootResult,\n studioWorkerTask,\n} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type extractSchema as extractSchemaInternal} from '@sanity/schema/_internal'\nimport {type SchemaValidationProblemGroup} from '@sanity/types'\n\nimport {type ExtractSchemaCommand} from '../../commands/schema/extract'\nimport {SchemaExtractedTrace} from '../../telemetry/extractSchema.telemetry.js'\nimport {formatSchemaValidation} from './formatSchemaValidation.js'\nimport {type ExtractSchemaWorkerData} from './types.js'\nimport {schemasExtractDebug} from './utils/debug.js'\n\nconst FILENAME = 'schema.json'\n\nclass SchemaExtractionError extends Error {\n validation?: SchemaValidationProblemGroup[]\n\n constructor(message: string, validation?: SchemaValidationProblemGroup[]) {\n super(message)\n this.name = 'SchemaExtractionError'\n this.validation = validation\n }\n}\n\ninterface ExtractSchemaOptions {\n flags: ExtractSchemaCommand['flags']\n output: Output\n projectRoot: ProjectRootResult\n}\n\ninterface ExtractSchemaWorkerResult {\n schema: ReturnType<typeof extractSchemaInternal>\n type: 'success'\n}\n\n/** @internal */\ninterface ExtractSchemaWorkerError {\n error: string\n type: 'error'\n\n validation?: SchemaValidationProblemGroup[]\n}\n\ntype ExtractSchemaWorkerMessage = ExtractSchemaWorkerError | ExtractSchemaWorkerResult\n\nexport async function extractSchema(options: ExtractSchemaOptions): Promise<void> {\n const {flags, output, projectRoot} = options\n const {\n 'enforce-required-fields': enforceRequiredFields,\n format,\n path,\n workspace: workspaceName,\n } = flags\n const spin = spinner(\n enforceRequiredFields ? 'Extracting schema with enforced required fields' : 'Extracting schema',\n ).start()\n\n const workDir = projectRoot.directory\n\n const trace = getCliTelemetry().trace(SchemaExtractedTrace)\n trace.start()\n\n try {\n if (format !== 'groq-type-nodes') {\n throw new Error(`Unsupported format: \"${format}\"`)\n }\n\n const result = await studioWorkerTask<ExtractSchemaWorkerMessage>(\n new URL('extractSanitySchema.worker.js', import.meta.url),\n {\n name: 'extractSanitySchema',\n studioRootPath: workDir,\n workerData: {\n configPath: projectRoot.path,\n enforceRequiredFields,\n workDir,\n workspaceName,\n } satisfies ExtractSchemaWorkerData,\n },\n )\n\n if (result.type === 'error') {\n throw new SchemaExtractionError(result.error, result.validation)\n }\n\n const schema = result.schema\n\n trace.log({\n enforceRequiredFields,\n schemaAllTypesCount: schema.length,\n schemaDocumentTypesCount: schema.filter((type) => type.type === 'document').length,\n schemaFormat: flags.format || 'groq-type-nodes',\n schemaTypesCount: schema.filter((type) => type.type === 'type').length,\n })\n\n const outputDir = path ? resolve(join(workDir, path)) : workDir\n const outputPath = join(outputDir, FILENAME)\n await mkdir(outputDir, {recursive: true})\n\n spin.text = `Writing schema to ${outputPath}`\n\n await writeFile(outputPath, `${JSON.stringify(schema, null, 2)}\\n`)\n\n spin.succeed(\n enforceRequiredFields\n ? `Extracted schema to ${outputPath} with enforced required fields`\n : `Extracted schema to ${outputPath}`,\n )\n\n trace.complete()\n } catch (err) {\n trace.error(err)\n schemasExtractDebug('Failed to extract schema', err)\n spin.fail(\n enforceRequiredFields\n ? 'Failed to extract schema with enforced required fields'\n : 'Failed to extract schema',\n )\n\n // Display validation errors if available\n if (err instanceof SchemaExtractionError && err.validation && err.validation.length > 0) {\n output.log('')\n output.log(formatSchemaValidation(err.validation))\n }\n\n if (err instanceof Error) {\n output.error(err.message, {exit: 1})\n }\n\n exit(1)\n }\n}\n"],"names":["mkdir","writeFile","join","resolve","exit","getCliTelemetry","studioWorkerTask","spinner","SchemaExtractedTrace","formatSchemaValidation","schemasExtractDebug","FILENAME","SchemaExtractionError","Error","validation","message","name","extractSchema","options","flags","output","projectRoot","enforceRequiredFields","format","path","workspace","workspaceName","spin","start","workDir","directory","trace","result","URL","url","studioRootPath","workerData","configPath","type","error","schema","log","schemaAllTypesCount","length","schemaDocumentTypesCount","filter","schemaFormat","schemaTypesCount","outputDir","outputPath","recursive","text","JSON","stringify","succeed","complete","err","fail"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/schema/extractSchema.ts"],"sourcesContent":["import {exit} from '@oclif/core/errors'\nimport {getCliTelemetry, type Output} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {SchemaExtractedTrace} from '../../telemetry/extractSchema.telemetry.js'\nimport {formatSchemaValidation} from './formatSchemaValidation.js'\nimport {type ExtractOptions} from './getExtractOptions.js'\nimport {runSchemaExtraction} from './runSchemaExtraction.js'\nimport {schemasExtractDebug} from './utils/debug.js'\nimport {SchemaExtractionError} from './utils/SchemaExtractionError.js'\n\ninterface ExtractSchemaActionOptions {\n extractOptions: ExtractOptions\n output: Output\n}\n\nexport async function extractSchema(options: ExtractSchemaActionOptions): Promise<void> {\n const {extractOptions, output} = options\n const {enforceRequiredFields, format, outputPath} = extractOptions\n\n const spin = spinner(\n enforceRequiredFields ? 'Extracting schema with enforced required fields' : 'Extracting schema',\n ).start()\n\n const trace = getCliTelemetry().trace(SchemaExtractedTrace)\n trace.start()\n\n try {\n spin.text = `Writing schema to ${outputPath}`\n\n const schema = await runSchemaExtraction(extractOptions)\n\n trace.log({\n enforceRequiredFields,\n schemaAllTypesCount: schema.length,\n schemaDocumentTypesCount: schema.filter((type) => type.type === 'document').length,\n schemaFormat: format,\n schemaTypesCount: schema.filter((type) => type.type === 'type').length,\n })\n\n spin.succeed(\n enforceRequiredFields\n ? `Extracted schema to ${outputPath} with enforced required fields`\n : `Extracted schema to ${outputPath}`,\n )\n\n trace.complete()\n } catch (err) {\n trace.error(err)\n schemasExtractDebug('Failed to extract schema', err)\n spin.fail(\n enforceRequiredFields\n ? 'Failed to extract schema with enforced required fields'\n : 'Failed to extract schema',\n )\n\n // Display validation errors if available\n if (err instanceof SchemaExtractionError && err.validation && err.validation.length > 0) {\n output.log('')\n output.log(formatSchemaValidation(err.validation))\n }\n\n if (err instanceof Error) {\n output.error(err.message, {exit: 1})\n }\n\n exit(1)\n }\n}\n"],"names":["exit","getCliTelemetry","spinner","SchemaExtractedTrace","formatSchemaValidation","runSchemaExtraction","schemasExtractDebug","SchemaExtractionError","extractSchema","options","extractOptions","output","enforceRequiredFields","format","outputPath","spin","start","trace","text","schema","log","schemaAllTypesCount","length","schemaDocumentTypesCount","filter","type","schemaFormat","schemaTypesCount","succeed","complete","err","error","fail","validation","Error","message"],"mappings":"AAAA,SAAQA,IAAI,QAAO,qBAAoB;AACvC,SAAQC,eAAe,QAAoB,mBAAkB;AAC7D,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,oBAAoB,QAAO,6CAA4C;AAC/E,SAAQC,sBAAsB,QAAO,8BAA6B;AAElE,SAAQC,mBAAmB,QAAO,2BAA0B;AAC5D,SAAQC,mBAAmB,QAAO,mBAAkB;AACpD,SAAQC,qBAAqB,QAAO,mCAAkC;AAOtE,OAAO,eAAeC,cAAcC,OAAmC;IACrE,MAAM,EAACC,cAAc,EAAEC,MAAM,EAAC,GAAGF;IACjC,MAAM,EAACG,qBAAqB,EAAEC,MAAM,EAAEC,UAAU,EAAC,GAAGJ;IAEpD,MAAMK,OAAOb,QACXU,wBAAwB,oDAAoD,qBAC5EI,KAAK;IAEP,MAAMC,QAAQhB,kBAAkBgB,KAAK,CAACd;IACtCc,MAAMD,KAAK;IAEX,IAAI;QACFD,KAAKG,IAAI,GAAG,CAAC,kBAAkB,EAAEJ,YAAY;QAE7C,MAAMK,SAAS,MAAMd,oBAAoBK;QAEzCO,MAAMG,GAAG,CAAC;YACRR;YACAS,qBAAqBF,OAAOG,MAAM;YAClCC,0BAA0BJ,OAAOK,MAAM,CAAC,CAACC,OAASA,KAAKA,IAAI,KAAK,YAAYH,MAAM;YAClFI,cAAcb;YACdc,kBAAkBR,OAAOK,MAAM,CAAC,CAACC,OAASA,KAAKA,IAAI,KAAK,QAAQH,MAAM;QACxE;QAEAP,KAAKa,OAAO,CACVhB,wBACI,CAAC,oBAAoB,EAAEE,WAAW,8BAA8B,CAAC,GACjE,CAAC,oBAAoB,EAAEA,YAAY;QAGzCG,MAAMY,QAAQ;IAChB,EAAE,OAAOC,KAAK;QACZb,MAAMc,KAAK,CAACD;QACZxB,oBAAoB,4BAA4BwB;QAChDf,KAAKiB,IAAI,CACPpB,wBACI,2DACA;QAGN,yCAAyC;QACzC,IAAIkB,eAAevB,yBAAyBuB,IAAIG,UAAU,IAAIH,IAAIG,UAAU,CAACX,MAAM,GAAG,GAAG;YACvFX,OAAOS,GAAG,CAAC;YACXT,OAAOS,GAAG,CAAChB,uBAAuB0B,IAAIG,UAAU;QAClD;QAEA,IAAIH,eAAeI,OAAO;YACxBvB,OAAOoB,KAAK,CAACD,IAAIK,OAAO,EAAE;gBAACnC,MAAM;YAAC;QACpC;QAEAA,KAAK;IACP;AACF"}
@@ -0,0 +1,128 @@
1
+ import { dirname, isAbsolute, join, relative } from 'node:path';
2
+ import { spinner } from '@sanity/cli-core/ux';
3
+ import { watch as chokidarWatch } from 'chokidar';
4
+ import debounce from 'lodash-es/debounce.js';
5
+ import { formatSchemaValidation } from './formatSchemaValidation.js';
6
+ import { createSchemaPatternMatcher } from './matchSchemaPattern.js';
7
+ import { runSchemaExtraction } from './runSchemaExtraction.js';
8
+ import { schemasExtractDebug } from './utils/debug.js';
9
+ import { SchemaExtractionError } from './utils/SchemaExtractionError.js';
10
+ /** Default glob patterns to watch for schema changes */ export const DEFAULT_WATCH_PATTERNS = [
11
+ 'sanity.config.{js,jsx,ts,tsx,mjs}',
12
+ 'schema*/**/*.{js,jsx,ts,tsx,mjs}'
13
+ ];
14
+ /** Default patterns to ignore when watching */ const IGNORED_PATTERNS = [
15
+ '**/node_modules/**',
16
+ '**/.git/**',
17
+ '**/dist/**',
18
+ '**/lib/**',
19
+ '**/.sanity/**'
20
+ ];
21
+ /**
22
+ * Creates an extraction runner with concurrency control.
23
+ * If extraction is already running, queues one more extraction to run after completion.
24
+ * Multiple queued requests are coalesced into a single pending extraction.
25
+ */ function createExtractionRunner(onExtract) {
26
+ const state = {
27
+ isExtracting: false,
28
+ pendingExtraction: false
29
+ };
30
+ async function runExtraction() {
31
+ if (state.isExtracting) {
32
+ state.pendingExtraction = true;
33
+ return;
34
+ }
35
+ state.isExtracting = true;
36
+ state.pendingExtraction = false;
37
+ try {
38
+ await onExtract();
39
+ } finally{
40
+ state.isExtracting = false;
41
+ // If a change came in during extraction, run again
42
+ if (state.pendingExtraction) {
43
+ state.pendingExtraction = false;
44
+ await runExtraction();
45
+ }
46
+ }
47
+ }
48
+ return {
49
+ runExtraction,
50
+ state
51
+ };
52
+ }
53
+ /**
54
+ * Starts a schema watcher that extracts schema on file changes.
55
+ * Returns a watcher instance and a stop function.
56
+ */ export async function startExtractSchemaWatcher(options) {
57
+ const { extractOptions, onExtraction, output, watchPatterns } = options;
58
+ const { configPath, enforceRequiredFields, outputPath } = extractOptions;
59
+ const workDir = dirname(configPath);
60
+ // Helper function to run extraction with spinner and error handling
61
+ const runExtraction = async ()=>{
62
+ const spin = spinner(enforceRequiredFields ? 'Extracting schema with enforced required fields' : 'Extracting schema...').start();
63
+ const extractionStartTime = Date.now();
64
+ try {
65
+ await runSchemaExtraction(extractOptions);
66
+ spin.succeed(enforceRequiredFields ? `Extracted schema to ${outputPath} with enforced required fields` : `Extracted schema to ${outputPath}`);
67
+ const duration = Date.now() - extractionStartTime;
68
+ onExtraction?.({
69
+ duration,
70
+ success: true
71
+ });
72
+ return true;
73
+ } catch (err) {
74
+ const duration = Date.now() - extractionStartTime;
75
+ onExtraction?.({
76
+ duration,
77
+ success: false
78
+ });
79
+ schemasExtractDebug('Failed to extract schema', err);
80
+ spin.fail('Extraction failed');
81
+ // Display validation errors if available
82
+ if (err instanceof SchemaExtractionError && err.validation && err.validation.length > 0) {
83
+ output.log('');
84
+ output.log(formatSchemaValidation(err.validation));
85
+ } else if (err instanceof Error) {
86
+ output.error(err.message, {
87
+ exit: 1
88
+ });
89
+ }
90
+ return false;
91
+ }
92
+ };
93
+ // Run initial extraction
94
+ await runExtraction();
95
+ const absoluteWatchPatterns = watchPatterns.map((pattern)=>join(workDir, pattern));
96
+ // Create extraction runner with concurrency control
97
+ const { runExtraction: runConcurrentExtraction } = createExtractionRunner(async ()=>{
98
+ await runExtraction();
99
+ });
100
+ // Debounced extraction trigger (1 second delay)
101
+ const debouncedExtract = debounce(()=>{
102
+ void runConcurrentExtraction();
103
+ }, 1000);
104
+ const { isMatch } = createSchemaPatternMatcher(watchPatterns);
105
+ const watcher = chokidarWatch(absoluteWatchPatterns, {
106
+ cwd: workDir,
107
+ ignored: IGNORED_PATTERNS,
108
+ ignoreInitial: true
109
+ });
110
+ watcher.on('all', (event, filePath)=>{
111
+ if (!isMatch(filePath, workDir)) {
112
+ return;
113
+ }
114
+ const timestamp = new Date().toLocaleTimeString();
115
+ const relativePath = isAbsolute(filePath) ? relative(workDir, filePath) : filePath;
116
+ output.log(`[${timestamp}] ${event}: ${relativePath}`);
117
+ debouncedExtract();
118
+ });
119
+ watcher.on('error', (err)=>{
120
+ output.error(`Watcher error: ${err instanceof Error ? err.message : String(err)}`);
121
+ });
122
+ return {
123
+ close: ()=>watcher.close(),
124
+ watcher
125
+ };
126
+ }
127
+
128
+ //# sourceMappingURL=extractSchemaWatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/schema/extractSchemaWatcher.ts"],"sourcesContent":["import {dirname, isAbsolute, join, relative} from 'node:path'\n\nimport {type Output} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {watch as chokidarWatch, type FSWatcher} from 'chokidar'\nimport debounce from 'lodash-es/debounce.js'\n\nimport {formatSchemaValidation} from './formatSchemaValidation.js'\nimport {type ExtractOptions} from './getExtractOptions.js'\nimport {createSchemaPatternMatcher} from './matchSchemaPattern.js'\nimport {runSchemaExtraction} from './runSchemaExtraction.js'\nimport {schemasExtractDebug} from './utils/debug.js'\nimport {SchemaExtractionError} from './utils/SchemaExtractionError.js'\n\n/** Default glob patterns to watch for schema changes */\nexport const DEFAULT_WATCH_PATTERNS = [\n 'sanity.config.{js,jsx,ts,tsx,mjs}',\n 'schema*/**/*.{js,jsx,ts,tsx,mjs}',\n]\n\n/** Default patterns to ignore when watching */\nconst IGNORED_PATTERNS = [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/lib/**',\n '**/.sanity/**',\n]\n\ninterface ExtractSchemaWatcherOptions {\n extractOptions: ExtractOptions\n output: Output\n watchPatterns: string[]\n\n onExtraction?: (result: {duration: number; success: boolean}) => void\n}\n\ninterface ExtractSchemaWatcher {\n close: () => Promise<void>\n watcher: FSWatcher\n}\n\n/** State for tracking extraction status */\ninterface WatchState {\n isExtracting: boolean\n pendingExtraction: boolean\n}\n\n/** Return type for createExtractionRunner */\ninterface ExtractionRunner {\n runExtraction: () => Promise<void>\n state: WatchState\n}\n\n/**\n * Creates an extraction runner with concurrency control.\n * If extraction is already running, queues one more extraction to run after completion.\n * Multiple queued requests are coalesced into a single pending extraction.\n */\nfunction createExtractionRunner(onExtract: () => Promise<void>): ExtractionRunner {\n const state: WatchState = {\n isExtracting: false,\n pendingExtraction: false,\n }\n\n async function runExtraction(): Promise<void> {\n if (state.isExtracting) {\n state.pendingExtraction = true\n return\n }\n\n state.isExtracting = true\n state.pendingExtraction = false\n\n try {\n await onExtract()\n } finally {\n state.isExtracting = false\n\n // If a change came in during extraction, run again\n if (state.pendingExtraction) {\n state.pendingExtraction = false\n await runExtraction()\n }\n }\n }\n\n return {runExtraction, state}\n}\n\n/**\n * Starts a schema watcher that extracts schema on file changes.\n * Returns a watcher instance and a stop function.\n */\nexport async function startExtractSchemaWatcher(\n options: ExtractSchemaWatcherOptions,\n): Promise<ExtractSchemaWatcher> {\n const {extractOptions, onExtraction, output, watchPatterns} = options\n\n const {configPath, enforceRequiredFields, outputPath} = extractOptions\n const workDir = dirname(configPath)\n\n // Helper function to run extraction with spinner and error handling\n const runExtraction = async (): Promise<boolean> => {\n const spin = spinner(\n enforceRequiredFields\n ? 'Extracting schema with enforced required fields'\n : 'Extracting schema...',\n ).start()\n const extractionStartTime = Date.now()\n\n try {\n await runSchemaExtraction(extractOptions)\n\n spin.succeed(\n enforceRequiredFields\n ? `Extracted schema to ${outputPath} with enforced required fields`\n : `Extracted schema to ${outputPath}`,\n )\n\n const duration = Date.now() - extractionStartTime\n onExtraction?.({duration, success: true})\n\n return true\n } catch (err) {\n const duration = Date.now() - extractionStartTime\n onExtraction?.({duration, success: false})\n\n schemasExtractDebug('Failed to extract schema', err)\n spin.fail('Extraction failed')\n\n // Display validation errors if available\n if (err instanceof SchemaExtractionError && err.validation && err.validation.length > 0) {\n output.log('')\n output.log(formatSchemaValidation(err.validation))\n } else if (err instanceof Error) {\n output.error(err.message, {exit: 1})\n }\n\n return false\n }\n }\n\n // Run initial extraction\n await runExtraction()\n\n const absoluteWatchPatterns = watchPatterns.map((pattern) => join(workDir, pattern))\n\n // Create extraction runner with concurrency control\n const {runExtraction: runConcurrentExtraction} = createExtractionRunner(async () => {\n await runExtraction()\n })\n\n // Debounced extraction trigger (1 second delay)\n const debouncedExtract = debounce(() => {\n void runConcurrentExtraction()\n }, 1000)\n\n const {isMatch} = createSchemaPatternMatcher(watchPatterns)\n\n const watcher: FSWatcher = chokidarWatch(absoluteWatchPatterns, {\n cwd: workDir,\n ignored: IGNORED_PATTERNS,\n ignoreInitial: true,\n })\n\n watcher.on('all', (event, filePath) => {\n if (!isMatch(filePath, workDir)) {\n return\n }\n\n const timestamp = new Date().toLocaleTimeString()\n const relativePath = isAbsolute(filePath) ? relative(workDir, filePath) : filePath\n output.log(`[${timestamp}] ${event}: ${relativePath}`)\n debouncedExtract()\n })\n\n watcher.on('error', (err) => {\n output.error(`Watcher error: ${err instanceof Error ? err.message : String(err)}`)\n })\n\n return {\n close: () => watcher.close(),\n watcher,\n }\n}\n"],"names":["dirname","isAbsolute","join","relative","spinner","watch","chokidarWatch","debounce","formatSchemaValidation","createSchemaPatternMatcher","runSchemaExtraction","schemasExtractDebug","SchemaExtractionError","DEFAULT_WATCH_PATTERNS","IGNORED_PATTERNS","createExtractionRunner","onExtract","state","isExtracting","pendingExtraction","runExtraction","startExtractSchemaWatcher","options","extractOptions","onExtraction","output","watchPatterns","configPath","enforceRequiredFields","outputPath","workDir","spin","start","extractionStartTime","Date","now","succeed","duration","success","err","fail","validation","length","log","Error","error","message","exit","absoluteWatchPatterns","map","pattern","runConcurrentExtraction","debouncedExtract","isMatch","watcher","cwd","ignored","ignoreInitial","on","event","filePath","timestamp","toLocaleTimeString","relativePath","String","close"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { isatty } from 'node:tty';
2
2
  import { styleText } from 'node:util';
3
3
  import { logSymbols } from '@sanity/cli-core/ux';
4
+ import { generateHelpUrl } from '@sanity/generate-help-url';
4
5
  const isTty = isatty(1);
5
6
  const headers = {
6
7
  error: isTty ? styleText([
@@ -63,7 +64,10 @@ export function formatSchemaValidation(validation) {
63
64
  const header = `${headers[getAggregatedSeverity(groups)]} ${formattedTopLevelType}`;
64
65
  const body = groups.toSorted((a, b)=>severityValues[getAggregatedSeverity(a)] - severityValues[getAggregatedSeverity(b)]).map((group)=>{
65
66
  const formattedPath = ` ${styleText('bold', formatPath(group.path) || '(root)')}`;
66
- const formattedMessages = group.problems.toSorted((a, b)=>severityValues[a.severity] - severityValues[b.severity]).map(({ message, severity })=>` ${logSymbols[severity]} ${message}`).join('\n');
67
+ const formattedMessages = group.problems.toSorted((a, b)=>severityValues[a.severity] - severityValues[b.severity]).map(({ helpId, message, severity })=>{
68
+ const help = helpId ? `\n See ${generateHelpUrl(helpId)}` : '';
69
+ return ` ${logSymbols[severity]} ${message}${help}`;
70
+ }).join('\n');
67
71
  return `${formattedPath}\n${formattedMessages}`;
68
72
  }).join('\n');
69
73
  return `${header}\n${body}`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/schema/formatSchemaValidation.ts"],"sourcesContent":["import {isatty} from 'node:tty'\nimport {styleText} from 'node:util'\n\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport {type SchemaValidationProblemGroup, type SchemaValidationProblemPath} from '@sanity/types'\n\nconst isTty = isatty(1)\n\nconst headers = {\n error: isTty ? styleText(['bold', 'bgRed', 'black'], ' ERROR ') : styleText('red', '[ERROR]'),\n warning: isTty\n ? styleText(['bold', 'bgYellow', 'black'], ' WARN ')\n : styleText('yellow', '[WARN]'),\n}\n\nconst severityValues = {error: 0, warning: 1}\n\nfunction formatPath(pathSegments: SchemaValidationProblemPath) {\n const format = (\n [curr, ...next]: SchemaValidationProblemPath,\n mode: 'array' | 'object' = 'object',\n ): string => {\n if (!curr) return ''\n if (curr.kind === 'property') return format(next, curr.name === 'of' ? 'array' : 'object')\n\n const name = curr.name || `<anonymous_${curr.type}>`\n return `${mode === 'array' ? `[${name}]` : `.${name}`}${format(next)}`\n }\n\n return format(pathSegments.slice(1)).slice(1) // removes the top-level type and leading `.`\n}\n\nexport function getAggregatedSeverity(\n groupOrGroups: SchemaValidationProblemGroup | SchemaValidationProblemGroup[],\n): 'error' | 'warning' {\n const groups = Array.isArray(groupOrGroups) ? groupOrGroups : [groupOrGroups]\n return groups\n .flatMap((group) => group.problems.map((problem) => problem.severity))\n .includes('error')\n ? 'error'\n : 'warning'\n}\n\nexport function formatSchemaValidation(validation: SchemaValidationProblemGroup[]): string {\n let unnamedTopLevelTypeCount = 0\n const validationByTypeMap: Record<string, SchemaValidationProblemGroup[]> = {}\n\n for (const group of validation) {\n const [firstSegment] = group.path\n if (!firstSegment) continue\n if (firstSegment.kind !== 'type') continue\n\n const topLevelType =\n firstSegment.name || `<unnamed_${firstSegment.type}_type_${unnamedTopLevelTypeCount++}>`\n\n if (!validationByTypeMap[topLevelType]) {\n validationByTypeMap[topLevelType] = []\n }\n\n validationByTypeMap[topLevelType].push(group)\n }\n\n const validationByType = Object.entries(validationByTypeMap)\n\n const formatted = validationByType\n .toSorted((a, b) => {\n const [aType, aGroups] = a\n const [bType, bGroups] = b\n const aValue = severityValues[getAggregatedSeverity(aGroups)]\n const bValue = severityValues[getAggregatedSeverity(bGroups)]\n if (aValue === bValue) return aType.localeCompare(bType, 'en-US')\n return aValue - bValue\n })\n .map(([topLevelType, groups]) => {\n const formattedTopLevelType = isTty\n ? styleText(['bgWhite', 'black'], ` ${topLevelType} `)\n : `[${topLevelType}]`\n\n const header = `${headers[getAggregatedSeverity(groups)]} ${formattedTopLevelType}`\n const body = groups\n .toSorted(\n (a, b) =>\n severityValues[getAggregatedSeverity(a)] - severityValues[getAggregatedSeverity(b)],\n )\n .map((group) => {\n const formattedPath = ` ${styleText('bold', formatPath(group.path) || '(root)')}`\n const formattedMessages = group.problems\n .toSorted((a, b) => severityValues[a.severity] - severityValues[b.severity])\n .map(({message, severity}) => ` ${logSymbols[severity]} ${message}`)\n .join('\\n')\n\n return `${formattedPath}\\n${formattedMessages}`\n })\n .join('\\n')\n\n return `${header}\\n${body}`\n })\n .join('\\n\\n')\n\n return formatted\n}\n"],"names":["isatty","styleText","logSymbols","isTty","headers","error","warning","severityValues","formatPath","pathSegments","format","curr","next","mode","kind","name","type","slice","getAggregatedSeverity","groupOrGroups","groups","Array","isArray","flatMap","group","problems","map","problem","severity","includes","formatSchemaValidation","validation","unnamedTopLevelTypeCount","validationByTypeMap","firstSegment","path","topLevelType","push","validationByType","Object","entries","formatted","toSorted","a","b","aType","aGroups","bType","bGroups","aValue","bValue","localeCompare","formattedTopLevelType","header","body","formattedPath","formattedMessages","message","join"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/schema/formatSchemaValidation.ts"],"sourcesContent":["import {isatty} from 'node:tty'\nimport {styleText} from 'node:util'\n\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport {generateHelpUrl} from '@sanity/generate-help-url'\nimport {type SchemaValidationProblemGroup, type SchemaValidationProblemPath} from '@sanity/types'\n\nconst isTty = isatty(1)\n\nconst headers = {\n error: isTty ? styleText(['bold', 'bgRed', 'black'], ' ERROR ') : styleText('red', '[ERROR]'),\n warning: isTty\n ? styleText(['bold', 'bgYellow', 'black'], ' WARN ')\n : styleText('yellow', '[WARN]'),\n}\n\nconst severityValues = {error: 0, warning: 1}\n\nfunction formatPath(pathSegments: SchemaValidationProblemPath) {\n const format = (\n [curr, ...next]: SchemaValidationProblemPath,\n mode: 'array' | 'object' = 'object',\n ): string => {\n if (!curr) return ''\n if (curr.kind === 'property') return format(next, curr.name === 'of' ? 'array' : 'object')\n\n const name = curr.name || `<anonymous_${curr.type}>`\n return `${mode === 'array' ? `[${name}]` : `.${name}`}${format(next)}`\n }\n\n return format(pathSegments.slice(1)).slice(1) // removes the top-level type and leading `.`\n}\n\nexport function getAggregatedSeverity(\n groupOrGroups: SchemaValidationProblemGroup | SchemaValidationProblemGroup[],\n): 'error' | 'warning' {\n const groups = Array.isArray(groupOrGroups) ? groupOrGroups : [groupOrGroups]\n return groups\n .flatMap((group) => group.problems.map((problem) => problem.severity))\n .includes('error')\n ? 'error'\n : 'warning'\n}\n\nexport function formatSchemaValidation(validation: SchemaValidationProblemGroup[]): string {\n let unnamedTopLevelTypeCount = 0\n const validationByTypeMap: Record<string, SchemaValidationProblemGroup[]> = {}\n\n for (const group of validation) {\n const [firstSegment] = group.path\n if (!firstSegment) continue\n if (firstSegment.kind !== 'type') continue\n\n const topLevelType =\n firstSegment.name || `<unnamed_${firstSegment.type}_type_${unnamedTopLevelTypeCount++}>`\n\n if (!validationByTypeMap[topLevelType]) {\n validationByTypeMap[topLevelType] = []\n }\n\n validationByTypeMap[topLevelType].push(group)\n }\n\n const validationByType = Object.entries(validationByTypeMap)\n\n const formatted = validationByType\n .toSorted((a, b) => {\n const [aType, aGroups] = a\n const [bType, bGroups] = b\n const aValue = severityValues[getAggregatedSeverity(aGroups)]\n const bValue = severityValues[getAggregatedSeverity(bGroups)]\n if (aValue === bValue) return aType.localeCompare(bType, 'en-US')\n return aValue - bValue\n })\n .map(([topLevelType, groups]) => {\n const formattedTopLevelType = isTty\n ? styleText(['bgWhite', 'black'], ` ${topLevelType} `)\n : `[${topLevelType}]`\n\n const header = `${headers[getAggregatedSeverity(groups)]} ${formattedTopLevelType}`\n const body = groups\n .toSorted(\n (a, b) =>\n severityValues[getAggregatedSeverity(a)] - severityValues[getAggregatedSeverity(b)],\n )\n .map((group) => {\n const formattedPath = ` ${styleText('bold', formatPath(group.path) || '(root)')}`\n const formattedMessages = group.problems\n .toSorted((a, b) => severityValues[a.severity] - severityValues[b.severity])\n .map(({helpId, message, severity}) => {\n const help = helpId ? `\\n See ${generateHelpUrl(helpId)}` : ''\n return ` ${logSymbols[severity]} ${message}${help}`\n })\n .join('\\n')\n\n return `${formattedPath}\\n${formattedMessages}`\n })\n .join('\\n')\n\n return `${header}\\n${body}`\n })\n .join('\\n\\n')\n\n return formatted\n}\n"],"names":["isatty","styleText","logSymbols","generateHelpUrl","isTty","headers","error","warning","severityValues","formatPath","pathSegments","format","curr","next","mode","kind","name","type","slice","getAggregatedSeverity","groupOrGroups","groups","Array","isArray","flatMap","group","problems","map","problem","severity","includes","formatSchemaValidation","validation","unnamedTopLevelTypeCount","validationByTypeMap","firstSegment","path","topLevelType","push","validationByType","Object","entries","formatted","toSorted","a","b","aType","aGroups","bType","bGroups","aValue","bValue","localeCompare","formattedTopLevelType","header","body","formattedPath","formattedMessages","helpId","message","help","join"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { join, resolve } from 'node:path';
2
+ export function getExtractOptions({ flags, projectRoot, schemaExtraction }) {
3
+ const pathFlag = flags.path ?? schemaExtraction?.path;
4
+ const outputDir = pathFlag ? resolve(join(projectRoot.directory, pathFlag)) : projectRoot.directory;
5
+ const outputPath = join(outputDir, 'schema.json');
6
+ return {
7
+ configPath: projectRoot.path,
8
+ enforceRequiredFields: flags['enforce-required-fields'] ?? schemaExtraction?.enforceRequiredFields ?? false,
9
+ format: flags.format ?? 'groq-type-nodes',
10
+ outputPath,
11
+ watchPatterns: flags['watch-patterns'] ?? schemaExtraction?.watchPatterns ?? [],
12
+ workspace: flags.workspace ?? schemaExtraction?.workspace
13
+ };
14
+ }
15
+
16
+ //# sourceMappingURL=getExtractOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/schema/getExtractOptions.ts"],"sourcesContent":["import {join, resolve} from 'node:path'\n\nimport {type CliConfig, ProjectRootResult} from '@sanity/cli-core'\n\nimport {type ExtractSchemaCommand} from '../../commands/schema/extract.js'\n\nexport interface ExtractOptions {\n configPath: string\n enforceRequiredFields: boolean\n format: string\n outputPath: string\n watchPatterns: string[]\n workspace: string | undefined\n}\n\ninterface GetExtractionOptions {\n flags: ExtractSchemaCommand['flags']\n projectRoot: ProjectRootResult\n schemaExtraction: CliConfig['schemaExtraction']\n}\n\nexport function getExtractOptions({\n flags,\n projectRoot,\n schemaExtraction,\n}: GetExtractionOptions): ExtractOptions {\n const pathFlag = flags.path ?? schemaExtraction?.path\n const outputDir = pathFlag\n ? resolve(join(projectRoot.directory, pathFlag))\n : projectRoot.directory\n const outputPath = join(outputDir, 'schema.json')\n\n return {\n configPath: projectRoot.path,\n enforceRequiredFields:\n flags['enforce-required-fields'] ?? schemaExtraction?.enforceRequiredFields ?? false,\n format: flags.format ?? 'groq-type-nodes',\n outputPath,\n watchPatterns: flags['watch-patterns'] ?? schemaExtraction?.watchPatterns ?? [],\n workspace: flags.workspace ?? schemaExtraction?.workspace,\n }\n}\n"],"names":["join","resolve","getExtractOptions","flags","projectRoot","schemaExtraction","pathFlag","path","outputDir","directory","outputPath","configPath","enforceRequiredFields","format","watchPatterns","workspace"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,OAAO,QAAO,YAAW;AAqBvC,OAAO,SAASC,kBAAkB,EAChCC,KAAK,EACLC,WAAW,EACXC,gBAAgB,EACK;IACrB,MAAMC,WAAWH,MAAMI,IAAI,IAAIF,kBAAkBE;IACjD,MAAMC,YAAYF,WACdL,QAAQD,KAAKI,YAAYK,SAAS,EAAEH,aACpCF,YAAYK,SAAS;IACzB,MAAMC,aAAaV,KAAKQ,WAAW;IAEnC,OAAO;QACLG,YAAYP,YAAYG,IAAI;QAC5BK,uBACET,KAAK,CAAC,0BAA0B,IAAIE,kBAAkBO,yBAAyB;QACjFC,QAAQV,MAAMU,MAAM,IAAI;QACxBH;QACAI,eAAeX,KAAK,CAAC,iBAAiB,IAAIE,kBAAkBS,iBAAiB,EAAE;QAC/EC,WAAWZ,MAAMY,SAAS,IAAIV,kBAAkBU;IAClD;AACF"}
@@ -1,12 +1,11 @@
1
1
  import { styleText } from 'node:util';
2
+ import { studioWorkerTask } from '@sanity/cli-core';
3
+ import { logSymbols } from '@sanity/cli-core/ux';
4
+ import { Table } from 'console-table-printer';
2
5
  import { getSchemas } from '../../services/schemas.js';
3
6
  import { isDefined } from '../manifest/schemaTypeHelpers.js';
4
- import { schemasListDebug } from './utils/debug.js';
5
- import { ensureManifestExtractSatisfied } from './utils/manifestExtractor.js';
6
- import { createManifestReader } from './utils/manifestReader.js';
7
7
  import { getDatasetsOutString } from './utils/schemaStoreOutStrings.js';
8
8
  import { SCHEMA_PERMISSION_HELP_TEXT } from './utils/schemaStoreValidation.js';
9
- import { uniqByProjectIdDataset } from './utils/uniqByProjectIdDataset.js';
10
9
  class DatasetError extends Error {
11
10
  dataset;
12
11
  projectId;
@@ -18,43 +17,32 @@ class DatasetError extends Error {
18
17
  }
19
18
  }
20
19
  export async function listSchemas(options) {
21
- const { extractManifest, id, json, manifestDir, output, workDir } = options;
22
- if (!await ensureManifestExtractSatisfied({
23
- extractManifest,
24
- manifestDir,
25
- output,
26
- schemaRequired: true,
27
- workDir
28
- })) {
29
- return 'failure';
30
- }
31
- const manifest = await createManifestReader({
32
- manifestDir,
33
- output,
34
- workDir
35
- }).getManifest();
36
- const projectDatasets = uniqByProjectIdDataset(manifest.workspaces);
20
+ const { configPath, id, json, output, workDir } = options;
21
+ const projectDatasets = await studioWorkerTask(new URL('uniqueWorkspaces.worker.js', import.meta.url), {
22
+ name: 'uniqueWorkspaces',
23
+ studioRootPath: workDir,
24
+ workerData: {
25
+ configPath
26
+ }
27
+ });
37
28
  const schemas = await getDatasetSchemas(projectDatasets, id);
38
29
  const parsedSchemas = parseSchemas(schemas, output);
39
30
  if (parsedSchemas.length === 0) {
40
31
  const datasetString = getDatasetsOutString(projectDatasets.map((dataset)=>dataset.dataset));
41
- output.error(id ? `Schema for id "${id}" not found in ${datasetString}` : `No schemas found in ${datasetString}`);
42
- schemasListDebug('Error finding schema');
43
- return 'failure';
32
+ throw new Error(id ? `Schema for id "${id}" not found in ${datasetString}` : `No schemas found in ${datasetString}`);
44
33
  }
45
34
  if (json) {
46
- output.log(`${JSON.stringify(id ? parsedSchemas[0] : parsedSchemas, null, 2)}`);
35
+ output.log(JSON.stringify(id ? parsedSchemas[0] : parsedSchemas, null, 2));
47
36
  } else {
48
37
  printSchemas({
49
- manifest,
50
38
  output,
51
- schemas: parsedSchemas
39
+ schemas: parsedSchemas,
40
+ workspaces: projectDatasets
52
41
  });
53
42
  }
54
- return 'success';
55
43
  }
56
44
  async function getDatasetSchemas(projectDatasets, id) {
57
- return await Promise.allSettled(projectDatasets.map(async ({ dataset, projectId })=>{
45
+ return Promise.allSettled(projectDatasets.map(async ({ dataset, projectId })=>{
58
46
  try {
59
47
  return await getSchemas(dataset, projectId, id);
60
48
  } catch (error) {
@@ -74,46 +62,55 @@ function parseSchemas(schemas, output) {
74
62
  const error = schema.reason;
75
63
  if (error instanceof DatasetError) {
76
64
  if ('cause' in error && error.cause && typeof error.cause === 'object' && 'statusCode' in error.cause && error.cause.statusCode === 401) {
77
- output.warn(`↳ No permissions to read schema from "${error.dataset}". ${SCHEMA_PERMISSION_HELP_TEXT}:\n ${styleText('red', `${error.message}`)}`);
65
+ output.log(styleText('yellow', `${logSymbols.warning} ↳ No permissions to read schema from "${error.dataset}". ${SCHEMA_PERMISSION_HELP_TEXT}:\n ${styleText('red', `${error.message}`)}`));
78
66
  return [];
79
67
  }
80
- const message = styleText('red', `↳ Failed to fetch schema from "${error.dataset}":\n ${error.message}`);
81
- output.error(message);
68
+ output.log(styleText('red', `↳ Failed to fetch schema from "${error.dataset}":\n ${error.message}`));
69
+ return [];
82
70
  } else {
83
71
  //hubris inc: given the try-catch wrapping all the full promise "this should never happen"
84
72
  throw error;
85
73
  }
86
74
  }).filter((schema)=>isDefined(schema)).flat();
87
75
  }
88
- function printSchemas({ manifest, output, schemas }) {
76
+ function printSchemas({ output, schemas, workspaces }) {
89
77
  const rows = schemas.toSorted((a, b)=>-(a._createdAt || '').localeCompare(b._createdAt || '')).map(({ _createdAt: createdAt, _id: id, workspace })=>{
90
- const workspaceData = manifest.workspaces.find((w)=>w.name === workspace.name);
78
+ const workspaceData = workspaces.find((w)=>w.name === workspace.name);
91
79
  if (!workspaceData) return;
92
- return [
93
- id,
94
- workspace.name,
95
- workspaceData.dataset,
96
- workspaceData.projectId,
97
- createdAt
98
- ].map(String);
80
+ return {
81
+ CreatedAt: createdAt,
82
+ Dataset: workspaceData.dataset,
83
+ Id: id,
84
+ ProjectId: workspaceData.projectId,
85
+ Workspace: workspace.name
86
+ };
99
87
  }).filter((schema)=>isDefined(schema));
100
- const headings = [
101
- 'Id',
102
- 'Workspace',
103
- 'Dataset',
104
- 'ProjectId',
105
- 'CreatedAt'
106
- ];
107
- const maxWidths = headings.map((heading, i)=>{
108
- const widths = [
109
- ...rows.map((row)=>row[i].length),
110
- heading.length
111
- ];
112
- return Math.max(...widths);
88
+ const table = new Table({
89
+ columns: [
90
+ {
91
+ alignment: 'left',
92
+ name: 'Id'
93
+ },
94
+ {
95
+ alignment: 'left',
96
+ name: 'Workspace'
97
+ },
98
+ {
99
+ alignment: 'left',
100
+ name: 'Dataset'
101
+ },
102
+ {
103
+ alignment: 'left',
104
+ name: 'ProjectId'
105
+ },
106
+ {
107
+ alignment: 'left',
108
+ name: 'CreatedAt'
109
+ }
110
+ ]
113
111
  });
114
- const rowToString = (row)=>row.map((col, i)=>`${col}`.padEnd(maxWidths[i])).join(' ');
115
- output.log(styleText('cyan', rowToString(headings)));
116
- for (const row of rows)output.log(rowToString(row));
112
+ table.addRows(rows);
113
+ output.log(table.render());
117
114
  }
118
115
 
119
116
  //# sourceMappingURL=listSchemas.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/schema/listSchemas.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type Output} from '@sanity/cli-core'\n\nimport {type ListSchemaCommand} from '../../commands/schema/list.js'\nimport {getSchemas} from '../../services/schemas.js'\nimport {isDefined} from '../manifest/schemaTypeHelpers.js'\nimport {\n type CreateManifest,\n type ManifestWorkspaceFile,\n type StoredWorkspaceSchema,\n} from '../manifest/types.js'\nimport {type SchemaStoreActionResult} from './schemaStoreTypes.js'\nimport {schemasListDebug} from './utils/debug.js'\nimport {ensureManifestExtractSatisfied} from './utils/manifestExtractor.js'\nimport {createManifestReader} from './utils/manifestReader.js'\nimport {getDatasetsOutString} from './utils/schemaStoreOutStrings.js'\nimport {SCHEMA_PERMISSION_HELP_TEXT} from './utils/schemaStoreValidation.js'\nimport {uniqByProjectIdDataset} from './utils/uniqByProjectIdDataset.js'\n\ninterface ListSchemasOptions {\n extractManifest: boolean\n json: boolean\n manifestDir: string\n output: Output\n workDir: string\n\n id?: string\n}\n\nclass DatasetError extends Error {\n public dataset: string\n public projectId: string\n constructor(args: {dataset: string; options?: ErrorOptions; projectId: string}) {\n super((args.options?.cause as {message?: string})?.message, args.options)\n this.projectId = args.projectId\n this.dataset = args.dataset\n this.name = 'DatasetError'\n }\n}\n\nexport async function listSchemas(options: ListSchemasOptions): Promise<SchemaStoreActionResult> {\n const {extractManifest, id, json, manifestDir, output, workDir} = options\n\n if (\n !(await ensureManifestExtractSatisfied({\n extractManifest,\n manifestDir,\n output,\n schemaRequired: true,\n workDir,\n }))\n ) {\n return 'failure'\n }\n\n const manifest = await createManifestReader({\n manifestDir,\n output,\n workDir,\n }).getManifest()\n const projectDatasets = uniqByProjectIdDataset(manifest.workspaces)\n const schemas = (await getDatasetSchemas(projectDatasets, id)) as unknown as (\n | PromiseFulfilledResult<StoredWorkspaceSchema>\n | PromiseRejectedResult\n )[]\n const parsedSchemas = parseSchemas(schemas, output) as unknown as StoredWorkspaceSchema[]\n\n if (parsedSchemas.length === 0) {\n const datasetString = getDatasetsOutString(projectDatasets.map((dataset) => dataset.dataset))\n\n output.error(\n id\n ? `Schema for id \"${id}\" not found in ${datasetString}`\n : `No schemas found in ${datasetString}`,\n )\n\n schemasListDebug('Error finding schema')\n return 'failure'\n }\n\n if (json) {\n output.log(`${JSON.stringify(id ? parsedSchemas[0] : parsedSchemas, null, 2)}`)\n } else {\n printSchemas({manifest, output, schemas: parsedSchemas})\n }\n\n return 'success'\n}\n\nasync function getDatasetSchemas(\n projectDatasets: ManifestWorkspaceFile[],\n id?: ListSchemaCommand['flags']['id'],\n) {\n return await Promise.allSettled(\n projectDatasets.map(async ({dataset, projectId}) => {\n try {\n return await getSchemas(dataset, projectId, id)\n } catch (error) {\n throw new DatasetError({dataset, options: {cause: error}, projectId})\n }\n }),\n )\n}\n\nfunction parseSchemas(\n schemas: (PromiseFulfilledResult<StoredWorkspaceSchema> | PromiseRejectedResult)[],\n output: Output,\n) {\n return schemas\n .map((schema) => {\n if (schema.status === 'fulfilled') return schema.value\n\n const error = schema.reason\n\n if (error instanceof DatasetError) {\n if (\n 'cause' in error &&\n error.cause &&\n typeof error.cause === 'object' &&\n 'statusCode' in error.cause &&\n error.cause.statusCode === 401\n ) {\n output.warn(\n `↳ No permissions to read schema from \"${error.dataset}\". ${\n SCHEMA_PERMISSION_HELP_TEXT\n }:\\n ${styleText('red', `${error.message}`)}`,\n )\n return []\n }\n\n const message = styleText(\n 'red',\n `↳ Failed to fetch schema from \"${error.dataset}\":\\n ${error.message}`,\n )\n output.error(message)\n } else {\n //hubris inc: given the try-catch wrapping all the full promise \"this should never happen\"\n throw error\n }\n })\n .filter((schema) => isDefined(schema))\n .flat()\n}\n\nfunction printSchemas({\n manifest,\n output,\n schemas,\n}: {\n manifest: CreateManifest\n output: Output\n schemas: StoredWorkspaceSchema[]\n}) {\n const rows = schemas\n .toSorted((a, b) => -(a._createdAt || '').localeCompare(b._createdAt || ''))\n .map(({_createdAt: createdAt, _id: id, workspace}) => {\n const workspaceData = manifest.workspaces.find((w) => w.name === workspace.name)\n\n if (!workspaceData) return\n\n return [id, workspace.name, workspaceData.dataset, workspaceData.projectId, createdAt].map(\n String,\n )\n })\n .filter((schema) => isDefined(schema))\n\n const headings = ['Id', 'Workspace', 'Dataset', 'ProjectId', 'CreatedAt']\n\n const maxWidths = headings.map((heading, i) => {\n const widths = [...rows.map((row) => row[i].length), heading.length]\n return Math.max(...widths)\n })\n\n const rowToString = (row: string[]) =>\n row.map((col, i) => `${col}`.padEnd(maxWidths[i])).join(' ')\n\n output.log(styleText('cyan', rowToString(headings)))\n for (const row of rows) output.log(rowToString(row))\n}\n"],"names":["styleText","getSchemas","isDefined","schemasListDebug","ensureManifestExtractSatisfied","createManifestReader","getDatasetsOutString","SCHEMA_PERMISSION_HELP_TEXT","uniqByProjectIdDataset","DatasetError","Error","dataset","projectId","args","options","cause","message","name","listSchemas","extractManifest","id","json","manifestDir","output","workDir","schemaRequired","manifest","getManifest","projectDatasets","workspaces","schemas","getDatasetSchemas","parsedSchemas","parseSchemas","length","datasetString","map","error","log","JSON","stringify","printSchemas","Promise","allSettled","schema","status","value","reason","statusCode","warn","filter","flat","rows","toSorted","a","b","_createdAt","localeCompare","createdAt","_id","workspace","workspaceData","find","w","String","headings","maxWidths","heading","i","widths","row","Math","max","rowToString","col","padEnd","join"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/schema/listSchemas.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type Output, studioWorkerTask} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport {Table} from 'console-table-printer'\nimport {type Workspace} from 'sanity'\n\nimport {getSchemas} from '../../services/schemas.js'\nimport {isDefined} from '../manifest/schemaTypeHelpers.js'\nimport {type StoredWorkspaceSchema} from '../manifest/types.js'\nimport {type UniqWorkspaceWorkerData} from './types.js'\nimport {getDatasetsOutString} from './utils/schemaStoreOutStrings.js'\nimport {SCHEMA_PERMISSION_HELP_TEXT} from './utils/schemaStoreValidation.js'\n\ninterface ListSchemasOptions {\n configPath: string\n json: boolean\n output: Output\n workDir: string\n\n id?: string\n}\n\nclass DatasetError extends Error {\n public dataset: string\n public projectId: string\n constructor(args: {dataset: string; options?: ErrorOptions; projectId: string}) {\n super((args.options?.cause as {message?: string})?.message, args.options)\n this.projectId = args.projectId\n this.dataset = args.dataset\n this.name = 'DatasetError'\n }\n}\n\nexport async function listSchemas(options: ListSchemasOptions): Promise<void> {\n const {configPath, id, json, output, workDir} = options\n\n const projectDatasets = await studioWorkerTask<(Workspace & {key: string})[]>(\n new URL('uniqueWorkspaces.worker.js', import.meta.url),\n {\n name: 'uniqueWorkspaces',\n studioRootPath: workDir,\n workerData: {configPath} satisfies UniqWorkspaceWorkerData,\n },\n )\n\n const schemas = await getDatasetSchemas(projectDatasets, id)\n const parsedSchemas = parseSchemas(schemas, output)\n\n if (parsedSchemas.length === 0) {\n const datasetString = getDatasetsOutString(projectDatasets.map((dataset) => dataset.dataset))\n\n throw new Error(\n id\n ? `Schema for id \"${id}\" not found in ${datasetString}`\n : `No schemas found in ${datasetString}`,\n )\n }\n\n if (json) {\n output.log(JSON.stringify(id ? parsedSchemas[0] : parsedSchemas, null, 2))\n } else {\n printSchemas({output, schemas: parsedSchemas, workspaces: projectDatasets})\n }\n}\n\nasync function getDatasetSchemas(projectDatasets: Workspace[], id?: string) {\n return Promise.allSettled(\n projectDatasets.map(async ({dataset, projectId}) => {\n try {\n return await getSchemas(dataset, projectId, id)\n } catch (error) {\n throw new DatasetError({dataset, options: {cause: error}, projectId})\n }\n }),\n )\n}\n\nfunction parseSchemas(schemas: PromiseSettledResult<StoredWorkspaceSchema[]>[], output: Output) {\n return schemas\n .map((schema) => {\n if (schema.status === 'fulfilled') return schema.value\n\n const error = schema.reason\n\n if (error instanceof DatasetError) {\n if (\n 'cause' in error &&\n error.cause &&\n typeof error.cause === 'object' &&\n 'statusCode' in error.cause &&\n error.cause.statusCode === 401\n ) {\n output.log(\n styleText(\n 'yellow',\n `${logSymbols.warning} No permissions to read schema from \"${error.dataset}\". ${\n SCHEMA_PERMISSION_HELP_TEXT\n }:\\n ${styleText('red', `${error.message}`)}`,\n ),\n )\n return []\n }\n\n output.log(\n styleText('red', `↳ Failed to fetch schema from \"${error.dataset}\":\\n ${error.message}`),\n )\n return []\n } else {\n //hubris inc: given the try-catch wrapping all the full promise \"this should never happen\"\n throw error\n }\n })\n .filter((schema) => isDefined(schema))\n .flat()\n}\n\nfunction printSchemas({\n output,\n schemas,\n workspaces,\n}: {\n output: Output\n schemas: StoredWorkspaceSchema[]\n workspaces: Workspace[]\n}) {\n const rows = schemas\n .toSorted((a, b) => -(a._createdAt || '').localeCompare(b._createdAt || ''))\n .map(({_createdAt: createdAt, _id: id, workspace}) => {\n const workspaceData = workspaces.find((w) => w.name === workspace.name)\n if (!workspaceData) return\n\n return {\n CreatedAt: createdAt,\n Dataset: workspaceData.dataset,\n Id: id,\n ProjectId: workspaceData.projectId,\n Workspace: workspace.name,\n }\n })\n .filter((schema) => isDefined(schema))\n\n const table = new Table({\n columns: [\n {alignment: 'left', name: 'Id'},\n {alignment: 'left', name: 'Workspace'},\n {alignment: 'left', name: 'Dataset'},\n {alignment: 'left', name: 'ProjectId'},\n {alignment: 'left', name: 'CreatedAt'},\n ],\n })\n\n table.addRows(rows)\n output.log(table.render())\n}\n"],"names":["styleText","studioWorkerTask","logSymbols","Table","getSchemas","isDefined","getDatasetsOutString","SCHEMA_PERMISSION_HELP_TEXT","DatasetError","Error","dataset","projectId","args","options","cause","message","name","listSchemas","configPath","id","json","output","workDir","projectDatasets","URL","url","studioRootPath","workerData","schemas","getDatasetSchemas","parsedSchemas","parseSchemas","length","datasetString","map","log","JSON","stringify","printSchemas","workspaces","Promise","allSettled","error","schema","status","value","reason","statusCode","warning","filter","flat","rows","toSorted","a","b","_createdAt","localeCompare","createdAt","_id","workspace","workspaceData","find","w","CreatedAt","Dataset","Id","ProjectId","Workspace","table","columns","alignment","addRows","render"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { isAbsolute, relative } from 'node:path';
2
+ import picomatch from 'picomatch';
3
+ import { toForwardSlashes } from '../../util/toForwardSlashes.js';
4
+ /**
5
+ * Creates a pattern matcher function for schema watch patterns.
6
+ * Normalizes file paths to forward slashes and makes them relative before matching.
7
+ *
8
+ * @param patterns - Array of glob patterns to match against
9
+ * @returns Function that takes a file path and workDir, returns true if file matches any pattern
10
+ * @internal
11
+ */ export function createSchemaPatternMatcher(patterns) {
12
+ const matcher = picomatch(patterns);
13
+ return {
14
+ isMatch: (filePath, workDir)=>{
15
+ const relativePath = isAbsolute(filePath) ? relative(workDir, filePath) : filePath;
16
+ const normalizedPath = toForwardSlashes(relativePath);
17
+ return matcher(normalizedPath);
18
+ }
19
+ };
20
+ }
21
+
22
+ //# sourceMappingURL=matchSchemaPattern.js.map