Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yjl9903/optc
An easy way to write TypeScript CLI Script
https://github.com/yjl9903/optc
bash cli javascript python script typescript
Last synced: about 2 months ago
JSON representation
An easy way to write TypeScript CLI Script
- Host: GitHub
- URL: https://github.com/yjl9903/optc
- Owner: yjl9903
- License: mit
- Created: 2022-04-22T13:40:07.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-12-19T18:27:14.000Z (about 1 year ago)
- Last Synced: 2023-12-20T13:48:50.496Z (about 1 year ago)
- Topics: bash, cli, javascript, python, script, typescript
- Language: TypeScript
- Homepage:
- Size: 1.21 MB
- Stars: 25
- Watchers: 2
- Forks: 0
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Optc
[![version](https://img.shields.io/npm/v/optc?color=rgb%2850%2C203%2C86%29&label=Optc)](https://www.npmjs.com/package/optc) [![install size](https://packagephobia.com/badge?p=optc)](https://packagephobia.com/result?p=optc) [![CI](https://github.com/yjl9903/Optc/actions/workflows/ci.yml/badge.svg)](https://github.com/yjl9903/Optc/actions/workflows/ci.yml)
An easy way to write a single-file TypeScript command line application.
## Installation
```bash
npm i -g optc
```## Usage
See example [echo.ts](./examples/echo.ts).
```ts
#!/usr/bin/env optcexport const name = 'echo';
export const version = '0.0.0';
export const description = 'Print some messages';
// Echo some message
export default function echo(text: string) {
console.log(text);
return text;
}// Greet someone
export function greet(name?: string, option?: { prefix: string }) {
const text = `${option?.prefix ?? 'Hello'}, ${name ?? 'Stranger'}`;
console.log(text);
return text;
}
```When running the above CLI script, Optc will automatically generate a default command with a required paramter `text`, and a subcommand `greet` with an optional paramter `name`.
```bash
optc examples/echo.ts word
# wordoptc examples/echo.ts greet world
# Hello, worldoptc examples/echo.ts --version
# echo/0.0.0 win32-x64 node-v16.14.2optc examples/echo.ts --help
# echo/0.0.0
#
# Usage: echo [OPTIONS] [COMMAND]
#
# Commands:
# echo Echo some message
# echo greet [name] Greet someone
#
# Options:
# -h, --help Print help
# -v, --version Print version# or use it directly, make sure you grant the executable permissions
./examples/echo.ts greet Optc --prefix Hi
# Hi, Optc
```You can see more examples in the [./examples](./examples).
### Libraries
Optc has some builtin functions based on some famous libs.
+ `cd(dir: string)`: Change directory
+ `pwd()`: Print working directory
+ `` $`cmd` ``: Exec command like [zx](https://github.com/google/zx)
+ `path`: [Node.js Path API](https://nodejs.org/api/path.html)
+ `fs`: [fs-extra](https://www.npmjs.com/package/fs-extra)
+ `glob`: [globby](https://www.npmjs.com/package/globby)
+ `http`: [axios](https://www.npmjs.com/package/axios)### Custom Libraries
You can init a node module at `~/.optc/`, and create `~/.optc/dep.ts` to import all your custom libraries, functions and so on to your script execution environment.
```ts
// ~/.optc/dep.ts// Make sure that you have install "kolorist" in `~/.optc/`
import kolorist from 'kolorist'export default function(global: any) {
global.color = kolorist
}
```### Limitation
+ Optc extracts type infomation from the abstract syntax tree of the code (based on [babel](https://babeljs.io/)), so you **can not** do some type magic (union type, generic type and so on) on the types of paramters.
+ Global code snippets can not have the type of global functions. Currently, it links to the local type declaration file.
## Inspiration
+ [argc](https://github.com/sigoden/argc): A handy way to handle sh/bash cli parameters.
+ [zx](https://github.com/google/zx): A tool for writing better scripts
+ [cac](https://github.com/cacjs/cac): Simple yet powerful framework for building command-line apps.## License
MIT License © 2023 [XLor](https://github.com/yjl9903)