@sanity/cli 6.3.2 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +16 -10
  2. package/dist/actions/init/bootstrapLocalTemplate.js +16 -1
  3. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
  4. package/dist/actions/init/initApp.js +72 -0
  5. package/dist/actions/init/initApp.js.map +1 -0
  6. package/dist/actions/init/initHelpers.js +37 -0
  7. package/dist/actions/init/initHelpers.js.map +1 -0
  8. package/dist/actions/init/initNextJs.js +246 -0
  9. package/dist/actions/init/initNextJs.js.map +1 -0
  10. package/dist/actions/init/initStudio.js +127 -0
  11. package/dist/actions/init/initStudio.js.map +1 -0
  12. package/dist/actions/init/scaffoldTemplate.js +114 -0
  13. package/dist/actions/init/scaffoldTemplate.js.map +1 -0
  14. package/dist/actions/init/templates/appQuickstart.js +2 -1
  15. package/dist/actions/init/templates/appQuickstart.js.map +1 -1
  16. package/dist/actions/init/templates/appSanityUi.js +2 -1
  17. package/dist/actions/init/templates/appSanityUi.js.map +1 -1
  18. package/dist/actions/init/templates/shopify.js +6 -6
  19. package/dist/actions/init/templates/shopify.js.map +1 -1
  20. package/dist/actions/init/templates/shopifyOnline.js +2 -2
  21. package/dist/actions/init/templates/shopifyOnline.js.map +1 -1
  22. package/dist/actions/mcp/detectAvailableEditors.js +16 -3
  23. package/dist/actions/mcp/detectAvailableEditors.js.map +1 -1
  24. package/dist/actions/mcp/editorConfigs.js +192 -132
  25. package/dist/actions/mcp/editorConfigs.js.map +1 -1
  26. package/dist/actions/mcp/setupMCP.js +4 -1
  27. package/dist/actions/mcp/setupMCP.js.map +1 -1
  28. package/dist/actions/mcp/writeMCPConfig.js +2 -2
  29. package/dist/actions/mcp/writeMCPConfig.js.map +1 -1
  30. package/dist/actions/schema/extractSchema.js +5 -7
  31. package/dist/actions/schema/extractSchema.js.map +1 -1
  32. package/dist/commands/datasets/copy.js +14 -0
  33. package/dist/commands/datasets/copy.js.map +1 -1
  34. package/dist/commands/init.js +149 -482
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/mcp/configure.js +1 -1
  37. package/dist/commands/mcp/configure.js.map +1 -1
  38. package/dist/hooks/prerun/injectEnvVariables.js +3 -5
  39. package/dist/hooks/prerun/injectEnvVariables.js.map +1 -1
  40. package/dist/services/datasets.js +2 -1
  41. package/dist/services/datasets.js.map +1 -1
  42. package/dist/telemetry/init.telemetry.js.map +1 -1
  43. package/dist/util/packageManager/installationInfo/detectPackages.js +13 -7
  44. package/dist/util/packageManager/installationInfo/detectPackages.js.map +1 -1
  45. package/dist/util/update/fetchUpdateInfo.js +40 -0
  46. package/dist/util/update/fetchUpdateInfo.js.map +1 -0
  47. package/dist/util/update/fetchUpdateInfo.worker.js +19 -0
  48. package/dist/util/update/fetchUpdateInfo.worker.js.map +1 -0
  49. package/dist/util/update/getRunnerUpdateCommand.js +33 -0
  50. package/dist/util/update/getRunnerUpdateCommand.js.map +1 -0
  51. package/dist/util/update/getUpdateCommand.js +6 -7
  52. package/dist/util/update/getUpdateCommand.js.map +1 -1
  53. package/dist/util/update/packageRunner.js +10 -0
  54. package/dist/util/update/packageRunner.js.map +1 -0
  55. package/dist/util/update/resolveRunnerPackage.js +45 -0
  56. package/dist/util/update/resolveRunnerPackage.js.map +1 -0
  57. package/dist/util/update/resolveUpdateTarget.js +31 -0
  58. package/dist/util/update/resolveUpdateTarget.js.map +1 -0
  59. package/dist/util/update/showNotificationUpdate.js +8 -6
  60. package/dist/util/update/showNotificationUpdate.js.map +1 -1
  61. package/dist/util/update/updateChecker.js +73 -38
  62. package/dist/util/update/updateChecker.js.map +1 -1
  63. package/oclif.manifest.json +540 -525
  64. package/package.json +6 -6
  65. package/templates/app-quickstart/src/App.tsx +2 -2
  66. package/templates/app-sanity-ui/src/App.tsx +2 -2
  67. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +1 -1
  68. package/dist/util/update/fetchLatestVersion.js +0 -21
  69. package/dist/util/update/fetchLatestVersion.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/util/update/updateChecker.ts"],"sourcesContent":["import {getUserConfig, isCi, subdebug} from '@sanity/cli-core'\nimport semver from 'semver'\n\nimport {createExpiringConfig} from '../createExpiringConfig.js'\nimport {fetchLatestVersion} from './fetchLatestVersion.js'\nimport {showUpdateNotification} from './showNotificationUpdate.js'\n\nconst debug = subdebug('updateChecker')\n\nconst TWELVE_HOURS = 12 * 60 * 60 * 1000 // 12 hours\nconst CHECK_TIMEOUT = 300\n\n/**\n * Check for CLI updates and notify the user if a new version is available.\n * This is designed to be non-blocking and will silently fail if anything goes wrong.\n *\n * @param config - The CLI config containing version and name\n */\nexport async function updateChecker(config: {\n name: string\n root: string\n version: string\n}): Promise<void> {\n debug(`Installed CLI version is ${config.version}`)\n // Skip in CI or if disabled\n if (isCi() || process.env.NO_UPDATE_NOTIFIER) {\n debug('Running on CI, or explicitly disabled, skipping update check')\n return\n }\n\n if (!process.stdout.isTTY) {\n return\n }\n\n const store = getUserConfig()\n\n let showNotificationUpdate = true\n\n // Cache for latest version from npm\n const latestVersionCache = createExpiringConfig({\n fetchValue: async () => fetchLatestVersion(config.name, CHECK_TIMEOUT),\n key: 'cliLatestRemoteVersion',\n onCacheHit: () => {\n debug('Less than 12 hours since last check, skipping update check')\n showNotificationUpdate = false\n },\n onFetch: () => debug('Checking for latest remote version'),\n store,\n ttl: TWELVE_HOURS,\n validateValue: (value): value is string => typeof value === 'string',\n })\n\n const latestVersion = await latestVersionCache.get()\n\n if (!latestVersion) {\n debug('No cached latest version result found')\n return\n }\n\n const comparison = semver.compare(latestVersion, config.version)\n\n if (comparison < 0) {\n debug('Remote version older than local')\n return\n }\n\n if (comparison === 0) {\n debug('No update found')\n return\n }\n\n debug('Update is available (%s)', latestVersion)\n\n if (showNotificationUpdate) {\n await showUpdateNotification(config.version, latestVersion)\n }\n}\n"],"names":["getUserConfig","isCi","subdebug","semver","createExpiringConfig","fetchLatestVersion","showUpdateNotification","debug","TWELVE_HOURS","CHECK_TIMEOUT","updateChecker","config","version","process","env","NO_UPDATE_NOTIFIER","stdout","isTTY","store","showNotificationUpdate","latestVersionCache","fetchValue","name","key","onCacheHit","onFetch","ttl","validateValue","value","latestVersion","get","comparison","compare"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,IAAI,EAAEC,QAAQ,QAAO,mBAAkB;AAC9D,OAAOC,YAAY,SAAQ;AAE3B,SAAQC,oBAAoB,QAAO,6BAA4B;AAC/D,SAAQC,kBAAkB,QAAO,0BAAyB;AAC1D,SAAQC,sBAAsB,QAAO,8BAA6B;AAElE,MAAMC,QAAQL,SAAS;AAEvB,MAAMM,eAAe,KAAK,KAAK,KAAK,KAAK,WAAW;;AACpD,MAAMC,gBAAgB;AAEtB;;;;;CAKC,GACD,OAAO,eAAeC,cAAcC,MAInC;IACCJ,MAAM,CAAC,yBAAyB,EAAEI,OAAOC,OAAO,EAAE;IAClD,4BAA4B;IAC5B,IAAIX,UAAUY,QAAQC,GAAG,CAACC,kBAAkB,EAAE;QAC5CR,MAAM;QACN;IACF;IAEA,IAAI,CAACM,QAAQG,MAAM,CAACC,KAAK,EAAE;QACzB;IACF;IAEA,MAAMC,QAAQlB;IAEd,IAAImB,yBAAyB;IAE7B,oCAAoC;IACpC,MAAMC,qBAAqBhB,qBAAqB;QAC9CiB,YAAY,UAAYhB,mBAAmBM,OAAOW,IAAI,EAAEb;QACxDc,KAAK;QACLC,YAAY;YACVjB,MAAM;YACNY,yBAAyB;QAC3B;QACAM,SAAS,IAAMlB,MAAM;QACrBW;QACAQ,KAAKlB;QACLmB,eAAe,CAACC,QAA2B,OAAOA,UAAU;IAC9D;IAEA,MAAMC,gBAAgB,MAAMT,mBAAmBU,GAAG;IAElD,IAAI,CAACD,eAAe;QAClBtB,MAAM;QACN;IACF;IAEA,MAAMwB,aAAa5B,OAAO6B,OAAO,CAACH,eAAelB,OAAOC,OAAO;IAE/D,IAAImB,aAAa,GAAG;QAClBxB,MAAM;QACN;IACF;IAEA,IAAIwB,eAAe,GAAG;QACpBxB,MAAM;QACN;IACF;IAEAA,MAAM,4BAA4BsB;IAElC,IAAIV,wBAAwB;QAC1B,MAAMb,uBAAuBK,OAAOC,OAAO,EAAEiB;IAC/C;AACF"}
