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":"extractAction.js","sources":["../../src/_internal/cli/util/importErrorHandler.ts","../../src/_internal/cli/util/mockBrowserEnvironment.ts","../../src/_internal/cli/util/getStudioWorkspaces.ts","../../src/_internal/cli/actions/schema/extractSchema.telemetry.ts","../../src/_internal/cli/actions/schema/extractAction.ts"],"sourcesContent":["import Module from 'node:module'\n\nexport interface ImportErrorHandlerResult {\n cleanup: () => void\n}\n\n// Module._load is an internal Node.js API not exposed in types\ninterface ModuleConstructor {\n _load(request: string, parent: Module | undefined, isMain: boolean): any\n}\n\n/**\n * Return safe empty module with Proxy for deep property access. This ensures any property\n * access or function call returns a safe value\n */\nfunction getProxyHandler() {\n const handler: ProxyHandler<object> = {\n get: (_target, prop) => {\n if (prop === '__esModule') return true\n if (prop === 'default') return new Proxy({}, handler)\n return new Proxy({}, handler)\n },\n apply: () => new Proxy({}, handler),\n }\n return new Proxy({}, handler)\n}\n\n/**\n * Sets up a Module._load wrapper to silently ignore imports from https://themer.sanity.build\n * This allows users to use themer URL imports in their config without breaking CLI commands.\n *\n * @returns Handler result with cleanup function\n * @internal\n */\nexport function setupImportErrorHandler(): ImportErrorHandlerResult {\n // Store original Module._load\n const ModuleConstructor = Module as unknown as ModuleConstructor\n const originalLoad = ModuleConstructor._load\n\n // Override Module._load to catch and handle themer.sanity.build imports\n ModuleConstructor._load = function (\n request: string,\n parent: Module | undefined,\n isMain: boolean,\n ) {\n try {\n return originalLoad.call(this, request, parent, isMain)\n } catch (error) {\n // Check if this is a themer.sanity.build URL import\n if (request.startsWith('https://themer.sanity.build/api/')) {\n // Return a safe proxy object that can be used in place of the theme\n return getProxyHandler()\n }\n\n // Re-throw all other errors\n throw error\n }\n }\n\n return {\n cleanup: () => {\n ModuleConstructor._load = originalLoad\n },\n }\n}\n","import {createRequire, register} from 'node:module'\nimport {pathToFileURL} from 'node:url'\n\nimport {ResizeObserver} from '@juggle/resize-observer'\nimport {register as registerESBuild} from 'esbuild-register/dist/node'\nimport jsdomGlobal from 'jsdom-global'\nimport {addHook} from 'pirates'\nimport resolveFrom from 'resolve-from'\n\nimport {getStudioEnvironmentVariables} from '../server/getStudioEnvironmentVariables'\nimport {setupImportErrorHandler} from './importErrorHandler'\n\nconst require = createRequire(import.meta.url)\n\n// Handle require(esm) cases that breaks free from esbuild-register+pirates\nregister(\n './mock-browser-env-stub-loader.mjs',\n pathToFileURL(require.resolve('sanity/package.json')),\n)\n\nconst jsdomDefaultHtml = `<!doctype html>\n<html>\n <head><meta charset=\"utf-8\"></head>\n <body></body>\n</html>`\n\nexport function mockBrowserEnvironment(basePath: string): () => void {\n // Guard against double-registering\n if (global && global.window && '__mockedBySanity' in global.window) {\n return () => {\n /* intentional noop */\n }\n }\n\n // Set up import error handler before esbuild-register to silently ignore themer.sanity.build URLs\n const importErrorHandler = setupImportErrorHandler()\n\n const btoa = global.btoa\n const domCleanup = jsdomGlobal(jsdomDefaultHtml, {url: 'http://localhost:3333/'})\n\n // Don't use jsdom's btoa as it's using the deprecatd `abab` package.\n if (typeof btoa === 'function') global.btoa = btoa\n\n const windowCleanup = () => global.window.close()\n const globalCleanup = provideFakeGlobals(basePath)\n const cleanupFileLoader = addHook(\n (code, filename) => `module.exports = ${JSON.stringify(filename)}`,\n {\n ignoreNodeModules: false,\n exts: getFileExtensions(),\n },\n )\n\n const {unregister: unregisterESBuild} = registerESBuild({\n target: 'node18',\n supported: {'dynamic-import': true},\n format: 'cjs',\n extensions: ['.js', '.jsx', '.ts', '.tsx', '.mjs'],\n jsx: 'automatic',\n define: {\n // define the `process.env` global\n ...getStudioEnvironmentVariables({prefix: 'process.env.', jsonEncode: true}),\n // define the `import.meta.env` global\n ...getStudioEnvironmentVariables({prefix: 'import.meta.env.', jsonEncode: true}),\n // define the `import.meta.hot` global, so we don't get `\"import.meta\" is not available with the \"cjs\" output format and will be empty` warnings\n 'import.meta.hot': 'false',\n },\n })\n\n return function cleanupBrowserEnvironment() {\n unregisterESBuild()\n cleanupFileLoader()\n globalCleanup()\n windowCleanup()\n domCleanup()\n importErrorHandler.cleanup()\n }\n}\n\nconst getFakeGlobals = (basePath: string) => ({\n __mockedBySanity: true,\n requestAnimationFrame: setImmediate,\n cancelAnimationFrame: clearImmediate,\n requestIdleCallback: setImmediate,\n cancelIdleCallback: clearImmediate,\n ace: tryGetAceGlobal(basePath),\n InputEvent: global.window?.InputEvent,\n customElements: global.window?.customElements,\n ResizeObserver: global.window?.ResizeObserver || ResizeObserver,\n matchMedia:\n global.window?.matchMedia ||\n (() => ({\n matches: false,\n media: '',\n onchange: null,\n })),\n})\n\nconst getFakeDocumentProps = () => ({\n execCommand: function execCommand(\n // Provide the right arity for the function, even if unused\n _commandName: string,\n _showDefaultUI: boolean,\n _valueArgument: unknown,\n ) {\n // Return false to indicate \"unsupported\"\n return false\n },\n})\n\nfunction provideFakeGlobals(basePath: string): () => void {\n const globalEnv = global as any as Record<string, unknown>\n const globalWindow = global.window as Record<string, any>\n const globalDocument = (global.document || document || {}) as Record<string, any>\n\n const fakeGlobals = getFakeGlobals(basePath)\n const fakeDocumentProps = getFakeDocumentProps()\n\n const stubbedGlobalKeys: string[] = []\n const stubbedWindowKeys: string[] = []\n const stubbedDocumentKeys: string[] = []\n\n for (const [rawKey, value] of Object.entries(fakeGlobals)) {\n if (typeof value === 'undefined') {\n continue\n }\n\n const key = rawKey as keyof typeof fakeGlobals\n\n if (!(key in globalEnv)) {\n globalEnv[key] = fakeGlobals[key]\n stubbedGlobalKeys.push(key)\n }\n\n if (!(key in global.window)) {\n globalWindow[key] = fakeGlobals[key]\n stubbedWindowKeys.push(key)\n }\n }\n\n for (const [rawKey, value] of Object.entries(fakeDocumentProps)) {\n if (typeof value === 'undefined') {\n continue\n }\n\n const key = rawKey as keyof typeof fakeDocumentProps\n if (!(key in globalDocument)) {\n globalDocument[key] = fakeDocumentProps[key]\n stubbedDocumentKeys.push(key)\n }\n }\n\n return () => {\n stubbedGlobalKeys.forEach((key) => {\n delete globalEnv[key]\n })\n\n stubbedWindowKeys.forEach((key) => {\n delete globalWindow[key]\n })\n\n stubbedDocumentKeys.forEach((key) => {\n delete globalDocument[key]\n })\n }\n}\n\nfunction tryGetAceGlobal(basePath: string) {\n // Work around an issue where using the @sanity/code-input plugin would crash\n // due to `ace` not being defined on the global due to odd bundling stategy.\n const acePath = resolveFrom.silent(basePath, 'ace-builds')\n if (!acePath) {\n return undefined\n }\n\n try {\n // eslint-disable-next-line import/no-dynamic-require\n return require(acePath)\n } catch (err) {\n return undefined\n }\n}\n\nfunction getFileExtensions() {\n return [\n '.css',\n '.eot',\n '.gif',\n '.jpeg',\n '.jpg',\n '.otf',\n '.png',\n '.sass',\n '.scss',\n '.svg',\n '.ttf',\n '.webp',\n '.woff',\n '.woff2',\n ]\n}\n","import fs from 'node:fs'\nimport {createRequire} from 'node:module'\nimport path from 'node:path'\n\nimport {firstValueFrom} from 'rxjs'\nimport {type Config, resolveConfig, type Workspace, type WorkspaceOptions} from 'sanity'\n\nimport {mockBrowserEnvironment} from './mockBrowserEnvironment'\n\nconst require = createRequire(import.meta.url)\n\nconst candidates = [\n 'sanity.config.js',\n 'sanity.config.jsx',\n 'sanity.config.ts',\n 'sanity.config.tsx',\n]\n\ninterface GetStudioWorkspacesOptions {\n configPath?: string\n basePath: string\n}\n\n/**\n * Note: Don't run this on the main thread, use it a forked process\n */\nexport function getStudioConfig({\n basePath,\n configPath: cfgPath,\n}: GetStudioWorkspacesOptions): WorkspaceOptions[] {\n let cleanup\n try {\n cleanup = mockBrowserEnvironment(basePath)\n\n let configPath = cfgPath\n if (configPath && !fs.existsSync(configPath)) {\n throw new Error(`Failed to find config at \"${cfgPath}\"`)\n } else if (!configPath) {\n configPath = candidates\n .map((candidate) => path.join(basePath, candidate))\n .find((candidate) => fs.existsSync(candidate))\n }\n\n if (!configPath) {\n throw new Error(`Failed to resolve sanity.config.(js|ts) for base path \"${basePath}\"`)\n }\n\n let config: Config | undefined\n try {\n // eslint-disable-next-line import/no-dynamic-require\n const mod = require(configPath)\n config = mod.__esModule && mod.default ? mod.default : mod\n } catch (err) {\n throw new Error(`Failed to load configuration file \"${configPath}\"`, {\n cause: err,\n })\n }\n\n if (!config) throw new Error('Configuration did not export expected config shape')\n const normalized = Array.isArray(config)\n ? config\n : [{...config, name: config.name || 'default', basePath: config.basePath || '/'}]\n\n return normalized\n } finally {\n cleanup?.()\n }\n}\n\n/**\n * Note: Don't run this on the main thread, use it a forked process\n */\nexport async function getStudioWorkspaces(\n options: GetStudioWorkspacesOptions,\n): Promise<Workspace[]> {\n let cleanup\n\n try {\n cleanup = mockBrowserEnvironment(options.basePath)\n const config = getStudioConfig(options)\n const workspaces = await firstValueFrom(resolveConfig(config))\n if (!workspaces) throw new Error('Failed to resolve configuration')\n return workspaces\n } finally {\n cleanup?.()\n }\n}\n","import {defineTrace} from '@sanity/telemetry'\n\ninterface SchemaExtractedTraceAttrubutes {\n schemaAllTypesCount: number\n schemaDocumentTypesCount: number\n schemaTypesCount: number\n\n enforceRequiredFields: boolean\n schemaFormat: string\n}\n\nexport const SchemaExtractedTrace = defineTrace<SchemaExtractedTraceAttrubutes>({\n name: 'Schema Extracted',\n version: 0,\n description: 'Trace emitted when extracting schema',\n})\n","import {writeFile} from 'node:fs/promises'\nimport {dirname, join} from 'node:path'\nimport {fileURLToPath} from 'node:url'\nimport {Worker} from 'node:worker_threads'\n\nimport {type CliCommandArguments, type CliCommandContext} from '@sanity/cli'\nimport {type SchemaValidationProblemGroup} from '@sanity/types'\nimport readPkgUp from 'read-pkg-up'\nimport {SchemaError as CoreSchemaError} from 'sanity'\n\nimport {\n type ExtractSchemaWorkerData,\n type ExtractSchemaWorkerResult,\n} from '../../threads/extractSchema'\nimport {getStudioWorkspaces} from '../../util/getStudioWorkspaces'\nimport {SchemaExtractedTrace} from './extractSchema.telemetry'\nimport {formatSchemaValidation} from './formatSchemaValidation'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\ninterface ExtractFlags {\n 'workspace'?: string\n 'path'?: string\n 'enforce-required-fields'?: boolean\n 'format'?: 'groq-type-nodes' | string\n}\n\nexport type SchemaValidationFormatter = (result: ExtractSchemaWorkerResult) => string\n\nexport default async function extractAction(\n args: CliCommandArguments<ExtractFlags>,\n {workDir, output, telemetry}: CliCommandContext,\n): Promise<void> {\n const flags = args.extOptions\n const formatFlag = flags.format || 'groq-type-nodes'\n const enforceRequiredFields = flags['enforce-required-fields'] || false\n\n const rootPkgPath = readPkgUp.sync({cwd: __dirname})?.path\n if (!rootPkgPath) {\n throw new Error('Could not find root directory for `sanity` package')\n }\n\n const workerPath = join(\n dirname(rootPkgPath),\n 'lib',\n '_internal',\n 'cli',\n 'threads',\n 'extractSchema.cjs',\n )\n\n const spinner = output\n .spinner({})\n .start(\n enforceRequiredFields\n ? 'Extracting schema, with enforced required fields'\n : 'Extracting schema',\n )\n\n const trace = telemetry.trace(SchemaExtractedTrace)\n trace.start()\n\n const worker = new Worker(workerPath, {\n workerData: {\n workDir,\n workspaceName: flags.workspace,\n enforceRequiredFields,\n format: formatFlag,\n } satisfies ExtractSchemaWorkerData,\n env: process.env,\n })\n\n try {\n const {schema} = await new Promise<ExtractSchemaWorkerResult>((resolve, reject) => {\n worker.addListener('message', resolve)\n worker.addListener('error', reject)\n })\n\n trace.log({\n schemaAllTypesCount: schema.length,\n schemaDocumentTypesCount: schema.filter((type) => type.type === 'document').length,\n schemaTypesCount: schema.filter((type) => type.type === 'type').length,\n enforceRequiredFields,\n schemaFormat: formatFlag,\n })\n\n const path = flags.path || join(process.cwd(), 'schema.json')\n\n spinner.text = `Writing schema to ${path}`\n\n await writeFile(path, `${JSON.stringify(schema, null, 2)}\\n`)\n\n trace.complete()\n\n spinner.succeed(\n enforceRequiredFields\n ? `Extracted schema to ${path} with enforced required fields`\n : `Extracted schema to ${path}`,\n )\n } catch (err) {\n trace.error(err)\n spinner.fail(\n enforceRequiredFields\n ? 'Failed to extract schema, with enforced required fields'\n : 'Failed to extract schema',\n )\n\n if (isSchemaError(err)) {\n try {\n // Re-resolve config in-process to surface validation details\n await getStudioWorkspaces({basePath: workDir})\n } catch (innerErr) {\n const validation = extractValidationFromCoreSchemaError(innerErr)\n if (validation && validation.length > 0) {\n output.print('')\n output.print(formatSchemaValidation(validation))\n }\n throw err\n }\n }\n throw err\n }\n}\n\n/**\n * Type guard to check if an item conforms to the SchemaValidationProblemGroup shape.\n */\nfunction isValidationProblemGroup(item: unknown): item is SchemaValidationProblemGroup {\n if (typeof item !== 'object' || item === null) {\n return false\n }\n const group = item as Record<string, unknown>\n return Array.isArray(group.path) && Array.isArray(group.problems)\n}\n\n/**\n * Extracts the `_validation` array from a CoreSchemaError's internal schema object.\n *\n * CoreSchemaError stores the compiled schema (which includes validation results) on\n * `error.schema._validation`. This function safely navigates that structure and validates\n * it conforms to the expected `SchemaValidationProblemGroup[]` shape before returning.\n */\nfunction extractValidationFromCoreSchemaError(\n error: unknown,\n): SchemaValidationProblemGroup[] | null {\n if (!(error instanceof CoreSchemaError)) {\n return null\n }\n\n const schema = error.schema as unknown as Record<string, unknown> | null | undefined\n if (!schema || typeof schema !== 'object') {\n return null\n }\n\n const validation = schema._validation\n if (!Array.isArray(validation)) {\n return null\n }\n\n if (!validation.every(isValidationProblemGroup)) {\n return null\n }\n\n return validation\n}\n\n/**\n * Type guard for SchemaError. Checks both `name` and `message` properties because\n * errors from worker threads lose their prototype chain during serialization,\n * and may only preserve the error name in the message string.\n */\nfunction isSchemaError(err: unknown): err is Error & {name: 'SchemaError'} {\n if (typeof err !== 'object' || err === null) {\n return false\n }\n\n const errorLike = err as {name?: unknown; message?: unknown}\n const hasSchemaErrorName = errorLike.name === 'SchemaError'\n const hasSchemaErrorMessage = errorLike.message === 'SchemaError'\n\n return hasSchemaErrorName || hasSchemaErrorMessage\n}\n"],"names":["getProxyHandler","handler","get","_target","prop","Proxy","apply","setupImportErrorHandler","ModuleConstructor","Module","originalLoad","_load","request","parent","isMain","call","error","startsWith","cleanup","require","createRequire","import","url","register","pathToFileURL","resolve","jsdomDefaultHtml","mockBrowserEnvironment","basePath","global","window","importErrorHandler","btoa","domCleanup","jsdomGlobal","windowCleanup","close","globalCleanup","provideFakeGlobals","cleanupFileLoader","addHook","code","filename","JSON","stringify","ignoreNodeModules","exts","getFileExtensions","unregister","unregisterESBuild","registerESBuild","target","supported","format","extensions","jsx","define","getStudioEnvironmentVariables","prefix","jsonEncode","getFakeGlobals","__mockedBySanity","requestAnimationFrame","setImmediate","cancelAnimationFrame","clearImmediate","requestIdleCallback","cancelIdleCallback","ace","tryGetAceGlobal","InputEvent","customElements","ResizeObserver","matchMedia","matches","media","onchange","getFakeDocumentProps","execCommand","_commandName","_showDefaultUI","_valueArgument","globalEnv","globalWindow","globalDocument","document","fakeGlobals","fakeDocumentProps","stubbedGlobalKeys","stubbedWindowKeys","stubbedDocumentKeys","rawKey","value","Object","entries","key","push","forEach","acePath","resolveFrom","silent","candidates","getStudioConfig","configPath","cfgPath","fs","existsSync","Error","map","candidate","path","join","find","config","mod","__esModule","default","err","cause","Array","isArray","name","getStudioWorkspaces","options","workspaces","firstValueFrom","resolveConfig","SchemaExtractedTrace","defineTrace","version","description","__dirname","dirname","fileURLToPath","extractAction","args","workDir","output","telemetry","flags","extOptions","formatFlag","enforceRequiredFields","rootPkgPath","readPkgUp","sync","cwd","workerPath","spinner","start","trace","worker","Worker","workerData","workspaceName","workspace","env","process","schema","Promise","reject","addListener","log","schemaAllTypesCount","length","schemaDocumentTypesCount","filter","type","schemaTypesCount","schemaFormat","text","writeFile","complete","succeed","fail","isSchemaError","innerErr","validation","extractValidationFromCoreSchemaError","print","formatSchemaValidation","isValidationProblemGroup","item","group","problems","CoreSchemaError","_validation","every","errorLike","hasSchemaErrorName","hasSchemaErrorMessage","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extractAction.js","sources":["../../src/_internal/cli/util/importErrorHandler.ts","../../src/_internal/cli/util/mockBrowserEnvironment.ts","../../src/_internal/cli/util/getStudioWorkspaces.ts","../../src/_internal/cli/actions/schema/extractSchema.telemetry.ts","../../src/_internal/cli/actions/schema/extractAction.ts"],"sourcesContent":["import Module from 'node:module'\n\nexport interface ImportErrorHandlerResult {\n cleanup: () => void\n}\n\n// Module._load is an internal Node.js API not exposed in types\ninterface ModuleConstructor {\n _load(request: string, parent: Module | undefined, isMain: boolean): any\n}\n\n/**\n * Return safe empty module with Proxy for deep property access. This ensures any property\n * access or function call returns a safe value\n */\nfunction getProxyHandler() {\n const handler: ProxyHandler<object> = {\n get: (_target, prop) => {\n if (prop === '__esModule') return true\n if (prop === 'default') return new Proxy({}, handler)\n return new Proxy({}, handler)\n },\n apply: () => new Proxy({}, handler),\n }\n return new Proxy({}, handler)\n}\n\n/**\n * Sets up a Module._load wrapper to silently ignore imports from https://themer.sanity.build\n * This allows users to use themer URL imports in their config without breaking CLI commands.\n *\n * @returns Handler result with cleanup function\n * @internal\n */\nexport function setupImportErrorHandler(): ImportErrorHandlerResult {\n // Store original Module._load\n const ModuleConstructor = Module as unknown as ModuleConstructor\n const originalLoad = ModuleConstructor._load\n\n // Override Module._load to catch and handle themer.sanity.build imports\n ModuleConstructor._load = function (\n request: string,\n parent: Module | undefined,\n isMain: boolean,\n ) {\n try {\n return originalLoad.call(this, request, parent, isMain)\n } catch (error) {\n // Check if this is a themer.sanity.build URL import\n if (request.startsWith('https://themer.sanity.build/api/')) {\n // Return a safe proxy object that can be used in place of the theme\n return getProxyHandler()\n }\n\n // Re-throw all other errors\n throw error\n }\n }\n\n return {\n cleanup: () => {\n ModuleConstructor._load = originalLoad\n },\n }\n}\n","import {createRequire, register} from 'node:module'\nimport {pathToFileURL} from 'node:url'\n\nimport {ResizeObserver} from '@juggle/resize-observer'\nimport {register as registerESBuild} from 'esbuild-register/dist/node'\nimport jsdomGlobal from 'jsdom-global'\nimport {addHook} from 'pirates'\nimport resolveFrom from 'resolve-from'\n\nimport {getStudioEnvironmentVariables} from '../server/getStudioEnvironmentVariables'\nimport {setupImportErrorHandler} from './importErrorHandler'\n\nconst require = createRequire(import.meta.url)\n\n// Handle require(esm) cases that breaks free from esbuild-register+pirates\nregister(\n './mock-browser-env-stub-loader.mjs',\n pathToFileURL(require.resolve('sanity/package.json')),\n)\n\nconst jsdomDefaultHtml = `<!doctype html>\n<html>\n <head><meta charset=\"utf-8\"></head>\n <body></body>\n</html>`\n\nexport function mockBrowserEnvironment(basePath: string): () => void {\n // Guard against double-registering\n if (global && global.window && '__mockedBySanity' in global.window) {\n return () => {\n /* intentional noop */\n }\n }\n\n // Set up import error handler before esbuild-register to silently ignore themer.sanity.build URLs\n const importErrorHandler = setupImportErrorHandler()\n\n const btoa = global.btoa\n const domCleanup = jsdomGlobal(jsdomDefaultHtml, {url: 'http://localhost:3333/'})\n\n // Don't use jsdom's btoa as it's using the deprecatd `abab` package.\n if (typeof btoa === 'function') global.btoa = btoa\n\n const windowCleanup = () => global.window.close()\n const globalCleanup = provideFakeGlobals(basePath)\n const cleanupFileLoader = addHook(\n (code, filename) => `module.exports = ${JSON.stringify(filename)}`,\n {\n ignoreNodeModules: false,\n exts: getFileExtensions(),\n },\n )\n\n const {unregister: unregisterESBuild} = registerESBuild({\n target: 'node18',\n supported: {'dynamic-import': true},\n format: 'cjs',\n extensions: ['.js', '.jsx', '.ts', '.tsx', '.mjs'],\n jsx: 'automatic',\n define: {\n // define the `process.env` global\n ...getStudioEnvironmentVariables({prefix: 'process.env.', jsonEncode: true}),\n // define the `import.meta.env` global\n ...getStudioEnvironmentVariables({prefix: 'import.meta.env.', jsonEncode: true}),\n // define the `import.meta.hot` global, so we don't get `\"import.meta\" is not available with the \"cjs\" output format and will be empty` warnings\n 'import.meta.hot': 'false',\n },\n })\n\n return function cleanupBrowserEnvironment() {\n unregisterESBuild()\n cleanupFileLoader()\n globalCleanup()\n windowCleanup()\n domCleanup()\n importErrorHandler.cleanup()\n }\n}\n\nconst getFakeGlobals = (basePath: string) => ({\n __mockedBySanity: true,\n requestAnimationFrame: setImmediate,\n cancelAnimationFrame: clearImmediate,\n requestIdleCallback: setImmediate,\n cancelIdleCallback: clearImmediate,\n ace: tryGetAceGlobal(basePath),\n InputEvent: global.window?.InputEvent,\n customElements: global.window?.customElements,\n ResizeObserver: global.window?.ResizeObserver || ResizeObserver,\n matchMedia:\n global.window?.matchMedia ||\n (() => ({\n matches: false,\n media: '',\n onchange: null,\n })),\n})\n\nconst getFakeDocumentProps = () => ({\n execCommand: function execCommand(\n // Provide the right arity for the function, even if unused\n _commandName: string,\n _showDefaultUI: boolean,\n _valueArgument: unknown,\n ) {\n // Return false to indicate \"unsupported\"\n return false\n },\n})\n\nfunction provideFakeGlobals(basePath: string): () => void {\n const globalEnv = global as any as Record<string, unknown>\n const globalWindow = global.window as Record<string, any>\n const globalDocument = (global.document || document || {}) as Record<string, any>\n\n const fakeGlobals = getFakeGlobals(basePath)\n const fakeDocumentProps = getFakeDocumentProps()\n\n const stubbedGlobalKeys: string[] = []\n const stubbedWindowKeys: string[] = []\n const stubbedDocumentKeys: string[] = []\n\n for (const [rawKey, value] of Object.entries(fakeGlobals)) {\n if (typeof value === 'undefined') {\n continue\n }\n\n const key = rawKey as keyof typeof fakeGlobals\n\n if (!(key in globalEnv)) {\n globalEnv[key] = fakeGlobals[key]\n stubbedGlobalKeys.push(key)\n }\n\n if (!(key in global.window)) {\n globalWindow[key] = fakeGlobals[key]\n stubbedWindowKeys.push(key)\n }\n }\n\n for (const [rawKey, value] of Object.entries(fakeDocumentProps)) {\n if (typeof value === 'undefined') {\n continue\n }\n\n const key = rawKey as keyof typeof fakeDocumentProps\n if (!(key in globalDocument)) {\n globalDocument[key] = fakeDocumentProps[key]\n stubbedDocumentKeys.push(key)\n }\n }\n\n return () => {\n stubbedGlobalKeys.forEach((key) => {\n delete globalEnv[key]\n })\n\n stubbedWindowKeys.forEach((key) => {\n delete globalWindow[key]\n })\n\n stubbedDocumentKeys.forEach((key) => {\n delete globalDocument[key]\n })\n }\n}\n\nfunction tryGetAceGlobal(basePath: string) {\n // Work around an issue where using the @sanity/code-input plugin would crash\n // due to `ace` not being defined on the global due to odd bundling stategy.\n const acePath = resolveFrom.silent(basePath, 'ace-builds')\n if (!acePath) {\n return undefined\n }\n\n try {\n // eslint-disable-next-line import/no-dynamic-require\n return require(acePath)\n } catch {\n return undefined\n }\n}\n\nfunction getFileExtensions() {\n return [\n '.css',\n '.eot',\n '.gif',\n '.jpeg',\n '.jpg',\n '.otf',\n '.png',\n '.sass',\n '.scss',\n '.svg',\n '.ttf',\n '.webp',\n '.woff',\n '.woff2',\n ]\n}\n","import fs from 'node:fs'\nimport {createRequire} from 'node:module'\nimport path from 'node:path'\n\nimport {firstValueFrom} from 'rxjs'\nimport {type Config, resolveConfig, type Workspace, type WorkspaceOptions} from 'sanity'\n\nimport {mockBrowserEnvironment} from './mockBrowserEnvironment'\n\nconst require = createRequire(import.meta.url)\n\nconst candidates = [\n 'sanity.config.js',\n 'sanity.config.jsx',\n 'sanity.config.ts',\n 'sanity.config.tsx',\n]\n\ninterface GetStudioWorkspacesOptions {\n configPath?: string\n basePath: string\n}\n\n/**\n * Note: Don't run this on the main thread, use it a forked process\n */\nexport function getStudioConfig({\n basePath,\n configPath: cfgPath,\n}: GetStudioWorkspacesOptions): WorkspaceOptions[] {\n let cleanup\n try {\n cleanup = mockBrowserEnvironment(basePath)\n\n let configPath = cfgPath\n if (configPath && !fs.existsSync(configPath)) {\n throw new Error(`Failed to find config at \"${cfgPath}\"`)\n } else if (!configPath) {\n configPath = candidates\n .map((candidate) => path.join(basePath, candidate))\n .find((candidate) => fs.existsSync(candidate))\n }\n\n if (!configPath) {\n throw new Error(`Failed to resolve sanity.config.(js|ts) for base path \"${basePath}\"`)\n }\n\n let config: Config | undefined\n try {\n // eslint-disable-next-line import/no-dynamic-require\n const mod = require(configPath)\n config = mod.__esModule && mod.default ? mod.default : mod\n } catch (err) {\n throw new Error(`Failed to load configuration file \"${configPath}\"`, {\n cause: err,\n })\n }\n\n if (!config) throw new Error('Configuration did not export expected config shape')\n const normalized = Array.isArray(config)\n ? config\n : [{...config, name: config.name || 'default', basePath: config.basePath || '/'}]\n\n return normalized\n } finally {\n cleanup?.()\n }\n}\n\n/**\n * Note: Don't run this on the main thread, use it a forked process\n */\nexport async function getStudioWorkspaces(\n options: GetStudioWorkspacesOptions,\n): Promise<Workspace[]> {\n let cleanup\n\n try {\n cleanup = mockBrowserEnvironment(options.basePath)\n const config = getStudioConfig(options)\n const workspaces = await firstValueFrom(resolveConfig(config))\n if (!workspaces) throw new Error('Failed to resolve configuration')\n return workspaces\n } finally {\n cleanup?.()\n }\n}\n","import {defineTrace} from '@sanity/telemetry'\n\ninterface SchemaExtractedTraceAttrubutes {\n schemaAllTypesCount: number\n schemaDocumentTypesCount: number\n schemaTypesCount: number\n\n enforceRequiredFields: boolean\n schemaFormat: string\n}\n\nexport const SchemaExtractedTrace = defineTrace<SchemaExtractedTraceAttrubutes>({\n name: 'Schema Extracted',\n version: 0,\n description: 'Trace emitted when extracting schema',\n})\n","import {writeFile} from 'node:fs/promises'\nimport {dirname, join} from 'node:path'\nimport {fileURLToPath} from 'node:url'\nimport {Worker} from 'node:worker_threads'\n\nimport {type CliCommandArguments, type CliCommandContext} from '@sanity/cli'\nimport {type SchemaValidationProblemGroup} from '@sanity/types'\nimport readPkgUp from 'read-pkg-up'\nimport {SchemaError as CoreSchemaError} from 'sanity'\n\nimport {\n type ExtractSchemaWorkerData,\n type ExtractSchemaWorkerResult,\n} from '../../threads/extractSchema'\nimport {getStudioWorkspaces} from '../../util/getStudioWorkspaces'\nimport {SchemaExtractedTrace} from './extractSchema.telemetry'\nimport {formatSchemaValidation} from './formatSchemaValidation'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\ninterface ExtractFlags {\n 'workspace'?: string\n 'path'?: string\n 'enforce-required-fields'?: boolean\n 'format'?: 'groq-type-nodes' | string\n}\n\nexport type SchemaValidationFormatter = (result: ExtractSchemaWorkerResult) => string\n\nexport default async function extractAction(\n args: CliCommandArguments<ExtractFlags>,\n {workDir, output, telemetry}: CliCommandContext,\n): Promise<void> {\n const flags = args.extOptions\n const formatFlag = flags.format || 'groq-type-nodes'\n const enforceRequiredFields = flags['enforce-required-fields'] || false\n\n const rootPkgPath = readPkgUp.sync({cwd: __dirname})?.path\n if (!rootPkgPath) {\n throw new Error('Could not find root directory for `sanity` package')\n }\n\n const workerPath = join(\n dirname(rootPkgPath),\n 'lib',\n '_internal',\n 'cli',\n 'threads',\n 'extractSchema.cjs',\n )\n\n const spinner = output\n .spinner({})\n .start(\n enforceRequiredFields\n ? 'Extracting schema, with enforced required fields'\n : 'Extracting schema',\n )\n\n const trace = telemetry.trace(SchemaExtractedTrace)\n trace.start()\n\n const worker = new Worker(workerPath, {\n workerData: {\n workDir,\n workspaceName: flags.workspace,\n enforceRequiredFields,\n format: formatFlag,\n } satisfies ExtractSchemaWorkerData,\n env: process.env,\n })\n\n try {\n const {schema} = await new Promise<ExtractSchemaWorkerResult>((resolve, reject) => {\n worker.addListener('message', resolve)\n worker.addListener('error', reject)\n })\n\n trace.log({\n schemaAllTypesCount: schema.length,\n schemaDocumentTypesCount: schema.filter((type) => type.type === 'document').length,\n schemaTypesCount: schema.filter((type) => type.type === 'type').length,\n enforceRequiredFields,\n schemaFormat: formatFlag,\n })\n\n const path = flags.path || join(process.cwd(), 'schema.json')\n\n spinner.text = `Writing schema to ${path}`\n\n await writeFile(path, `${JSON.stringify(schema, null, 2)}\\n`)\n\n trace.complete()\n\n spinner.succeed(\n enforceRequiredFields\n ? `Extracted schema to ${path} with enforced required fields`\n : `Extracted schema to ${path}`,\n )\n } catch (err) {\n trace.error(err)\n spinner.fail(\n enforceRequiredFields\n ? 'Failed to extract schema, with enforced required fields'\n : 'Failed to extract schema',\n )\n\n if (isSchemaError(err)) {\n try {\n // Re-resolve config in-process to surface validation details\n await getStudioWorkspaces({basePath: workDir})\n } catch (innerErr) {\n const validation = extractValidationFromCoreSchemaError(innerErr)\n if (validation && validation.length > 0) {\n output.print('')\n output.print(formatSchemaValidation(validation))\n }\n throw err\n }\n }\n throw err\n }\n}\n\n/**\n * Type guard to check if an item conforms to the SchemaValidationProblemGroup shape.\n */\nfunction isValidationProblemGroup(item: unknown): item is SchemaValidationProblemGroup {\n if (typeof item !== 'object' || item === null) {\n return false\n }\n const group = item as Record<string, unknown>\n return Array.isArray(group.path) && Array.isArray(group.problems)\n}\n\n/**\n * Extracts the `_validation` array from a CoreSchemaError's internal schema object.\n *\n * CoreSchemaError stores the compiled schema (which includes validation results) on\n * `error.schema._validation`. This function safely navigates that structure and validates\n * it conforms to the expected `SchemaValidationProblemGroup[]` shape before returning.\n */\nfunction extractValidationFromCoreSchemaError(\n error: unknown,\n): SchemaValidationProblemGroup[] | null {\n if (!(error instanceof CoreSchemaError)) {\n return null\n }\n\n const schema = error.schema as unknown as Record<string, unknown> | null | undefined\n if (!schema || typeof schema !== 'object') {\n return null\n }\n\n const validation = schema._validation\n if (!Array.isArray(validation)) {\n return null\n }\n\n if (!validation.every(isValidationProblemGroup)) {\n return null\n }\n\n return validation\n}\n\n/**\n * Type guard for SchemaError. Checks both `name` and `message` properties because\n * errors from worker threads lose their prototype chain during serialization,\n * and may only preserve the error name in the message string.\n */\nfunction isSchemaError(err: unknown): err is Error & {name: 'SchemaError'} {\n if (typeof err !== 'object' || err === null) {\n return false\n }\n\n const errorLike = err as {name?: unknown; message?: unknown}\n const hasSchemaErrorName = errorLike.name === 'SchemaError'\n const hasSchemaErrorMessage = errorLike.message === 'SchemaError'\n\n return hasSchemaErrorName || hasSchemaErrorMessage\n}\n"],"names":["getProxyHandler","handler","get","_target","prop","Proxy","apply","setupImportErrorHandler","ModuleConstructor","Module","originalLoad","_load","request","parent","isMain","call","error","startsWith","cleanup","require","createRequire","import","url","register","pathToFileURL","resolve","jsdomDefaultHtml","mockBrowserEnvironment","basePath","global","window","importErrorHandler","btoa","domCleanup","jsdomGlobal","windowCleanup","close","globalCleanup","provideFakeGlobals","cleanupFileLoader","addHook","code","filename","JSON","stringify","ignoreNodeModules","exts","getFileExtensions","unregister","unregisterESBuild","registerESBuild","target","supported","format","extensions","jsx","define","getStudioEnvironmentVariables","prefix","jsonEncode","getFakeGlobals","__mockedBySanity","requestAnimationFrame","setImmediate","cancelAnimationFrame","clearImmediate","requestIdleCallback","cancelIdleCallback","ace","tryGetAceGlobal","InputEvent","customElements","ResizeObserver","matchMedia","matches","media","onchange","getFakeDocumentProps","execCommand","_commandName","_showDefaultUI","_valueArgument","globalEnv","globalWindow","globalDocument","document","fakeGlobals","fakeDocumentProps","stubbedGlobalKeys","stubbedWindowKeys","stubbedDocumentKeys","rawKey","value","Object","entries","key","push","forEach","acePath","resolveFrom","silent","candidates","getStudioConfig","configPath","cfgPath","fs","existsSync","Error","map","candidate","path","join","find","config","mod","__esModule","default","err","cause","Array","isArray","name","getStudioWorkspaces","options","workspaces","firstValueFrom","resolveConfig","SchemaExtractedTrace","defineTrace","version","description","__dirname","dirname","fileURLToPath","extractAction","args","workDir","output","telemetry","flags","extOptions","formatFlag","enforceRequiredFields","rootPkgPath","readPkgUp","sync","cwd","workerPath","spinner","start","trace","worker","Worker","workerData","workspaceName","workspace","env","process","schema","Promise","reject","addListener","log","schemaAllTypesCount","length","schemaDocumentTypesCount","filter","type","schemaTypesCount","schemaFormat","text","writeFile","complete","succeed","fail","isSchemaError","innerErr","validation","extractValidationFromCoreSchemaError","print","formatSchemaValidation","isValidationProblemGroup","item","group","problems","CoreSchemaError","_validation","every","errorLike","hasSchemaErrorName","hasSchemaErrorMessage","message"],"mappings":"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"}
|