@sanity/cli 6.0.0-alpha.17 → 6.0.0-alpha.19

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 (249) hide show
  1. package/README.md +833 -912
  2. package/dist/SanityHelp.js +74 -21
  3. package/dist/SanityHelp.js.map +1 -1
  4. package/dist/actions/build/buildApp.js +42 -15
  5. package/dist/actions/build/buildApp.js.map +1 -1
  6. package/dist/actions/build/buildStudio.js +21 -9
  7. package/dist/actions/build/buildStudio.js.map +1 -1
  8. package/dist/actions/build/buildVendorDependencies.js +3 -16
  9. package/dist/actions/build/buildVendorDependencies.js.map +1 -1
  10. package/dist/actions/build/checkStudioDependencyVersions.js +7 -7
  11. package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -1
  12. package/dist/actions/build/createExternalFromImportMap.js +1 -1
  13. package/dist/actions/build/createExternalFromImportMap.js.map +1 -1
  14. package/dist/actions/build/determineBasePath.js +5 -2
  15. package/dist/actions/build/determineBasePath.js.map +1 -1
  16. package/dist/actions/build/getViteConfig.js +47 -4
  17. package/dist/actions/build/getViteConfig.js.map +1 -1
  18. package/dist/actions/build/handlePrereleaseVersions.js +44 -0
  19. package/dist/actions/build/handlePrereleaseVersions.js.map +1 -0
  20. package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js +1 -0
  21. package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js.map +1 -1
  22. package/dist/actions/build/types.js.map +1 -1
  23. package/dist/actions/build/writeSanityRuntime.js +4 -3
  24. package/dist/actions/build/writeSanityRuntime.js.map +1 -1
  25. package/dist/actions/dataset/create.js +7 -1
  26. package/dist/actions/dataset/create.js.map +1 -1
  27. package/dist/actions/dataset/resolveDataset.js +26 -0
  28. package/dist/actions/dataset/resolveDataset.js.map +1 -0
  29. package/dist/actions/deploy/deployApp.js +1 -8
  30. package/dist/actions/deploy/deployApp.js.map +1 -1
  31. package/dist/actions/deploy/deployStudio.js +1 -0
  32. package/dist/actions/deploy/deployStudio.js.map +1 -1
  33. package/dist/actions/dev/getDashboardAppUrl.js +48 -0
  34. package/dist/actions/dev/getDashboardAppUrl.js.map +1 -0
  35. package/dist/actions/dev/getDevServerConfig.js +7 -3
  36. package/dist/actions/dev/getDevServerConfig.js.map +1 -1
  37. package/dist/actions/dev/startAppDevServer.js +3 -3
  38. package/dist/actions/dev/startAppDevServer.js.map +1 -1
  39. package/dist/actions/dev/startStudioDevServer.js +12 -12
  40. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  41. package/dist/actions/documents/types.js.map +1 -1
  42. package/dist/actions/documents/validate.js +11 -2
  43. package/dist/actions/documents/validate.js.map +1 -1
  44. package/dist/actions/documents/validateDocuments.worker.js +2 -2
  45. package/dist/actions/documents/validateDocuments.worker.js.map +1 -1
  46. package/dist/actions/documents/validation/reporters/jsonReporter.js +1 -1
  47. package/dist/actions/documents/validation/reporters/jsonReporter.js.map +1 -1
  48. package/dist/actions/documents/validation/reporters/ndjsonReporter.js +1 -1
  49. package/dist/actions/documents/validation/reporters/ndjsonReporter.js.map +1 -1
  50. package/dist/actions/graphql/SchemaError.js +1 -1
  51. package/dist/actions/graphql/SchemaError.js.map +1 -1
  52. package/dist/actions/graphql/__tests__/fixtures/many-self-refs.js +540 -0
  53. package/dist/actions/graphql/__tests__/fixtures/many-self-refs.js.map +1 -0
  54. package/dist/actions/graphql/__tests__/fixtures/test-studio.js +1143 -0
  55. package/dist/actions/graphql/__tests__/fixtures/test-studio.js.map +1 -0
  56. package/dist/actions/graphql/__tests__/fixtures/union-refs.js +591 -0
  57. package/dist/actions/graphql/__tests__/fixtures/union-refs.js.map +1 -0
  58. package/dist/actions/graphql/__tests__/helpers.js +23 -0
  59. package/dist/actions/graphql/__tests__/helpers.js.map +1 -0
  60. package/dist/actions/graphql/extractFromSanitySchema.js +2 -1
  61. package/dist/actions/graphql/extractFromSanitySchema.js.map +1 -1
  62. package/dist/actions/graphql/gen1/generateTypeFilters.js +1 -1
  63. package/dist/actions/graphql/gen1/generateTypeFilters.js.map +1 -1
  64. package/dist/actions/graphql/gen1/generateTypeQueries.js +2 -1
  65. package/dist/actions/graphql/gen1/generateTypeQueries.js.map +1 -1
  66. package/dist/actions/graphql/gen2/generateTypeQueries.js +1 -1
  67. package/dist/actions/graphql/gen2/generateTypeQueries.js.map +1 -1
  68. package/dist/actions/graphql/gen3/generateTypeQueries.js +1 -1
  69. package/dist/actions/graphql/gen3/generateTypeQueries.js.map +1 -1
  70. package/dist/actions/graphql/getGraphQLAPIs.js +2 -10
  71. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  72. package/dist/actions/graphql/getGraphQLAPIs.worker.js +1 -1
  73. package/dist/actions/graphql/getGraphQLAPIs.worker.js.map +1 -1
  74. package/dist/actions/graphql/types.js.map +1 -1
  75. package/dist/actions/init/bootstrapLocalTemplate.js +1 -1
  76. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
  77. package/dist/actions/manifest/extractAppManifest.js.map +1 -1
  78. package/dist/actions/manifest/extractManifest.js +1 -22
  79. package/dist/actions/manifest/extractManifest.js.map +1 -1
  80. package/dist/actions/manifest/types.js.map +1 -1
  81. package/dist/actions/schema/deploySchemas.js +57 -80
  82. package/dist/actions/schema/deploySchemas.js.map +1 -1
  83. package/dist/actions/schema/extractSanityWorkspace.worker.js +24 -0
  84. package/dist/actions/schema/extractSanityWorkspace.worker.js.map +1 -0
  85. package/dist/actions/schema/extractSchemaWatcher.js +9 -7
  86. package/dist/actions/schema/extractSchemaWatcher.js.map +1 -1
  87. package/dist/actions/schema/matchSchemaPattern.js +22 -0
  88. package/dist/actions/schema/matchSchemaPattern.js.map +1 -0
  89. package/dist/actions/schema/runSchemaExtraction.js.map +1 -1
  90. package/dist/actions/schema/types.js +4 -0
  91. package/dist/actions/schema/types.js.map +1 -1
  92. package/dist/actions/schema/utils/schemaStoreValidation.js +1 -7
  93. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  94. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +1 -1
  95. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -1
  96. package/dist/actions/schema/watchExtractSchema.js +2 -1
  97. package/dist/actions/schema/watchExtractSchema.js.map +1 -1
  98. package/dist/actions/versions/getFormatters.js +1 -1
  99. package/dist/actions/versions/getFormatters.js.map +1 -1
  100. package/dist/commands/backup/disable.js +0 -6
  101. package/dist/commands/backup/disable.js.map +1 -1
  102. package/dist/commands/backup/download.js +0 -6
  103. package/dist/commands/backup/download.js.map +1 -1
  104. package/dist/commands/backup/enable.js +0 -6
  105. package/dist/commands/backup/enable.js.map +1 -1
  106. package/dist/commands/backup/list.js +4 -7
  107. package/dist/commands/backup/list.js.map +1 -1
  108. package/dist/commands/cors/add.js +0 -6
  109. package/dist/commands/cors/add.js.map +1 -1
  110. package/dist/commands/cors/delete.js +0 -6
  111. package/dist/commands/cors/delete.js.map +1 -1
  112. package/dist/commands/cors/list.js +0 -6
  113. package/dist/commands/cors/list.js.map +1 -1
  114. package/dist/commands/dataset/alias/create.js +23 -7
  115. package/dist/commands/dataset/alias/create.js.map +1 -1
  116. package/dist/commands/dataset/alias/delete.js +17 -7
  117. package/dist/commands/dataset/alias/delete.js.map +1 -1
  118. package/dist/commands/dataset/alias/link.js +17 -7
  119. package/dist/commands/dataset/alias/link.js.map +1 -1
  120. package/dist/commands/dataset/alias/unlink.js +17 -7
  121. package/dist/commands/dataset/alias/unlink.js.map +1 -1
  122. package/dist/commands/dataset/copy.js +42 -30
  123. package/dist/commands/dataset/copy.js.map +1 -1
  124. package/dist/commands/dataset/create.js +29 -7
  125. package/dist/commands/dataset/create.js.map +1 -1
  126. package/dist/commands/dataset/delete.js +13 -7
  127. package/dist/commands/dataset/delete.js.map +1 -1
  128. package/dist/commands/dataset/embeddings/disable.js +74 -0
  129. package/dist/commands/dataset/embeddings/disable.js.map +1 -0
  130. package/dist/commands/dataset/embeddings/enable.js +138 -0
  131. package/dist/commands/dataset/embeddings/enable.js.map +1 -0
  132. package/dist/commands/dataset/embeddings/status.js +69 -0
  133. package/dist/commands/dataset/embeddings/status.js.map +1 -0
  134. package/dist/commands/dataset/export.js +30 -18
  135. package/dist/commands/dataset/export.js.map +1 -1
  136. package/dist/commands/dataset/list.js +19 -7
  137. package/dist/commands/dataset/list.js.map +1 -1
  138. package/dist/commands/dataset/visibility/get.js +15 -7
  139. package/dist/commands/dataset/visibility/get.js.map +1 -1
  140. package/dist/commands/dataset/visibility/set.js +19 -7
  141. package/dist/commands/dataset/visibility/set.js.map +1 -1
  142. package/dist/commands/debug.js +2 -1
  143. package/dist/commands/debug.js.map +1 -1
  144. package/dist/commands/documents/create.js +2 -7
  145. package/dist/commands/documents/create.js.map +1 -1
  146. package/dist/commands/documents/delete.js +0 -6
  147. package/dist/commands/documents/delete.js.map +1 -1
  148. package/dist/commands/documents/get.js +0 -6
  149. package/dist/commands/documents/get.js.map +1 -1
  150. package/dist/commands/documents/query.js +0 -6
  151. package/dist/commands/documents/query.js.map +1 -1
  152. package/dist/commands/graphql/deploy.js +1 -1
  153. package/dist/commands/graphql/deploy.js.map +1 -1
  154. package/dist/commands/graphql/list.js +0 -6
  155. package/dist/commands/graphql/list.js.map +1 -1
  156. package/dist/commands/graphql/undeploy.js +0 -6
  157. package/dist/commands/graphql/undeploy.js.map +1 -1
  158. package/dist/commands/hook/attempt.js +0 -6
  159. package/dist/commands/hook/attempt.js.map +1 -1
  160. package/dist/commands/hook/create.js +0 -6
  161. package/dist/commands/hook/create.js.map +1 -1
  162. package/dist/commands/hook/delete.js +0 -6
  163. package/dist/commands/hook/delete.js.map +1 -1
  164. package/dist/commands/hook/list.js +0 -6
  165. package/dist/commands/hook/list.js.map +1 -1
  166. package/dist/commands/hook/logs.js +1 -7
  167. package/dist/commands/hook/logs.js.map +1 -1
  168. package/dist/commands/init.js +13 -7
  169. package/dist/commands/init.js.map +1 -1
  170. package/dist/commands/manage.js +0 -1
  171. package/dist/commands/manage.js.map +1 -1
  172. package/dist/commands/media/create-aspect.js +1 -1
  173. package/dist/commands/media/create-aspect.js.map +1 -1
  174. package/dist/commands/media/delete-aspect.js +0 -6
  175. package/dist/commands/media/delete-aspect.js.map +1 -1
  176. package/dist/commands/media/deploy-aspect.js +1 -6
  177. package/dist/commands/media/deploy-aspect.js.map +1 -1
  178. package/dist/commands/media/export.js +0 -6
  179. package/dist/commands/media/export.js.map +1 -1
  180. package/dist/commands/media/import.js +0 -6
  181. package/dist/commands/media/import.js.map +1 -1
  182. package/dist/commands/projects/list.js +2 -1
  183. package/dist/commands/projects/list.js.map +1 -1
  184. package/dist/commands/schema/delete.js +0 -6
  185. package/dist/commands/schema/delete.js.map +1 -1
  186. package/dist/commands/schema/deploy.js +11 -27
  187. package/dist/commands/schema/deploy.js.map +1 -1
  188. package/dist/commands/tokens/add.js +0 -6
  189. package/dist/commands/tokens/add.js.map +1 -1
  190. package/dist/commands/tokens/delete.js +0 -6
  191. package/dist/commands/tokens/delete.js.map +1 -1
  192. package/dist/commands/tokens/list.js +0 -6
  193. package/dist/commands/tokens/list.js.map +1 -1
  194. package/dist/commands/users/invite.js +0 -6
  195. package/dist/commands/users/invite.js.map +1 -1
  196. package/dist/commands/users/list.js +1 -7
  197. package/dist/commands/users/list.js.map +1 -1
  198. package/dist/commands/versions.js +1 -1
  199. package/dist/commands/versions.js.map +1 -1
  200. package/dist/exports/index.d.ts +62 -2
  201. package/dist/exports/index.js.map +1 -1
  202. package/dist/prompts/promptForProject.js +64 -0
  203. package/dist/prompts/promptForProject.js.map +1 -0
  204. package/dist/prompts/selectMediaLibrary.js +1 -1
  205. package/dist/prompts/selectMediaLibrary.js.map +1 -1
  206. package/dist/server/devServer.js +4 -2
  207. package/dist/server/devServer.js.map +1 -1
  208. package/dist/server/vite/plugin-schema-extraction.js +201 -0
  209. package/dist/server/vite/plugin-schema-extraction.js.map +1 -0
  210. package/dist/server/vite/plugin-typegen.js +217 -0
  211. package/dist/server/vite/plugin-typegen.js.map +1 -0
  212. package/dist/services/datasets.js +7 -5
  213. package/dist/services/datasets.js.map +1 -1
  214. package/dist/services/embeddings.js +25 -0
  215. package/dist/services/embeddings.js.map +1 -0
  216. package/dist/services/grants.js +13 -0
  217. package/dist/services/grants.js.map +1 -0
  218. package/dist/services/graphql.js.map +1 -1
  219. package/dist/services/schemas.js +1 -1
  220. package/dist/services/schemas.js.map +1 -1
  221. package/dist/types/grants.js +3 -0
  222. package/dist/types/grants.js.map +1 -0
  223. package/dist/types.js.map +1 -1
  224. package/dist/util/checkProjectPermissions.js +21 -0
  225. package/dist/util/checkProjectPermissions.js.map +1 -0
  226. package/dist/util/compareDependencyVersions.js +28 -7
  227. package/dist/util/compareDependencyVersions.js.map +1 -1
  228. package/dist/util/errorMessages.js +0 -1
  229. package/dist/util/errorMessages.js.map +1 -1
  230. package/dist/util/getSharedServerConfig.js +1 -0
  231. package/dist/util/getSharedServerConfig.js.map +1 -1
  232. package/dist/util/packageManager/getPeerDependencies.js +44 -0
  233. package/dist/util/packageManager/getPeerDependencies.js.map +1 -0
  234. package/dist/util/sharedFlags.js +19 -0
  235. package/dist/util/sharedFlags.js.map +1 -0
  236. package/dist/util/toForwardSlashes.js +8 -0
  237. package/dist/util/toForwardSlashes.js.map +1 -0
  238. package/oclif.manifest.json +639 -379
  239. package/package.json +23 -22
  240. package/dist/actions/dev/getCoreAppUrl.js +0 -10
  241. package/dist/actions/dev/getCoreAppUrl.js.map +0 -1
  242. package/dist/actions/schema/schemaStoreTypes.js +0 -19
  243. package/dist/actions/schema/schemaStoreTypes.js.map +0 -1
  244. package/dist/actions/schema/utils/manifestExtractor.js +0 -29
  245. package/dist/actions/schema/utils/manifestExtractor.js.map +0 -1
  246. package/dist/actions/schema/utils/manifestReader.js +0 -71
  247. package/dist/actions/schema/utils/manifestReader.js.map +0 -1
  248. package/dist/util/workerChannels.js +0 -172
  249. package/dist/util/workerChannels.js.map +0 -1
