typescript-assistant
Version:
Combines and integrates professional Typescript tools into your project
257 lines (235 loc) • 5.77 kB
text/typescript
#!/usr/bin/env node
import { gte } from "semver";
import * as yargsModule from "yargs";
import { createAssistCommand } from "./commands/assist";
import { createCICommand } from "./commands/ci";
import { createCleanCommand } from "./commands/clean";
import { createFixCommand } from "./commands/fix";
import { createFixAllCommand } from "./commands/fix-all";
import { createInitCommand } from "./commands/init";
import { createLintCommand } from "./commands/lint";
import { createPostCheckoutCommand } from "./commands/post-checkout";
import { createPostMergeCommand } from "./commands/post-merge";
import { createPreCommitCommand } from "./commands/pre-commit";
import { createPrePushCommand } from "./commands/pre-push";
import { createReleaseCommand } from "./commands/release";
import { createDependencyInjector } from "./dependency-injector";
/* eslint-disable no-console */
if (gte("v12.0.0", process.version)) {
console.error("Please update your version of Node.");
process.exit(1);
}
let inject = createDependencyInjector();
let onSuccess = () => {
process.exit(0);
};
let onFailure = (error: any) => {
console.error(error);
process.exit(1);
};
let failIfUnsuccessful = (success: boolean) => {
if (!success) {
process.exit(1);
}
};
yargsModule.command(
["assist", "*"],
"Watches for file changes and outputs current errors and violations",
{
port: {
describe: "the port to have the status server listen on",
},
format: {
describe: "check formatting during assist",
default: true,
boolean: true,
},
coverage: {
describe: "run tests with coverage",
boolean: true,
default: true,
},
project: {
describe: "provide tsconfigs to watch",
string: true,
type: "array",
},
testConfig: {
describe: "path to nyc config file",
string: true,
},
testsGlob: {
describe: "glob for test files",
string: true,
},
},
(yargs) => {
if (
yargs._.length === 0 ||
(yargs._.length === 1 && yargs._[0] === "assist")
) {
void inject(createAssistCommand).execute({
statusServerPort: parseInt(yargs.port as string, 10) || 0,
format: yargs.format,
coverage: yargs.coverage,
projects: yargs.project,
testConfig: yargs.testConfig,
testsGlob: yargs.testsGlob,
});
} else {
console.error("Unknown command");
process.exit(1);
}
}
);
yargsModule.command(["lint"], "Lints", {}, (yargs) => {
inject(createLintCommand).execute().then(onSuccess, onFailure);
});
yargsModule.command(
["fix", "f"],
"Formats changed files and applies tslint fixes",
{},
(yargs) => {
inject(createFixCommand).execute().then(onSuccess, onFailure);
}
);
yargsModule.command(
["fixall"],
"Formats all files and applies tslint fixes",
{},
(yargs) => {
inject(createFixAllCommand).execute().then(onSuccess, onFailure);
}
);
yargsModule.command(
["clean", "c"],
"Deletes all output files and intermediate files",
{},
(yargs) => {
void inject(createCleanCommand).execute();
}
);
yargsModule.command(
["release"],
"Interactively makes a new version number, tags, pushes and publishes to npm",
{},
(yargs) => {
inject(createReleaseCommand).execute().then(onSuccess, onFailure);
}
);
yargsModule.command(
["ci"],
"Runs all tools in parallel to find errors",
{
tests: {
describe: "Run the test and coverage command",
boolean: true,
default: true,
},
format: {
describe: "check formatting during command",
boolean: true,
default: true,
},
coverage: {
describe: "run tests with coverage",
boolean: true,
default: true,
},
},
(yargs) => {
inject(createCICommand)
.execute({
tests: yargs.tests,
format: yargs.format,
coverage: yargs.coverage,
})
.then(failIfUnsuccessful, onFailure);
}
);
yargsModule.command(
"init",
"Initialize or repair all features of typescript-assistant in your project",
{},
(yargs) => {
void inject(createInitCommand).execute(true);
}
);
yargsModule.command(
"pre-commit",
"Pre-commit git hook for husky",
(yargs) => {
return yargs.boolean("format").default("format", true);
},
(yargs) => {
inject(createPreCommitCommand)
.execute({
format: yargs.format,
})
.then(onSuccess, onFailure);
}
);
yargsModule.command(
"post-checkout",
"Post-checkout git hook for husky",
{
previous: {
describe: "The previous checkout head",
string: true,
demandOption: true,
},
new: {
describe: "The new checkout head",
string: true,
demandOption: true,
},
branch: {
coerce(arg) {
return arg === 1;
},
},
},
(yargs) => {
void inject(createPostCheckoutCommand).execute({
previousHead: yargs.previous,
newHead: yargs.new,
isBranch: yargs.branch,
});
}
);
yargsModule.command(
"post-merge",
"Post-merge git hook for husky",
{},
(yargs) => {
void inject(createPostMergeCommand).execute();
}
);
yargsModule.command(
"pre-push",
"Pre-push git hook for husky",
{
disable: {
string: true,
type: "array",
},
testConfig: {
describe: "path to nyc config file",
string: true,
},
testsGlob: {
describe: "glob for test files",
string: true,
},
},
(yargs) => {
inject(createPrePushCommand)
.execute({
disabledProjects: yargs.disable,
testConfig: yargs.testConfig,
testsGlob: yargs.testsGlob,
})
.then(failIfUnsuccessful, onFailure);
}
);
yargsModule.strict().argv;