@sanity/cli 6.0.0-alpha.20 → 6.0.0-alpha.21
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/README.md +405 -225
- package/dist/actions/auth/authServer.js +13 -11
- package/dist/actions/auth/authServer.js.map +1 -1
- package/dist/actions/auth/login/getProvider.js +43 -39
- package/dist/actions/auth/login/getProvider.js.map +1 -1
- package/dist/actions/auth/login/getSSOProvider.js +25 -19
- package/dist/actions/auth/login/getSSOProvider.js.map +1 -1
- package/dist/actions/auth/login/login.js +12 -33
- package/dist/actions/auth/login/login.js.map +1 -1
- package/dist/actions/auth/types.js.map +1 -1
- package/dist/actions/codemods/reactIconsV3.js +2 -2
- package/dist/actions/codemods/reactIconsV3.js.map +1 -1
- package/dist/actions/debug/formatters.js +22 -0
- package/dist/actions/debug/formatters.js.map +1 -0
- package/dist/actions/dev/getDashboardAppUrl.js +3 -3
- package/dist/actions/dev/getDashboardAppUrl.js.map +1 -1
- package/dist/actions/documents/validateDocuments.worker.js +2 -2
- package/dist/actions/documents/validateDocuments.worker.js.map +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js.map +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/tree.js +108 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/tree.js.map +1 -0
- package/dist/actions/graphql/SchemaError.js +4 -26
- package/dist/actions/graphql/SchemaError.js.map +1 -1
- package/dist/actions/graphql/extractFromSanitySchema.js +3 -4
- package/dist/actions/graphql/extractFromSanitySchema.js.map +1 -1
- package/dist/actions/graphql/extractGraphQLAPIs.js +150 -0
- package/dist/actions/graphql/extractGraphQLAPIs.js.map +1 -0
- package/dist/actions/graphql/extractGraphQLAPIs.worker.js +12 -0
- package/dist/actions/graphql/extractGraphQLAPIs.worker.js.map +1 -0
- package/dist/actions/graphql/gen1/index.js +5 -5
- package/dist/actions/graphql/gen1/index.js.map +1 -1
- package/dist/actions/graphql/gen2/index.js +6 -6
- package/dist/actions/graphql/gen2/index.js.map +1 -1
- package/dist/actions/graphql/gen3/generateTypeQueries.js +2 -3
- package/dist/actions/graphql/gen3/generateTypeQueries.js.map +1 -1
- package/dist/actions/graphql/gen3/index.js +6 -7
- package/dist/actions/graphql/gen3/index.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js +12 -35
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.worker.js +75 -106
- package/dist/actions/graphql/getGraphQLAPIs.worker.js.map +1 -1
- package/dist/actions/graphql/helpers.js +13 -0
- package/dist/actions/graphql/helpers.js.map +1 -1
- package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js +187 -0
- package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js.map +1 -0
- package/dist/actions/graphql/types.js +1 -1
- package/dist/actions/graphql/types.js.map +1 -1
- package/dist/actions/init/bootstrapLocalTemplate.js +2 -1
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
- package/dist/actions/init/bootstrapRemoteTemplate.js +6 -5
- package/dist/actions/init/bootstrapRemoteTemplate.js.map +1 -1
- package/dist/actions/init/createPackageManifest.js +5 -0
- package/dist/actions/init/createPackageManifest.js.map +1 -1
- package/dist/actions/init/templates/appQuickstart.js +2 -1
- package/dist/actions/init/templates/appQuickstart.js.map +1 -1
- package/dist/actions/init/templates/appSanityUi.js +2 -1
- package/dist/actions/init/templates/appSanityUi.js.map +1 -1
- package/dist/actions/init/types.js.map +1 -1
- package/dist/actions/media/importMedia.js +1 -2
- package/dist/actions/media/importMedia.js.map +1 -1
- package/dist/actions/projects/getManageUrl.js +1 -2
- package/dist/actions/projects/getManageUrl.js.map +1 -1
- package/dist/actions/schema/validateSchema.worker.js +1 -3
- package/dist/actions/schema/validateSchema.worker.js.map +1 -1
- package/dist/actions/telemetry/isTrueish.js +10 -0
- package/dist/actions/telemetry/isTrueish.js.map +1 -0
- package/dist/actions/telemetry/resolveConsent.js +2 -1
- package/dist/actions/telemetry/resolveConsent.js.map +1 -1
- package/dist/actions/telemetry/setConsent.js +2 -1
- package/dist/actions/telemetry/setConsent.js.map +1 -1
- package/dist/actions/versions/findSanityModulesVersions.js +1 -2
- package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
- package/dist/commands/backup/disable.js +21 -1
- package/dist/commands/backup/disable.js.map +1 -1
- package/dist/commands/backup/download.js +18 -4
- package/dist/commands/backup/download.js.map +1 -1
- package/dist/commands/backup/enable.js +21 -1
- package/dist/commands/backup/enable.js.map +1 -1
- package/dist/commands/backup/list.js +15 -1
- package/dist/commands/backup/list.js.map +1 -1
- package/dist/commands/cors/add.js +19 -1
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +21 -1
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +21 -1
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/dataset/alias/create.js +4 -2
- package/dist/commands/dataset/alias/create.js.map +1 -1
- package/dist/commands/dataset/alias/delete.js +4 -2
- package/dist/commands/dataset/alias/delete.js.map +1 -1
- package/dist/commands/dataset/alias/link.js +4 -2
- package/dist/commands/dataset/alias/link.js.map +1 -1
- package/dist/commands/dataset/alias/unlink.js +4 -2
- package/dist/commands/dataset/alias/unlink.js.map +1 -1
- package/dist/commands/dataset/copy.js +4 -2
- package/dist/commands/dataset/copy.js.map +1 -1
- package/dist/commands/dataset/create.js +4 -2
- package/dist/commands/dataset/create.js.map +1 -1
- package/dist/commands/dataset/delete.js +4 -2
- package/dist/commands/dataset/delete.js.map +1 -1
- package/dist/commands/dataset/embeddings/disable.js +4 -2
- package/dist/commands/dataset/embeddings/disable.js.map +1 -1
- package/dist/commands/dataset/embeddings/enable.js +6 -4
- package/dist/commands/dataset/embeddings/enable.js.map +1 -1
- package/dist/commands/dataset/embeddings/status.js +4 -2
- package/dist/commands/dataset/embeddings/status.js.map +1 -1
- package/dist/commands/dataset/export.js +7 -11
- package/dist/commands/dataset/export.js.map +1 -1
- package/dist/commands/dataset/list.js +4 -2
- package/dist/commands/dataset/list.js.map +1 -1
- package/dist/commands/dataset/visibility/get.js +4 -2
- package/dist/commands/dataset/visibility/get.js.map +1 -1
- package/dist/commands/dataset/visibility/set.js +4 -2
- package/dist/commands/dataset/visibility/set.js.map +1 -1
- package/dist/commands/debug.js +2 -1
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/documents/create.js +15 -5
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +17 -6
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +15 -6
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +24 -12
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +29 -9
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/deploy.js +55 -28
- package/dist/commands/graphql/deploy.js.map +1 -1
- package/dist/commands/graphql/list.js +14 -1
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +36 -14
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hook/attempt.js +21 -1
- package/dist/commands/hook/attempt.js.map +1 -1
- package/dist/commands/hook/create.js +22 -2
- package/dist/commands/hook/create.js.map +1 -1
- package/dist/commands/hook/delete.js +21 -1
- package/dist/commands/hook/delete.js.map +1 -1
- package/dist/commands/hook/list.js +21 -1
- package/dist/commands/hook/list.js.map +1 -1
- package/dist/commands/hook/logs.js +19 -1
- package/dist/commands/hook/logs.js.map +1 -1
- package/dist/commands/init.js +13 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +13 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +8 -6
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/media/create-aspect.js +3 -3
- package/dist/commands/media/create-aspect.js.map +1 -1
- package/dist/commands/media/delete-aspect.js +8 -1
- package/dist/commands/media/delete-aspect.js.map +1 -1
- package/dist/commands/media/deploy-aspect.js +20 -3
- package/dist/commands/media/deploy-aspect.js.map +1 -1
- package/dist/commands/media/export.js +8 -1
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +9 -2
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/schema/delete.js +19 -6
- package/dist/commands/schema/delete.js.map +1 -1
- package/dist/commands/schema/deploy.js +8 -2
- package/dist/commands/schema/deploy.js.map +1 -1
- package/dist/commands/tokens/add.js +23 -1
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/tokens/delete.js +19 -1
- package/dist/commands/tokens/delete.js.map +1 -1
- package/dist/commands/tokens/list.js +19 -1
- package/dist/commands/tokens/list.js.map +1 -1
- package/dist/commands/users/invite.js +23 -1
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +23 -1
- package/dist/commands/users/list.js.map +1 -1
- package/dist/hooks/prerun/flushTelemetry.worker.js +1 -1
- package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -1
- package/dist/hooks/prerun/setupTelemetry.js +2 -1
- package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
- package/dist/prompts/promptForProject.js.map +1 -1
- package/dist/{actions/auth/login/promptProviders.js → prompts/promptForProviders.js} +3 -3
- package/dist/prompts/promptForProviders.js.map +1 -0
- package/dist/services/auth.js +36 -3
- package/dist/services/auth.js.map +1 -1
- package/dist/services/docs.js +2 -2
- package/dist/services/docs.js.map +1 -1
- package/dist/services/getUrlHeaders.js +0 -2
- package/dist/services/getUrlHeaders.js.map +1 -1
- package/dist/services/projects.js +4 -2
- package/dist/services/projects.js.map +1 -1
- package/dist/services/telemetry.js +2 -1
- package/dist/services/telemetry.js.map +1 -1
- package/dist/util/createExpiringConfig.js +64 -0
- package/dist/util/createExpiringConfig.js.map +1 -0
- package/dist/util/detectFramework.js +135 -0
- package/dist/util/detectFramework.js.map +1 -0
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js +1 -2
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js.map +1 -1
- package/dist/util/isSchemaError.js +11 -0
- package/dist/util/isSchemaError.js.map +1 -0
- package/dist/util/isTar.js +8 -0
- package/dist/util/isTar.js.map +1 -0
- package/dist/util/sharedFlags.js +44 -14
- package/dist/util/sharedFlags.js.map +1 -1
- package/dist/util/telemetry/cleanupOldTelemetryFiles.js +30 -0
- package/dist/util/telemetry/cleanupOldTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/createTelemetryStore.js +95 -0
- package/dist/util/telemetry/createTelemetryStore.js.map +1 -0
- package/dist/util/telemetry/createTraceId.js +10 -0
- package/dist/util/telemetry/createTraceId.js.map +1 -0
- package/dist/util/telemetry/findTelemetryFiles.js +35 -0
- package/dist/util/telemetry/findTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/flushTelemetryFiles.js +118 -0
- package/dist/util/telemetry/flushTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/generateTelemetryFilePath.js +30 -0
- package/dist/util/telemetry/generateTelemetryFilePath.js.map +1 -0
- package/dist/util/telemetry/logger.js +59 -0
- package/dist/util/telemetry/logger.js.map +1 -0
- package/dist/util/telemetry/readNDJSON.js +28 -0
- package/dist/util/telemetry/readNDJSON.js.map +1 -0
- package/dist/util/telemetry/telemetryStoreDebug.js +7 -0
- package/dist/util/telemetry/telemetryStoreDebug.js.map +1 -0
- package/dist/util/telemetry/trace.js +150 -0
- package/dist/util/telemetry/trace.js.map +1 -0
- package/dist/util/update/updateChecker.js +2 -1
- package/dist/util/update/updateChecker.js.map +1 -1
- package/oclif.manifest.json +966 -529
- package/package.json +19 -22
- package/dist/actions/auth/login/promptProviders.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/documents/validateDocuments.worker.ts"],"sourcesContent":["import fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport readline from 'node:readline'\nimport {Readable} from 'node:stream'\nimport {workerData as _workerData, isMainThread, parentPort} from 'node:worker_threads'\n\nimport {getStudioWorkspaces, isRecord, resolveLocalPackage} from '@sanity/cli-core'\nimport {type ClientConfig, createClient, type SanityDocument} from '@sanity/client'\nimport {type ValidationContext, type ValidationMarker} from '@sanity/types'\nimport {WorkerChannelReporter} from '@sanity/worker-channels'\nimport pMap from 'p-map'\n\nimport {\n type AvailabilityResponse,\n checkDocumentAvailability,\n exportDocuments,\n getDocumentCount,\n} from '../../services/documents.js'\nimport {extractDocumentsFromNdjsonOrTarball} from '../../util/extractDocumentsFromNdjsonOrTarball.js'\nimport {getWorkspace} from '../../util/getWorkspace.js'\nimport {\n DOCUMENT_VALIDATION_TIMEOUT,\n getReferenceIds,\n isValidId,\n levelValues,\n MAX_VALIDATION_CONCURRENCY,\n REFERENCE_INTEGRITY_BATCH_SIZE,\n shouldIncludeDocument,\n} from '../../util/validation/validateDocumentsUtils.js'\nimport {type ValidateDocumentsWorkerData, type ValidationWorkerChannel} from './types.js'\n\nconst {\n clientConfig,\n dataset,\n level,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n ndjsonFilePath,\n projectId,\n studioHost,\n workDir,\n workspace: workspaceName,\n} = _workerData as ValidateDocumentsWorkerData\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\nconst report = WorkerChannelReporter.from<ValidationWorkerChannel>(parentPort)\n\n// eslint-disable-next-line n/no-unsupported-features/node-builtins\nasync function* readerToGenerator(reader: ReadableStreamDefaultReader<Uint8Array>) {\n while (true) {\n const {done, value} = await reader.read()\n if (value) yield value\n if (done) return\n }\n}\n\nawait main()\nprocess.exit()\n\nasync function loadWorkspace() {\n const workspaces = await getStudioWorkspaces(workDir)\n const workspace = getWorkspace(workspaces, workspaceName)\n\n const resolvedDataset = dataset || workspace.dataset\n const resolvedProjectId = projectId || workspace.projectId\n\n const client = createClient({\n ...clientConfig,\n dataset: resolvedDataset,\n projectId: resolvedProjectId,\n requestTagPrefix: 'sanity.cli.validate',\n }).config({apiVersion: 'v2021-03-25'})\n\n report.event.loadedWorkspace({\n basePath: workspace.basePath,\n dataset: workspace.dataset,\n name: workspace.name,\n projectId: workspace.projectId,\n })\n\n return {client, dataset: resolvedDataset, projectId: resolvedProjectId, workspace}\n}\n\ninterface DownloadFromExportOptions {\n dataset: string\n projectId: string\n}\n\nasync function downloadFromExport({\n dataset: datasetName,\n projectId: projId,\n}: DownloadFromExportOptions) {\n const documentCount = await getDocumentCount({dataset: datasetName, projectId: projId})\n report.event.loadedDocumentCount({documentCount})\n\n const response = await exportDocuments({dataset: datasetName, projectId: projId})\n\n const reader = response.body?.getReader()\n if (!reader) throw new Error('Could not get reader from response body.')\n\n let downloadedCount = 0\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const lines = readline.createInterface({input: Readable.from(readerToGenerator(reader))})\n\n // Note: we stream the export to a file and then re-read from that file to\n // make this less memory intensive.\n // this is a similar pattern to the import/export CLI commands\n const slugDate = new Date()\n .toISOString()\n .replaceAll(/[^a-z0-9]/gi, '-')\n .toLowerCase()\n const tempOutputFile = path.join(os.tmpdir(), `sanity-validate-${slugDate}.ndjson`)\n const outputStream = fs.createWriteStream(tempOutputFile)\n\n for await (const line of lines) {\n const document = JSON.parse(line) as SanityDocument\n\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n\n outputStream.write(`${line}\\n`)\n }\n\n downloadedCount++\n report.stream.exportProgress.emit({documentCount, downloadedCount})\n }\n\n await new Promise<void>((resolve, reject) =>\n outputStream.close((err) => (err ? reject(err) : resolve())),\n )\n\n report.stream.exportProgress.end()\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n const getDocuments = () =>\n extractDocumentsFromNdjsonOrTarball(fs.createReadStream(tempOutputFile))\n\n return {cleanup: () => fs.promises.rm(tempOutputFile), documentIds, getDocuments, referencedIds}\n}\n\nasync function downloadFromFile(filePath: string) {\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const getDocuments = () => extractDocumentsFromNdjsonOrTarball(fs.createReadStream(filePath))\n\n for await (const document of getDocuments()) {\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n }\n }\n\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n return {cleanup: undefined, documentIds, getDocuments, referencedIds}\n}\n\ninterface CheckReferenceExistenceOptions {\n dataset: string\n documentIds: Set<string>\n projectId: string\n referencedIds: Set<string>\n}\n\nasync function checkReferenceExistence({\n dataset: datasetName,\n documentIds,\n projectId: projId,\n referencedIds: _referencedIds,\n}: CheckReferenceExistenceOptions) {\n const existingIds = new Set(documentIds)\n const idsToCheck = [..._referencedIds]\n .filter((id) => !existingIds.has(id) && isValidId(id))\n .toSorted()\n\n const batches: string[][] = []\n for (let i = 0; i < idsToCheck.length; i += REFERENCE_INTEGRITY_BATCH_SIZE) {\n batches.push(idsToCheck.slice(i, i + REFERENCE_INTEGRITY_BATCH_SIZE))\n }\n\n for (const batch of batches) {\n const {omitted} = await checkDocumentAvailability({\n dataset: datasetName,\n documentIds: batch,\n projectId: projId,\n })\n\n const omittedIds: Record<string, AvailabilityResponse['omitted'][number]['reason']> = {}\n for (const item of omitted) {\n omittedIds[item.id] = item.reason\n }\n\n for (const id of batch) {\n // unless the document ID is in the `omitted` object explictly due to\n // the reason `'existence'`, then it should exist\n if (omittedIds[id] !== 'existence') {\n existingIds.add(id)\n }\n }\n }\n report.event.loadedReferenceIntegrity()\n\n return {existingIds}\n}\n\nasync function main() {\n let cleanupDownloadedDocuments: (() => Promise<void>) | undefined\n\n try {\n const {client, dataset: datasetName, projectId: projId, workspace} = await loadWorkspace()\n const {cleanup, documentIds, getDocuments, referencedIds} = ndjsonFilePath\n ? await downloadFromFile(ndjsonFilePath)\n : await downloadFromExport({dataset: datasetName, projectId: projId})\n cleanupDownloadedDocuments = cleanup\n const {existingIds} = await checkReferenceExistence({\n dataset: datasetName,\n documentIds,\n projectId: projId,\n referencedIds,\n })\n\n const getClient = <TOptions extends Partial<ClientConfig>>(options: TOptions) =>\n client.withConfig(options)\n\n const getDocumentExists: ValidationContext['getDocumentExists'] = ({id}) =>\n Promise.resolve(existingIds.has(id))\n\n const getLevel = (markers: ValidationMarker[]) => {\n let foundWarning = false\n for (const marker of markers) {\n if (marker.level === 'error') return 'error'\n if (marker.level === 'warning') foundWarning = true\n }\n\n if (foundWarning) return 'warning'\n return 'info'\n }\n\n let validatedCount = 0\n\n const validate = async (document: SanityDocument) => {\n let markers: ValidationMarker[]\n\n try {\n const timeout = Symbol('timeout')\n\n const {validateDocument} = await resolveLocalPackage<typeof import('sanity')>(\n 'sanity',\n workDir,\n )\n\n const result = await Promise.race([\n validateDocument({\n document,\n environment: 'cli',\n getClient,\n getDocumentExists,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n workspace,\n }),\n new Promise<typeof timeout>((resolve) =>\n setTimeout(() => resolve(timeout), DOCUMENT_VALIDATION_TIMEOUT),\n ),\n ])\n\n if (result === timeout) {\n throw new Error(\n `Document '${document._id}' failed to validate within ${DOCUMENT_VALIDATION_TIMEOUT}ms.`,\n )\n }\n\n markers = result\n // filter out unwanted levels\n .filter((marker) => {\n const markerValue = levelValues[marker.level]\n const flagLevelValue =\n levelValues[level as keyof typeof levelValues] ?? levelValues.info\n return markerValue <= flagLevelValue\n })\n } catch (err) {\n const errorMessage =\n isRecord(err) && typeof err.message === 'string' ? err.message : 'Unknown error'\n\n const message = `Exception occurred while validating value: ${errorMessage}`\n\n markers = [\n {\n level: 'error',\n message,\n path: [],\n },\n ]\n }\n\n validatedCount++\n\n const intentUrl =\n studioHost &&\n `${studioHost}${path.resolve(\n workspace.basePath,\n `/intent/edit/id=${encodeURIComponent(document._id)};type=${encodeURIComponent(\n document._type,\n )}`,\n )}`\n\n report.stream.validation.emit({\n documentId: document._id,\n documentType: document._type,\n ...(intentUrl && {intentUrl}),\n level: getLevel(markers),\n markers,\n revision: document._rev,\n validatedCount,\n })\n }\n\n await pMap(getDocuments(), validate, {concurrency: MAX_VALIDATION_CONCURRENCY})\n\n report.stream.validation.end()\n } finally {\n await cleanupDownloadedDocuments?.()\n }\n}\n"],"names":["fs","os","path","readline","Readable","workerData","_workerData","isMainThread","parentPort","getStudioWorkspaces","isRecord","resolveLocalPackage","createClient","WorkerChannelReporter","pMap","checkDocumentAvailability","exportDocuments","getDocumentCount","extractDocumentsFromNdjsonOrTarball","getWorkspace","DOCUMENT_VALIDATION_TIMEOUT","getReferenceIds","isValidId","levelValues","MAX_VALIDATION_CONCURRENCY","REFERENCE_INTEGRITY_BATCH_SIZE","shouldIncludeDocument","clientConfig","dataset","level","maxCustomValidationConcurrency","maxFetchConcurrency","ndjsonFilePath","projectId","studioHost","workDir","workspace","workspaceName","Error","report","from","readerToGenerator","reader","done","value","read","main","process","exit","loadWorkspace","workspaces","resolvedDataset","resolvedProjectId","client","requestTagPrefix","config","apiVersion","event","loadedWorkspace","basePath","name","downloadFromExport","datasetName","projId","documentCount","loadedDocumentCount","response","body","getReader","downloadedCount","referencedIds","Set","documentIds","lines","createInterface","input","slugDate","Date","toISOString","replaceAll","toLowerCase","tempOutputFile","join","tmpdir","outputStream","createWriteStream","line","document","JSON","parse","add","_id","referenceId","write","stream","exportProgress","emit","Promise","resolve","reject","close","err","end","exportFinished","totalDocumentsToValidate","size","getDocuments","createReadStream","cleanup","promises","rm","downloadFromFile","filePath","undefined","checkReferenceExistence","_referencedIds","existingIds","idsToCheck","filter","id","has","toSorted","batches","i","length","push","slice","batch","omitted","omittedIds","item","reason","loadedReferenceIntegrity","cleanupDownloadedDocuments","getClient","options","withConfig","getDocumentExists","getLevel","markers","foundWarning","marker","validatedCount","validate","timeout","Symbol","validateDocument","result","race","environment","setTimeout","markerValue","flagLevelValue","info","errorMessage","message","intentUrl","encodeURIComponent","_type","validation","documentId","documentType","revision","_rev","concurrency"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/documents/validateDocuments.worker.ts"],"sourcesContent":["import fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport readline from 'node:readline'\nimport {Readable} from 'node:stream'\nimport {workerData as _workerData, isMainThread, parentPort} from 'node:worker_threads'\n\nimport {getStudioWorkspaces, resolveLocalPackage} from '@sanity/cli-core'\nimport {type ClientConfig, createClient, type SanityDocument} from '@sanity/client'\nimport {type ValidationContext, type ValidationMarker} from '@sanity/types'\nimport {WorkerChannelReporter} from '@sanity/worker-channels'\nimport pMap from 'p-map'\n\nimport {\n type AvailabilityResponse,\n checkDocumentAvailability,\n exportDocuments,\n getDocumentCount,\n} from '../../services/documents.js'\nimport {extractDocumentsFromNdjsonOrTarball} from '../../util/extractDocumentsFromNdjsonOrTarball.js'\nimport {getWorkspace} from '../../util/getWorkspace.js'\nimport {\n DOCUMENT_VALIDATION_TIMEOUT,\n getReferenceIds,\n isValidId,\n levelValues,\n MAX_VALIDATION_CONCURRENCY,\n REFERENCE_INTEGRITY_BATCH_SIZE,\n shouldIncludeDocument,\n} from '../../util/validation/validateDocumentsUtils.js'\nimport {type ValidateDocumentsWorkerData, type ValidationWorkerChannel} from './types.js'\n\nconst {\n clientConfig,\n dataset,\n level,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n ndjsonFilePath,\n projectId,\n studioHost,\n workDir,\n workspace: workspaceName,\n} = _workerData as ValidateDocumentsWorkerData\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\nconst report = WorkerChannelReporter.from<ValidationWorkerChannel>(parentPort)\n\n// eslint-disable-next-line n/no-unsupported-features/node-builtins\nasync function* readerToGenerator(reader: ReadableStreamDefaultReader<Uint8Array>) {\n while (true) {\n const {done, value} = await reader.read()\n if (value) yield value\n if (done) return\n }\n}\n\nawait main()\nprocess.exit()\n\nasync function loadWorkspace() {\n const workspaces = await getStudioWorkspaces(workDir)\n const workspace = getWorkspace(workspaces, workspaceName)\n\n const resolvedDataset = dataset || workspace.dataset\n const resolvedProjectId = projectId || workspace.projectId\n\n const client = createClient({\n ...clientConfig,\n dataset: resolvedDataset,\n projectId: resolvedProjectId,\n requestTagPrefix: 'sanity.cli.validate',\n }).config({apiVersion: 'v2021-03-25'})\n\n report.event.loadedWorkspace({\n basePath: workspace.basePath,\n dataset: workspace.dataset,\n name: workspace.name,\n projectId: workspace.projectId,\n })\n\n return {client, dataset: resolvedDataset, projectId: resolvedProjectId, workspace}\n}\n\ninterface DownloadFromExportOptions {\n dataset: string\n projectId: string\n}\n\nasync function downloadFromExport({\n dataset: datasetName,\n projectId: projId,\n}: DownloadFromExportOptions) {\n const documentCount = await getDocumentCount({dataset: datasetName, projectId: projId})\n report.event.loadedDocumentCount({documentCount})\n\n const response = await exportDocuments({dataset: datasetName, projectId: projId})\n\n const reader = response.body?.getReader()\n if (!reader) throw new Error('Could not get reader from response body.')\n\n let downloadedCount = 0\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const lines = readline.createInterface({input: Readable.from(readerToGenerator(reader))})\n\n // Note: we stream the export to a file and then re-read from that file to\n // make this less memory intensive.\n // this is a similar pattern to the import/export CLI commands\n const slugDate = new Date()\n .toISOString()\n .replaceAll(/[^a-z0-9]/gi, '-')\n .toLowerCase()\n const tempOutputFile = path.join(os.tmpdir(), `sanity-validate-${slugDate}.ndjson`)\n const outputStream = fs.createWriteStream(tempOutputFile)\n\n for await (const line of lines) {\n const document = JSON.parse(line) as SanityDocument\n\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n\n outputStream.write(`${line}\\n`)\n }\n\n downloadedCount++\n report.stream.exportProgress.emit({documentCount, downloadedCount})\n }\n\n await new Promise<void>((resolve, reject) =>\n outputStream.close((err) => (err ? reject(err) : resolve())),\n )\n\n report.stream.exportProgress.end()\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n const getDocuments = () =>\n extractDocumentsFromNdjsonOrTarball(fs.createReadStream(tempOutputFile))\n\n return {cleanup: () => fs.promises.rm(tempOutputFile), documentIds, getDocuments, referencedIds}\n}\n\nasync function downloadFromFile(filePath: string) {\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const getDocuments = () => extractDocumentsFromNdjsonOrTarball(fs.createReadStream(filePath))\n\n for await (const document of getDocuments()) {\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n }\n }\n\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n return {cleanup: undefined, documentIds, getDocuments, referencedIds}\n}\n\ninterface CheckReferenceExistenceOptions {\n dataset: string\n documentIds: Set<string>\n projectId: string\n referencedIds: Set<string>\n}\n\nasync function checkReferenceExistence({\n dataset: datasetName,\n documentIds,\n projectId: projId,\n referencedIds: _referencedIds,\n}: CheckReferenceExistenceOptions) {\n const existingIds = new Set(documentIds)\n const idsToCheck = [..._referencedIds]\n .filter((id) => !existingIds.has(id) && isValidId(id))\n .toSorted()\n\n const batches: string[][] = []\n for (let i = 0; i < idsToCheck.length; i += REFERENCE_INTEGRITY_BATCH_SIZE) {\n batches.push(idsToCheck.slice(i, i + REFERENCE_INTEGRITY_BATCH_SIZE))\n }\n\n for (const batch of batches) {\n const {omitted} = await checkDocumentAvailability({\n dataset: datasetName,\n documentIds: batch,\n projectId: projId,\n })\n\n const omittedIds: Record<string, AvailabilityResponse['omitted'][number]['reason']> = {}\n for (const item of omitted) {\n omittedIds[item.id] = item.reason\n }\n\n for (const id of batch) {\n // unless the document ID is in the `omitted` object explictly due to\n // the reason `'existence'`, then it should exist\n if (omittedIds[id] !== 'existence') {\n existingIds.add(id)\n }\n }\n }\n report.event.loadedReferenceIntegrity()\n\n return {existingIds}\n}\n\nasync function main() {\n let cleanupDownloadedDocuments: (() => Promise<void>) | undefined\n\n try {\n const {client, dataset: datasetName, projectId: projId, workspace} = await loadWorkspace()\n const {cleanup, documentIds, getDocuments, referencedIds} = ndjsonFilePath\n ? await downloadFromFile(ndjsonFilePath)\n : await downloadFromExport({dataset: datasetName, projectId: projId})\n cleanupDownloadedDocuments = cleanup\n const {existingIds} = await checkReferenceExistence({\n dataset: datasetName,\n documentIds,\n projectId: projId,\n referencedIds,\n })\n\n const getClient = <TOptions extends Partial<ClientConfig>>(options: TOptions) =>\n client.withConfig(options)\n\n const getDocumentExists: ValidationContext['getDocumentExists'] = ({id}) =>\n Promise.resolve(existingIds.has(id))\n\n const getLevel = (markers: ValidationMarker[]) => {\n let foundWarning = false\n for (const marker of markers) {\n if (marker.level === 'error') return 'error'\n if (marker.level === 'warning') foundWarning = true\n }\n\n if (foundWarning) return 'warning'\n return 'info'\n }\n\n let validatedCount = 0\n\n const validate = async (document: SanityDocument) => {\n let markers: ValidationMarker[]\n\n try {\n const timeout = Symbol('timeout')\n\n const {validateDocument} = await resolveLocalPackage<typeof import('sanity')>(\n 'sanity',\n workDir,\n )\n\n const result = await Promise.race([\n validateDocument({\n document,\n environment: 'cli',\n getClient,\n getDocumentExists,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n workspace,\n }),\n new Promise<typeof timeout>((resolve) =>\n setTimeout(() => resolve(timeout), DOCUMENT_VALIDATION_TIMEOUT),\n ),\n ])\n\n if (result === timeout) {\n throw new Error(\n `Document '${document._id}' failed to validate within ${DOCUMENT_VALIDATION_TIMEOUT}ms.`,\n )\n }\n\n markers = result\n // filter out unwanted levels\n .filter((marker) => {\n const markerValue = levelValues[marker.level]\n const flagLevelValue =\n levelValues[level as keyof typeof levelValues] ?? levelValues.info\n return markerValue <= flagLevelValue\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error'\n\n const message = `Exception occurred while validating value: ${errorMessage}`\n\n markers = [\n {\n level: 'error',\n message,\n path: [],\n },\n ]\n }\n\n validatedCount++\n\n const intentUrl =\n studioHost &&\n `${studioHost}${path.resolve(\n workspace.basePath,\n `/intent/edit/id=${encodeURIComponent(document._id)};type=${encodeURIComponent(\n document._type,\n )}`,\n )}`\n\n report.stream.validation.emit({\n documentId: document._id,\n documentType: document._type,\n ...(intentUrl && {intentUrl}),\n level: getLevel(markers),\n markers,\n revision: document._rev,\n validatedCount,\n })\n }\n\n await pMap(getDocuments(), validate, {concurrency: MAX_VALIDATION_CONCURRENCY})\n\n report.stream.validation.end()\n } finally {\n await cleanupDownloadedDocuments?.()\n }\n}\n"],"names":["fs","os","path","readline","Readable","workerData","_workerData","isMainThread","parentPort","getStudioWorkspaces","resolveLocalPackage","createClient","WorkerChannelReporter","pMap","checkDocumentAvailability","exportDocuments","getDocumentCount","extractDocumentsFromNdjsonOrTarball","getWorkspace","DOCUMENT_VALIDATION_TIMEOUT","getReferenceIds","isValidId","levelValues","MAX_VALIDATION_CONCURRENCY","REFERENCE_INTEGRITY_BATCH_SIZE","shouldIncludeDocument","clientConfig","dataset","level","maxCustomValidationConcurrency","maxFetchConcurrency","ndjsonFilePath","projectId","studioHost","workDir","workspace","workspaceName","Error","report","from","readerToGenerator","reader","done","value","read","main","process","exit","loadWorkspace","workspaces","resolvedDataset","resolvedProjectId","client","requestTagPrefix","config","apiVersion","event","loadedWorkspace","basePath","name","downloadFromExport","datasetName","projId","documentCount","loadedDocumentCount","response","body","getReader","downloadedCount","referencedIds","Set","documentIds","lines","createInterface","input","slugDate","Date","toISOString","replaceAll","toLowerCase","tempOutputFile","join","tmpdir","outputStream","createWriteStream","line","document","JSON","parse","add","_id","referenceId","write","stream","exportProgress","emit","Promise","resolve","reject","close","err","end","exportFinished","totalDocumentsToValidate","size","getDocuments","createReadStream","cleanup","promises","rm","downloadFromFile","filePath","undefined","checkReferenceExistence","_referencedIds","existingIds","idsToCheck","filter","id","has","toSorted","batches","i","length","push","slice","batch","omitted","omittedIds","item","reason","loadedReferenceIntegrity","cleanupDownloadedDocuments","getClient","options","withConfig","getDocumentExists","getLevel","markers","foundWarning","marker","validatedCount","validate","timeout","Symbol","validateDocument","result","race","environment","setTimeout","markerValue","flagLevelValue","info","errorMessage","message","intentUrl","encodeURIComponent","_type","validation","documentId","documentType","revision","_rev","concurrency"],"mappings":"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"}
|
package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { styleText } from 'node:util';
|
|
2
|
-
import { convertToTree, formatTree, maxKeyLength } from '@sanity/cli-core/tree';
|
|
3
2
|
import { logSymbols } from '@sanity/cli-core/ux';
|
|
3
|
+
import { convertToTree, formatTree, maxKeyLength } from './tree.js';
|
|
4
4
|
import { isTty, levelValues } from './util.js';
|
|
5
5
|
const levelHeaders = {
|
|
6
6
|
error: isTty ? styleText('bold', styleText('bgRed', styleText('black', ' ERROR '))) : styleText('red', '[ERROR]'),
|
package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport {type Path, type ValidationMarker} from '@sanity/types'\n\nimport {Level} from '../../../types'\nimport {convertToTree, formatTree, maxKeyLength, type Tree} from './tree.js'\nimport {type DocumentValidationResult, isTty, levelValues} from './util.js'\n\ninterface FormatDocumentValidationOptions extends DocumentValidationResult {\n basePath?: string\n studioHost?: string\n}\n\ninterface Marker extends Pick<ValidationMarker, 'level' | 'message'> {\n path: Path\n}\n\ntype ValidationTree = Tree<Marker>\n\nconst levelHeaders = {\n error: isTty\n ? styleText('bold', styleText('bgRed', styleText('black', ' ERROR ')))\n : styleText('red', '[ERROR]'),\n info: isTty\n ? styleText('bold', styleText('cyan', styleText('black', ' INFO ')))\n : styleText('cyan', '[INFO]'),\n warning: isTty\n ? styleText('bold', styleText('bgYellow', styleText('black', ' WARN ')))\n : styleText('yellow', '[WARN]'),\n}\n/**\n * Creates a terminal hyperlink. Only outputs a hyperlink if the output is\n * determined to be a TTY\n */\nconst link = (linkText: string, url: string) =>\n isTty ? `\\u001B]8;;${url}\\u0007${linkText}\\u001B]8;;\\u0007` : styleText('underline', linkText)\n\n/**\n * For sorting markers\n */\nconst compareLevels = <T extends {level: Level; message: string}>(a: T, b: T) =>\n levelValues[a.level] - levelValues[b.level]\n\n/**\n * Formats the markers at the root of the validation tree\n */\nconst formatRootErrors = (root: ValidationTree, hasChildren: boolean, paddingLength: number) => {\n if (!root.nodes) return ''\n\n const [first, ...rest] = [...root.nodes].toSorted(compareLevels)\n if (!first) return ''\n\n const firstElbow = hasChildren ? '│ ' : '└─'\n const firstPadding = '.'.repeat(paddingLength - 6)\n const firstLine = `${firstElbow} (root) ${firstPadding} ${logSymbols[first.level]} ${\n first.message\n }`\n const subsequentPadding = ' '.repeat(paddingLength + 2)\n const subsequentElbow = hasChildren ? '│ ' : ' '\n\n const restOfLines = rest\n .map(\n (marker) =>\n `${subsequentElbow}${subsequentPadding} ${logSymbols[marker.level]} ${marker.message}`,\n )\n .join('\\n')\n return [firstLine, restOfLines].filter(Boolean).join('\\n')\n}\n\n/**\n * Formats document validation results into a user-friendly tree structure\n */\nexport function formatDocumentValidation({\n documentId,\n documentType,\n intentUrl,\n level,\n markers,\n}: FormatDocumentValidationOptions): string {\n const tree = convertToTree<Marker>(markers)\n\n const documentTypeHeader = isTty\n ? styleText('bgWhite', styleText('black', ` ${documentType} `))\n : `[${documentType}]`\n\n const header = `${levelHeaders[level]} ${documentTypeHeader} ${\n intentUrl ? link(documentId, intentUrl) : styleText('underline', documentId)\n }`\n\n const paddingLength = Math.max(maxKeyLength(tree.children) + 2, 30)\n\n const childErrors = formatTree<Marker>({\n getMessage: (marker) => [logSymbols[marker.level], marker.message].join(' '),\n getNodes: ({nodes}) => [...(nodes ?? [])].toSorted(compareLevels),\n node: tree.children,\n paddingLength,\n })\n\n const rootErrors = formatRootErrors(tree, childErrors.length > 0, paddingLength)\n\n return [header, rootErrors, childErrors].filter(Boolean).join('\\n')\n}\n"],"names":["styleText","logSymbols","convertToTree","formatTree","maxKeyLength","isTty","levelValues","levelHeaders","error","info","warning","link","linkText","url","compareLevels","a","b","level","formatRootErrors","root","hasChildren","paddingLength","nodes","first","rest","toSorted","firstElbow","firstPadding","repeat","firstLine","message","subsequentPadding","subsequentElbow","restOfLines","map","marker","join","filter","Boolean","formatDocumentValidation","documentId","documentType","intentUrl","markers","tree","documentTypeHeader","header","Math","max","children","childErrors","getMessage","getNodes","node","rootErrors","length"],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { isIndexSegment, isIndexTuple, isKeySegment } from '@sanity/types';
|
|
2
|
+
// FIXME: de-dupe this
|
|
3
|
+
// copy/paste of `pathToString` from 'sanity' to prevent circular imports
|
|
4
|
+
function pathToString(path) {
|
|
5
|
+
if (!Array.isArray(path)) {
|
|
6
|
+
throw new TypeError('Path is not an array');
|
|
7
|
+
}
|
|
8
|
+
let target = '';
|
|
9
|
+
let i = 0;
|
|
10
|
+
for (const segment of path){
|
|
11
|
+
if (isIndexSegment(segment)) {
|
|
12
|
+
target = `${target}[${segment}]`;
|
|
13
|
+
} else if (isKeySegment(segment) && segment._key) {
|
|
14
|
+
target = `${target}[_key=="${segment._key}"]`;
|
|
15
|
+
} else if (isIndexTuple(segment)) {
|
|
16
|
+
const [from, to] = segment;
|
|
17
|
+
target = `${target}[${from}:${to}]`;
|
|
18
|
+
} else if (typeof segment === 'string') {
|
|
19
|
+
const separator = i === 0 ? '' : '.';
|
|
20
|
+
target = `${target}${separator}${segment}`;
|
|
21
|
+
} else {
|
|
22
|
+
throw new TypeError(`Unsupported path segment \`${JSON.stringify(segment)}\``);
|
|
23
|
+
}
|
|
24
|
+
i++;
|
|
25
|
+
}
|
|
26
|
+
return target;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Recursively calculates the max length of all the keys in the given validation
|
|
30
|
+
* tree respecting extra length due to indentation depth. Used to calculate the
|
|
31
|
+
* padding for the rest of the tree.
|
|
32
|
+
*/ export const maxKeyLength = (children = {}, depth = 0)=>{
|
|
33
|
+
let max = 0;
|
|
34
|
+
for (const [key, child] of Object.entries(children)){
|
|
35
|
+
const currentMax = Math.max(key.length + depth * 2, maxKeyLength(child.children, depth + 1));
|
|
36
|
+
max = Math.max(max, currentMax);
|
|
37
|
+
}
|
|
38
|
+
return max;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Recursively formats a given tree into a printed user-friendly tree structure
|
|
42
|
+
*/ export const formatTree = ({ getMessage, getNodes: getLeaves = ({ nodes })=>nodes, indent = '', node = {}, paddingLength })=>{
|
|
43
|
+
const entries = Object.entries(node);
|
|
44
|
+
return entries.map(([key, child], index)=>{
|
|
45
|
+
const isLast = index === entries.length - 1;
|
|
46
|
+
const nextIndent = `${indent}${isLast ? ' ' : '│ '}`;
|
|
47
|
+
const leaves = getLeaves(child);
|
|
48
|
+
const nested = formatTree({
|
|
49
|
+
getMessage,
|
|
50
|
+
getNodes: getLeaves,
|
|
51
|
+
indent: nextIndent,
|
|
52
|
+
node: child.children,
|
|
53
|
+
paddingLength
|
|
54
|
+
});
|
|
55
|
+
if (!leaves?.length) {
|
|
56
|
+
const current = `${indent}${isLast ? '└' : '├'}─ ${key}`;
|
|
57
|
+
return [
|
|
58
|
+
current,
|
|
59
|
+
nested
|
|
60
|
+
].filter(Boolean).join('\n');
|
|
61
|
+
}
|
|
62
|
+
const [first, ...rest] = leaves;
|
|
63
|
+
const firstPadding = '.'.repeat(paddingLength - indent.length - key.length);
|
|
64
|
+
const elbow = isLast ? '└' : '├';
|
|
65
|
+
const subsequentPadding = ' '.repeat(paddingLength - indent.length + 2);
|
|
66
|
+
const firstMessage = `${indent}${elbow}─ ${key} ${firstPadding} ${getMessage(first)}`;
|
|
67
|
+
const subsequentMessages = rest.map((marker)=>`${nextIndent}${subsequentPadding} ${getMessage(marker)}`).join('\n');
|
|
68
|
+
const current = [
|
|
69
|
+
firstMessage,
|
|
70
|
+
subsequentMessages
|
|
71
|
+
].filter(Boolean).join('\n');
|
|
72
|
+
return [
|
|
73
|
+
current,
|
|
74
|
+
nested
|
|
75
|
+
].filter(Boolean).join('\n');
|
|
76
|
+
}).join('\n');
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Converts a set of markers with paths into a tree of markers where the paths
|
|
80
|
+
* are embedded in the tree
|
|
81
|
+
*/ export function convertToTree(nodes) {
|
|
82
|
+
const root = {};
|
|
83
|
+
// add the markers to the tree
|
|
84
|
+
function addNode(node, tree = root) {
|
|
85
|
+
// if we've traversed the whole path
|
|
86
|
+
if (node.path.length === 0) {
|
|
87
|
+
if (!tree.nodes) tree.nodes = []; // ensure markers is defined
|
|
88
|
+
// then add the marker to the front
|
|
89
|
+
tree.nodes.push(node);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const [current, ...rest] = node.path;
|
|
93
|
+
const key = pathToString([
|
|
94
|
+
current
|
|
95
|
+
]);
|
|
96
|
+
// ensure the current node has children and the next node
|
|
97
|
+
if (!tree.children) tree.children = {};
|
|
98
|
+
if (!(key in tree.children)) tree.children[key] = {};
|
|
99
|
+
addNode({
|
|
100
|
+
...node,
|
|
101
|
+
path: rest
|
|
102
|
+
}, tree.children[key]);
|
|
103
|
+
}
|
|
104
|
+
for (const node of nodes)addNode(node);
|
|
105
|
+
return root;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
//# sourceMappingURL=tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/actions/documents/validation/reporters/prettyReporter/tree.ts"],"sourcesContent":["import {isIndexSegment, isIndexTuple, isKeySegment, type Path} from '@sanity/types'\n\n// FIXME: de-dupe this\n// copy/paste of `pathToString` from 'sanity' to prevent circular imports\nfunction pathToString(path: Path): string {\n if (!Array.isArray(path)) {\n throw new TypeError('Path is not an array')\n }\n\n let target = ''\n let i = 0\n for (const segment of path) {\n if (isIndexSegment(segment)) {\n target = `${target}[${segment}]`\n } else if (isKeySegment(segment) && segment._key) {\n target = `${target}[_key==\"${segment._key}\"]`\n } else if (isIndexTuple(segment)) {\n const [from, to] = segment\n target = `${target}[${from}:${to}]`\n } else if (typeof segment === 'string') {\n const separator = i === 0 ? '' : '.'\n target = `${target}${separator}${segment}`\n } else {\n throw new TypeError(`Unsupported path segment \\`${JSON.stringify(segment)}\\``)\n }\n i++\n }\n return target\n}\n\ninterface BaseNode {\n path: Path\n}\n\nexport interface Tree<Node extends BaseNode> {\n children?: Record<string, Tree<Node>>\n nodes?: Node[]\n}\n\n/**\n * Recursively calculates the max length of all the keys in the given validation\n * tree respecting extra length due to indentation depth. Used to calculate the\n * padding for the rest of the tree.\n */\nexport const maxKeyLength = (children: Record<string, Tree<BaseNode>> = {}, depth = 0): number => {\n let max = 0\n for (const [key, child] of Object.entries(children)) {\n const currentMax = Math.max(key.length + depth * 2, maxKeyLength(child.children, depth + 1))\n max = Math.max(max, currentMax)\n }\n return max\n}\n\ninterface Options<Node extends BaseNode> {\n getMessage: (node: Node) => string\n paddingLength: number\n\n getNodes?: (node: Tree<Node>) => Node[] | undefined\n indent?: string\n node?: Record<string, Tree<Node>>\n}\n\n/**\n * Recursively formats a given tree into a printed user-friendly tree structure\n */\nexport const formatTree = <Node extends BaseNode>({\n getMessage,\n getNodes: getLeaves = ({nodes}) => nodes,\n indent = '',\n node = {},\n paddingLength,\n}: Options<Node>): string => {\n const entries = Object.entries(node)\n\n return entries\n .map(([key, child], index) => {\n const isLast = index === entries.length - 1\n const nextIndent = `${indent}${isLast ? ' ' : '│ '}`\n const leaves = getLeaves(child)\n\n const nested = formatTree({\n getMessage,\n getNodes: getLeaves,\n indent: nextIndent,\n node: child.children,\n paddingLength,\n })\n\n if (!leaves?.length) {\n const current = `${indent}${isLast ? '└' : '├'}─ ${key}`\n return [current, nested].filter(Boolean).join('\\n')\n }\n\n const [first, ...rest] = leaves\n const firstPadding = '.'.repeat(paddingLength - indent.length - key.length)\n const elbow = isLast ? '└' : '├'\n const subsequentPadding = ' '.repeat(paddingLength - indent.length + 2)\n\n const firstMessage = `${indent}${elbow}─ ${key} ${firstPadding} ${getMessage(first)}`\n const subsequentMessages = rest\n .map((marker) => `${nextIndent}${subsequentPadding} ${getMessage(marker)}`)\n .join('\\n')\n\n const current = [firstMessage, subsequentMessages].filter(Boolean).join('\\n')\n return [current, nested].filter(Boolean).join('\\n')\n })\n .join('\\n')\n}\n\n/**\n * Converts a set of markers with paths into a tree of markers where the paths\n * are embedded in the tree\n */\nexport function convertToTree<const Node extends BaseNode>(nodes: Node[]): Tree<Node> {\n const root: Tree<Node> = {}\n\n // add the markers to the tree\n function addNode(node: Node, tree: Tree<Node> = root) {\n // if we've traversed the whole path\n if (node.path.length === 0) {\n if (!tree.nodes) tree.nodes = [] // ensure markers is defined\n\n // then add the marker to the front\n tree.nodes.push(node)\n return\n }\n\n const [current, ...rest] = node.path\n const key = pathToString([current])\n\n // ensure the current node has children and the next node\n if (!tree.children) tree.children = {}\n if (!(key in tree.children)) tree.children[key] = {}\n\n addNode({...node, path: rest}, tree.children[key])\n }\n\n for (const node of nodes) addNode(node)\n return root\n}\n"],"names":["isIndexSegment","isIndexTuple","isKeySegment","pathToString","path","Array","isArray","TypeError","target","i","segment","_key","from","to","separator","JSON","stringify","maxKeyLength","children","depth","max","key","child","Object","entries","currentMax","Math","length","formatTree","getMessage","getNodes","getLeaves","nodes","indent","node","paddingLength","map","index","isLast","nextIndent","leaves","nested","current","filter","Boolean","join","first","rest","firstPadding","repeat","elbow","subsequentPadding","firstMessage","subsequentMessages","marker","convertToTree","root","addNode","tree","push"],"mappings":"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"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { generateHelpUrl } from '@sanity/generate-help-url';
|
|
3
|
-
import upperFirst from 'lodash-es/upperFirst.js';
|
|
1
|
+
import { formatSchemaValidation } from '../schema/formatSchemaValidation.js';
|
|
4
2
|
export class SchemaError extends Error {
|
|
5
3
|
problemGroups;
|
|
6
4
|
constructor(problemGroups){
|
|
@@ -8,30 +6,10 @@ export class SchemaError extends Error {
|
|
|
8
6
|
this.name = 'SchemaError';
|
|
9
7
|
this.problemGroups = problemGroups;
|
|
10
8
|
}
|
|
11
|
-
print(output) {
|
|
12
|
-
output.warn(
|
|
13
|
-
|
|
14
|
-
for (const problem of group.problems){
|
|
15
|
-
const icon = logSymbols[problem.severity] || logSymbols.info;
|
|
16
|
-
let message = `${icon} ${upperFirst(problem.severity)}: ${getPath(group.path)}\n${problem.message}`;
|
|
17
|
-
if (problem.helpId) {
|
|
18
|
-
message += `\nSee ${generateHelpUrl(problem.helpId)}`;
|
|
19
|
-
}
|
|
20
|
-
output.log(message);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
9
|
+
print(output, label) {
|
|
10
|
+
output.warn(`${label ?? 'Found errors in schema'}:\n`);
|
|
11
|
+
output.log(formatSchemaValidation(this.problemGroups));
|
|
23
12
|
}
|
|
24
13
|
}
|
|
25
|
-
function getPath(path) {
|
|
26
|
-
return path.map((segment)=>{
|
|
27
|
-
if (segment.kind === 'type' && segment.name && segment.type) {
|
|
28
|
-
return `${segment.name} - (${segment.type})`;
|
|
29
|
-
}
|
|
30
|
-
if (segment.kind === 'property' && segment.name) {
|
|
31
|
-
return segment.name;
|
|
32
|
-
}
|
|
33
|
-
return null;
|
|
34
|
-
}).filter(Boolean).join(' / ');
|
|
35
|
-
}
|
|
36
14
|
|
|
37
15
|
//# sourceMappingURL=SchemaError.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/graphql/SchemaError.ts"],"sourcesContent":["import {type Output} from '@sanity/cli-core'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/graphql/SchemaError.ts"],"sourcesContent":["import {type Output} from '@sanity/cli-core'\nimport {type SchemaValidationProblemGroup} from '@sanity/types'\n\nimport {formatSchemaValidation} from '../schema/formatSchemaValidation.js'\n\nexport class SchemaError extends Error {\n problemGroups: SchemaValidationProblemGroup[]\n\n constructor(problemGroups: SchemaValidationProblemGroup[]) {\n super('Schema errors encountered')\n this.name = 'SchemaError'\n this.problemGroups = problemGroups\n }\n\n print(output: Output, label?: string): void {\n output.warn(`${label ?? 'Found errors in schema'}:\\n`)\n output.log(formatSchemaValidation(this.problemGroups))\n }\n}\n"],"names":["formatSchemaValidation","SchemaError","Error","problemGroups","name","print","output","label","warn","log"],"mappings":"AAGA,SAAQA,sBAAsB,QAAO,sCAAqC;AAE1E,OAAO,MAAMC,oBAAoBC;IAC/BC,cAA6C;IAE7C,YAAYA,aAA6C,CAAE;QACzD,KAAK,CAAC;QACN,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACD,aAAa,GAAGA;IACvB;IAEAE,MAAMC,MAAc,EAAEC,KAAc,EAAQ;QAC1CD,OAAOE,IAAI,CAAC,GAAGD,SAAS,yBAAyB,GAAG,CAAC;QACrDD,OAAOG,GAAG,CAACT,uBAAuB,IAAI,CAACG,aAAa;IACtD;AACF"}
|
|
@@ -6,7 +6,6 @@ import uniqBy from 'lodash-es/uniqBy.js';
|
|
|
6
6
|
import { oneline } from 'oneline';
|
|
7
7
|
import { SCHEMA_LIFT_ANONYMOUS_OBJECT_TYPE } from './helpUrls.js';
|
|
8
8
|
import { SchemaError } from './SchemaError.js';
|
|
9
|
-
import { internal } from './types.js';
|
|
10
9
|
const skipTypes = new Set([
|
|
11
10
|
'document',
|
|
12
11
|
'reference'
|
|
@@ -288,14 +287,14 @@ export function extractFromSanitySchema(sanitySchema, extractOptions = {}) {
|
|
|
288
287
|
const objectIsBlock = isBlockType(def);
|
|
289
288
|
const objectFields = objectIsBlock ? fields.filter((field)=>!disabledBlockFields.has(field.name)) : fields;
|
|
290
289
|
return {
|
|
290
|
+
_internal: {
|
|
291
|
+
...getDeprecation(def)
|
|
292
|
+
},
|
|
291
293
|
description: getDescription(def),
|
|
292
294
|
fields: objectFields.map((field)=>isArrayOfBlocks(field) ? buildRawField(field, name) : convertType(field, name, {
|
|
293
295
|
fieldName: field.name,
|
|
294
296
|
...getDeprecation(def)
|
|
295
297
|
})),
|
|
296
|
-
[internal]: {
|
|
297
|
-
...getDeprecation(def)
|
|
298
|
-
},
|
|
299
298
|
kind: 'Type',
|
|
300
299
|
name,
|
|
301
300
|
type: 'Object'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/graphql/extractFromSanitySchema.ts"],"sourcesContent":["/* eslint-disable unicorn/consistent-function-scoping */\nimport {generateHelpUrl} from '@sanity/generate-help-url'\nimport {Schema} from '@sanity/schema'\nimport {\n type ArraySchemaType,\n type Schema as CompiledSchema,\n type CrossDatasetReferenceSchemaType,\n type IntrinsicTypeName,\n isDeprecationConfiguration,\n type ObjectField,\n type ObjectFieldType,\n type ObjectSchemaType,\n type ReferenceSchemaType,\n type SchemaType,\n} from '@sanity/types'\nimport startCase from 'lodash-es/startCase.js'\nimport uniqBy from 'lodash-es/uniqBy.js'\nimport {oneline} from 'oneline'\n\nimport {SCHEMA_LIFT_ANONYMOUS_OBJECT_TYPE} from './helpUrls.js'\nimport {SchemaError} from './SchemaError.js'\nimport {\n type ApiSpecification,\n type ConvertedFieldDefinition,\n type ConvertedInterface,\n type ConvertedType,\n type ConvertedUnion,\n type Deprecation,\n internal,\n} from './types.js'\n\nconst skipTypes = new Set(['document', 'reference'])\nconst allowedJsonTypes = new Set(['array', 'object'])\nconst disallowedCustomizedMembers = new Set(['array', 'block', 'file', 'image', 'object'])\nconst disabledBlockFields = new Set(['markDefs'])\nconst scalars = new Set(['boolean', 'number', 'string'])\n\nfunction getBaseType(baseSchema: CompiledSchema, typeName: IntrinsicTypeName): SchemaType {\n if (typeName === 'crossDatasetReference') {\n return Schema.compile({\n parent: baseSchema,\n types: [\n {\n name: `__placeholder__`,\n // Just needs _something_ to refer to, doesn't matter what\n to: [{type: 'sanity.imageAsset'}],\n type: 'crossDatasetReference',\n },\n ],\n }).get('__placeholder__')\n }\n if (typeName === 'globalDocumentReference') {\n return Schema.compile({\n parent: baseSchema,\n types: [\n {\n name: `__placeholder__`,\n // Just needs _something_ to refer to, doesn't matter what\n to: [{type: 'sanity.imageAsset'}],\n type: 'globalDocumentReference',\n },\n ],\n }).get('__placeholder__')\n }\n\n return Schema.compile({\n parent: baseSchema,\n types: [{name: `__placeholder__`, options: {hotspot: true}, type: typeName}],\n }).get('__placeholder__')\n}\n\nfunction getTypeName(str: string): string {\n const name = startCase(str).replaceAll(/\\s+/g, '')\n return name === 'Number' ? 'Float' : name\n}\n\nfunction isBaseType(type: SchemaType): boolean {\n return (\n type.name !== type.jsonType &&\n allowedJsonTypes.has(type.jsonType) &&\n !skipTypes.has(type.name) &&\n !isReference(type)\n )\n}\n\nfunction isBlockType(typeDef: ObjectField | SchemaType): boolean {\n if (typeDef.name === 'block') {\n return true\n }\n\n if (typeDef.type) {\n return isBlockType(typeDef.type)\n }\n\n return false\n}\n\nfunction hasBlockParent(typeDef: SchemaType): boolean {\n if (typeDef.type && typeDef.type.name === 'block' && !typeDef.type.type) {\n return true\n }\n\n return Boolean(typeDef.type && hasBlockParent(typeDef.type))\n}\n\nfunction isArrayOfBlocks(typeDef: ObjectField | SchemaType): boolean {\n const type = typeDef.type || typeDef\n if (!('jsonType' in type) || type.jsonType !== 'array') {\n return false\n }\n\n return (type.of || []).some((item) => hasBlockParent(item))\n}\n\nfunction isType(typeDef: ObjectField | ObjectFieldType | SchemaType, typeName: string): boolean {\n let type: ObjectField | ObjectFieldType | SchemaType | undefined = typeDef\n while (type) {\n if (type.name === typeName || (type.type && type.type.name === typeName)) {\n return true\n }\n\n type = type.type\n }\n return false\n}\n\nfunction isReference(\n typeDef: ObjectField | ObjectFieldType | SchemaType,\n): typeDef is ReferenceSchemaType {\n return isType(typeDef, 'reference')\n}\n\nfunction isCrossDatasetReference(\n typeDef: CrossDatasetReferenceSchemaType | ObjectField | ObjectFieldType | SchemaType,\n) {\n return isType(typeDef, 'crossDatasetReference')\n}\n\nfunction getCrossDatasetReferenceMetadata(\n typeDef: CrossDatasetReferenceSchemaType | ObjectField | ObjectFieldType | SchemaType,\n) {\n if (!isCrossDatasetReference(typeDef)) return\n\n function getTypeNames(\n type: CrossDatasetReferenceSchemaType | ObjectField | ObjectFieldType | SchemaType | undefined,\n ) {\n if (!type) return\n if (!('to' in type)) return getTypeNames(type.type)\n return type.to.map((t) => t.type).filter((t): t is string => typeof t === 'string')\n }\n\n function getDataset(\n type: CrossDatasetReferenceSchemaType | ObjectField | ObjectFieldType | SchemaType | undefined,\n ) {\n if (!type) return\n if ('dataset' in type && typeof type.dataset === 'string') return type.dataset\n if (type.type) return getDataset(type.type)\n }\n\n const typeNames = getTypeNames(typeDef)\n if (!typeNames) return\n\n const dataset = getDataset(typeDef)\n if (typeof dataset !== 'string') return\n\n return {dataset, typeNames}\n}\n\nexport function extractFromSanitySchema(\n sanitySchema: CompiledSchema,\n extractOptions: {nonNullDocumentFields?: boolean; withUnionCache?: boolean} = {},\n): ApiSpecification {\n const {nonNullDocumentFields, withUnionCache} = extractOptions\n const unionRecursionGuards = new Set<string>()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const unionDefinitionCache = new Map<string, any>()\n const hasErrors =\n sanitySchema._validation &&\n sanitySchema._validation.some((group) =>\n group.problems.some((problem) => problem.severity === 'error'),\n )\n\n if (hasErrors && Array.isArray(sanitySchema._validation)) {\n throw new SchemaError(sanitySchema._validation)\n }\n\n const sanityTypes = sanitySchema._original?.types || []\n const typeNames = sanitySchema.getTypeNames()\n const unionTypes: ConvertedUnion[] = []\n const types: ConvertedType[] = []\n\n for (const typeName of typeNames) {\n const schemaType = sanitySchema.get(typeName)\n if (schemaType === undefined) {\n continue\n }\n if (!isBaseType(schemaType)) {\n continue\n }\n\n const convertedType = convertType(schemaType)\n types.push(convertedType)\n }\n\n const withUnions = [...types, ...unionTypes]\n return {interfaces: [getDocumentInterfaceDefinition()], types: withUnions}\n\n function isTopLevelType(typeName: string): boolean {\n return typeNames.includes(typeName)\n }\n\n function mapFieldType(field: ObjectField | ObjectFieldType | SchemaType): string {\n if (!field.type) {\n throw new Error('Field has no type!')\n }\n\n const jsonType = 'jsonType' in field ? field.jsonType : ''\n const isScalar = scalars.has(jsonType)\n if (isScalar && jsonType === 'number') {\n return hasValidationFlag(field, 'integer') ? 'Int' : 'Float'\n } else if (isScalar) {\n return getTypeName(jsonType)\n }\n\n const type = field.type.type || field.type\n\n // In the case of nested scalars, recurse (markdown -> longText -> text -> string)\n if (type.type) {\n return mapFieldType(type)\n }\n\n switch (type.name) {\n case 'number': {\n return hasValidationFlag(field, 'integer') ? 'Int' : 'Float'\n }\n default: {\n return getTypeName(type.name)\n }\n }\n }\n\n function isArrayType(type: ObjectField | SchemaType): type is ArraySchemaType {\n return Boolean(\n ('jsonType' in type && type.jsonType === 'array') ||\n (type.type && type.type.jsonType === 'array'),\n )\n }\n\n function _convertType(\n type: ObjectField | SchemaType,\n parent: string,\n options: {isField?: boolean},\n ): ConvertedType {\n let name: string | undefined\n if (type.type) {\n name = type.type.name\n } else if ('jsonType' in type) {\n name = type.jsonType\n }\n\n if (isReference(type)) {\n return getReferenceDefinition(type)\n }\n\n if (isArrayType(type)) {\n return getArrayDefinition(type, parent, options)\n }\n\n if (name === 'document') {\n return getDocumentDefinition(type as ObjectSchemaType)\n }\n\n if (name === 'block' || name === 'object') {\n return getObjectDefinition(type, parent)\n }\n\n if (hasFields(type)) {\n return getObjectDefinition(type, parent)\n }\n\n return {\n description: getDescription(type),\n type: mapFieldType(type),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any\n }\n\n function convertType(\n type: ObjectField | SchemaType,\n parent?: string,\n props: Partial<Deprecation> & {fieldName?: string} = {},\n ): ConvertedType {\n const mapped = _convertType(type, parent || '', {isField: Boolean(props.fieldName)})\n const gqlName = props.fieldName || mapped.name\n const originalName = type.name\n const original = gqlName === originalName ? {} : {originalName: originalName}\n const crossDatasetReferenceMetadata = getCrossDatasetReferenceMetadata(type)\n\n return {\n ...getDeprecation(type.type),\n ...props,\n ...mapped,\n ...original,\n ...(crossDatasetReferenceMetadata && {crossDatasetReferenceMetadata}),\n }\n }\n\n function isField(def: ObjectField | SchemaType): def is ObjectField {\n return !('jsonType' in def) || !def.jsonType\n }\n\n function getObjectDefinition(def: ObjectField | SchemaType, parent?: string): ConvertedType {\n const isInline = isField(def)\n const isDocument = def.type ? def.type.name === 'document' : false\n const actualType = isInline ? def.type : def\n\n if (typeNeedsHoisting(actualType)) {\n throw createLiftTypeError(def.name, parent || '', actualType.name)\n }\n\n if (isInline && parent && def.type.name === 'object') {\n throw createLiftTypeError(def.name, parent)\n }\n\n if (parent && def.type && isTopLevelType(def.type.name)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return {type: getTypeName(def.type.name)} as any\n }\n\n const name = `${parent || ''}${getTypeName(def.name)}`\n const fields = collectFields(def)\n const firstUnprefixed = Math.max(\n 0,\n fields.findIndex((field) => field.name[0] !== '_'),\n )\n\n const keyField = createStringField('_key')\n\n fields.splice(firstUnprefixed, 0, keyField)\n\n if (!isDocument) {\n fields.splice(firstUnprefixed + 1, 0, createStringField('_type'))\n }\n\n const objectIsBlock = isBlockType(def)\n const objectFields = objectIsBlock\n ? fields.filter((field) => !disabledBlockFields.has(field.name))\n : fields\n\n return {\n description: getDescription(def),\n fields: objectFields.map((field) =>\n isArrayOfBlocks(field)\n ? buildRawField(field, name)\n : (convertType(field, name, {\n fieldName: field.name,\n ...getDeprecation(def),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any),\n ),\n [internal]: {\n ...getDeprecation(def),\n },\n kind: 'Type',\n name,\n type: 'Object',\n }\n }\n\n function buildRawField(field: ObjectField, parentName: string) {\n return {\n ...convertType(field, parentName, {fieldName: `${field.name}Raw`}),\n isRawAlias: true,\n type: 'JSON',\n }\n }\n\n function createStringField(name: string): ObjectField {\n return {\n name,\n type: {\n jsonType: 'string',\n name: 'string',\n type: {jsonType: 'string', name: 'string', type: undefined},\n },\n }\n }\n\n function collectFields(def: ObjectField | SchemaType) {\n const fields = gatherAllFields(def)\n if (fields.length > 0) {\n return fields\n }\n\n const extended = getBaseType(sanitySchema, def.name as IntrinsicTypeName)\n return gatherAllFields(extended)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function getReferenceDefinition(def: SchemaType): any {\n const base = {description: getDescription(def), isReference: true}\n const candidates = arrayify(gatherAllReferenceCandidates(def))\n if (candidates.length === 0) {\n throw new Error('No candidates for reference')\n }\n\n if (candidates.length === 1) {\n return {type: getTypeName(candidates[0].type.name), ...base}\n }\n\n const allTypeNames = candidates.map((c) => getTypeName(c.type.name))\n const targetTypes = [...new Set(allTypeNames)].toSorted()\n const name = targetTypes.join('Or')\n\n // Register the union type if we haven't seen it before\n if (!unionTypes.some((item) => item.name === name)) {\n unionTypes.push({\n kind: 'Union',\n name,\n types: targetTypes,\n })\n }\n\n return {\n type: name,\n ...base,\n }\n }\n\n function getArrayDefinition(\n def: ArraySchemaType,\n parent: string,\n options: {isField?: boolean} = {},\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): any {\n const base = {description: getDescription(def), kind: 'List'}\n const name = !options.isField && def.name ? {name: getTypeName(def.name)} : {}\n const candidates = def.type?.type && 'of' in def.type ? arrayify(def.type.of) : def.of\n\n return candidates.length === 1\n ? {\n children: getArrayChildDefinition(candidates[0], def),\n ...base,\n ...name,\n }\n : {\n children: getUnionDefinition(candidates, def, {grandParent: parent}),\n ...base,\n ...name,\n }\n }\n\n function getArrayChildDefinition(child: SchemaType, arrayDef: SchemaType) {\n if (typeNeedsHoisting(child)) {\n // Seems to be inline? Should be hoisted?\n throw createLiftTypeError(child.name, arrayDef.name)\n }\n\n if (isReference(child)) {\n return getReferenceDefinition(child)\n }\n\n // In the case of nested scalars, recurse (markdown -> longText -> text -> string)\n if (scalars.has(child.jsonType) && !scalars.has(child.name)) {\n return {type: mapFieldType(child)}\n }\n\n return {type: getTypeName(child.name)}\n }\n\n function typeNeedsHoisting(type: SchemaType & {isCustomized?: boolean}): boolean {\n if (type.name === 'object') {\n return true\n }\n\n if (type.jsonType === 'object' && !isTopLevelType(type.name)) {\n return true\n }\n\n if (type.isCustomized && !isTopLevelType(type.name)) {\n return true\n }\n\n if (type.isCustomized && disallowedCustomizedMembers.has(type.name)) {\n return true\n }\n\n return false\n }\n\n function getUnionDefinition(\n candidates: ObjectSchemaType[],\n parent: SchemaType,\n options: {grandParent?: string} = {},\n ) {\n if (candidates.length < 2) {\n throw new Error('Not enough candidates for a union type')\n }\n\n // #1482: When creating union definition do not get caught in recursion loop\n // for types that reference themselves\n const guardPathName = `${typeof parent === 'object' ? parent.name : parent}`\n if (unionRecursionGuards.has(guardPathName)) {\n return {}\n }\n\n const unionCacheKey = `${options.grandParent}-${guardPathName}-${candidates\n .map((c) => c.type?.name)\n .join('-')}`\n if (withUnionCache && unionDefinitionCache.has(unionCacheKey)) {\n return unionDefinitionCache.get(unionCacheKey)\n }\n\n try {\n unionRecursionGuards.add(guardPathName)\n\n for (const [i, def] of candidates.entries()) {\n if (typeNeedsHoisting(def)) {\n throw createLiftTypeArrayError(\n i,\n parent.name,\n def.type ? def.type.name : def.name,\n options.grandParent,\n )\n }\n }\n\n const converted = candidates.map((def) => convertType(def))\n\n const getName = (def: {type: string | {name: string}}): string =>\n typeof def.type === 'string' ? def.type : def.type.name\n\n // We might end up with union types being returned - these needs to be flattened\n // so that an ImageOr(PersonOrPet) becomes ImageOrPersonOrPet\n // eslint-disable-next-line unicorn/no-array-reduce\n const flattened = converted.reduce(\n (acc, candidate) => {\n const union = unionTypes.find((item) => item.name === candidate.type)\n return union\n ? // eslint-disable-next-line unicorn/prefer-spread\n acc.concat(union.types.map((type) => ({isReference: candidate.isReference, type})))\n : [...acc, candidate]\n },\n [] as {isReference?: boolean; name?: string; type: string | {name: string}}[],\n )\n\n let allCandidatesAreDocuments = true\n const refs: (string | {name: string})[] = []\n const inlineObjs: string[] = []\n const allTypeNames: string[] = []\n for (const def of flattened) {\n if (def.isReference) {\n refs.push(def.type)\n }\n if (!isReference) {\n inlineObjs.push(def.name || '')\n }\n\n const typeName = typeof def.type === 'string' ? def.type : def.type.name\n\n // Here we remove duplicates, as they might appear twice due to in-line usage of types as well as references\n if (def.name || def.type) {\n allTypeNames.push(def.isReference ? typeName : def.name || '')\n }\n\n const typeDef = sanityTypes.find((type) => type.name === getName(def))\n if (!typeDef || typeDef.type !== 'document') {\n allCandidatesAreDocuments = false\n }\n }\n\n const interfaces = allCandidatesAreDocuments ? ['Document'] : undefined\n const possibleTypes = [...new Set(allTypeNames)].toSorted()\n\n if (possibleTypes.length < 2) {\n throw new Error(`Not enough types for a union type. Parent: ${parent.name}`)\n }\n\n const name = possibleTypes.join('Or')\n\n if (!unionTypes.some((item) => item.name === name)) {\n unionTypes.push({\n interfaces,\n kind: 'Union',\n name,\n types: possibleTypes,\n })\n }\n\n const references = refs.length > 0 ? refs : undefined\n const inlineObjects = inlineObjs.length > 0 ? inlineObjs : undefined\n\n const unionDefinition = isReference(parent)\n ? {references, type: name}\n : {inlineObjects, references, type: name}\n\n unionDefinitionCache.set(unionCacheKey, unionDefinition)\n return unionDefinition\n } finally {\n unionRecursionGuards.delete(guardPathName)\n }\n }\n\n function getDocumentDefinition(def: ObjectSchemaType) {\n const objectDef = getObjectDefinition(def)\n const fields = [...getDocumentInterfaceFields(def), ...objectDef.fields]\n\n return {...objectDef, fields, interfaces: ['Document']}\n }\n\n function getDocumentInterfaceDefinition(): ConvertedInterface {\n return {\n description: 'A Sanity document',\n fields: getDocumentInterfaceFields(),\n kind: 'Interface',\n name: 'Document',\n }\n }\n\n function getDocumentInterfaceFields(type?: ObjectSchemaType): ConvertedFieldDefinition[] {\n const isNullable = typeof nonNullDocumentFields === 'boolean' ? !nonNullDocumentFields : true\n return [\n {\n description: 'Document ID',\n fieldName: '_id',\n isNullable,\n type: 'ID',\n ...getDeprecation(type),\n },\n {\n description: 'Document type',\n fieldName: '_type',\n isNullable,\n type: 'String',\n ...getDeprecation(type),\n },\n {\n description: 'Date the document was created',\n fieldName: '_createdAt',\n isNullable,\n type: 'Datetime',\n ...getDeprecation(type),\n },\n {\n description: 'Date the document was last modified',\n fieldName: '_updatedAt',\n isNullable,\n type: 'Datetime',\n ...getDeprecation(type),\n },\n {\n description: 'Current document revision',\n fieldName: '_rev',\n isNullable,\n type: 'String',\n ...getDeprecation(type),\n },\n ]\n }\n\n function arrayify(thing: unknown) {\n if (Array.isArray(thing)) {\n return thing\n }\n\n return thing === null || thing === undefined ? [] : [thing]\n }\n\n function hasValidationFlag(\n field: ObjectField | ObjectFieldType | SchemaType,\n flag: string,\n ): boolean {\n return (\n 'validation' in field &&\n Array.isArray(field.validation) &&\n field.validation.some(\n (rule) => rule && '_rules' in rule && rule._rules.some((item) => item.flag === flag),\n )\n )\n }\n\n function getDescription(type: ObjectField | SchemaType): string | undefined {\n const description = type.type && type.type.description\n return typeof description === 'string' ? description : undefined\n }\n\n function gatherAllReferenceCandidates(type: SchemaType): ObjectSchemaType[] {\n const allFields = gatherReferenceCandidates(type)\n return uniqBy(allFields, 'name')\n }\n\n function gatherReferenceCandidates(type: SchemaType): ObjectSchemaType[] {\n const refTo = 'to' in type ? type.to : []\n return 'type' in type && type.type ? [...gatherReferenceCandidates(type.type), ...refTo] : refTo\n }\n\n function gatherAllFields(type: ObjectField | SchemaType) {\n const allFields = gatherFields(type)\n return uniqBy(allFields, 'name')\n }\n\n function gatherFields(type: ObjectField | SchemaType): ObjectField[] {\n if ('fields' in type) {\n return type.type ? [...gatherFields(type.type), ...type.fields] : type.fields\n }\n\n return []\n }\n\n function hasFieldsLikeShape(type: unknown): type is {fields: unknown} {\n return typeof type === 'object' && type !== null && 'fields' in type\n }\n\n function hasArrayOfFields(type: unknown): type is {fields: ObjectField[]} {\n return hasFieldsLikeShape(type) && Array.isArray(type.fields)\n }\n\n function hasFields(type: ObjectField | SchemaType): boolean {\n if (hasArrayOfFields(type)) {\n return gatherAllFields(type).length > 0\n }\n\n return 'type' in type && type.type ? hasFields(type.type) : false\n }\n}\n\nfunction createLiftTypeArrayError(\n index: number,\n parent: string,\n inlineType = 'object',\n grandParent = '',\n) {\n const helpUrl = generateHelpUrl(SCHEMA_LIFT_ANONYMOUS_OBJECT_TYPE)\n const context = [grandParent, parent].filter(Boolean).join('/')\n return new HelpfulError(\n oneline`\n Encountered anonymous inline ${inlineType} at index ${index} for type/field ${context}.\n To use this type with GraphQL you will need to create a top-level schema type for it.\n See ${helpUrl}`,\n helpUrl,\n )\n}\n\nfunction createLiftTypeError(typeName: string, parent: string, inlineType = 'object') {\n const helpUrl = generateHelpUrl(SCHEMA_LIFT_ANONYMOUS_OBJECT_TYPE)\n return new HelpfulError(\n oneline`\n Encountered anonymous inline ${inlineType} \"${typeName}\" for field/type \"${parent}\".\n To use this field with GraphQL you will need to create a top-level schema type for it.\n See ${helpUrl}`,\n helpUrl,\n )\n}\n\nclass HelpfulError extends Error {\n helpUrl?: string\n\n constructor(message: string, helpUrl?: string) {\n super(message)\n this.name = 'HelpfulError'\n this.helpUrl = helpUrl\n }\n}\n\nfunction getDeprecation(type?: ObjectField | ObjectFieldType | SchemaType): Partial<Deprecation> {\n return isDeprecationConfiguration(type)\n ? {\n deprecationReason: type.deprecated.reason,\n }\n : {}\n}\n"],"names":["generateHelpUrl","Schema","isDeprecationConfiguration","startCase","uniqBy","oneline","SCHEMA_LIFT_ANONYMOUS_OBJECT_TYPE","SchemaError","internal","skipTypes","Set","allowedJsonTypes","disallowedCustomizedMembers","disabledBlockFields","scalars","getBaseType","baseSchema","typeName","compile","parent","types","name","to","type","get","options","hotspot","getTypeName","str","replaceAll","isBaseType","jsonType","has","isReference","isBlockType","typeDef","hasBlockParent","Boolean","isArrayOfBlocks","of","some","item","isType","isCrossDatasetReference","getCrossDatasetReferenceMetadata","getTypeNames","map","t","filter","getDataset","dataset","typeNames","extractFromSanitySchema","sanitySchema","extractOptions","nonNullDocumentFields","withUnionCache","unionRecursionGuards","unionDefinitionCache","Map","hasErrors","_validation","group","problems","problem","severity","Array","isArray","sanityTypes","_original","unionTypes","schemaType","undefined","convertedType","convertType","push","withUnions","interfaces","getDocumentInterfaceDefinition","isTopLevelType","includes","mapFieldType","field","Error","isScalar","hasValidationFlag","isArrayType","_convertType","getReferenceDefinition","getArrayDefinition","getDocumentDefinition","getObjectDefinition","hasFields","description","getDescription","props","mapped","isField","fieldName","gqlName","originalName","original","crossDatasetReferenceMetadata","getDeprecation","def","isInline","isDocument","actualType","typeNeedsHoisting","createLiftTypeError","fields","collectFields","firstUnprefixed","Math","max","findIndex","keyField","createStringField","splice","objectIsBlock","objectFields","buildRawField","kind","parentName","isRawAlias","gatherAllFields","length","extended","base","candidates","arrayify","gatherAllReferenceCandidates","allTypeNames","c","targetTypes","toSorted","join","children","getArrayChildDefinition","getUnionDefinition","grandParent","child","arrayDef","isCustomized","guardPathName","unionCacheKey","add","i","entries","createLiftTypeArrayError","converted","getName","flattened","reduce","acc","candidate","union","find","concat","allCandidatesAreDocuments","refs","inlineObjs","possibleTypes","references","inlineObjects","unionDefinition","set","delete","objectDef","getDocumentInterfaceFields","isNullable","thing","flag","validation","rule","_rules","allFields","gatherReferenceCandidates","refTo","gatherFields","hasFieldsLikeShape","hasArrayOfFields","index","inlineType","helpUrl","context","HelpfulError","message","deprecationReason","deprecated","reason"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/graphql/extractFromSanitySchema.ts"],"sourcesContent":["/* eslint-disable unicorn/consistent-function-scoping */\nimport {generateHelpUrl} from '@sanity/generate-help-url'\nimport {Schema} from '@sanity/schema'\nimport {\n type ArraySchemaType,\n type Schema as CompiledSchema,\n type CrossDatasetReferenceSchemaType,\n type IntrinsicTypeName,\n isDeprecationConfiguration,\n type ObjectField,\n type ObjectFieldType,\n type ObjectSchemaType,\n type ReferenceSchemaType,\n type SchemaType,\n} from '@sanity/types'\nimport startCase from 'lodash-es/startCase.js'\nimport uniqBy from 'lodash-es/uniqBy.js'\nimport {oneline} from 'oneline'\n\nimport {SCHEMA_LIFT_ANONYMOUS_OBJECT_TYPE} from './helpUrls.js'\nimport {SchemaError} from './SchemaError.js'\nimport {\n type ApiSpecification,\n type ConvertedFieldDefinition,\n type ConvertedInterface,\n type ConvertedType,\n type ConvertedUnion,\n type Deprecation,\n} from './types.js'\n\nconst skipTypes = new Set(['document', 'reference'])\nconst allowedJsonTypes = new Set(['array', 'object'])\nconst disallowedCustomizedMembers = new Set(['array', 'block', 'file', 'image', 'object'])\nconst disabledBlockFields = new Set(['markDefs'])\nconst scalars = new Set(['boolean', 'number', 'string'])\n\nfunction getBaseType(baseSchema: CompiledSchema, typeName: IntrinsicTypeName): SchemaType {\n if (typeName === 'crossDatasetReference') {\n return Schema.compile({\n parent: baseSchema,\n types: [\n {\n name: `__placeholder__`,\n // Just needs _something_ to refer to, doesn't matter what\n to: [{type: 'sanity.imageAsset'}],\n type: 'crossDatasetReference',\n },\n ],\n }).get('__placeholder__')\n }\n if (typeName === 'globalDocumentReference') {\n return Schema.compile({\n parent: baseSchema,\n types: [\n {\n name: `__placeholder__`,\n // Just needs _something_ to refer to, doesn't matter what\n to: [{type: 'sanity.imageAsset'}],\n type: 'globalDocumentReference',\n },\n ],\n }).get('__placeholder__')\n }\n\n return Schema.compile({\n parent: baseSchema,\n types: [{name: `__placeholder__`, options: {hotspot: true}, type: typeName}],\n }).get('__placeholder__')\n}\n\nfunction getTypeName(str: string): string {\n const name = startCase(str).replaceAll(/\\s+/g, '')\n return name === 'Number' ? 'Float' : name\n}\n\nfunction isBaseType(type: SchemaType): boolean {\n return (\n type.name !== type.jsonType &&\n allowedJsonTypes.has(type.jsonType) &&\n !skipTypes.has(type.name) &&\n !isReference(type)\n )\n}\n\nfunction isBlockType(typeDef: ObjectField | SchemaType): boolean {\n if (typeDef.name === 'block') {\n return true\n }\n\n if (typeDef.type) {\n return isBlockType(typeDef.type)\n }\n\n return false\n}\n\nfunction hasBlockParent(typeDef: SchemaType): boolean {\n if (typeDef.type && typeDef.type.name === 'block' && !typeDef.type.type) {\n return true\n }\n\n return Boolean(typeDef.type && hasBlockParent(typeDef.type))\n}\n\nfunction isArrayOfBlocks(typeDef: ObjectField | SchemaType): boolean {\n const type = typeDef.type || typeDef\n if (!('jsonType' in type) || type.jsonType !== 'array') {\n return false\n }\n\n return (type.of || []).some((item) => hasBlockParent(item))\n}\n\nfunction isType(typeDef: ObjectField | ObjectFieldType | SchemaType, typeName: string): boolean {\n let type: ObjectField | ObjectFieldType | SchemaType | undefined = typeDef\n while (type) {\n if (type.name === typeName || (type.type && type.type.name === typeName)) {\n return true\n }\n\n type = type.type\n }\n return false\n}\n\nfunction isReference(\n typeDef: ObjectField | ObjectFieldType | SchemaType,\n): typeDef is ReferenceSchemaType {\n return isType(typeDef, 'reference')\n}\n\nfunction isCrossDatasetReference(\n typeDef: CrossDatasetReferenceSchemaType | ObjectField | ObjectFieldType | SchemaType,\n) {\n return isType(typeDef, 'crossDatasetReference')\n}\n\nfunction getCrossDatasetReferenceMetadata(\n typeDef: CrossDatasetReferenceSchemaType | ObjectField | ObjectFieldType | SchemaType,\n) {\n if (!isCrossDatasetReference(typeDef)) return\n\n function getTypeNames(\n type: CrossDatasetReferenceSchemaType | ObjectField | ObjectFieldType | SchemaType | undefined,\n ) {\n if (!type) return\n if (!('to' in type)) return getTypeNames(type.type)\n return type.to.map((t) => t.type).filter((t): t is string => typeof t === 'string')\n }\n\n function getDataset(\n type: CrossDatasetReferenceSchemaType | ObjectField | ObjectFieldType | SchemaType | undefined,\n ) {\n if (!type) return\n if ('dataset' in type && typeof type.dataset === 'string') return type.dataset\n if (type.type) return getDataset(type.type)\n }\n\n const typeNames = getTypeNames(typeDef)\n if (!typeNames) return\n\n const dataset = getDataset(typeDef)\n if (typeof dataset !== 'string') return\n\n return {dataset, typeNames}\n}\n\nexport function extractFromSanitySchema(\n sanitySchema: CompiledSchema,\n extractOptions: {nonNullDocumentFields?: boolean; withUnionCache?: boolean} = {},\n): ApiSpecification {\n const {nonNullDocumentFields, withUnionCache} = extractOptions\n const unionRecursionGuards = new Set<string>()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const unionDefinitionCache = new Map<string, any>()\n const hasErrors =\n sanitySchema._validation &&\n sanitySchema._validation.some((group) =>\n group.problems.some((problem) => problem.severity === 'error'),\n )\n\n if (hasErrors && Array.isArray(sanitySchema._validation)) {\n throw new SchemaError(sanitySchema._validation)\n }\n\n const sanityTypes = sanitySchema._original?.types || []\n const typeNames = sanitySchema.getTypeNames()\n const unionTypes: ConvertedUnion[] = []\n const types: ConvertedType[] = []\n\n for (const typeName of typeNames) {\n const schemaType = sanitySchema.get(typeName)\n if (schemaType === undefined) {\n continue\n }\n if (!isBaseType(schemaType)) {\n continue\n }\n\n const convertedType = convertType(schemaType)\n types.push(convertedType)\n }\n\n const withUnions = [...types, ...unionTypes]\n return {interfaces: [getDocumentInterfaceDefinition()], types: withUnions}\n\n function isTopLevelType(typeName: string): boolean {\n return typeNames.includes(typeName)\n }\n\n function mapFieldType(field: ObjectField | ObjectFieldType | SchemaType): string {\n if (!field.type) {\n throw new Error('Field has no type!')\n }\n\n const jsonType = 'jsonType' in field ? field.jsonType : ''\n const isScalar = scalars.has(jsonType)\n if (isScalar && jsonType === 'number') {\n return hasValidationFlag(field, 'integer') ? 'Int' : 'Float'\n } else if (isScalar) {\n return getTypeName(jsonType)\n }\n\n const type = field.type.type || field.type\n\n // In the case of nested scalars, recurse (markdown -> longText -> text -> string)\n if (type.type) {\n return mapFieldType(type)\n }\n\n switch (type.name) {\n case 'number': {\n return hasValidationFlag(field, 'integer') ? 'Int' : 'Float'\n }\n default: {\n return getTypeName(type.name)\n }\n }\n }\n\n function isArrayType(type: ObjectField | SchemaType): type is ArraySchemaType {\n return Boolean(\n ('jsonType' in type && type.jsonType === 'array') ||\n (type.type && type.type.jsonType === 'array'),\n )\n }\n\n function _convertType(\n type: ObjectField | SchemaType,\n parent: string,\n options: {isField?: boolean},\n ): ConvertedType {\n let name: string | undefined\n if (type.type) {\n name = type.type.name\n } else if ('jsonType' in type) {\n name = type.jsonType\n }\n\n if (isReference(type)) {\n return getReferenceDefinition(type)\n }\n\n if (isArrayType(type)) {\n return getArrayDefinition(type, parent, options)\n }\n\n if (name === 'document') {\n return getDocumentDefinition(type as ObjectSchemaType)\n }\n\n if (name === 'block' || name === 'object') {\n return getObjectDefinition(type, parent)\n }\n\n if (hasFields(type)) {\n return getObjectDefinition(type, parent)\n }\n\n return {\n description: getDescription(type),\n type: mapFieldType(type),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any\n }\n\n function convertType(\n type: ObjectField | SchemaType,\n parent?: string,\n props: Partial<Deprecation> & {fieldName?: string} = {},\n ): ConvertedType {\n const mapped = _convertType(type, parent || '', {isField: Boolean(props.fieldName)})\n const gqlName = props.fieldName || mapped.name\n const originalName = type.name\n const original = gqlName === originalName ? {} : {originalName: originalName}\n const crossDatasetReferenceMetadata = getCrossDatasetReferenceMetadata(type)\n\n return {\n ...getDeprecation(type.type),\n ...props,\n ...mapped,\n ...original,\n ...(crossDatasetReferenceMetadata && {crossDatasetReferenceMetadata}),\n }\n }\n\n function isField(def: ObjectField | SchemaType): def is ObjectField {\n return !('jsonType' in def) || !def.jsonType\n }\n\n function getObjectDefinition(def: ObjectField | SchemaType, parent?: string): ConvertedType {\n const isInline = isField(def)\n const isDocument = def.type ? def.type.name === 'document' : false\n const actualType = isInline ? def.type : def\n\n if (typeNeedsHoisting(actualType)) {\n throw createLiftTypeError(def.name, parent || '', actualType.name)\n }\n\n if (isInline && parent && def.type.name === 'object') {\n throw createLiftTypeError(def.name, parent)\n }\n\n if (parent && def.type && isTopLevelType(def.type.name)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return {type: getTypeName(def.type.name)} as any\n }\n\n const name = `${parent || ''}${getTypeName(def.name)}`\n const fields = collectFields(def)\n const firstUnprefixed = Math.max(\n 0,\n fields.findIndex((field) => field.name[0] !== '_'),\n )\n\n const keyField = createStringField('_key')\n\n fields.splice(firstUnprefixed, 0, keyField)\n\n if (!isDocument) {\n fields.splice(firstUnprefixed + 1, 0, createStringField('_type'))\n }\n\n const objectIsBlock = isBlockType(def)\n const objectFields = objectIsBlock\n ? fields.filter((field) => !disabledBlockFields.has(field.name))\n : fields\n\n return {\n _internal: {\n ...getDeprecation(def),\n },\n description: getDescription(def),\n fields: objectFields.map((field) =>\n isArrayOfBlocks(field)\n ? buildRawField(field, name)\n : (convertType(field, name, {\n fieldName: field.name,\n ...getDeprecation(def),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any),\n ),\n kind: 'Type',\n name,\n type: 'Object',\n }\n }\n\n function buildRawField(field: ObjectField, parentName: string) {\n return {\n ...convertType(field, parentName, {fieldName: `${field.name}Raw`}),\n isRawAlias: true,\n type: 'JSON',\n }\n }\n\n function createStringField(name: string): ObjectField {\n return {\n name,\n type: {\n jsonType: 'string',\n name: 'string',\n type: {jsonType: 'string', name: 'string', type: undefined},\n },\n }\n }\n\n function collectFields(def: ObjectField | SchemaType) {\n const fields = gatherAllFields(def)\n if (fields.length > 0) {\n return fields\n }\n\n const extended = getBaseType(sanitySchema, def.name as IntrinsicTypeName)\n return gatherAllFields(extended)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function getReferenceDefinition(def: SchemaType): any {\n const base = {description: getDescription(def), isReference: true}\n const candidates = arrayify(gatherAllReferenceCandidates(def))\n if (candidates.length === 0) {\n throw new Error('No candidates for reference')\n }\n\n if (candidates.length === 1) {\n return {type: getTypeName(candidates[0].type.name), ...base}\n }\n\n const allTypeNames = candidates.map((c) => getTypeName(c.type.name))\n const targetTypes = [...new Set(allTypeNames)].toSorted()\n const name = targetTypes.join('Or')\n\n // Register the union type if we haven't seen it before\n if (!unionTypes.some((item) => item.name === name)) {\n unionTypes.push({\n kind: 'Union',\n name,\n types: targetTypes,\n })\n }\n\n return {\n type: name,\n ...base,\n }\n }\n\n function getArrayDefinition(\n def: ArraySchemaType,\n parent: string,\n options: {isField?: boolean} = {},\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): any {\n const base = {description: getDescription(def), kind: 'List'}\n const name = !options.isField && def.name ? {name: getTypeName(def.name)} : {}\n const candidates = def.type?.type && 'of' in def.type ? arrayify(def.type.of) : def.of\n\n return candidates.length === 1\n ? {\n children: getArrayChildDefinition(candidates[0], def),\n ...base,\n ...name,\n }\n : {\n children: getUnionDefinition(candidates, def, {grandParent: parent}),\n ...base,\n ...name,\n }\n }\n\n function getArrayChildDefinition(child: SchemaType, arrayDef: SchemaType) {\n if (typeNeedsHoisting(child)) {\n // Seems to be inline? Should be hoisted?\n throw createLiftTypeError(child.name, arrayDef.name)\n }\n\n if (isReference(child)) {\n return getReferenceDefinition(child)\n }\n\n // In the case of nested scalars, recurse (markdown -> longText -> text -> string)\n if (scalars.has(child.jsonType) && !scalars.has(child.name)) {\n return {type: mapFieldType(child)}\n }\n\n return {type: getTypeName(child.name)}\n }\n\n function typeNeedsHoisting(type: SchemaType & {isCustomized?: boolean}): boolean {\n if (type.name === 'object') {\n return true\n }\n\n if (type.jsonType === 'object' && !isTopLevelType(type.name)) {\n return true\n }\n\n if (type.isCustomized && !isTopLevelType(type.name)) {\n return true\n }\n\n if (type.isCustomized && disallowedCustomizedMembers.has(type.name)) {\n return true\n }\n\n return false\n }\n\n function getUnionDefinition(\n candidates: ObjectSchemaType[],\n parent: SchemaType,\n options: {grandParent?: string} = {},\n ) {\n if (candidates.length < 2) {\n throw new Error('Not enough candidates for a union type')\n }\n\n // #1482: When creating union definition do not get caught in recursion loop\n // for types that reference themselves\n const guardPathName = `${typeof parent === 'object' ? parent.name : parent}`\n if (unionRecursionGuards.has(guardPathName)) {\n return {}\n }\n\n const unionCacheKey = `${options.grandParent}-${guardPathName}-${candidates\n .map((c) => c.type?.name)\n .join('-')}`\n if (withUnionCache && unionDefinitionCache.has(unionCacheKey)) {\n return unionDefinitionCache.get(unionCacheKey)\n }\n\n try {\n unionRecursionGuards.add(guardPathName)\n\n for (const [i, def] of candidates.entries()) {\n if (typeNeedsHoisting(def)) {\n throw createLiftTypeArrayError(\n i,\n parent.name,\n def.type ? def.type.name : def.name,\n options.grandParent,\n )\n }\n }\n\n const converted = candidates.map((def) => convertType(def))\n\n const getName = (def: {type: string | {name: string}}): string =>\n typeof def.type === 'string' ? def.type : def.type.name\n\n // We might end up with union types being returned - these needs to be flattened\n // so that an ImageOr(PersonOrPet) becomes ImageOrPersonOrPet\n // eslint-disable-next-line unicorn/no-array-reduce\n const flattened = converted.reduce(\n (acc, candidate) => {\n const union = unionTypes.find((item) => item.name === candidate.type)\n return union\n ? // eslint-disable-next-line unicorn/prefer-spread\n acc.concat(union.types.map((type) => ({isReference: candidate.isReference, type})))\n : [...acc, candidate]\n },\n [] as {isReference?: boolean; name?: string; type: string | {name: string}}[],\n )\n\n let allCandidatesAreDocuments = true\n const refs: (string | {name: string})[] = []\n const inlineObjs: string[] = []\n const allTypeNames: string[] = []\n for (const def of flattened) {\n if (def.isReference) {\n refs.push(def.type)\n }\n if (!isReference) {\n inlineObjs.push(def.name || '')\n }\n\n const typeName = typeof def.type === 'string' ? def.type : def.type.name\n\n // Here we remove duplicates, as they might appear twice due to in-line usage of types as well as references\n if (def.name || def.type) {\n allTypeNames.push(def.isReference ? typeName : def.name || '')\n }\n\n const typeDef = sanityTypes.find((type) => type.name === getName(def))\n if (!typeDef || typeDef.type !== 'document') {\n allCandidatesAreDocuments = false\n }\n }\n\n const interfaces = allCandidatesAreDocuments ? ['Document'] : undefined\n const possibleTypes = [...new Set(allTypeNames)].toSorted()\n\n if (possibleTypes.length < 2) {\n throw new Error(`Not enough types for a union type. Parent: ${parent.name}`)\n }\n\n const name = possibleTypes.join('Or')\n\n if (!unionTypes.some((item) => item.name === name)) {\n unionTypes.push({\n interfaces,\n kind: 'Union',\n name,\n types: possibleTypes,\n })\n }\n\n const references = refs.length > 0 ? refs : undefined\n const inlineObjects = inlineObjs.length > 0 ? inlineObjs : undefined\n\n const unionDefinition = isReference(parent)\n ? {references, type: name}\n : {inlineObjects, references, type: name}\n\n unionDefinitionCache.set(unionCacheKey, unionDefinition)\n return unionDefinition\n } finally {\n unionRecursionGuards.delete(guardPathName)\n }\n }\n\n function getDocumentDefinition(def: ObjectSchemaType) {\n const objectDef = getObjectDefinition(def)\n const fields = [...getDocumentInterfaceFields(def), ...objectDef.fields]\n\n return {...objectDef, fields, interfaces: ['Document']}\n }\n\n function getDocumentInterfaceDefinition(): ConvertedInterface {\n return {\n description: 'A Sanity document',\n fields: getDocumentInterfaceFields(),\n kind: 'Interface',\n name: 'Document',\n }\n }\n\n function getDocumentInterfaceFields(type?: ObjectSchemaType): ConvertedFieldDefinition[] {\n const isNullable = typeof nonNullDocumentFields === 'boolean' ? !nonNullDocumentFields : true\n return [\n {\n description: 'Document ID',\n fieldName: '_id',\n isNullable,\n type: 'ID',\n ...getDeprecation(type),\n },\n {\n description: 'Document type',\n fieldName: '_type',\n isNullable,\n type: 'String',\n ...getDeprecation(type),\n },\n {\n description: 'Date the document was created',\n fieldName: '_createdAt',\n isNullable,\n type: 'Datetime',\n ...getDeprecation(type),\n },\n {\n description: 'Date the document was last modified',\n fieldName: '_updatedAt',\n isNullable,\n type: 'Datetime',\n ...getDeprecation(type),\n },\n {\n description: 'Current document revision',\n fieldName: '_rev',\n isNullable,\n type: 'String',\n ...getDeprecation(type),\n },\n ]\n }\n\n function arrayify(thing: unknown) {\n if (Array.isArray(thing)) {\n return thing\n }\n\n return thing === null || thing === undefined ? [] : [thing]\n }\n\n function hasValidationFlag(\n field: ObjectField | ObjectFieldType | SchemaType,\n flag: string,\n ): boolean {\n return (\n 'validation' in field &&\n Array.isArray(field.validation) &&\n field.validation.some(\n (rule) => rule && '_rules' in rule && rule._rules.some((item) => item.flag === flag),\n )\n )\n }\n\n function getDescription(type: ObjectField | SchemaType): string | undefined {\n const description = type.type && type.type.description\n return typeof description === 'string' ? description : undefined\n }\n\n function gatherAllReferenceCandidates(type: SchemaType): ObjectSchemaType[] {\n const allFields = gatherReferenceCandidates(type)\n return uniqBy(allFields, 'name')\n }\n\n function gatherReferenceCandidates(type: SchemaType): ObjectSchemaType[] {\n const refTo = 'to' in type ? type.to : []\n return 'type' in type && type.type ? [...gatherReferenceCandidates(type.type), ...refTo] : refTo\n }\n\n function gatherAllFields(type: ObjectField | SchemaType) {\n const allFields = gatherFields(type)\n return uniqBy(allFields, 'name')\n }\n\n function gatherFields(type: ObjectField | SchemaType): ObjectField[] {\n if ('fields' in type) {\n return type.type ? [...gatherFields(type.type), ...type.fields] : type.fields\n }\n\n return []\n }\n\n function hasFieldsLikeShape(type: unknown): type is {fields: unknown} {\n return typeof type === 'object' && type !== null && 'fields' in type\n }\n\n function hasArrayOfFields(type: unknown): type is {fields: ObjectField[]} {\n return hasFieldsLikeShape(type) && Array.isArray(type.fields)\n }\n\n function hasFields(type: ObjectField | SchemaType): boolean {\n if (hasArrayOfFields(type)) {\n return gatherAllFields(type).length > 0\n }\n\n return 'type' in type && type.type ? hasFields(type.type) : false\n }\n}\n\nfunction createLiftTypeArrayError(\n index: number,\n parent: string,\n inlineType = 'object',\n grandParent = '',\n) {\n const helpUrl = generateHelpUrl(SCHEMA_LIFT_ANONYMOUS_OBJECT_TYPE)\n const context = [grandParent, parent].filter(Boolean).join('/')\n return new HelpfulError(\n oneline`\n Encountered anonymous inline ${inlineType} at index ${index} for type/field ${context}.\n To use this type with GraphQL you will need to create a top-level schema type for it.\n See ${helpUrl}`,\n helpUrl,\n )\n}\n\nfunction createLiftTypeError(typeName: string, parent: string, inlineType = 'object') {\n const helpUrl = generateHelpUrl(SCHEMA_LIFT_ANONYMOUS_OBJECT_TYPE)\n return new HelpfulError(\n oneline`\n Encountered anonymous inline ${inlineType} \"${typeName}\" for field/type \"${parent}\".\n To use this field with GraphQL you will need to create a top-level schema type for it.\n See ${helpUrl}`,\n helpUrl,\n )\n}\n\nclass HelpfulError extends Error {\n helpUrl?: string\n\n constructor(message: string, helpUrl?: string) {\n super(message)\n this.name = 'HelpfulError'\n this.helpUrl = helpUrl\n }\n}\n\nfunction getDeprecation(type?: ObjectField | ObjectFieldType | SchemaType): Partial<Deprecation> {\n return isDeprecationConfiguration(type)\n ? {\n deprecationReason: type.deprecated.reason,\n }\n : {}\n}\n"],"names":["generateHelpUrl","Schema","isDeprecationConfiguration","startCase","uniqBy","oneline","SCHEMA_LIFT_ANONYMOUS_OBJECT_TYPE","SchemaError","skipTypes","Set","allowedJsonTypes","disallowedCustomizedMembers","disabledBlockFields","scalars","getBaseType","baseSchema","typeName","compile","parent","types","name","to","type","get","options","hotspot","getTypeName","str","replaceAll","isBaseType","jsonType","has","isReference","isBlockType","typeDef","hasBlockParent","Boolean","isArrayOfBlocks","of","some","item","isType","isCrossDatasetReference","getCrossDatasetReferenceMetadata","getTypeNames","map","t","filter","getDataset","dataset","typeNames","extractFromSanitySchema","sanitySchema","extractOptions","nonNullDocumentFields","withUnionCache","unionRecursionGuards","unionDefinitionCache","Map","hasErrors","_validation","group","problems","problem","severity","Array","isArray","sanityTypes","_original","unionTypes","schemaType","undefined","convertedType","convertType","push","withUnions","interfaces","getDocumentInterfaceDefinition","isTopLevelType","includes","mapFieldType","field","Error","isScalar","hasValidationFlag","isArrayType","_convertType","getReferenceDefinition","getArrayDefinition","getDocumentDefinition","getObjectDefinition","hasFields","description","getDescription","props","mapped","isField","fieldName","gqlName","originalName","original","crossDatasetReferenceMetadata","getDeprecation","def","isInline","isDocument","actualType","typeNeedsHoisting","createLiftTypeError","fields","collectFields","firstUnprefixed","Math","max","findIndex","keyField","createStringField","splice","objectIsBlock","objectFields","_internal","buildRawField","kind","parentName","isRawAlias","gatherAllFields","length","extended","base","candidates","arrayify","gatherAllReferenceCandidates","allTypeNames","c","targetTypes","toSorted","join","children","getArrayChildDefinition","getUnionDefinition","grandParent","child","arrayDef","isCustomized","guardPathName","unionCacheKey","add","i","entries","createLiftTypeArrayError","converted","getName","flattened","reduce","acc","candidate","union","find","concat","allCandidatesAreDocuments","refs","inlineObjs","possibleTypes","references","inlineObjects","unionDefinition","set","delete","objectDef","getDocumentInterfaceFields","isNullable","thing","flag","validation","rule","_rules","allFields","gatherReferenceCandidates","refTo","gatherFields","hasFieldsLikeShape","hasArrayOfFields","index","inlineType","helpUrl","context","HelpfulError","message","deprecationReason","deprecated","reason"],"mappings":"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"}
|