storybook/scripts/run-chromatics.js

97 lines
2.2 KiB
JavaScript
Executable File

import { spawn } from 'child_process';
import { promisify } from 'util';
import { readdir as readdirRaw, readFileSync } from 'fs';
import { join } from 'path';
import { getDeployables } from './utils/list-examples';
import { filterDataForCurrentCircleCINode } from './utils/concurrency';
const readdir = promisify(readdirRaw);
const p = (l) => join(__dirname, '..', ...l);
const logger = console;
const exec = async (command, args = [], options = {}) =>
new Promise((resolve, reject) => {
const child = spawn(command, args, { ...options, stdio: 'inherit', shell: true });
child
.on('close', (code) => {
if (code) {
reject();
} else {
resolve();
}
})
.on('error', (e) => {
logger.error(e);
reject();
});
});
const hasChromaticAppCode = (l) => {
const text = readFileSync(l, 'utf8');
const json = JSON.parse(text);
return !!(
json &&
json.storybook &&
json.storybook.chromatic &&
json.storybook.chromatic.projectToken
);
};
const handleExamples = async (deployables) => {
await deployables.reduce(async (acc, d) => {
await acc;
const out = p(['built-storybooks', d]);
const cwd = p([]);
const {
storybook: {
chromatic: { projectToken },
},
} = JSON.parse(readFileSync(p(['examples', d, 'package.json'])));
if (projectToken) {
await exec(
`yarn`,
[
'chromatic',
`--storybook-build-dir="${out}"`,
'--exit-zero-on-changes',
`--project-token="${projectToken}"`,
],
{ cwd }
);
logger.log('-------');
logger.log(`${d} ran`);
logger.log('-------');
} else {
logger.log('-------');
logger.log(`${d} skipped`);
logger.log('-------');
}
}, Promise.resolve());
};
const run = async () => {
const examples = await readdir(p(['examples']));
const list = filterDataForCurrentCircleCINode(examples);
const deployables = getDeployables(list, hasChromaticAppCode);
if (deployables.length) {
logger.log(`🖼 Will run chromatics for: ${deployables.join(', ')}`);
await handleExamples(deployables);
}
};
run().catch((e) => {
logger.error(e);
process.exit(1);
});