What is sanity?
Sanity is a platform for structured content that comes with an open-source editing environment called Sanity Studio. It allows you to build and manage content with a flexible and customizable interface.
What are sanity's main functionalities?
Content Modeling
Sanity allows you to define your content models using JavaScript objects. This example shows a simple schema for a blog post with a title and body.
const schema = {
name: 'blogPost',
type: 'document',
fields: [
{ name: 'title', type: 'string' },
{ name: 'body', type: 'text' }
]
};
export default schema;
Real-time Collaboration
Sanity supports real-time collaboration, allowing multiple users to work on the same document simultaneously. This example demonstrates how to use the `useDocumentOperation` hook to update a document in real-time.
import { useDocumentOperation } from '@sanity/react-hooks';
function MyComponent({ id }) {
const { patch, commit } = useDocumentOperation(id, 'myDocumentType');
const handleChange = () => {
patch.execute([{ set: { title: 'New Title' } }]);
commit.execute();
};
return <button onClick={handleChange}>Change Title</button>;
}
Custom Input Components
Sanity allows you to create custom input components for your content models. This example shows how to create a simple custom input component using React.
import React from 'react';
import { FormField } from '@sanity/base/components';
const MyCustomInput = React.forwardRef((props, ref) => {
return (
<FormField label='My Custom Input'>
<input ref={ref} type='text' {...props} />
</FormField>
);
});
export default MyCustomInput;
Other packages similar to sanity
contentful
Contentful is a headless CMS that provides a similar set of features for content modeling and management. It offers a web-based interface for content creators and a robust API for developers. Compared to Sanity, Contentful has a more polished UI but may be less flexible in terms of customization.
strapi
Strapi is an open-source headless CMS that allows you to create and manage content with a customizable API. It offers a more developer-friendly experience with its plugin system and is highly customizable. Strapi is similar to Sanity in terms of flexibility but has a different approach to content modeling and API generation.
prismic-javascript
Prismic is a headless CMS that focuses on providing a user-friendly interface for content creators and a powerful API for developers. It offers features like content versioning and scheduling. Compared to Sanity, Prismic is more focused on ease of use and may have fewer customization options.
Sanity
Sanity is a small script designed to sanity check settings before running your node.js application. Check for values in the environment or specific objects using provided or custom matchers. If the matcher return true, the value is considered passing. Any non-passing values are reported by printing to the output or via a callback function.
Installation
npm install sanity
Usage
Here's the signature for sanity:
sanity.check(
['array', 'of', 'keys']
,
{
gagged: false,
goodBook: null,
passiveAggressive: false,
recover: null,
source: process.env,
zazz: true
}
);
Check environment variables are set to a non-empty string value
var sanity = require('sanity');
sanity.check(['USER', 'MACHTYPE', 'INVISIBLE_FRIENDS', 'AREA_51']);
ERROR: Required settings are not correct!
INVISIBLE_FRIENDS: undefined
AREA_51: undefined
Use the built-in matchers or provide your own
var sanity = require('sanity');
sanity.check(
[{
key: 'USER',
matcher: 'defined'
},
{
key: 'TRUTH_IS_OUT_THERE',
matcher: 'truthy'
},
{
key: 'THERE_WAS_A_SECOND_SHOOTER',
matcher: 'falsy'
},
{
key: 'TINFOIL_HATS',
matcher: function() {
return TinfiolHats.get('all').length > 42;
}
}]
);
ERROR: Required settings are not correct!
THERE_WAS_A_SECOND_SHOOTER: true
TINFOIL_HATS: 3
Provide a key/value data source to use other than environment variables
var sanity = require('sanity'),
source = {
GOTTI_BURIAL_LOCATION: app.unveilTruth('gotti'),
UNDERCOVER_AGENT: db.get('user', 'type = "undercover"')
};
sanity.check(
['GOTTI_BURIAL_LOCATION', 'UNDERCOVER_AGENT'],
{
source: source
}
);
ERROR: Required settings are not correct!
GOTTI_BURIAL_LOCATION: undefined
Define what happens if values are matches are not true
var sanity = require('sanity'),
options = {
gagged: true,
passiveAggressive: true
};
sanity.check(['ONE_ARMED_MAN'], options);
Supply a callback if you want to control the application flow after checking
var sanity = require('sanity'),
options = {
recover: function(err, keys) {
console.error(err);
console.log(keys)
process.exit(1);
}
};
sanity.check(['UFOS'], opttions);
Configuration
There are a few options to change how sanity behaves.
- gagged: Truthy value prevents the reporter from being called. Could be useful in test environments.
- goodBook: An object literal that, if provided, is used automatically to prepopulate the
source
. - passiveAggressive: If truthy and no callback provided this prevents sanity from running
process.exit(1)
when errors are found. - recover(message, failedKeys): A funciton that is invoked if validation fails.
- source: Defaults to
process.env
but you can provide any source against which to test keys. - zazz: Falsy value stops the reported text from looking zazzy.
Tests
To run the tests make sure you have jasmine-node installed globally, then run this command from the sanity
folder you cloned into:
npm test