Skip to content

Instantly share code, notes, and snippets.

@saiichihashimoto
Created June 15, 2023 19:35
Show Gist options
  • Save saiichihashimoto/e0165c09898b5f50628958a05b3c51bf to your computer and use it in GitHub Desktop.
Save saiichihashimoto/e0165c09898b5f50628958a05b3c51bf to your computer and use it in GitHub Desktop.
When does sanity give objects a _type and what are the types?
import { visionTool } from "@sanity/vision";
import {
defineArrayMember,
defineConfig,
defineField,
defineType,
} from "sanity";
import { deskTool } from "sanity/desk";
const theDocument = defineType({
name: "theDocument",
title: "TheDocument",
type: "document",
fields: [
defineField({
name: "inlineFieldObject",
description: "An Object as a field.",
type: "object",
validation: (Rule) => Rule.required(),
fields: [
defineField({
name: "typeIs",
type: "string",
initialValue: "",
}),
],
}),
defineField({
name: "aliasedFieldObject",
description: "An Aliased Object as a field.",
type: "aliasedObject",
validation: (Rule) => Rule.required(),
initialValue: { typeIs: "type" },
}),
defineField({
name: "inlineMemberObjects",
description: "Objects in an array",
type: "array",
validation: (Rule) => Rule.required(),
of: [
defineArrayMember({
type: "object",
validation: (Rule) => Rule.required(),
fields: [
defineField({
name: "typeIs",
type: "string",
initialValue: "",
}),
],
}),
],
}),
defineField({
name: "inlineNamedMemberObjects",
description: "Objects with names in an array.",
type: "array",
validation: (Rule) => Rule.required(),
of: [
defineArrayMember({
name: "inlineNamedMemberObject",
type: "object",
validation: (Rule) => Rule.required(),
fields: [
defineField({
name: "typeIs",
type: "string",
initialValue: "name",
}),
],
}),
],
}),
defineField({
name: "aliasedMemberObjects",
description: "Aliased Objects in an array",
type: "array",
validation: (Rule) => Rule.required(),
of: [
defineArrayMember({
type: "aliasedObject",
validation: (Rule) => Rule.required(),
initialValue: { typeIs: "type" },
}),
],
}),
defineField({
name: "aliasedNamedMemberObjects",
description: "Aliased Named Objects in an array",
type: "array",
validation: (Rule) => Rule.required(),
of: [
defineArrayMember({
name: "namedAliasedObject",
type: "aliasedObject",
validation: (Rule) => Rule.required(),
initialValue: { typeIs: "name" },
}),
],
}),
],
});
const aliasedObject = defineType({
name: "aliasedObject",
type: "object",
fields: [
defineField({
name: "typeIs",
type: "string",
}),
],
});
export default defineConfig({
name: "default",
title: "sanity-typed-sandbox",
projectId: "59t1ed5o",
dataset: "production",
plugins: [deskTool(), visionTool()],
schema: {
types: [
// Did you know if you tried to put the `defineType`s in here, typescript gets mad?
theDocument,
aliasedObject,
],
},
});
{
"_createdAt": "2023-06-15T19:27:22Z",
"_id": "a16452cb-9ae8-4867-a24f-ae0092a251ca",
"_rev": "HAbzzJwXm1ji6fGARD0F1h",
"_type": "theDocument",
"_updatedAt": "2023-06-15T19:27:22Z",
"aliasedFieldObject": {
"_type": "aliasedObject",
"typeIs": "type"
},
"aliasedMemberObjects": [
{
"_key": "5ea350e950c8",
"_type": "aliasedObject",
"typeIs": "type"
}
],
"aliasedNamedMemberObjects": [
{
"_key": "15bccbc2be2c",
"_type": "namedAliasedObject",
"typeIs": "name"
}
],
"inlineFieldObject": {
"typeIs": ""
},
"inlineMemberObjects": [
{
"_key": "389b310cf818",
"typeIs": ""
}
],
"inlineNamedMemberObjects": [
{
"_key": "40db63c5f8dc",
"_type": "inlineNamedMemberObject",
"typeIs": "name"
}
]
}
@saiichihashimoto
Copy link
Author

Looks like the order of precedence is:

  1. If it's in an array and has a name, that is it's _type.
  2. Otherwise, if it's an aliased object, the _type is the aliased object's name.
  3. Otherwise, it has no _type.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment