UNPKG

@typescript-tools/packages-to-rebuild-on-changes-cli

Version:
94 lines (93 loc) 4.92 kB
#!/usr/bin/env node "use strict"; /** * packages-to-rebuild-on-changes-cli * CLI for packages-to-rebuild-on-changes */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("fs")); const path = __importStar(require("path")); const find_package_1 = require("@typescript-tools/find-package"); const io_ts_1 = require("@typescript-tools/io-ts"); const lerna_packages_1 = require("@typescript-tools/lerna-packages"); const monorepo_root_1 = require("@typescript-tools/monorepo-root"); const packages_to_rebuild_on_changes_1 = require("@typescript-tools/packages-to-rebuild-on-changes"); const Console = __importStar(require("fp-ts/Console")); const E = __importStar(require("fp-ts/Either")); const IO = __importStar(require("fp-ts/IO")); const O = __importStar(require("fp-ts/Option")); const Ord_1 = require("fp-ts/Ord"); const A = __importStar(require("fp-ts/ReadonlyArray")); const T = __importStar(require("fp-ts/Task")); const TE = __importStar(require("fp-ts/TaskEither")); const function_1 = require("fp-ts/function"); const t = __importStar(require("io-ts")); const io_ts_docopt_1 = require("io-ts-docopt"); const PathReporter = __importStar(require("io-ts/lib/PathReporter")); const ts_pattern_1 = require("ts-pattern"); const docstring = ` Usage: packages-to-rebuild-on-changes [--root <root>] [--path] [<package>]... Options: packages Package names or paths to rebuild when listed packages change (also reads from stdin) --root=<root> Root of lerna mono-repository --path Print the relative path to each package from root `; const CommandLineOptions = (0, io_ts_docopt_1.withEncode)(t.type({ '<package>': t.array(io_ts_1.PackageName), '--path': t.boolean, '--root': t.union([t.null, t.string]), }), (a) => ({ root: a['--root'] !== null ? a['--root'] : undefined, packages: a['<package>'], mode: a['--path'] ? 'path' : 'name', })); const unary = (f) => (a) => f(a); const findMonorepoRoot = (a) => (0, function_1.pipe)(O.fromNullable(a.root), O.fold(monorepo_root_1.monorepoRoot, E.right), E.map((root) => Object.assign(a, { root })), TE.fromEither); const decodeDocopt = (codec, docstring, options) => (0, function_1.pipe)((0, io_ts_docopt_1.decodeDocopt)(codec, docstring, options), E.mapLeft((error) => ({ type: 'docopt decode', error: PathReporter.failure(error).join('\n'), })), TE.fromEither, TE.chainW(findMonorepoRoot)); // REFACTOR: avoid O(n) runtime const findPackageIn = (packages) => (0, find_package_1.findPackageIn)(packages); const exit = (code) => () => process.exit(code); const main = (0, function_1.pipe)(TE.bindTo('options')(decodeDocopt(CommandLineOptions, docstring, { argv: [ ...process.argv.slice(2), ...(!process.stdin.isTTY ? fs .readFileSync('/dev/stdin', 'utf-8') .trim() .split('\n') .filter((s) => s.length > 0) : []), ], })), TE.bindW('packages', ({ options }) => (0, lerna_packages_1.lernaPackages)(options.root)), TE.bindW('dependencies', ({ options, packages }) => (0, function_1.pipe)((0, packages_to_rebuild_on_changes_1.packagesToRebuildOnChanges)(options.root), TE.chainW((graph) => (0, function_1.pipe)(options.packages, TE.traverseArray((pkg) => findPackageIn(packages)(pkg)), TE.map(A.chain((pkg) => (0, function_1.pipe)(O.fromNullable(graph.get(pkg.name)), O.getOrElseW((0, function_1.constant)(A.empty))))))))), TE.map(({ options, dependencies }) => (0, ts_pattern_1.match)(options.mode) .with('path', () => dependencies .map((_) => _.location) .map((location) => path.relative(options.root, location))) .otherwise(() => dependencies.map((_) => _.name))), TE.map(A.uniq(Ord_1.ordString)), TE.map((dependencies) => dependencies.forEach(unary(console.log))), TE.fold((0, function_1.flow)(Console.error, IO.chain(() => exit(1)), T.fromIO), (0, function_1.constant)(T.of(undefined)))); main(); // Local Variables: // mode: typescript // End: //# sourceMappingURL=index.js.map