sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
1 lines • 38.6 kB
Source Map (JSON)
{"version":3,"file":"PostMessageSchema.mjs","sources":["../../src/presentation/overlays/schema/helpers.ts","../../src/presentation/overlays/schema/SchemaIcon.tsx","../../src/presentation/overlays/schema/extract.tsx","../../src/presentation/overlays/schema/PostMessageSchema.tsx"],"sourcesContent":["import {\n type ArraySchemaType,\n type NumberSchemaType,\n type ObjectField,\n type ObjectFieldType,\n type ObjectSchemaType,\n type ReferenceSchemaType,\n type Rule,\n type Schema as SchemaDef,\n type SchemaType as SanitySchemaType,\n type StringSchemaType,\n} from '@sanity/types'\nimport {type SchemaType} from 'groq-js'\n\nexport function isFieldRequired(field: ObjectField): boolean {\n const {validation} = field.type\n if (!validation) {\n return false\n }\n const rules = Array.isArray(validation) ? validation : [validation]\n for (const rule of rules) {\n let required = false\n\n // hack to check if a field is required. We create a proxy that returns itself when a method is called,\n // if the method is \"required\" we set a flag\n const proxy = new Proxy(\n {},\n {\n get: (target, methodName) => () => {\n if (methodName === 'required') {\n required = true\n }\n return proxy\n },\n },\n ) as Rule\n\n if (typeof rule === 'function') {\n rule(proxy)\n if (required) {\n return true\n }\n }\n\n if (typeof rule === 'object' && rule !== null && '_required' in rule) {\n if (rule._required === 'required') {\n return true\n }\n }\n }\n\n return false\n}\n\nfunction isType(\n typeDef: SanitySchemaType | ObjectField | ObjectFieldType,\n typeName: string,\n): boolean {\n let type: SchemaType | ObjectField | ObjectFieldType | 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\nexport function isObjectType(typeDef: SanitySchemaType): typeDef is ObjectSchemaType {\n return isType(typeDef, 'object') || typeDef.jsonType === 'object' || 'fields' in typeDef\n}\nexport function isArrayType(typeDef: SanitySchemaType): typeDef is ArraySchemaType {\n return isType(typeDef, 'array')\n}\nexport function isReferenceType(typeDef: SanitySchemaType): typeDef is ReferenceSchemaType {\n return isType(typeDef, 'reference')\n}\n// @todo\nexport function isCrossDatasetReferenceType(typeDef: SanitySchemaType): boolean {\n return isType(typeDef, 'crossDatasetReference')\n}\nexport function isStringType(typeDef: SanitySchemaType): typeDef is StringSchemaType {\n return isType(typeDef, 'string')\n}\nexport function isNumberType(typeDef: SanitySchemaType): typeDef is NumberSchemaType {\n return isType(typeDef, 'number')\n}\n\n// Traverse the type tree and return the \"last\" type, ie deepest type in the tree\nexport function lastType(typeDef: SanitySchemaType): SanitySchemaType | undefined {\n let type: SchemaType | ObjectField | ObjectFieldType | undefined = typeDef\n while (type) {\n if (!type.type) {\n return type\n }\n type = type.type\n }\n\n return undefined\n}\n\n// Traverse the type tree and gather all the fields\nexport function gatherFields(type: SanitySchemaType | ObjectSchemaType): ObjectField[] {\n if ('fields' in type) {\n return type.type ? gatherFields(type.type).concat(type.fields) : type.fields\n }\n\n return []\n}\n\n// Sorts the types by their dependencies by using a topological sort depth-first algorithm.\nexport function sortByDependencies(compiledSchema: SchemaDef): string[] {\n const seen = new Set<SanitySchemaType>()\n\n // Walks the dependencies of a schema type and adds them to the dependencies set\n function walkDependencies(\n schemaType: SanitySchemaType,\n dependencies: Set<SanitySchemaType>,\n ): void {\n if (seen.has(schemaType)) {\n return\n }\n seen.add(schemaType)\n\n if ('fields' in schemaType) {\n for (const field of gatherFields(schemaType)) {\n const last = lastType(field.type)\n if (last!.name === 'document') {\n dependencies.add(last!)\n continue\n }\n\n let schemaTypeName: string | undefined\n if (schemaType.type!.type) {\n schemaTypeName = field.type.type!.name\n } else if ('jsonType' in schemaType.type!) {\n schemaTypeName = field.type.jsonType\n }\n\n if (schemaTypeName === 'object' || schemaTypeName === 'block') {\n if (isReferenceType(field.type)) {\n field.type.to.forEach((ref) => dependencies.add(ref.type!))\n } else {\n dependencies.add(field.type)\n }\n }\n walkDependencies(field.type, dependencies)\n }\n } else if ('of' in schemaType) {\n for (const item of schemaType.of) {\n walkDependencies(item, dependencies)\n }\n }\n }\n const dependencyMap = new Map<SanitySchemaType, Set<SanitySchemaType>>()\n compiledSchema.getTypeNames().forEach((typeName) => {\n const schemaType = compiledSchema.get(typeName)\n if (schemaType === undefined || schemaType.type === null) {\n return\n }\n const dependencies = new Set<SanitySchemaType>()\n\n walkDependencies(schemaType, dependencies)\n dependencyMap.set(schemaType, dependencies)\n seen.clear() // Clear the seen set for the next type\n })\n\n // Sorts the types by their dependencies\n const typeNames: string[] = []\n // holds a temporary mark for types that are currently being visited, to detect cyclic dependencies\n const currentlyVisiting = new Set<SanitySchemaType>()\n\n // holds a permanent mark for types that have been already visited\n const visited = new Set<SanitySchemaType>()\n\n // visit implements a depth-first search\n function visit(type: SanitySchemaType) {\n if (visited.has(type)) {\n return\n }\n // If we find a type that is already in the temporary mark, we have a cyclic dependency.\n if (currentlyVisiting.has(type)) {\n return\n }\n // mark this as a temporary mark, meaning it's being visited\n currentlyVisiting.add(type)\n const deps = dependencyMap.get(type)\n if (deps !== undefined) {\n deps.forEach((dep) => visit(dep))\n }\n currentlyVisiting.delete(type)\n visited.add(type)\n\n if (!typeNames.includes(type.name)) {\n typeNames.unshift(type.name)\n }\n }\n // Visit all types in the dependency map\n for (const [type] of dependencyMap) {\n visit(type)\n }\n\n return typeNames\n}\n","import {type SchemaType as SanitySchemaType} from '@sanity/types'\nimport {type ThemeContextValue, ThemeProvider} from '@sanity/ui'\nimport {type FunctionComponent, isValidElement} from 'react'\nimport {ServerStyleSheet, StyleSheetManager} from 'styled-components'\n\nexport const SchemaIcon: FunctionComponent<{\n schemaType: SanitySchemaType\n theme: ThemeContextValue\n}> = function SchemaIcon({schemaType, theme: themeContext}) {\n const {theme, scheme, tone} = themeContext\n const sheet = new ServerStyleSheet()\n const Icon = schemaType.icon\n\n return Icon ? (\n <StyleSheetManager sheet={sheet.instance}>\n <ThemeProvider theme={theme} scheme={scheme} tone={tone}>\n {isValidElement(Icon) ? Icon : <Icon />}\n </ThemeProvider>\n </StyleSheetManager>\n ) : null\n}\n","import {\n type InsertMenuOptions,\n type SchemaArrayNode,\n type SchemaBooleanNode,\n type SchemaInlineNode,\n type SchemaNode,\n type SchemaNullNode,\n type SchemaNumberNode,\n type SchemaObjectField,\n type SchemaObjectNode,\n type SchemaStringNode,\n type SchemaType,\n type SchemaUnionNode,\n type SchemaUnionNodeOptions,\n type SchemaUnionOption,\n type SchemaUnknownNode,\n} from '@sanity/presentation-comlink'\nimport {\n type ArraySchemaType,\n type NumberSchemaType,\n type ObjectSchemaType,\n type ReferenceSchemaType,\n type SchemaType as SanitySchemaType,\n type StringSchemaType,\n} from '@sanity/types'\nimport {type ThemeContextValue} from '@sanity/ui'\nimport {renderToString} from 'react-dom/server'\nimport {type Workspace} from 'sanity'\n\nimport {\n gatherFields,\n isArrayType,\n isCrossDatasetReferenceType,\n isFieldRequired,\n isNumberType,\n isObjectType,\n isReferenceType,\n isStringType,\n lastType,\n sortByDependencies,\n} from './helpers'\nimport {SchemaIcon} from './SchemaIcon'\n\nconst documentDefaultFields = (typeName: string): Record<string, SchemaObjectField> => ({\n _id: {\n type: 'objectField',\n name: '_id',\n value: {\n type: 'string',\n },\n },\n _type: {\n type: 'objectField',\n name: '_type',\n value: {\n type: 'string',\n value: typeName,\n },\n },\n _createdAt: {\n type: 'objectField',\n name: '_createdAt',\n value: {\n type: 'string',\n },\n },\n _updatedAt: {\n type: 'objectField',\n name: '_updatedAt',\n value: {\n type: 'string',\n },\n },\n _rev: {\n type: 'objectField',\n name: '_rev',\n value: {\n type: 'string',\n },\n },\n})\n\nfunction createStringNodeDefintion(\n stringSchemaType: StringSchemaType,\n): SchemaStringNode | SchemaUnionNode<SchemaStringNode> {\n const listOptions = stringSchemaType.options?.list\n if (listOptions && Array.isArray(listOptions)) {\n return {\n type: 'union',\n of: listOptions.map((v) => ({\n type: 'string',\n value: typeof v === 'string' ? v : v.value,\n })),\n }\n }\n return {\n type: 'string',\n }\n}\n\nfunction createNumberNodeDefintion(\n numberSchemaType: NumberSchemaType,\n): SchemaNumberNode | SchemaUnionNode<SchemaNumberNode> {\n const listOptions = numberSchemaType.options?.list\n if (listOptions && Array.isArray(listOptions)) {\n return {\n type: 'union',\n of: listOptions.map((v) => ({\n type: 'number',\n value: typeof v === 'number' ? v : v.value,\n })),\n }\n }\n return {\n type: 'number',\n }\n}\n\nfunction createReferenceNode(name: string, inArray: boolean = false): SchemaObjectNode {\n const fields: Record<string, SchemaObjectField> = {\n _ref: {\n type: 'objectField',\n name: '_ref',\n value: {\n type: 'string',\n },\n },\n _type: {\n type: 'objectField',\n name: '_type',\n value: {\n type: 'string',\n value: 'reference',\n },\n },\n _weak: {\n type: 'objectField',\n name: '_weak',\n value: {\n type: 'boolean',\n },\n optional: true,\n },\n }\n\n if (inArray) {\n fields._key = {\n type: 'objectField',\n name: '_key',\n value: {\n type: 'string',\n },\n } satisfies SchemaObjectField\n }\n\n return {\n type: 'object',\n fields,\n dereferencesTo: name,\n } satisfies SchemaObjectNode\n}\n\nfunction createReferenceNodeDefintion(\n reference: ReferenceSchemaType,\n): SchemaObjectNode | SchemaUnionNode<SchemaObjectNode> {\n const references = gatherReferenceNames(reference)\n if (references.length === 1) {\n return createReferenceNode(references[0])\n }\n\n return {\n type: 'union',\n of: references.map((name) => ({\n type: 'unionOption',\n name,\n value: createReferenceNode(name),\n })),\n }\n}\n\n// Traverse the reference type tree and gather all the reference names\nfunction gatherReferenceNames(type: ReferenceSchemaType): string[] {\n const allReferences = gatherReferenceTypes(type)\n // Remove duplicates\n return [...new Set(allReferences.map((ref) => ref.name))]\n}\n\nfunction gatherReferenceTypes(type: ReferenceSchemaType): ObjectSchemaType[] {\n const refTo = 'to' in type ? type.to : []\n if ('type' in type && isReferenceType(type.type!)) {\n return [...gatherReferenceTypes(type.type), ...refTo]\n }\n\n return refTo\n}\n\nconst typesMap = new Map<string, Omit<SchemaStringNode, 'name'> | Omit<SchemaBooleanNode, 'name'>>([\n ['text', {type: 'string'}],\n ['url', {type: 'string'}],\n ['datetime', {type: 'string'}],\n ['date', {type: 'string'}],\n ['boolean', {type: 'boolean'}],\n ['email', {type: 'string'}],\n])\n\nexport function extractSchema(workspace: Workspace, theme: ThemeContextValue): SchemaType[] {\n const inlineFields = new Set<SanitySchemaType>()\n const {schema: schemaDef, basePath} = workspace\n\n const sortedSchemaTypeNames = sortByDependencies(schemaDef)\n return sortedSchemaTypeNames\n .map((typeName) => {\n const schemaType = schemaDef.get(typeName)\n if (schemaType === undefined) {\n return undefined\n }\n const base = convertBaseType(schemaType)\n\n if (base === null) {\n return undefined\n }\n\n if (base.type === 'type') {\n inlineFields.add(schemaType)\n }\n\n return base\n })\n .filter((type: SchemaType | undefined): type is SchemaType => type !== undefined)\n\n function extractIcon(schemaType: SanitySchemaType): string | undefined {\n if (!schemaType.icon) return undefined\n return renderToString(<SchemaIcon schemaType={schemaType} theme={theme} />)\n }\n\n function convertBaseType(schemaType: SanitySchemaType): SchemaType | null {\n let typeName: string | undefined\n if (schemaType.type) {\n typeName = schemaType.type.name\n } else if ('jsonType' in schemaType) {\n typeName = schemaType.jsonType\n }\n\n if (typeName === 'document') {\n const object = createObject(schemaType)\n if (object.type === 'unknown') {\n return null\n }\n\n return {\n type: 'document',\n name: schemaType.name,\n title: typeof schemaType.title === 'string' ? schemaType.title : undefined,\n icon: extractIcon(schemaType),\n fields: {\n ...documentDefaultFields(schemaType.name),\n ...object.fields,\n },\n }\n }\n\n const value = convertSchemaType(schemaType)\n if (value.type === 'unknown') {\n return null\n }\n\n if (value.type === 'object') {\n return {\n name: schemaType.name,\n type: 'type',\n value: {\n type: 'object',\n fields: {\n _type: {\n type: 'objectField',\n name: '_type',\n value: {\n type: 'string',\n value: schemaType.name,\n },\n },\n ...value.fields,\n },\n },\n }\n }\n\n return {\n name: schemaType.name,\n title: typeof schemaType.title === 'string' ? schemaType.title : undefined,\n type: 'type',\n value,\n }\n }\n\n function createObject(\n schemaType: ObjectSchemaType | SanitySchemaType,\n ): SchemaObjectNode | SchemaUnknownNode {\n const fields: Record<string, SchemaObjectField> = {}\n\n for (const field of gatherFields(schemaType)) {\n const value = convertSchemaType(field.type)\n if (value === null) {\n continue\n }\n\n fields[field.name] = {\n type: 'objectField',\n name: field.name,\n title: typeof field.type.title === 'string' ? field.type.title : undefined,\n value,\n optional: isFieldRequired(field) === false,\n }\n }\n\n return {\n type: 'object',\n fields,\n }\n }\n\n function convertSchemaType(schemaType: SanitySchemaType): SchemaNode {\n if (lastType(schemaType)?.name === 'document') {\n return createReferenceNode(schemaType.name)\n }\n\n if (inlineFields.has(schemaType.type!)) {\n return {type: 'inline', name: schemaType.type!.name} satisfies SchemaInlineNode\n }\n\n if (schemaType.type?.type?.name === 'object') {\n return {type: 'inline', name: schemaType.type.name} satisfies SchemaInlineNode\n }\n\n if (isStringType(schemaType)) {\n return createStringNodeDefintion(schemaType)\n }\n\n if (isNumberType(schemaType)) {\n return createNumberNodeDefintion(schemaType)\n }\n\n const mapped = typesMap.get(schemaType.type?.name || '')\n if (mapped) {\n return mapped\n }\n\n if (schemaType.type && typesMap.has(schemaType.type.name)) {\n return typesMap.get(schemaType.type.name)!\n }\n\n // Cross dataset references are not supported\n if (isCrossDatasetReferenceType(schemaType)) {\n return {type: 'unknown'} satisfies SchemaUnknownNode // we don't support cross-dataset references at the moment\n }\n\n if (isReferenceType(schemaType)) {\n return createReferenceNodeDefintion(schemaType)\n }\n\n if (isArrayType(schemaType)) {\n return createArray(schemaType)\n }\n\n if (isObjectType(schemaType)) {\n return createObject(schemaType)\n }\n\n throw new Error(`Type \"${schemaType.name}\" not found`)\n }\n\n function createUnionNodeOptions(\n schemaType: ArraySchemaType,\n of: SchemaUnionOption<SchemaNode>[],\n ): SchemaUnionNodeOptions | undefined {\n const {options} = schemaType\n if (!options) return undefined\n const opts = {\n ...options,\n }\n if (options.insertMenu) {\n opts.insertMenu = {\n ...options.insertMenu,\n views: (options.insertMenu as InsertMenuOptions).views?.map((view) =>\n view.name === 'grid'\n ? {\n name: 'grid',\n previewImageUrls: view.previewImageUrl\n ? of.reduce(\n (acc, {name}) => {\n const url = view.previewImageUrl?.(name)\n if (!url) return acc\n // If the URL is relative, make it absolute\n try {\n // oxlint-disable-next-line no-new\n new URL(url)\n acc[name] = url\n } catch {\n acc[name] = new URL(\n url,\n `${window.location.origin}${basePath ? `${basePath}/` : ''}`,\n ).toString()\n }\n return acc\n },\n {} as Record<string, string | undefined>,\n )\n : undefined,\n }\n : view,\n ),\n }\n }\n return opts\n }\n\n function createArray(\n arraySchemaType: ArraySchemaType,\n ): SchemaArrayNode | SchemaUnionNode | SchemaNullNode {\n const of: SchemaUnionOption[] = []\n for (const item of arraySchemaType.of) {\n let field = convertSchemaType(item)\n const option = {\n type: 'unionOption',\n icon: extractIcon(item),\n name: item.name,\n title: typeof item.title === 'string' ? item.title : undefined,\n value: field,\n } satisfies SchemaUnionOption\n if (field.type === 'inline') {\n field = {\n type: 'object',\n fields: {\n _key: createKeyField(),\n },\n rest: field,\n } satisfies SchemaObjectNode\n } else if (field.type === 'object') {\n field.rest = {\n type: 'object',\n fields: {\n _key: createKeyField(),\n },\n }\n }\n option.value = field\n of.push(option)\n }\n\n if (of.length === 0) {\n return {type: 'null'}\n }\n\n if (of.length > 1) {\n return {\n type: 'union',\n of,\n options: createUnionNodeOptions(arraySchemaType, of),\n }\n }\n\n const {name, title, value} = of[0]\n return {\n type: 'array',\n of: {\n type: 'arrayItem',\n name,\n title: typeof title === 'string' ? title : undefined,\n value,\n },\n }\n }\n}\n\nfunction createKeyField(): SchemaObjectField<SchemaStringNode> {\n return {\n type: 'objectField',\n name: '_key',\n value: {\n type: 'string',\n },\n }\n}\n","/* eslint-disable max-nested-callbacks */\nimport {type ClientPerspective} from '@sanity/client'\nimport {type UnresolvedPath} from '@sanity/presentation-comlink'\nimport {useRootTheme} from '@sanity/ui'\nimport {memo, useEffect} from 'react'\nimport {\n getPublishedId,\n isReleasePerspective,\n RELEASES_STUDIO_CLIENT_OPTIONS,\n useClient,\n useWorkspace,\n} from 'sanity'\n\nimport {API_VERSION} from '../../constants'\nimport {type VisualEditingConnection} from '../../types'\nimport {extractSchema} from './extract'\n\nexport interface PostMessageSchemaProps {\n comlink: VisualEditingConnection\n perspective: ClientPerspective\n}\n\nfunction getDocumentPathArray(paths: UnresolvedPath[]) {\n const documentPathMap = paths.reduce(\n (acc, {id, path}) => {\n if (acc[id]) {\n acc[id].add(path)\n } else {\n acc[id] = new Set<string>([path])\n }\n return acc\n },\n {} as Record<string, Set<string>>,\n )\n\n return Object.entries(documentPathMap)\n}\n\n/**\n * Experimental approach for sending a representation of the workspace schema\n * over postMessage so it can be used to enrich the Visual Editing experience\n */\nfunction PostMessageSchema(props: PostMessageSchemaProps): React.JSX.Element | null {\n const {comlink, perspective} = props\n\n const workspace = useWorkspace()\n const theme = useRootTheme()\n\n // Send a representation of the schema to the visual editing context\n useEffect(() => {\n try {\n const schema = extractSchema(workspace, theme)\n /**\n * @deprecated switch to explict schema fetching (using\n * 'visual-editing/schema') at next major\n */\n comlink.post('presentation/schema', {schema})\n\n return comlink.on('visual-editing/schema', () => ({schema}))\n } catch {\n return undefined\n }\n }, [comlink, theme, workspace])\n\n const client = useClient(\n isReleasePerspective(perspective) ? RELEASES_STUDIO_CLIENT_OPTIONS : {apiVersion: API_VERSION},\n )\n\n // Resolve union types from an array of unresolved paths\n useEffect(() => {\n return comlink.on('visual-editing/schema-union-types', async (data) => {\n const documentPathArray = getDocumentPathArray(data.paths)\n const unionTypes = await Promise.all(\n documentPathArray.map(async ([id, paths]) => {\n const arr = Array.from(paths)\n const projection = arr.map((path, i) => `\"${i}\": ${path}[0]._type`).join(',')\n const query = `*[_id == $id][0]{${projection}}`\n // Should implement max 25 concurrent queries here\n const result = await client.fetch(\n query,\n {id: getPublishedId(id)},\n {\n tag: 'presentation-schema',\n perspective,\n },\n )\n const mapped = arr.map((path, i) => ({path: path, type: result[i]}))\n return {id, paths: mapped}\n }),\n )\n\n const newState = new Map()\n unionTypes.forEach((action) => {\n newState.set(action.id, new Map(action.paths.map(({path, type}) => [path, type])))\n })\n return {types: newState}\n })\n }, [comlink, client, perspective])\n\n return null\n}\n\nexport default memo(PostMessageSchema)\n"],"names":["isFieldRequired","field","validation","type","rules","Array","isArray","rule","required","proxy","Proxy","get","target","methodName","_required","isType","typeDef","typeName","name","isObjectType","jsonType","isArrayType","isReferenceType","isCrossDatasetReferenceType","isStringType","isNumberType","lastType","gatherFields","concat","fields","sortByDependencies","compiledSchema","seen","Set","walkDependencies","schemaType","dependencies","has","add","last","schemaTypeName","to","forEach","ref","item","of","dependencyMap","Map","getTypeNames","undefined","set","clear","typeNames","currentlyVisiting","visited","visit","deps","dep","delete","includes","unshift","SchemaIcon","t0","$","_c","theme","themeContext","scheme","tone","t1","Symbol","for","ServerStyleSheet","sheet","Icon","icon","t2","instance","isValidElement","documentDefaultFields","_id","value","_type","_createdAt","_updatedAt","_rev","createStringNodeDefintion","stringSchemaType","listOptions","options","list","map","v","createNumberNodeDefintion","numberSchemaType","createReferenceNode","inArray","_ref","_weak","optional","_key","dereferencesTo","createReferenceNodeDefintion","reference","references","gatherReferenceNames","length","allReferences","gatherReferenceTypes","refTo","typesMap","extractSchema","workspace","inlineFields","schema","schemaDef","basePath","base","convertBaseType","filter","extractIcon","renderToString","object","createObject","title","convertSchemaType","mapped","createArray","Error","createUnionNodeOptions","opts","insertMenu","views","view","previewImageUrls","previewImageUrl","reduce","acc","url","URL","window","location","origin","toString","arraySchemaType","option","createKeyField","rest","push","getDocumentPathArray","paths","documentPathMap","id","path","Object","entries","PostMessageSchema","props","comlink","perspective","useWorkspace","useRootTheme","post","on","useEffect","isReleasePerspective","RELEASES_STUDIO_CLIENT_OPTIONS","apiVersion","API_VERSION","client","useClient","t3","t4","data","documentPathArray","unionTypes","Promise","all","t5","arr","from","query","_temp","join","result","fetch","getPublishedId","tag","path_0","i_0","i","newState","action","_temp2","types","path_1","memo"],"mappings":"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"}