sanity 5.3.0-next.26 → 5.3.0-next.28
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.
- package/lib/_chunks-cjs/mockBrowserEnvironment.cjs.map +1 -1
- package/lib/_chunks-es/PresentationToolGrantsCheck.js.map +1 -1
- package/lib/_chunks-es/_internal.js.map +1 -1
- package/lib/_chunks-es/deployApiAction.js.map +1 -1
- package/lib/_chunks-es/extractAction.js.map +1 -1
- package/lib/_chunks-es/index3.js.map +1 -1
- package/lib/_chunks-es/listApisAction.js.map +1 -1
- package/lib/_chunks-es/package.js +1 -1
- package/lib/_chunks-es/pane.js +2 -3
- package/lib/_chunks-es/pane.js.map +1 -1
- package/lib/_chunks-es/runtime.js.map +1 -1
- package/lib/_chunks-es/schemaStoreOutStrings.js.map +1 -1
- package/lib/_chunks-es/upgradePackages.js.map +1 -1
- package/lib/_chunks-es/version.js +1 -1
- package/lib/_singletons.d.ts +2 -2
- package/lib/desk.d.ts +1 -1
- package/lib/index.d.ts +6 -8
- package/lib/index.js.map +1 -1
- package/lib/router.js.map +1 -1
- package/lib/structure.d.ts +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemaStoreOutStrings.js","sources":["../../src/_internal/manifest/manifestTypes.ts","../../src/_internal/cli/actions/schema/__telemetry__/schemaStore.telemetry.ts","../../src/_internal/manifest/manifestTypeHelpers.ts","../../src/_internal/cli/actions/schema/utils/manifestReader.ts","../../src/_internal/cli/actions/schema/utils/schemaStoreValidation.ts","../../src/_internal/cli/actions/schema/utils/mainfestExtractor.ts","../../src/_internal/cli/actions/schema/utils/schemaApiClient.ts","../../src/_internal/cli/actions/schema/utils/schemaStoreOutStrings.ts"],"sourcesContent":["import {type SanityDocumentLike} from '@sanity/types'\nimport {type MediaLibraryConfig} from 'sanity'\n\nexport const SANITY_WORKSPACE_SCHEMA_ID_PREFIX = '_.schemas'\nexport const SANITY_WORKSPACE_SCHEMA_TYPE = 'system.schema'\nexport const CURRENT_WORKSPACE_SCHEMA_VERSION = '2025-05-01'\n\nexport type ManifestSerializable =\n | string\n | number\n | boolean\n | {[k: string]: ManifestSerializable}\n | ManifestSerializable[]\n\nexport interface CreateManifest {\n version: number\n createdAt: string\n workspaces: ManifestWorkspaceFile[]\n studioVersion: string | null\n}\n\nexport interface ManifestWorkspaceFile extends Omit<CreateWorkspaceManifest, 'schema' | 'tools'> {\n schema: string // filename\n tools: string // filename\n}\n\nexport interface CreateWorkspaceManifest {\n name: string\n title?: string\n subtitle?: string\n basePath: string\n dataset: string\n projectId: string\n mediaLibrary?: MediaLibraryConfig\n schema: ManifestSchemaType[]\n tools: ManifestTool[]\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n}\n\nexport interface ManifestSchemaType {\n type: string\n name: string\n title?: string\n deprecated?: {\n reason: string\n }\n readOnly?: boolean | 'conditional'\n hidden?: boolean | 'conditional'\n validation?: ManifestValidationGroup[]\n fields?: ManifestField[]\n to?: ManifestReferenceMember[]\n of?: ManifestArrayMember[]\n preview?: {\n select: Record<string, string>\n }\n fieldsets?: ManifestFieldset[]\n options?: Record<string, ManifestSerializable>\n //portable text\n marks?: {\n annotations?: ManifestArrayMember[]\n decorators?: ManifestTitledValue[]\n }\n lists?: ManifestTitledValue[]\n styles?: ManifestTitledValue[]\n\n // userland (assignable to ManifestSerializable | undefined)\n // not included to add some typesafty to extractManifest\n // [index: string]: unknown\n}\n\nexport interface ManifestFieldset {\n name: string\n title?: string\n [index: string]: ManifestSerializable | undefined\n}\n\nexport interface ManifestTitledValue {\n value: string\n title?: string\n}\n\nexport type ManifestField = ManifestSchemaType & {fieldset?: string}\nexport type ManifestArrayMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\nexport type ManifestReferenceMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\n\nexport interface ManifestValidationGroup {\n rules: ManifestValidationRule[]\n message?: string\n level?: 'error' | 'warning' | 'info'\n}\n\nexport type ManifestValidationRule = {\n flag: string\n constraint?: ManifestSerializable\n [index: string]: ManifestSerializable | undefined\n}\n\nexport interface ManifestTool {\n name: string\n title: string\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n type: string | null\n}\n\nexport type DefaultWorkspaceSchemaId = `${typeof SANITY_WORKSPACE_SCHEMA_ID_PREFIX}.${string}`\nexport type PrefixedWorkspaceSchemaId = `${DefaultWorkspaceSchemaId}.${string}`\nexport type WorkspaceSchemaId = DefaultWorkspaceSchemaId | PrefixedWorkspaceSchemaId\n\nexport interface StoredWorkspaceSchema extends SanityDocumentLike {\n _type: typeof SANITY_WORKSPACE_SCHEMA_TYPE\n _id: WorkspaceSchemaId\n /* api-like version string: date at which the format had a meaningful change */\n version: typeof CURRENT_WORKSPACE_SCHEMA_VERSION | undefined\n tag?: string\n workspace: {\n name: string\n title?: string\n }\n /**\n * The API expects JSON coming in, but will store a string to save on attribute paths.\n * Consumers must use JSON.parse on the value, put we deploy to the API using ManifestSchemaType[]\n */\n schema: string | ManifestSchemaType[]\n}\n","import {defineTrace} from '@sanity/telemetry'\n\ninterface SchemaDeployTraceData {\n manifestDir: string\n schemaRequired: boolean\n workspaceName?: string\n idPrefix?: string\n extractManifest?: boolean\n}\n\ninterface GenerateManifestTraceData {\n manifestDir: string\n schemaRequired: boolean\n}\n\nexport const GenerateManifest = defineTrace<GenerateManifestTraceData>({\n name: 'Manifest generation executed',\n version: 1,\n description: 'Manifest generation was executed',\n})\n\nexport const SchemaDeploy = defineTrace<SchemaDeployTraceData>({\n name: 'Schema deploy action executed',\n version: 1,\n description:\n 'Schema deploy action was executed, either via sanity schema deploy or as sanity deploy',\n})\n\n//Note – the individual sanity schema store commands are covered by the general cli telemetry\n","import {\n type CrossDatasetReferenceSchemaType,\n type GlobalDocumentReferenceSchemaType,\n type ObjectField,\n type ObjectSchemaType,\n type ReferenceSchemaType,\n type SchemaType,\n} from '@sanity/types'\n\nconst DEFAULT_IMAGE_FIELDS = ['asset', 'hotspot', 'crop', 'media']\nconst DEFAULT_FILE_FIELDS = ['asset', 'media']\nconst DEFAULT_GEOPOINT_FIELDS = ['lat', 'lng', 'alt']\nconst DEFAULT_SLUG_FIELDS = ['current', 'source']\n\ntype InternalOwnProps = {fields?: unknown[]; type?: string; name?: string}\n\nexport function getCustomFields(type: ObjectSchemaType): (ObjectField & {fieldset?: string})[] {\n const fields = type.fieldsets\n ? type.fieldsets.flatMap((fs) => {\n if (fs.single) {\n return fs.field\n }\n return fs.fields.map((field) => ({\n ...field,\n fieldset: fs.name,\n }))\n })\n : type.fields\n\n if (isType(type, 'block')) {\n return []\n }\n if (isType(type, 'slug')) {\n return fields.filter((f) => !DEFAULT_SLUG_FIELDS.includes(f.name))\n }\n if (isType(type, 'geopoint')) {\n return fields.filter((f) => !DEFAULT_GEOPOINT_FIELDS.includes(f.name))\n }\n if (isType(type, 'image')) {\n return fields.filter((f) => !DEFAULT_IMAGE_FIELDS.includes(f.name))\n }\n if (isType(type, 'file')) {\n return fields.filter((f) => !DEFAULT_FILE_FIELDS.includes(f.name))\n }\n return fields\n}\n\nexport function isReference(type: SchemaType): type is ReferenceSchemaType {\n return isType(type, 'reference')\n}\n\nexport function isCrossDatasetReference(type: SchemaType): type is CrossDatasetReferenceSchemaType {\n return isType(type, 'crossDatasetReference')\n}\n\nexport function isGlobalDocumentReference(\n type: SchemaType,\n): type is GlobalDocumentReferenceSchemaType {\n return isType(type, 'globalDocumentReference')\n}\n\nexport function isObjectField(maybeOjectField: unknown): boolean {\n return (\n typeof maybeOjectField === 'object' && maybeOjectField !== null && 'name' in maybeOjectField\n )\n}\n\nexport function isCustomized(maybeCustomized: SchemaType): boolean {\n const internalOwnProps = getSchemaTypeInternalOwnProps(maybeCustomized)\n\n const hasFieldsArray =\n isObjectField(maybeCustomized) &&\n !isReference(maybeCustomized) &&\n !isCrossDatasetReference(maybeCustomized) &&\n !isGlobalDocumentReference(maybeCustomized) &&\n 'fields' in maybeCustomized &&\n Array.isArray(maybeCustomized.fields) &&\n // needed to differentiate inline, named array object types from globally defined types\n // we only consider it customized if the _definition_ has fields declared\n // this holds for all customizable object-like types: object, document, image and file\n internalOwnProps?.fields\n\n if (!hasFieldsArray) {\n return false\n }\n\n const fields = getCustomFields(maybeCustomized)\n return !!fields.length\n}\n\nexport function isType(schemaType: SchemaType, typeName: string): boolean {\n if (schemaType.name === typeName) {\n return true\n }\n if (!schemaType.type) {\n return false\n }\n return isType(schemaType.type, typeName)\n}\n\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object'\n}\n\nexport function isPrimitive(value: unknown): value is string | boolean | number {\n return isString(value) || isBoolean(value) || isNumber(value)\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === 'string'\n}\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === 'boolean'\n}\n\nfunction isBoolean(value: unknown): value is boolean {\n return typeof value === 'number'\n}\n\n/**\n * _internal_ownProps contains the _definition_ for the type.\n * Without it we cannot differentiate inline array item types from globally defined types in array.of\n */\nexport function getSchemaTypeInternalOwnProps(type: SchemaType): InternalOwnProps | undefined {\n return (type as {_internal_ownProps?: InternalOwnProps})?._internal_ownProps\n}\n\n/**\n * This allows us to differentiate inline array.of type definitions vs global type names on compiled schema types\n */\nexport function getDefinedTypeName(type: SchemaType): string | undefined {\n return getSchemaTypeInternalOwnProps(type)?.type\n}\n","import {type Stats} from 'node:fs'\nimport {readFile, stat} from 'node:fs/promises'\nimport path, {join, resolve} from 'node:path'\n\nimport {type CliOutputter} from '@sanity/cli'\nimport chalk from 'chalk'\n\nimport {type CreateManifest, type ManifestSchemaType} from '../../../../manifest/manifestTypes'\nimport {MANIFEST_FILENAME} from '../../manifest/extractManifestAction'\nimport {type DeploySchemasFlags} from '../deploySchemasAction'\n\nexport type ManifestJsonReader = <T>(\n filePath: string,\n) => Promise<JsonFileParseSuccess<T> | undefined>\n\nexport type CreateManifestReaderFactory = (args: {\n manifestDir: string\n output: CliOutputter\n jsonReader?: <T>(filePath: string) => Promise<JsonFileParseSuccess<T> | undefined>\n}) => CreateManifestReader\n\nexport interface CreateManifestReader {\n getManifest: () => Promise<CreateManifest>\n getWorkspaceSchema: (workspaceName: string) => Promise<ManifestSchemaType[]>\n}\n\ninterface JsonFileParseSuccess<T> {\n parsedJson: T\n path: string\n lastModified: string\n}\n\n/**\n * The manifest reader will try to read manifest and workspace schema files _once_ and cache a successful result.\n * If you need to re-read the manifest from disk, create a new instance.\n */\nexport const createManifestReader: CreateManifestReaderFactory = ({\n manifestDir,\n output,\n jsonReader = parseJsonFile,\n}) => {\n let parsedManifest: JsonFileParseSuccess<CreateManifest>\n const parsedWorkspaces: Record<string, JsonFileParseSuccess<ManifestSchemaType[]> | undefined> =\n {}\n\n const getManifest: CreateManifestReader['getManifest'] = async () => {\n if (parsedManifest) {\n return parsedManifest?.parsedJson\n }\n\n const manifestFile = path.join(manifestDir, MANIFEST_FILENAME)\n\n const result = await jsonReader<CreateManifest>(manifestFile)\n if (!result) {\n throw new Error(\n `Manifest does not exist at ${manifestFile}. To create the manifest file, omit --no-${'extract-manifest' satisfies keyof DeploySchemasFlags} or run \"sanity manifest extract\" first.`,\n )\n }\n\n output.print(\n chalk.gray(`↳ Read manifest from ${manifestFile} (last modified: ${result.lastModified})`),\n )\n\n parsedManifest = result\n return result.parsedJson\n }\n\n const getWorkspaceSchema: CreateManifestReader['getWorkspaceSchema'] = async (workspaceName) => {\n if (parsedWorkspaces[workspaceName]) {\n return parsedWorkspaces[workspaceName]?.parsedJson\n }\n const manifest = await getManifest()\n if (!manifest) {\n throw Error('Manifest is required to read workspace schema.')\n }\n\n const workspaceManifest = manifest.workspaces.find(\n (workspace) => workspace.name === workspaceName,\n )\n\n if (!workspaceManifest) {\n throw Error(`No workspace named \"${workspaceName}\" found in manifest.`)\n }\n\n const workspaceSchemaFile = path.join(manifestDir, workspaceManifest.schema ?? '')\n const result = await jsonReader<ManifestSchemaType[]>(workspaceSchemaFile)\n if (!result) {\n throw Error(`Workspace schema file at \"${workspaceSchemaFile}\" does not exist.`)\n }\n parsedWorkspaces[workspaceName] = result\n return result.parsedJson\n }\n return {\n getManifest,\n getWorkspaceSchema,\n }\n}\n\nexport function resolveManifestDirectory(workDir: string, customPath?: string): string {\n const defaultOutputDir = resolve(join(workDir, 'dist'))\n\n const outputDir = resolve(defaultOutputDir)\n const defaultStaticPath = join(outputDir, 'static')\n\n const staticPath = customPath ?? defaultStaticPath\n return path.resolve(process.cwd(), staticPath)\n}\n\nasync function parseJsonFile<T>(filePath: string): Promise<JsonFileParseSuccess<T> | undefined> {\n let stats: Stats\n try {\n stats = await stat(filePath)\n } catch (err) {\n // file does not exist\n return undefined\n }\n const content = await readFile(filePath, 'utf-8')\n const lastModified = stats.mtime.toISOString()\n const json = JSON.parse(content) as T\n if (!json) {\n throw new Error(`JSON file \"${filePath}\" was empty.`)\n }\n return {\n parsedJson: json,\n path: filePath,\n lastModified,\n }\n}\n","import {uniqBy} from 'lodash-es'\n\nimport {isDefined} from '../../../../manifest/manifestTypeHelpers'\nimport {SANITY_WORKSPACE_SCHEMA_ID_PREFIX} from '../../../../manifest/manifestTypes'\nimport {type DeleteSchemaFlags} from '../deleteSchemaAction'\nimport {type DeploySchemasFlags} from '../deploySchemasAction'\nimport {type SchemaListFlags} from '../listSchemasAction'\nimport {resolveManifestDirectory} from './manifestReader'\n\nexport const validForIdChars = 'a-zA-Z0-9._-'\nexport const validForIdPattern = new RegExp(`^[${validForIdChars}]+$`, 'g')\n\n//no periods allowed in workspaceName or tag in ids\nexport const validForNamesChars = 'a-zA-Z0-9_-'\nexport const validForNamesPattern = new RegExp(`^[${validForNamesChars}]+$`, 'g')\n\nconst requiredInId = SANITY_WORKSPACE_SCHEMA_ID_PREFIX.replace(/[.]/g, '\\\\.')\n\nconst idIdPatternString = `^${requiredInId}\\\\.([${validForNamesChars}]+)`\nconst baseIdPattern = new RegExp(`${idIdPatternString}$`)\nconst taggedIdIdPattern = new RegExp(`${idIdPatternString}\\\\.tag\\\\.([${validForNamesChars}]+)$`)\n\nexport class FlagValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'FlagValidationError'\n }\n}\n\ninterface WorkspaceSchemaId {\n schemaId: string\n workspace: string\n}\n\nexport interface SchemaStoreCommonFlags {\n 'extract-manifest'?: boolean\n 'manifest-dir'?: string\n 'verbose'?: boolean\n}\n\nfunction parseCommonFlags(\n flags: SchemaStoreCommonFlags,\n context: {workDir: string},\n errors: string[],\n) {\n const manifestDir = parseManifestDir(flags, errors)\n const verbose = !!flags.verbose\n // extract manifest by default: our CLI layer handles both --extract-manifest (true) and --no-extract-manifest (false)\n const extractManifest = flags['extract-manifest'] ?? true\n\n const fullManifestDir = resolveManifestDirectory(context.workDir, manifestDir)\n return {\n manifestDir: fullManifestDir,\n verbose,\n extractManifest,\n }\n}\n\nexport function parseDeploySchemasConfig(flags: DeploySchemasFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const workspaceName = parseWorkspace(flags, errors)\n const tag = parseTag(flags, errors)\n const schemaRequired = !!flags['schema-required']\n\n assertNoErrors(errors)\n return {...commonFlags, workspaceName, tag, schemaRequired}\n}\n\nexport function parseListSchemasConfig(flags: SchemaListFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const id = parseId(flags, errors)\n const json = !!flags.json\n\n assertNoErrors(errors)\n return {...commonFlags, json, id}\n}\n\nexport function parseDeleteSchemasConfig(flags: DeleteSchemaFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const ids = parseIds(flags, errors)\n const dataset = parseDataset(flags, errors)\n\n assertNoErrors(errors)\n return {...commonFlags, dataset, ids}\n}\n\nfunction assertNoErrors(errors: string[]) {\n if (errors.length) {\n throw new FlagValidationError(\n `Invalid arguments:\\n${errors.map((error) => ` - ${error}`).join('\\n')}`,\n )\n }\n}\n\nexport function parseIds(flags: {ids?: unknown}, errors: string[]): WorkspaceSchemaId[] {\n const parsedIds = parseNonEmptyString(flags, 'ids', errors)\n if (errors.length) {\n return []\n }\n\n const ids = parsedIds\n .split(',')\n .map((id) => id.trim())\n .filter((id) => !!id)\n .map((id) => parseWorkspaceSchemaId(id, errors))\n .filter(isDefined)\n\n const uniqueIds = uniqBy(ids, 'schemaId' satisfies keyof (typeof ids)[number])\n if (uniqueIds.length < ids.length) {\n errors.push(`ids contains duplicates`)\n }\n if (!errors.length && !uniqueIds.length) {\n errors.push(`ids contains no valid id strings`)\n }\n return uniqueIds\n}\n\nexport function parseId(flags: {id?: unknown}, errors: string[]) {\n const id = flags.id === undefined ? undefined : parseNonEmptyString(flags, 'id', errors)\n if (id) {\n return parseWorkspaceSchemaId(id, errors)?.schemaId\n }\n return undefined\n}\n\nexport function parseWorkspaceSchemaId(id: string, errors: string[]) {\n const trimmedId = id.trim()\n\n if (!trimmedId.match(validForIdPattern)) {\n errors.push(`id can only contain characters in [${validForIdChars}] but found: \"${trimmedId}\"`)\n return undefined\n }\n\n if (trimmedId.startsWith('-')) {\n errors.push(`id cannot start with - (dash) but found: \"${trimmedId}\"`)\n return undefined\n }\n\n if (trimmedId.match(/\\.\\./g)) {\n errors.push(`id cannot have consecutive . (period) characters, but found: \"${trimmedId}\"`)\n return undefined\n }\n const [fullMatch, workspace, tag] =\n trimmedId.match(taggedIdIdPattern) ?? trimmedId.match(baseIdPattern) ?? []\n if (!workspace) {\n errors.push(\n [\n `id must either match ${SANITY_WORKSPACE_SCHEMA_ID_PREFIX}.<workspaceName> `,\n `or ${SANITY_WORKSPACE_SCHEMA_ID_PREFIX}.<workspaceName>.tag.<tag> but found: \"${trimmedId}\". `,\n `Note that workspace name characters not in [${validForNamesChars}] has to be replaced with _ for schema id.`,\n ].join(''),\n )\n return undefined\n }\n return {\n schemaId: trimmedId,\n workspace,\n }\n}\n\nfunction parseDataset(flags: {dataset?: unknown}, errors: string[]) {\n return flags.dataset === undefined ? undefined : parseNonEmptyString(flags, 'dataset', errors)\n}\n\nfunction parseWorkspace(flags: {workspace?: unknown}, errors: string[]) {\n return flags.workspace === undefined ? undefined : parseNonEmptyString(flags, 'workspace', errors)\n}\n\nfunction parseManifestDir(flags: {'manifest-dir'?: unknown}, errors: string[]) {\n return flags['manifest-dir'] === undefined\n ? undefined\n : parseNonEmptyString(flags, 'manifest-dir', errors)\n}\n\nexport function parseTag(flags: {tag?: unknown}, errors: string[]) {\n if (flags.tag === undefined) {\n return undefined\n }\n\n const tag = parseNonEmptyString(flags, 'tag', errors)\n if (errors.length) {\n return undefined\n }\n\n if (tag.includes('.')) {\n errors.push(`tag cannot contain . (period), but was: \"${tag}\"`)\n return undefined\n }\n\n if (!tag.match(validForNamesPattern)) {\n errors.push(`tag can only contain characters in [${validForNamesChars}], but was: \"${tag}\"`)\n return undefined\n }\n\n if (tag.startsWith('-')) {\n errors.push(`tag cannot start with - (dash) but was: \"${tag}\"`)\n return undefined\n }\n\n return tag\n}\n\nfunction parseNonEmptyString<\n Flag extends string,\n Flags extends Partial<Record<Flag, unknown | undefined>>,\n>(flags: Flags, flagName: Flag, errors: string[]): string {\n const flag = flags[flagName]\n if (!isString(flag) || !flag) {\n errors.push(`${flagName} argument is empty`)\n return ''\n }\n return flag\n}\n\nfunction isString(flag: unknown): flag is string {\n return typeof flag === 'string'\n}\n\nexport const SCHEMA_PERMISSION_HELP_TEXT =\n 'For multi-project workspaces, set SANITY_AUTH_TOKEN environment variable to a token with access to the workspace projects.'\n","import {\n type CliCommandArguments,\n type CliCommandContext,\n type CliOutputter,\n type TelemetryUserProperties,\n} from '@sanity/cli'\nimport {type TelemetryLogger} from '@sanity/telemetry'\nimport chalk from 'chalk'\n\nimport {type ExtractManifestFlags, extractManifestSafe} from '../../manifest/extractManifestAction'\nimport {GenerateManifest} from '../__telemetry__/schemaStore.telemetry'\nimport {FlagValidationError} from './schemaStoreValidation'\n\nexport type ManifestExtractor = (manifestDir: string) => Promise<void>\n\nexport async function ensureManifestExtractSatisfied(args: {\n schemaRequired: boolean\n extractManifest: boolean\n manifestDir: string\n manifestExtractor: (manifestDir: string) => Promise<void>\n output: CliOutputter\n telemetry: TelemetryLogger<TelemetryUserProperties>\n}) {\n const {schemaRequired, extractManifest, manifestDir, manifestExtractor, output, telemetry} = args\n if (!extractManifest) {\n return true\n }\n const trace = telemetry.trace(GenerateManifest, {manifestDir, schemaRequired})\n try {\n trace.start()\n // a successful manifest extract will write a new manifest file, which manifestReader will then read from disk\n await manifestExtractor(manifestDir)\n trace.complete()\n return true\n } catch (err) {\n trace.error(err)\n\n if (schemaRequired || err instanceof FlagValidationError) {\n throw err\n } else {\n output.print(chalk.gray(`↳ Failed to extract manifest:\\n ${err.message}`))\n return false\n }\n }\n}\n\nexport function createManifestExtractor(context: CliCommandContext & {safe?: boolean}) {\n return async (manifestDir: string) => {\n const error = await extractManifestSafe(\n {\n extOptions: {path: manifestDir},\n groupOrCommand: 'extract',\n argv: [],\n argsWithoutOptions: [],\n extraArguments: [],\n } as CliCommandArguments<ExtractManifestFlags>,\n context,\n )\n if (!context.safe && error) {\n throw error\n }\n }\n}\n","import {type CliApiClient} from '@sanity/cli'\n\nexport function createSchemaApiClient(apiClient: CliApiClient) {\n const client = apiClient({\n requireUser: true,\n requireProject: true,\n }).withConfig({apiVersion: 'v2025-03-01', useCdn: false})\n\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n if (!projectId) throw new Error('Project ID is not defined')\n if (!dataset) throw new Error('Dataset is not defined')\n\n return {\n client,\n projectId,\n dataset,\n }\n}\n","export function getProjectIdDatasetsOutString(\n projectIdDatasets: {projectId: string; dataset: string}[],\n) {\n return projectIdDatasets.length === 1\n ? `${projectIdDatasetPair(projectIdDatasets[0])}`\n : `${getStringArrayOutString(projectIdDatasets.map(projectIdDatasetPair))}`\n}\n\nexport function projectIdDatasetPair(pair: {projectId: string; dataset: string}) {\n return JSON.stringify({projectId: pair.projectId, dataset: pair.dataset})\n}\n\nexport function getStringArrayOutString(array: string[]) {\n return `[${array.map((d) => `\"${d}\"`).join(',')}]`\n}\n\nexport function getStringList(array: string[]) {\n return array.map((s) => `- ${s}`).join('\\n')\n}\n"],"names":["SANITY_WORKSPACE_SCHEMA_ID_PREFIX","CURRENT_WORKSPACE_SCHEMA_VERSION","GenerateManifest","defineTrace","name","version","description","SchemaDeploy","isDefined","value","createManifestReader","manifestDir","output","jsonReader","parseJsonFile","parsedManifest","parsedWorkspaces","getManifest","parsedJson","manifestFile","path","join","MANIFEST_FILENAME","result","Error","print","chalk","gray","lastModified","getWorkspaceSchema","workspaceName","manifest","workspaceManifest","workspaces","find","workspace","workspaceSchemaFile","schema","resolveManifestDirectory","workDir","customPath","defaultOutputDir","resolve","outputDir","defaultStaticPath","staticPath","process","cwd","filePath","stats","stat","content","readFile","mtime","toISOString","json","JSON","parse","validForIdChars","validForIdPattern","RegExp","validForNamesChars","validForNamesPattern","requiredInId","replace","idIdPatternString","baseIdPattern","taggedIdIdPattern","FlagValidationError","constructor","message","parseCommonFlags","flags","context","errors","parseManifestDir","verbose","extractManifest","parseDeploySchemasConfig","commonFlags","parseWorkspace","tag","parseTag","schemaRequired","assertNoErrors","parseListSchemasConfig","id","parseId","parseDeleteSchemasConfig","ids","parseIds","dataset","parseDataset","length","map","error","parsedIds","parseNonEmptyString","split","trim","filter","parseWorkspaceSchemaId","uniqueIds","uniqBy","push","undefined","schemaId","trimmedId","match","startsWith","fullMatch","includes","flagName","flag","isString","SCHEMA_PERMISSION_HELP_TEXT","ensureManifestExtractSatisfied","args","manifestExtractor","telemetry","trace","start","complete","err","createManifestExtractor","extractManifestSafe","extOptions","groupOrCommand","argv","argsWithoutOptions","extraArguments","safe","createSchemaApiClient","apiClient","client","requireUser","requireProject","withConfig","apiVersion","useCdn","projectId","config","getProjectIdDatasetsOutString","projectIdDatasets","projectIdDatasetPair","getStringArrayOutString","pair","stringify","array","d","getStringList","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schemaStoreOutStrings.js","sources":["../../src/_internal/manifest/manifestTypes.ts","../../src/_internal/cli/actions/schema/__telemetry__/schemaStore.telemetry.ts","../../src/_internal/manifest/manifestTypeHelpers.ts","../../src/_internal/cli/actions/schema/utils/manifestReader.ts","../../src/_internal/cli/actions/schema/utils/schemaStoreValidation.ts","../../src/_internal/cli/actions/schema/utils/mainfestExtractor.ts","../../src/_internal/cli/actions/schema/utils/schemaApiClient.ts","../../src/_internal/cli/actions/schema/utils/schemaStoreOutStrings.ts"],"sourcesContent":["import {type SanityDocumentLike} from '@sanity/types'\nimport {type MediaLibraryConfig} from 'sanity'\n\nexport const SANITY_WORKSPACE_SCHEMA_ID_PREFIX = '_.schemas'\nexport const SANITY_WORKSPACE_SCHEMA_TYPE = 'system.schema'\nexport const CURRENT_WORKSPACE_SCHEMA_VERSION = '2025-05-01'\n\nexport type ManifestSerializable =\n | string\n | number\n | boolean\n | {[k: string]: ManifestSerializable}\n | ManifestSerializable[]\n\nexport interface CreateManifest {\n version: number\n createdAt: string\n workspaces: ManifestWorkspaceFile[]\n studioVersion: string | null\n}\n\nexport interface ManifestWorkspaceFile extends Omit<CreateWorkspaceManifest, 'schema' | 'tools'> {\n schema: string // filename\n tools: string // filename\n}\n\nexport interface CreateWorkspaceManifest {\n name: string\n title?: string\n subtitle?: string\n basePath: string\n dataset: string\n projectId: string\n mediaLibrary?: MediaLibraryConfig\n schema: ManifestSchemaType[]\n tools: ManifestTool[]\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n}\n\nexport interface ManifestSchemaType {\n type: string\n name: string\n title?: string\n deprecated?: {\n reason: string\n }\n readOnly?: boolean | 'conditional'\n hidden?: boolean | 'conditional'\n validation?: ManifestValidationGroup[]\n fields?: ManifestField[]\n to?: ManifestReferenceMember[]\n of?: ManifestArrayMember[]\n preview?: {\n select: Record<string, string>\n }\n fieldsets?: ManifestFieldset[]\n options?: Record<string, ManifestSerializable>\n //portable text\n marks?: {\n annotations?: ManifestArrayMember[]\n decorators?: ManifestTitledValue[]\n }\n lists?: ManifestTitledValue[]\n styles?: ManifestTitledValue[]\n\n // userland (assignable to ManifestSerializable | undefined)\n // not included to add some typesafty to extractManifest\n // [index: string]: unknown\n}\n\nexport interface ManifestFieldset {\n name: string\n title?: string\n [index: string]: ManifestSerializable | undefined\n}\n\nexport interface ManifestTitledValue {\n value: string\n title?: string\n}\n\nexport type ManifestField = ManifestSchemaType & {fieldset?: string}\nexport type ManifestArrayMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\nexport type ManifestReferenceMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\n\nexport interface ManifestValidationGroup {\n rules: ManifestValidationRule[]\n message?: string\n level?: 'error' | 'warning' | 'info'\n}\n\nexport type ManifestValidationRule = {\n flag: string\n constraint?: ManifestSerializable\n [index: string]: ManifestSerializable | undefined\n}\n\nexport interface ManifestTool {\n name: string\n title: string\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n type: string | null\n}\n\nexport type DefaultWorkspaceSchemaId = `${typeof SANITY_WORKSPACE_SCHEMA_ID_PREFIX}.${string}`\nexport type PrefixedWorkspaceSchemaId = `${DefaultWorkspaceSchemaId}.${string}`\nexport type WorkspaceSchemaId = DefaultWorkspaceSchemaId | PrefixedWorkspaceSchemaId\n\nexport interface StoredWorkspaceSchema extends SanityDocumentLike {\n _type: typeof SANITY_WORKSPACE_SCHEMA_TYPE\n _id: WorkspaceSchemaId\n /* api-like version string: date at which the format had a meaningful change */\n version: typeof CURRENT_WORKSPACE_SCHEMA_VERSION | undefined\n tag?: string\n workspace: {\n name: string\n title?: string\n }\n /**\n * The API expects JSON coming in, but will store a string to save on attribute paths.\n * Consumers must use JSON.parse on the value, put we deploy to the API using ManifestSchemaType[]\n */\n schema: string | ManifestSchemaType[]\n}\n","import {defineTrace} from '@sanity/telemetry'\n\ninterface SchemaDeployTraceData {\n manifestDir: string\n schemaRequired: boolean\n workspaceName?: string\n idPrefix?: string\n extractManifest?: boolean\n}\n\ninterface GenerateManifestTraceData {\n manifestDir: string\n schemaRequired: boolean\n}\n\nexport const GenerateManifest = defineTrace<GenerateManifestTraceData>({\n name: 'Manifest generation executed',\n version: 1,\n description: 'Manifest generation was executed',\n})\n\nexport const SchemaDeploy = defineTrace<SchemaDeployTraceData>({\n name: 'Schema deploy action executed',\n version: 1,\n description:\n 'Schema deploy action was executed, either via sanity schema deploy or as sanity deploy',\n})\n\n//Note – the individual sanity schema store commands are covered by the general cli telemetry\n","import {\n type CrossDatasetReferenceSchemaType,\n type GlobalDocumentReferenceSchemaType,\n type ObjectField,\n type ObjectSchemaType,\n type ReferenceSchemaType,\n type SchemaType,\n} from '@sanity/types'\n\nconst DEFAULT_IMAGE_FIELDS = ['asset', 'hotspot', 'crop', 'media']\nconst DEFAULT_FILE_FIELDS = ['asset', 'media']\nconst DEFAULT_GEOPOINT_FIELDS = ['lat', 'lng', 'alt']\nconst DEFAULT_SLUG_FIELDS = ['current', 'source']\n\ntype InternalOwnProps = {fields?: unknown[]; type?: string; name?: string}\n\nexport function getCustomFields(type: ObjectSchemaType): (ObjectField & {fieldset?: string})[] {\n const fields = type.fieldsets\n ? type.fieldsets.flatMap((fs) => {\n if (fs.single) {\n return fs.field\n }\n return fs.fields.map((field) => ({\n ...field,\n fieldset: fs.name,\n }))\n })\n : type.fields\n\n if (isType(type, 'block')) {\n return []\n }\n if (isType(type, 'slug')) {\n return fields.filter((f) => !DEFAULT_SLUG_FIELDS.includes(f.name))\n }\n if (isType(type, 'geopoint')) {\n return fields.filter((f) => !DEFAULT_GEOPOINT_FIELDS.includes(f.name))\n }\n if (isType(type, 'image')) {\n return fields.filter((f) => !DEFAULT_IMAGE_FIELDS.includes(f.name))\n }\n if (isType(type, 'file')) {\n return fields.filter((f) => !DEFAULT_FILE_FIELDS.includes(f.name))\n }\n return fields\n}\n\nexport function isReference(type: SchemaType): type is ReferenceSchemaType {\n return isType(type, 'reference')\n}\n\nexport function isCrossDatasetReference(type: SchemaType): type is CrossDatasetReferenceSchemaType {\n return isType(type, 'crossDatasetReference')\n}\n\nexport function isGlobalDocumentReference(\n type: SchemaType,\n): type is GlobalDocumentReferenceSchemaType {\n return isType(type, 'globalDocumentReference')\n}\n\nexport function isObjectField(maybeOjectField: unknown): boolean {\n return (\n typeof maybeOjectField === 'object' && maybeOjectField !== null && 'name' in maybeOjectField\n )\n}\n\nexport function isCustomized(maybeCustomized: SchemaType): boolean {\n const internalOwnProps = getSchemaTypeInternalOwnProps(maybeCustomized)\n\n const hasFieldsArray =\n isObjectField(maybeCustomized) &&\n !isReference(maybeCustomized) &&\n !isCrossDatasetReference(maybeCustomized) &&\n !isGlobalDocumentReference(maybeCustomized) &&\n 'fields' in maybeCustomized &&\n Array.isArray(maybeCustomized.fields) &&\n // needed to differentiate inline, named array object types from globally defined types\n // we only consider it customized if the _definition_ has fields declared\n // this holds for all customizable object-like types: object, document, image and file\n internalOwnProps?.fields\n\n if (!hasFieldsArray) {\n return false\n }\n\n const fields = getCustomFields(maybeCustomized)\n return !!fields.length\n}\n\nexport function isType(schemaType: SchemaType, typeName: string): boolean {\n if (schemaType.name === typeName) {\n return true\n }\n if (!schemaType.type) {\n return false\n }\n return isType(schemaType.type, typeName)\n}\n\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object'\n}\n\nexport function isPrimitive(value: unknown): value is string | boolean | number {\n return isString(value) || isBoolean(value) || isNumber(value)\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === 'string'\n}\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === 'boolean'\n}\n\nfunction isBoolean(value: unknown): value is boolean {\n return typeof value === 'number'\n}\n\n/**\n * _internal_ownProps contains the _definition_ for the type.\n * Without it we cannot differentiate inline array item types from globally defined types in array.of\n */\nexport function getSchemaTypeInternalOwnProps(type: SchemaType): InternalOwnProps | undefined {\n return (type as {_internal_ownProps?: InternalOwnProps})?._internal_ownProps\n}\n\n/**\n * This allows us to differentiate inline array.of type definitions vs global type names on compiled schema types\n */\nexport function getDefinedTypeName(type: SchemaType): string | undefined {\n return getSchemaTypeInternalOwnProps(type)?.type\n}\n","import {type Stats} from 'node:fs'\nimport {readFile, stat} from 'node:fs/promises'\nimport path, {join, resolve} from 'node:path'\n\nimport {type CliOutputter} from '@sanity/cli'\nimport chalk from 'chalk'\n\nimport {type CreateManifest, type ManifestSchemaType} from '../../../../manifest/manifestTypes'\nimport {MANIFEST_FILENAME} from '../../manifest/extractManifestAction'\nimport {type DeploySchemasFlags} from '../deploySchemasAction'\n\nexport type ManifestJsonReader = <T>(\n filePath: string,\n) => Promise<JsonFileParseSuccess<T> | undefined>\n\nexport type CreateManifestReaderFactory = (args: {\n manifestDir: string\n output: CliOutputter\n jsonReader?: <T>(filePath: string) => Promise<JsonFileParseSuccess<T> | undefined>\n}) => CreateManifestReader\n\nexport interface CreateManifestReader {\n getManifest: () => Promise<CreateManifest>\n getWorkspaceSchema: (workspaceName: string) => Promise<ManifestSchemaType[]>\n}\n\ninterface JsonFileParseSuccess<T> {\n parsedJson: T\n path: string\n lastModified: string\n}\n\n/**\n * The manifest reader will try to read manifest and workspace schema files _once_ and cache a successful result.\n * If you need to re-read the manifest from disk, create a new instance.\n */\nexport const createManifestReader: CreateManifestReaderFactory = ({\n manifestDir,\n output,\n jsonReader = parseJsonFile,\n}) => {\n let parsedManifest: JsonFileParseSuccess<CreateManifest>\n const parsedWorkspaces: Record<string, JsonFileParseSuccess<ManifestSchemaType[]> | undefined> =\n {}\n\n const getManifest: CreateManifestReader['getManifest'] = async () => {\n if (parsedManifest) {\n return parsedManifest?.parsedJson\n }\n\n const manifestFile = path.join(manifestDir, MANIFEST_FILENAME)\n\n const result = await jsonReader<CreateManifest>(manifestFile)\n if (!result) {\n throw new Error(\n `Manifest does not exist at ${manifestFile}. To create the manifest file, omit --no-${'extract-manifest' satisfies keyof DeploySchemasFlags} or run \"sanity manifest extract\" first.`,\n )\n }\n\n output.print(\n chalk.gray(`↳ Read manifest from ${manifestFile} (last modified: ${result.lastModified})`),\n )\n\n parsedManifest = result\n return result.parsedJson\n }\n\n const getWorkspaceSchema: CreateManifestReader['getWorkspaceSchema'] = async (workspaceName) => {\n if (parsedWorkspaces[workspaceName]) {\n return parsedWorkspaces[workspaceName]?.parsedJson\n }\n const manifest = await getManifest()\n if (!manifest) {\n throw Error('Manifest is required to read workspace schema.')\n }\n\n const workspaceManifest = manifest.workspaces.find(\n (workspace) => workspace.name === workspaceName,\n )\n\n if (!workspaceManifest) {\n throw Error(`No workspace named \"${workspaceName}\" found in manifest.`)\n }\n\n const workspaceSchemaFile = path.join(manifestDir, workspaceManifest.schema ?? '')\n const result = await jsonReader<ManifestSchemaType[]>(workspaceSchemaFile)\n if (!result) {\n throw Error(`Workspace schema file at \"${workspaceSchemaFile}\" does not exist.`)\n }\n parsedWorkspaces[workspaceName] = result\n return result.parsedJson\n }\n return {\n getManifest,\n getWorkspaceSchema,\n }\n}\n\nexport function resolveManifestDirectory(workDir: string, customPath?: string): string {\n const defaultOutputDir = resolve(join(workDir, 'dist'))\n\n const outputDir = resolve(defaultOutputDir)\n const defaultStaticPath = join(outputDir, 'static')\n\n const staticPath = customPath ?? defaultStaticPath\n return path.resolve(process.cwd(), staticPath)\n}\n\nasync function parseJsonFile<T>(filePath: string): Promise<JsonFileParseSuccess<T> | undefined> {\n let stats: Stats\n try {\n stats = await stat(filePath)\n } catch {\n // file does not exist\n return undefined\n }\n const content = await readFile(filePath, 'utf-8')\n const lastModified = stats.mtime.toISOString()\n const json = JSON.parse(content) as T\n if (!json) {\n throw new Error(`JSON file \"${filePath}\" was empty.`)\n }\n return {\n parsedJson: json,\n path: filePath,\n lastModified,\n }\n}\n","import {uniqBy} from 'lodash-es'\n\nimport {isDefined} from '../../../../manifest/manifestTypeHelpers'\nimport {SANITY_WORKSPACE_SCHEMA_ID_PREFIX} from '../../../../manifest/manifestTypes'\nimport {type DeleteSchemaFlags} from '../deleteSchemaAction'\nimport {type DeploySchemasFlags} from '../deploySchemasAction'\nimport {type SchemaListFlags} from '../listSchemasAction'\nimport {resolveManifestDirectory} from './manifestReader'\n\nexport const validForIdChars = 'a-zA-Z0-9._-'\nexport const validForIdPattern = new RegExp(`^[${validForIdChars}]+$`, 'g')\n\n//no periods allowed in workspaceName or tag in ids\nexport const validForNamesChars = 'a-zA-Z0-9_-'\nexport const validForNamesPattern = new RegExp(`^[${validForNamesChars}]+$`, 'g')\n\nconst requiredInId = SANITY_WORKSPACE_SCHEMA_ID_PREFIX.replace(/[.]/g, '\\\\.')\n\nconst idIdPatternString = `^${requiredInId}\\\\.([${validForNamesChars}]+)`\nconst baseIdPattern = new RegExp(`${idIdPatternString}$`)\nconst taggedIdIdPattern = new RegExp(`${idIdPatternString}\\\\.tag\\\\.([${validForNamesChars}]+)$`)\n\nexport class FlagValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'FlagValidationError'\n }\n}\n\ninterface WorkspaceSchemaId {\n schemaId: string\n workspace: string\n}\n\nexport interface SchemaStoreCommonFlags {\n 'extract-manifest'?: boolean\n 'manifest-dir'?: string\n 'verbose'?: boolean\n}\n\nfunction parseCommonFlags(\n flags: SchemaStoreCommonFlags,\n context: {workDir: string},\n errors: string[],\n) {\n const manifestDir = parseManifestDir(flags, errors)\n const verbose = !!flags.verbose\n // extract manifest by default: our CLI layer handles both --extract-manifest (true) and --no-extract-manifest (false)\n const extractManifest = flags['extract-manifest'] ?? true\n\n const fullManifestDir = resolveManifestDirectory(context.workDir, manifestDir)\n return {\n manifestDir: fullManifestDir,\n verbose,\n extractManifest,\n }\n}\n\nexport function parseDeploySchemasConfig(flags: DeploySchemasFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const workspaceName = parseWorkspace(flags, errors)\n const tag = parseTag(flags, errors)\n const schemaRequired = !!flags['schema-required']\n\n assertNoErrors(errors)\n return {...commonFlags, workspaceName, tag, schemaRequired}\n}\n\nexport function parseListSchemasConfig(flags: SchemaListFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const id = parseId(flags, errors)\n const json = !!flags.json\n\n assertNoErrors(errors)\n return {...commonFlags, json, id}\n}\n\nexport function parseDeleteSchemasConfig(flags: DeleteSchemaFlags, context: {workDir: string}) {\n const errors: string[] = []\n\n const commonFlags = parseCommonFlags(flags, context, errors)\n const ids = parseIds(flags, errors)\n const dataset = parseDataset(flags, errors)\n\n assertNoErrors(errors)\n return {...commonFlags, dataset, ids}\n}\n\nfunction assertNoErrors(errors: string[]) {\n if (errors.length) {\n throw new FlagValidationError(\n `Invalid arguments:\\n${errors.map((error) => ` - ${error}`).join('\\n')}`,\n )\n }\n}\n\nexport function parseIds(flags: {ids?: unknown}, errors: string[]): WorkspaceSchemaId[] {\n const parsedIds = parseNonEmptyString(flags, 'ids', errors)\n if (errors.length) {\n return []\n }\n\n const ids = parsedIds\n .split(',')\n .map((id) => id.trim())\n .filter((id) => !!id)\n .map((id) => parseWorkspaceSchemaId(id, errors))\n .filter(isDefined)\n\n const uniqueIds = uniqBy(ids, 'schemaId' satisfies keyof (typeof ids)[number])\n if (uniqueIds.length < ids.length) {\n errors.push(`ids contains duplicates`)\n }\n if (!errors.length && !uniqueIds.length) {\n errors.push(`ids contains no valid id strings`)\n }\n return uniqueIds\n}\n\nexport function parseId(flags: {id?: unknown}, errors: string[]) {\n const id = flags.id === undefined ? undefined : parseNonEmptyString(flags, 'id', errors)\n if (id) {\n return parseWorkspaceSchemaId(id, errors)?.schemaId\n }\n return undefined\n}\n\nexport function parseWorkspaceSchemaId(id: string, errors: string[]) {\n const trimmedId = id.trim()\n\n if (!trimmedId.match(validForIdPattern)) {\n errors.push(`id can only contain characters in [${validForIdChars}] but found: \"${trimmedId}\"`)\n return undefined\n }\n\n if (trimmedId.startsWith('-')) {\n errors.push(`id cannot start with - (dash) but found: \"${trimmedId}\"`)\n return undefined\n }\n\n if (trimmedId.match(/\\.\\./g)) {\n errors.push(`id cannot have consecutive . (period) characters, but found: \"${trimmedId}\"`)\n return undefined\n }\n const [fullMatch, workspace, tag] =\n trimmedId.match(taggedIdIdPattern) ?? trimmedId.match(baseIdPattern) ?? []\n if (!workspace) {\n errors.push(\n [\n `id must either match ${SANITY_WORKSPACE_SCHEMA_ID_PREFIX}.<workspaceName> `,\n `or ${SANITY_WORKSPACE_SCHEMA_ID_PREFIX}.<workspaceName>.tag.<tag> but found: \"${trimmedId}\". `,\n `Note that workspace name characters not in [${validForNamesChars}] has to be replaced with _ for schema id.`,\n ].join(''),\n )\n return undefined\n }\n return {\n schemaId: trimmedId,\n workspace,\n }\n}\n\nfunction parseDataset(flags: {dataset?: unknown}, errors: string[]) {\n return flags.dataset === undefined ? undefined : parseNonEmptyString(flags, 'dataset', errors)\n}\n\nfunction parseWorkspace(flags: {workspace?: unknown}, errors: string[]) {\n return flags.workspace === undefined ? undefined : parseNonEmptyString(flags, 'workspace', errors)\n}\n\nfunction parseManifestDir(flags: {'manifest-dir'?: unknown}, errors: string[]) {\n return flags['manifest-dir'] === undefined\n ? undefined\n : parseNonEmptyString(flags, 'manifest-dir', errors)\n}\n\nexport function parseTag(flags: {tag?: unknown}, errors: string[]) {\n if (flags.tag === undefined) {\n return undefined\n }\n\n const tag = parseNonEmptyString(flags, 'tag', errors)\n if (errors.length) {\n return undefined\n }\n\n if (tag.includes('.')) {\n errors.push(`tag cannot contain . (period), but was: \"${tag}\"`)\n return undefined\n }\n\n if (!tag.match(validForNamesPattern)) {\n errors.push(`tag can only contain characters in [${validForNamesChars}], but was: \"${tag}\"`)\n return undefined\n }\n\n if (tag.startsWith('-')) {\n errors.push(`tag cannot start with - (dash) but was: \"${tag}\"`)\n return undefined\n }\n\n return tag\n}\n\nfunction parseNonEmptyString<\n Flag extends string,\n Flags extends Partial<Record<Flag, unknown | undefined>>,\n>(flags: Flags, flagName: Flag, errors: string[]): string {\n const flag = flags[flagName]\n if (!isString(flag) || !flag) {\n errors.push(`${flagName} argument is empty`)\n return ''\n }\n return flag\n}\n\nfunction isString(flag: unknown): flag is string {\n return typeof flag === 'string'\n}\n\nexport const SCHEMA_PERMISSION_HELP_TEXT =\n 'For multi-project workspaces, set SANITY_AUTH_TOKEN environment variable to a token with access to the workspace projects.'\n","import {\n type CliCommandArguments,\n type CliCommandContext,\n type CliOutputter,\n type TelemetryUserProperties,\n} from '@sanity/cli'\nimport {type TelemetryLogger} from '@sanity/telemetry'\nimport chalk from 'chalk'\n\nimport {type ExtractManifestFlags, extractManifestSafe} from '../../manifest/extractManifestAction'\nimport {GenerateManifest} from '../__telemetry__/schemaStore.telemetry'\nimport {FlagValidationError} from './schemaStoreValidation'\n\nexport type ManifestExtractor = (manifestDir: string) => Promise<void>\n\nexport async function ensureManifestExtractSatisfied(args: {\n schemaRequired: boolean\n extractManifest: boolean\n manifestDir: string\n manifestExtractor: (manifestDir: string) => Promise<void>\n output: CliOutputter\n telemetry: TelemetryLogger<TelemetryUserProperties>\n}) {\n const {schemaRequired, extractManifest, manifestDir, manifestExtractor, output, telemetry} = args\n if (!extractManifest) {\n return true\n }\n const trace = telemetry.trace(GenerateManifest, {manifestDir, schemaRequired})\n try {\n trace.start()\n // a successful manifest extract will write a new manifest file, which manifestReader will then read from disk\n await manifestExtractor(manifestDir)\n trace.complete()\n return true\n } catch (err) {\n trace.error(err)\n\n if (schemaRequired || err instanceof FlagValidationError) {\n throw err\n } else {\n output.print(chalk.gray(`↳ Failed to extract manifest:\\n ${err.message}`))\n return false\n }\n }\n}\n\nexport function createManifestExtractor(context: CliCommandContext & {safe?: boolean}) {\n return async (manifestDir: string) => {\n const error = await extractManifestSafe(\n {\n extOptions: {path: manifestDir},\n groupOrCommand: 'extract',\n argv: [],\n argsWithoutOptions: [],\n extraArguments: [],\n } as CliCommandArguments<ExtractManifestFlags>,\n context,\n )\n if (!context.safe && error) {\n throw error\n }\n }\n}\n","import {type CliApiClient} from '@sanity/cli'\n\nexport function createSchemaApiClient(apiClient: CliApiClient) {\n const client = apiClient({\n requireUser: true,\n requireProject: true,\n }).withConfig({apiVersion: 'v2025-03-01', useCdn: false})\n\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n if (!projectId) throw new Error('Project ID is not defined')\n if (!dataset) throw new Error('Dataset is not defined')\n\n return {\n client,\n projectId,\n dataset,\n }\n}\n","export function getProjectIdDatasetsOutString(\n projectIdDatasets: {projectId: string; dataset: string}[],\n) {\n return projectIdDatasets.length === 1\n ? `${projectIdDatasetPair(projectIdDatasets[0])}`\n : `${getStringArrayOutString(projectIdDatasets.map(projectIdDatasetPair))}`\n}\n\nexport function projectIdDatasetPair(pair: {projectId: string; dataset: string}) {\n return JSON.stringify({projectId: pair.projectId, dataset: pair.dataset})\n}\n\nexport function getStringArrayOutString(array: string[]) {\n return `[${array.map((d) => `\"${d}\"`).join(',')}]`\n}\n\nexport function getStringList(array: string[]) {\n return array.map((s) => `- ${s}`).join('\\n')\n}\n"],"names":["SANITY_WORKSPACE_SCHEMA_ID_PREFIX","CURRENT_WORKSPACE_SCHEMA_VERSION","GenerateManifest","defineTrace","name","version","description","SchemaDeploy","isDefined","value","createManifestReader","manifestDir","output","jsonReader","parseJsonFile","parsedManifest","parsedWorkspaces","getManifest","parsedJson","manifestFile","path","join","MANIFEST_FILENAME","result","Error","print","chalk","gray","lastModified","getWorkspaceSchema","workspaceName","manifest","workspaceManifest","workspaces","find","workspace","workspaceSchemaFile","schema","resolveManifestDirectory","workDir","customPath","defaultOutputDir","resolve","outputDir","defaultStaticPath","staticPath","process","cwd","filePath","stats","stat","content","readFile","mtime","toISOString","json","JSON","parse","validForIdChars","validForIdPattern","RegExp","validForNamesChars","validForNamesPattern","requiredInId","replace","idIdPatternString","baseIdPattern","taggedIdIdPattern","FlagValidationError","constructor","message","parseCommonFlags","flags","context","errors","parseManifestDir","verbose","extractManifest","parseDeploySchemasConfig","commonFlags","parseWorkspace","tag","parseTag","schemaRequired","assertNoErrors","parseListSchemasConfig","id","parseId","parseDeleteSchemasConfig","ids","parseIds","dataset","parseDataset","length","map","error","parsedIds","parseNonEmptyString","split","trim","filter","parseWorkspaceSchemaId","uniqueIds","uniqBy","push","undefined","schemaId","trimmedId","match","startsWith","fullMatch","includes","flagName","flag","isString","SCHEMA_PERMISSION_HELP_TEXT","ensureManifestExtractSatisfied","args","manifestExtractor","telemetry","trace","start","complete","err","createManifestExtractor","extractManifestSafe","extOptions","groupOrCommand","argv","argsWithoutOptions","extraArguments","safe","createSchemaApiClient","apiClient","client","requireUser","requireProject","withConfig","apiVersion","useCdn","projectId","config","getProjectIdDatasetsOutString","projectIdDatasets","projectIdDatasetPair","getStringArrayOutString","pair","stringify","array","d","getStringList","s"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgradePackages.js","sources":["../../src/_internal/cli/util/checkStudioDependencyVersions.ts","../../src/_internal/cli/util/checkRequiredDependencies.ts","../../src/_internal/cli/util/packageManager/packageManagerChoice.ts","../../src/_internal/cli/util/packageManager/upgradePackages.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {generateHelpUrl} from '@sanity/generate-help-url'\nimport resolveFrom from 'resolve-from'\nimport semver, {type SemVer} from 'semver'\n\nimport {readPackageJson, readPackageManifest} from './readPackageManifest'\n\ninterface PackageInfo {\n name: string\n supported: string[]\n deprecatedBelow: null | string\n installed: SemVer\n isUnsupported: boolean\n isDeprecated: boolean\n isUntested: boolean\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 {name: 'react', supported: ['^19.2.2'], deprecatedBelow: null},\n {name: 'react-dom', supported: ['^19.2.2'], deprecatedBelow: null},\n {name: 'styled-components', supported: ['^6'], deprecatedBelow: null},\n {name: '@sanity/ui', supported: ['^2', '^3'], deprecatedBelow: '^3'},\n]\n\nexport async function checkStudioDependencyVersions(workDir: string): Promise<void> {\n const manifest = await readPackageJson(path.join(workDir, 'package.json'))\n const dependencies = {...manifest.dependencies, ...manifest.devDependencies}\n\n const packageInfo = PACKAGES.map(async (pkg): Promise<PackageInfo | false> => {\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 readPackageManifest(manifestPath)).version\n : dependency.replace(/[\\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@20.0.0, but we've only _tested_ with react@^19\n const isUntested = !semver.satisfies(installed, supported) && semver.gtr(installed, supported)\n\n // \"Unsupported\" in that the installed version is _lower than_ the minimum version\n // Ex: Installed is react@18.0.0, but we require react@^19.2\n const isUnsupported = !semver.satisfies(installed, supported) && !isUntested\n\n // \"Deprecated\" in that we will stop supporting it at some point in the near future,\n // so users should be prompted to upgrade\n const isDeprecated = pkg.deprecatedBelow ? semver.ltr(installed, pkg.deprecatedBelow) : false\n\n return {\n ...pkg,\n installed,\n isUnsupported,\n isDeprecated,\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 console.warn(`\n[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 console.warn(`\n[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 console.error(`\n[ERROR] The following package versions are no longer supported and needs to be upgraded:\n\n ${listPackages(unsupported)}\n\n ${getUpgradeInstructions(unsupported)}\n`)\n process.exit(1)\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 [recommendedVersion] = pkg.supported\n .concat(pkg.deprecatedBelow || [])\n .map((version) => (semver.coerce(version) || {version: ''}).version)\n .sort(semver.rcompare)\n\n return `\"${pkg.name}@^${recommendedVersion}\"`\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 ${generateHelpUrl('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 .sort(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","import path from 'node:path'\n\nimport {type CliCommandContext} from '@sanity/cli'\nimport execa from 'execa'\nimport oneline from 'oneline'\nimport semver, {type SemVer} from 'semver'\n\nimport {peerDependencies} from '../../../../package.json'\nimport {determineIsApp} from './determineIsApp'\nimport {readModuleVersion} from './readModuleVersion'\nimport {type PartialPackageManifest, readPackageManifest} from './readPackageManifest'\n\nconst defaultStudioManifestProps: PartialPackageManifest = {\n name: 'studio',\n version: '1.0.0',\n}\n\ninterface CheckResult {\n didInstall: boolean\n installedSanityVersion: string\n}\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 want to prompt the user\n * whether or not to add them to `package.json` and install them\n *\n * Additionally, returns the version of the 'sanity' dependency from the package.json.\n */\nexport async function checkRequiredDependencies(context: CliCommandContext): Promise<CheckResult> {\n // currently there's no check needed for custom apps,\n // but this should be removed once they are more mature\n const isApp = determineIsApp(context.cliConfig)\n if (isApp) {\n return {didInstall: false, installedSanityVersion: ''}\n }\n\n const {workDir: studioPath, output} = context\n const [studioPackageManifest, installedStyledComponentsVersion, installedSanityVersion] =\n await Promise.all([\n await readPackageManifest(path.join(studioPath, 'package.json'), defaultStudioManifestProps),\n await readModuleVersion(studioPath, 'styled-components'),\n await readModuleVersion(studioPath, 'sanity'),\n ])\n\n const wantedStyledComponentsVersionRange = peerDependencies['styled-components']\n\n // Retrieve the version of the 'sanity' dependency\n if (!installedSanityVersion) {\n throw new Error('Failed to read the installed sanity version.')\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 const [file, ...args] = process.argv\n const deps = {'styled-components': wantedStyledComponentsVersionRange}\n await installDependencies(deps, context)\n\n // Re-run the same command (sanity dev/sanity build etc) after installation,\n // as it can have shifted the entire `node_modules` folder around, result in\n // broken assumptions about installation paths. This is a hack, and should be\n // solved properly.\n await execa(file, args, {cwd: studioPath, stdio: 'inherit'})\n return {didInstall: true, installedSanityVersion}\n }\n\n // We ignore catalog identifiers since we check the actual version anyway\n const isStyledComponentsVersionRangeInCatalog =\n declaredStyledComponentsVersion.startsWith('catalog:')\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 (err) {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredStyledComponentsVersion && !isStyledComponentsVersionRangeInCatalog) {\n throw new Error(oneline`\n Declared dependency \\`styled-components\\` has an invalid version range:\n \\`${declaredStyledComponentsVersion}\\`.\n `)\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 !isStyledComponentsVersionRangeInCatalog &&\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 throw new Error(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 }\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 {didInstall: false, installedSanityVersion}\n}\n\n/**\n * Install the passed dependencies at the given version/version range,\n * prompting the user which package manager to use. We will try to detect\n * a package manager from files in the directory and show that as the default\n *\n * @param dependencies - Object of dependencies `({[package name]: version})`\n * @param context - CLI context\n */\nasync function installDependencies(\n dependencies: Record<string, string>,\n context: CliCommandContext,\n): Promise<void> {\n const {output, prompt, workDir, cliPackageManager} = context\n const packages: string[] = []\n\n output.print('The Sanity studio needs to install missing dependencies:')\n for (const [pkgName, version] of Object.entries(dependencies)) {\n const declaration = `${pkgName}@${version}`\n output.print(`- ${declaration}`)\n packages.push(declaration)\n }\n\n if (!cliPackageManager) {\n output.error(\n 'ERROR: Could not determine package manager choice - run `npm install` or equivalent',\n )\n return\n }\n\n const {getPackageManagerChoice, installNewPackages} = cliPackageManager\n const {mostOptimal, chosen: pkgManager} = await getPackageManagerChoice(workDir, {prompt})\n if (mostOptimal && pkgManager !== mostOptimal) {\n output.warn(\n `WARN: This project appears to be installed with or using ${mostOptimal} - using a different package manager _may_ result in errors.`,\n )\n }\n\n await installNewPackages({packages, packageManager: pkgManager}, context)\n}\n\nfunction isComparableRange(range: string): boolean {\n return /^[\\^~]?\\d+(\\.\\d+)?(\\.\\d+)?$/.test(range)\n}\n","import path from 'node:path'\n\nimport {type CliPrompter} from '@sanity/cli'\nimport preferredPM from 'preferred-pm'\nimport which from 'which'\n\nimport {isInteractive} from '../isInteractive'\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun' | 'manual'\n\nexport const ALLOWED_PACKAGE_MANAGERS: PackageManager[] = ['npm', 'yarn', 'pnpm', 'bun', 'manual']\nexport const allowedPackageManagersString = ALLOWED_PACKAGE_MANAGERS.map((pm) => `\"${pm}\"`).join(\n ' | ',\n)\n\nconst EXPERIMENTAL = ['bun']\n\n/**\n * Attempts to resolve the most optimal package manager to use to install/upgrade\n * packages/dependencies at a given path. It does so by looking for package manager\n * specific lockfiles. If it finds a lockfile belonging to a certain package manager,\n * it prioritizes this one. However, if that package manager is not installed, it will\n * prompt the user for which one they want to use and hint at the most optimal one\n * not being installed.\n *\n * Note that this function also takes local npm binary paths into account - for instance,\n * `yarn` can be installed as a dependency of the project instead of globally, and it\n * will use that is available.\n *\n * The user can also select 'manual' to skip the process and run their preferred package\n * manager manually. Commands using this function must take this `manual` choice into\n * account and act accordingly if chosen.\n *\n * @param workDir - The working directory where a lockfile is most likely to be present\n * @param options - Pass `interactive: false` to fall back to npm if most optimal is\n * not available, instead of prompting\n * @returns Object of `chosen` and, if a lockfile is found, the `mostOptimal` choice\n */\nexport async function getPackageManagerChoice(\n workDir: string,\n options: {interactive: false} | {interactive?: true; prompt: CliPrompter},\n): Promise<{chosen: PackageManager; mostOptimal?: PackageManager}> {\n const rootDir = workDir || process.cwd()\n const preferred = (await preferredPM(rootDir))?.name\n\n if (preferred && (await hasCommand(preferred, rootDir))) {\n // There is an optimal/preferred package manager, and the user has it installed!\n return {chosen: preferred, mostOptimal: preferred}\n }\n\n const mostLikelyPM = await getMostLikelyInstalledPackageManager(rootDir)\n const interactive = typeof options.interactive === 'boolean' ? options.interactive : isInteractive\n if (!interactive) {\n // We can't ask the user for their preference, so fall back to either the one that is being run\n // or whatever is installed on the system (npm being the preferred choice).\n // Note that the most optimal choice is already picked above if available.\n return {chosen: mostLikelyPM || (await getFallback(rootDir)), mostOptimal: preferred}\n }\n\n if (!('prompt' in options)) {\n throw new Error('Must pass `prompt` when in interactive mode')\n }\n\n // We can ask the user for their preference, hurray!\n const messageSuffix = preferred ? ` (preferred is ${preferred}, but is not installed)` : ''\n const installed = await getAvailablePackageManagers(rootDir)\n const chosen = await options.prompt.single<PackageManager>({\n type: 'list',\n choices: installed.map((pm) => ({\n value: pm,\n name: EXPERIMENTAL.includes(pm) ? `${pm} (experimental)` : pm,\n })),\n default: preferred || mostLikelyPM,\n message: `Package manager to use for installing dependencies?${messageSuffix}`,\n })\n\n return {chosen, mostOptimal: preferred}\n}\n\nasync function getFallback(cwd: string): Promise<PackageManager> {\n if (await hasNpmInstalled(cwd)) {\n return 'npm'\n }\n\n if (await hasYarnInstalled(cwd)) {\n return 'yarn'\n }\n\n if (await hasPnpmInstalled(cwd)) {\n return 'pnpm'\n }\n\n if (await hasBunInstalled(cwd)) {\n return 'bun'\n }\n\n return 'manual'\n}\n\nasync function getAvailablePackageManagers(cwd: string): Promise<PackageManager[]> {\n const [npm, yarn, pnpm, bun] = await Promise.all([\n hasNpmInstalled(cwd),\n hasYarnInstalled(cwd),\n hasPnpmInstalled(cwd),\n hasBunInstalled(cwd),\n ])\n\n const choices = [npm && 'npm', yarn && 'yarn', pnpm && 'pnpm', bun && 'bun', 'manual']\n return choices.filter((pm): pm is PackageManager => pm !== false)\n}\n\nexport function hasNpmInstalled(cwd?: string): Promise<boolean> {\n return hasCommand('npm', cwd)\n}\n\nexport function hasYarnInstalled(cwd?: string): Promise<boolean> {\n return hasCommand('yarn', cwd)\n}\n\nexport function hasPnpmInstalled(cwd?: string): Promise<boolean> {\n return hasCommand('pnpm', cwd)\n}\n\nexport function hasBunInstalled(cwd?: string): Promise<boolean> {\n return hasCommand('bun', cwd)\n}\n\nexport function getNpmRunPath(cwd: string): string {\n let previous\n let cwdPath = path.resolve(cwd)\n const result: string[] = []\n\n while (previous !== cwdPath) {\n result.push(path.join(cwdPath, 'node_modules', '.bin'))\n previous = cwdPath\n cwdPath = path.resolve(cwdPath, '..')\n }\n\n result.push(path.resolve(cwd, process.execPath, '..'))\n\n const pathEnv = process.env[getPathEnvVarKey()]\n return [...result, pathEnv].join(path.delimiter)\n}\n\nexport function getPartialEnvWithNpmPath(cwd: string): NodeJS.ProcessEnv {\n const key = getPathEnvVarKey()\n return {[key]: getNpmRunPath(cwd)}\n}\n\nfunction getPathEnvVarKey(): string {\n if (process.platform !== 'win32') {\n return 'PATH'\n }\n\n return (\n Object.keys(process.env)\n .reverse()\n .find((key) => key.toUpperCase() === 'PATH') || 'Path'\n )\n}\n\nfunction getCommandPath(cmd: string, cwd?: string): Promise<string | null> {\n const options = {path: cwd ? getNpmRunPath(cwd) : undefined}\n return which(cmd, options).catch(() => null)\n}\n\nfunction hasCommand(cmd: string, cwd?: string): Promise<boolean> {\n return getCommandPath(cmd, cwd).then((cmdPath) => cmdPath !== null)\n}\n\nasync function getMostLikelyInstalledPackageManager(\n rootDir: string,\n): Promise<PackageManager | undefined> {\n const installed = await getAvailablePackageManagers(rootDir)\n const running = getRunningPackageManager()\n return running && installed.includes(running) ? running : undefined\n}\n\nfunction getRunningPackageManager(): PackageManager | undefined {\n // Yes, the env var is lowercase - it is set by the package managers themselves\n const agent = process.env.npm_config_user_agent || ''\n\n if (agent.includes('yarn')) {\n return 'yarn'\n }\n\n if (agent.includes('pnpm')) {\n return 'pnpm'\n }\n\n if (agent.includes('bun')) {\n return 'bun'\n }\n\n // Both yarn and pnpm does a `npm/?` thing, thus the slightly different match here\n // Theoretically not needed since we check for yarn/pnpm above, but in case other\n // package managers do the same thing, we'll (hopefully) catch them here.\n if (/^npm\\/\\d/.test(agent)) {\n return 'npm'\n }\n\n return undefined\n}\n","import execa, {type CommonOptions, type ExecaReturnValue} from 'execa'\n\nimport {getPartialEnvWithNpmPath, type PackageManager} from './packageManagerChoice'\n\nexport interface InstallOptions {\n packageManager: PackageManager\n packages: [name: string, version: string][]\n}\n\nexport async function upgradePackages(\n options: InstallOptions,\n context: {output: {print: (output: string) => void}; workDir: string},\n): Promise<void> {\n const {packageManager, packages} = options\n const {output, workDir} = context\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n env: getPartialEnvWithNpmPath(workDir),\n cwd: workDir,\n stdio: 'inherit',\n }\n const upgradePackageArgs = packages.map((pkg) => pkg.join('@'))\n let result: ExecaReturnValue<string> | undefined\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--legacy-peer-deps', ...upgradePackageArgs]\n output.print(`Running 'npm ${npmArgs.join(' ')}'`)\n result = await execa('npm', npmArgs, execOptions)\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['upgrade ', ...upgradePackageArgs]\n output.print(`Running 'yarn ${yarnArgs.join(' ')}'`)\n result = await execa('yarn', yarnArgs, execOptions)\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['upgrade', ...upgradePackageArgs]\n output.print(`Running 'pnpm ${pnpmArgs.join(' ')}'`)\n result = await execa('pnpm', pnpmArgs, execOptions)\n } else if (packageManager === 'bun') {\n const bunArgs = ['update', ...upgradePackageArgs]\n output.print(`Running 'bun ${bunArgs.join(' ')}'`)\n result = await execa('bun', bunArgs, execOptions)\n } else if (packageManager === 'manual') {\n output.print(\n `Manual installation selected - run 'npm upgrade ${upgradePackageArgs.join(' ')}' or equivalent`,\n )\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package upgrade failed')\n }\n}\n"],"names":["PACKAGES","name","supported","deprecatedBelow","checkStudioDependencyVersions","workDir","manifest","readPackageJson","path","join","dependencies","devDependencies","packageInfo","map","pkg","dependency","manifestPath","resolveFrom","silent","installed","semver","coerce","readPackageManifest","version","replace","isUntested","satisfies","gtr","isUnsupported","isDeprecated","ltr","installedPackages","Promise","all","filter","inp","unsupported","deprecated","untested","length","console","warn","listPackages","getUpgradeInstructions","getDowngradeInstructions","error","process","exit","pkgs","inst","recommendedVersion","concat","sort","rcompare","generateHelpUrl","highestSupported","defaultStudioManifestProps","checkRequiredDependencies","context","determineIsApp","cliConfig","didInstall","installedSanityVersion","studioPath","output","studioPackageManifest","installedStyledComponentsVersion","readModuleVersion","wantedStyledComponentsVersionRange","peerDependencies","Error","declaredStyledComponentsVersion","file","args","argv","installDependencies","execa","cwd","stdio","isStyledComponentsVersionRangeInCatalog","startsWith","minDeclaredStyledComponentsVersion","minVersion","oneline","isComparableRange","prompt","cliPackageManager","packages","print","pkgName","Object","entries","declaration","push","getPackageManagerChoice","installNewPackages","mostOptimal","chosen","pkgManager","packageManager","range","test","EXPERIMENTAL","options","rootDir","preferred","preferredPM","hasCommand","mostLikelyPM","getMostLikelyInstalledPackageManager","interactive","isInteractive","getFallback","messageSuffix","getAvailablePackageManagers","single","type","choices","pm","value","includes","default","message","hasNpmInstalled","hasYarnInstalled","hasPnpmInstalled","hasBunInstalled","npm","yarn","pnpm","bun","getNpmRunPath","previous","cwdPath","resolve","result","execPath","pathEnv","env","getPathEnvVarKey","delimiter","getPartialEnvWithNpmPath","platform","keys","reverse","find","key","toUpperCase","getCommandPath","cmd","undefined","which","catch","then","cmdPath","running","getRunningPackageManager","agent","npm_config_user_agent","upgradePackages","execOptions","encoding","upgradePackageArgs","npmArgs","yarnArgs","pnpmArgs","bunArgs","exitCode","failed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upgradePackages.js","sources":["../../src/_internal/cli/util/checkStudioDependencyVersions.ts","../../src/_internal/cli/util/checkRequiredDependencies.ts","../../src/_internal/cli/util/packageManager/packageManagerChoice.ts","../../src/_internal/cli/util/packageManager/upgradePackages.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {generateHelpUrl} from '@sanity/generate-help-url'\nimport resolveFrom from 'resolve-from'\nimport semver, {type SemVer} from 'semver'\n\nimport {readPackageJson, readPackageManifest} from './readPackageManifest'\n\ninterface PackageInfo {\n name: string\n supported: string[]\n deprecatedBelow: null | string\n installed: SemVer\n isUnsupported: boolean\n isDeprecated: boolean\n isUntested: boolean\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 {name: 'react', supported: ['^19.2.2'], deprecatedBelow: null},\n {name: 'react-dom', supported: ['^19.2.2'], deprecatedBelow: null},\n {name: 'styled-components', supported: ['^6'], deprecatedBelow: null},\n {name: '@sanity/ui', supported: ['^2', '^3'], deprecatedBelow: '^3'},\n]\n\nexport async function checkStudioDependencyVersions(workDir: string): Promise<void> {\n const manifest = await readPackageJson(path.join(workDir, 'package.json'))\n const dependencies = {...manifest.dependencies, ...manifest.devDependencies}\n\n const packageInfo = PACKAGES.map(async (pkg): Promise<PackageInfo | false> => {\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 readPackageManifest(manifestPath)).version\n : dependency.replace(/[\\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@20.0.0, but we've only _tested_ with react@^19\n const isUntested = !semver.satisfies(installed, supported) && semver.gtr(installed, supported)\n\n // \"Unsupported\" in that the installed version is _lower than_ the minimum version\n // Ex: Installed is react@18.0.0, but we require react@^19.2\n const isUnsupported = !semver.satisfies(installed, supported) && !isUntested\n\n // \"Deprecated\" in that we will stop supporting it at some point in the near future,\n // so users should be prompted to upgrade\n const isDeprecated = pkg.deprecatedBelow ? semver.ltr(installed, pkg.deprecatedBelow) : false\n\n return {\n ...pkg,\n installed,\n isUnsupported,\n isDeprecated,\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 console.warn(`\n[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 console.warn(`\n[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 console.error(`\n[ERROR] The following package versions are no longer supported and needs to be upgraded:\n\n ${listPackages(unsupported)}\n\n ${getUpgradeInstructions(unsupported)}\n`)\n process.exit(1)\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 [recommendedVersion] = pkg.supported\n .concat(pkg.deprecatedBelow || [])\n .map((version) => (semver.coerce(version) || {version: ''}).version)\n .sort(semver.rcompare)\n\n return `\"${pkg.name}@^${recommendedVersion}\"`\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 ${generateHelpUrl('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 .sort(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","import path from 'node:path'\n\nimport {type CliCommandContext} from '@sanity/cli'\nimport execa from 'execa'\nimport oneline from 'oneline'\nimport semver, {type SemVer} from 'semver'\n\nimport {peerDependencies} from '../../../../package.json'\nimport {determineIsApp} from './determineIsApp'\nimport {readModuleVersion} from './readModuleVersion'\nimport {type PartialPackageManifest, readPackageManifest} from './readPackageManifest'\n\nconst defaultStudioManifestProps: PartialPackageManifest = {\n name: 'studio',\n version: '1.0.0',\n}\n\ninterface CheckResult {\n didInstall: boolean\n installedSanityVersion: string\n}\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 want to prompt the user\n * whether or not to add them to `package.json` and install them\n *\n * Additionally, returns the version of the 'sanity' dependency from the package.json.\n */\nexport async function checkRequiredDependencies(context: CliCommandContext): Promise<CheckResult> {\n // currently there's no check needed for custom apps,\n // but this should be removed once they are more mature\n const isApp = determineIsApp(context.cliConfig)\n if (isApp) {\n return {didInstall: false, installedSanityVersion: ''}\n }\n\n const {workDir: studioPath, output} = context\n const [studioPackageManifest, installedStyledComponentsVersion, installedSanityVersion] =\n await Promise.all([\n await readPackageManifest(path.join(studioPath, 'package.json'), defaultStudioManifestProps),\n await readModuleVersion(studioPath, 'styled-components'),\n await readModuleVersion(studioPath, 'sanity'),\n ])\n\n const wantedStyledComponentsVersionRange = peerDependencies['styled-components']\n\n // Retrieve the version of the 'sanity' dependency\n if (!installedSanityVersion) {\n throw new Error('Failed to read the installed sanity version.')\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 const [file, ...args] = process.argv\n const deps = {'styled-components': wantedStyledComponentsVersionRange}\n await installDependencies(deps, context)\n\n // Re-run the same command (sanity dev/sanity build etc) after installation,\n // as it can have shifted the entire `node_modules` folder around, result in\n // broken assumptions about installation paths. This is a hack, and should be\n // solved properly.\n await execa(file, args, {cwd: studioPath, stdio: 'inherit'})\n return {didInstall: true, installedSanityVersion}\n }\n\n // We ignore catalog identifiers since we check the actual version anyway\n const isStyledComponentsVersionRangeInCatalog =\n declaredStyledComponentsVersion.startsWith('catalog:')\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 && !isStyledComponentsVersionRangeInCatalog) {\n throw new Error(oneline`\n Declared dependency \\`styled-components\\` has an invalid version range:\n \\`${declaredStyledComponentsVersion}\\`.\n `)\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 !isStyledComponentsVersionRangeInCatalog &&\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 throw new Error(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 }\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 {didInstall: false, installedSanityVersion}\n}\n\n/**\n * Install the passed dependencies at the given version/version range,\n * prompting the user which package manager to use. We will try to detect\n * a package manager from files in the directory and show that as the default\n *\n * @param dependencies - Object of dependencies `({[package name]: version})`\n * @param context - CLI context\n */\nasync function installDependencies(\n dependencies: Record<string, string>,\n context: CliCommandContext,\n): Promise<void> {\n const {output, prompt, workDir, cliPackageManager} = context\n const packages: string[] = []\n\n output.print('The Sanity studio needs to install missing dependencies:')\n for (const [pkgName, version] of Object.entries(dependencies)) {\n const declaration = `${pkgName}@${version}`\n output.print(`- ${declaration}`)\n packages.push(declaration)\n }\n\n if (!cliPackageManager) {\n output.error(\n 'ERROR: Could not determine package manager choice - run `npm install` or equivalent',\n )\n return\n }\n\n const {getPackageManagerChoice, installNewPackages} = cliPackageManager\n const {mostOptimal, chosen: pkgManager} = await getPackageManagerChoice(workDir, {prompt})\n if (mostOptimal && pkgManager !== mostOptimal) {\n output.warn(\n `WARN: This project appears to be installed with or using ${mostOptimal} - using a different package manager _may_ result in errors.`,\n )\n }\n\n await installNewPackages({packages, packageManager: pkgManager}, context)\n}\n\nfunction isComparableRange(range: string): boolean {\n return /^[\\^~]?\\d+(\\.\\d+)?(\\.\\d+)?$/.test(range)\n}\n","import path from 'node:path'\n\nimport {type CliPrompter} from '@sanity/cli'\nimport preferredPM from 'preferred-pm'\nimport which from 'which'\n\nimport {isInteractive} from '../isInteractive'\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun' | 'manual'\n\nexport const ALLOWED_PACKAGE_MANAGERS: PackageManager[] = ['npm', 'yarn', 'pnpm', 'bun', 'manual']\nexport const allowedPackageManagersString = ALLOWED_PACKAGE_MANAGERS.map((pm) => `\"${pm}\"`).join(\n ' | ',\n)\n\nconst EXPERIMENTAL = ['bun']\n\n/**\n * Attempts to resolve the most optimal package manager to use to install/upgrade\n * packages/dependencies at a given path. It does so by looking for package manager\n * specific lockfiles. If it finds a lockfile belonging to a certain package manager,\n * it prioritizes this one. However, if that package manager is not installed, it will\n * prompt the user for which one they want to use and hint at the most optimal one\n * not being installed.\n *\n * Note that this function also takes local npm binary paths into account - for instance,\n * `yarn` can be installed as a dependency of the project instead of globally, and it\n * will use that is available.\n *\n * The user can also select 'manual' to skip the process and run their preferred package\n * manager manually. Commands using this function must take this `manual` choice into\n * account and act accordingly if chosen.\n *\n * @param workDir - The working directory where a lockfile is most likely to be present\n * @param options - Pass `interactive: false` to fall back to npm if most optimal is\n * not available, instead of prompting\n * @returns Object of `chosen` and, if a lockfile is found, the `mostOptimal` choice\n */\nexport async function getPackageManagerChoice(\n workDir: string,\n options: {interactive: false} | {interactive?: true; prompt: CliPrompter},\n): Promise<{chosen: PackageManager; mostOptimal?: PackageManager}> {\n const rootDir = workDir || process.cwd()\n const preferred = (await preferredPM(rootDir))?.name\n\n if (preferred && (await hasCommand(preferred, rootDir))) {\n // There is an optimal/preferred package manager, and the user has it installed!\n return {chosen: preferred, mostOptimal: preferred}\n }\n\n const mostLikelyPM = await getMostLikelyInstalledPackageManager(rootDir)\n const interactive = typeof options.interactive === 'boolean' ? options.interactive : isInteractive\n if (!interactive) {\n // We can't ask the user for their preference, so fall back to either the one that is being run\n // or whatever is installed on the system (npm being the preferred choice).\n // Note that the most optimal choice is already picked above if available.\n return {chosen: mostLikelyPM || (await getFallback(rootDir)), mostOptimal: preferred}\n }\n\n if (!('prompt' in options)) {\n throw new Error('Must pass `prompt` when in interactive mode')\n }\n\n // We can ask the user for their preference, hurray!\n const messageSuffix = preferred ? ` (preferred is ${preferred}, but is not installed)` : ''\n const installed = await getAvailablePackageManagers(rootDir)\n const chosen = await options.prompt.single<PackageManager>({\n type: 'list',\n choices: installed.map((pm) => ({\n value: pm,\n name: EXPERIMENTAL.includes(pm) ? `${pm} (experimental)` : pm,\n })),\n default: preferred || mostLikelyPM,\n message: `Package manager to use for installing dependencies?${messageSuffix}`,\n })\n\n return {chosen, mostOptimal: preferred}\n}\n\nasync function getFallback(cwd: string): Promise<PackageManager> {\n if (await hasNpmInstalled(cwd)) {\n return 'npm'\n }\n\n if (await hasYarnInstalled(cwd)) {\n return 'yarn'\n }\n\n if (await hasPnpmInstalled(cwd)) {\n return 'pnpm'\n }\n\n if (await hasBunInstalled(cwd)) {\n return 'bun'\n }\n\n return 'manual'\n}\n\nasync function getAvailablePackageManagers(cwd: string): Promise<PackageManager[]> {\n const [npm, yarn, pnpm, bun] = await Promise.all([\n hasNpmInstalled(cwd),\n hasYarnInstalled(cwd),\n hasPnpmInstalled(cwd),\n hasBunInstalled(cwd),\n ])\n\n const choices = [npm && 'npm', yarn && 'yarn', pnpm && 'pnpm', bun && 'bun', 'manual']\n return choices.filter((pm): pm is PackageManager => pm !== false)\n}\n\nexport function hasNpmInstalled(cwd?: string): Promise<boolean> {\n return hasCommand('npm', cwd)\n}\n\nexport function hasYarnInstalled(cwd?: string): Promise<boolean> {\n return hasCommand('yarn', cwd)\n}\n\nexport function hasPnpmInstalled(cwd?: string): Promise<boolean> {\n return hasCommand('pnpm', cwd)\n}\n\nexport function hasBunInstalled(cwd?: string): Promise<boolean> {\n return hasCommand('bun', cwd)\n}\n\nexport function getNpmRunPath(cwd: string): string {\n let previous\n let cwdPath = path.resolve(cwd)\n const result: string[] = []\n\n while (previous !== cwdPath) {\n result.push(path.join(cwdPath, 'node_modules', '.bin'))\n previous = cwdPath\n cwdPath = path.resolve(cwdPath, '..')\n }\n\n result.push(path.resolve(cwd, process.execPath, '..'))\n\n const pathEnv = process.env[getPathEnvVarKey()]\n return [...result, pathEnv].join(path.delimiter)\n}\n\nexport function getPartialEnvWithNpmPath(cwd: string): NodeJS.ProcessEnv {\n const key = getPathEnvVarKey()\n return {[key]: getNpmRunPath(cwd)}\n}\n\nfunction getPathEnvVarKey(): string {\n if (process.platform !== 'win32') {\n return 'PATH'\n }\n\n return (\n Object.keys(process.env)\n .reverse()\n .find((key) => key.toUpperCase() === 'PATH') || 'Path'\n )\n}\n\nfunction getCommandPath(cmd: string, cwd?: string): Promise<string | null> {\n const options = {path: cwd ? getNpmRunPath(cwd) : undefined}\n return which(cmd, options).catch(() => null)\n}\n\nfunction hasCommand(cmd: string, cwd?: string): Promise<boolean> {\n return getCommandPath(cmd, cwd).then((cmdPath) => cmdPath !== null)\n}\n\nasync function getMostLikelyInstalledPackageManager(\n rootDir: string,\n): Promise<PackageManager | undefined> {\n const installed = await getAvailablePackageManagers(rootDir)\n const running = getRunningPackageManager()\n return running && installed.includes(running) ? running : undefined\n}\n\nfunction getRunningPackageManager(): PackageManager | undefined {\n // Yes, the env var is lowercase - it is set by the package managers themselves\n const agent = process.env.npm_config_user_agent || ''\n\n if (agent.includes('yarn')) {\n return 'yarn'\n }\n\n if (agent.includes('pnpm')) {\n return 'pnpm'\n }\n\n if (agent.includes('bun')) {\n return 'bun'\n }\n\n // Both yarn and pnpm does a `npm/?` thing, thus the slightly different match here\n // Theoretically not needed since we check for yarn/pnpm above, but in case other\n // package managers do the same thing, we'll (hopefully) catch them here.\n if (/^npm\\/\\d/.test(agent)) {\n return 'npm'\n }\n\n return undefined\n}\n","import execa, {type CommonOptions, type ExecaReturnValue} from 'execa'\n\nimport {getPartialEnvWithNpmPath, type PackageManager} from './packageManagerChoice'\n\nexport interface InstallOptions {\n packageManager: PackageManager\n packages: [name: string, version: string][]\n}\n\nexport async function upgradePackages(\n options: InstallOptions,\n context: {output: {print: (output: string) => void}; workDir: string},\n): Promise<void> {\n const {packageManager, packages} = options\n const {output, workDir} = context\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n env: getPartialEnvWithNpmPath(workDir),\n cwd: workDir,\n stdio: 'inherit',\n }\n const upgradePackageArgs = packages.map((pkg) => pkg.join('@'))\n let result: ExecaReturnValue | undefined\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--legacy-peer-deps', ...upgradePackageArgs]\n output.print(`Running 'npm ${npmArgs.join(' ')}'`)\n result = await execa('npm', npmArgs, execOptions)\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['upgrade ', ...upgradePackageArgs]\n output.print(`Running 'yarn ${yarnArgs.join(' ')}'`)\n result = await execa('yarn', yarnArgs, execOptions)\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['upgrade', ...upgradePackageArgs]\n output.print(`Running 'pnpm ${pnpmArgs.join(' ')}'`)\n result = await execa('pnpm', pnpmArgs, execOptions)\n } else if (packageManager === 'bun') {\n const bunArgs = ['update', ...upgradePackageArgs]\n output.print(`Running 'bun ${bunArgs.join(' ')}'`)\n result = await execa('bun', bunArgs, execOptions)\n } else if (packageManager === 'manual') {\n output.print(\n `Manual installation selected - run 'npm upgrade ${upgradePackageArgs.join(' ')}' or equivalent`,\n )\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package upgrade failed')\n }\n}\n"],"names":["PACKAGES","name","supported","deprecatedBelow","checkStudioDependencyVersions","workDir","manifest","readPackageJson","path","join","dependencies","devDependencies","packageInfo","map","pkg","dependency","manifestPath","resolveFrom","silent","installed","semver","coerce","readPackageManifest","version","replace","isUntested","satisfies","gtr","isUnsupported","isDeprecated","ltr","installedPackages","Promise","all","filter","inp","unsupported","deprecated","untested","length","console","warn","listPackages","getUpgradeInstructions","getDowngradeInstructions","error","process","exit","pkgs","inst","recommendedVersion","concat","sort","rcompare","generateHelpUrl","highestSupported","defaultStudioManifestProps","checkRequiredDependencies","context","determineIsApp","cliConfig","didInstall","installedSanityVersion","studioPath","output","studioPackageManifest","installedStyledComponentsVersion","readModuleVersion","wantedStyledComponentsVersionRange","peerDependencies","Error","declaredStyledComponentsVersion","file","args","argv","installDependencies","execa","cwd","stdio","isStyledComponentsVersionRangeInCatalog","startsWith","minDeclaredStyledComponentsVersion","minVersion","oneline","isComparableRange","prompt","cliPackageManager","packages","print","pkgName","Object","entries","declaration","push","getPackageManagerChoice","installNewPackages","mostOptimal","chosen","pkgManager","packageManager","range","test","EXPERIMENTAL","options","rootDir","preferred","preferredPM","hasCommand","mostLikelyPM","getMostLikelyInstalledPackageManager","interactive","isInteractive","getFallback","messageSuffix","getAvailablePackageManagers","single","type","choices","pm","value","includes","default","message","hasNpmInstalled","hasYarnInstalled","hasPnpmInstalled","hasBunInstalled","npm","yarn","pnpm","bun","getNpmRunPath","previous","cwdPath","resolve","result","execPath","pathEnv","env","getPathEnvVarKey","delimiter","getPartialEnvWithNpmPath","platform","keys","reverse","find","key","toUpperCase","getCommandPath","cmd","undefined","which","catch","then","cmdPath","running","getRunningPackageManager","agent","npm_config_user_agent","upgradePackages","execOptions","encoding","upgradePackageArgs","npmArgs","yarnArgs","pnpmArgs","bunArgs","exitCode","failed"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ try {
|
|
|
7
7
|
try {
|
|
8
8
|
buildVersion = buildVersion || // This is replaced by `@sanity/pkg-utils` at build time
|
|
9
9
|
// and must always be references by its full static name, e.g. no optional chaining, no `if (process && process.env)` etc.
|
|
10
|
-
"5.3.0-next.
|
|
10
|
+
"5.3.0-next.28+d67c58fe99";
|
|
11
11
|
} catch {
|
|
12
12
|
}
|
|
13
13
|
const SANITY_VERSION = buildVersion || `${version}-dev`;
|
package/lib/_singletons.d.ts
CHANGED
|
@@ -14368,7 +14368,7 @@ declare type StudioColorScheme = ThemeColorSchemeKey | 'system'
|
|
|
14368
14368
|
* @hidden
|
|
14369
14369
|
* @beta */
|
|
14370
14370
|
declare interface StudioComponents {
|
|
14371
|
-
layout: ComponentType
|
|
14371
|
+
layout: ComponentType
|
|
14372
14372
|
/**
|
|
14373
14373
|
* @deprecated Add custom icons on a per-workspace basis by customizing workspace `icon` instead.
|
|
14374
14374
|
* @see {@link https://www.sanity.io/docs/workspaces}
|
|
@@ -14382,7 +14382,7 @@ declare interface StudioComponents {
|
|
|
14382
14382
|
* @hidden
|
|
14383
14383
|
* @beta */
|
|
14384
14384
|
declare interface StudioComponents_2 {
|
|
14385
|
-
layout: ComponentType
|
|
14385
|
+
layout: ComponentType
|
|
14386
14386
|
/**
|
|
14387
14387
|
* @deprecated Add custom icons on a per-workspace basis by customizing workspace `icon` instead.
|
|
14388
14388
|
* @see {@link https://www.sanity.io/docs/workspaces}
|
package/lib/desk.d.ts
CHANGED
|
@@ -12447,7 +12447,7 @@ declare interface StructureToolProviderProps {
|
|
|
12447
12447
|
* @hidden
|
|
12448
12448
|
* @beta */
|
|
12449
12449
|
declare interface StudioComponents {
|
|
12450
|
-
layout: ComponentType
|
|
12450
|
+
layout: ComponentType
|
|
12451
12451
|
/**
|
|
12452
12452
|
* @deprecated Add custom icons on a per-workspace basis by customizing workspace `icon` instead.
|
|
12453
12453
|
* @see {@link https://www.sanity.io/docs/workspaces}
|
package/lib/index.d.ts
CHANGED
|
@@ -2770,7 +2770,7 @@ export declare interface CommentInputProps {
|
|
|
2770
2770
|
onDiscardCancel?: () => void
|
|
2771
2771
|
onDiscardConfirm: () => void
|
|
2772
2772
|
onFocus?: (e: FormEvent<HTMLDivElement>) => void
|
|
2773
|
-
onKeyDown?: (e: KeyboardEvent_2
|
|
2773
|
+
onKeyDown?: (e: KeyboardEvent_2) => void
|
|
2774
2774
|
onMentionMenuOpenChange?: (open: boolean) => void
|
|
2775
2775
|
onSubmit?: () => void
|
|
2776
2776
|
placeholder?: ReactNode
|
|
@@ -6621,7 +6621,7 @@ export declare interface FormFieldValidationStatusProps {
|
|
|
6621
6621
|
* @beta
|
|
6622
6622
|
*/
|
|
6623
6623
|
__unstable_showSummary?: boolean
|
|
6624
|
-
fontSize?: number
|
|
6624
|
+
fontSize?: number
|
|
6625
6625
|
placement?: Placement
|
|
6626
6626
|
}
|
|
6627
6627
|
|
|
@@ -7202,9 +7202,7 @@ export declare function getTemplatePermissions({
|
|
|
7202
7202
|
templates,
|
|
7203
7203
|
schema,
|
|
7204
7204
|
context,
|
|
7205
|
-
}: TemplatePermissionsOptions): Observable<
|
|
7206
|
-
Array<TemplatePermissionsResult<Record<string, unknown>>>
|
|
7207
|
-
>
|
|
7205
|
+
}: TemplatePermissionsOptions): Observable<Array<TemplatePermissionsResult>>
|
|
7208
7206
|
|
|
7209
7207
|
/** @internal */
|
|
7210
7208
|
export declare function getValueAtPath(rootValue: unknown, path: Path): unknown
|
|
@@ -13081,7 +13079,7 @@ declare type StudioColorScheme = ThemeColorSchemeKey | 'system'
|
|
|
13081
13079
|
* @hidden
|
|
13082
13080
|
* @beta */
|
|
13083
13081
|
export declare interface StudioComponents {
|
|
13084
|
-
layout: ComponentType
|
|
13082
|
+
layout: ComponentType
|
|
13085
13083
|
/**
|
|
13086
13084
|
* @deprecated Add custom icons on a per-workspace basis by customizing workspace `icon` instead.
|
|
13087
13085
|
* @see {@link https://www.sanity.io/docs/workspaces}
|
|
@@ -16434,7 +16432,7 @@ export declare function useColorSchemeInternalValue(): StudioThemeColorSchemeKey
|
|
|
16434
16432
|
*/
|
|
16435
16433
|
export declare function useColorSchemeOptions(
|
|
16436
16434
|
setScheme: (nextScheme: StudioThemeColorSchemeKey) => void,
|
|
16437
|
-
t: TFunction<'studio'
|
|
16435
|
+
t: TFunction<'studio'>,
|
|
16438
16436
|
): ColorSchemeOption[]
|
|
16439
16437
|
|
|
16440
16438
|
/** @alpha */
|
|
@@ -16786,7 +16784,7 @@ export declare function useEditState(
|
|
|
16786
16784
|
publishedDocId: string,
|
|
16787
16785
|
docTypeName: string,
|
|
16788
16786
|
priority?: 'default' | 'low',
|
|
16789
|
-
version?: string
|
|
16787
|
+
version?: string,
|
|
16790
16788
|
): EditStateFor
|
|
16791
16789
|
|
|
16792
16790
|
/**
|