Node.js API
Do NOT use these APIs in your fixture files, or any of your client-side code, as they require access to the file system and may bundle unwanted Node.js code in your browser build.
Cosmos Config
Fetching a Cosmos config can be done in a number of ways, depending on whether or not you have a config file and, in case you do, if you prefer to specify the path manually or to rely on automatic detection.
Detect Existing Config from Current Working Directory (CWD)
detectCosmosConfig
uses the same config detection strategy as the cosmos
command.
import { detectCosmosConfig } from 'react-cosmos';
const cosmosConfig = await detectCosmosConfig();
Read Existing Config at Exact Path
getCosmosConfigAtPath
is best when you don't want to care where you run a script from.
import { getCosmosConfigAtPath } from 'react-cosmos';
const cosmosConfig = await getCosmosConfigAtPath(
require.resolve('./cosmos.config')
);
Create Default Config
The minimum requirement to create a config is a root directory.
import { createCosmosConfig } from 'react-cosmos';
const cosmosConfig = createCosmosConfig(__dirname);
Create Custom Config
You can also customize your config programatically, without the need for an external config file.
import { createCosmosConfig } from 'react-cosmos';
const cosmosConfig = createCosmosConfig(__dirname, {
// Options... (TypeScript is your friend)
});
Fixtures
The getFixtures
API is experimental and may change in a future minor
release.
Get all your fixtures programatically. A ton of information is provided for each fixture, enabling you to hack away on top of React Cosmos. To generate visual snapshots from your fixtures, you load rendererUrl
in a headless browser like Puppeteer (opens in a new tab) and take a screenshot on page load. You can compare visual snapshots between deploys to catch sneaky UI regressions.
import { getFixtures } from 'react-cosmos';
const fixtures = await getFixtures(cosmosConfig, {
rendererUrl: 'http://localhost:5000/renderer.html',
});
console.log(fixtures);
// [
// {
// "absoluteFilePath": "/path/to/components/pages/Error/__fixtures__/not-found.js",
// "fileName": "not-found",
// "name": null,
// "parents": ["pages", "Error"]
// "playgroundUrl": "http://localhost:5000/?fixtureId=%7B%22path%22%3A%22components%2Fpages%2FError%2F__fixtures__%2Fnot-found.js%22%2C%22name%22%3Anull%7D",
// "relativeFilePath": "components/pages/Error/__fixtures__/not-found.js",
// "rendererUrl": "http://localhost:5000/renderer.html?fixtureId=%7B%22path%22%3A%22components%2Fpages%2FError%2F__fixtures__%2Fnot-found.js%22%2C%22name%22%3Anull%7D",
// "treePath": ["pages", "Error", "not-found"]
// },
// ...
Aside from the fixture information showcased above, each fixture object returned also contains a getElement
function property, which takes no arguments. getElement
allows you to render fixtures in your own time, in environments like jsdom. Just as in the Cosmos UI, the fixture element will include any decorators you've defined for your fixtures. getElement
can be used for Jest snapshot testing.
Caveats
The getFixtures()
API is tricky to work with.
To create renderer URLs for each fixture, all fixture modules are imported in order to retrieve the fixture names of Multi-Fixtures. Fixture modules are non-standard (JSX or TypeScript) and often expect a DOM environment. Thus calling getFixtures()
in a Node.js environment isn't straightforward and Jest with "jsdom"
testEnvironment (opens in a new tab) used to be the de facto way of using this API.
Jest brings an array of problems due to its limitations:
- ESM support is unfinished. (opens in a new tab)
- You can't create test cases asynchronously. (opens in a new tab) Using an async
globalSetup
could work (opens in a new tab), but it can't import ESM and we're back to square one.
Another limitation, originally due to the lack of ESM support in Jest, is the fact that getFixtures()
doesn't incorporate Cosmos server plugins. The config hooks of server plugins usually auto-set the rendererUrl
option in the user's Cosmos config. The Vite and Webpack plugins do this. With getFixtures()
, however, we pass the renderer URL as a separate option after the Cosmos config. This might change in the future as this API can now be called in Vitest with full ESM support.