@sanity/cli 6.0.0-alpha.11 → 6.0.0-alpha.13

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 (135) hide show
  1. package/README.md +100 -112
  2. package/dist/actions/build/buildApp.js +15 -6
  3. package/dist/actions/build/buildApp.js.map +1 -1
  4. package/dist/actions/build/buildStudio.js +9 -3
  5. package/dist/actions/build/buildStudio.js.map +1 -1
  6. package/dist/actions/build/checkRequiredDependencies.js +6 -3
  7. package/dist/actions/build/checkRequiredDependencies.js.map +1 -1
  8. package/dist/actions/build/checkStudioDependencyVersions.js +6 -4
  9. package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -1
  10. package/dist/actions/build/types.js.map +1 -1
  11. package/dist/actions/deploy/deployApp.js +1 -2
  12. package/dist/actions/deploy/deployApp.js.map +1 -1
  13. package/dist/actions/deploy/deployStudio.js +1 -2
  14. package/dist/actions/deploy/deployStudio.js.map +1 -1
  15. package/dist/actions/deploy/types.js.map +1 -1
  16. package/dist/actions/init/checkNextJsReactCompatibility.js +1 -1
  17. package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -1
  18. package/dist/actions/init/createPackageManifest.js +13 -8
  19. package/dist/actions/init/createPackageManifest.js.map +1 -1
  20. package/dist/actions/init/remoteTemplate.js +1 -2
  21. package/dist/actions/init/remoteTemplate.js.map +1 -1
  22. package/dist/actions/manifest/SchemaIcon.js +6 -4
  23. package/dist/actions/manifest/SchemaIcon.js.map +1 -1
  24. package/dist/actions/manifest/blockTypeTransformer.js +67 -0
  25. package/dist/actions/manifest/blockTypeTransformer.js.map +1 -0
  26. package/dist/actions/manifest/debug.js +4 -0
  27. package/dist/actions/manifest/debug.js.map +1 -0
  28. package/dist/actions/manifest/extractManifest.js +26 -41
  29. package/dist/actions/manifest/extractManifest.js.map +1 -1
  30. package/dist/actions/manifest/extractManifest.worker.js +31 -0
  31. package/dist/actions/manifest/extractManifest.worker.js.map +1 -0
  32. package/dist/actions/manifest/extractWorkspaceManifest.js +31 -372
  33. package/dist/actions/manifest/extractWorkspaceManifest.js.map +1 -1
  34. package/dist/actions/manifest/iconResolver.js +30 -0
  35. package/dist/actions/manifest/iconResolver.js.map +1 -0
  36. package/dist/actions/manifest/referenceTransformer.js +51 -0
  37. package/dist/actions/manifest/referenceTransformer.js.map +1 -0
  38. package/dist/actions/manifest/schemaTypeHelpers.js +2 -2
  39. package/dist/actions/manifest/schemaTypeHelpers.js.map +1 -1
  40. package/dist/actions/manifest/schemaTypeTransformer.js +168 -0
  41. package/dist/actions/manifest/schemaTypeTransformer.js.map +1 -0
  42. package/dist/actions/manifest/transformerUtils.js +40 -0
  43. package/dist/actions/manifest/transformerUtils.js.map +1 -0
  44. package/dist/actions/manifest/types.js +5 -0
  45. package/dist/actions/manifest/types.js.map +1 -1
  46. package/dist/actions/manifest/validationTransformer.js +84 -0
  47. package/dist/actions/manifest/validationTransformer.js.map +1 -0
  48. package/dist/actions/manifest/writeWorkspaceFiles.js +30 -0
  49. package/dist/actions/manifest/writeWorkspaceFiles.js.map +1 -0
  50. package/dist/actions/schema/deleteSchemaAction.js +14 -30
  51. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  52. package/dist/actions/schema/extractSchema.js +1 -8
  53. package/dist/actions/schema/extractSchema.js.map +1 -1
  54. package/dist/actions/schema/listSchemas.js +53 -56
  55. package/dist/actions/schema/listSchemas.js.map +1 -1
  56. package/dist/actions/schema/types.js +4 -0
  57. package/dist/actions/schema/types.js.map +1 -1
  58. package/dist/actions/schema/uniqueWorkspaces.worker.js +22 -0
  59. package/dist/actions/schema/uniqueWorkspaces.worker.js.map +1 -0
  60. package/dist/actions/schema/utils/SchemaExtractionError.js +10 -0
  61. package/dist/actions/schema/utils/SchemaExtractionError.js.map +1 -0
  62. package/dist/actions/schema/utils/manifestExtractor.js +3 -7
  63. package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
  64. package/dist/actions/schema/utils/schemaStoreValidation.js +1 -9
  65. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  66. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +1 -1
  67. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -1
  68. package/dist/actions/versions/filterSanityModules.js.map +1 -1
  69. package/dist/actions/versions/findSanityModulesVersions.js +1 -1
  70. package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
  71. package/dist/commands/build.js +2 -5
  72. package/dist/commands/build.js.map +1 -1
  73. package/dist/commands/deploy.js +1 -4
  74. package/dist/commands/deploy.js.map +1 -1
  75. package/dist/commands/manifest/extract.js +13 -9
  76. package/dist/commands/manifest/extract.js.map +1 -1
  77. package/dist/commands/schema/delete.js +15 -25
  78. package/dist/commands/schema/delete.js.map +1 -1
  79. package/dist/commands/schema/list.js +10 -31
  80. package/dist/commands/schema/list.js.map +1 -1
  81. package/dist/config/createCliConfig.js +1 -2
  82. package/dist/config/createCliConfig.js.map +1 -1
  83. package/dist/exports/_internal.d.ts +132 -0
  84. package/dist/exports/_internal.js +4 -0
  85. package/dist/exports/_internal.js.map +1 -0
  86. package/dist/exports/index.d.ts +51 -0
  87. package/dist/exports/index.js +6 -0
  88. package/dist/exports/index.js.map +1 -0
  89. package/dist/hooks/init/checkForUpdates.js +14 -0
  90. package/dist/hooks/init/checkForUpdates.js.map +1 -0
  91. package/dist/hooks/prerun/setupTelemetry.js +7 -2
  92. package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
  93. package/dist/services/schemas.js.map +1 -1
  94. package/dist/types.js +3 -0
  95. package/dist/types.js.map +1 -1
  96. package/dist/util/cliClient.js +5 -3
  97. package/dist/util/cliClient.js.map +1 -1
  98. package/dist/util/compareDependencyVersions.js +9 -5
  99. package/dist/util/compareDependencyVersions.js.map +1 -1
  100. package/dist/util/getCliVersion.js +1 -1
  101. package/dist/util/getCliVersion.js.map +1 -1
  102. package/dist/util/getLocalPackageVersion.js +1 -1
  103. package/dist/util/getLocalPackageVersion.js.map +1 -1
  104. package/dist/util/promiseRaceWithTimeout.js +28 -0
  105. package/dist/util/promiseRaceWithTimeout.js.map +1 -0
  106. package/dist/util/readModuleVersion.js +11 -5
  107. package/dist/util/readModuleVersion.js.map +1 -1
  108. package/dist/util/update/fetchLatestVersion.js +21 -0
  109. package/dist/util/update/fetchLatestVersion.js.map +1 -0
  110. package/dist/util/update/getUpdateCommand.js +15 -0
  111. package/dist/util/update/getUpdateCommand.js.map +1 -0
  112. package/dist/util/update/isInstalledUsingYarn.js +17 -0
  113. package/dist/util/update/isInstalledUsingYarn.js.map +1 -0
  114. package/dist/util/update/showNotificationUpdate.js +31 -0
  115. package/dist/util/update/showNotificationUpdate.js.map +1 -0
  116. package/dist/util/update/updateChecker.js +59 -0
  117. package/dist/util/update/updateChecker.js.map +1 -0
  118. package/dist/util/update/updateCheckerDebug.js +4 -0
  119. package/dist/util/update/updateCheckerDebug.js.map +1 -0
  120. package/oclif.config.js +1 -0
  121. package/oclif.manifest.json +299 -303
  122. package/package.json +26 -22
  123. package/dist/index.d.ts +0 -2326
  124. package/dist/index.js +0 -6
  125. package/dist/index.js.map +0 -1
  126. package/dist/typings/deepSortObject.d.js +0 -2
  127. package/dist/typings/deepSortObject.d.js.map +0 -1
  128. package/dist/util/importStudioConfig.js +0 -40
  129. package/dist/util/importStudioConfig.js.map +0 -1
  130. package/dist/util/readPackageJson.js +0 -44
  131. package/dist/util/readPackageJson.js.map +0 -1
  132. package/dist/util/readPackageManifest.js +0 -46
  133. package/dist/util/readPackageManifest.js.map +0 -1
  134. package/dist/util/uniqBy.js +0 -14
  135. package/dist/util/uniqBy.js.map +0 -1
@@ -20,23 +20,29 @@ import { getAutoUpdatesImportMap } from './getAutoUpdatesImportMap.js';
20
20
  *
21
21
  * @internal
22
22
  */ export async function buildApp(options) {
23
- const { autoUpdatesEnabled, cliConfig, exit, flags, outDir, output, workDir } = options;
23
+ const { autoUpdatesEnabled, cliConfig, flags, outDir, output, workDir } = options;
24
24
  const unattendedMode = flags.yes;
25
25
  const timer = getTimer();
26
26
  const defaultOutputDir = path.resolve(path.join(workDir, 'dist'));
27
27
  const outputDir = path.resolve(outDir || defaultOutputDir);
28
28
  const appId = getAppId(cliConfig);
29
- const installedSdkVersion = await readModuleVersion(outputDir, '@sanity/sdk-react');
30
- const installedSanityVersion = await readModuleVersion(outputDir, 'sanity');
29
+ const installedSdkVersion = await readModuleVersion(workDir, '@sanity/sdk-react');
30
+ const installedSanityVersion = await readModuleVersion(workDir, 'sanity');
31
31
  if (!installedSdkVersion) {
32
- throw new Error(`Failed to find installed @sanity/sdk-react version`);
32
+ output.error(`Failed to find installed @sanity/sdk-react version`, {
33
+ exit: 1
34
+ });
35
+ return;
33
36
  }
34
37
  let autoUpdatesImports = {};
35
38
  if (autoUpdatesEnabled) {
36
39
  // Get the clean version without build metadata: https://semver.org/#spec-item-10
37
40
  const cleanSDKVersion = semver.parse(installedSdkVersion)?.version;
38
41
  if (!cleanSDKVersion) {
39
- throw new Error(`Failed to parse installed SDK version: ${installedSdkVersion}`);
42
+ output.error(`Failed to parse installed SDK version: ${installedSdkVersion}`, {
43
+ exit: 1
44
+ });
45
+ return;
40
46
  }
41
47
  // Sanity might not be installed, but if it is, we want to auto update it.
42
48
  const cleanSanityVersion = semver.parse(installedSanityVersion)?.version;
@@ -71,7 +77,10 @@ import { getAutoUpdatesImportMap } from './getAutoUpdatesImportMap.js';
71
77
  message: styleText('yellow', `The following local package versions are different from the versions currently served at runtime.\n` + `When using auto updates, we recommend that you test locally with the same versions before deploying. \n\n` + `${result.map((mod)=>` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\n')} \n\n` + `Continue anyway?`)
72
78
  });
73
79
  if (!shouldContinue) {
74
- return exit(1);
80
+ output.error('Declined to continue with build', {
81
+ exit: 1
82
+ });
83
+ return;
75
84
  }
76
85
  }
