UNPKG

optc

Version:

An easy way to write TypeScript cli script application.

113 lines (111 loc) 3.41 kB
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));