commit 3a8b0d043066f1a3271b89703bf955026dd847b7 Author: Adam Millerchip Date: Fri Apr 14 22:13:50 2023 +0900 npx oclif generate kingoftime-cli diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..beffa30 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..9b1c8b1 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +/dist diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..7b84619 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": [ + "oclif", + "oclif-typescript" + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b89c6c --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*-debug.log +*-error.log +/.nyc_output +/dist +/lib +/package-lock.json +/tmp +/yarn.lock +node_modules +oclif.manifest.json diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 0000000..4a09d14 --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,12 @@ +{ + "require": [ + "test/helpers/init.js", + "ts-node/register" + ], + "watch-extensions": [ + "ts" + ], + "recursive": true, + "reporter": "spec", + "timeout": 60000 +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e539104 --- /dev/null +++ b/README.md @@ -0,0 +1,337 @@ +oclif-hello-world +================= + +oclif example Hello World CLI + +[![oclif](https://img.shields.io/badge/cli-oclif-brightgreen.svg)](https://oclif.io) +[![Version](https://img.shields.io/npm/v/oclif-hello-world.svg)](https://npmjs.org/package/oclif-hello-world) +[![CircleCI](https://circleci.com/gh/oclif/hello-world/tree/main.svg?style=shield)](https://circleci.com/gh/oclif/hello-world/tree/main) +[![Downloads/week](https://img.shields.io/npm/dw/oclif-hello-world.svg)](https://npmjs.org/package/oclif-hello-world) +[![License](https://img.shields.io/npm/l/oclif-hello-world.svg)](https://github.com/oclif/hello-world/blob/main/package.json) + + +* [Usage](#usage) +* [Commands](#commands) + +# Usage + +```sh-session +$ npm install -g kingoftime-cli +$ kot COMMAND +running command... +$ kot (--version) +kingoftime-cli/0.0.0 darwin-x64 node-v18.15.0 +$ kot --help [COMMAND] +USAGE + $ kot COMMAND +... +``` + +# Commands + +* [`kot hello PERSON`](#kot-hello-person) +* [`kot hello world`](#kot-hello-world) +* [`kot help [COMMANDS]`](#kot-help-commands) +* [`kot plugins`](#kot-plugins) +* [`kot plugins:install PLUGIN...`](#kot-pluginsinstall-plugin) +* [`kot plugins:inspect PLUGIN...`](#kot-pluginsinspect-plugin) +* [`kot plugins:install PLUGIN...`](#kot-pluginsinstall-plugin-1) +* [`kot plugins:link PLUGIN`](#kot-pluginslink-plugin) +* [`kot plugins:uninstall PLUGIN...`](#kot-pluginsuninstall-plugin) +* [`kot plugins:uninstall PLUGIN...`](#kot-pluginsuninstall-plugin-1) +* [`kot plugins:uninstall PLUGIN...`](#kot-pluginsuninstall-plugin-2) +* [`kot plugins update`](#kot-plugins-update) + +## `kot hello PERSON` + +Say hello + +``` +USAGE + $ kot hello PERSON -f + +ARGUMENTS + PERSON Person to say hello to + +FLAGS + -f, --from= (required) Who is saying hello + +DESCRIPTION + Say hello + +EXAMPLES + $ oex hello friend --from oclif + hello friend from oclif! (./src/commands/hello/index.ts) +``` + +_See code: [dist/commands/hello/index.ts](https://github.com/adamu/kingoftime-cli/blob/v0.0.0/dist/commands/hello/index.ts)_ + +## `kot hello world` + +Say hello world + +``` +USAGE + $ kot hello world + +DESCRIPTION + Say hello world + +EXAMPLES + $ kot hello world + hello world! (./src/commands/hello/world.ts) +``` + +## `kot help [COMMANDS]` + +Display help for kot. + +``` +USAGE + $ kot help [COMMANDS] [-n] + +ARGUMENTS + COMMANDS Command to show help for. + +FLAGS + -n, --nested-commands Include all nested commands in the output. + +DESCRIPTION + Display help for kot. +``` + +_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v5.2.9/src/commands/help.ts)_ + +## `kot plugins` + +List installed plugins. + +``` +USAGE + $ kot plugins [--core] + +FLAGS + --core Show core plugins. + +DESCRIPTION + List installed plugins. + +EXAMPLES + $ kot plugins +``` + +_See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v2.4.4/src/commands/plugins/index.ts)_ + +## `kot plugins:install PLUGIN...` + +Installs a plugin into the CLI. + +``` +USAGE + $ kot plugins:install PLUGIN... + +ARGUMENTS + PLUGIN Plugin to install. + +FLAGS + -f, --force Run yarn install with force flag. + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Installs a plugin into the CLI. + Can be installed from npm or a git url. + + Installation of a user-installed plugin will override a core plugin. + + e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command + will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in + the CLI without the need to patch and update the whole CLI. + + +ALIASES + $ kot plugins add + +EXAMPLES + $ kot plugins:install myplugin + + $ kot plugins:install https://github.com/someuser/someplugin + + $ kot plugins:install someuser/someplugin +``` + +## `kot plugins:inspect PLUGIN...` + +Displays installation properties of a plugin. + +``` +USAGE + $ kot plugins:inspect PLUGIN... + +ARGUMENTS + PLUGIN [default: .] Plugin to inspect. + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +GLOBAL FLAGS + --json Format output as json. + +DESCRIPTION + Displays installation properties of a plugin. + +EXAMPLES + $ kot plugins:inspect myplugin +``` + +## `kot plugins:install PLUGIN...` + +Installs a plugin into the CLI. + +``` +USAGE + $ kot plugins:install PLUGIN... + +ARGUMENTS + PLUGIN Plugin to install. + +FLAGS + -f, --force Run yarn install with force flag. + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Installs a plugin into the CLI. + Can be installed from npm or a git url. + + Installation of a user-installed plugin will override a core plugin. + + e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command + will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in + the CLI without the need to patch and update the whole CLI. + + +ALIASES + $ kot plugins add + +EXAMPLES + $ kot plugins:install myplugin + + $ kot plugins:install https://github.com/someuser/someplugin + + $ kot plugins:install someuser/someplugin +``` + +## `kot plugins:link PLUGIN` + +Links a plugin into the CLI for development. + +``` +USAGE + $ kot plugins:link PLUGIN + +ARGUMENTS + PATH [default: .] path to plugin + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Links a plugin into the CLI for development. + Installation of a linked plugin will override a user-installed or core plugin. + + e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello' + command will override the user-installed or core plugin implementation. This is useful for development work. + + +EXAMPLES + $ kot plugins:link myplugin +``` + +## `kot plugins:uninstall PLUGIN...` + +Removes a plugin from the CLI. + +``` +USAGE + $ kot plugins:uninstall PLUGIN... + +ARGUMENTS + PLUGIN plugin to uninstall + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Removes a plugin from the CLI. + +ALIASES + $ kot plugins unlink + $ kot plugins remove +``` + +## `kot plugins:uninstall PLUGIN...` + +Removes a plugin from the CLI. + +``` +USAGE + $ kot plugins:uninstall PLUGIN... + +ARGUMENTS + PLUGIN plugin to uninstall + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Removes a plugin from the CLI. + +ALIASES + $ kot plugins unlink + $ kot plugins remove +``` + +## `kot plugins:uninstall PLUGIN...` + +Removes a plugin from the CLI. + +``` +USAGE + $ kot plugins:uninstall PLUGIN... + +ARGUMENTS + PLUGIN plugin to uninstall + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Removes a plugin from the CLI. + +ALIASES + $ kot plugins unlink + $ kot plugins remove +``` + +## `kot plugins update` + +Update installed plugins. + +``` +USAGE + $ kot plugins update [-h] [-v] + +FLAGS + -h, --help Show CLI help. + -v, --verbose + +DESCRIPTION + Update installed plugins. +``` + diff --git a/bin/dev b/bin/dev new file mode 100755 index 0000000..bbc3f51 --- /dev/null +++ b/bin/dev @@ -0,0 +1,17 @@ +#!/usr/bin/env node + +const oclif = require('@oclif/core') + +const path = require('path') +const project = path.join(__dirname, '..', 'tsconfig.json') + +// In dev mode -> use ts-node and dev plugins +process.env.NODE_ENV = 'development' + +require('ts-node').register({project}) + +// In dev mode, always show stack traces +oclif.settings.debug = true; + +// Start the CLI +oclif.run().then(oclif.flush).catch(oclif.Errors.handle) diff --git a/bin/dev.cmd b/bin/dev.cmd new file mode 100644 index 0000000..077b57a --- /dev/null +++ b/bin/dev.cmd @@ -0,0 +1,3 @@ +@echo off + +node "%~dp0\dev" %* \ No newline at end of file diff --git a/bin/run b/bin/run new file mode 100755 index 0000000..a7635de --- /dev/null +++ b/bin/run @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +const oclif = require('@oclif/core') + +oclif.run().then(require('@oclif/core/flush')).catch(require('@oclif/core/handle')) diff --git a/bin/run.cmd b/bin/run.cmd new file mode 100644 index 0000000..968fc30 --- /dev/null +++ b/bin/run.cmd @@ -0,0 +1,3 @@ +@echo off + +node "%~dp0\run" %* diff --git a/package.json b/package.json new file mode 100644 index 0000000..a81e9cc --- /dev/null +++ b/package.json @@ -0,0 +1,72 @@ +{ + "name": "kingoftime-cli", + "version": "0.0.0", + "description": "King of Time CLI", + "author": "Adam Millerchip @adamu", + "bin": { + "kot": "./bin/run" + }, + "homepage": "https://github.com/adamu/kingoftime-cli", + "license": "MIT", + "main": "dist/index.js", + "repository": "adamu/kingoftime-cli", + "files": [ + "/bin", + "/dist", + "/npm-shrinkwrap.json", + "/oclif.manifest.json" + ], + "dependencies": { + "@oclif/core": "^2", + "@oclif/plugin-help": "^5", + "@oclif/plugin-plugins": "^2.4.4" + }, + "devDependencies": { + "@oclif/test": "^2.3.14", + "@types/chai": "^4", + "@types/mocha": "^9.0.0", + "@types/node": "^16.18.23", + "chai": "^4", + "eslint": "^7.32.0", + "eslint-config-oclif": "^4", + "eslint-config-oclif-typescript": "^1.0.3", + "mocha": "^9", + "oclif": "^3", + "shx": "^0.3.3", + "ts-node": "^10.9.1", + "tslib": "^2.5.0", + "typescript": "^4.9.5" + }, + "oclif": { + "bin": "kot", + "dirname": "kot", + "commands": "./dist/commands", + "plugins": [ + "@oclif/plugin-help", + "@oclif/plugin-plugins" + ], + "topicSeparator": " ", + "topics": { + "hello": { + "description": "Say hello to the world and others" + } + } + }, + "scripts": { + "build": "shx rm -rf dist && tsc -b", + "lint": "eslint . --ext .ts --config .eslintrc", + "postpack": "shx rm -f oclif.manifest.json", + "posttest": "npm run lint", + "prepack": "npm run build && oclif manifest && oclif readme", + "test": "mocha --forbid-only \"test/**/*.test.ts\"", + "version": "oclif readme && git add README.md" + }, + "engines": { + "node": ">=12.0.0" + }, + "bugs": "https://github.com/adamu/kingoftime-cli/issues", + "keywords": [ + "oclif" + ], + "types": "dist/index.d.ts" +} diff --git a/src/commands/hello/index.ts b/src/commands/hello/index.ts new file mode 100644 index 0000000..3f1d50b --- /dev/null +++ b/src/commands/hello/index.ts @@ -0,0 +1,25 @@ +import {Args, Command, Flags} from '@oclif/core' + +export default class Hello extends Command { + static description = 'Say hello' + + static examples = [ + `$ oex hello friend --from oclif +hello friend from oclif! (./src/commands/hello/index.ts) +`, + ] + + static flags = { + from: Flags.string({char: 'f', description: 'Who is saying hello', required: true}), + } + + static args = { + person: Args.string({description: 'Person to say hello to', required: true}), + } + + async run(): Promise { + const {args, flags} = await this.parse(Hello) + + this.log(`hello ${args.person} from ${flags.from}! (./src/commands/hello/index.ts)`) + } +} diff --git a/src/commands/hello/world.ts b/src/commands/hello/world.ts new file mode 100644 index 0000000..bfcd5fa --- /dev/null +++ b/src/commands/hello/world.ts @@ -0,0 +1,19 @@ +import {Command} from '@oclif/core' + +export default class World extends Command { + static description = 'Say hello world' + + static examples = [ + `<%= config.bin %> <%= command.id %> +hello world! (./src/commands/hello/world.ts) +`, + ] + + static flags = {} + + static args = {} + + async run(): Promise { + this.log('hello world! (./src/commands/hello/world.ts)') + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..e32b0b2 --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +export {run} from '@oclif/core' diff --git a/test/commands/hello/index.test.ts b/test/commands/hello/index.test.ts new file mode 100644 index 0000000..f4e5ebe --- /dev/null +++ b/test/commands/hello/index.test.ts @@ -0,0 +1,10 @@ +import {expect, test} from '@oclif/test' + +describe('hello', () => { + test + .stdout() + .command(['hello', 'friend', '--from=oclif']) + .it('runs hello cmd', ctx => { + expect(ctx.stdout).to.contain('hello friend from oclif!') + }) +}) diff --git a/test/commands/hello/world.test.ts b/test/commands/hello/world.test.ts new file mode 100644 index 0000000..8096cba --- /dev/null +++ b/test/commands/hello/world.test.ts @@ -0,0 +1,10 @@ +import {expect, test} from '@oclif/test' + +describe('hello world', () => { + test + .stdout() + .command(['hello:world']) + .it('runs hello world cmd', ctx => { + expect(ctx.stdout).to.contain('hello world!') + }) +}) diff --git a/test/helpers/init.js b/test/helpers/init.js new file mode 100644 index 0000000..338e715 --- /dev/null +++ b/test/helpers/init.js @@ -0,0 +1,6 @@ +const path = require('path') +process.env.TS_NODE_PROJECT = path.resolve('test/tsconfig.json') +process.env.NODE_ENV = 'development' + +global.oclif = global.oclif || {} +global.oclif.columns = 80 diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 0000000..95898fc --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig", + "compilerOptions": { + "noEmit": true + }, + "references": [ + {"path": ".."} + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..34727db --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "declaration": true, + "importHelpers": true, + "module": "commonjs", + "outDir": "dist", + "rootDir": "src", + "strict": true, + "target": "es2019" + }, + "include": [ + "src/**/*" + ] +}