optc
Version:
An easy way to write TypeScript cli script application.
113 lines (111 loc) • 3.41 kB
JavaScript
import fs from 'fs-extra';
import path from 'node:path';
import createDebug from 'debug';
import { lightRed } from 'kolorist';
import { v as version, e as ensureSpace, O as OPTC_ROOT, b as bootstrap, P as Process } from './shared/optc.ba7b3300.mjs';
import 'node:fs';
import 'node:child_process';
import 'node:crypto';
import 'node:url';
import '@babel/plugin-transform-typescript';
import 'breadc';
import 'path';
import 'axios';
import 'globby';
import 'node:os';
import 'find-up';
import 'scule';
const name = "optc";
const platformInfo = `${process.platform}-${process.arch} node-${process.version}`;
const debug = createDebug(name + ":cli");
async function main(args) {
if (args.length === 0) {
console.error(lightRed("Error ") + "You must provide <script>");
process.exit(1);
}
const first = args[0];
if (first === "-v" || first === "--version") {
console.log(`${name}/${version} ${platformInfo}`);
return;
} else if (first === "-h" || first === "--help") {
printHelp();
return;
} else if (first === "new") {
const filename = args[1];
if (filename) {
await ensureSpace();
createNewScript(filename);
} else {
console.error(lightRed("Error ") + "You must provide <script>");
}
return;
} else if (first === "space") {
await ensureSpace();
console.log(OPTC_ROOT);
return;
} else {
await ensureSpace();
}
const handle = (error) => {
if (error instanceof Error) {
console.error(lightRed("Error ") + error.message);
} else {
console.error(error);
}
debug(error);
};
process.on("unhandledRejection", (error) => {
handle(error);
});
try {
await bootstrap(args[0], ...args.slice(1));
} catch (error) {
handle(error);
process.exit(1);
}
}
function printHelp() {
console.log(`${name}/${version}`);
console.log();
console.log("Usage:");
console.log(" $ optc <script> [...args]");
console.log();
console.log("Commands:");
console.log(" new <script> Create a new empty script");
console.log(" space Print Optc space directory");
console.log();
console.log("Options:");
console.log(" -v, --version Display version number");
console.log(" -h, --help Display this message");
}
async function createNewScript(_filename) {
const filename = _filename.endsWith(".ts") ? _filename : _filename + ".ts";
if (!fs.existsSync(filename)) {
const globalsDts = path.join(OPTC_ROOT, "globals.d.ts");
const pkg = fs.existsSync("package.json") ? fs.readJSONSync("package.json") : void 0;
const isLocal = !!pkg?.dependencies?.optc || !!pkg?.devDependencies?.optc;
const template = [
"#!/usr/bin/env optc",
"",
isLocal ? `/// <reference types="optc/globals" />` : `/// <reference path="${globalsDts}" />`,
"",
"export default async function () {",
" ",
"}",
""
];
fs.writeFileSync(filename, template.join("\n"), "utf-8");
fs.chmodSync(filename, 493);
} else {
console.error(lightRed("Error ") + `${filename} exists`);
}
const editor = process.env.EDITOR;
if (editor === "code") {
const cmd = `${editor} --goto ${filename}:6:3`;
await Process([cmd], [], { verbose: false });
} else if (editor) {
const cmd = `${editor} ${filename}`;
await Process([cmd], [], { verbose: false });
}
}
main(process.argv.slice(2));