@design-systems/dev
Version:
The dev command for @design-systems-cli
94 lines • 3.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const cli_utils_1 = require("@design-systems/cli-utils");
const find_package_json_1 = tslib_1.__importDefault(require("find-package-json"));
const child_process_1 = require("child_process");
const chokidar_1 = require("chokidar");
const resolve_cwd_1 = tslib_1.__importDefault(require("resolve-cwd"));
const logger = cli_utils_1.createLogger({ scope: 'dev' });
/** Filter dependencies for only ones found in the monorepo. */
function filterDeps(monorepo, packageJson, type) {
const deps = packageJson[type];
if (deps) {
return Object.keys(deps).filter(dep => dep.includes(monorepo));
}
return [];
}
/** Recursively walk through deps to find packages in the monorepo to build. */
const createDepsSet = (monorepo, dir, deps = new Set()) => {
const finder = find_package_json_1.default(dir);
const { value: packageJson } = finder.next();
if (!packageJson) {
logger.debug(`No package.json found for "${dir}"`);
return deps;
}
if (packageJson.name) {
logger.debug(`Adding dependency: "${packageJson.name}"`);
logger.debug(`From dir: "${dir}"`);
deps.add(packageJson.name);
}
const subDeps = [
...filterDeps(monorepo, packageJson, 'dependencies'),
...filterDeps(monorepo, packageJson, 'devDependencies'),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
...filterDeps(monorepo, packageJson, 'storyDependencies')
];
subDeps.forEach(dep => {
if (!deps.has(dep)) {
createDepsSet(monorepo, resolve_cwd_1.default(`${dep}/package.json`), deps);
}
});
return deps;
};
/**
* A plugin to builds a component, any dependent component in the same
* monorepo, and start a storybook for just the component.
*/
class DevPlugin {
async run() {
process.env.NODE_ENV = 'development';
logger.await('Starting storybook...');
child_process_1.spawn('npm', ['run', 'storybook'], { stdio: 'inherit' });
if (process.cwd() === cli_utils_1.getMonorepoRoot()) {
logger.info('Ran from root, building all components');
child_process_1.spawn('npm', ['run', 'start'], { stdio: 'inherit' });
}
else {
logger.info('Ran from component, building this component and its dependencies');
this.watchDeps();
}
}
/** Watch dependant directories in the monorepo. */
watchDeps() {
const finder = find_package_json_1.default(process.cwd());
const { filename } = finder.next();
if (!filename) {
throw new Error("Coudn't find package.json!");
}
// Watch package.json for changes so we are always building the correct deps
const watcher = chokidar_1.watch(filename, {
awaitWriteFinish: true,
ignoreInitial: false
});
this.buildDeps();
watcher.on('ready', () => {
watcher.on('change', this.buildDeps);
});
}
/** Build the code for all the needed repos. */
buildDeps() {
const monorepo = cli_utils_1.monorepoName();
const deps = createDepsSet(monorepo, process.cwd());
logger.note(`Found dependencies: ${[...deps].join(', ')}`);
if (deps.size > 0) {
const scopes = [...deps].reduce((all, dep) => [...all, '--scope', dep], []);
child_process_1.spawn('npm', ['run', 'start', '--', ...scopes], {
stdio: 'inherit',
cwd: '../..'
});
}
}
}
exports.default = DevPlugin;
//# sourceMappingURL=index.js.map