@@ -9,14 +9,14 @@ const DEFAULT_PACKAGES = [
9
9
  deprecatedBelow: null,
10
10
  name: 'react',
11
11
  supported: [
12
- '^18 || ^19'
12
+ '^19.2.2'
13
13
  ]
14
14
  },
15
15
  {
16
16
  deprecatedBelow: null,
17
17
  name: 'react-dom',
18
18
  supported: [
19
- '^18 || ^19'
19
+ '^19.2.2'
20
20
  ]
21
21
  },
22
22
  {
@@ -27,7 +27,7 @@ const DEFAULT_PACKAGES = [
27
27
  ]
28
28
  },
29
29
  {
30
- deprecatedBelow: null,
30
+ deprecatedBelow: '^3',
31
31
  name: '@sanity/ui',
32
32
  supported: [
33
33
  '^2',
@@ -57,10 +57,10 @@ export async function checkStudioDependencyVersions(workDir, output, { packages
57
57
  // "Untested" is usually the case where we have not upgraded the React version requirements
58
58
  // before a release, but given that is usually works in a backwards-compatible way, we want
59
59
  // to indicate that it's _untested_, not necessarily _unsupported_
60
- // Ex: Installed is react@19.0.0, but we've only _tested_ with react@^18
60
+ // Ex: Installed is react@20.0.0, but we've only _tested_ with react@^19
61
61
  const isUntested = !semver.satisfies(installed, supported) && semver.gtr(installed, supported);
62
62
  // "Unsupported" in that the installed version is _lower than_ the minimum version
63
- // Ex: Installed is react@15.0.0, but we require react@^16
63
+ // Ex: Installed is react@18.0.0, but we require react@^19.2
64
64
  const isUnsupported = !semver.satisfies(installed, supported) && !isUntested;
65
65
  // "Deprecated" in that we will stop supporting it at some point in the near future,
66
66
  // so users should be prompted to upgrade
@@ -116,7 +116,7 @@ function getUpgradeInstructions(pkgs) {
116
116
  const [highestSupported] = pkg.supported.map((version)=>(semver.coerce(version) || {
117
117
  version: ''
118
118
  }).version).toSorted(semver.rcompare);
119
- return `"${pkg.name}@${highestSupported}"`;
119
+ return `"${pkg.name}@^${highestSupported}"`;
120
120
  }).join(' ');
121
121
  return `To upgrade, run either:
122
122
 
@@ -138,7 +138,7 @@ function getDowngradeInstructions(pkgs) {
138
138
  const [highestSupported] = pkg.supported.map((version)=>(semver.coerce(version) || {
139
139
  version: ''
140
140
  }).version).toSorted(semver.rcompare);
141
- return `"${pkg.name}@${highestSupported}"`;
141
+ return `"${pkg.name}@^${highestSupported}"`;
142
142
  }).join(' ');
143
143
  return `To downgrade, run either:
144
144
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/checkStudioDependencyVersions.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type Output, readPackageJson} from '@sanity/cli-core'\nimport semver, {type SemVer} from 'semver'\n\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\n\ninterface PackageInfo {\n deprecatedBelow: string | null\n installed: SemVer\n isDeprecated: boolean\n isUnsupported: boolean\n isUntested: boolean\n name: string\n supported: string[]\n}\n\ninterface TrackedPackage {\n deprecatedBelow: string | null\n name: string\n supported: string[]\n}\n\n// NOTE: when doing changes here, also remember to update versions in help docs at\n// https://sanity.io/admin/structure/docs;helpArticle;upgrade-packages\nconst DEFAULT_PACKAGES: TrackedPackage[] = [\n {deprecatedBelow: null, name: 'react', supported: ['^18 || ^19']},\n {deprecatedBelow: null, name: 'react-dom', supported: ['^18 || ^19']},\n {deprecatedBelow: null, name: 'styled-components', supported: ['^6']},\n {deprecatedBelow: null, name: '@sanity/ui', supported: ['^2', '^3']},\n]\n\nexport async function checkStudioDependencyVersions(\n workDir: string,\n output: Output,\n {packages = DEFAULT_PACKAGES}: {packages?: TrackedPackage[]} = {},\n): Promise<void> {\n const manifest = await readPackageJson(path.join(workDir, 'package.json'), {\n skipSchemaValidation: true,\n })\n const dependencies = {...manifest?.dependencies, ...manifest?.devDependencies}\n\n const packageInfo = packages.map(async (pkg): Promise<false | PackageInfo> => {\n const dependency = dependencies[pkg.name]\n if (!dependency) {\n return false\n }\n\n const packageVersion = await getLocalPackageVersion(pkg.name, workDir)\n const installed = semver.coerce(packageVersion ?? dependency.replaceAll(/[\\D.]/g, ''))\n\n if (!installed) {\n return false\n }\n\n const supported = pkg.supported.join(' || ')\n\n // \"Untested\" is usually the case where we have not upgraded the React version requirements\n // before a release, but given that is usually works in a backwards-compatible way, we want\n // to indicate that it's _untested_, not necessarily _unsupported_\n // Ex: Installed is react@19.0.0, but we've only _tested_ with react@^18\n const isUntested = !semver.satisfies(installed, supported) && semver.gtr(installed, supported)\n\n // \"Unsupported\" in that the installed version is _lower than_ the minimum version\n // Ex: Installed is react@15.0.0, but we require react@^16\n const isUnsupported = !semver.satisfies(installed, supported) && !isUntested\n\n // \"Deprecated\" in that we will stop supporting it at some point in the near future,\n // so users should be prompted to upgrade\n const isDeprecated = pkg.deprecatedBelow ? semver.ltr(installed, pkg.deprecatedBelow) : false\n\n return {\n ...pkg,\n installed,\n isDeprecated,\n isUnsupported,\n isUntested,\n }\n })\n\n const installedPackages = (await Promise.all(packageInfo)).filter(\n (inp): inp is PackageInfo => inp !== false,\n )\n const unsupported = installedPackages.filter((pkg) => pkg.isUnsupported)\n const deprecated = installedPackages.filter((pkg) => !pkg.isUnsupported && pkg.isDeprecated)\n const untested = installedPackages.filter((pkg) => pkg.isUntested)\n\n if (deprecated.length > 0) {\n output.warn(`The following package versions have been deprecated and should be upgraded:\n\n ${listPackages(deprecated)}\n\nSupport for these will be removed in a future release!\n\n ${getUpgradeInstructions(deprecated)}\n`)\n }\n\n if (untested.length > 0) {\n output.warn(`The following package versions have not yet been marked as supported:\n\n ${listPackages(untested)}\n\nYou _may_ encounter bugs while using these versions.\n\n ${getDowngradeInstructions(untested)}\n`)\n }\n\n if (unsupported.length > 0) {\n output.error(\n `The following package versions are no longer supported and needs to be upgraded:\n\n ${listPackages(unsupported)}\n\n ${getUpgradeInstructions(unsupported)}\n`,\n {exit: 1},\n )\n }\n}\n\nfunction listPackages(pkgs: PackageInfo[]) {\n return pkgs\n .map(\n (pkg) =>\n `${pkg.name} (installed: ${pkg.installed}, want: ${\n pkg.deprecatedBelow || pkg.supported.join(' || ')\n })`,\n )\n .join('\\n ')\n}\n\nfunction getUpgradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (semver.coerce(version) || {version: ''}).version)\n .toSorted(semver.rcompare)\n\n return `\"${pkg.name}@${highestSupported}\"`\n })\n .join(' ')\n\n return `To upgrade, run either:\n\n npm install ${inst}\n\n or\n\n yarn add ${inst}\n\n or\n\n pnpm add ${inst}\n\n\nRead more at https://www.sanity.io/docs/help/upgrade-packages`\n}\n\nfunction getDowngradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (semver.coerce(version) || {version: ''}).version)\n .toSorted(semver.rcompare)\n\n return `\"${pkg.name}@${highestSupported}\"`\n })\n .join(' ')\n\n return `To downgrade, run either:\n\n yarn add ${inst}\n\n or\n\n npm install ${inst}\n\n or\n\n pnpm install ${inst}`\n}\n"],"names":["path","readPackageJson","semver","getLocalPackageVersion","DEFAULT_PACKAGES","deprecatedBelow","name","supported","checkStudioDependencyVersions","workDir","output","packages","manifest","join","skipSchemaValidation","dependencies","devDependencies","packageInfo","map","pkg","dependency","packageVersion","installed","coerce","replaceAll","isUntested","satisfies","gtr","isUnsupported","isDeprecated","ltr","installedPackages","Promise","all","filter","inp","unsupported","deprecated","untested","length","warn","listPackages","getUpgradeInstructions","getDowngradeInstructions","error","exit","pkgs","inst","highestSupported","version","toSorted","rcompare"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/build/checkStudioDependencyVersions.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type Output, readPackageJson} from '@sanity/cli-core'\nimport semver, {type SemVer} from 'semver'\n\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\n\ninterface PackageInfo {\n deprecatedBelow: string | null\n installed: SemVer\n isDeprecated: boolean\n isUnsupported: boolean\n isUntested: boolean\n name: string\n supported: string[]\n}\n\ninterface TrackedPackage {\n deprecatedBelow: string | null\n name: string\n supported: string[]\n}\n\n// NOTE: when doing changes here, also remember to update versions in help docs at\n// https://sanity.io/admin/structure/docs;helpArticle;upgrade-packages\nconst DEFAULT_PACKAGES: TrackedPackage[] = [\n {deprecatedBelow: null, name: 'react', supported: ['^19.2.2']},\n {deprecatedBelow: null, name: 'react-dom', supported: ['^19.2.2']},\n {deprecatedBelow: null, name: 'styled-components', supported: ['^6']},\n {deprecatedBelow: '^3', name: '@sanity/ui', supported: ['^2', '^3']},\n]\n\nexport async function checkStudioDependencyVersions(\n workDir: string,\n output: Output,\n {packages = DEFAULT_PACKAGES}: {packages?: TrackedPackage[]} = {},\n): Promise<void> {\n const manifest = await readPackageJson(path.join(workDir, 'package.json'), {\n skipSchemaValidation: true,\n })\n const dependencies = {...manifest?.dependencies, ...manifest?.devDependencies}\n\n const packageInfo = packages.map(async (pkg): Promise<false | PackageInfo> => {\n const dependency = dependencies[pkg.name]\n if (!dependency) {\n return false\n }\n\n const packageVersion = await getLocalPackageVersion(pkg.name, workDir)\n const installed = semver.coerce(packageVersion ?? dependency.replaceAll(/[\\D.]/g, ''))\n\n if (!installed) {\n return false\n }\n\n const supported = pkg.supported.join(' || ')\n\n // \"Untested\" is usually the case where we have not upgraded the React version requirements\n // before a release, but given that is usually works in a backwards-compatible way, we want\n // to indicate that it's _untested_, not necessarily _unsupported_\n // Ex: Installed is react@20.0.0, but we've only _tested_ with react@^19\n const isUntested = !semver.satisfies(installed, supported) && semver.gtr(installed, supported)\n\n // \"Unsupported\" in that the installed version is _lower than_ the minimum version\n // Ex: Installed is react@18.0.0, but we require react@^19.2\n const isUnsupported = !semver.satisfies(installed, supported) && !isUntested\n\n // \"Deprecated\" in that we will stop supporting it at some point in the near future,\n // so users should be prompted to upgrade\n const isDeprecated = pkg.deprecatedBelow ? semver.ltr(installed, pkg.deprecatedBelow) : false\n\n return {\n ...pkg,\n installed,\n isDeprecated,\n isUnsupported,\n isUntested,\n }\n })\n\n const installedPackages = (await Promise.all(packageInfo)).filter(\n (inp): inp is PackageInfo => inp !== false,\n )\n const unsupported = installedPackages.filter((pkg) => pkg.isUnsupported)\n const deprecated = installedPackages.filter((pkg) => !pkg.isUnsupported && pkg.isDeprecated)\n const untested = installedPackages.filter((pkg) => pkg.isUntested)\n\n if (deprecated.length > 0) {\n output.warn(`The following package versions have been deprecated and should be upgraded:\n\n ${listPackages(deprecated)}\n\nSupport for these will be removed in a future release!\n\n ${getUpgradeInstructions(deprecated)}\n`)\n }\n\n if (untested.length > 0) {\n output.warn(`The following package versions have not yet been marked as supported:\n\n ${listPackages(untested)}\n\nYou _may_ encounter bugs while using these versions.\n\n ${getDowngradeInstructions(untested)}\n`)\n }\n\n if (unsupported.length > 0) {\n output.error(\n `The following package versions are no longer supported and needs to be upgraded:\n\n ${listPackages(unsupported)}\n\n ${getUpgradeInstructions(unsupported)}\n`,\n {exit: 1},\n )\n }\n}\n\nfunction listPackages(pkgs: PackageInfo[]) {\n return pkgs\n .map(\n (pkg) =>\n `${pkg.name} (installed: ${pkg.installed}, want: ${\n pkg.deprecatedBelow || pkg.supported.join(' || ')\n })`,\n )\n .join('\\n ')\n}\n\nfunction getUpgradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (semver.coerce(version) || {version: ''}).version)\n .toSorted(semver.rcompare)\n\n return `\"${pkg.name}@^${highestSupported}\"`\n })\n .join(' ')\n\n return `To upgrade, run either:\n\n npm install ${inst}\n\n or\n\n yarn add ${inst}\n\n or\n\n pnpm add ${inst}\n\n\nRead more at https://www.sanity.io/docs/help/upgrade-packages`\n}\n\nfunction getDowngradeInstructions(pkgs: PackageInfo[]) {\n const inst = pkgs\n .map((pkg) => {\n const [highestSupported] = pkg.supported\n .map((version) => (semver.coerce(version) || {version: ''}).version)\n .toSorted(semver.rcompare)\n\n return `\"${pkg.name}@^${highestSupported}\"`\n })\n .join(' ')\n\n return `To downgrade, run either:\n\n yarn add ${inst}\n\n or\n\n npm install ${inst}\n\n or\n\n pnpm install ${inst}`\n}\n"],"names":["path","readPackageJson","semver","getLocalPackageVersion","DEFAULT_PACKAGES","deprecatedBelow","name","supported","checkStudioDependencyVersions","workDir","output","packages","manifest","join","skipSchemaValidation","dependencies","devDependencies","packageInfo","map","pkg","dependency","packageVersion","installed","coerce","replaceAll","isUntested","satisfies","gtr","isUnsupported","isDeprecated","ltr","installedPackages","Promise","all","filter","inp","unsupported","deprecated","untested","length","warn","listPackages","getUpgradeInstructions","getDowngradeInstructions","error","exit","pkgs","inst","highestSupported","version","toSorted","rcompare"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { escapeRegExp } from 'lodash-es';
1
+ import escapeRegExp from 'lodash-es/escapeRegExp.js';
2
2
  /**
3
3
  * Generates a Rollup `external` configuration array based on the provided
4
4
  * import map. We derive externals from the import map because this ensures that
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/createExternalFromImportMap.ts"],"sourcesContent":["import {escapeRegExp} from 'lodash-es'\n\ntype ImportMap = {imports?: Record<string, string>}\n\n/**\n * Generates a Rollup `external` configuration array based on the provided\n * import map. We derive externals from the import map because this ensures that\n * modules listed in the import map are not bundled into the Rollup output so\n * the browser can load these bare specifiers according to the import map.\n */\nexport function createExternalFromImportMap({imports = {}}: ImportMap = {}): (RegExp | string)[] {\n return Object.keys(imports).map((specifier) =>\n specifier.endsWith('/') ? new RegExp(`^${escapeRegExp(specifier)}.+`) : specifier,\n )\n}\n"],"names":["escapeRegExp","createExternalFromImportMap","imports","Object","keys","map","specifier","endsWith","RegExp"],"mappings":"AAAA,SAAQA,YAAY,QAAO,YAAW;AAItC;;;;;CAKC,GACD,OAAO,SAASC,4BAA4B,EAACC,UAAU,CAAC,CAAC,EAAY,GAAG,CAAC,CAAC;IACxE,OAAOC,OAAOC,IAAI,CAACF,SAASG,GAAG,CAAC,CAACC,YAC/BA,UAAUC,QAAQ,CAAC,OAAO,IAAIC,OAAO,CAAC,CAAC,EAAER,aAAaM,WAAW,EAAE,CAAC,IAAIA;AAE5E"}
1
+ {"version":3,"sources":["../../../src/actions/build/createExternalFromImportMap.ts"],"sourcesContent":["import escapeRegExp from 'lodash-es/escapeRegExp.js'\n\ntype ImportMap = {imports?: Record<string, string>}\n\n/**\n * Generates a Rollup `external` configuration array based on the provided\n * import map. We derive externals from the import map because this ensures that\n * modules listed in the import map are not bundled into the Rollup output so\n * the browser can load these bare specifiers according to the import map.\n */\nexport function createExternalFromImportMap({imports = {}}: ImportMap = {}): (RegExp | string)[] {\n return Object.keys(imports).map((specifier) =>\n specifier.endsWith('/') ? new RegExp(`^${escapeRegExp(specifier)}.+`) : specifier,\n )\n}\n"],"names":["escapeRegExp","createExternalFromImportMap","imports","Object","keys","map","specifier","endsWith","RegExp"],"mappings":"AAAA,OAAOA,kBAAkB,4BAA2B;AAIpD;;;;;CAKC,GACD,OAAO,SAASC,4BAA4B,EAACC,UAAU,CAAC,CAAC,EAAY,GAAG,CAAC,CAAC;IACxE,OAAOC,OAAOC,IAAI,CAACF,SAASG,GAAG,CAAC,CAACC,YAC/BA,UAAUC,QAAQ,CAAC,OAAO,IAAIC,OAAO,CAAC,CAAC,EAAER,aAAaM,WAAW,EAAE,CAAC,IAAIA;AAE5E"}
@@ -2,18 +2,21 @@
2
2
  * Finds the basepath given conditions
3
3
  *
4
4
  * @internal
5
- */ export function determineBasePath(cliConfig, type) {
5
+ */ export function determineBasePath(cliConfig, type, output) {
6
6
  // Determine base path for built studio
7
7
  let basePath = '/';
8
8
  const envBasePath = type === 'app' ? process.env.SANITY_APP_BASEPATH : process.env.SANITY_STUDIO_BASEPATH;
9
9
  const configBasePath = cliConfig?.project?.basePath;
10
10
  if (envBasePath) {
11
- // Environment variable (SANITY_APP_BASEPATH)
11
+ // Environment variable (SANITY_APP_BASEPATH or SANITY_STUDIO_BASEPATH)
12
12
  basePath = envBasePath;
13
13
  } else if (configBasePath) {
14
14
  // `sanity.cli.ts`
15
15
  basePath = configBasePath;
16
16
  }
17
+ if (envBasePath && configBasePath && output) {
18
+ output.warn(`Overriding configured base path (${configBasePath}) with value from environment variable (${envBasePath})`);
19
+ }
17
20
  return basePath;
18
21
  }
19
22
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/determineBasePath.ts"],"sourcesContent":["import {type CliConfig} from '@sanity/cli-core'\n\n/**\n * Finds the basepath given conditions\n *\n * @internal\n */\nexport function determineBasePath(cliConfig: CliConfig, type: 'app' | 'studio'): string {\n // Determine base path for built studio\n let basePath = '/'\n const envBasePath =\n type === 'app' ? process.env.SANITY_APP_BASEPATH : process.env.SANITY_STUDIO_BASEPATH\n const configBasePath = cliConfig?.project?.basePath\n\n if (envBasePath) {\n // Environment variable (SANITY_APP_BASEPATH)\n basePath = envBasePath\n } else if (configBasePath) {\n // `sanity.cli.ts`\n basePath = configBasePath\n }\n\n return basePath\n}\n"],"names":["determineBasePath","cliConfig","type","basePath","envBasePath","process","env","SANITY_APP_BASEPATH","SANITY_STUDIO_BASEPATH","configBasePath","project"],"mappings":"AAEA;;;;CAIC,GACD,OAAO,SAASA,kBAAkBC,SAAoB,EAAEC,IAAsB;IAC5E,uCAAuC;IACvC,IAAIC,WAAW;IACf,MAAMC,cACJF,SAAS,QAAQG,QAAQC,GAAG,CAACC,mBAAmB,GAAGF,QAAQC,GAAG,CAACE,sBAAsB;IACvF,MAAMC,iBAAiBR,WAAWS,SAASP;IAE3C,IAAIC,aAAa;QACf,6CAA6C;QAC7CD,WAAWC;IACb,OAAO,IAAIK,gBAAgB;QACzB,kBAAkB;QAClBN,WAAWM;IACb;IAEA,OAAON;AACT"}
1
+ {"version":3,"sources":["../../../src/actions/build/determineBasePath.ts"],"sourcesContent":["import {type CliConfig, type Output} from '@sanity/cli-core'\n\n/**\n * Finds the basepath given conditions\n *\n * @internal\n */\nexport function determineBasePath(\n cliConfig: CliConfig,\n type: 'app' | 'studio',\n output?: Output,\n): string {\n // Determine base path for built studio\n let basePath = '/'\n const envBasePath =\n type === 'app' ? process.env.SANITY_APP_BASEPATH : process.env.SANITY_STUDIO_BASEPATH\n const configBasePath = cliConfig?.project?.basePath\n\n if (envBasePath) {\n // Environment variable (SANITY_APP_BASEPATH or SANITY_STUDIO_BASEPATH)\n basePath = envBasePath\n } else if (configBasePath) {\n // `sanity.cli.ts`\n basePath = configBasePath\n }\n\n if (envBasePath && configBasePath && output) {\n output.warn(\n `Overriding configured base path (${configBasePath}) with value from environment variable (${envBasePath})`,\n )\n }\n\n return basePath\n}\n"],"names":["determineBasePath","cliConfig","type","output","basePath","envBasePath","process","env","SANITY_APP_BASEPATH","SANITY_STUDIO_BASEPATH","configBasePath","project","warn"],"mappings":"AAEA;;;;CAIC,GACD,OAAO,SAASA,kBACdC,SAAoB,EACpBC,IAAsB,EACtBC,MAAe;IAEf,uCAAuC;IACvC,IAAIC,WAAW;IACf,MAAMC,cACJH,SAAS,QAAQI,QAAQC,GAAG,CAACC,mBAAmB,GAAGF,QAAQC,GAAG,CAACE,sBAAsB;IACvF,MAAMC,iBAAiBT,WAAWU,SAASP;IAE3C,IAAIC,aAAa;QACf,uEAAuE;QACvED,WAAWC;IACb,OAAO,IAAIK,gBAAgB;QACzB,kBAAkB;QAClBN,WAAWM;IACb;IAEA,IAAIL,eAAeK,kBAAkBP,QAAQ;QAC3CA,OAAOS,IAAI,CACT,CAAC,iCAAiC,EAAEF,eAAe,wCAAwC,EAAEL,YAAY,CAAC,CAAC;IAE/G;IAEA,OAAOD;AACT"}
@@ -1,4 +1,5 @@
1
1
  import path from 'node:path';
2
+ import { findProjectRoot, getCliTelemetry } from '@sanity/cli-core';
2
3
  import viteReact from '@vitejs/plugin-react';
3
4
  import debug from 'debug';
4
5
  import { readPackageUp } from 'read-package-up';
@@ -6,6 +7,8 @@ import { mergeConfig } from 'vite';
6
7
  import { sanityBuildEntries } from '../../server/vite/plugin-sanity-build-entries.js';
7
8
  import { sanityFaviconsPlugin } from '../../server/vite/plugin-sanity-favicons.js';
8
9
  import { sanityRuntimeRewritePlugin } from '../../server/vite/plugin-sanity-runtime-rewrite.js';
10
+ import { sanitySchemaExtractionPlugin } from '../../server/vite/plugin-schema-extraction.js';
11
+ import { sanityTypegenPlugin } from '../../server/vite/plugin-typegen.js';
9
12
  import { createExternalFromImportMap } from './createExternalFromImportMap.js';
10
13
  import { getAppEnvironmentVariables, getStudioEnvironmentVariables } from './getStudioEnvironmentVariables.js';
11
14
  import { normalizeBasePath } from './normalizeBasePath.js';
@@ -14,8 +17,8 @@ import { normalizeBasePath } from './normalizeBasePath.js';
14
17
  *
15
18
  * @internal Only meant for consumption inside of Sanity modules, do not depend on this externally
16
19
  */ export async function getViteConfig(options) {
17
- const { basePath: rawBasePath = '/', cwd, importMap, isApp, minify, mode, outputDir, reactCompiler, server, // default to `true` when `mode=development`
18
- sourceMap = options.mode === 'development' } = options;
20
+ const { basePath: rawBasePath = '/', cwd, importMap, isApp, minify, mode, outputDir, reactCompiler, schemaExtraction, server, // default to `true` when `mode=development`
21
+ sourceMap = options.mode === 'development', typegen } = options;
19
22
  const basePath = normalizeBasePath(rawBasePath);
20
23
  const sanityCliPkgPath = (await readPackageUp({
21
24
  cwd: import.meta.dirname
@@ -23,6 +26,7 @@ import { normalizeBasePath } from './normalizeBasePath.js';
23
26
  if (!sanityCliPkgPath) {
24
27
  throw new Error('Unable to resolve `@sanity/cli` module root');
25
28
  }
29
+ const configPath = (await findProjectRoot(cwd)).path;
26
30
  const customFaviconsPath = path.join(cwd, 'static');
27
31
  const defaultFaviconsPath = path.join(path.dirname(sanityCliPkgPath), 'static', 'favicons');
28
32
  const staticPath = `${basePath}static`;
@@ -44,8 +48,10 @@ import { normalizeBasePath } from './normalizeBasePath.js';
44
48
  cacheDir: 'node_modules/.sanity/vite',
45
49
  configFile: false,
46
50
  define: {
51
+ __SANITY_BUILD_TIMESTAMP__: JSON.stringify(Date.now()),
47
52
  __SANITY_STAGING__: process.env.SANITY_INTERNAL_ENV === 'staging',
48
53
  'process.env.MODE': JSON.stringify(mode),
54
+ 'process.env.PKG_BUILD_VERSION': JSON.stringify(process.env.PKG_BUILD_VERSION),
49
55
  /**
50
56
  * Yes, double negatives are confusing.
51
57
  * The default value of `SC_DISABLE_SPEEDY` is `process.env.NODE_ENV === 'production'`: https://github.com/styled-components/styled-components/blob/99c02f52d69e8e509c0bf012cadee7f8e819a6dd/packages/styled-components/src/constants.ts#L34
@@ -63,6 +69,9 @@ import { normalizeBasePath } from './normalizeBasePath.js';
63
69
  plugins: [
64
70
  viteReact(reactCompiler ? {
65
71
  babel: {
72
+ generatorOpts: {
73
+ compact: true
74
+ },
66
75
  plugins: [
67
76
  [
68
77
  'babel-plugin-react-compiler',
@@ -82,10 +91,33 @@ import { normalizeBasePath } from './normalizeBasePath.js';
82
91
  cwd,
83
92
  importMap,
84
93
  isApp
85
- })
94
+ }),
95
+ // Add schema extraction when enabled
96
+ ...schemaExtraction?.enabled ? [
97
+ sanitySchemaExtractionPlugin({
98
+ additionalPatterns: schemaExtraction.watchPatterns,
99
+ configPath,
100
+ enforceRequiredFields: schemaExtraction.enforceRequiredFields,
101
+ outputPath: schemaExtraction.path,
102
+ telemetryLogger: getCliTelemetry(),
103
+ workDir: cwd,
104
+ workspaceName: schemaExtraction.workspace
105
+ })
106
+ ] : [],
107
+ // Add typegen when enabled
108
+ ...typegen?.enabled ? [
109
+ sanityTypegenPlugin({
110
+ config: typegen,
111
+ telemetryLogger: getCliTelemetry(),
112
+ workDir: cwd
113
+ })
114
+ ] : []
86
115
  ],
87
116
  resolve: {
88
117
  dedupe: [
118
+ 'react',
119
+ 'react-dom',
120
+ 'sanity',
89
121
  'styled-components'
90
122
  ]
91
123
  },
@@ -95,7 +127,18 @@ import { normalizeBasePath } from './normalizeBasePath.js';
95
127
  port: server?.port || 3333,
96
128
  // Only enable strict port for studio,
97
129
  // since apps can run on any port
98
- strictPort: isApp ? false : true
130
+ strictPort: isApp ? false : true,
131
+ /**
132
+ * Significantly speed up startup time,
133
+ * and most importantly eliminates the `new dependencies optimized: foobar. optimized dependencies changed. reloading`
134
+ * types of initial reload loops that otherwise happen as vite discovers deps that need to be optimized.
135
+ * This option starts the traversal up front, and warms up the dep tree required to render the userland sanity.config.ts file,
136
+ * and thus avoids frustrating reload loops.
137
+ */ warmup: {
138
+ clientFiles: [
139
+ './.sanity/runtime/app.js'
140
+ ]
141
+ }
99
142
  }
100
143
  };
101
144
  if (mode === 'production') {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/getViteConfig.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type UserViteConfig} from '@sanity/cli-core'\nimport viteReact from '@vitejs/plugin-react'\nimport {type PluginOptions as ReactCompilerConfig} from 'babel-plugin-react-compiler'\nimport debug from 'debug'\nimport {readPackageUp} from 'read-package-up'\nimport {type ConfigEnv, type InlineConfig, mergeConfig, type Rollup} from 'vite'\n\nimport {sanityBuildEntries} from '../../server/vite/plugin-sanity-build-entries.js'\nimport {sanityFaviconsPlugin} from '../../server/vite/plugin-sanity-favicons.js'\nimport {sanityRuntimeRewritePlugin} from '../../server/vite/plugin-sanity-runtime-rewrite.js'\nimport {createExternalFromImportMap} from './createExternalFromImportMap.js'\nimport {\n getAppEnvironmentVariables,\n getStudioEnvironmentVariables,\n} from './getStudioEnvironmentVariables.js'\nimport {normalizeBasePath} from './normalizeBasePath.js'\n\ninterface ViteOptions {\n /**\n * Root path of the studio/sanity app\n */\n cwd: string\n\n /**\n * Mode to run vite in - eg development or production\n */\n mode: 'development' | 'production'\n\n reactCompiler: ReactCompilerConfig | undefined\n\n /**\n * Base path (eg under where to serve the app - `/studio` or similar)\n * Will be normalized to ensure it starts and ends with a `/`\n */\n basePath?: string\n\n importMap?: {imports?: Record<string, string>}\n\n isApp?: boolean\n\n /**\n * Whether or not to minify the output (only used in `mode: 'production'`)\n */\n minify?: boolean\n\n /**\n * Output directory (eg where to place the built files, if any)\n */\n outputDir?: string\n /**\n * HTTP development server configuration\n */\n server?: {host?: string; port?: number}\n /**\n * Whether or not to enable source maps\n */\n sourceMap?: boolean\n}\n\n/**\n * Get a configuration object for Vite based on the passed options\n *\n * @internal Only meant for consumption inside of Sanity modules, do not depend on this externally\n */\nexport async function getViteConfig(options: ViteOptions): Promise<InlineConfig> {\n const {\n basePath: rawBasePath = '/',\n cwd,\n importMap,\n isApp,\n minify,\n mode,\n outputDir,\n reactCompiler,\n server,\n // default to `true` when `mode=development`\n sourceMap = options.mode === 'development',\n } = options\n\n const basePath = normalizeBasePath(rawBasePath)\n\n const sanityCliPkgPath = (await readPackageUp({cwd: import.meta.dirname}))?.path\n if (!sanityCliPkgPath) {\n throw new Error('Unable to resolve `@sanity/cli` module root')\n }\n\n const customFaviconsPath = path.join(cwd, 'static')\n const defaultFaviconsPath = path.join(path.dirname(sanityCliPkgPath), 'static', 'favicons')\n const staticPath = `${basePath}static`\n\n const envVars = isApp\n ? getAppEnvironmentVariables({jsonEncode: true, prefix: 'process.env.'})\n : getStudioEnvironmentVariables({jsonEncode: true, prefix: 'process.env.'})\n\n const viteConfig: InlineConfig = {\n base: basePath,\n build: {\n outDir: outputDir || path.resolve(cwd, 'dist'),\n sourcemap: sourceMap,\n },\n // Define a custom cache directory so that sanity's vite cache\n // does not conflict with any potential local vite projects\n cacheDir: 'node_modules/.sanity/vite',\n configFile: false,\n define: {\n __SANITY_STAGING__: process.env.SANITY_INTERNAL_ENV === 'staging',\n 'process.env.MODE': JSON.stringify(mode),\n /**\n * Yes, double negatives are confusing.\n * The default value of `SC_DISABLE_SPEEDY` is `process.env.NODE_ENV === 'production'`: https://github.com/styled-components/styled-components/blob/99c02f52d69e8e509c0bf012cadee7f8e819a6dd/packages/styled-components/src/constants.ts#L34\n * Which means that in production, use the much faster way of inserting CSS rules, based on the CSSStyleSheet API (https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule)\n * while in dev mode, use the slower way of inserting CSS rules, which appends text nodes to the `<style>` tag: https://github.com/styled-components/styled-components/blob/99c02f52d69e8e509c0bf012cadee7f8e819a6dd/packages/styled-components/src/sheet/Tag.ts#L74-L76\n * There are historical reasons for this, primarily that browsers initially did not support editing CSS rules in the DevTools inspector if `CSSStyleSheet.insetRule` were used.\n * However, that's no longer the case (since Chrome 81 back in April 2020: https://developer.chrome.com/docs/css-ui/css-in-js), the latest version of FireFox also supports it,\n * and there is no longer any reason to use the much slower method in dev mode.\n */\n 'process.env.SC_DISABLE_SPEEDY': JSON.stringify('false'),\n ...envVars,\n },\n envPrefix: isApp ? 'SANITY_APP_' : 'SANITY_STUDIO_',\n logLevel: mode === 'production' ? 'silent' : 'info',\n mode,\n plugins: [\n viteReact(\n reactCompiler ? {babel: {plugins: [['babel-plugin-react-compiler', reactCompiler]]}} : {},\n ),\n sanityFaviconsPlugin({customFaviconsPath, defaultFaviconsPath, staticUrlPath: staticPath}),\n sanityRuntimeRewritePlugin(),\n sanityBuildEntries({basePath, cwd, importMap, isApp}),\n ],\n resolve: {\n dedupe: ['styled-components'],\n },\n root: cwd,\n server: {\n host: server?.host,\n port: server?.port || 3333,\n // Only enable strict port for studio,\n // since apps can run on any port\n strictPort: isApp ? false : true,\n },\n }\n\n if (mode === 'production') {\n viteConfig.build = {\n ...viteConfig.build,\n\n assetsDir: 'static',\n emptyOutDir: false, // Rely on CLI to do this\n minify: minify ? 'esbuild' : false,\n\n rollupOptions: {\n external: createExternalFromImportMap(importMap),\n input: {\n sanity: path.join(cwd, '.sanity', 'runtime', 'app.js'),\n },\n onwarn: onRollupWarn,\n },\n }\n }\n\n return viteConfig\n}\n\nfunction onRollupWarn(warning: Rollup.RollupLog, warn: Rollup.LoggingFunction) {\n if (suppressUnusedImport(warning)) {\n return\n }\n\n warn(warning)\n}\n\nfunction suppressUnusedImport(warning: Rollup.RollupLog & {ids?: string[]}): boolean {\n if (warning.code !== 'UNUSED_EXTERNAL_IMPORT') return false\n\n // Suppress:\n // ```\n // \"useDebugValue\" is imported from external module \"react\"…\n // ```\n if (warning.names?.includes('useDebugValue')) {\n warning.names = warning.names.filter((n) => n !== 'useDebugValue')\n if (warning.names.length === 0) return true\n }\n\n // If some library does something unexpected, we suppress since it isn't actionable\n if (warning.ids?.every((id) => id.includes('/node_modules/') || id.includes('\\\\node_modules\\\\')))\n return true\n\n return false\n}\n\n/**\n * Ensure Sanity entry chunk is always loaded\n *\n * @param config - User-modified configuration\n * @returns Merged configuration\n * @internal\n */\nexport async function finalizeViteConfig(config: InlineConfig): Promise<InlineConfig> {\n if (typeof config.build?.rollupOptions?.input !== 'object') {\n throw new TypeError(\n 'Vite config must contain `build.rollupOptions.input`, and it must be an object',\n )\n }\n\n if (!config.root) {\n throw new Error(\n 'Vite config must contain `root` property, and must point to the Sanity root directory',\n )\n }\n\n return mergeConfig(config, {\n build: {\n rollupOptions: {\n input: {\n sanity: path.join(config.root, '.sanity', 'runtime', 'app.js'),\n },\n },\n },\n })\n}\n\n/**\n * Merge user-provided Vite configuration object or function\n *\n * @param defaultConfig - Default configuration object\n * @param userConfig - User-provided configuration object or function\n * @returns Merged configuration\n * @internal\n */\nexport async function extendViteConfigWithUserConfig(\n env: ConfigEnv,\n defaultConfig: InlineConfig,\n userConfig: UserViteConfig,\n): Promise<InlineConfig> {\n let config = defaultConfig\n\n if (typeof userConfig === 'function') {\n debug('Extending vite config using user-specified function')\n config = await userConfig(config, env)\n } else if (typeof userConfig === 'object') {\n debug('Merging vite config using user-specified object')\n config = mergeConfig(config, userConfig)\n }\n\n return config\n}\n"],"names":["path","viteReact","debug","readPackageUp","mergeConfig","sanityBuildEntries","sanityFaviconsPlugin","sanityRuntimeRewritePlugin","createExternalFromImportMap","getAppEnvironmentVariables","getStudioEnvironmentVariables","normalizeBasePath","getViteConfig","options","basePath","rawBasePath","cwd","importMap","isApp","minify","mode","outputDir","reactCompiler","server","sourceMap","sanityCliPkgPath","dirname","Error","customFaviconsPath","join","defaultFaviconsPath","staticPath","envVars","jsonEncode","prefix","viteConfig","base","build","outDir","resolve","sourcemap","cacheDir","configFile","define","__SANITY_STAGING__","process","env","SANITY_INTERNAL_ENV","JSON","stringify","envPrefix","logLevel","plugins","babel","staticUrlPath","dedupe","root","host","port","strictPort","assetsDir","emptyOutDir","rollupOptions","external","input","sanity","onwarn","onRollupWarn","warning","warn","suppressUnusedImport","code","names","includes","filter","n","length","ids","every","id","finalizeViteConfig","config","TypeError","extendViteConfigWithUserConfig","defaultConfig","userConfig"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/build/getViteConfig.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {\n type CliConfig,\n findProjectRoot,\n getCliTelemetry,\n type UserViteConfig,\n} from '@sanity/cli-core'\nimport viteReact from '@vitejs/plugin-react'\nimport {type PluginOptions as ReactCompilerConfig} from 'babel-plugin-react-compiler'\nimport debug from 'debug'\nimport {readPackageUp} from 'read-package-up'\nimport {type ConfigEnv, type InlineConfig, mergeConfig, type Rollup} from 'vite'\n\nimport {sanityBuildEntries} from '../../server/vite/plugin-sanity-build-entries.js'\nimport {sanityFaviconsPlugin} from '../../server/vite/plugin-sanity-favicons.js'\nimport {sanityRuntimeRewritePlugin} from '../../server/vite/plugin-sanity-runtime-rewrite.js'\nimport {sanitySchemaExtractionPlugin} from '../../server/vite/plugin-schema-extraction.js'\nimport {sanityTypegenPlugin} from '../../server/vite/plugin-typegen.js'\nimport {createExternalFromImportMap} from './createExternalFromImportMap.js'\nimport {\n getAppEnvironmentVariables,\n getStudioEnvironmentVariables,\n} from './getStudioEnvironmentVariables.js'\nimport {normalizeBasePath} from './normalizeBasePath.js'\n\ninterface ViteOptions {\n /**\n * Root path of the studio/sanity app\n */\n cwd: string\n\n /**\n * Mode to run vite in - eg development or production\n */\n mode: 'development' | 'production'\n\n reactCompiler: ReactCompilerConfig | undefined\n\n /**\n * Base path (eg under where to serve the app - `/studio` or similar)\n * Will be normalized to ensure it starts and ends with a `/`\n */\n basePath?: string\n\n importMap?: {imports?: Record<string, string>}\n\n isApp?: boolean\n\n /**\n * Whether or not to minify the output (only used in `mode: 'production'`)\n */\n minify?: boolean\n\n /**\n * Output directory (eg where to place the built files, if any)\n */\n outputDir?: string\n /**\n * Schema extraction configuration\n */\n schemaExtraction?: CliConfig['schemaExtraction']\n /**\n * HTTP development server configuration\n */\n server?: {host?: string; port?: number}\n /**\n * Whether or not to enable source maps\n */\n sourceMap?: boolean\n /**\n * Typegen configuration\n */\n typegen?: CliConfig['typegen']\n}\n\n/**\n * Get a configuration object for Vite based on the passed options\n *\n * @internal Only meant for consumption inside of Sanity modules, do not depend on this externally\n */\nexport async function getViteConfig(options: ViteOptions): Promise<InlineConfig> {\n const {\n basePath: rawBasePath = '/',\n cwd,\n importMap,\n isApp,\n minify,\n mode,\n outputDir,\n reactCompiler,\n schemaExtraction,\n server,\n // default to `true` when `mode=development`\n sourceMap = options.mode === 'development',\n typegen,\n } = options\n\n const basePath = normalizeBasePath(rawBasePath)\n\n const sanityCliPkgPath = (await readPackageUp({cwd: import.meta.dirname}))?.path\n if (!sanityCliPkgPath) {\n throw new Error('Unable to resolve `@sanity/cli` module root')\n }\n\n const configPath = (await findProjectRoot(cwd)).path\n\n const customFaviconsPath = path.join(cwd, 'static')\n const defaultFaviconsPath = path.join(path.dirname(sanityCliPkgPath), 'static', 'favicons')\n const staticPath = `${basePath}static`\n\n const envVars = isApp\n ? getAppEnvironmentVariables({jsonEncode: true, prefix: 'process.env.'})\n : getStudioEnvironmentVariables({jsonEncode: true, prefix: 'process.env.'})\n\n const viteConfig: InlineConfig = {\n base: basePath,\n build: {\n outDir: outputDir || path.resolve(cwd, 'dist'),\n sourcemap: sourceMap,\n },\n // Define a custom cache directory so that sanity's vite cache\n // does not conflict with any potential local vite projects\n cacheDir: 'node_modules/.sanity/vite',\n configFile: false,\n define: {\n __SANITY_BUILD_TIMESTAMP__: JSON.stringify(Date.now()),\n __SANITY_STAGING__: process.env.SANITY_INTERNAL_ENV === 'staging',\n 'process.env.MODE': JSON.stringify(mode),\n 'process.env.PKG_BUILD_VERSION': JSON.stringify(process.env.PKG_BUILD_VERSION),\n /**\n * Yes, double negatives are confusing.\n * The default value of `SC_DISABLE_SPEEDY` is `process.env.NODE_ENV === 'production'`: https://github.com/styled-components/styled-components/blob/99c02f52d69e8e509c0bf012cadee7f8e819a6dd/packages/styled-components/src/constants.ts#L34\n * Which means that in production, use the much faster way of inserting CSS rules, based on the CSSStyleSheet API (https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule)\n * while in dev mode, use the slower way of inserting CSS rules, which appends text nodes to the `<style>` tag: https://github.com/styled-components/styled-components/blob/99c02f52d69e8e509c0bf012cadee7f8e819a6dd/packages/styled-components/src/sheet/Tag.ts#L74-L76\n * There are historical reasons for this, primarily that browsers initially did not support editing CSS rules in the DevTools inspector if `CSSStyleSheet.insetRule` were used.\n * However, that's no longer the case (since Chrome 81 back in April 2020: https://developer.chrome.com/docs/css-ui/css-in-js), the latest version of FireFox also supports it,\n * and there is no longer any reason to use the much slower method in dev mode.\n */\n 'process.env.SC_DISABLE_SPEEDY': JSON.stringify('false'),\n ...envVars,\n },\n envPrefix: isApp ? 'SANITY_APP_' : 'SANITY_STUDIO_',\n logLevel: mode === 'production' ? 'silent' : 'info',\n mode,\n plugins: [\n viteReact(\n reactCompiler\n ? {\n babel: {\n generatorOpts: {compact: true},\n plugins: [['babel-plugin-react-compiler', reactCompiler]],\n },\n }\n : {},\n ),\n sanityFaviconsPlugin({customFaviconsPath, defaultFaviconsPath, staticUrlPath: staticPath}),\n sanityRuntimeRewritePlugin(),\n sanityBuildEntries({basePath, cwd, importMap, isApp}),\n // Add schema extraction when enabled\n ...(schemaExtraction?.enabled\n ? [\n sanitySchemaExtractionPlugin({\n additionalPatterns: schemaExtraction.watchPatterns,\n configPath,\n enforceRequiredFields: schemaExtraction.enforceRequiredFields,\n outputPath: schemaExtraction.path,\n telemetryLogger: getCliTelemetry(),\n workDir: cwd,\n workspaceName: schemaExtraction.workspace,\n }),\n ]\n : []),\n // Add typegen when enabled\n ...(typegen?.enabled\n ? [\n sanityTypegenPlugin({\n config: typegen,\n telemetryLogger: getCliTelemetry(),\n workDir: cwd,\n }),\n ]\n : []),\n ],\n resolve: {\n dedupe: ['react', 'react-dom', 'sanity', 'styled-components'],\n },\n root: cwd,\n server: {\n host: server?.host,\n port: server?.port || 3333,\n // Only enable strict port for studio,\n // since apps can run on any port\n strictPort: isApp ? false : true,\n\n /**\n * Significantly speed up startup time,\n * and most importantly eliminates the `new dependencies optimized: foobar. optimized dependencies changed. reloading`\n * types of initial reload loops that otherwise happen as vite discovers deps that need to be optimized.\n * This option starts the traversal up front, and warms up the dep tree required to render the userland sanity.config.ts file,\n * and thus avoids frustrating reload loops.\n */\n warmup: {\n clientFiles: ['./.sanity/runtime/app.js'],\n },\n },\n }\n\n if (mode === 'production') {\n viteConfig.build = {\n ...viteConfig.build,\n\n assetsDir: 'static',\n emptyOutDir: false, // Rely on CLI to do this\n minify: minify ? 'esbuild' : false,\n\n rollupOptions: {\n external: createExternalFromImportMap(importMap),\n input: {\n sanity: path.join(cwd, '.sanity', 'runtime', 'app.js'),\n },\n onwarn: onRollupWarn,\n },\n }\n }\n\n return viteConfig\n}\n\nfunction onRollupWarn(warning: Rollup.RollupLog, warn: Rollup.LoggingFunction) {\n if (suppressUnusedImport(warning)) {\n return\n }\n\n warn(warning)\n}\n\nfunction suppressUnusedImport(warning: Rollup.RollupLog & {ids?: string[]}): boolean {\n if (warning.code !== 'UNUSED_EXTERNAL_IMPORT') return false\n\n // Suppress:\n // ```\n // \"useDebugValue\" is imported from external module \"react\"…\n // ```\n if (warning.names?.includes('useDebugValue')) {\n warning.names = warning.names.filter((n) => n !== 'useDebugValue')\n if (warning.names.length === 0) return true\n }\n\n // If some library does something unexpected, we suppress since it isn't actionable\n if (warning.ids?.every((id) => id.includes('/node_modules/') || id.includes('\\\\node_modules\\\\')))\n return true\n\n return false\n}\n\n/**\n * Ensure Sanity entry chunk is always loaded\n *\n * @param config - User-modified configuration\n * @returns Merged configuration\n * @internal\n */\nexport async function finalizeViteConfig(config: InlineConfig): Promise<InlineConfig> {\n if (typeof config.build?.rollupOptions?.input !== 'object') {\n throw new TypeError(\n 'Vite config must contain `build.rollupOptions.input`, and it must be an object',\n )\n }\n\n if (!config.root) {\n throw new Error(\n 'Vite config must contain `root` property, and must point to the Sanity root directory',\n )\n }\n\n return mergeConfig(config, {\n build: {\n rollupOptions: {\n input: {\n sanity: path.join(config.root, '.sanity', 'runtime', 'app.js'),\n },\n },\n },\n })\n}\n\n/**\n * Merge user-provided Vite configuration object or function\n *\n * @param defaultConfig - Default configuration object\n * @param userConfig - User-provided configuration object or function\n * @returns Merged configuration\n * @internal\n */\nexport async function extendViteConfigWithUserConfig(\n env: ConfigEnv,\n defaultConfig: InlineConfig,\n userConfig: UserViteConfig,\n): Promise<InlineConfig> {\n let config = defaultConfig\n\n if (typeof userConfig === 'function') {\n debug('Extending vite config using user-specified function')\n config = await userConfig(config, env)\n } else if (typeof userConfig === 'object') {\n debug('Merging vite config using user-specified object')\n config = mergeConfig(config, userConfig)\n }\n\n return config\n}\n"],"names":["path","findProjectRoot","getCliTelemetry","viteReact","debug","readPackageUp","mergeConfig","sanityBuildEntries","sanityFaviconsPlugin","sanityRuntimeRewritePlugin","sanitySchemaExtractionPlugin","sanityTypegenPlugin","createExternalFromImportMap","getAppEnvironmentVariables","getStudioEnvironmentVariables","normalizeBasePath","getViteConfig","options","basePath","rawBasePath","cwd","importMap","isApp","minify","mode","outputDir","reactCompiler","schemaExtraction","server","sourceMap","typegen","sanityCliPkgPath","dirname","Error","configPath","customFaviconsPath","join","defaultFaviconsPath","staticPath","envVars","jsonEncode","prefix","viteConfig","base","build","outDir","resolve","sourcemap","cacheDir","configFile","define","__SANITY_BUILD_TIMESTAMP__","JSON","stringify","Date","now","__SANITY_STAGING__","process","env","SANITY_INTERNAL_ENV","PKG_BUILD_VERSION","envPrefix","logLevel","plugins","babel","generatorOpts","compact","staticUrlPath","enabled","additionalPatterns","watchPatterns","enforceRequiredFields","outputPath","telemetryLogger","workDir","workspaceName","workspace","config","dedupe","root","host","port","strictPort","warmup","clientFiles","assetsDir","emptyOutDir","rollupOptions","external","input","sanity","onwarn","onRollupWarn","warning","warn","suppressUnusedImport","code","names","includes","filter","n","length","ids","every","id","finalizeViteConfig","TypeError","extendViteConfigWithUserConfig","defaultConfig","userConfig"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { styleText } from 'node:util';
2
+ import { isInteractive } from '@sanity/cli-core';
3
+ import { select } from '@sanity/cli-core/ux';
4
+ /**
5
+ * Handle prerelease versions that cannot be resolved by the auto-updates CDN.
6
+ *
7
+ * In unattended or non-interactive mode, exits with an error. In interactive mode,
8
+ * prompts the user to either disable auto-updates for this build or cancel.
9
+ *
10
+ * Does not return if the build should be cancelled (exits via `output.error`).
11
+ */ export async function handlePrereleaseVersions({ output, unattendedMode, unresolvedPrerelease }) {
12
+ const prereleaseMessage = `The following packages are using prerelease versions not yet available on the auto-updates CDN:\n\n` + `${unresolvedPrerelease.map((mod)=>` - ${mod.pkg} (${mod.version})`).join('\n')}\n\n` + `Auto-updates cannot be used with prerelease versions. To re-enable auto-updates later, ` + `switch to a non-prerelease version locally and deploy again.`;
13
+ if (unattendedMode || !isInteractive()) {
14
+ output.error(`${prereleaseMessage}\n\n` + `Cannot build with auto-updates in unattended mode when using prerelease versions. ` + `Either switch to a non-prerelease version, or use --no-auto-updates to build without auto-updates.`, {
15
+ exit: 1
16
+ });
17
+ // output.error with exit: 1 throws, but TypeScript doesn't know that
18
+ throw new Error('unreachable');
19
+ }
20
+ const choice = await select({
21
+ choices: [
22
+ {
23
+ name: 'Disable auto-updates for this build and continue',
24
+ value: 'disable-auto-updates'
25
+ },
26
+ {
27
+ name: 'Cancel build',
28
+ value: 'cancel'
29
+ }
30
+ ],
31
+ default: 'disable-auto-updates',
32
+ message: styleText('yellow', prereleaseMessage)
33
+ });
34
+ if (choice === 'cancel') {
35
+ output.error('Declined to continue with build', {
36
+ exit: 1
37
+ });
38
+ // output.error with exit: 1 throws, but TypeScript doesn't know that
39
+ throw new Error('unreachable');
40
+ }
41
+ output.warn('Auto-updates disabled for this build');
42
+ }
43
+
44
+ //# sourceMappingURL=handlePrereleaseVersions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/build/handlePrereleaseVersions.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {isInteractive, type Output} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type UnresolvedPrerelease} from '../../util/compareDependencyVersions.js'\n\n/**\n * Handle prerelease versions that cannot be resolved by the auto-updates CDN.\n *\n * In unattended or non-interactive mode, exits with an error. In interactive mode,\n * prompts the user to either disable auto-updates for this build or cancel.\n *\n * Does not return if the build should be cancelled (exits via `output.error`).\n */\nexport async function handlePrereleaseVersions({\n output,\n unattendedMode,\n unresolvedPrerelease,\n}: {\n output: Output\n unattendedMode: boolean\n unresolvedPrerelease: UnresolvedPrerelease[]\n}): Promise<void> {\n const prereleaseMessage =\n `The following packages are using prerelease versions not yet available on the auto-updates CDN:\\n\\n` +\n `${unresolvedPrerelease.map((mod) => ` - ${mod.pkg} (${mod.version})`).join('\\n')}\\n\\n` +\n `Auto-updates cannot be used with prerelease versions. To re-enable auto-updates later, ` +\n `switch to a non-prerelease version locally and deploy again.`\n\n if (unattendedMode || !isInteractive()) {\n output.error(\n `${prereleaseMessage}\\n\\n` +\n `Cannot build with auto-updates in unattended mode when using prerelease versions. ` +\n `Either switch to a non-prerelease version, or use --no-auto-updates to build without auto-updates.`,\n {exit: 1},\n )\n // output.error with exit: 1 throws, but TypeScript doesn't know that\n throw new Error('unreachable')\n }\n\n const choice = await select({\n choices: [\n {\n name: 'Disable auto-updates for this build and continue',\n value: 'disable-auto-updates',\n },\n {name: 'Cancel build', value: 'cancel'},\n ],\n default: 'disable-auto-updates',\n message: styleText('yellow', prereleaseMessage),\n })\n\n if (choice === 'cancel') {\n output.error('Declined to continue with build', {exit: 1})\n // output.error with exit: 1 throws, but TypeScript doesn't know that\n throw new Error('unreachable')\n }\n\n output.warn('Auto-updates disabled for this build')\n}\n"],"names":["styleText","isInteractive","select","handlePrereleaseVersions","output","unattendedMode","unresolvedPrerelease","prereleaseMessage","map","mod","pkg","version","join","error","exit","Error","choice","choices","name","value","default","message","warn"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,aAAa,QAAoB,mBAAkB;AAC3D,SAAQC,MAAM,QAAO,sBAAqB;AAI1C;;;;;;;CAOC,GACD,OAAO,eAAeC,yBAAyB,EAC7CC,MAAM,EACNC,cAAc,EACdC,oBAAoB,EAKrB;IACC,MAAMC,oBACJ,CAAC,mGAAmG,CAAC,GACrG,GAAGD,qBAAqBE,GAAG,CAAC,CAACC,MAAQ,CAAC,GAAG,EAAEA,IAAIC,GAAG,CAAC,EAAE,EAAED,IAAIE,OAAO,CAAC,CAAC,CAAC,EAAEC,IAAI,CAAC,MAAM,IAAI,CAAC,GACvF,CAAC,uFAAuF,CAAC,GACzF,CAAC,4DAA4D,CAAC;IAEhE,IAAIP,kBAAkB,CAACJ,iBAAiB;QACtCG,OAAOS,KAAK,CACV,GAAGN,kBAAkB,IAAI,CAAC,GACxB,CAAC,kFAAkF,CAAC,GACpF,CAAC,kGAAkG,CAAC,EACtG;YAACO,MAAM;QAAC;QAEV,qEAAqE;QACrE,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,SAAS,MAAMd,OAAO;QAC1Be,SAAS;YACP;gBACEC,MAAM;gBACNC,OAAO;YACT;YACA;gBAACD,MAAM;gBAAgBC,OAAO;YAAQ;SACvC;QACDC,SAAS;QACTC,SAASrB,UAAU,UAAUO;IAC/B;IAEA,IAAIS,WAAW,UAAU;QACvBZ,OAAOS,KAAK,CAAC,mCAAmC;YAACC,MAAM;QAAC;QACxD,qEAAqE;QACrE,MAAM,IAAIC,MAAM;IAClB;IAEAX,OAAOkB,IAAI,CAAC;AACd"}
@@ -62,6 +62,7 @@ const errorHandlerScript = `
62
62
  'line-height: 21px',
63
63
  'margin: 0 auto',
64
64
  'max-width: 960px',
65
+ 'max-height: 90dvh',
65
66
  'overflow: auto',
66
67
  'padding: 20px',
67
68
  'width: 100%',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/actions/build/renderDocumentWorker/components/GlobalErrorHandler.tsx"],"sourcesContent":["import {type JSX} from 'react'\n\nconst errorHandlerScript = `\n;(function () {\n var _caughtErrors = []\n\n var errorChannel = (function () {\n var subscribers = []\n\n function publish(msg) {\n for (var i = 0; i < subscribers.length; i += 1) {\n subscribers[i](msg)\n }\n }\n\n function subscribe(subscriber) {\n subscribers.push(subscriber)\n\n return function () {\n var idx = subscribers.indexOf(subscriber)\n\n if (idx > -1) {\n subscribers.splice(idx, 1)\n }\n }\n }\n\n return {publish, subscribe, subscribers}\n })()\n\n // NOTE: Store the error channel instance in the global scope so that the application can\n // access it and subscribe to errors.\n window.__sanityErrorChannel = {\n subscribe: errorChannel.subscribe,\n }\n\n function _nextTick(callback) {\n setTimeout(callback, 0)\n }\n\n function _handleError(error, params) {\n _nextTick(function () {\n // - If there are error channel subscribers, then we notify them (no console error).\n // - If there are no subscribers, then we log the error to the console and render the error overlay.\n if (errorChannel.subscribers.length) {\n errorChannel.publish({error, params})\n } else {\n console.error(error)\n\n _renderErrorOverlay(error, params)\n }\n })\n }\n\n var ERROR_BOX_STYLE = [\n 'background: #fff',\n 'border-radius: 6px',\n 'box-sizing: border-box',\n 'color: #121923',\n 'flex: 1',\n \"font-family: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue','Liberation Sans',Helvetica,Arial,system-ui,sans-serif\",\n 'font-size: 16px',\n 'line-height: 21px',\n 'margin: 0 auto',\n 'max-width: 960px',\n 'overflow: auto',\n 'padding: 20px',\n 'width: 100%',\n ].join(';')\n\n var ERROR_CODE_STYLE = [\n 'color: #972E2A',\n \"font-family: -apple-system-ui-monospace, 'SF Mono', Menlo, Monaco, Consolas, monospace\",\n 'font-size: 13px',\n 'line-height: 17px',\n 'margin: 0',\n ].join(';')\n\n function _renderErrorOverlay(error, params) {\n var errorElement = document.querySelector('#__sanityError') || document.createElement('div')\n var colno = params.event.colno\n var lineno = params.event.lineno\n var filename = params.event.filename\n\n errorElement.id = '__sanityError'\n errorElement.innerHTML = [\n '<div style=\"' + ERROR_BOX_STYLE + '\">',\n '<div style=\"font-weight: 700;\">Uncaught error: ' + error.message + '</div>',\n '<div style=\"color: #515E72; font-size: 13px; line-height: 17px; margin: 10px 0;\">' +\n filename +\n ':' +\n lineno +\n ':' +\n colno +\n '</div>',\n '<pre style=\"' + ERROR_CODE_STYLE + '\">' + error.stack + '</pre>',\n '</div>',\n ].join('')\n\n errorElement.style.position = 'fixed'\n errorElement.style.zIndex = 1000000\n errorElement.style.top = 0\n errorElement.style.left = 0\n errorElement.style.right = 0\n errorElement.style.bottom = 0\n errorElement.style.padding = '20px'\n errorElement.style.background = 'rgba(16,17,18,0.66)'\n errorElement.style.display = 'flex'\n errorElement.style.alignItems = 'center'\n errorElement.style.justifyContent = 'center'\n\n document.body.appendChild(errorElement)\n }\n\n // NOTE:\n // Yes – we're attaching 2 error listeners below 👀\n // This is because React makes the same error throw twice (in development mode).\n // See: https://github.com/facebook/react/issues/10384\n\n // Error listener #1\n window.onerror = function (event, source, lineno, colno, error) {\n _nextTick(function () {\n if (_caughtErrors.indexOf(error) !== -1) return\n\n _caughtErrors.push(error)\n\n _handleError(error, {\n event,\n lineno,\n colno,\n source,\n })\n\n _nextTick(function () {\n var idx = _caughtErrors.indexOf(error)\n\n if (idx > -1) _caughtErrors.splice(idx, 1)\n })\n })\n\n // IMPORTANT: this callback must return \\`true\\` to prevent the error from being rendered in\n // the browser’s console.\n return true\n }\n\n // Error listener #2\n window.addEventListener('error', function (event) {\n if (_caughtErrors.indexOf(event.error) !== -1) return true\n\n _caughtErrors.push(event.error)\n\n _handleError(event.error, {\n event,\n lineno: event.lineno,\n colno: event.colno,\n })\n\n _nextTick(function () {\n _nextTick(function () {\n var idx = _caughtErrors.indexOf(event.error)\n\n if (idx > -1) _caughtErrors.splice(idx, 1)\n })\n })\n\n return true\n })\n})()\n`\n\n/** @internal */\nexport function GlobalErrorHandler(): JSX.Element {\n return <script dangerouslySetInnerHTML={{__html: errorHandlerScript}} />\n}\n"],"names":["errorHandlerScript","GlobalErrorHandler","script","dangerouslySetInnerHTML","__html"],"mappings":";AAEA,MAAMA,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsK5B,CAAC;AAED,cAAc,GACd,OAAO,SAASC;IACd,qBAAO,KAACC;QAAOC,yBAAyB;YAACC,QAAQJ;QAAkB;;AACrE"}
1
+ {"version":3,"sources":["../../../../../src/actions/build/renderDocumentWorker/components/GlobalErrorHandler.tsx"],"sourcesContent":["import {type JSX} from 'react'\n\nconst errorHandlerScript = `\n;(function () {\n var _caughtErrors = []\n\n var errorChannel = (function () {\n var subscribers = []\n\n function publish(msg) {\n for (var i = 0; i < subscribers.length; i += 1) {\n subscribers[i](msg)\n }\n }\n\n function subscribe(subscriber) {\n subscribers.push(subscriber)\n\n return function () {\n var idx = subscribers.indexOf(subscriber)\n\n if (idx > -1) {\n subscribers.splice(idx, 1)\n }\n }\n }\n\n return {publish, subscribe, subscribers}\n })()\n\n // NOTE: Store the error channel instance in the global scope so that the application can\n // access it and subscribe to errors.\n window.__sanityErrorChannel = {\n subscribe: errorChannel.subscribe,\n }\n\n function _nextTick(callback) {\n setTimeout(callback, 0)\n }\n\n function _handleError(error, params) {\n _nextTick(function () {\n // - If there are error channel subscribers, then we notify them (no console error).\n // - If there are no subscribers, then we log the error to the console and render the error overlay.\n if (errorChannel.subscribers.length) {\n errorChannel.publish({error, params})\n } else {\n console.error(error)\n\n _renderErrorOverlay(error, params)\n }\n })\n }\n\n var ERROR_BOX_STYLE = [\n 'background: #fff',\n 'border-radius: 6px',\n 'box-sizing: border-box',\n 'color: #121923',\n 'flex: 1',\n \"font-family: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue','Liberation Sans',Helvetica,Arial,system-ui,sans-serif\",\n 'font-size: 16px',\n 'line-height: 21px',\n 'margin: 0 auto',\n 'max-width: 960px',\n 'max-height: 90dvh',\n 'overflow: auto',\n 'padding: 20px',\n 'width: 100%',\n ].join(';')\n\n var ERROR_CODE_STYLE = [\n 'color: #972E2A',\n \"font-family: -apple-system-ui-monospace, 'SF Mono', Menlo, Monaco, Consolas, monospace\",\n 'font-size: 13px',\n 'line-height: 17px',\n 'margin: 0',\n ].join(';')\n\n function _renderErrorOverlay(error, params) {\n var errorElement = document.querySelector('#__sanityError') || document.createElement('div')\n var colno = params.event.colno\n var lineno = params.event.lineno\n var filename = params.event.filename\n\n errorElement.id = '__sanityError'\n errorElement.innerHTML = [\n '<div style=\"' + ERROR_BOX_STYLE + '\">',\n '<div style=\"font-weight: 700;\">Uncaught error: ' + error.message + '</div>',\n '<div style=\"color: #515E72; font-size: 13px; line-height: 17px; margin: 10px 0;\">' +\n filename +\n ':' +\n lineno +\n ':' +\n colno +\n '</div>',\n '<pre style=\"' + ERROR_CODE_STYLE + '\">' + error.stack + '</pre>',\n '</div>',\n ].join('')\n\n errorElement.style.position = 'fixed'\n errorElement.style.zIndex = 1000000\n errorElement.style.top = 0\n errorElement.style.left = 0\n errorElement.style.right = 0\n errorElement.style.bottom = 0\n errorElement.style.padding = '20px'\n errorElement.style.background = 'rgba(16,17,18,0.66)'\n errorElement.style.display = 'flex'\n errorElement.style.alignItems = 'center'\n errorElement.style.justifyContent = 'center'\n\n document.body.appendChild(errorElement)\n }\n\n // NOTE:\n // Yes – we're attaching 2 error listeners below 👀\n // This is because React makes the same error throw twice (in development mode).\n // See: https://github.com/facebook/react/issues/10384\n\n // Error listener #1\n window.onerror = function (event, source, lineno, colno, error) {\n _nextTick(function () {\n if (_caughtErrors.indexOf(error) !== -1) return\n\n _caughtErrors.push(error)\n\n _handleError(error, {\n event,\n lineno,\n colno,\n source,\n })\n\n _nextTick(function () {\n var idx = _caughtErrors.indexOf(error)\n\n if (idx > -1) _caughtErrors.splice(idx, 1)\n })\n })\n\n // IMPORTANT: this callback must return \\`true\\` to prevent the error from being rendered in\n // the browser’s console.\n return true\n }\n\n // Error listener #2\n window.addEventListener('error', function (event) {\n if (_caughtErrors.indexOf(event.error) !== -1) return true\n\n _caughtErrors.push(event.error)\n\n _handleError(event.error, {\n event,\n lineno: event.lineno,\n colno: event.colno,\n })\n\n _nextTick(function () {\n _nextTick(function () {\n var idx = _caughtErrors.indexOf(event.error)\n\n if (idx > -1) _caughtErrors.splice(idx, 1)\n })\n })\n\n return true\n })\n})()\n`\n\n/** @internal */\nexport function GlobalErrorHandler(): JSX.Element {\n return <script dangerouslySetInnerHTML={{__html: errorHandlerScript}} />\n}\n"],"names":["errorHandlerScript","GlobalErrorHandler","script","dangerouslySetInnerHTML","__html"],"mappings":";AAEA,MAAMA,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuK5B,CAAC;AAED,cAAc,GACd,OAAO,SAASC;IACd,qBAAO,KAACC;QAAOC,yBAAyB;YAACC,QAAQJ;QAAkB;;AACrE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/types.ts"],"sourcesContent":["import {type CliConfig, type Output} from '@sanity/cli-core'\n\nimport {BuildCommand} from '../../commands/build.js'\nimport {type DeployFlags} from '../deploy/types.js'\n\nexport type BuildFlags = BuildCommand['flags']\n\nexport interface BuildOptions {\n autoUpdatesEnabled: boolean\n cliConfig: CliConfig\n flags: BuildFlags | DeployFlags\n output: Output\n\n workDir: string\n\n outDir?: string\n}\n"],"names":[],"mappings":"AAOA,WASC"}
1
+ {"version":3,"sources":["../../../src/actions/build/types.ts"],"sourcesContent":["import {type CliConfig, type Output} from '@sanity/cli-core'\n\nimport {BuildCommand} from '../../commands/build.js'\nimport {type DeployFlags} from '../deploy/types.js'\n\nexport type BuildFlags = BuildCommand['flags']\n\nexport interface BuildOptions {\n autoUpdatesEnabled: boolean\n cliConfig: CliConfig\n flags: BuildFlags | DeployFlags\n output: Output\n\n workDir: string\n\n calledFromDeploy?: boolean\n outDir?: string\n}\n"],"names":[],"mappings":"AAOA,WAUC"}
@@ -2,6 +2,7 @@ import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { tryFindStudioConfigPath } from '@sanity/cli-core';
4
4
  import { watch as chokidarWatch } from 'chokidar';
5
+ import { toForwardSlashes } from '../../util/toForwardSlashes.js';
5
6
  import { buildDebug } from './buildDebug.js';
6
7
  import { decorateIndexWithAutoGeneratedWarning } from './decorateIndexWithAutoGeneratedWarning.js';
7
8
  import { decorateIndexWithBridgeScript } from './decorateIndexWithBridgeScript.js';
@@ -28,7 +29,7 @@ import { renderDocument } from './renderDocument.js';
28
29
  isApp,
29
30
  props: {
30
31
  basePath: basePath || '/',
31
- entryPath: `/${path.relative(cwd, path.join(runtimeDir, 'app.js'))}`
32
+ entryPath: `/${toForwardSlashes(path.relative(cwd, path.join(runtimeDir, 'app.js')))}`
32
33
  },
33
34
  studioRootPath: cwd
34
35
  })));
@@ -44,9 +45,9 @@ import { renderDocument } from './renderDocument.js';
44
45
  let relativeConfigLocation = null;
45
46
  if (!isApp) {
46
47
  const studioConfigPath = await tryFindStudioConfigPath(cwd);
47
- relativeConfigLocation = studioConfigPath ? path.relative(runtimeDir, studioConfigPath) : null;
48
+ relativeConfigLocation = studioConfigPath ? toForwardSlashes(path.relative(runtimeDir, studioConfigPath)) : null;
48
49
  }
49
- const relativeEntry = cwd ? path.resolve(cwd, entry || './src/App') : entry;
50
+ const relativeEntry = toForwardSlashes(path.relative(runtimeDir, path.resolve(cwd, entry || './src/App')));
50
51
  const appJsContent = getEntryModule({
51
52
  basePath,
52
53
  entry: relativeEntry,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/writeSanityRuntime.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {tryFindStudioConfigPath} from '@sanity/cli-core'\nimport {watch as chokidarWatch, type FSWatcher} from 'chokidar'\n\nimport {buildDebug} from './buildDebug.js'\nimport {decorateIndexWithAutoGeneratedWarning} from './decorateIndexWithAutoGeneratedWarning.js'\nimport {decorateIndexWithBridgeScript} from './decorateIndexWithBridgeScript.js'\nimport {getEntryModule} from './getEntryModule.js'\nimport {getPossibleDocumentComponentLocations} from './getPossibleDocumentComponentLocations.js'\nimport {renderDocument} from './renderDocument.js'\n\ninterface RuntimeOptions {\n cwd: string\n reactStrictMode: boolean\n watch: boolean\n\n basePath?: string\n entry?: string\n isApp?: boolean\n}\n\n/**\n * Generates the `.sanity/runtime` directory, and optionally watches for custom\n * document files, rebuilding when they change\n *\n * @param options - Current working directory (Sanity root dir), and whether or not to watch\n * @returns A watcher instance if watch is enabled, undefined otherwise\n * @internal\n */\nexport async function writeSanityRuntime(options: RuntimeOptions): Promise<FSWatcher | undefined> {\n const {basePath, cwd, entry, isApp, reactStrictMode, watch} = options\n const runtimeDir = path.join(cwd, '.sanity', 'runtime')\n\n buildDebug('Making runtime directory')\n await fs.mkdir(runtimeDir, {recursive: true})\n\n async function renderAndWriteDocument() {\n buildDebug('Rendering document template')\n const indexHtml = decorateIndexWithBridgeScript(\n decorateIndexWithAutoGeneratedWarning(\n await renderDocument({\n isApp,\n props: {\n basePath: basePath || '/',\n entryPath: `/${path.relative(cwd, path.join(runtimeDir, 'app.js'))}`,\n },\n studioRootPath: cwd,\n }),\n ),\n )\n\n buildDebug('Writing index.html to runtime directory')\n await fs.writeFile(path.join(runtimeDir, 'index.html'), indexHtml)\n }\n\n let watcher: FSWatcher | undefined\n\n if (watch) {\n watcher = chokidarWatch(getPossibleDocumentComponentLocations(cwd)).on('all', () =>\n renderAndWriteDocument(),\n )\n }\n\n await renderAndWriteDocument()\n\n buildDebug('Writing app.js to runtime directory')\n let relativeConfigLocation: string | null = null\n if (!isApp) {\n const studioConfigPath = await tryFindStudioConfigPath(cwd)\n relativeConfigLocation = studioConfigPath ? path.relative(runtimeDir, studioConfigPath) : null\n }\n\n const relativeEntry = cwd ? path.resolve(cwd, entry || './src/App') : entry\n const appJsContent = getEntryModule({\n basePath,\n entry: relativeEntry,\n isApp,\n reactStrictMode,\n relativeConfigLocation,\n })\n await fs.writeFile(path.join(runtimeDir, 'app.js'), appJsContent)\n\n return watcher\n}\n"],"names":["fs","path","tryFindStudioConfigPath","watch","chokidarWatch","buildDebug","decorateIndexWithAutoGeneratedWarning","decorateIndexWithBridgeScript","getEntryModule","getPossibleDocumentComponentLocations","renderDocument","writeSanityRuntime","options","basePath","cwd","entry","isApp","reactStrictMode","runtimeDir","join","mkdir","recursive","renderAndWriteDocument","indexHtml","props","entryPath","relative","studioRootPath","writeFile","watcher","on","relativeConfigLocation","studioConfigPath","relativeEntry","resolve","appJsContent"],"mappings":"AAAA,OAAOA,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,SAAQC,uBAAuB,QAAO,mBAAkB;AACxD,SAAQC,SAASC,aAAa,QAAuB,WAAU;AAE/D,SAAQC,UAAU,QAAO,kBAAiB;AAC1C,SAAQC,qCAAqC,QAAO,6CAA4C;AAChG,SAAQC,6BAA6B,QAAO,qCAAoC;AAChF,SAAQC,cAAc,QAAO,sBAAqB;AAClD,SAAQC,qCAAqC,QAAO,6CAA4C;AAChG,SAAQC,cAAc,QAAO,sBAAqB;AAYlD;;;;;;;CAOC,GACD,OAAO,eAAeC,mBAAmBC,OAAuB;IAC9D,MAAM,EAACC,QAAQ,EAAEC,GAAG,EAAEC,KAAK,EAAEC,KAAK,EAAEC,eAAe,EAAEd,KAAK,EAAC,GAAGS;IAC9D,MAAMM,aAAajB,KAAKkB,IAAI,CAACL,KAAK,WAAW;IAE7CT,WAAW;IACX,MAAML,GAAGoB,KAAK,CAACF,YAAY;QAACG,WAAW;IAAI;IAE3C,eAAeC;QACbjB,WAAW;QACX,MAAMkB,YAAYhB,8BAChBD,sCACE,MAAMI,eAAe;YACnBM;YACAQ,OAAO;gBACLX,UAAUA,YAAY;gBACtBY,WAAW,CAAC,CAAC,EAAExB,KAAKyB,QAAQ,CAACZ,KAAKb,KAAKkB,IAAI,CAACD,YAAY,YAAY;YACtE;YACAS,gBAAgBb;QAClB;QAIJT,WAAW;QACX,MAAML,GAAG4B,SAAS,CAAC3B,KAAKkB,IAAI,CAACD,YAAY,eAAeK;IAC1D;IAEA,IAAIM;IAEJ,IAAI1B,OAAO;QACT0B,UAAUzB,cAAcK,sCAAsCK,MAAMgB,EAAE,CAAC,OAAO,IAC5ER;IAEJ;IAEA,MAAMA;IAENjB,WAAW;IACX,IAAI0B,yBAAwC;IAC5C,IAAI,CAACf,OAAO;QACV,MAAMgB,mBAAmB,MAAM9B,wBAAwBY;QACvDiB,yBAAyBC,mBAAmB/B,KAAKyB,QAAQ,CAACR,YAAYc,oBAAoB;IAC5F;IAEA,MAAMC,gBAAgBnB,MAAMb,KAAKiC,OAAO,CAACpB,KAAKC,SAAS,eAAeA;IACtE,MAAMoB,eAAe3B,eAAe;QAClCK;QACAE,OAAOkB;QACPjB;QACAC;QACAc;IACF;IACA,MAAM/B,GAAG4B,SAAS,CAAC3B,KAAKkB,IAAI,CAACD,YAAY,WAAWiB;IAEpD,OAAON;AACT"}
1
+ {"version":3,"sources":["../../../src/actions/build/writeSanityRuntime.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {tryFindStudioConfigPath} from '@sanity/cli-core'\nimport {watch as chokidarWatch, type FSWatcher} from 'chokidar'\n\nimport {toForwardSlashes} from '../../util/toForwardSlashes.js'\nimport {buildDebug} from './buildDebug.js'\nimport {decorateIndexWithAutoGeneratedWarning} from './decorateIndexWithAutoGeneratedWarning.js'\nimport {decorateIndexWithBridgeScript} from './decorateIndexWithBridgeScript.js'\nimport {getEntryModule} from './getEntryModule.js'\nimport {getPossibleDocumentComponentLocations} from './getPossibleDocumentComponentLocations.js'\nimport {renderDocument} from './renderDocument.js'\n\ninterface RuntimeOptions {\n cwd: string\n reactStrictMode: boolean\n watch: boolean\n\n basePath?: string\n entry?: string\n isApp?: boolean\n}\n\n/**\n * Generates the `.sanity/runtime` directory, and optionally watches for custom\n * document files, rebuilding when they change\n *\n * @param options - Current working directory (Sanity root dir), and whether or not to watch\n * @returns A watcher instance if watch is enabled, undefined otherwise\n * @internal\n */\nexport async function writeSanityRuntime(options: RuntimeOptions): Promise<FSWatcher | undefined> {\n const {basePath, cwd, entry, isApp, reactStrictMode, watch} = options\n const runtimeDir = path.join(cwd, '.sanity', 'runtime')\n\n buildDebug('Making runtime directory')\n await fs.mkdir(runtimeDir, {recursive: true})\n\n async function renderAndWriteDocument() {\n buildDebug('Rendering document template')\n const indexHtml = decorateIndexWithBridgeScript(\n decorateIndexWithAutoGeneratedWarning(\n await renderDocument({\n isApp,\n props: {\n basePath: basePath || '/',\n entryPath: `/${toForwardSlashes(path.relative(cwd, path.join(runtimeDir, 'app.js')))}`,\n },\n studioRootPath: cwd,\n }),\n ),\n )\n\n buildDebug('Writing index.html to runtime directory')\n await fs.writeFile(path.join(runtimeDir, 'index.html'), indexHtml)\n }\n\n let watcher: FSWatcher | undefined\n\n if (watch) {\n watcher = chokidarWatch(getPossibleDocumentComponentLocations(cwd)).on('all', () =>\n renderAndWriteDocument(),\n )\n }\n\n await renderAndWriteDocument()\n\n buildDebug('Writing app.js to runtime directory')\n let relativeConfigLocation: string | null = null\n if (!isApp) {\n const studioConfigPath = await tryFindStudioConfigPath(cwd)\n relativeConfigLocation = studioConfigPath\n ? toForwardSlashes(path.relative(runtimeDir, studioConfigPath))\n : null\n }\n\n const relativeEntry = toForwardSlashes(\n path.relative(runtimeDir, path.resolve(cwd, entry || './src/App')),\n )\n const appJsContent = getEntryModule({\n basePath,\n entry: relativeEntry,\n isApp,\n reactStrictMode,\n relativeConfigLocation,\n })\n await fs.writeFile(path.join(runtimeDir, 'app.js'), appJsContent)\n\n return watcher\n}\n"],"names":["fs","path","tryFindStudioConfigPath","watch","chokidarWatch","toForwardSlashes","buildDebug","decorateIndexWithAutoGeneratedWarning","decorateIndexWithBridgeScript","getEntryModule","getPossibleDocumentComponentLocations","renderDocument","writeSanityRuntime","options","basePath","cwd","entry","isApp","reactStrictMode","runtimeDir","join","mkdir","recursive","renderAndWriteDocument","indexHtml","props","entryPath","relative","studioRootPath","writeFile","watcher","on","relativeConfigLocation","studioConfigPath","relativeEntry","resolve","appJsContent"],"mappings":"AAAA,OAAOA,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,SAAQC,uBAAuB,QAAO,mBAAkB;AACxD,SAAQC,SAASC,aAAa,QAAuB,WAAU;AAE/D,SAAQC,gBAAgB,QAAO,iCAAgC;AAC/D,SAAQC,UAAU,QAAO,kBAAiB;AAC1C,SAAQC,qCAAqC,QAAO,6CAA4C;AAChG,SAAQC,6BAA6B,QAAO,qCAAoC;AAChF,SAAQC,cAAc,QAAO,sBAAqB;AAClD,SAAQC,qCAAqC,QAAO,6CAA4C;AAChG,SAAQC,cAAc,QAAO,sBAAqB;AAYlD;;;;;;;CAOC,GACD,OAAO,eAAeC,mBAAmBC,OAAuB;IAC9D,MAAM,EAACC,QAAQ,EAAEC,GAAG,EAAEC,KAAK,EAAEC,KAAK,EAAEC,eAAe,EAAEf,KAAK,EAAC,GAAGU;IAC9D,MAAMM,aAAalB,KAAKmB,IAAI,CAACL,KAAK,WAAW;IAE7CT,WAAW;IACX,MAAMN,GAAGqB,KAAK,CAACF,YAAY;QAACG,WAAW;IAAI;IAE3C,eAAeC;QACbjB,WAAW;QACX,MAAMkB,YAAYhB,8BAChBD,sCACE,MAAMI,eAAe;YACnBM;YACAQ,OAAO;gBACLX,UAAUA,YAAY;gBACtBY,WAAW,CAAC,CAAC,EAAErB,iBAAiBJ,KAAK0B,QAAQ,CAACZ,KAAKd,KAAKmB,IAAI,CAACD,YAAY,aAAa;YACxF;YACAS,gBAAgBb;QAClB;QAIJT,WAAW;QACX,MAAMN,GAAG6B,SAAS,CAAC5B,KAAKmB,IAAI,CAACD,YAAY,eAAeK;IAC1D;IAEA,IAAIM;IAEJ,IAAI3B,OAAO;QACT2B,UAAU1B,cAAcM,sCAAsCK,MAAMgB,EAAE,CAAC,OAAO,IAC5ER;IAEJ;IAEA,MAAMA;IAENjB,WAAW;IACX,IAAI0B,yBAAwC;IAC5C,IAAI,CAACf,OAAO;QACV,MAAMgB,mBAAmB,MAAM/B,wBAAwBa;QACvDiB,yBAAyBC,mBACrB5B,iBAAiBJ,KAAK0B,QAAQ,CAACR,YAAYc,qBAC3C;IACN;IAEA,MAAMC,gBAAgB7B,iBACpBJ,KAAK0B,QAAQ,CAACR,YAAYlB,KAAKkC,OAAO,CAACpB,KAAKC,SAAS;IAEvD,MAAMoB,eAAe3B,eAAe;QAClCK;QACAE,OAAOkB;QACPjB;QACAC;QACAc;IACF;IACA,MAAMhC,GAAG6B,SAAS,CAAC5B,KAAKmB,IAAI,CAACD,YAAY,WAAWiB;IAEpD,OAAON;AACT"}
@@ -15,7 +15,7 @@ const debug = subdebug('dataset:create');
15
15
  * @returns Promise resolving when dataset is created
16
16
  * @throws Error if dataset creation fails
17
17
  */ export async function createDataset(options) {
18
- const { datasetName, forcePublic = false, isUnattended = false, output, projectFeatures, projectId, visibility } = options;
18
+ const { datasetName, embeddings, embeddingsProjection, forcePublic = false, isUnattended = false, output, projectFeatures, projectId, visibility } = options;
19
19
  const canCreatePrivate = projectFeatures.includes('privateDataset') && !forcePublic;
20
20
  // Determine the appropriate ACL mode
21
21
  const aclMode = await determineDatasetAclMode({
@@ -29,6 +29,12 @@ const debug = subdebug('dataset:create');
29
29
  const newDataset = await createDatasetService({
30
30
  aclMode,
31
31
  datasetName,
32
+ embeddings: embeddings ? {
33
+ enabled: true,
34
+ ...embeddingsProjection ? {
35
+ projection: embeddingsProjection
36
+ } : {}
37
+ } : undefined,
32
38
  projectId
33
39
  });
34
40
  spin.succeed();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/dataset/create.ts"],"sourcesContent":["import {type Output, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type DatasetAclMode, DatasetResponse} from '@sanity/client'\n\nimport {createDataset as createDatasetService} from '../../services/datasets.js'\nimport {determineDatasetAclMode} from './determineDatasetAclMode.js'\n\nconst debug = subdebug('dataset:create')\n\n/**\n * Options for creating a dataset\n */\ninterface CreateDatasetOptions {\n /**\n * Name of the dataset to create\n */\n datasetName: string\n\n /**\n * Output instance for logging\n */\n output: Output\n\n /**\n * Array of project features to determine capabilities\n * Used to check if private datasets are available\n */\n projectFeatures: string[]\n\n /**\n * Project ID where the dataset will be created\n */\n projectId: string\n\n /**\n * Whether to force disable private dataset creation\n * Used when default config is selected (which forces public datasets)\n */\n forcePublic?: boolean\n\n /**\n * Whether to run in unattended mode (no prompts)\n */\n isUnattended?: boolean\n\n /**\n * Requested visibility mode from flags/options\n */\n visibility?: string\n}\n\n/**\n * Creates a new dataset with the appropriate ACL mode.\n *\n * This action handles the business logic for:\n * - Determining the appropriate ACL mode based on project capabilities\n * - Creating the dataset via the service layer\n * - Handling errors and providing user feedback\n *\n * @param options - Configuration options\n * @returns Promise resolving when dataset is created\n * @throws Error if dataset creation fails\n */\nexport async function createDataset(options: CreateDatasetOptions): Promise<DatasetResponse> {\n const {\n datasetName,\n forcePublic = false,\n isUnattended = false,\n output,\n projectFeatures,\n projectId,\n visibility,\n } = options\n\n const canCreatePrivate = projectFeatures.includes('privateDataset') && !forcePublic\n\n // Determine the appropriate ACL mode\n const aclMode: DatasetAclMode = await determineDatasetAclMode({\n canCreatePrivate,\n isUnattended,\n output,\n visibility,\n })\n\n try {\n const spin = spinner('Creating dataset').start()\n const newDataset = await createDatasetService({\n aclMode,\n datasetName,\n projectId,\n })\n spin.succeed()\n output.log(`Dataset created successfully`)\n return newDataset\n } catch (error) {\n debug('Error creating dataset', {datasetName, error})\n throw error\n }\n}\n"],"names":["subdebug","spinner","createDataset","createDatasetService","determineDatasetAclMode","debug","options","datasetName","forcePublic","isUnattended","output","projectFeatures","projectId","visibility","canCreatePrivate","includes","aclMode","spin","start","newDataset","succeed","log","error"],"mappings":"AAAA,SAAqBA,QAAQ,QAAO,mBAAkB;AACtD,SAAQC,OAAO,QAAO,sBAAqB;AAG3C,SAAQC,iBAAiBC,oBAAoB,QAAO,6BAA4B;AAChF,SAAQC,uBAAuB,QAAO,+BAA8B;AAEpE,MAAMC,QAAQL,SAAS;AA4CvB;;;;;;;;;;;CAWC,GACD,OAAO,eAAeE,cAAcI,OAA6B;IAC/D,MAAM,EACJC,WAAW,EACXC,cAAc,KAAK,EACnBC,eAAe,KAAK,EACpBC,MAAM,EACNC,eAAe,EACfC,SAAS,EACTC,UAAU,EACX,GAAGP;IAEJ,MAAMQ,mBAAmBH,gBAAgBI,QAAQ,CAAC,qBAAqB,CAACP;IAExE,qCAAqC;IACrC,MAAMQ,UAA0B,MAAMZ,wBAAwB;QAC5DU;QACAL;QACAC;QACAG;IACF;IAEA,IAAI;QACF,MAAMI,OAAOhB,QAAQ,oBAAoBiB,KAAK;QAC9C,MAAMC,aAAa,MAAMhB,qBAAqB;YAC5Ca;YACAT;YACAK;QACF;QACAK,KAAKG,OAAO;QACZV,OAAOW,GAAG,CAAC,CAAC,4BAA4B,CAAC;QACzC,OAAOF;IACT,EAAE,OAAOG,OAAO;QACdjB,MAAM,0BAA0B;YAACE;YAAae;QAAK;QACnD,MAAMA;IACR;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/dataset/create.ts"],"sourcesContent":["import {type Output, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type DatasetAclMode, DatasetResponse} from '@sanity/client'\n\nimport {createDataset as createDatasetService} from '../../services/datasets.js'\nimport {determineDatasetAclMode} from './determineDatasetAclMode.js'\n\nconst debug = subdebug('dataset:create')\n\n/**\n * Options for creating a dataset\n */\ninterface CreateDatasetOptions {\n /**\n * Name of the dataset to create\n */\n datasetName: string\n\n /**\n * Output instance for logging\n */\n output: Output\n\n /**\n * Array of project features to determine capabilities\n * Used to check if private datasets are available\n */\n projectFeatures: string[]\n\n /**\n * Project ID where the dataset will be created\n */\n projectId: string\n\n /**\n * Whether to enable embeddings for the new dataset\n */\n embeddings?: boolean\n\n /**\n * GROQ projection for embeddings indexing (e.g. \"\\{ title, body \\}\")\n * Only used when embeddings is true\n */\n embeddingsProjection?: string\n\n /**\n * Whether to force disable private dataset creation\n * Used when default config is selected (which forces public datasets)\n */\n forcePublic?: boolean\n\n /**\n * Whether to run in unattended mode (no prompts)\n */\n isUnattended?: boolean\n\n /**\n * Requested visibility mode from flags/options\n */\n visibility?: string\n}\n\n/**\n * Creates a new dataset with the appropriate ACL mode.\n *\n * This action handles the business logic for:\n * - Determining the appropriate ACL mode based on project capabilities\n * - Creating the dataset via the service layer\n * - Handling errors and providing user feedback\n *\n * @param options - Configuration options\n * @returns Promise resolving when dataset is created\n * @throws Error if dataset creation fails\n */\nexport async function createDataset(options: CreateDatasetOptions): Promise<DatasetResponse> {\n const {\n datasetName,\n embeddings,\n embeddingsProjection,\n forcePublic = false,\n isUnattended = false,\n output,\n projectFeatures,\n projectId,\n visibility,\n } = options\n\n const canCreatePrivate = projectFeatures.includes('privateDataset') && !forcePublic\n\n // Determine the appropriate ACL mode\n const aclMode: DatasetAclMode = await determineDatasetAclMode({\n canCreatePrivate,\n isUnattended,\n output,\n visibility,\n })\n\n try {\n const spin = spinner('Creating dataset').start()\n const newDataset = await createDatasetService({\n aclMode,\n datasetName,\n embeddings: embeddings\n ? {enabled: true, ...(embeddingsProjection ? {projection: embeddingsProjection} : {})}\n : undefined,\n projectId,\n })\n spin.succeed()\n output.log(`Dataset created successfully`)\n return newDataset\n } catch (error) {\n debug('Error creating dataset', {datasetName, error})\n throw error\n }\n}\n"],"names":["subdebug","spinner","createDataset","createDatasetService","determineDatasetAclMode","debug","options","datasetName","embeddings","embeddingsProjection","forcePublic","isUnattended","output","projectFeatures","projectId","visibility","canCreatePrivate","includes","aclMode","spin","start","newDataset","enabled","projection","undefined","succeed","log","error"],"mappings":"AAAA,SAAqBA,QAAQ,QAAO,mBAAkB;AACtD,SAAQC,OAAO,QAAO,sBAAqB;AAG3C,SAAQC,iBAAiBC,oBAAoB,QAAO,6BAA4B;AAChF,SAAQC,uBAAuB,QAAO,+BAA8B;AAEpE,MAAMC,QAAQL,SAAS;AAuDvB;;;;;;;;;;;CAWC,GACD,OAAO,eAAeE,cAAcI,OAA6B;IAC/D,MAAM,EACJC,WAAW,EACXC,UAAU,EACVC,oBAAoB,EACpBC,cAAc,KAAK,EACnBC,eAAe,KAAK,EACpBC,MAAM,EACNC,eAAe,EACfC,SAAS,EACTC,UAAU,EACX,GAAGT;IAEJ,MAAMU,mBAAmBH,gBAAgBI,QAAQ,CAAC,qBAAqB,CAACP;IAExE,qCAAqC;IACrC,MAAMQ,UAA0B,MAAMd,wBAAwB;QAC5DY;QACAL;QACAC;QACAG;IACF;IAEA,IAAI;QACF,MAAMI,OAAOlB,QAAQ,oBAAoBmB,KAAK;QAC9C,MAAMC,aAAa,MAAMlB,qBAAqB;YAC5Ce;YACAX;YACAC,YAAYA,aACR;gBAACc,SAAS;gBAAM,GAAIb,uBAAuB;oBAACc,YAAYd;gBAAoB,IAAI,CAAC,CAAC;YAAC,IACnFe;YACJV;QACF;QACAK,KAAKM,OAAO;QACZb,OAAOc,GAAG,CAAC,CAAC,4BAA4B,CAAC;QACzC,OAAOL;IACT,EAAE,OAAOM,OAAO;QACdtB,MAAM,0BAA0B;YAACE;YAAaoB;QAAK;QACnD,MAAMA;IACR;AACF"}
@@ -0,0 +1,26 @@
1
+ import { promptForDataset } from '../../prompts/promptForDataset.js';
2
+ import { listDatasets } from '../../services/datasets.js';
3
+ import { assertDatasetExists } from '../backup/assertDatasetExist.js';
4
+ /**
5
+ * Lists datasets for a project, validates the given dataset name (or prompts
6
+ * the user to pick one), and returns the resolved name together with the full
7
+ * dataset list.
8
+ */ export async function resolveDataset({ dataset, projectId }) {
9
+ const datasets = await listDatasets(projectId);
10
+ if (datasets.length === 0) {
11
+ throw new Error('No datasets found in this project.');
12
+ }
13
+ if (dataset) {
14
+ assertDatasetExists(datasets, dataset);
15
+ } else {
16
+ dataset = await promptForDataset({
17
+ datasets
18
+ });
19
+ }
20
+ return {
21
+ dataset,
22
+ datasets
23
+ };
24
+ }
25
+
26
+ //# sourceMappingURL=resolveDataset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/dataset/resolveDataset.ts"],"sourcesContent":["import {type DatasetsResponse} from '@sanity/client'\n\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {assertDatasetExists} from '../backup/assertDatasetExist.js'\n\ninterface ResolveDatasetOptions {\n projectId: string\n\n dataset?: string\n}\n\ninterface ResolveDatasetResult {\n dataset: string\n datasets: DatasetsResponse\n}\n\n/**\n * Lists datasets for a project, validates the given dataset name (or prompts\n * the user to pick one), and returns the resolved name together with the full\n * dataset list.\n */\nexport async function resolveDataset({\n dataset,\n projectId,\n}: ResolveDatasetOptions): Promise<ResolveDatasetResult> {\n const datasets = await listDatasets(projectId)\n\n if (datasets.length === 0) {\n throw new Error('No datasets found in this project.')\n }\n\n if (dataset) {\n assertDatasetExists(datasets, dataset)\n } else {\n dataset = await promptForDataset({datasets})\n }\n\n return {dataset, datasets}\n}\n"],"names":["promptForDataset","listDatasets","assertDatasetExists","resolveDataset","dataset","projectId","datasets","length","Error"],"mappings":"AAEA,SAAQA,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,YAAY,QAAO,6BAA4B;AACvD,SAAQC,mBAAmB,QAAO,kCAAiC;AAanE;;;;CAIC,GACD,OAAO,eAAeC,eAAe,EACnCC,OAAO,EACPC,SAAS,EACa;IACtB,MAAMC,WAAW,MAAML,aAAaI;IAEpC,IAAIC,SAASC,MAAM,KAAK,GAAG;QACzB,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAIJ,SAAS;QACXF,oBAAoBI,UAAUF;IAChC,OAAO;QACLA,UAAU,MAAMJ,iBAAiB;YAACM;QAAQ;IAC5C;IAEA,OAAO;QAACF;QAASE;IAAQ;AAC3B"}