1
+ {"version":3,"sources":["../../../src/util/update/updateChecker.ts"],"sourcesContent":["import {spawn} from 'node:child_process'\nimport {fileURLToPath} from 'node:url'\n\nimport {getUserConfig, isCi, subdebug} from '@sanity/cli-core'\nimport {gt as semverGt} from 'semver'\n\nimport {type SanityPackage} from '../packageManager/installationInfo/types.js'\nimport {detectPackageRunner} from './packageRunner.js'\nimport {resolveRunnerPackage} from './resolveRunnerPackage.js'\nimport {resolveUpdateTarget} from './resolveUpdateTarget.js'\nimport {showUpdateNotification} from './showNotificationUpdate.js'\n\nconst debug = subdebug('updateChecker')\n\nconst TWELVE_HOURS = 12 * 60 * 60 * 1000\n\n/**\n * Check for CLI updates and notify the user if a new version is available.\n *\n * The main process resolves the local update target (which package and installed version),\n * then reads the latest version from the config cache. It never makes network requests.\n * If the cache is empty or expired, a detached worker process is spawned to fetch the\n * latest version from npm and write it to the cache. The notification is shown on the\n * next CLI invocation when the cached result is available instantly.\n */\nexport async function updateChecker(config: {version: string}): Promise<void> {\n debug(`Installed CLI version is ${config.version}`)\n\n // Skip in CI or if disabled\n if (isCi() || process.env.NO_UPDATE_NOTIFIER) {\n debug('Running on CI, or explicitly disabled, skipping update check')\n return\n }\n\n if (!process.stdout.isTTY) {\n return\n }\n\n const runner = detectPackageRunner()\n const {installedVersion, packageName} = runner\n ? await resolveRunnerPackage(process.argv[1] ?? '', config.version)\n : await resolveUpdateTarget(process.cwd(), config.version)\n debug('Update target: %s@%s%s', packageName, installedVersion, runner ? ` via ${runner}` : '')\n\n const store = getUserConfig()\n const cacheKey = `latestVersion:${packageName}`\n const cached = readCachedLatestVersion(store, cacheKey)\n\n if (cached) {\n const {expired, latestVersion, updatedAt} = cached\n\n debug(\n 'Cache %s for %s: installed=%s, latest=%s',\n expired ? 'expired' : 'hit',\n packageName,\n installedVersion,\n latestVersion,\n )\n\n if (semverGt(latestVersion, installedVersion)) {\n const notifiedKey = `notifiedAt:${packageName}`\n if (store.get(notifiedKey) === updatedAt) {\n debug('Update is available (%s), already notified for this cache cycle', latestVersion)\n } else {\n debug('Update is available (%s)', latestVersion)\n await showUpdateNotification(installedVersion, latestVersion, packageName, runner)\n store.set(notifiedKey, updatedAt)\n }\n } else {\n debug('No update found')\n }\n\n if (expired) {\n debug('Cache expired, spawning worker to refresh')\n spawnFetchWorker(config.version, packageName)\n }\n } else {\n debug('No cached update info, spawning worker to fetch')\n spawnFetchWorker(config.version, packageName)\n }\n}\n\n/**\n * Read and validate the cached latest version for a specific package.\n * The cache only stores the latest npm version (globally valid) - the installed\n * version is always resolved locally to avoid cross-project confusion.\n */\nfunction readCachedLatestVersion(\n store: ReturnType<typeof getUserConfig>,\n cacheKey: string,\n): {expired: boolean; latestVersion: string; updatedAt: number} | null {\n const stored: unknown = store.get(cacheKey)\n\n if (\n !stored ||\n typeof stored !== 'object' ||\n !('updatedAt' in stored) ||\n typeof stored.updatedAt !== 'number' ||\n !('value' in stored) ||\n typeof stored.value !== 'string'\n ) {\n return null\n }\n\n const expired = Date.now() - stored.updatedAt > TWELVE_HOURS\n return {expired, latestVersion: stored.value, updatedAt: stored.updatedAt}\n}\n\n/**\n * Spawn a detached worker process to fetch the latest version and update the cache.\n * The worker is unref'd so the parent CLI can exit immediately.\n */\nfunction spawnFetchWorker(cliVersion: string, packageName: SanityPackage): void {\n const workerPath = fileURLToPath(new URL('fetchUpdateInfo.worker.js', import.meta.url))\n debug(`Spawning update check worker: ${process.execPath} ${workerPath}`)\n\n spawn(process.execPath, [workerPath], {\n detached: true,\n env: {\n ...process.env,\n SANITY_UPDATE_CHECK_CLI_VERSION: cliVersion,\n SANITY_UPDATE_CHECK_CWD: process.cwd(),\n SANITY_UPDATE_CHECK_PACKAGE: packageName,\n },\n stdio: debug.enabled ? 'inherit' : 'ignore',\n }).unref()\n}\n"],"names":["spawn","fileURLToPath","getUserConfig","isCi","subdebug","gt","semverGt","detectPackageRunner","resolveRunnerPackage","resolveUpdateTarget","showUpdateNotification","debug","TWELVE_HOURS","updateChecker","config","version","process","env","NO_UPDATE_NOTIFIER","stdout","isTTY","runner","installedVersion","packageName","argv","cwd","store","cacheKey","cached","readCachedLatestVersion","expired","latestVersion","updatedAt","notifiedKey","get","set","spawnFetchWorker","stored","value","Date","now","cliVersion","workerPath","URL","url","execPath","detached","SANITY_UPDATE_CHECK_CLI_VERSION","SANITY_UPDATE_CHECK_CWD","SANITY_UPDATE_CHECK_PACKAGE","stdio","enabled","unref"],"mappings":"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"}