77
86
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/buildApp.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {getCliTelemetry, getTimer} from '@sanity/cli-core'\nimport {confirm, logSymbols, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport semver from 'semver'\n\nimport {AppBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {buildVendorDependencies} from './buildVendorDependencies.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAppEnvVars} from './getAppEnvVars.js'\nimport {getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {type BuildOptions} from './types.js'\n\n/**\n * Build the Sanity app.\n *\n * @internal\n */\nexport async function buildApp(options: BuildOptions): Promise<void> {\n const {autoUpdatesEnabled, cliConfig, exit, flags, outDir, output, workDir} = options\n const unattendedMode = flags.yes\n const timer = getTimer()\n\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n const appId = getAppId(cliConfig)\n\n const installedSdkVersion = await readModuleVersion(outputDir, '@sanity/sdk-react')\n const installedSanityVersion = await readModuleVersion(outputDir, 'sanity')\n\n if (!installedSdkVersion) {\n throw new Error(`Failed to find installed @sanity/sdk-react version`)\n }\n\n let autoUpdatesImports = {}\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSDKVersion = semver.parse(installedSdkVersion)?.version\n if (!cleanSDKVersion) {\n throw new Error(`Failed to parse installed SDK version: ${installedSdkVersion}`)\n }\n\n // Sanity might not be installed, but if it is, we want to auto update it.\n const cleanSanityVersion = semver.parse(installedSanityVersion)?.version\n\n const autoUpdatedPackages = [\n {name: '@sanity/sdk', version: cleanSDKVersion},\n {name: '@sanity/sdk-react', version: cleanSDKVersion},\n ...(cleanSanityVersion ? [{name: 'sanity' as const, version: cleanSanityVersion}] : []),\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(autoUpdatedPackages, {appId})\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n // Check the versions\n const result = await compareDependencyVersions(autoUpdatedPackages, workDir, {appId})\n\n // If it is in unattended mode, we don't want to prompt\n if (result?.length && !unattendedMode) {\n const shouldContinue = await confirm({\n default: false,\n message: styleText(\n 'yellow',\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you test locally with the same versions before deploying. \\n\\n` +\n `${result.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')} \\n\\n` +\n `Continue anyway?`,\n ),\n })\n\n if (!shouldContinue) {\n return exit(1)\n }\n }\n }\n\n const envVarKeys = getAppEnvVars()\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) output.log(`- ${key}`)\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n // Determine base path for built studio\n const basePath = determineBasePath(cliConfig, 'app')\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Building Sanity application`).start()\n\n const trace = getCliTelemetry().trace(AppBuildTrace)\n trace.start()\n\n let importMap: {imports?: Record<string, string>} | undefined\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n basePath,\n cwd: workDir,\n entry: cliConfig && 'app' in cliConfig ? cliConfig.app?.entry : undefined,\n importMap,\n isApp: true,\n minify: Boolean(flags.minify),\n outputDir,\n reactCompiler:\n cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n sourceMap: Boolean(flags['source-maps']),\n vite: cliConfig && 'vite' in cliConfig ? cliConfig.vite : undefined,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity application (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n if (flags.stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n\n trace.complete()\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity application`, {error})\n output.error(`Failed to build Sanity application: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","getCliTelemetry","getTimer","confirm","logSymbols","spinner","semver","AppBuildTrace","getAppId","compareDependencyVersions","formatModuleSizes","sortModulesBySize","readModuleVersion","buildDebug","buildStaticFiles","buildVendorDependencies","determineBasePath","getAppEnvVars","getAutoUpdatesImportMap","buildApp","options","autoUpdatesEnabled","cliConfig","exit","flags","outDir","output","workDir","unattendedMode","yes","timer","defaultOutputDir","resolve","join","outputDir","appId","installedSdkVersion","installedSanityVersion","Error","autoUpdatesImports","cleanSDKVersion","parse","version","cleanSanityVersion","autoUpdatedPackages","name","log","info","result","length","shouldContinue","default","message","map","mod","pkg","installed","remote","envVarKeys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","bundle","entry","app","undefined","isApp","minify","Boolean","reactCompiler","sourceMap","vite","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","stats","slice","complete","error","fail","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/build/buildApp.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {getCliTelemetry, getTimer} from '@sanity/cli-core'\nimport {confirm, logSymbols, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport semver from 'semver'\n\nimport {AppBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {buildVendorDependencies} from './buildVendorDependencies.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAppEnvVars} from './getAppEnvVars.js'\nimport {getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {type BuildOptions} from './types.js'\n\n/**\n * Build the Sanity app.\n *\n * @internal\n */\nexport async function buildApp(options: BuildOptions): Promise<void> {\n const {autoUpdatesEnabled, cliConfig, flags, outDir, output, workDir} = options\n const unattendedMode = flags.yes\n const timer = getTimer()\n\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n const appId = getAppId(cliConfig)\n\n const installedSdkVersion = await readModuleVersion(workDir, '@sanity/sdk-react')\n const installedSanityVersion = await readModuleVersion(workDir, 'sanity')\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n let autoUpdatesImports = {}\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSDKVersion = semver.parse(installedSdkVersion)?.version\n if (!cleanSDKVersion) {\n output.error(`Failed to parse installed SDK version: ${installedSdkVersion}`, {exit: 1})\n return\n }\n\n // Sanity might not be installed, but if it is, we want to auto update it.\n const cleanSanityVersion = semver.parse(installedSanityVersion)?.version\n\n const autoUpdatedPackages = [\n {name: '@sanity/sdk', version: cleanSDKVersion},\n {name: '@sanity/sdk-react', version: cleanSDKVersion},\n ...(cleanSanityVersion ? [{name: 'sanity' as const, version: cleanSanityVersion}] : []),\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(autoUpdatedPackages, {appId})\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n // Check the versions\n const result = await compareDependencyVersions(autoUpdatedPackages, workDir, {appId})\n\n // If it is in unattended mode, we don't want to prompt\n if (result?.length && !unattendedMode) {\n const shouldContinue = await confirm({\n default: false,\n message: styleText(\n 'yellow',\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you test locally with the same versions before deploying. \\n\\n` +\n `${result.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')} \\n\\n` +\n `Continue anyway?`,\n ),\n })\n\n if (!shouldContinue) {\n output.error('Declined to continue with build', {exit: 1})\n return\n }\n }\n }\n\n const envVarKeys = getAppEnvVars()\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) output.log(`- ${key}`)\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n // Determine base path for built studio\n const basePath = determineBasePath(cliConfig, 'app')\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Building Sanity application`).start()\n\n const trace = getCliTelemetry().trace(AppBuildTrace)\n trace.start()\n\n let importMap: {imports?: Record<string, string>} | undefined\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n basePath,\n cwd: workDir,\n entry: cliConfig && 'app' in cliConfig ? cliConfig.app?.entry : undefined,\n importMap,\n isApp: true,\n minify: Boolean(flags.minify),\n outputDir,\n reactCompiler:\n cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n sourceMap: Boolean(flags['source-maps']),\n vite: cliConfig && 'vite' in cliConfig ? cliConfig.vite : undefined,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity application (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n if (flags.stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n\n trace.complete()\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity application`, {error})\n output.error(`Failed to build Sanity application: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","getCliTelemetry","getTimer","confirm","logSymbols","spinner","semver","AppBuildTrace","getAppId","compareDependencyVersions","formatModuleSizes","sortModulesBySize","readModuleVersion","buildDebug","buildStaticFiles","buildVendorDependencies","determineBasePath","getAppEnvVars","getAutoUpdatesImportMap","buildApp","options","autoUpdatesEnabled","cliConfig","flags","outDir","output","workDir","unattendedMode","yes","timer","defaultOutputDir","resolve","join","outputDir","appId","installedSdkVersion","installedSanityVersion","error","exit","autoUpdatesImports","cleanSDKVersion","parse","version","cleanSanityVersion","autoUpdatedPackages","name","log","info","result","length","shouldContinue","default","message","map","mod","pkg","installed","remote","envVarKeys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","bundle","entry","app","undefined","isApp","minify","Boolean","reactCompiler","sourceMap","vite","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","stats","slice","complete","fail","Error","String"],"mappings":"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"}
@@ -26,7 +26,7 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
26
26
  * @internal
27
27
  */ export async function buildStudio(options) {
28
28
  const timer = getTimer();
29
- const { cliConfig, exit, flags, outDir, output, workDir } = options;
29
+ const { cliConfig, flags, outDir, output, workDir } = options;
30
30
  const unattendedMode = Boolean(flags.yes);
31
31
  const defaultOutputDir = path.resolve(path.join(workDir, 'dist'));
32
32
  const outputDir = path.resolve(outDir || defaultOutputDir);
@@ -97,7 +97,10 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
97
97
  message: styleText('yellow', `The following local package versions are different from the versions currently served at runtime.\n` + `When using auto updates, we recommend that you test locally with the same versions before deploying. \n\n` + `${result.map((mod)=>` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\n')} \n\n` + `Do you want to upgrade local versions before deploying?`)
98
98
  });
99
99
  if (choice === 'cancel') {
100
- return exit(1);
100
+ output.error('Declined to continue with build', {
101
+ exit: 1
102
+ });
103
+ return;
101
104
  }
102
105
  if (choice === 'upgrade' || choice === 'upgrade-and-proceed') {
103
106
  await upgradePackages({
@@ -113,7 +116,10 @@ import { shouldAutoUpdate } from './shouldAutoUpdate.js';
113
116
  workDir
114
117
  });
115
118
  if (choice !== 'upgrade-and-proceed') {
116
- return exit(1);
119
+ output.error('Declined to continue with build', {
120
+ exit: 1
121
+ });
122
+ return;
117
123
  }
118
124
  }
119
125
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/buildStudio.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {getCliTelemetry, getTimer} from '@sanity/cli-core'\nimport {confirm, logSymbols, select, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport semver from 'semver'\n\nimport {StudioBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {buildVendorDependencies} from './buildVendorDependencies.js'\nimport {checkRequiredDependencies} from './checkRequiredDependencies.js'\nimport {checkStudioDependencyVersions} from './checkStudioDependencyVersions.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {getStudioEnvVars} from './getStudioEnvVars.js'\nimport {shouldAutoUpdate} from './shouldAutoUpdate.js'\nimport {type BuildOptions} from './types.js'\n\n/**\n * Build the Sanity Studio.\n *\n * @internal\n */\nexport async function buildStudio(options: BuildOptions): Promise<void> {\n const timer = getTimer()\n const {cliConfig, exit, flags, outDir, output, workDir} = options\n\n const unattendedMode = Boolean(flags.yes)\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n await checkStudioDependencyVersions(workDir, output)\n\n // If the check resulted in a dependency install, the CLI command will be re-run,\n // thus we want to exit early\n const {installedSanityVersion} = await checkRequiredDependencies({\n cliConfig,\n output,\n workDir,\n })\n\n const autoUpdatesEnabled = shouldAutoUpdate({cliConfig, flags, output})\n\n let autoUpdatesImports = {}\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSanityVersion = semver.parse(installedSanityVersion)?.version\n if (!cleanSanityVersion) {\n throw new Error(`Failed to parse installed Sanity version: ${installedSanityVersion}`)\n }\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n const projectId = cliConfig?.api?.projectId\n const appId = getAppId(cliConfig)\n\n // Warn if auto updates enabled but no appId configured\n if (!appId) {\n warnAboutMissingAppId({appType: 'studio', output, projectId})\n }\n\n const sanityDependencies = [\n {name: 'sanity', version: cleanSanityVersion},\n {name: '@sanity/vision', version: cleanSanityVersion},\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(sanityDependencies, {appId})\n\n // Check the versions\n const result = await compareDependencyVersions(sanityDependencies, workDir)\n\n // If it is in unattended mode, we don't want to prompt\n if (result?.length && !unattendedMode) {\n const choice = await select({\n choices: [\n {\n name: `Upgrade and proceed with build`,\n value: 'upgrade-and-proceed',\n },\n {\n name: `Upgrade only. You will need to run the build command again`,\n value: 'upgrade',\n },\n {name: 'Cancel', value: 'cancel'},\n ],\n default: 'upgrade-and-proceed',\n message: styleText(\n 'yellow',\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you test locally with the same versions before deploying. \\n\\n` +\n `${result.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')} \\n\\n` +\n `Do you want to upgrade local versions before deploying?`,\n ),\n })\n\n if (choice === 'cancel') {\n return exit(1)\n }\n\n if (choice === 'upgrade' || choice === 'upgrade-and-proceed') {\n await upgradePackages(\n {\n packageManager: (await getPackageManagerChoice(workDir, {interactive: false})).chosen,\n packages: result.map((res) => [res.pkg, res.remote]),\n },\n {output, workDir},\n )\n\n if (choice !== 'upgrade-and-proceed') {\n return exit(1)\n }\n }\n }\n }\n\n const envVarKeys = getStudioEnvVars()\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) {\n output.log(`- ${key}`)\n }\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n // Determine base path for built studio\n const basePath = determineBasePath(cliConfig, 'studio')\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Build Sanity Studio`).start()\n\n const trace = getCliTelemetry().trace(StudioBuildTrace)\n trace.start()\n\n let importMap\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n basePath,\n cwd: workDir,\n importMap,\n minify: Boolean(flags.minify),\n outputDir,\n reactCompiler:\n cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n sourceMap: Boolean(flags['source-maps']),\n vite: cliConfig && 'vite' in cliConfig ? cliConfig.vite : undefined,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity Studio (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n trace.complete()\n if (flags.stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity Studio`, {error})\n output.error(`Failed to build Sanity Studio: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","getCliTelemetry","getTimer","confirm","logSymbols","select","spinner","semver","StudioBuildTrace","getAppId","compareDependencyVersions","formatModuleSizes","sortModulesBySize","getPackageManagerChoice","upgradePackages","warnAboutMissingAppId","buildDebug","buildStaticFiles","buildVendorDependencies","checkRequiredDependencies","checkStudioDependencyVersions","determineBasePath","getAutoUpdatesImportMap","getStudioEnvVars","shouldAutoUpdate","buildStudio","options","timer","cliConfig","exit","flags","outDir","output","workDir","unattendedMode","Boolean","yes","defaultOutputDir","resolve","join","outputDir","installedSanityVersion","autoUpdatesEnabled","autoUpdatesImports","cleanSanityVersion","parse","version","Error","log","info","projectId","api","appId","appType","sanityDependencies","name","result","length","choice","choices","value","default","message","map","mod","pkg","installed","remote","packageManager","interactive","chosen","packages","res","envVarKeys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","bundle","minify","reactCompiler","undefined","sourceMap","vite","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","complete","stats","slice","error","fail","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/build/buildStudio.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {getCliTelemetry, getTimer} from '@sanity/cli-core'\nimport {confirm, logSymbols, select, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\nimport semver from 'semver'\n\nimport {StudioBuildTrace} from '../../telemetry/build.telemetry.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {formatModuleSizes, sortModulesBySize} from '../../util/moduleFormatUtils.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildDebug} from './buildDebug.js'\nimport {buildStaticFiles} from './buildStaticFiles.js'\nimport {buildVendorDependencies} from './buildVendorDependencies.js'\nimport {checkRequiredDependencies} from './checkRequiredDependencies.js'\nimport {checkStudioDependencyVersions} from './checkStudioDependencyVersions.js'\nimport {determineBasePath} from './determineBasePath.js'\nimport {getAutoUpdatesImportMap} from './getAutoUpdatesImportMap.js'\nimport {getStudioEnvVars} from './getStudioEnvVars.js'\nimport {shouldAutoUpdate} from './shouldAutoUpdate.js'\nimport {type BuildOptions} from './types.js'\n\n/**\n * Build the Sanity Studio.\n *\n * @internal\n */\nexport async function buildStudio(options: BuildOptions): Promise<void> {\n const timer = getTimer()\n const {cliConfig, flags, outDir, output, workDir} = options\n\n const unattendedMode = Boolean(flags.yes)\n const defaultOutputDir = path.resolve(path.join(workDir, 'dist'))\n const outputDir = path.resolve(outDir || defaultOutputDir)\n\n await checkStudioDependencyVersions(workDir, output)\n\n // If the check resulted in a dependency install, the CLI command will be re-run,\n // thus we want to exit early\n const {installedSanityVersion} = await checkRequiredDependencies({\n cliConfig,\n output,\n workDir,\n })\n\n const autoUpdatesEnabled = shouldAutoUpdate({cliConfig, flags, output})\n\n let autoUpdatesImports = {}\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSanityVersion = semver.parse(installedSanityVersion)?.version\n if (!cleanSanityVersion) {\n throw new Error(`Failed to parse installed Sanity version: ${installedSanityVersion}`)\n }\n\n output.log(`${logSymbols.info} Building with auto-updates enabled`)\n\n const projectId = cliConfig?.api?.projectId\n const appId = getAppId(cliConfig)\n\n // Warn if auto updates enabled but no appId configured\n if (!appId) {\n warnAboutMissingAppId({appType: 'studio', output, projectId})\n }\n\n const sanityDependencies = [\n {name: 'sanity', version: cleanSanityVersion},\n {name: '@sanity/vision', version: cleanSanityVersion},\n ]\n autoUpdatesImports = getAutoUpdatesImportMap(sanityDependencies, {appId})\n\n // Check the versions\n const result = await compareDependencyVersions(sanityDependencies, workDir)\n\n // If it is in unattended mode, we don't want to prompt\n if (result?.length && !unattendedMode) {\n const choice = await select({\n choices: [\n {\n name: `Upgrade and proceed with build`,\n value: 'upgrade-and-proceed',\n },\n {\n name: `Upgrade only. You will need to run the build command again`,\n value: 'upgrade',\n },\n {name: 'Cancel', value: 'cancel'},\n ],\n default: 'upgrade-and-proceed',\n message: styleText(\n 'yellow',\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you test locally with the same versions before deploying. \\n\\n` +\n `${result.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')} \\n\\n` +\n `Do you want to upgrade local versions before deploying?`,\n ),\n })\n\n if (choice === 'cancel') {\n output.error('Declined to continue with build', {exit: 1})\n return\n }\n\n if (choice === 'upgrade' || choice === 'upgrade-and-proceed') {\n await upgradePackages(\n {\n packageManager: (await getPackageManagerChoice(workDir, {interactive: false})).chosen,\n packages: result.map((res) => [res.pkg, res.remote]),\n },\n {output, workDir},\n )\n\n if (choice !== 'upgrade-and-proceed') {\n output.error('Declined to continue with build', {exit: 1})\n return\n }\n }\n }\n }\n\n const envVarKeys = getStudioEnvVars()\n if (envVarKeys.length > 0) {\n output.log('\\nIncluding the following environment variables as part of the JavaScript bundle:')\n for (const key of envVarKeys) {\n output.log(`- ${key}`)\n }\n output.log('')\n }\n\n let shouldClean = true\n if (outputDir !== defaultOutputDir && !unattendedMode) {\n shouldClean = await confirm({\n default: true,\n message: `Do you want to delete the existing directory (${outputDir}) first?`,\n })\n }\n\n // Determine base path for built studio\n const basePath = determineBasePath(cliConfig, 'studio')\n\n let spin: SpinnerInstance\n if (shouldClean) {\n timer.start('cleanOutputFolder')\n spin = spinner('Clean output folder').start()\n await rm(outputDir, {force: true, recursive: true})\n const cleanDuration = timer.end('cleanOutputFolder')\n spin.text = `Clean output folder (${cleanDuration.toFixed(0)}ms)`\n spin.succeed()\n }\n\n spin = spinner(`Build Sanity Studio`).start()\n\n const trace = getCliTelemetry().trace(StudioBuildTrace)\n trace.start()\n\n let importMap\n\n if (autoUpdatesEnabled) {\n importMap = {\n imports: {\n ...(await buildVendorDependencies({basePath, cwd: workDir, outputDir})),\n ...autoUpdatesImports,\n },\n }\n }\n\n try {\n timer.start('bundleStudio')\n\n const bundle = await buildStaticFiles({\n basePath,\n cwd: workDir,\n importMap,\n minify: Boolean(flags.minify),\n outputDir,\n reactCompiler:\n cliConfig && 'reactCompiler' in cliConfig ? cliConfig.reactCompiler : undefined,\n sourceMap: Boolean(flags['source-maps']),\n vite: cliConfig && 'vite' in cliConfig ? cliConfig.vite : undefined,\n })\n\n trace.log({\n outputSize: bundle.chunks\n .flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength))\n .reduce((sum, n) => sum + n, 0),\n })\n const buildDuration = timer.end('bundleStudio')\n\n spin.text = `Build Sanity Studio (${buildDuration.toFixed(0)}ms)`\n spin.succeed()\n\n trace.complete()\n if (flags.stats) {\n output.log('\\nLargest module files:')\n output.log(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))\n }\n } catch (error) {\n spin.fail()\n trace.error(error)\n const message = error instanceof Error ? error.message : String(error)\n buildDebug(`Failed to build Sanity Studio`, {error})\n output.error(`Failed to build Sanity Studio: ${message}`, {exit: 1})\n }\n}\n"],"names":["rm","path","styleText","getCliTelemetry","getTimer","confirm","logSymbols","select","spinner","semver","StudioBuildTrace","getAppId","compareDependencyVersions","formatModuleSizes","sortModulesBySize","getPackageManagerChoice","upgradePackages","warnAboutMissingAppId","buildDebug","buildStaticFiles","buildVendorDependencies","checkRequiredDependencies","checkStudioDependencyVersions","determineBasePath","getAutoUpdatesImportMap","getStudioEnvVars","shouldAutoUpdate","buildStudio","options","timer","cliConfig","flags","outDir","output","workDir","unattendedMode","Boolean","yes","defaultOutputDir","resolve","join","outputDir","installedSanityVersion","autoUpdatesEnabled","autoUpdatesImports","cleanSanityVersion","parse","version","Error","log","info","projectId","api","appId","appType","sanityDependencies","name","result","length","choice","choices","value","default","message","map","mod","pkg","installed","remote","error","exit","packageManager","interactive","chosen","packages","res","envVarKeys","key","shouldClean","basePath","spin","start","force","recursive","cleanDuration","end","text","toFixed","succeed","trace","importMap","imports","cwd","bundle","minify","reactCompiler","undefined","sourceMap","vite","outputSize","chunks","flatMap","chunk","modules","renderedLength","reduce","sum","n","buildDuration","complete","stats","slice","fail","String"],"mappings":"AAAA,SAAQA,EAAE,QAAO,mBAAkB;AACnC,OAAOC,UAAU,YAAW;AAC5B,SAAQC,SAAS,QAAO,YAAW;AAEnC,SAAQC,eAAe,EAAEC,QAAQ,QAAO,mBAAkB;AAC1D,SAAQC,OAAO,EAAEC,UAAU,EAAEC,MAAM,EAAEC,OAAO,QAA6B,sBAAqB;AAC9F,OAAOC,YAAY,SAAQ;AAE3B,SAAQC,gBAAgB,QAAO,qCAAoC;AACnE,SAAQC,QAAQ,QAAO,sBAAqB;AAC5C,SAAQC,yBAAyB,QAAO,0CAAyC;AACjF,SAAQC,iBAAiB,EAAEC,iBAAiB,QAAO,kCAAiC;AACpF,SAAQC,uBAAuB,QAAO,oDAAmD;AACzF,SAAQC,eAAe,QAAO,+CAA8C;AAC5E,SAAQC,qBAAqB,QAAO,sCAAqC;AACzE,SAAQC,UAAU,QAAO,kBAAiB;AAC1C,SAAQC,gBAAgB,QAAO,wBAAuB;AACtD,SAAQC,uBAAuB,QAAO,+BAA8B;AACpE,SAAQC,yBAAyB,QAAO,iCAAgC;AACxE,SAAQC,6BAA6B,QAAO,qCAAoC;AAChF,SAAQC,iBAAiB,QAAO,yBAAwB;AACxD,SAAQC,uBAAuB,QAAO,+BAA8B;AACpE,SAAQC,gBAAgB,QAAO,wBAAuB;AACtD,SAAQC,gBAAgB,QAAO,wBAAuB;AAGtD;;;;CAIC,GACD,OAAO,eAAeC,YAAYC,OAAqB;IACrD,MAAMC,QAAQzB;IACd,MAAM,EAAC0B,SAAS,EAAEC,KAAK,EAAEC,MAAM,EAAEC,MAAM,EAAEC,OAAO,EAAC,GAAGN;IAEpD,MAAMO,iBAAiBC,QAAQL,MAAMM,GAAG;IACxC,MAAMC,mBAAmBrC,KAAKsC,OAAO,CAACtC,KAAKuC,IAAI,CAACN,SAAS;IACzD,MAAMO,YAAYxC,KAAKsC,OAAO,CAACP,UAAUM;IAEzC,MAAMhB,8BAA8BY,SAASD;IAE7C,iFAAiF;IACjF,6BAA6B;IAC7B,MAAM,EAACS,sBAAsB,EAAC,GAAG,MAAMrB,0BAA0B;QAC/DS;QACAG;QACAC;IACF;IAEA,MAAMS,qBAAqBjB,iBAAiB;QAACI;QAAWC;QAAOE;IAAM;IAErE,IAAIW,qBAAqB,CAAC;IAE1B,IAAID,oBAAoB;QACtB,iFAAiF;QACjF,MAAME,qBAAqBpC,OAAOqC,KAAK,CAACJ,yBAAyBK;QACjE,IAAI,CAACF,oBAAoB;YACvB,MAAM,IAAIG,MAAM,CAAC,0CAA0C,EAAEN,wBAAwB;QACvF;QAEAT,OAAOgB,GAAG,CAAC,GAAG3C,WAAW4C,IAAI,CAAC,mCAAmC,CAAC;QAElE,MAAMC,YAAYrB,WAAWsB,KAAKD;QAClC,MAAME,QAAQ1C,SAASmB;QAEvB,uDAAuD;QACvD,IAAI,CAACuB,OAAO;YACVpC,sBAAsB;gBAACqC,SAAS;gBAAUrB;gBAAQkB;YAAS;QAC7D;QAEA,MAAMI,qBAAqB;YACzB;gBAACC,MAAM;gBAAUT,SAASF;YAAkB;YAC5C;gBAACW,MAAM;gBAAkBT,SAASF;YAAkB;SACrD;QACDD,qBAAqBpB,wBAAwB+B,oBAAoB;YAACF;QAAK;QAEvE,qBAAqB;QACrB,MAAMI,SAAS,MAAM7C,0BAA0B2C,oBAAoBrB;QAEnE,uDAAuD;QACvD,IAAIuB,QAAQC,UAAU,CAACvB,gBAAgB;YACrC,MAAMwB,SAAS,MAAMpD,OAAO;gBAC1BqD,SAAS;oBACP;wBACEJ,MAAM,CAAC,8BAA8B,CAAC;wBACtCK,OAAO;oBACT;oBACA;wBACEL,MAAM,CAAC,0DAA0D,CAAC;wBAClEK,OAAO;oBACT;oBACA;wBAACL,MAAM;wBAAUK,OAAO;oBAAQ;iBACjC;gBACDC,SAAS;gBACTC,SAAS7D,UACP,UACA,CAAC,mGAAmG,CAAC,GACnG,CAAC,yGAAyG,CAAC,GAC3G,GAAGuD,OAAOO,GAAG,CAAC,CAACC,MAAQ,CAAC,GAAG,EAAEA,IAAIC,GAAG,CAAC,iBAAiB,EAAED,IAAIE,SAAS,CAAC,mBAAmB,EAAEF,IAAIG,MAAM,CAAC,CAAC,CAAC,EAAE5B,IAAI,CAAC,MAAM,KAAK,CAAC,GAC3H,CAAC,uDAAuD,CAAC;YAE/D;YAEA,IAAImB,WAAW,UAAU;gBACvB1B,OAAOoC,KAAK,CAAC,mCAAmC;oBAACC,MAAM;gBAAC;gBACxD;YACF;YAEA,IAAIX,WAAW,aAAaA,WAAW,uBAAuB;gBAC5D,MAAM3C,gBACJ;oBACEuD,gBAAgB,AAAC,CAAA,MAAMxD,wBAAwBmB,SAAS;wBAACsC,aAAa;oBAAK,EAAC,EAAGC,MAAM;oBACrFC,UAAUjB,OAAOO,GAAG,CAAC,CAACW,MAAQ;4BAACA,IAAIT,GAAG;4BAAES,IAAIP,MAAM;yBAAC;gBACrD,GACA;oBAACnC;oBAAQC;gBAAO;gBAGlB,IAAIyB,WAAW,uBAAuB;oBACpC1B,OAAOoC,KAAK,CAAC,mCAAmC;wBAACC,MAAM;oBAAC;oBACxD;gBACF;YACF;QACF;IACF;IAEA,MAAMM,aAAanD;IACnB,IAAImD,WAAWlB,MAAM,GAAG,GAAG;QACzBzB,OAAOgB,GAAG,CAAC;QACX,KAAK,MAAM4B,OAAOD,WAAY;YAC5B3C,OAAOgB,GAAG,CAAC,CAAC,EAAE,EAAE4B,KAAK;QACvB;QACA5C,OAAOgB,GAAG,CAAC;IACb;IAEA,IAAI6B,cAAc;IAClB,IAAIrC,cAAcH,oBAAoB,CAACH,gBAAgB;QACrD2C,cAAc,MAAMzE,QAAQ;YAC1ByD,SAAS;YACTC,SAAS,CAAC,8CAA8C,EAAEtB,UAAU,QAAQ,CAAC;QAC/E;IACF;IAEA,uCAAuC;IACvC,MAAMsC,WAAWxD,kBAAkBO,WAAW;IAE9C,IAAIkD;IACJ,IAAIF,aAAa;QACfjD,MAAMoD,KAAK,CAAC;QACZD,OAAOxE,QAAQ,uBAAuByE,KAAK;QAC3C,MAAMjF,GAAGyC,WAAW;YAACyC,OAAO;YAAMC,WAAW;QAAI;QACjD,MAAMC,gBAAgBvD,MAAMwD,GAAG,CAAC;QAChCL,KAAKM,IAAI,GAAG,CAAC,qBAAqB,EAAEF,cAAcG,OAAO,CAAC,GAAG,GAAG,CAAC;QACjEP,KAAKQ,OAAO;IACd;IAEAR,OAAOxE,QAAQ,CAAC,mBAAmB,CAAC,EAAEyE,KAAK;IAE3C,MAAMQ,QAAQtF,kBAAkBsF,KAAK,CAAC/E;IACtC+E,MAAMR,KAAK;IAEX,IAAIS;IAEJ,IAAI/C,oBAAoB;QACtB+C,YAAY;YACVC,SAAS;gBACP,GAAI,MAAMvE,wBAAwB;oBAAC2D;oBAAUa,KAAK1D;oBAASO;gBAAS,EAAE;gBACtE,GAAGG,kBAAkB;YACvB;QACF;IACF;IAEA,IAAI;QACFf,MAAMoD,KAAK,CAAC;QAEZ,MAAMY,SAAS,MAAM1E,iBAAiB;YACpC4D;YACAa,KAAK1D;YACLwD;YACAI,QAAQ1D,QAAQL,MAAM+D,MAAM;YAC5BrD;YACAsD,eACEjE,aAAa,mBAAmBA,YAAYA,UAAUiE,aAAa,GAAGC;YACxEC,WAAW7D,QAAQL,KAAK,CAAC,cAAc;YACvCmE,MAAMpE,aAAa,UAAUA,YAAYA,UAAUoE,IAAI,GAAGF;QAC5D;QAEAP,MAAMxC,GAAG,CAAC;YACRkD,YAAYN,OAAOO,MAAM,CACtBC,OAAO,CAAC,CAACC,QAAUA,MAAMC,OAAO,CAACF,OAAO,CAAC,CAACpC,MAAQA,IAAIuC,cAAc,GACpEC,MAAM,CAAC,CAACC,KAAKC,IAAMD,MAAMC,GAAG;QACjC;QACA,MAAMC,gBAAgB/E,MAAMwD,GAAG,CAAC;QAEhCL,KAAKM,IAAI,GAAG,CAAC,qBAAqB,EAAEsB,cAAcrB,OAAO,CAAC,GAAG,GAAG,CAAC;QACjEP,KAAKQ,OAAO;QAEZC,MAAMoB,QAAQ;QACd,IAAI9E,MAAM+E,KAAK,EAAE;YACf7E,OAAOgB,GAAG,CAAC;YACXhB,OAAOgB,GAAG,CAACpC,kBAAkBC,kBAAkB+E,OAAOO,MAAM,EAAEW,KAAK,CAAC,GAAG;QACzE;IACF,EAAE,OAAO1C,OAAO;QACdW,KAAKgC,IAAI;QACTvB,MAAMpB,KAAK,CAACA;QACZ,MAAMN,UAAUM,iBAAiBrB,QAAQqB,MAAMN,OAAO,GAAGkD,OAAO5C;QAChEnD,WAAW,CAAC,6BAA6B,CAAC,EAAE;YAACmD;QAAK;QAClDpC,OAAOoC,KAAK,CAAC,CAAC,+BAA+B,EAAEN,SAAS,EAAE;YAACO,MAAM;QAAC;IACpE;AACF"}
@@ -1,9 +1,9 @@
1
1
  import path from 'node:path';
2
+ import { readPackageJson } from '@sanity/cli-core';
2
3
  import { oneline } from 'oneline';
3
4
  import semver from 'semver';
4
5
  import { determineIsApp } from '../../util/determineIsApp.js';
5
6
  import { readModuleVersion } from '../../util/readModuleVersion.js';
6
- import { readPackageManifest } from '../../util/readPackageManifest.js';
7
7
  const defaultStudioManifestProps = {
8
8
  name: 'studio',
9
9
  version: '1.0.0'
@@ -30,7 +30,10 @@ const styledComponentsVersionRange = '^6.1.15';
30
30
  };
31
31
  }
32
32
  const [studioPackageManifest, installedStyledComponentsVersion, installedSanityVersion] = await Promise.all([
33
- readPackageManifest(path.join(studioPath, 'package.json'), defaultStudioManifestProps),
33
+ readPackageJson(path.join(studioPath, 'package.json'), {
34
+ defaults: defaultStudioManifestProps,
35
+ skipSchemaValidation: true
36
+ }),
34
37
  readModuleVersion(studioPath, 'styled-components'),
35
38
  readModuleVersion(studioPath, 'sanity')
36
39
  ]);
@@ -47,7 +50,7 @@ const styledComponentsVersionRange = '^6.1.15';
47
50
  // The studio _must_ now declare `styled-components` as a dependency. If it's not there,
48
51
  // we'll want to automatically _add it_ to the manifest and tell the user to reinstall
49
52
  // dependencies before running whatever command was being run
50
- const declaredStyledComponentsVersion = studioPackageManifest.dependencies['styled-components'] || studioPackageManifest.devDependencies['styled-components'];
53
+ const declaredStyledComponentsVersion = studioPackageManifest.dependencies?.['styled-components'] || studioPackageManifest?.devDependencies?.['styled-components'];
51
54
  if (!declaredStyledComponentsVersion) {
52
55
  output.error(oneline`
53
56
  Declared dependency \`styled-components\` is not installed - run
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/checkRequiredDependencies.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type CliConfig, type Output} from '@sanity/cli-core'\nimport {oneline} from 'oneline'\nimport semver, {type SemVer} from 'semver'\n\nimport {determineIsApp} from '../../util/determineIsApp.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {type PartialPackageManifest, readPackageManifest} from '../../util/readPackageManifest.js'\n\nconst defaultStudioManifestProps: PartialPackageManifest = {\n name: 'studio',\n version: '1.0.0',\n}\n\ninterface CheckResult {\n installedSanityVersion: string\n}\n\ninterface CheckRequiredDependenciesOptions {\n cliConfig: CliConfig\n output: Output\n workDir: string\n}\n\nconst styledComponentsVersionRange = '^6.1.15'\n\n/**\n * Checks that the studio has declared and installed the required dependencies\n * needed by the Sanity modules. While we generally use regular, explicit\n * dependencies in modules, there are certain dependencies that are better\n * served being peer dependencies, such as react and styled-components.\n *\n * If these dependencies are not installed/declared, we report an error\n * and instruct the user to install them manually.\n *\n * Additionally, returns the version of the 'sanity' dependency from the package.json.\n */\nexport async function checkRequiredDependencies(\n options: CheckRequiredDependenciesOptions,\n): Promise<CheckResult> {\n const {cliConfig, output, workDir: studioPath} = options\n // currently there's no check needed for core apps,\n // but this should be removed once they are more mature\n const isApp = determineIsApp(cliConfig)\n if (isApp) {\n return {installedSanityVersion: ''}\n }\n\n const [studioPackageManifest, installedStyledComponentsVersion, installedSanityVersion] =\n await Promise.all([\n readPackageManifest(path.join(studioPath, 'package.json'), defaultStudioManifestProps),\n readModuleVersion(studioPath, 'styled-components'),\n readModuleVersion(studioPath, 'sanity'),\n ])\n\n const wantedStyledComponentsVersionRange = styledComponentsVersionRange\n\n // Retrieve the version of the 'sanity' dependency\n if (!installedSanityVersion) {\n output.error('Failed to read the installed sanity version.', {exit: 1})\n return {installedSanityVersion: ''}\n }\n\n // The studio _must_ now declare `styled-components` as a dependency. If it's not there,\n // we'll want to automatically _add it_ to the manifest and tell the user to reinstall\n // dependencies before running whatever command was being run\n const declaredStyledComponentsVersion =\n studioPackageManifest.dependencies['styled-components'] ||\n studioPackageManifest.devDependencies['styled-components']\n\n if (!declaredStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` is not installed - run\n \\`npm install\\`, \\`yarn install\\` or \\`pnpm install\\` to install it before re-running this command.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // Theoretically the version specified in package.json could be incorrect, eg `foo`\n let minDeclaredStyledComponentsVersion: SemVer | null = null\n try {\n minDeclaredStyledComponentsVersion = semver.minVersion(declaredStyledComponentsVersion)\n } catch {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` has an invalid version range:\n \\`${declaredStyledComponentsVersion}\\`.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // The declared version should be semver-compatible with the version specified as a\n // peer dependency in `sanity`. If not, we should tell the user to change it.\n //\n // Exception: Ranges are hard to compare. `>=5.0.0 && <=5.3.2 || ^6`... Comparing this\n // to anything is going to be challenging, so only compare \"simple\" ranges/versions\n // (^x.x.x / ~x.x.x / x.x.x)\n if (\n isComparableRange(declaredStyledComponentsVersion) &&\n !semver.satisfies(minDeclaredStyledComponentsVersion, wantedStyledComponentsVersionRange)\n ) {\n output.warn(oneline`\n Declared version of styled-components (${declaredStyledComponentsVersion})\n is not compatible with the version required by sanity (${wantedStyledComponentsVersionRange}).\n This might cause problems!\n `)\n }\n\n // Ensure the studio has _installed_ a version of `styled-components`\n if (!installedStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` is not installed - run\n \\`npm install\\`, \\`yarn install\\` or \\`pnpm install\\` to install it before re-running this command.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // The studio should have an _installed_ version of `styled-components`, and it should\n // be semver compatible with the version specified in `sanity` peer dependencies.\n if (!semver.satisfies(installedStyledComponentsVersion, wantedStyledComponentsVersionRange)) {\n output.warn(oneline`\n Installed version of styled-components (${installedStyledComponentsVersion})\n is not compatible with the version required by sanity (${wantedStyledComponentsVersionRange}).\n This might cause problems!\n `)\n }\n\n return {installedSanityVersion}\n}\n\nfunction isComparableRange(range: string): boolean {\n return /^[\\^~]?\\d+(\\.\\d+)?(\\.\\d+)?$/.test(range)\n}\n"],"names":["path","oneline","semver","determineIsApp","readModuleVersion","readPackageManifest","defaultStudioManifestProps","name","version","styledComponentsVersionRange","checkRequiredDependencies","options","cliConfig","output","workDir","studioPath","isApp","installedSanityVersion","studioPackageManifest","installedStyledComponentsVersion","Promise","all","join","wantedStyledComponentsVersionRange","error","exit","declaredStyledComponentsVersion","dependencies","devDependencies","minDeclaredStyledComponentsVersion","minVersion","isComparableRange","satisfies","warn","range","test"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAG5B,SAAQC,OAAO,QAAO,UAAS;AAC/B,OAAOC,YAA2B,SAAQ;AAE1C,SAAQC,cAAc,QAAO,+BAA8B;AAC3D,SAAQC,iBAAiB,QAAO,kCAAiC;AACjE,SAAqCC,mBAAmB,QAAO,oCAAmC;AAElG,MAAMC,6BAAqD;IACzDC,MAAM;IACNC,SAAS;AACX;AAYA,MAAMC,+BAA+B;AAErC;;;;;;;;;;CAUC,GACD,OAAO,eAAeC,0BACpBC,OAAyC;IAEzC,MAAM,EAACC,SAAS,EAAEC,MAAM,EAAEC,SAASC,UAAU,EAAC,GAAGJ;IACjD,mDAAmD;IACnD,uDAAuD;IACvD,MAAMK,QAAQb,eAAeS;IAC7B,IAAII,OAAO;QACT,OAAO;YAACC,wBAAwB;QAAE;IACpC;IAEA,MAAM,CAACC,uBAAuBC,kCAAkCF,uBAAuB,GACrF,MAAMG,QAAQC,GAAG,CAAC;QAChBhB,oBAAoBL,KAAKsB,IAAI,CAACP,YAAY,iBAAiBT;QAC3DF,kBAAkBW,YAAY;QAC9BX,kBAAkBW,YAAY;KAC/B;IAEH,MAAMQ,qCAAqCd;IAE3C,kDAAkD;IAClD,IAAI,CAACQ,wBAAwB;QAC3BJ,OAAOW,KAAK,CAAC,gDAAgD;YAACC,MAAM;QAAC;QACrE,OAAO;YAACR,wBAAwB;QAAE;IACpC;IAEA,wFAAwF;IACxF,sFAAsF;IACtF,6DAA6D;IAC7D,MAAMS,kCACJR,sBAAsBS,YAAY,CAAC,oBAAoB,IACvDT,sBAAsBU,eAAe,CAAC,oBAAoB;IAE5D,IAAI,CAACF,iCAAiC;QACpCb,OAAOW,KAAK,CACVvB,OAAO,CAAC;;;IAGV,CAAC,EACC;YAACwB,MAAM;QAAC;QAEV,OAAO;YAACR;QAAsB;IAChC;IAEA,mFAAmF;IACnF,IAAIY,qCAAoD;IACxD,IAAI;QACFA,qCAAqC3B,OAAO4B,UAAU,CAACJ;IACzD,EAAE,OAAM;IACN,2EAA2E;IAC7E;IAEA,IAAI,CAACG,oCAAoC;QACvChB,OAAOW,KAAK,CACVvB,OAAO,CAAC;;QAEN,EAAEyB,gCAAgC;IACtC,CAAC,EACC;YAACD,MAAM;QAAC;QAEV,OAAO;YAACR;QAAsB;IAChC;IAEA,mFAAmF;IACnF,6EAA6E;IAC7E,EAAE;IACF,sFAAsF;IACtF,mFAAmF;IACnF,4BAA4B;IAC5B,IACEc,kBAAkBL,oCAClB,CAACxB,OAAO8B,SAAS,CAACH,oCAAoCN,qCACtD;QACAV,OAAOoB,IAAI,CAAChC,OAAO,CAAC;6CACqB,EAAEyB,gCAAgC;6DAClB,EAAEH,mCAAmC;;IAE9F,CAAC;IACH;IAEA,qEAAqE;IACrE,IAAI,CAACJ,kCAAkC;QACrCN,OAAOW,KAAK,CACVvB,OAAO,CAAC;;;IAGV,CAAC,EACC;YAACwB,MAAM;QAAC;QAEV,OAAO;YAACR;QAAsB;IAChC;IAEA,sFAAsF;IACtF,iFAAiF;IACjF,IAAI,CAACf,OAAO8B,SAAS,CAACb,kCAAkCI,qCAAqC;QAC3FV,OAAOoB,IAAI,CAAChC,OAAO,CAAC;8CACsB,EAAEkB,iCAAiC;6DACpB,EAAEI,mCAAmC;;IAE9F,CAAC;IACH;IAEA,OAAO;QAACN;IAAsB;AAChC;AAEA,SAASc,kBAAkBG,KAAa;IACtC,OAAO,8BAA8BC,IAAI,CAACD;AAC5C"}
1
+ {"version":3,"sources":["../../../src/actions/build/checkRequiredDependencies.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type CliConfig, type Output, type PackageJson, readPackageJson} from '@sanity/cli-core'\nimport {oneline} from 'oneline'\nimport semver, {type SemVer} from 'semver'\n\nimport {determineIsApp} from '../../util/determineIsApp.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\n\nconst defaultStudioManifestProps: Partial<PackageJson> = {\n name: 'studio',\n version: '1.0.0',\n}\n\ninterface CheckResult {\n installedSanityVersion: string\n}\n\ninterface CheckRequiredDependenciesOptions {\n cliConfig: CliConfig\n output: Output\n workDir: string\n}\n\nconst styledComponentsVersionRange = '^6.1.15'\n\n/**\n * Checks that the studio has declared and installed the required dependencies\n * needed by the Sanity modules. While we generally use regular, explicit\n * dependencies in modules, there are certain dependencies that are better\n * served being peer dependencies, such as react and styled-components.\n *\n * If these dependencies are not installed/declared, we report an error\n * and instruct the user to install them manually.\n *\n * Additionally, returns the version of the 'sanity' dependency from the package.json.\n */\nexport async function checkRequiredDependencies(\n options: CheckRequiredDependenciesOptions,\n): Promise<CheckResult> {\n const {cliConfig, output, workDir: studioPath} = options\n // currently there's no check needed for core apps,\n // but this should be removed once they are more mature\n const isApp = determineIsApp(cliConfig)\n if (isApp) {\n return {installedSanityVersion: ''}\n }\n\n const [studioPackageManifest, installedStyledComponentsVersion, installedSanityVersion] =\n await Promise.all([\n readPackageJson(path.join(studioPath, 'package.json'), {\n defaults: defaultStudioManifestProps,\n skipSchemaValidation: true,\n }),\n readModuleVersion(studioPath, 'styled-components'),\n readModuleVersion(studioPath, 'sanity'),\n ])\n\n const wantedStyledComponentsVersionRange = styledComponentsVersionRange\n\n // Retrieve the version of the 'sanity' dependency\n if (!installedSanityVersion) {\n output.error('Failed to read the installed sanity version.', {exit: 1})\n return {installedSanityVersion: ''}\n }\n\n // The studio _must_ now declare `styled-components` as a dependency. If it's not there,\n // we'll want to automatically _add it_ to the manifest and tell the user to reinstall\n // dependencies before running whatever command was being run\n const declaredStyledComponentsVersion =\n studioPackageManifest.dependencies?.['styled-components'] ||\n studioPackageManifest?.devDependencies?.['styled-components']\n\n if (!declaredStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` is not installed - run\n \\`npm install\\`, \\`yarn install\\` or \\`pnpm install\\` to install it before re-running this command.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // Theoretically the version specified in package.json could be incorrect, eg `foo`\n let minDeclaredStyledComponentsVersion: SemVer | null = null\n try {\n minDeclaredStyledComponentsVersion = semver.minVersion(declaredStyledComponentsVersion)\n } catch {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` has an invalid version range:\n \\`${declaredStyledComponentsVersion}\\`.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // The declared version should be semver-compatible with the version specified as a\n // peer dependency in `sanity`. If not, we should tell the user to change it.\n //\n // Exception: Ranges are hard to compare. `>=5.0.0 && <=5.3.2 || ^6`... Comparing this\n // to anything is going to be challenging, so only compare \"simple\" ranges/versions\n // (^x.x.x / ~x.x.x / x.x.x)\n if (\n isComparableRange(declaredStyledComponentsVersion) &&\n !semver.satisfies(minDeclaredStyledComponentsVersion, wantedStyledComponentsVersionRange)\n ) {\n output.warn(oneline`\n Declared version of styled-components (${declaredStyledComponentsVersion})\n is not compatible with the version required by sanity (${wantedStyledComponentsVersionRange}).\n This might cause problems!\n `)\n }\n\n // Ensure the studio has _installed_ a version of `styled-components`\n if (!installedStyledComponentsVersion) {\n output.error(\n oneline`\n Declared dependency \\`styled-components\\` is not installed - run\n \\`npm install\\`, \\`yarn install\\` or \\`pnpm install\\` to install it before re-running this command.\n `,\n {exit: 1},\n )\n return {installedSanityVersion}\n }\n\n // The studio should have an _installed_ version of `styled-components`, and it should\n // be semver compatible with the version specified in `sanity` peer dependencies.\n if (!semver.satisfies(installedStyledComponentsVersion, wantedStyledComponentsVersionRange)) {\n output.warn(oneline`\n Installed version of styled-components (${installedStyledComponentsVersion})\n is not compatible with the version required by sanity (${wantedStyledComponentsVersionRange}).\n This might cause problems!\n `)\n }\n\n return {installedSanityVersion}\n}\n\nfunction isComparableRange(range: string): boolean {\n return /^[\\^~]?\\d+(\\.\\d+)?(\\.\\d+)?$/.test(range)\n}\n"],"names":["path","readPackageJson","oneline","semver","determineIsApp","readModuleVersion","defaultStudioManifestProps","name","version","styledComponentsVersionRange","checkRequiredDependencies","options","cliConfig","output","workDir","studioPath","isApp","installedSanityVersion","studioPackageManifest","installedStyledComponentsVersion","Promise","all","join","defaults","skipSchemaValidation","wantedStyledComponentsVersionRange","error","exit","declaredStyledComponentsVersion","dependencies","devDependencies","minDeclaredStyledComponentsVersion","minVersion","isComparableRange","satisfies","warn","range","test"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SAAuDC,eAAe,QAAO,mBAAkB;AAC/F,SAAQC,OAAO,QAAO,UAAS;AAC/B,OAAOC,YAA2B,SAAQ;AAE1C,SAAQC,cAAc,QAAO,+BAA8B;AAC3D,SAAQC,iBAAiB,QAAO,kCAAiC;AAEjE,MAAMC,6BAAmD;IACvDC,MAAM;IACNC,SAAS;AACX;AAYA,MAAMC,+BAA+B;AAErC;;;;;;;;;;CAUC,GACD,OAAO,eAAeC,0BACpBC,OAAyC;IAEzC,MAAM,EAACC,SAAS,EAAEC,MAAM,EAAEC,SAASC,UAAU,EAAC,GAAGJ;IACjD,mDAAmD;IACnD,uDAAuD;IACvD,MAAMK,QAAQZ,eAAeQ;IAC7B,IAAII,OAAO;QACT,OAAO;YAACC,wBAAwB;QAAE;IACpC;IAEA,MAAM,CAACC,uBAAuBC,kCAAkCF,uBAAuB,GACrF,MAAMG,QAAQC,GAAG,CAAC;QAChBpB,gBAAgBD,KAAKsB,IAAI,CAACP,YAAY,iBAAiB;YACrDQ,UAAUjB;YACVkB,sBAAsB;QACxB;QACAnB,kBAAkBU,YAAY;QAC9BV,kBAAkBU,YAAY;KAC/B;IAEH,MAAMU,qCAAqChB;IAE3C,kDAAkD;IAClD,IAAI,CAACQ,wBAAwB;QAC3BJ,OAAOa,KAAK,CAAC,gDAAgD;YAACC,MAAM;QAAC;QACrE,OAAO;YAACV,wBAAwB;QAAE;IACpC;IAEA,wFAAwF;IACxF,sFAAsF;IACtF,6DAA6D;IAC7D,MAAMW,kCACJV,sBAAsBW,YAAY,EAAE,CAAC,oBAAoB,IACzDX,uBAAuBY,iBAAiB,CAAC,oBAAoB;IAE/D,IAAI,CAACF,iCAAiC;QACpCf,OAAOa,KAAK,CACVxB,OAAO,CAAC;;;IAGV,CAAC,EACC;YAACyB,MAAM;QAAC;QAEV,OAAO;YAACV;QAAsB;IAChC;IAEA,mFAAmF;IACnF,IAAIc,qCAAoD;IACxD,IAAI;QACFA,qCAAqC5B,OAAO6B,UAAU,CAACJ;IACzD,EAAE,OAAM;IACN,2EAA2E;IAC7E;IAEA,IAAI,CAACG,oCAAoC;QACvClB,OAAOa,KAAK,CACVxB,OAAO,CAAC;;QAEN,EAAE0B,gCAAgC;IACtC,CAAC,EACC;YAACD,MAAM;QAAC;QAEV,OAAO;YAACV;QAAsB;IAChC;IAEA,mFAAmF;IACnF,6EAA6E;IAC7E,EAAE;IACF,sFAAsF;IACtF,mFAAmF;IACnF,4BAA4B;IAC5B,IACEgB,kBAAkBL,oCAClB,CAACzB,OAAO+B,SAAS,CAACH,oCAAoCN,qCACtD;QACAZ,OAAOsB,IAAI,CAACjC,OAAO,CAAC;6CACqB,EAAE0B,gCAAgC;6DAClB,EAAEH,mCAAmC;;IAE9F,CAAC;IACH;IAEA,qEAAqE;IACrE,IAAI,CAACN,kCAAkC;QACrCN,OAAOa,KAAK,CACVxB,OAAO,CAAC;;;IAGV,CAAC,EACC;YAACyB,MAAM;QAAC;QAEV,OAAO;YAACV;QAAsB;IAChC;IAEA,sFAAsF;IACtF,iFAAiF;IACjF,IAAI,CAACd,OAAO+B,SAAS,CAACf,kCAAkCM,qCAAqC;QAC3FZ,OAAOsB,IAAI,CAACjC,OAAO,CAAC;8CACsB,EAAEiB,iCAAiC;6DACpB,EAAEM,mCAAmC;;IAE9F,CAAC;IACH;IAEA,OAAO;QAACR;IAAsB;AAChC;AAEA,SAASgB,kBAAkBG,KAAa;IACtC,OAAO,8BAA8BC,IAAI,CAACD;AAC5C"}
@@ -1,7 +1,7 @@
1
1
  import path from 'node:path';
2
+ import { readPackageJson } from '@sanity/cli-core';
2
3
  import resolveFrom from 'resolve-from';
3
4
  import semver from 'semver';
4
- import { readPackageJson } from '../../util/readPackageJson.js';
5
5
  // NOTE: when doing changes here, also remember to update versions in help docs at
6
6
  // https://sanity.io/admin/structure/docs;helpArticle;upgrade-packages
7
7
  const PACKAGES = [
@@ -36,10 +36,12 @@ const PACKAGES = [
36
36
  }
37
37
  ];
38
38
  export async function checkStudioDependencyVersions(workDir, output) {
39
- const manifest = await readPackageJson(path.join(workDir, 'package.json'), true);
39
+ const manifest = await readPackageJson(path.join(workDir, 'package.json'), {
40
+ skipSchemaValidation: true
41
+ });
40
42
  const dependencies = {
41
- ...manifest.dependencies,
42
- ...manifest.devDependencies
43
+ ...manifest?.dependencies,
44
+ ...manifest?.devDependencies
43
45
  };
44
46
  const packageInfo = PACKAGES.map(async (pkg)=>{
45
47
  const dependency = dependencies[pkg.name];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/build/checkStudioDependencyVersions.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {type Output} from '@sanity/cli-core'\nimport resolveFrom from 'resolve-from'\nimport semver, {type SemVer} from 'semver'\n\nimport {readPackageJson} from '../../util/readPackageJson.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\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 PACKAGES = [\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): Promise<void> {\n const manifest = await readPackageJson(path.join(workDir, 'package.json'), true)\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 manifestPath = resolveFrom.silent(workDir, path.join(pkg.name, 'package.json'))\n const installed = semver.coerce(\n manifestPath\n ? (await readPackageJson(manifestPath)).version\n : dependency.replaceAll(/[\\D.]/g, ''),\n )\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","resolveFrom","semver","readPackageJson","PACKAGES","deprecatedBelow","name","supported","checkStudioDependencyVersions","workDir","output","manifest","join","dependencies","devDependencies","packageInfo","map","pkg","dependency","manifestPath","silent","installed","coerce","version","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","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 resolveFrom from 'resolve-from'\nimport semver, {type SemVer} from 'semver'\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\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 PACKAGES = [\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): 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 manifestPath = resolveFrom.silent(workDir, path.join(pkg.name, 'package.json'))\n const installed = semver.coerce(\n manifestPath\n ? (await readPackageJson(manifestPath)).version\n : dependency.replaceAll(/[\\D.]/g, ''),\n )\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","resolveFrom","semver","PACKAGES","deprecatedBelow","name","supported","checkStudioDependencyVersions","workDir","output","manifest","join","skipSchemaValidation","dependencies","devDependencies","packageInfo","map","pkg","dependency","manifestPath","silent","installed","coerce","version","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","toSorted","rcompare"],"mappings":"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"}
@@ -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 exit: (code?: number) => void\n flags: BuildFlags | DeployFlags\n output: Output\n\n workDir: string\n\n outDir?: string\n}\n"],"names":[],"mappings":"AAOA,WAUC"}
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"}
@@ -21,7 +21,7 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
21
21
  *
22
22
  * @internal
23
23
  */ export async function deployApp(options) {
24
- const { cliConfig, exit, flags, output, sourceDir, workDir } = options;
24
+ const { cliConfig, flags, output, sourceDir, workDir } = options;
25
25
  const organizationId = cliConfig.app?.organizationId;
26
26
  const appId = getAppId(cliConfig);
27
27
  const isAutoUpdating = shouldAutoUpdate({
@@ -69,7 +69,6 @@ import { findUserApplicationForApp } from './findUserApplicationForApp.js';
69
69
  await buildApp({
70
70
  autoUpdatesEnabled: isAutoUpdating,
71
71
  cliConfig,
72
- exit,
73
72
  flags,
74
73
  outDir: sourceDir,
75
74
  output,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/deployApp.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_ORGANIZATION_ID} from '../../util/errorMessages.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildApp} from '../build/buildApp.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {extractAppManifest} from '../manifest/extractAppManifest.js'\nimport {type AppManifest} from '../manifest/types.js'\nimport {checkDir} from './checkDir.js'\nimport {createUserApplicationForApp} from './createUserApplicationForApp.js'\nimport {deployDebug} from './deployDebug.js'\nimport {findUserApplicationForApp} from './findUserApplicationForApp.js'\nimport {type DeployAppOptions} from './types.js'\n\n/**\n * Deploy a Sanity application.\n *\n * @internal\n */\nexport async function deployApp(options: DeployAppOptions) {\n const {cliConfig, exit, flags, output, sourceDir, workDir} = options\n\n const organizationId = cliConfig.app?.organizationId\n const appId = getAppId(cliConfig)\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n const installedSdkVersion = await readModuleVersion(sourceDir, '@sanity/sdk-react')\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n if (!organizationId) {\n output.error(NO_ORGANIZATION_ID, {exit: 1})\n return\n }\n\n let spin = spinner('Verifying local content...')\n\n try {\n let userApplication = await findUserApplicationForApp({\n cliConfig,\n organizationId,\n output,\n })\n\n deployDebug(`User application found`, userApplication)\n\n if (!userApplication) {\n deployDebug(`No user application found. Creating a new one`)\n\n userApplication = await createUserApplicationForApp(organizationId)\n deployDebug(`User application created`, userApplication)\n }\n\n // Warn about missing app ID if auto updates are enabled\n if (isAutoUpdating && !appId) {\n warnAboutMissingAppId({appType: 'app', output})\n }\n\n // Always build the project, unless --no-build is passed\n const shouldBuild = flags.build\n if (shouldBuild) {\n deployDebug(`Building app`)\n await buildApp({\n autoUpdatesEnabled: isAutoUpdating,\n cliConfig,\n exit,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await checkDir(sourceDir)\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error('Error checking directory', {exit: 1})\n return\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n const tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n let manifest: AppManifest | undefined\n try {\n manifest = await extractAppManifest({flags, workDir})\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n deployDebug('Error extracting app manifest', err)\n output.warn(`Error extracting app manifest: ${message}`)\n }\n\n spin = spinner('Deploying...').start()\n await createDeployment({\n applicationId: userApplication.id,\n isApp: true,\n isAutoUpdating,\n manifest,\n tarball,\n version: installedSdkVersion,\n })\n\n spin.succeed()\n\n // And let the user know we're done\n output.log(`\\n🚀 ${styleText('bold', 'Success!')} Application deployed`)\n\n if (!appId) {\n output.log(`\\n════ ${styleText('bold', 'Next step:')} ════`)\n output.log(\n styleText(\n 'bold',\n '\\nAdd the deployment.appId to your sanity.cli.js or sanity.cli.ts file:',\n ),\n )\n output.log(`\n${styleText(\n 'dim',\n `app: {\n // your application config here…\n}`,\n)},\n${styleText(\n ['bold', 'green'],\n `deployment: {\n appId: '${userApplication.id}',\n}\\n`,\n)}`)\n }\n } catch (error) {\n spin.clear()\n // Don't throw generic error if user cancels\n if (error.name === 'ExitPromptError') {\n output.error('Deployment cancelled by user', {exit: 1})\n return\n }\n // If the error is a CLIError, we can just output the message & error options (if any), while ensuring we exit\n if (error instanceof CLIError) {\n const {message, ...errorOptions} = error\n output.error(message, {...errorOptions, exit: 1})\n return\n }\n\n deployDebug('Error deploying application', error)\n output.error(`Error deploying application: ${error}`, {exit: 1})\n }\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","spinner","pack","createDeployment","getAppId","NO_ORGANIZATION_ID","readModuleVersion","warnAboutMissingAppId","buildApp","shouldAutoUpdate","extractAppManifest","checkDir","createUserApplicationForApp","deployDebug","findUserApplicationForApp","deployApp","options","cliConfig","exit","flags","output","sourceDir","workDir","organizationId","app","appId","isAutoUpdating","installedSdkVersion","error","spin","userApplication","appType","shouldBuild","build","autoUpdatesEnabled","outDir","start","succeed","err","fail","parentDir","base","tarball","entries","pipe","manifest","message","Error","String","warn","applicationId","id","isApp","version","log","clear","name","errorOptions"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/deployApp.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_ORGANIZATION_ID} from '../../util/errorMessages.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {buildApp} from '../build/buildApp.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {extractAppManifest} from '../manifest/extractAppManifest.js'\nimport {type AppManifest} from '../manifest/types.js'\nimport {checkDir} from './checkDir.js'\nimport {createUserApplicationForApp} from './createUserApplicationForApp.js'\nimport {deployDebug} from './deployDebug.js'\nimport {findUserApplicationForApp} from './findUserApplicationForApp.js'\nimport {type DeployAppOptions} from './types.js'\n\n/**\n * Deploy a Sanity application.\n *\n * @internal\n */\nexport async function deployApp(options: DeployAppOptions) {\n const {cliConfig, flags, output, sourceDir, workDir} = options\n\n const organizationId = cliConfig.app?.organizationId\n const appId = getAppId(cliConfig)\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n const installedSdkVersion = await readModuleVersion(sourceDir, '@sanity/sdk-react')\n\n if (!installedSdkVersion) {\n output.error(`Failed to find installed @sanity/sdk-react version`, {exit: 1})\n return\n }\n\n if (!organizationId) {\n output.error(NO_ORGANIZATION_ID, {exit: 1})\n return\n }\n\n let spin = spinner('Verifying local content...')\n\n try {\n let userApplication = await findUserApplicationForApp({\n cliConfig,\n organizationId,\n output,\n })\n\n deployDebug(`User application found`, userApplication)\n\n if (!userApplication) {\n deployDebug(`No user application found. Creating a new one`)\n\n userApplication = await createUserApplicationForApp(organizationId)\n deployDebug(`User application created`, userApplication)\n }\n\n // Warn about missing app ID if auto updates are enabled\n if (isAutoUpdating && !appId) {\n warnAboutMissingAppId({appType: 'app', output})\n }\n\n // Always build the project, unless --no-build is passed\n const shouldBuild = flags.build\n if (shouldBuild) {\n deployDebug(`Building app`)\n await buildApp({\n autoUpdatesEnabled: isAutoUpdating,\n cliConfig,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await checkDir(sourceDir)\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error('Error checking directory', {exit: 1})\n return\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n const tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n let manifest: AppManifest | undefined\n try {\n manifest = await extractAppManifest({flags, workDir})\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n deployDebug('Error extracting app manifest', err)\n output.warn(`Error extracting app manifest: ${message}`)\n }\n\n spin = spinner('Deploying...').start()\n await createDeployment({\n applicationId: userApplication.id,\n isApp: true,\n isAutoUpdating,\n manifest,\n tarball,\n version: installedSdkVersion,\n })\n\n spin.succeed()\n\n // And let the user know we're done\n output.log(`\\n🚀 ${styleText('bold', 'Success!')} Application deployed`)\n\n if (!appId) {\n output.log(`\\n════ ${styleText('bold', 'Next step:')} ════`)\n output.log(\n styleText(\n 'bold',\n '\\nAdd the deployment.appId to your sanity.cli.js or sanity.cli.ts file:',\n ),\n )\n output.log(`\n${styleText(\n 'dim',\n `app: {\n // your application config here…\n}`,\n)},\n${styleText(\n ['bold', 'green'],\n `deployment: {\n appId: '${userApplication.id}',\n}\\n`,\n)}`)\n }\n } catch (error) {\n spin.clear()\n // Don't throw generic error if user cancels\n if (error.name === 'ExitPromptError') {\n output.error('Deployment cancelled by user', {exit: 1})\n return\n }\n // If the error is a CLIError, we can just output the message & error options (if any), while ensuring we exit\n if (error instanceof CLIError) {\n const {message, ...errorOptions} = error\n output.error(message, {...errorOptions, exit: 1})\n return\n }\n\n deployDebug('Error deploying application', error)\n output.error(`Error deploying application: ${error}`, {exit: 1})\n }\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","spinner","pack","createDeployment","getAppId","NO_ORGANIZATION_ID","readModuleVersion","warnAboutMissingAppId","buildApp","shouldAutoUpdate","extractAppManifest","checkDir","createUserApplicationForApp","deployDebug","findUserApplicationForApp","deployApp","options","cliConfig","flags","output","sourceDir","workDir","organizationId","app","appId","isAutoUpdating","installedSdkVersion","error","exit","spin","userApplication","appType","shouldBuild","build","autoUpdatesEnabled","outDir","start","succeed","err","fail","parentDir","base","tarball","entries","pipe","manifest","message","Error","String","warn","applicationId","id","isApp","version","log","clear","name","errorOptions"],"mappings":"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"}
@@ -15,7 +15,7 @@ import { createStudioUserApplication } from './createStudioUserApplication.js';
15
15
  import { deployDebug } from './deployDebug.js';
16
16
  import { findUserApplicationForStudio } from './findUserApplicationForStudio.js';
17
17
  export async function deployStudio(options) {
18
- const { cliConfig, exit, flags, output, sourceDir, workDir } = options;
18
+ const { cliConfig, flags, output, sourceDir, workDir } = options;
19
19
  const appHost = cliConfig.studioHost;
20
20
  const appId = getAppId(cliConfig);
21
21
  const projectId = cliConfig.api?.projectId;
@@ -61,7 +61,6 @@ export async function deployStudio(options) {
61
61
  await buildStudio({
62
62
  autoUpdatesEnabled: isAutoUpdating,
63
63
  cliConfig,
64
- exit,
65
64
  flags,
66
65
  outDir: sourceDir,
67
66
  output,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/deployStudio.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {buildStudio} from '../build/buildStudio.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {checkDir} from './checkDir.js'\nimport {createStudioUserApplication} from './createStudioUserApplication.js'\nimport {deployDebug} from './deployDebug.js'\nimport {findUserApplicationForStudio} from './findUserApplicationForStudio.js'\nimport {type DeployAppOptions} from './types.js'\n\nexport async function deployStudio(options: DeployAppOptions) {\n const {cliConfig, exit, flags, output, sourceDir, workDir} = options\n\n const appHost = cliConfig.studioHost\n const appId = getAppId(cliConfig)\n const projectId = cliConfig.api?.projectId\n const installedSanityVersion = await readModuleVersion(sourceDir, 'sanity')\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n\n if (!installedSanityVersion) {\n output.error(`Failed to find installed sanity version`, {exit: 1})\n return\n }\n\n if (!projectId) {\n output.error(NO_PROJECT_ID, {exit: 1})\n return\n }\n\n let spin = spinner('Verifying local content')\n\n try {\n let userApplication = await findUserApplicationForStudio({\n appHost,\n appId,\n output,\n projectId,\n })\n\n if (!userApplication) {\n // otherwise, prompt the user for a hostname\n output.log('Your project has not been assigned a studio hostname.')\n output.log('To deploy your Sanity Studio to our hosted sanity.studio service,')\n output.log('you will need one. Please enter the part you want to use.')\n\n userApplication = await createStudioUserApplication(projectId)\n\n deployDebug('Created user application', userApplication)\n }\n\n deployDebug('Found user application', userApplication)\n\n // Always build the project, unless --no-build is passed\n const shouldBuild = flags.build\n if (shouldBuild) {\n deployDebug(`Building studio`)\n await buildStudio({\n autoUpdatesEnabled: isAutoUpdating,\n cliConfig,\n exit,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n // TODO: Implement schema deployment\n // await deploySchemasAction(\n // {\n // 'extract-manifest': shouldBuild,\n // 'manifest-dir': `${sourceDir}/static`,\n // 'schema-required': flags['schema-required'],\n // 'verbose': flags.verbose,\n // },\n // {...context, manifestExtractor: createManifestExtractor(context)},\n // )\n\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await checkDir(sourceDir)\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error('Error checking directory', {exit: 1})\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n const tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n\n spin = spinner('Deploying to sanity.studio').start()\n\n const {location} = await createDeployment({\n applicationId: userApplication.id,\n isApp: false,\n isAutoUpdating,\n projectId,\n tarball,\n version: installedSanityVersion,\n })\n\n spin.succeed()\n\n // And let the user know we're done\n output.log(`\\nSuccess! Studio deployed to ${styleText('cyan', location || 'unknown URL')}`)\n\n if (!appId) {\n output.log(`\\nAdd ${styleText('cyan', `deployment: { appId: '${userApplication.id}' }`)}`)\n output.log(`to sanity.cli.js or sanity.cli.ts`)\n output.log(`to avoid prompting on next deploy.`)\n }\n } catch (error) {\n // if the error is a CLIError, we can just output the message and exit\n if (error instanceof CLIError) {\n output.error(error.message, {exit: 1})\n return\n }\n\n spin.fail()\n deployDebug('Error deploying studio', error)\n output.error(`Error deploying studio: ${error}`, {exit: 1})\n }\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","spinner","pack","createDeployment","getAppId","NO_PROJECT_ID","readModuleVersion","buildStudio","shouldAutoUpdate","checkDir","createStudioUserApplication","deployDebug","findUserApplicationForStudio","deployStudio","options","cliConfig","exit","flags","output","sourceDir","workDir","appHost","studioHost","appId","projectId","api","installedSanityVersion","isAutoUpdating","error","spin","userApplication","log","shouldBuild","build","autoUpdatesEnabled","outDir","start","succeed","err","fail","parentDir","base","tarball","entries","pipe","location","applicationId","id","isApp","version","message"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/deployStudio.ts"],"sourcesContent":["import {basename, dirname} from 'node:path'\nimport {styleText} from 'node:util'\nimport {createGzip} from 'node:zlib'\n\nimport {CLIError} from '@oclif/core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {pack} from 'tar-fs'\n\nimport {createDeployment} from '../../services/userApplications.js'\nimport {getAppId} from '../../util/appId.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {buildStudio} from '../build/buildStudio.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {checkDir} from './checkDir.js'\nimport {createStudioUserApplication} from './createStudioUserApplication.js'\nimport {deployDebug} from './deployDebug.js'\nimport {findUserApplicationForStudio} from './findUserApplicationForStudio.js'\nimport {type DeployAppOptions} from './types.js'\n\nexport async function deployStudio(options: DeployAppOptions) {\n const {cliConfig, flags, output, sourceDir, workDir} = options\n\n const appHost = cliConfig.studioHost\n const appId = getAppId(cliConfig)\n const projectId = cliConfig.api?.projectId\n const installedSanityVersion = await readModuleVersion(sourceDir, 'sanity')\n const isAutoUpdating = shouldAutoUpdate({cliConfig, flags, output})\n\n if (!installedSanityVersion) {\n output.error(`Failed to find installed sanity version`, {exit: 1})\n return\n }\n\n if (!projectId) {\n output.error(NO_PROJECT_ID, {exit: 1})\n return\n }\n\n let spin = spinner('Verifying local content')\n\n try {\n let userApplication = await findUserApplicationForStudio({\n appHost,\n appId,\n output,\n projectId,\n })\n\n if (!userApplication) {\n // otherwise, prompt the user for a hostname\n output.log('Your project has not been assigned a studio hostname.')\n output.log('To deploy your Sanity Studio to our hosted sanity.studio service,')\n output.log('you will need one. Please enter the part you want to use.')\n\n userApplication = await createStudioUserApplication(projectId)\n\n deployDebug('Created user application', userApplication)\n }\n\n deployDebug('Found user application', userApplication)\n\n // Always build the project, unless --no-build is passed\n const shouldBuild = flags.build\n if (shouldBuild) {\n deployDebug(`Building studio`)\n await buildStudio({\n autoUpdatesEnabled: isAutoUpdating,\n cliConfig,\n flags,\n outDir: sourceDir,\n output,\n workDir,\n })\n }\n\n // TODO: Implement schema deployment\n // await deploySchemasAction(\n // {\n // 'extract-manifest': shouldBuild,\n // 'manifest-dir': `${sourceDir}/static`,\n // 'schema-required': flags['schema-required'],\n // 'verbose': flags.verbose,\n // },\n // {...context, manifestExtractor: createManifestExtractor(context)},\n // )\n\n // Ensure that the directory exists, is a directory and seems to have valid content\n spin = spin.start()\n try {\n await checkDir(sourceDir)\n spin.succeed()\n } catch (err) {\n spin.fail()\n deployDebug('Error checking directory', err)\n output.error('Error checking directory', {exit: 1})\n }\n\n // Create a tarball of the given directory\n const parentDir = dirname(sourceDir)\n const base = basename(sourceDir)\n const tarball = pack(parentDir, {entries: [base]}).pipe(createGzip())\n\n spin = spinner('Deploying to sanity.studio').start()\n\n const {location} = await createDeployment({\n applicationId: userApplication.id,\n isApp: false,\n isAutoUpdating,\n projectId,\n tarball,\n version: installedSanityVersion,\n })\n\n spin.succeed()\n\n // And let the user know we're done\n output.log(`\\nSuccess! Studio deployed to ${styleText('cyan', location || 'unknown URL')}`)\n\n if (!appId) {\n output.log(`\\nAdd ${styleText('cyan', `deployment: { appId: '${userApplication.id}' }`)}`)\n output.log(`to sanity.cli.js or sanity.cli.ts`)\n output.log(`to avoid prompting on next deploy.`)\n }\n } catch (error) {\n // if the error is a CLIError, we can just output the message and exit\n if (error instanceof CLIError) {\n output.error(error.message, {exit: 1})\n return\n }\n\n spin.fail()\n deployDebug('Error deploying studio', error)\n output.error(`Error deploying studio: ${error}`, {exit: 1})\n }\n}\n"],"names":["basename","dirname","styleText","createGzip","CLIError","spinner","pack","createDeployment","getAppId","NO_PROJECT_ID","readModuleVersion","buildStudio","shouldAutoUpdate","checkDir","createStudioUserApplication","deployDebug","findUserApplicationForStudio","deployStudio","options","cliConfig","flags","output","sourceDir","workDir","appHost","studioHost","appId","projectId","api","installedSanityVersion","isAutoUpdating","error","exit","spin","userApplication","log","shouldBuild","build","autoUpdatesEnabled","outDir","start","succeed","err","fail","parentDir","base","tarball","entries","pipe","location","applicationId","id","isApp","version","message"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/deploy/types.ts"],"sourcesContent":["import {type CliConfig, type Output} from '@sanity/cli-core'\n\nimport {DeployCommand} from '../../commands/deploy.js'\n\nexport type DeployFlags = DeployCommand['flags']\n\nexport interface DeployAppOptions {\n cliConfig: CliConfig\n exit: (code?: number) => void\n flags: DeployFlags\n output: Output\n sourceDir: string\n workDir: string\n}\n"],"names":[],"mappings":"AAMA,WAOC"}
1
+ {"version":3,"sources":["../../../src/actions/deploy/types.ts"],"sourcesContent":["import {type CliConfig, type Output} from '@sanity/cli-core'\n\nimport {DeployCommand} from '../../commands/deploy.js'\n\nexport type DeployFlags = DeployCommand['flags']\n\nexport interface DeployAppOptions {\n cliConfig: CliConfig\n flags: DeployFlags\n output: Output\n sourceDir: string\n workDir: string\n}\n"],"names":[],"mappings":"AAMA,WAMC"}
@@ -1,5 +1,5 @@
1
+ import { readPackageJson } from '@sanity/cli-core';
1
2
  import semver from 'semver';
2
- import { readPackageJson } from '../../util/readPackageJson.js';
3
3
  export async function checkNextJsReactCompatibility({ detectedFramework, output, outputPath }) {
4
4
  const packageJson = await readPackageJson(`${outputPath}/package.json`);
5
5
  const reactVersion = packageJson?.dependencies?.react;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/checkNextJsReactCompatibility.ts"],"sourcesContent":["import {Output} from '@sanity/cli-core'\nimport semver from 'semver'\n\nimport {readPackageJson} from '../../util/readPackageJson.js'\nimport {VersionedFramework} from './types.js'\n\ninterface CheckCompatibilityOptions {\n detectedFramework: VersionedFramework\n output: Output\n outputPath: string\n}\n\nexport async function checkNextJsReactCompatibility({\n detectedFramework,\n output,\n outputPath,\n}: CheckCompatibilityOptions) {\n const packageJson = await readPackageJson(`${outputPath}/package.json`)\n const reactVersion = packageJson?.dependencies?.react\n\n if (reactVersion) {\n const isUsingReact19 = semver.coerce(reactVersion)?.major === 19\n const isUsingNextJs15 = semver.coerce(detectedFramework?.detectedVersion)?.major === 15\n\n if (isUsingNextJs15 && isUsingReact19) {\n output.warn('╭────────────────────────────────────────────────────────────╮')\n output.warn('│ │')\n output.warn('│ It looks like you are using Next.js 15 and React 19 │')\n output.warn('│ Please read our compatibility guide. │')\n output.warn('│ https://www.sanity.io/help/react-19 │')\n output.warn('│ │')\n output.warn('╰────────────────────────────────────────────────────────────╯')\n }\n }\n}\n"],"names":["semver","readPackageJson","checkNextJsReactCompatibility","detectedFramework","output","outputPath","packageJson","reactVersion","dependencies","react","isUsingReact19","coerce","major","isUsingNextJs15","detectedVersion","warn"],"mappings":"AACA,OAAOA,YAAY,SAAQ;AAE3B,SAAQC,eAAe,QAAO,gCAA+B;AAS7D,OAAO,eAAeC,8BAA8B,EAClDC,iBAAiB,EACjBC,MAAM,EACNC,UAAU,EACgB;IAC1B,MAAMC,cAAc,MAAML,gBAAgB,GAAGI,WAAW,aAAa,CAAC;IACtE,MAAME,eAAeD,aAAaE,cAAcC;IAEhD,IAAIF,cAAc;QAChB,MAAMG,iBAAiBV,OAAOW,MAAM,CAACJ,eAAeK,UAAU;QAC9D,MAAMC,kBAAkBb,OAAOW,MAAM,CAACR,mBAAmBW,kBAAkBF,UAAU;QAErF,IAAIC,mBAAmBH,gBAAgB;YACrCN,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;QACd;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/init/checkNextJsReactCompatibility.ts"],"sourcesContent":["import {Output, readPackageJson} from '@sanity/cli-core'\nimport semver from 'semver'\n\nimport {VersionedFramework} from './types.js'\n\ninterface CheckCompatibilityOptions {\n detectedFramework: VersionedFramework\n output: Output\n outputPath: string\n}\n\nexport async function checkNextJsReactCompatibility({\n detectedFramework,\n output,\n outputPath,\n}: CheckCompatibilityOptions) {\n const packageJson = await readPackageJson(`${outputPath}/package.json`)\n const reactVersion = packageJson?.dependencies?.react\n\n if (reactVersion) {\n const isUsingReact19 = semver.coerce(reactVersion)?.major === 19\n const isUsingNextJs15 = semver.coerce(detectedFramework?.detectedVersion)?.major === 15\n\n if (isUsingNextJs15 && isUsingReact19) {\n output.warn('╭────────────────────────────────────────────────────────────╮')\n output.warn('│ │')\n output.warn('│ It looks like you are using Next.js 15 and React 19 │')\n output.warn('│ Please read our compatibility guide. │')\n output.warn('│ https://www.sanity.io/help/react-19 │')\n output.warn('│ │')\n output.warn('╰────────────────────────────────────────────────────────────╯')\n }\n }\n}\n"],"names":["readPackageJson","semver","checkNextJsReactCompatibility","detectedFramework","output","outputPath","packageJson","reactVersion","dependencies","react","isUsingReact19","coerce","major","isUsingNextJs15","detectedVersion","warn"],"mappings":"AAAA,SAAgBA,eAAe,QAAO,mBAAkB;AACxD,OAAOC,YAAY,SAAQ;AAU3B,OAAO,eAAeC,8BAA8B,EAClDC,iBAAiB,EACjBC,MAAM,EACNC,UAAU,EACgB;IAC1B,MAAMC,cAAc,MAAMN,gBAAgB,GAAGK,WAAW,aAAa,CAAC;IACtE,MAAME,eAAeD,aAAaE,cAAcC;IAEhD,IAAIF,cAAc;QAChB,MAAMG,iBAAiBT,OAAOU,MAAM,CAACJ,eAAeK,UAAU;QAC9D,MAAMC,kBAAkBZ,OAAOU,MAAM,CAACR,mBAAmBW,kBAAkBF,UAAU;QAErF,IAAIC,mBAAmBH,gBAAgB;YACrCN,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;YACZX,OAAOW,IAAI,CAAC;QACd;IACF;AACF"}
@@ -1,4 +1,3 @@
1
- import sortObject from 'deep-sort-object';
2
1
  const manifestPropOrder = [
3
2
  'name',
4
3
  'private',
@@ -15,10 +14,10 @@ const manifestPropOrder = [
15
14
  export function createPackageManifest(data) {
16
15
  const { isAppTemplate } = data;
17
16
  const dependencies = data.dependencies ? {
18
- dependencies: sortObject(data.dependencies)
17
+ dependencies: sortKeys(data.dependencies)
19
18
  } : {};
20
19
  const devDependencies = data.devDependencies ? {
21
- devDependencies: sortObject(data.devDependencies)
20
+ devDependencies: sortKeys(data.devDependencies)
22
21
  } : {};
23
22
  // Don't write a prettier config for SDK apps; we want to allow developers to use their own
24
23
  const prettierConfig = isAppTemplate ? {} : {
@@ -50,12 +49,15 @@ export function createPackageManifest(data) {
50
49
  }
51
50
  function getCommonManifest(data) {
52
51
  const pkg = {
53
- author: data.author,
54
- description: data.description,
55
- devDependencies: {},
56
- license: data.license || 'UNLICENSED',
57
52
  name: data.name,
58
- version: '1.0.0'
53
+ version: '1.0.0',
54
+ ...data.author ? {
55
+ author: data.author
56
+ } : {},
57
+ ...data.description ? {
58
+ description: data.description
59
+ } : {},
60
+ license: data.license || 'UNLICENSED'
59
61
  };
60
62
  if (pkg.license === 'UNLICENSED') {
61
63
  pkg.private = true;
@@ -68,6 +70,9 @@ function getCommonManifest(data) {
68
70
  }
69
71
  return pkg;
70
72
  }
73
+ function sortKeys(obj) {
74
+ return Object.fromEntries(Object.entries(obj).toSorted(([a], [b])=>a.localeCompare(b)));
75
+ }
71
76
  function serializeManifest(src) {
72
77
  const props = [
73
78
  ...manifestPropOrder,