UNPKG

@design-systems/dev

Version:
94 lines 3.71 kB
"use strict"; 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