This commit is contained in:
Pavel Gnedov 2022-01-30 00:55:41 +07:00
commit 380d4c02a8
18 changed files with 5915 additions and 0 deletions

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019 Salesforce
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

247
README.md Normal file
View file

@ -0,0 +1,247 @@
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)
<!-- toc -->
* [Usage](#usage)
* [Commands](#commands)
<!-- tocstop -->
# Usage
<!-- usage -->
```sh-session
$ npm install -g redmine-time-manager-2
$ redmine-time-manager COMMAND
running command...
$ redmine-time-manager (--version)
redmine-time-manager-2/0.0.0 linux-x64 node-v16.13.1
$ redmine-time-manager --help [COMMAND]
USAGE
$ redmine-time-manager COMMAND
...
```
<!-- usagestop -->
# Commands
<!-- commands -->
* [`redmine-time-manager hello PERSON`](#redmine-time-manager-hello-person)
* [`redmine-time-manager hello world`](#redmine-time-manager-hello-world)
* [`redmine-time-manager help [COMMAND]`](#redmine-time-manager-help-command)
* [`redmine-time-manager plugins`](#redmine-time-manager-plugins)
* [`redmine-time-manager plugins:inspect PLUGIN...`](#redmine-time-manager-pluginsinspect-plugin)
* [`redmine-time-manager plugins:install PLUGIN...`](#redmine-time-manager-pluginsinstall-plugin)
* [`redmine-time-manager plugins:link PLUGIN`](#redmine-time-manager-pluginslink-plugin)
* [`redmine-time-manager plugins:uninstall PLUGIN...`](#redmine-time-manager-pluginsuninstall-plugin)
* [`redmine-time-manager plugins update`](#redmine-time-manager-plugins-update)
## `redmine-time-manager hello PERSON`
Say hello
```
USAGE
$ redmine-time-manager hello [PERSON] -f <value>
ARGUMENTS
PERSON Person to say hello to
FLAGS
-f, --from=<value> (required) Whom 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/pavel-g/redmine-time-manager-cli/blob/v0.0.0/dist/commands/hello/index.ts)_
## `redmine-time-manager hello world`
Say hello world
```
USAGE
$ redmine-time-manager hello world
DESCRIPTION
Say hello world
EXAMPLES
$ oex hello world
hello world! (./src/commands/hello/world.ts)
```
## `redmine-time-manager help [COMMAND]`
Display help for redmine-time-manager.
```
USAGE
$ redmine-time-manager help [COMMAND] [-n]
ARGUMENTS
COMMAND Command to show help for.
FLAGS
-n, --nested-commands Include all nested commands in the output.
DESCRIPTION
Display help for redmine-time-manager.
```
_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v5.1.10/src/commands/help.ts)_
## `redmine-time-manager plugins`
List installed plugins.
```
USAGE
$ redmine-time-manager plugins [--core]
FLAGS
--core Show core plugins.
DESCRIPTION
List installed plugins.
EXAMPLES
$ redmine-time-manager plugins
```
_See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v2.0.11/src/commands/plugins/index.ts)_
## `redmine-time-manager plugins:inspect PLUGIN...`
Displays installation properties of a plugin.
```
USAGE
$ redmine-time-manager plugins:inspect PLUGIN...
ARGUMENTS
PLUGIN [default: .] Plugin to inspect.
FLAGS
-h, --help Show CLI help.
-v, --verbose
DESCRIPTION
Displays installation properties of a plugin.
EXAMPLES
$ redmine-time-manager plugins:inspect myplugin
```
## `redmine-time-manager plugins:install PLUGIN...`
Installs a plugin into the CLI.
```
USAGE
$ redmine-time-manager 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
$ redmine-time-manager plugins add
EXAMPLES
$ redmine-time-manager plugins:install myplugin
$ redmine-time-manager plugins:install https://github.com/someuser/someplugin
$ redmine-time-manager plugins:install someuser/someplugin
```
## `redmine-time-manager plugins:link PLUGIN`
Links a plugin into the CLI for development.
```
USAGE
$ redmine-time-manager 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
$ redmine-time-manager plugins:link myplugin
```
## `redmine-time-manager plugins:uninstall PLUGIN...`
Removes a plugin from the CLI.
```
USAGE
$ redmine-time-manager plugins:uninstall PLUGIN...
ARGUMENTS
PLUGIN plugin to uninstall
FLAGS
-h, --help Show CLI help.
-v, --verbose
DESCRIPTION
Removes a plugin from the CLI.
ALIASES
$ redmine-time-manager plugins unlink
$ redmine-time-manager plugins remove
```
## `redmine-time-manager plugins update`
Update installed plugins.
```
USAGE
$ redmine-time-manager plugins update [-h] [-v]
FLAGS
-h, --help Show CLI help.
-v, --verbose
DESCRIPTION
Update installed plugins.
```
<!-- commandsstop -->

17
bin/dev Executable file
View file

@ -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)

3
bin/dev.cmd Normal file
View file

@ -0,0 +1,3 @@
@echo off
node "%~dp0\dev" %*

5
bin/run Executable file
View file

@ -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'))

3
bin/run.cmd Normal file
View file

@ -0,0 +1,3 @@
@echo off
node "%~dp0\run" %*

73
package.json Normal file
View file

@ -0,0 +1,73 @@
{
"name": "redmine-time-manager-2",
"version": "0.0.0",
"description": "oclif example Hello World CLI",
"author": "Pavel Gnedov @pavel-g",
"bin": {
"redmine-time-manager": "./bin/run"
},
"homepage": "https://github.com/pavel-g/redmine-time-manager-cli",
"license": "MIT",
"main": "dist/index.js",
"repository": "pavel-g/redmine-time-manager-cli",
"files": [
"/bin",
"/dist",
"/npm-shrinkwrap.json",
"/oclif.manifest.json"
],
"dependencies": {
"@oclif/core": "^1",
"@oclif/plugin-help": "^5",
"@oclif/plugin-plugins": "^2.0.1"
},
"devDependencies": {
"@oclif/test": "^2",
"@types/chai": "^4",
"@types/mocha": "^9.0.0",
"@types/node": "^16.9.4",
"chai": "^4",
"eslint": "^7.32.0",
"eslint-config-oclif": "^4",
"eslint-config-oclif-typescript": "^1.0.2",
"globby": "^11",
"mocha": "^9",
"oclif": "^2",
"shx": "^0.3.3",
"ts-node": "^10.2.1",
"tslib": "^2.3.1",
"typescript": "^4.4.3"
},
"oclif": {
"bin": "redmine-time-manager",
"dirname": "redmine-time-manager",
"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": "yarn lint",
"prepack": "yarn 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/pavel-g/redmine-time-manager-cli/issues",
"keywords": [
"oclif"
],
"types": "dist/index.d.ts"
}

View file

@ -0,0 +1,23 @@
import {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: 'Whom is saying hello', required: true}),
}
static args = [{name: 'person', description: 'Person to say hello to', required: true}]
async run(): Promise<void> {
const {args, flags} = await this.parse(Hello)
this.log(`hello ${args.person} from ${flags.from}! (./src/commands/hello/index.ts)`)
}
}

View file

@ -0,0 +1,19 @@
import {Command} from '@oclif/core'
export default class World extends Command {
static description = 'Say hello world'
static examples = [
`$ oex hello world
hello world! (./src/commands/hello/world.ts)
`,
]
static flags = {}
static args = []
async run(): Promise<void> {
this.log('hello world! (./src/commands/hello/world.ts)')
}
}

28
src/commands/save.ts Normal file
View file

@ -0,0 +1,28 @@
import {Command, Flags} from '@oclif/core'
export default class Save extends Command {
static description = 'Save time entries to redmine'
static examples = [
'<%= config.bin %> <%= command.id %>',
]
static flags = {
// flag with a value (-n, --name=VALUE)
name: Flags.string({char: 'n', description: 'name to print'}),
// flag with no value (-f, --force)
force: Flags.boolean({char: 'f'}),
}
static args = [{name: 'file'}]
public async run(): Promise<void> {
const {args, flags} = await this.parse(Save)
const name = flags.name ?? 'world'
this.log(`hello ${name} from`)
if (args.file && flags.force) {
this.log(`you input --force and --file: ${args.file}`)
}
}
}

1
src/index.ts Normal file
View file

@ -0,0 +1 @@
export {run} from '@oclif/core'

View file

@ -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!')
})
})

View file

@ -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!')
})
})

View file

@ -0,0 +1,17 @@
import {expect, test} from '@oclif/test'
describe('save', () => {
test
.stdout()
.command(['save'])
.it('runs hello', ctx => {
expect(ctx.stdout).to.contain('hello world')
})
test
.stdout()
.command(['save', '--name', 'jeff'])
.it('runs hello --name jeff', ctx => {
expect(ctx.stdout).to.contain('hello jeff')
})
})

6
test/helpers/init.js Normal file
View file

@ -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

9
test/tsconfig.json Normal file
View file

@ -0,0 +1,9 @@
{
"extends": "../tsconfig",
"compilerOptions": {
"noEmit": true
},
"references": [
{"path": ".."}
]
}

14
tsconfig.json Normal file
View file

@ -0,0 +1,14 @@
{
"compilerOptions": {
"declaration": true,
"importHelpers": true,
"module": "commonjs",
"outDir": "dist",
"rootDir": "src",
"strict": true,
"target": "es2019"
},
"include": [
"src/**/*"
]
}

5409
yarn.lock Normal file

File diff suppressed because it is too large Load diff