@typescript-tools/packages-to-rebuild-on-changes-cli
Version:
CLI for packages-to-rebuild-on-changes
94 lines (93 loc) • 4.92 kB
JavaScript
;
/**
* 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