@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/previewServer.ts"],"sourcesContent":["import {readFile} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {type UserViteConfig} from '@sanity/cli-core'\nimport {type InlineConfig, preview} from 'vite'\n\nimport {extendViteConfigWithUserConfig} from '../actions/build/getViteConfig.js'\nimport {readModuleVersion} from '../util/readModuleVersion.js'\nimport {serverDebug} from './serverDebug.js'\nimport {sanityBasePathRedirectPlugin} from './vite/plugin-sanity-basepath-redirect.js'\n\nconst debug = serverDebug.extend('preview')\n\n/**\n * @internal\n */\nexport interface PreviewServer {\n close(): Promise<void>\n urls: {local: string[]; network: string[]}\n}\n\ninterface PreviewServerOptions {\n cwd: string\n httpPort: number\n\n root: string\n\n workDir: string\n\n httpHost?: string\n isApp?: boolean\n vite?: UserViteConfig\n}\n\n/**\n * Starts a Vite preview server for the given build output directory\n *\n * @param options - Preview server options\n * @returns A promise that resolves to the started preview server\n * @internal\n */\nexport async function startPreviewServer(options: PreviewServerOptions): Promise<PreviewServer> {\n const {httpHost, httpPort, isApp, root, vite: extendViteConfig, workDir} = options\n const startTime = Date.now()\n\n const indexPath = path.join(root, 'index.html')\n let basePath: string | undefined\n try {\n const index = await readFile(indexPath, 'utf8')\n basePath = tryResolveBasePathFromIndex(index)\n } catch (err: unknown) {\n if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {\n const error = new Error(`Could not find a production build in the '${root}' directory.`)\n error.name = 'BUILD_NOT_FOUND'\n throw error\n }\n\n throw err\n }\n\n const mode = 'production'\n let previewConfig: InlineConfig = {\n base: basePath || '/',\n // Needed for vite to not serve `root/dist`\n build: {\n outDir: root,\n },\n configFile: false,\n mode,\n plugins: [sanityBasePathRedirectPlugin(basePath)],\n preview: {\n host: httpHost,\n port: httpPort,\n strictPort: true,\n },\n root: workDir,\n }\n\n // Extend Vite configuration with user-provided config\n if (extendViteConfig) {\n previewConfig = await extendViteConfigWithUserConfig(\n {command: 'serve', mode},\n previewConfig,\n extendViteConfig,\n )\n }\n\n debug('Creating vite server')\n const server = await preview(previewConfig)\n const warn = server.config.logger.warn\n const info = server.config.logger.info\n const url = server.resolvedUrls!.local[0]\n\n if (basePath === undefined) {\n warn('Could not determine base path from index.html, using \"/\" as default')\n } else if (basePath && basePath !== '/') {\n info(`Using resolved base path from static build: ${styleText('cyan', basePath)}`)\n }\n\n const startupDuration = Date.now() - startTime\n\n const viteVersion = await readModuleVersion(import.meta.url, 'vite')\n\n info(\n `Sanity ${isApp ? 'application' : 'Studio'} ` +\n `using ${styleText('cyan', `vite@${viteVersion}`)} ` +\n `ready in ${styleText('cyan', `${Math.ceil(startupDuration)}ms`)} ` +\n `and running at ${styleText('cyan', url)} (production preview mode)`,\n )\n\n return {\n close: () =>\n new Promise((resolve, reject) =>\n server.httpServer.close((err) => (err ? reject(err) : resolve())),\n ),\n urls: server.resolvedUrls!,\n }\n}\n\nfunction tryResolveBasePathFromIndex(index: string): string | undefined {\n // <script ... src=\"/some-base-path/static/sanity-a3cc3d86.js\"></script>\n const basePath = index.match(/<script[^>]+src=\"(.*?)\\/static\\/sanity-/)?.[1]\n\n // We _expect_ to be able to find the base path. If we can't, we should warn.\n // Note that we're checking for `undefined` here, since an empty string is a\n // valid base path.\n if (basePath === undefined) {\n return undefined\n }\n\n // In the case of an empty base path, we still want to return `/` to indicate\n // that we _found_ the basepath - it just happens to be empty. Eg:\n // <script ... src = \"/static/sanity-a3cc3d86.js\"></script>\n // Which differs from not being able to find the script tag at all, in which\n // case we'll want to show a warning to indicate that it is an abnormality.\n return basePath === '' ? '/' : basePath\n}\n"],"names":["readFile","path","styleText","preview","extendViteConfigWithUserConfig","readModuleVersion","serverDebug","sanityBasePathRedirectPlugin","debug","extend","startPreviewServer","options","httpHost","httpPort","isApp","root","vite","extendViteConfig","workDir","startTime","Date","now","indexPath","join","basePath","index","tryResolveBasePathFromIndex","err","Error","code","error","name","mode","previewConfig","base","build","outDir","configFile","plugins","host","port","strictPort","command","server","warn","config","logger","info","url","resolvedUrls","local","undefined","startupDuration","viteVersion","Math","ceil","close","Promise","resolve","reject","httpServer","urls","match"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/server/previewServer.ts"],"sourcesContent":["import {readFile} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {type UserViteConfig} from '@sanity/cli-core'\nimport {type InlineConfig, preview} from 'vite'\n\nimport {extendViteConfigWithUserConfig} from '../actions/build/getViteConfig.js'\nimport {getLocalPackageVersion} from '../util/getLocalPackageVersion.js'\nimport {serverDebug} from './serverDebug.js'\nimport {sanityBasePathRedirectPlugin} from './vite/plugin-sanity-basepath-redirect.js'\n\nconst debug = serverDebug.extend('preview')\n\n/**\n * @internal\n */\nexport interface PreviewServer {\n close(): Promise<void>\n urls: {local: string[]; network: string[]}\n}\n\ninterface PreviewServerOptions {\n cwd: string\n httpPort: number\n\n root: string\n\n workDir: string\n\n httpHost?: string\n isApp?: boolean\n vite?: UserViteConfig\n}\n\n/**\n * Starts a Vite preview server for the given build output directory\n *\n * @param options - Preview server options\n * @returns A promise that resolves to the started preview server\n * @internal\n */\nexport async function startPreviewServer(options: PreviewServerOptions): Promise<PreviewServer> {\n const {httpHost, httpPort, isApp, root, vite: extendViteConfig, workDir} = options\n const startTime = Date.now()\n\n const indexPath = path.join(root, 'index.html')\n let basePath: string | undefined\n try {\n const index = await readFile(indexPath, 'utf8')\n basePath = tryResolveBasePathFromIndex(index)\n } catch (err: unknown) {\n if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {\n const error = new Error(`Could not find a production build in the '${root}' directory.`)\n error.name = 'BUILD_NOT_FOUND'\n throw error\n }\n\n throw err\n }\n\n const mode = 'production'\n let previewConfig: InlineConfig = {\n base: basePath || '/',\n // Needed for vite to not serve `root/dist`\n build: {\n outDir: root,\n },\n configFile: false,\n mode,\n plugins: [sanityBasePathRedirectPlugin(basePath)],\n preview: {\n host: httpHost,\n port: httpPort,\n strictPort: true,\n },\n root: workDir,\n }\n\n // Extend Vite configuration with user-provided config\n if (extendViteConfig) {\n previewConfig = await extendViteConfigWithUserConfig(\n {command: 'serve', mode},\n previewConfig,\n extendViteConfig,\n )\n }\n\n debug('Creating vite server')\n const server = await preview(previewConfig)\n const warn = server.config.logger.warn\n const info = server.config.logger.info\n const url = server.resolvedUrls!.local[0]\n\n if (basePath === undefined) {\n warn('Could not determine base path from index.html, using \"/\" as default')\n } else if (basePath && basePath !== '/') {\n info(`Using resolved base path from static build: ${styleText('cyan', basePath)}`)\n }\n\n const startupDuration = Date.now() - startTime\n\n const viteVersion = await getLocalPackageVersion('vite', import.meta.url)\n\n info(\n `Sanity ${isApp ? 'application' : 'Studio'} ` +\n `using ${styleText('cyan', `vite@${viteVersion}`)} ` +\n `ready in ${styleText('cyan', `${Math.ceil(startupDuration)}ms`)} ` +\n `and running at ${styleText('cyan', url)} (production preview mode)`,\n )\n\n return {\n close: () =>\n new Promise((resolve, reject) =>\n server.httpServer.close((err) => (err ? reject(err) : resolve())),\n ),\n urls: server.resolvedUrls!,\n }\n}\n\nfunction tryResolveBasePathFromIndex(index: string): string | undefined {\n // <script ... src=\"/some-base-path/static/sanity-a3cc3d86.js\"></script>\n const basePath = index.match(/<script[^>]+src=\"(.*?)\\/static\\/sanity-/)?.[1]\n\n // We _expect_ to be able to find the base path. If we can't, we should warn.\n // Note that we're checking for `undefined` here, since an empty string is a\n // valid base path.\n if (basePath === undefined) {\n return undefined\n }\n\n // In the case of an empty base path, we still want to return `/` to indicate\n // that we _found_ the basepath - it just happens to be empty. Eg:\n // <script ... src = \"/static/sanity-a3cc3d86.js\"></script>\n // Which differs from not being able to find the script tag at all, in which\n // case we'll want to show a warning to indicate that it is an abnormality.\n return basePath === '' ? '/' : basePath\n}\n"],"names":["readFile","path","styleText","preview","extendViteConfigWithUserConfig","getLocalPackageVersion","serverDebug","sanityBasePathRedirectPlugin","debug","extend","startPreviewServer","options","httpHost","httpPort","isApp","root","vite","extendViteConfig","workDir","startTime","Date","now","indexPath","join","basePath","index","tryResolveBasePathFromIndex","err","Error","code","error","name","mode","previewConfig","base","build","outDir","configFile","plugins","host","port","strictPort","command","server","warn","config","logger","info","url","resolvedUrls","local","undefined","startupDuration","viteVersion","Math","ceil","close","Promise","resolve","reject","httpServer","urls","match"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AACzC,OAAOC,UAAU,YAAW;AAC5B,SAAQC,SAAS,QAAO,YAAW;AAGnC,SAA2BC,OAAO,QAAO,OAAM;AAE/C,SAAQC,8BAA8B,QAAO,oCAAmC;AAChF,SAAQC,sBAAsB,QAAO,oCAAmC;AACxE,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,4BAA4B,QAAO,4CAA2C;AAEtF,MAAMC,QAAQF,YAAYG,MAAM,CAAC;AAuBjC;;;;;;CAMC,GACD,OAAO,eAAeC,mBAAmBC,OAA6B;IACpE,MAAM,EAACC,QAAQ,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,MAAMC,gBAAgB,EAAEC,OAAO,EAAC,GAAGP;IAC3E,MAAMQ,YAAYC,KAAKC,GAAG;IAE1B,MAAMC,YAAYrB,KAAKsB,IAAI,CAACR,MAAM;IAClC,IAAIS;IACJ,IAAI;QACF,MAAMC,QAAQ,MAAMzB,SAASsB,WAAW;QACxCE,WAAWE,4BAA4BD;IACzC,EAAE,OAAOE,KAAc;QACrB,IAAIA,eAAeC,SAAS,UAAUD,OAAOA,IAAIE,IAAI,KAAK,UAAU;YAClE,MAAMC,QAAQ,IAAIF,MAAM,CAAC,0CAA0C,EAAEb,KAAK,YAAY,CAAC;YACvFe,MAAMC,IAAI,GAAG;YACb,MAAMD;QACR;QAEA,MAAMH;IACR;IAEA,MAAMK,OAAO;IACb,IAAIC,gBAA8B;QAChCC,MAAMV,YAAY;QAClB,2CAA2C;QAC3CW,OAAO;YACLC,QAAQrB;QACV;QACAsB,YAAY;QACZL;QACAM,SAAS;YAAC/B,6BAA6BiB;SAAU;QACjDrB,SAAS;YACPoC,MAAM3B;YACN4B,MAAM3B;YACN4B,YAAY;QACd;QACA1B,MAAMG;IACR;IAEA,sDAAsD;IACtD,IAAID,kBAAkB;QACpBgB,gBAAgB,MAAM7B,+BACpB;YAACsC,SAAS;YAASV;QAAI,GACvBC,eACAhB;IAEJ;IAEAT,MAAM;IACN,MAAMmC,SAAS,MAAMxC,QAAQ8B;IAC7B,MAAMW,OAAOD,OAAOE,MAAM,CAACC,MAAM,CAACF,IAAI;IACtC,MAAMG,OAAOJ,OAAOE,MAAM,CAACC,MAAM,CAACC,IAAI;IACtC,MAAMC,MAAML,OAAOM,YAAY,CAAEC,KAAK,CAAC,EAAE;IAEzC,IAAI1B,aAAa2B,WAAW;QAC1BP,KAAK;IACP,OAAO,IAAIpB,YAAYA,aAAa,KAAK;QACvCuB,KAAK,CAAC,4CAA4C,EAAE7C,UAAU,QAAQsB,WAAW;IACnF;IAEA,MAAM4B,kBAAkBhC,KAAKC,GAAG,KAAKF;IAErC,MAAMkC,cAAc,MAAMhD,uBAAuB,QAAQ,YAAY2C,GAAG;IAExED,KACE,CAAC,OAAO,EAAEjC,QAAQ,gBAAgB,SAAS,CAAC,CAAC,GAC3C,CAAC,MAAM,EAAEZ,UAAU,QAAQ,CAAC,KAAK,EAAEmD,aAAa,EAAE,CAAC,CAAC,GACpD,CAAC,SAAS,EAAEnD,UAAU,QAAQ,GAAGoD,KAAKC,IAAI,CAACH,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,GACnE,CAAC,eAAe,EAAElD,UAAU,QAAQ8C,KAAK,0BAA0B,CAAC;IAGxE,OAAO;QACLQ,OAAO,IACL,IAAIC,QAAQ,CAACC,SAASC,SACpBhB,OAAOiB,UAAU,CAACJ,KAAK,CAAC,CAAC7B,MAASA,MAAMgC,OAAOhC,OAAO+B;QAE1DG,MAAMlB,OAAOM,YAAY;IAC3B;AACF;AAEA,SAASvB,4BAA4BD,KAAa;IAChD,wEAAwE;IACxE,MAAMD,WAAWC,MAAMqC,KAAK,CAAC,4CAA4C,CAAC,EAAE;IAE5E,6EAA6E;IAC7E,4EAA4E;IAC5E,mBAAmB;IACnB,IAAItC,aAAa2B,WAAW;QAC1B,OAAOA;IACT;IAEA,6EAA6E;IAC7E,kEAAkE;IAClE,2DAA2D;IAC3D,4EAA4E;IAC5E,2EAA2E;IAC3E,OAAO3B,aAAa,KAAK,MAAMA;AACjC"}
@@ -0,0 +1,201 @@
1
+ import path, { isAbsolute } from 'node:path';
2
+ import { logSymbols } from '@sanity/cli-core/ux';
3
+ import debounce from 'lodash-es/debounce.js';
4
+ import mean from 'lodash-es/mean.js';
5
+ import once from 'lodash-es/once.js';
6
+ import { formatSchemaValidation } from '../../actions/schema/formatSchemaValidation.js';
7
+ import { createSchemaPatternMatcher } from '../../actions/schema/matchSchemaPattern.js';
8
+ import { runSchemaExtraction } from '../../actions/schema/runSchemaExtraction.js';
9
+ import { SchemaExtractionError } from '../../actions/schema/utils/SchemaExtractionError.js';
10
+ import { SchemaExtractedTrace, SchemaExtractionWatchModeTrace } from '../../telemetry/extractSchema.telemetry.js';
11
+ /**
12
+ * Default glob patterns to watch for schema changes.
13
+ * Covers the sanity config file and common schema directory naming conventions.
14
+ */ const DEFAULT_SCHEMA_PATTERNS = [
15
+ 'sanity.config.{js,jsx,ts,tsx,mjs}',
16
+ 'schema*/**/*.{js,jsx,ts,tsx,mjs}'
17
+ ];
18
+ /** Default debounce delay in milliseconds */ const DEFAULT_DEBOUNCE_MS = 1000;
19
+ /**
20
+ * Delay before initial extraction to allow Vite to finish startup
21
+ * and avoid race conditions with module resolution.
22
+ */ const INITIAL_EXTRACTION_DELAY_MS = 1000;
23
+ /**
24
+ * Creates a Vite plugin that automatically extracts Sanity schema during development and build.
25
+ *
26
+ * **During development:**
27
+ * The plugin performs an initial extraction when the dev server starts, then watches
28
+ * for file changes and re-extracts the schema when relevant files are modified.
29
+ *
30
+ * **During build:**
31
+ * The plugin extracts the schema once at the end of the build process, ensuring
32
+ * the schema is always up-to-date when deploying.
33
+ *
34
+ * **How it works in dev mode:**
35
+ * 1. Registers watch patterns with Vite's built-in file watcher
36
+ * 2. Performs initial schema extraction when the server starts
37
+ * 3. On file changes matching the patterns, triggers a debounced extraction
38
+ * 4. Uses concurrency control to prevent overlapping extractions
39
+ *
40
+ * @param options - Configuration options for the plugin
41
+ * @returns A Vite plugin configured for schema extraction
42
+ *
43
+ * @internal
44
+ */ export function sanitySchemaExtractionPlugin(options) {
45
+ const { additionalPatterns = [], configPath, debounceMs = DEFAULT_DEBOUNCE_MS, enforceRequiredFields = false, format = 'groq-type-nodes', output = console, outputPath: outputPathOption = 'schema.json', telemetryLogger, workDir: workDirOption, workspaceName } = options;
46
+ const watchPatterns = [
47
+ ...DEFAULT_SCHEMA_PATTERNS,
48
+ ...additionalPatterns
49
+ ];
50
+ // Resolved after Vite config is available
51
+ let resolvedWorkDir;
52
+ let resolvedOutputPath;
53
+ // State for concurrency control
54
+ let isExtracting = false;
55
+ let pendingExtraction = false;
56
+ // Stats for telemetry
57
+ const startTime = Date.now();
58
+ const stats = {
59
+ failedCount: 0,
60
+ successfulDurations: []
61
+ };
62
+ const extractSchema = ()=>runSchemaExtraction({
63
+ configPath,
64
+ enforceRequiredFields,
65
+ format,
66
+ outputPath: resolvedOutputPath,
67
+ workspace: workspaceName
68
+ });
69
+ /**
70
+ * Runs extraction with concurrency control.
71
+ * If extraction is already running, queues one more extraction to run after completion.
72
+ */ async function runExtraction(isBuilding = false) {
73
+ if (isExtracting) {
74
+ pendingExtraction = true;
75
+ return;
76
+ }
77
+ isExtracting = true;
78
+ pendingExtraction = false;
79
+ const extractionStartTime = Date.now();
80
+ try {
81
+ await extractSchema();
82
+ if (isBuilding) {
83
+ // TODO: Remove when we have better control over progress reporting in build
84
+ output.log('');
85
+ }
86
+ output.log(logSymbols.success, `Extracted schema to ${outputPathOption}`);
87
+ // add stats for the successful extraction run to use later for telemetry
88
+ stats.successfulDurations.push(Date.now() - extractionStartTime);
89
+ } catch (err) {
90
+ output.error(logSymbols.error, `Extraction failed: ${err instanceof Error ? err.message : String(err)}`);
91
+ if (err instanceof SchemaExtractionError && err.validation && err.validation.length > 0) {
92
+ output.error(logSymbols.error, formatSchemaValidation(err.validation));
93
+ }
94
+ // track the failed extraction
95
+ stats.failedCount++;
96
+ } finally{
97
+ isExtracting = false;
98
+ // If a change came in during extraction, run again
99
+ if (pendingExtraction) {
100
+ pendingExtraction = false;
101
+ await runExtraction();
102
+ }
103
+ }
104
+ }
105
+ const debouncedExtract = debounce(()=>{
106
+ void runExtraction();
107
+ }, debounceMs);
108
+ const { isMatch } = createSchemaPatternMatcher(watchPatterns);
109
+ const handleChange = (filePath)=>{
110
+ if (isMatch(filePath, resolvedWorkDir)) {
111
+ debouncedExtract();
112
+ }
113
+ };
114
+ return {
115
+ name: 'sanity/schema-extraction',
116
+ configResolved (config) {
117
+ // Resolve workDir from option or Vite's project root
118
+ resolvedWorkDir = workDirOption ?? config.root;
119
+ resolvedOutputPath = isAbsolute(outputPathOption) ? outputPathOption : path.join(resolvedWorkDir, outputPathOption);
120
+ },
121
+ configureServer (server) {
122
+ const trace = telemetryLogger?.trace(SchemaExtractionWatchModeTrace);
123
+ trace?.start();
124
+ trace?.log({
125
+ enforceRequiredFields,
126
+ schemaFormat: format,
127
+ step: 'started'
128
+ });
129
+ // Add schema patterns to Vite's watcher
130
+ const absolutePatterns = watchPatterns.map((pattern)=>path.join(resolvedWorkDir, pattern));
131
+ server.watcher.add(absolutePatterns);
132
+ // Prepare function to log "stopped" event to trace and complete the trace
133
+ const onClose = once(()=>{
134
+ // Cancel any pending debounced extractions
135
+ debouncedExtract.cancel();
136
+ // Log telemetry if available
137
+ if (trace) {
138
+ trace.log({
139
+ averageExtractionDuration: mean(stats.successfulDurations) || 0,
140
+ extractionFailedCount: stats.failedCount,
141
+ extractionSuccessfulCount: stats.successfulDurations.length,
142
+ step: 'stopped',
143
+ watcherDuration: Date.now() - startTime
144
+ });
145
+ trace.complete();
146
+ }
147
+ // Clean up process listeners (must always run, not just when trace exists)
148
+ process.off('SIGTERM', onClose);
149
+ process.off('SIGINT', onClose);
150
+ });
151
+ server.watcher.on('change', handleChange);
152
+ server.watcher.on('add', handleChange);
153
+ server.watcher.on('unlink', handleChange);
154
+ // call the watcherClosed method when watcher is closed or when process is stopped/killed
155
+ server.watcher.on('close', onClose);
156
+ process.on('SIGTERM', onClose);
157
+ process.on('SIGINT', onClose);
158
+ // Run initial extraction after server is ready
159
+ const startExtraction = ()=>{
160
+ setTimeout(()=>{
161
+ // Notify about schema extraction enabled
162
+ output.info(logSymbols.info, 'Schema extraction enabled. Watching:');
163
+ for (const pattern of watchPatterns){
164
+ output.info(` - ${pattern}`);
165
+ }
166
+ // Perform first extraction
167
+ void runExtraction();
168
+ }, INITIAL_EXTRACTION_DELAY_MS);
169
+ };
170
+ if (server.httpServer) {
171
+ server.httpServer.once('listening', startExtraction);
172
+ } else {
173
+ // Middleware mode - no HTTP server, run extraction immediately
174
+ startExtraction();
175
+ }
176
+ },
177
+ async buildEnd () {
178
+ const trace = telemetryLogger?.trace(SchemaExtractedTrace);
179
+ trace?.start();
180
+ try {
181
+ const start = Date.now();
182
+ const schema = await extractSchema();
183
+ output.log(logSymbols.success, `Extracted schema to ${outputPathOption} (${Date.now() - start}ms)`);
184
+ trace?.log({
185
+ enforceRequiredFields,
186
+ schemaAllTypesCount: schema.length,
187
+ schemaDocumentTypesCount: schema.filter((type)=>type.type === 'document').length,
188
+ schemaFormat: format,
189
+ schemaTypesCount: schema.filter((type)=>type.type === 'type').length
190
+ });
191
+ } catch (err) {
192
+ trace?.error(err);
193
+ throw err;
194
+ } finally{
195
+ trace?.complete();
196
+ }
197
+ }
198
+ };
199
+ }
200
+
201
+ //# sourceMappingURL=plugin-schema-extraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/vite/plugin-schema-extraction.ts"],"sourcesContent":["import path, {isAbsolute} from 'node:path'\n\nimport {type CLITelemetryStore} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport debounce from 'lodash-es/debounce.js'\nimport mean from 'lodash-es/mean.js'\nimport once from 'lodash-es/once.js'\nimport {type Plugin} from 'vite'\n\nimport {formatSchemaValidation} from '../../actions/schema/formatSchemaValidation.js'\nimport {createSchemaPatternMatcher} from '../../actions/schema/matchSchemaPattern.js'\nimport {runSchemaExtraction} from '../../actions/schema/runSchemaExtraction.js'\nimport {SchemaExtractionError} from '../../actions/schema/utils/SchemaExtractionError.js'\nimport {\n SchemaExtractedTrace,\n SchemaExtractionWatchModeTrace,\n} from '../../telemetry/extractSchema.telemetry.js'\n\n/**\n * Default glob patterns to watch for schema changes.\n * Covers the sanity config file and common schema directory naming conventions.\n */\nconst DEFAULT_SCHEMA_PATTERNS = [\n 'sanity.config.{js,jsx,ts,tsx,mjs}',\n 'schema*/**/*.{js,jsx,ts,tsx,mjs}',\n]\n\n/** Default debounce delay in milliseconds */\nconst DEFAULT_DEBOUNCE_MS = 1000\n\n/**\n * Delay before initial extraction to allow Vite to finish startup\n * and avoid race conditions with module resolution.\n */\nconst INITIAL_EXTRACTION_DELAY_MS = 1000\n\n/**\n * Options for the Sanity schema extraction Vite plugin.\n *\n * @public\n */\ninterface SchemaExtractionPluginOptions {\n /**\n * Name of sanity config file\n * @example sanity.config.ts\n */\n configPath: string\n\n /**\n * Additional glob patterns to watch for schema changes.\n * These are merged with the default patterns.\n * @example `['lib/custom-types/**\\/*.ts', 'shared/schemas/**\\/*.ts']`\n */\n additionalPatterns?: string[]\n\n /**\n * Debounce delay in milliseconds before triggering extraction\n * after a file change. Helps prevent excessive extractions\n * during rapid file saves.\n * @defaultValue 1000\n */\n debounceMs?: number\n\n /**\n * When true, marks all fields as required in the extracted schema\n * unless they are explicitly marked as optional.\n * @defaultValue false\n */\n enforceRequiredFields?: boolean\n\n /**\n * Format of schema export. groq-type-nodes is the only avilable format at the moment\n */\n format?: string\n\n /**\n * Logger for output messages. Must implement `log`, `info`, and `error` methods.\n * @defaultValue `console`\n */\n output?: Pick<Console, 'error' | 'info' | 'log'>\n\n /**\n * Path where the extracted schema JSON will be written.\n * Can be absolute or relative to the working directory.\n * @defaultValue `path.join(workDir, 'schema.json')`\n */\n outputPath?: string\n\n /**\n * Telemetry logger for the Sanity CLI tooling. If no logger is provided no telemetry\n * is sent. Also, no telemetry will be sent if telemetry is disabled in the sanity CLI.\n */\n telemetryLogger?: CLITelemetryStore\n\n /**\n * Working directory containing the Sanity configuration.\n * This should be the root of your Sanity Studio project where\n * `sanity.config.ts` is located.\n * @defaultValue Vite's project root (`config.root`)\n */\n workDir?: string\n\n /**\n * Workspace name for multi-workspace Sanity configurations.\n * Required when your `sanity.config.ts` exports multiple workspaces\n * and you want to extract schema from a specific one.\n */\n workspaceName?: string\n}\n\n/**\n * Creates a Vite plugin that automatically extracts Sanity schema during development and build.\n *\n * **During development:**\n * The plugin performs an initial extraction when the dev server starts, then watches\n * for file changes and re-extracts the schema when relevant files are modified.\n *\n * **During build:**\n * The plugin extracts the schema once at the end of the build process, ensuring\n * the schema is always up-to-date when deploying.\n *\n * **How it works in dev mode:**\n * 1. Registers watch patterns with Vite's built-in file watcher\n * 2. Performs initial schema extraction when the server starts\n * 3. On file changes matching the patterns, triggers a debounced extraction\n * 4. Uses concurrency control to prevent overlapping extractions\n *\n * @param options - Configuration options for the plugin\n * @returns A Vite plugin configured for schema extraction\n *\n * @internal\n */\nexport function sanitySchemaExtractionPlugin(options: SchemaExtractionPluginOptions) {\n const {\n additionalPatterns = [],\n configPath,\n debounceMs = DEFAULT_DEBOUNCE_MS,\n enforceRequiredFields = false,\n format = 'groq-type-nodes',\n output = console,\n outputPath: outputPathOption = 'schema.json',\n telemetryLogger,\n workDir: workDirOption,\n workspaceName,\n } = options\n\n const watchPatterns = [...DEFAULT_SCHEMA_PATTERNS, ...additionalPatterns]\n\n // Resolved after Vite config is available\n let resolvedWorkDir: string\n let resolvedOutputPath: string\n\n // State for concurrency control\n let isExtracting = false\n let pendingExtraction = false\n\n // Stats for telemetry\n const startTime = Date.now()\n const stats: {failedCount: number; successfulDurations: number[]} = {\n failedCount: 0,\n successfulDurations: [],\n }\n\n const extractSchema = () =>\n runSchemaExtraction({\n configPath,\n enforceRequiredFields,\n format,\n outputPath: resolvedOutputPath,\n workspace: workspaceName,\n })\n\n /**\n * Runs extraction with concurrency control.\n * If extraction is already running, queues one more extraction to run after completion.\n */\n async function runExtraction(isBuilding = false): Promise<void> {\n if (isExtracting) {\n pendingExtraction = true\n return\n }\n\n isExtracting = true\n pendingExtraction = false\n\n const extractionStartTime = Date.now()\n try {\n await extractSchema()\n if (isBuilding) {\n // TODO: Remove when we have better control over progress reporting in build\n output.log('')\n }\n output.log(logSymbols.success, `Extracted schema to ${outputPathOption}`)\n\n // add stats for the successful extraction run to use later for telemetry\n stats.successfulDurations.push(Date.now() - extractionStartTime)\n } catch (err) {\n output.error(\n logSymbols.error,\n `Extraction failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n if (err instanceof SchemaExtractionError && err.validation && err.validation.length > 0) {\n output.error(logSymbols.error, formatSchemaValidation(err.validation))\n }\n\n // track the failed extraction\n stats.failedCount++\n } finally {\n isExtracting = false\n\n // If a change came in during extraction, run again\n if (pendingExtraction) {\n pendingExtraction = false\n await runExtraction()\n }\n }\n }\n\n const debouncedExtract = debounce(() => {\n void runExtraction()\n }, debounceMs)\n\n const {isMatch} = createSchemaPatternMatcher(watchPatterns)\n\n const handleChange = (filePath: string) => {\n if (isMatch(filePath, resolvedWorkDir)) {\n debouncedExtract()\n }\n }\n\n return {\n name: 'sanity/schema-extraction',\n\n configResolved(config) {\n // Resolve workDir from option or Vite's project root\n resolvedWorkDir = workDirOption ?? config.root\n\n resolvedOutputPath = isAbsolute(outputPathOption)\n ? outputPathOption\n : path.join(resolvedWorkDir, outputPathOption)\n },\n\n configureServer(server) {\n const trace = telemetryLogger?.trace(SchemaExtractionWatchModeTrace)\n trace?.start()\n\n trace?.log({enforceRequiredFields, schemaFormat: format, step: 'started'})\n\n // Add schema patterns to Vite's watcher\n const absolutePatterns = watchPatterns.map((pattern) => path.join(resolvedWorkDir, pattern))\n server.watcher.add(absolutePatterns)\n\n // Prepare function to log \"stopped\" event to trace and complete the trace\n const onClose = once(() => {\n // Cancel any pending debounced extractions\n debouncedExtract.cancel()\n\n // Log telemetry if available\n if (trace) {\n trace.log({\n averageExtractionDuration: mean(stats.successfulDurations) || 0,\n extractionFailedCount: stats.failedCount,\n extractionSuccessfulCount: stats.successfulDurations.length,\n step: 'stopped',\n watcherDuration: Date.now() - startTime,\n })\n trace.complete()\n }\n\n // Clean up process listeners (must always run, not just when trace exists)\n process.off('SIGTERM', onClose)\n process.off('SIGINT', onClose)\n })\n\n server.watcher.on('change', handleChange)\n server.watcher.on('add', handleChange)\n server.watcher.on('unlink', handleChange)\n\n // call the watcherClosed method when watcher is closed or when process is stopped/killed\n server.watcher.on('close', onClose)\n process.on('SIGTERM', onClose)\n process.on('SIGINT', onClose)\n\n // Run initial extraction after server is ready\n const startExtraction = () => {\n setTimeout(() => {\n // Notify about schema extraction enabled\n output.info(logSymbols.info, 'Schema extraction enabled. Watching:')\n for (const pattern of watchPatterns) {\n output.info(` - ${pattern}`)\n }\n\n // Perform first extraction\n void runExtraction()\n }, INITIAL_EXTRACTION_DELAY_MS)\n }\n\n if (server.httpServer) {\n server.httpServer.once('listening', startExtraction)\n } else {\n // Middleware mode - no HTTP server, run extraction immediately\n startExtraction()\n }\n },\n\n async buildEnd() {\n const trace = telemetryLogger?.trace(SchemaExtractedTrace)\n trace?.start()\n\n try {\n const start = Date.now()\n const schema = await extractSchema()\n output.log(\n logSymbols.success,\n `Extracted schema to ${outputPathOption} (${Date.now() - start}ms)`,\n )\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 } catch (err) {\n trace?.error(err)\n throw err\n } finally {\n trace?.complete()\n }\n },\n } satisfies Plugin\n}\n"],"names":["path","isAbsolute","logSymbols","debounce","mean","once","formatSchemaValidation","createSchemaPatternMatcher","runSchemaExtraction","SchemaExtractionError","SchemaExtractedTrace","SchemaExtractionWatchModeTrace","DEFAULT_SCHEMA_PATTERNS","DEFAULT_DEBOUNCE_MS","INITIAL_EXTRACTION_DELAY_MS","sanitySchemaExtractionPlugin","options","additionalPatterns","configPath","debounceMs","enforceRequiredFields","format","output","console","outputPath","outputPathOption","telemetryLogger","workDir","workDirOption","workspaceName","watchPatterns","resolvedWorkDir","resolvedOutputPath","isExtracting","pendingExtraction","startTime","Date","now","stats","failedCount","successfulDurations","extractSchema","workspace","runExtraction","isBuilding","extractionStartTime","log","success","push","err","error","Error","message","String","validation","length","debouncedExtract","isMatch","handleChange","filePath","name","configResolved","config","root","join","configureServer","server","trace","start","schemaFormat","step","absolutePatterns","map","pattern","watcher","add","onClose","cancel","averageExtractionDuration","extractionFailedCount","extractionSuccessfulCount","watcherDuration","complete","process","off","on","startExtraction","setTimeout","info","httpServer","buildEnd","schema","schemaAllTypesCount","schemaDocumentTypesCount","filter","type","schemaTypesCount"],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ import { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { logSymbols } from '@sanity/cli-core/ux';
4
+ import { runTypegenGenerate, TypegenWatchModeTrace, TypesGeneratedTrace } from '@sanity/codegen';
5
+ import debounce from 'lodash-es/debounce.js';
6
+ import mean from 'lodash-es/mean.js';
7
+ import once from 'lodash-es/once.js';
8
+ import picomatch from 'picomatch';
9
+ import { toForwardSlashes } from '../../util/toForwardSlashes.js';
10
+ /**
11
+ * Default glob patterns to watch for query file changes.
12
+ * Covers common source directory naming conventions.
13
+ */ const DEFAULT_QUERY_PATTERNS = [
14
+ './src/**/*.{ts,tsx,js,jsx}',
15
+ './app/**/*.{ts,tsx,js,jsx}'
16
+ ];
17
+ /** Default debounce delay in milliseconds */ const DEFAULT_DEBOUNCE_MS = 1000;
18
+ /**
19
+ * Delay before initial generation to allow Vite to finish startup
20
+ * and avoid race conditions with module resolution.
21
+ */ const INITIAL_GENERATION_DELAY_MS = 1000;
22
+ /**
23
+ * Creates a Vite plugin that automatically generates TypeScript types during development and build.
24
+ *
25
+ * **During development:**
26
+ * The plugin performs an initial generation when the dev server starts, then watches
27
+ * for file changes and re-generates types when relevant files are modified.
28
+ *
29
+ * **During build:**
30
+ * The plugin generates types once at the end of the build process.
31
+ *
32
+ * **Prerequisites:**
33
+ * The schema.json file must exist before typegen can run. Run `sanity schema extract`
34
+ * first to generate the schema file.
35
+ *
36
+ * @param options - Configuration options for the plugin
37
+ * @returns A Vite plugin configured for typegen
38
+ *
39
+ * @internal
40
+ */ export function sanityTypegenPlugin(options) {
41
+ const { config: inputConfig, output = console, telemetryLogger, workDir } = options;
42
+ // Apply defaults to config
43
+ const config = {
44
+ formatGeneratedCode: inputConfig.formatGeneratedCode ?? false,
45
+ generates: inputConfig.generates ?? 'sanity.types.ts',
46
+ overloadClientMethods: inputConfig.overloadClientMethods ?? false,
47
+ path: inputConfig.path ?? DEFAULT_QUERY_PATTERNS,
48
+ schema: inputConfig.schema ?? 'schema.json'
49
+ };
50
+ // Build query patterns from config
51
+ const queryPatterns = Array.isArray(config.path) ? config.path : [
52
+ config.path
53
+ ];
54
+ // Resolved after Vite config is available
55
+ let resolvedSchemaPath;
56
+ // State for concurrency control
57
+ let isGenerating = false;
58
+ let pendingGeneration = false;
59
+ // Stats for telemetry
60
+ const startTime = Date.now();
61
+ const stats = {
62
+ failedCount: 0,
63
+ successfulDurations: []
64
+ };
65
+ /**
66
+ * Runs type generation with concurrency control.
67
+ * If generation is already running, queues one more generation to run after completion.
68
+ * Returns the generation result, or null if generation was skipped or failed.
69
+ */ async function runGeneration(isBuilding = false) {
70
+ if (isGenerating) {
71
+ pendingGeneration = true;
72
+ return null;
73
+ }
74
+ isGenerating = true;
75
+ pendingGeneration = false;
76
+ const generationStartTime = Date.now();
77
+ try {
78
+ // Validate schema.json exists
79
+ if (!existsSync(resolvedSchemaPath)) {
80
+ output.error(`${logSymbols.error} Schema file not found: ${config.schema}\n` + `Run "sanity schema extract" first to generate the schema file.`);
81
+ return null;
82
+ }
83
+ const result = await runTypegenGenerate({
84
+ config,
85
+ workDir
86
+ });
87
+ if (isBuilding) {
88
+ // Add newline for better formatting in build output
89
+ output.log('');
90
+ }
91
+ if (result.filesWithErrors > 0) {
92
+ output.log(logSymbols.warning, `Generated types to ${config.generates} (with errors in ${result.filesWithErrors} file${result.filesWithErrors === 1 ? '' : 's'})`);
93
+ } else {
94
+ output.log(logSymbols.success, `Generated types to ${config.generates}`);
95
+ }
96
+ // Track stats for telemetry (all completed generations count as successful)
97
+ stats.successfulDurations.push(Date.now() - generationStartTime);
98
+ return result;
99
+ } catch (err) {
100
+ output.error(`${logSymbols.error} Generation failed: ${err instanceof Error ? err.message : String(err)}`);
101
+ stats.failedCount++;
102
+ return null;
103
+ } finally{
104
+ isGenerating = false;
105
+ // If a change came in during generation, run again
106
+ if (pendingGeneration) {
107
+ pendingGeneration = false;
108
+ void runGeneration();
109
+ }
110
+ }
111
+ }
112
+ const debouncedGenerate = debounce(()=>{
113
+ void runGeneration();
114
+ }, DEFAULT_DEBOUNCE_MS);
115
+ // Create a matcher function from query patterns
116
+ const isQueryMatch = picomatch(queryPatterns);
117
+ return {
118
+ name: 'sanity/typegen',
119
+ configResolved () {
120
+ const rootDir = workDir;
121
+ resolvedSchemaPath = path.isAbsolute(config.schema) ? config.schema : path.join(rootDir, config.schema);
122
+ },
123
+ configureServer (server) {
124
+ const trace = telemetryLogger?.trace(TypegenWatchModeTrace);
125
+ trace?.start();
126
+ trace?.log({
127
+ step: 'started'
128
+ });
129
+ // Build absolute patterns for query files
130
+ const absoluteQueryPatterns = queryPatterns.map((pattern)=>path.isAbsolute(pattern) ? pattern : path.join(workDir, pattern));
131
+ // Add query patterns AND schema.json to Vite's watcher
132
+ server.watcher.add([
133
+ ...absoluteQueryPatterns,
134
+ resolvedSchemaPath
135
+ ]);
136
+ // Listen for file changes
137
+ const handleChange = (filePath)=>{
138
+ const relativePath = path.isAbsolute(filePath) ? path.relative(workDir, filePath) : filePath;
139
+ // Normalize to forward slashes for cross-platform picomatch compatibility
140
+ const normalizedPath = toForwardSlashes(relativePath);
141
+ // Trigger on schema.json change OR matching query file
142
+ if (filePath === resolvedSchemaPath || isQueryMatch(normalizedPath)) {
143
+ debouncedGenerate();
144
+ }
145
+ };
146
+ // Prepare function to log "stopped" event to trace and complete the trace
147
+ const onClose = once(()=>{
148
+ // Cancel any pending debounced extractions
149
+ debouncedGenerate.cancel();
150
+ if (trace) {
151
+ trace.log({
152
+ averageGenerationDuration: mean(stats.successfulDurations) || 0,
153
+ generationFailedCount: stats.failedCount,
154
+ generationSuccessfulCount: stats.successfulDurations.length,
155
+ step: 'stopped',
156
+ watcherDuration: Date.now() - startTime
157
+ });
158
+ trace.complete();
159
+ }
160
+ // Clean up process listeners (must always run, not just when trace exists)
161
+ process.off('SIGTERM', onClose);
162
+ process.off('SIGINT', onClose);
163
+ });
164
+ server.watcher.on('change', handleChange);
165
+ server.watcher.on('add', handleChange);
166
+ server.watcher.on('unlink', handleChange);
167
+ // Call the onClose method when watcher is closed or when process is stopped/killed
168
+ server.watcher.on('close', onClose);
169
+ process.on('SIGTERM', onClose);
170
+ process.on('SIGINT', onClose);
171
+ // Run initial generation after server is ready
172
+ const startGeneration = ()=>{
173
+ setTimeout(()=>{
174
+ // Notify about typegen enabled
175
+ output.info(logSymbols.info, 'Typegen enabled. Watching:');
176
+ for (const pattern of queryPatterns){
177
+ output.info(` - ${pattern}`);
178
+ }
179
+ output.info(` - ${config.schema} (schema)`);
180
+ // Perform first generation
181
+ void runGeneration();
182
+ }, INITIAL_GENERATION_DELAY_MS);
183
+ };
184
+ if (server.httpServer) {
185
+ server.httpServer.once('listening', startGeneration);
186
+ } else {
187
+ // Middleware mode - no HTTP server, run generation immediately
188
+ startGeneration();
189
+ }
190
+ },
191
+ async buildEnd () {
192
+ // Build mode: One-time generation with telemetry tracking
193
+ const result = await runGeneration(true);
194
+ // Only log telemetry if generation completed successfully
195
+ if (result && telemetryLogger) {
196
+ const trace = telemetryLogger.trace(TypesGeneratedTrace);
197
+ trace.start();
198
+ trace.log({
199
+ configMethod: 'cli',
200
+ configOverloadClientMethods: config.overloadClientMethods ?? false,
201
+ emptyUnionTypeNodesGenerated: result.emptyUnionTypeNodesGenerated,
202
+ filesWithErrors: result.filesWithErrors,
203
+ outputSize: result.code.length,
204
+ queriesCount: result.queriesCount,
205
+ queryFilesCount: result.queryFilesCount,
206
+ schemaTypesCount: result.schemaTypesCount,
207
+ typeNodesGenerated: result.typeNodesGenerated,
208
+ unknownTypeNodesGenerated: result.unknownTypeNodesGenerated,
209
+ unknownTypeNodesRatio: result.typeNodesGenerated > 0 ? result.unknownTypeNodesGenerated / result.typeNodesGenerated : 0
210
+ });
211
+ trace.complete();
212
+ }
213
+ }
214
+ };
215
+ }
216
+
217
+ //# sourceMappingURL=plugin-typegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/vite/plugin-typegen.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport path from 'node:path'\n\nimport {CLITelemetryStore} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport {\n type GenerationResult,\n runTypegenGenerate,\n type TypeGenConfig,\n TypegenWatchModeTrace,\n TypesGeneratedTrace,\n} from '@sanity/codegen'\nimport debounce from 'lodash-es/debounce.js'\nimport mean from 'lodash-es/mean.js'\nimport once from 'lodash-es/once.js'\nimport picomatch from 'picomatch'\nimport {type Plugin} from 'vite'\n\nimport {toForwardSlashes} from '../../util/toForwardSlashes.js'\n\n/**\n * Default glob patterns to watch for query file changes.\n * Covers common source directory naming conventions.\n */\nconst DEFAULT_QUERY_PATTERNS = ['./src/**/*.{ts,tsx,js,jsx}', './app/**/*.{ts,tsx,js,jsx}']\n\n/** Default debounce delay in milliseconds */\nconst DEFAULT_DEBOUNCE_MS = 1000\n\n/**\n * Delay before initial generation to allow Vite to finish startup\n * and avoid race conditions with module resolution.\n */\nconst INITIAL_GENERATION_DELAY_MS = 1000\n\n/**\n * Options for the Sanity typegen Vite plugin.\n *\n * @internal\n */\ninterface TypegenPluginOptions {\n /**\n * Typegen configuration from sanity.cli.ts.\n * All fields are optional and will use sensible defaults.\n */\n config: Partial<TypeGenConfig>\n\n /**\n * Working directory containing the Sanity configuration.\n * This should be the root of your Sanity Studio project.\n */\n workDir: string\n\n /**\n * Logger for output messages. Must implement `log`, `info`, and `error` methods.\n * @defaultValue `console`\n */\n output?: Pick<Console, 'error' | 'info' | 'log'>\n\n /**\n * Telemetry logger for the Sanity CLI tooling.\n */\n telemetryLogger?: CLITelemetryStore\n}\n\n/**\n * Creates a Vite plugin that automatically generates TypeScript types during development and build.\n *\n * **During development:**\n * The plugin performs an initial generation when the dev server starts, then watches\n * for file changes and re-generates types when relevant files are modified.\n *\n * **During build:**\n * The plugin generates types once at the end of the build process.\n *\n * **Prerequisites:**\n * The schema.json file must exist before typegen can run. Run `sanity schema extract`\n * first to generate the schema file.\n *\n * @param options - Configuration options for the plugin\n * @returns A Vite plugin configured for typegen\n *\n * @internal\n */\nexport function sanityTypegenPlugin(options: TypegenPluginOptions): Plugin {\n const {config: inputConfig, output = console, telemetryLogger, workDir} = options\n\n // Apply defaults to config\n const config: TypeGenConfig = {\n formatGeneratedCode: inputConfig.formatGeneratedCode ?? false,\n generates: inputConfig.generates ?? 'sanity.types.ts',\n overloadClientMethods: inputConfig.overloadClientMethods ?? false,\n path: inputConfig.path ?? DEFAULT_QUERY_PATTERNS,\n schema: inputConfig.schema ?? 'schema.json',\n }\n\n // Build query patterns from config\n const queryPatterns = Array.isArray(config.path) ? config.path : [config.path]\n\n // Resolved after Vite config is available\n let resolvedSchemaPath: string\n\n // State for concurrency control\n let isGenerating = false\n let pendingGeneration = false\n\n // Stats for telemetry\n const startTime = Date.now()\n const stats: {failedCount: number; successfulDurations: number[]} = {\n failedCount: 0,\n successfulDurations: [],\n }\n\n /**\n * Runs type generation with concurrency control.\n * If generation is already running, queues one more generation to run after completion.\n * Returns the generation result, or null if generation was skipped or failed.\n */\n async function runGeneration(isBuilding = false): Promise<GenerationResult | null> {\n if (isGenerating) {\n pendingGeneration = true\n return null\n }\n\n isGenerating = true\n pendingGeneration = false\n\n const generationStartTime = Date.now()\n\n try {\n // Validate schema.json exists\n if (!existsSync(resolvedSchemaPath)) {\n output.error(\n `${logSymbols.error} Schema file not found: ${config.schema}\\n` +\n `Run \"sanity schema extract\" first to generate the schema file.`,\n )\n return null\n }\n\n const result = await runTypegenGenerate({\n config,\n workDir,\n })\n\n if (isBuilding) {\n // Add newline for better formatting in build output\n output.log('')\n }\n\n if (result.filesWithErrors > 0) {\n output.log(\n logSymbols.warning,\n `Generated types to ${config.generates} (with errors in ${result.filesWithErrors} file${result.filesWithErrors === 1 ? '' : 's'})`,\n )\n } else {\n output.log(logSymbols.success, `Generated types to ${config.generates}`)\n }\n\n // Track stats for telemetry (all completed generations count as successful)\n stats.successfulDurations.push(Date.now() - generationStartTime)\n\n return result\n } catch (err) {\n output.error(\n `${logSymbols.error} Generation failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n stats.failedCount++\n return null\n } finally {\n isGenerating = false\n\n // If a change came in during generation, run again\n if (pendingGeneration) {\n pendingGeneration = false\n void runGeneration()\n }\n }\n }\n\n const debouncedGenerate = debounce(() => {\n void runGeneration()\n }, DEFAULT_DEBOUNCE_MS)\n\n // Create a matcher function from query patterns\n const isQueryMatch = picomatch(queryPatterns)\n\n return {\n name: 'sanity/typegen',\n\n configResolved() {\n const rootDir = workDir\n\n resolvedSchemaPath = path.isAbsolute(config.schema)\n ? config.schema\n : path.join(rootDir, config.schema)\n },\n\n configureServer(server) {\n const trace = telemetryLogger?.trace(TypegenWatchModeTrace)\n trace?.start()\n trace?.log({step: 'started'})\n\n // Build absolute patterns for query files\n const absoluteQueryPatterns = queryPatterns.map((pattern) =>\n path.isAbsolute(pattern) ? pattern : path.join(workDir, pattern),\n )\n\n // Add query patterns AND schema.json to Vite's watcher\n server.watcher.add([...absoluteQueryPatterns, resolvedSchemaPath])\n\n // Listen for file changes\n const handleChange = (filePath: string) => {\n const relativePath = path.isAbsolute(filePath) ? path.relative(workDir, filePath) : filePath\n // Normalize to forward slashes for cross-platform picomatch compatibility\n const normalizedPath = toForwardSlashes(relativePath)\n\n // Trigger on schema.json change OR matching query file\n if (filePath === resolvedSchemaPath || isQueryMatch(normalizedPath)) {\n debouncedGenerate()\n }\n }\n\n // Prepare function to log \"stopped\" event to trace and complete the trace\n const onClose = once(() => {\n // Cancel any pending debounced extractions\n debouncedGenerate.cancel()\n\n if (trace) {\n trace.log({\n averageGenerationDuration: mean(stats.successfulDurations) || 0,\n generationFailedCount: stats.failedCount,\n generationSuccessfulCount: stats.successfulDurations.length,\n step: 'stopped',\n watcherDuration: Date.now() - startTime,\n })\n trace.complete()\n }\n\n // Clean up process listeners (must always run, not just when trace exists)\n process.off('SIGTERM', onClose)\n process.off('SIGINT', onClose)\n })\n\n server.watcher.on('change', handleChange)\n server.watcher.on('add', handleChange)\n server.watcher.on('unlink', handleChange)\n\n // Call the onClose method when watcher is closed or when process is stopped/killed\n server.watcher.on('close', onClose)\n process.on('SIGTERM', onClose)\n process.on('SIGINT', onClose)\n\n // Run initial generation after server is ready\n const startGeneration = () => {\n setTimeout(() => {\n // Notify about typegen enabled\n output.info(logSymbols.info, 'Typegen enabled. Watching:')\n for (const pattern of queryPatterns) {\n output.info(` - ${pattern}`)\n }\n output.info(` - ${config.schema} (schema)`)\n\n // Perform first generation\n void runGeneration()\n }, INITIAL_GENERATION_DELAY_MS)\n }\n\n if (server.httpServer) {\n server.httpServer.once('listening', startGeneration)\n } else {\n // Middleware mode - no HTTP server, run generation immediately\n startGeneration()\n }\n },\n\n async buildEnd() {\n // Build mode: One-time generation with telemetry tracking\n const result = await runGeneration(true)\n\n // Only log telemetry if generation completed successfully\n if (result && telemetryLogger) {\n const trace = telemetryLogger.trace(TypesGeneratedTrace)\n trace.start()\n trace.log({\n configMethod: 'cli',\n configOverloadClientMethods: config.overloadClientMethods ?? false,\n emptyUnionTypeNodesGenerated: result.emptyUnionTypeNodesGenerated,\n filesWithErrors: result.filesWithErrors,\n outputSize: result.code.length,\n queriesCount: result.queriesCount,\n queryFilesCount: result.queryFilesCount,\n schemaTypesCount: result.schemaTypesCount,\n typeNodesGenerated: result.typeNodesGenerated,\n unknownTypeNodesGenerated: result.unknownTypeNodesGenerated,\n unknownTypeNodesRatio:\n result.typeNodesGenerated > 0\n ? result.unknownTypeNodesGenerated / result.typeNodesGenerated\n : 0,\n })\n trace.complete()\n }\n },\n } satisfies Plugin\n}\n"],"names":["existsSync","path","logSymbols","runTypegenGenerate","TypegenWatchModeTrace","TypesGeneratedTrace","debounce","mean","once","picomatch","toForwardSlashes","DEFAULT_QUERY_PATTERNS","DEFAULT_DEBOUNCE_MS","INITIAL_GENERATION_DELAY_MS","sanityTypegenPlugin","options","config","inputConfig","output","console","telemetryLogger","workDir","formatGeneratedCode","generates","overloadClientMethods","schema","queryPatterns","Array","isArray","resolvedSchemaPath","isGenerating","pendingGeneration","startTime","Date","now","stats","failedCount","successfulDurations","runGeneration","isBuilding","generationStartTime","error","result","log","filesWithErrors","warning","success","push","err","Error","message","String","debouncedGenerate","isQueryMatch","name","configResolved","rootDir","isAbsolute","join","configureServer","server","trace","start","step","absoluteQueryPatterns","map","pattern","watcher","add","handleChange","filePath","relativePath","relative","normalizedPath","onClose","cancel","averageGenerationDuration","generationFailedCount","generationSuccessfulCount","length","watcherDuration","complete","process","off","on","startGeneration","setTimeout","info","httpServer","buildEnd","configMethod","configOverloadClientMethods","emptyUnionTypeNodesGenerated","outputSize","code","queriesCount","queryFilesCount","schemaTypesCount","typeNodesGenerated","unknownTypeNodesGenerated","unknownTypeNodesRatio"],"mappings":"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"}
@@ -1,13 +1,52 @@
1
1
  import { getGlobalCliClient } from '@sanity/cli-core';
2
- export const AUTH_API_VERSION = '2025-09-23';
3
- export async function logout() {
4
- const client = await getGlobalCliClient({
2
+ export const AUTH_API_VERSION = 'v2025-09-23';
3
+ async function getUnauthenticatedClient() {
4
+ return getGlobalCliClient({
5
+ apiVersion: AUTH_API_VERSION,
6
+ unauthenticated: true
7
+ });
8
+ }
9
+ /**
10
+ * Invalidate the current user session
11
+ *
12
+ * @param token - Optional token to invalidate.
13
+ */ export async function logout(token) {
14
+ let client = await getGlobalCliClient({
5
15
  apiVersion: AUTH_API_VERSION
6
16
  });
17
+ if (token) {
18
+ client = client.withConfig({
19
+ token
20
+ });
21
+ }
7
22
  return client.request({
8
23
  method: 'POST',
9
24
  uri: '/auth/logout'
10
25
  });
11
26
  }
27
+ export async function getProviders() {
28
+ const client = await getUnauthenticatedClient();
29
+ return client.request({
30
+ uri: '/auth/providers'
31
+ });
32
+ }
33
+ export async function getVercelProviderUrl() {
34
+ const client = (await getUnauthenticatedClient()).withConfig({
35
+ apiVersion: 'v1'
36
+ });
37
+ return client.getUrl('/auth/login/vercel');
38
+ }
39
+ export async function getSSOProviders(orgSlug) {
40
+ const client = await getUnauthenticatedClient();
41
+ return client.request({
42
+ uri: `/auth/organizations/by-slug/${orgSlug}/providers`
43
+ });
44
+ }
45
+ export async function getTokenDetails(queryString) {
46
+ const client = await getUnauthenticatedClient();
47
+ return client.request({
48
+ uri: `/auth/fetch${queryString}`
49
+ });
50
+ }
12
51
 
13
52
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/services/auth.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nexport const AUTH_API_VERSION = '2025-09-23'\n\nexport async function logout() {\n const client = await getGlobalCliClient({apiVersion: AUTH_API_VERSION})\n\n return client.request({method: 'POST', uri: '/auth/logout'})\n}\n"],"names":["getGlobalCliClient","AUTH_API_VERSION","logout","client","apiVersion","request","method","uri"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAEnD,OAAO,MAAMC,mBAAmB,aAAY;AAE5C,OAAO,eAAeC;IACpB,MAAMC,SAAS,MAAMH,mBAAmB;QAACI,YAAYH;IAAgB;IAErE,OAAOE,OAAOE,OAAO,CAAC;QAACC,QAAQ;QAAQC,KAAK;IAAc;AAC5D"}
1
+ {"version":3,"sources":["../../src/services/auth.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nimport {\n type ProvidersResponse,\n type SamlLoginProvider,\n type TokenDetails,\n} from '../actions/auth/types.js'\n\nexport const AUTH_API_VERSION = 'v2025-09-23'\n\nasync function getUnauthenticatedClient() {\n return getGlobalCliClient({apiVersion: AUTH_API_VERSION, unauthenticated: true})\n}\n\n/**\n * Invalidate the current user session\n *\n * @param token - Optional token to invalidate.\n */\nexport async function logout(token?: string) {\n let client = await getGlobalCliClient({apiVersion: AUTH_API_VERSION})\n\n if (token) {\n client = client.withConfig({token})\n }\n\n return client.request({method: 'POST', uri: '/auth/logout'})\n}\n\nexport async function getProviders() {\n const client = await getUnauthenticatedClient()\n\n return client.request<ProvidersResponse>({uri: '/auth/providers'})\n}\n\nexport async function getVercelProviderUrl() {\n const client = (await getUnauthenticatedClient()).withConfig({apiVersion: 'v1'})\n return client.getUrl('/auth/login/vercel')\n}\n\nexport async function getSSOProviders(orgSlug: string) {\n const client = await getUnauthenticatedClient()\n\n return client.request<SamlLoginProvider[]>({\n uri: `/auth/organizations/by-slug/${orgSlug}/providers`,\n })\n}\n\nexport async function getTokenDetails(queryString: string) {\n const client = await getUnauthenticatedClient()\n\n return client.request<TokenDetails>({uri: `/auth/fetch${queryString}`})\n}\n"],"names":["getGlobalCliClient","AUTH_API_VERSION","getUnauthenticatedClient","apiVersion","unauthenticated","logout","token","client","withConfig","request","method","uri","getProviders","getVercelProviderUrl","getUrl","getSSOProviders","orgSlug","getTokenDetails","queryString"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAQnD,OAAO,MAAMC,mBAAmB,cAAa;AAE7C,eAAeC;IACb,OAAOF,mBAAmB;QAACG,YAAYF;QAAkBG,iBAAiB;IAAI;AAChF;AAEA;;;;CAIC,GACD,OAAO,eAAeC,OAAOC,KAAc;IACzC,IAAIC,SAAS,MAAMP,mBAAmB;QAACG,YAAYF;IAAgB;IAEnE,IAAIK,OAAO;QACTC,SAASA,OAAOC,UAAU,CAAC;YAACF;QAAK;IACnC;IAEA,OAAOC,OAAOE,OAAO,CAAC;QAACC,QAAQ;QAAQC,KAAK;IAAc;AAC5D;AAEA,OAAO,eAAeC;IACpB,MAAML,SAAS,MAAML;IAErB,OAAOK,OAAOE,OAAO,CAAoB;QAACE,KAAK;IAAiB;AAClE;AAEA,OAAO,eAAeE;IACpB,MAAMN,SAAS,AAAC,CAAA,MAAML,0BAAyB,EAAGM,UAAU,CAAC;QAACL,YAAY;IAAI;IAC9E,OAAOI,OAAOO,MAAM,CAAC;AACvB;AAEA,OAAO,eAAeC,gBAAgBC,OAAe;IACnD,MAAMT,SAAS,MAAML;IAErB,OAAOK,OAAOE,OAAO,CAAsB;QACzCE,KAAK,CAAC,4BAA4B,EAAEK,QAAQ,UAAU,CAAC;IACzD;AACF;AAEA,OAAO,eAAeC,gBAAgBC,WAAmB;IACvD,MAAMX,SAAS,MAAML;IAErB,OAAOK,OAAOE,OAAO,CAAe;QAACE,KAAK,CAAC,WAAW,EAAEO,aAAa;IAAA;AACvE"}
@@ -29,14 +29,16 @@ export async function editDatasetAcl({ aclMode, datasetName, projectId }) {
29
29
  aclMode
30
30
  });
31
31
  }
32
- export async function createDataset({ aclMode, datasetName, projectId }) {
32
+ export async function createDataset({ aclMode, datasetName, embeddings, projectId }) {
33
33
  const client = await getDatasetClient(projectId);
34
+ const options = {};
34
35
  if (aclMode) {
35
- return client.datasets.create(datasetName, {
36
- aclMode
37
- });
36
+ options.aclMode = aclMode;
37
+ }
38
+ if (embeddings) {
39
+ options.embeddings = embeddings;
38
40
  }
39
- return client.datasets.create(datasetName);
41
+ return client.datasets.create(datasetName, options);
40
42
  }
41
43
  export async function copyDataset({ projectId, skipHistory, sourceDataset, targetDataset }) {
42
44
  const client = await getDatasetClient(projectId);