@micro-os-plus/hello-world-qemu-template
Version:
A source xPack / npm package with a template to generate semihosted Hello World projects running on QEMU
291 lines (215 loc) • 9.54 kB
Markdown
[](https://www.npmjs.com/package/@ilg/cli-start-options)
[](https://github.com/xpack/cli-start-options-js/blob/xpack/LICENSE)
[](https://standardjs.com/)
[](https://travis-ci.org/xpack/cli-start-options-js)
[](https://ci.appveyor.com/project/ilg-ul/cli-start-options-js)
[](https://github.com/xpack/cli-start-options-js/issues/)
[](https://github.com/xpack/cli-start-options-js/pulls)
## CLI startup and options processing
A Node.js module with classes to implement a command line Node.js application.
The module exports several classes (like CliApplication, CliCommand, ...)
that can be used as base classes for CLI applications.
## Prerequisites
A recent [Node.js](https://nodejs.org) (>=8.x), since the ECMAScript 6 class
syntax is used.
## Easy install
The module is available as
[`@ilg/cli-start-options`](https://www.npmjs.com/package/@ilg/cli-start-options)
from the public repository, use `npm` to install it inside the module where
it is needed:
```sh
npm install @ilg/cli-start-options --save
```
The module does not provide any executables, and generally there are few
reasons to install it globally.
The development repository is available from the GitHub
[xpack/cli-start-options-js](https://github.com/xpack/cli-start-options-js)
project.
## User info
The module can be included in CLI applications and the classes can be used
to derive application classes.
```javascript
// Equivalent of import { CliApplication, CliCommand, CliHelp, CliOptions } from 'cli-start-options'
const { CliApplication, CliCommand, CliHelp, CliOptions,
CliError, CliExitCodes } = require('@ilg/cli-start-options')
```
## Developer info
### Git repo
```sh
git clone https://github.com/xpack/cli-start-options-js.git cli-start-options-js.git
cd cli-start-options-js.git
npm install
sudo npm link
ls -l /usr/local/lib/node_modules/@ilg
```
A link to the development folder should be present in the system
`node_modules` folder.
In projects that use this module under development, link back from the
global location:
```sh
npm link @ilg/cli-start-options
```
### Tests
The tests use the [`node-tap`](http://www.node-tap.org) framework
(_A Test-Anything-Protocol library for Node.js_, written by Isaac Schlueter).
As for any `npm` package, the standard way to run the project tests is via
`npm test`:
```sh
cd cli-start-options-js.git
npm install
npm test
```
A typical test result looks like:
```console
$ npm run test
> @ilg/cli-start-options@0.6.6 test /Users/ilg/My Files/MacBookPro Projects/xPack/npm-modules/cli-start-options-js.git
> standard && npm run test-tap -s
test/tap/author.js .................................... 8/8
test/tap/cmd-copy.js ................................ 40/40
test/tap/errors.js .................................. 18/18
test/tap/interactive.js ............................. 14/14
test/tap/logger.js ................................ 147/147
test/tap/module-invocation.js ......................... 9/9
test/tap/options-common.js ........................ 126/126
total ............................................. 362/362
362 passing (10s)
ok
```
To run a specific test with more verbose output, use `npm run tap`:
```console
$ npm run tap test/tap/cmd-copy.js -s
test/tap/cmd-copy.js
xtest copy
✓ exit code is syntax
✓ has two errors
✓ has --file error
✓ has --output error
✓ has Usage
xtest copy -h
✓ exit code is success
✓ has enough output
✓ has title
✓ has Usage
✓ has copy options
✓ has --file
✓ has --output
✓ stderr is empty
xtest cop -h
✓ exit code is success
✓ has enough output
✓ has title
✓ has Usage
✓ stderr is empty
xtest cop --file xxx --output yyy
✓ exit code is input
✓ stdout is empty
✓ strerr is ENOENT
unpack
✓ cmd-code.tgz unpacked into /var/folders/n7/kxqjc5zs4qs0nb44v1l2r2j00000gn/T/xtest-copy
✓ chmod ro file
✓ mkdir folder
✓ chmod ro folder
xtest cop --file input.json --output output.json
✓ exit code is success
✓ stdout is empty
✓ stderr is empty
✓ content is read in
✓ json was parsed
✓ has name
xtest cop --file input --output output -v
✓ exit code
✓ message is Done
✓ stderr is empty
xtest cop --file input --output ro/output -v
✓ exit code is output
✓ up to writing
✓ stderr is EACCES
cleanup
✓ chmod rw file
✓ chmod rw folder
✓ remove tmpdir
40 passing (2s)
```
### Coverage tests
Coverage tests are a good indication on how much of the source files is
exercised by the tests. Ideally all source files should be covered 100%,
for all 4 criteria (statements, branches, functions, lines).
To run the coverage tests, use `npm run test-coverage`:
```console
$ npm run test-coverage
> @ilg/cli-start-options@0.6.6 test-coverage /Users/ilg/My Files/MacBookPro Projects/xPack/npm-modules/cli-start-options-js.git
> tap --coverage --reporter=classic --timeout 600 --no-color "test/tap/*.js"
test/tap/author.js .................................... 8/8
test/tap/cmd-copy.js ................................ 40/40
test/tap/errors.js .................................. 18/18
test/tap/interactive.js ............................. 14/14
test/tap/logger.js ................................ 147/147
test/tap/module-invocation.js ......................... 9/9
test/tap/options-common.js ........................ 126/126
total ............................................. 362/362
362 passing (20s)
ok
------------------------------|----------|----------|----------|----------|----------------|
File | % Stmts | % Branch | % Funcs | % Lines |Uncovered Lines |
------------------------------|----------|----------|----------|----------|----------------|
All files | 100 | 89.01 | 96.43 | 100 | |
cli-start-options-js.git | 100 | 100 | 100 | 100 | |
index.js | 100 | 100 | 100 | 100 | |
cli-start-options-js.git/lib | 100 | 89.01 | 96.43 | 100 | |
cli-application.js | 100 | 85.71 | 90.91 | 100 | |
cli-command.js | 100 | 78.57 | 100 | 100 | |
cli-error.js | 100 | 100 | 100 | 100 | |
cli-help.js | 100 | 90.43 | 100 | 100 | |
cli-logger.js | 100 | 72 | 100 | 100 | |
cli-options.js | 100 | 98.39 | 100 | 100 | |
------------------------------|----------|----------|----------|----------|----------------|
```
### Continuous Integration (CI)
TBD
### Standard compliance
The module uses ECMAScript 6 class definitions.
As style, it uses the [JavaScript Standard Style](https://standardjs.com/),
automatically checked at each commit via Travis CI.
Known and accepted exceptions:
- `// eslint-disable-line node/no-deprecated-api` to continue using the
deprecated `domain` module
To manually fix compliance with the style guide (where possible):
```console
$ npm run fix
> @ilg/cli-start-options@0.6.6 fix /Users/ilg/My Files/MacBookPro Projects/xPack/npm-modules/cli-start-options-js.git
> standard --fix
```
### Documentation metadata
The documentation metadata follows the [JSdoc](http://usejsdoc.org) tags.
To enforce checking at file level, add the following comments right after
the `use strict`:
```js
'use strict'
/* eslint valid-jsdoc: "error" */
/* eslint max-len: [ "error", 80, { "ignoreUrls": true } ] */
```
Note: be sure C style comments are used, C++ styles are not parsed by
[ESLint](http://eslint.org).
### Publish to npmjs.com
- `npm run fix`
- commit all changes
- `npm run test-coverage` (not 100% yet)
- check the latest commits `npm run git-log`
- update `CHANGELOG.md`; commit with a message like _CHANGELOG: prepare v0.6.6_
- `npm version patch` (bug fixes), `npm version minor` (compatible API
additions), `npm version major` (incompatible API changes)
- `npm pack` and check the content
- push all changes to GitHub; this should trigger CI
- **wait for CI tests to complete** (not yet)
- `npm publish --tag next` (use `--access public` when publishing for the first time)
Check if the version is present at
[@ilg/cli-start-options Versions](https://www.npmjs.com/package/@ilg/cli-start-options?activeTab=versions).
### Change tag to latest
When stable:
- `npm dist-tag ls @ilg/cli-start-options`
- `npm dist-tag add @ilg/cli-start-options@0.6.6 latest`
- `npm dist-tag ls @ilg/cli-start-options`
## License
The original content is released under the
[MIT License](https://opensource.org/licenses/MIT), with all rights
reserved to [Liviu Ionescu](https://github.com/ilg-ul/).