npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

task-scheduling

v1.0.0-rc.13

Published

Argument management for console applications..

Downloads

14

Readme

task-scheduling

Development of console applications.

Table of Contents

Beauty

Beauty

How to use

main.js / main.ts

import { Scheduler, Flag } from 'task-scheduling'
import { ShowInfoCommand } from './commands/show-info-command'

// global flag (all commands)
Scheduler.registerFlag(new Flag('help', { alias: 'h', type: 'boolean', default: false }))
// add a command
Scheduler.registerCommand(new ShowInfoCommand())

// run / execute by a string
Scheduler.execute(['not-exists', '--help'])
Scheduler.execute(['show-info', '--data=22']) // or "node main.js show-info --data=22"
Scheduler.execute(['show-info', '--data', '22']) // or "node main.js show-info --data 22"
// run / execute by process argv
Scheduler.executeByProcess()

commands/show-info-command.js / commands/show-info-command.ts

import { BaseCommand, Flag, Flags } from 'task-scheduling'

export class ShowInfoCommand extends BaseCommand {

  name: string = 'show-info'
  description: string = 'Show a message'
  flags: Flag[] = [
    new Flag('data', { alias: 'd', type: 'number', default: 2 })
  ]

  async run(@Flags() flags: Flags, @Flags('data') data: number) {
    console.log('What did you expect? A number? Take this:', data*2)
  }

}

Install

// NPM
npm i task-scheduling --save

// Yarn
yarn add task-scheduling

Commands

Create command

The preferred way to create a command is through the BaseCommand class.

import { Scheduler, BaseCommand } from 'task-scheduling'

export class MyFirstCommand extends BaseCommand {

  name = 'callme'
  description = 'Description of the command that will appear in the help message.'

  async run() {
    console.log('Thanks for invoking me.')
  }

}
Scheduler.registerCommand(new MyFirstCommand())

Inline command

Another way to create commands is inline. This option does not need to register the command with the "registerCommand" method.

import { task } from 'task-scheduling'

task('callme', 'Description of the command that will appear in the help message.', [], async () => {
  console.log('Thanks for invoking me.')
})
// "task" is an alias of "Scheduler.registerSimpleCommand"

No name command

There are times when we need to execute a task even when a command is not received. For these cases we can register a "no name" command.

import { Scheduler, BaseCommand, task } from 'task-scheduling'

export class NoNameCommand extends BaseCommand {

  // without name and description
  /*name = ''
  description = ''*/

  async run() {
    console.log('Use --help')
  }

}
Scheduler.registerCommand(new NoNameCommand())

// Or inline
task(undefined, undefined, [], async () => {
  console.log('Use --help')
})

Default 404 command

If you try to execute a command not registered in the system, the "default" command will be executed.

import { Scheduler, BaseCommand } from 'task-scheduling'

export class Default404Command extends BaseCommand {

  async run() {
    console.log('The command you are trying to execute is not valid. Use --help.')
  }

}
Scheduler.registerDefault(new Default404Command())

// Or inline
Scheduler.registerSimpleDefault(async () => {
  console.log('The command you are trying to execute is not valid. Use --help.')
})

Flags

Valid uses

The reading of the values of the flags accepts the formats:

example-command --name value1
example-command -n value1
example-command --name=value1
example-command -n=value1

example-command --files file1.js file2.js file3.js // for array type
example-command -f file1.js file2.js file3.js // for array type

Create flag

The way to create a flag instance is with the Flag class. Note: It is not advisable to create the flags in files separated from the commands, this is just an example where they are separated so that the procedure is better understood. flags/complete-name-flag.js / flags/complete-name-flag.ts

import { Flag } from 'task-scheduling'

export const CompleteNameFlag = new Flag('complete-name', {
  description: 'to show in help',
  alias: 'c', // To use as: "command-name --flag-one value1 -c value2"
  type: 'string',
  default: 'Horus from the ground fuck',
})

Add flag to command

commands/say-hello-command.js / commands/say-hello-command.ts

import { BaseCommand } from 'task-scheduling'
import { CompleteNameFlag } from './../flags/complete-name-flag'

export class SayHelloCommand extends BaseCommand {

  name = 'say-hello'
  description = 'Send me a simple greeting!'
  flags = [CompleteNameFlag]

}

Recommended format: commands/say-hello-command.js / commands/say-hello-command.ts

import { BaseCommand, Flag } from 'task-scheduling'

export class SayHelloCommand extends BaseCommand {

  name = 'say-hello'
  description = 'Send me a simple greeting!'
  flags = [
    new Flag('complete-name', { description: 'to show in help', alias: 'c', type: 'string', default: 'Horus' })
  ]

}

Type of data

The available types of data for the flags are (Valid uses):

string

new Flag('name', { type: 'string', default: 'MyNameIs (that\'s my name)' })
example-command --name=Biig
example-command --name "Biig Piig"
example-command --name= // This will return an empty string ('')

boolean

new Flag('help', { alias: 'h', type: 'boolean', default: false })
example-command --help // true
example-command -h // true
example-command --help=true
example-command --help=1
example-command --help=false
example-command --help=0

number

new Flag('add', { type: 'number', default: 4 })
example-command // 4
example-command --add // 0
example-command --add=9
example-command --add 44

object

new Flag('json', { type: 'object', default: { data: null, of: null, obj: null } })
example-command --json="{ data: 'to show', show: 'to data' }"
example-command --json "{ data: 'to show', show: 'to data' }"

array

new Flag('files', { type: 'array', default: ['file1.js'] })
example-command --files file1.js file2.js file3.js file4.js

Type array

The array type has the peculiarity of a data subtype. This is because it is necessary to know to what type of data corresponds the information that is expected to be received.

new Flag('files', { type: 'array', subtype: 'string', default: ['index.js'] })
new Flag('answers', { type: 'array', subtype: 'boolean', default: [true, false, true, true] })
new Flag('sum', { type: 'array', subtype: 'number', default: [0] })
// ...

Get flag value

Once we have done the command and it is executed, we need to know what value was established for the flag. For this we occupy the decorator @Flags:

import { BaseCommand, Flags, Flag, Scheduler } from 'task-scheduling'

export class NoNameCommand extends BaseCommand {

  flags = [
    new Flag('--help', { alias: 'h', type: 'boolean', default: false, description: 'Show help message.' })
  ]

  async run(@Flags() flags: Flags, @Flags('help') help: boolean) {
    if(help) { // or "flags.help.value"
      console.log(Scheduler.help())
    }
    else {
      console.log('Use --help')
    }
  }

}

On inline commands it's a bit different (and Javascript). Since decorators are not supported in anonymous functions, the only way to obtain the flags is:

import { BaseCommand, Flag, Scheduler, task } from 'task-scheduling'

task(
  undefined,
  undefined,
  [ new Flag('--help', { alias: 'h', type: 'boolean', default: false, description: 'Show help message.' }) ],
  async ({ flags }) => {
    if(flags.help.value) {
      console.log(Scheduler.help())
    }
    else {
      console.log('Use --help')
    }
})

Help messages

The system displays help and error messages automatically in certain cases.

  • CommandNotFoundError
    • When a command does not exist, a message is displayed with the list of available commands and their respective flags, in addition to the global flags.
  • FlagNotFoundError
    • When trying to occupy an unregistered flag. If it is used with a command then it will show the list of available flags for that command. If used without a specific command then it will display the same message as with CommandNotFoundError.
  • InvalidFlagValueError
    • If an erroneous value is sent in a flag, an error message will be displayed warning that X data type was expected. For example, if a string is sent in a number flag, it will display the message.

Print help

It is possible to get the help message (in string format) with the Scheduler.help() method. Then it is printed with console.log or another.

Mini api

I got bored writing the documentation. If I remember later, I will write this part. If you want to see the options of the methods you can use the autocomplete of Typescript (and its IDEs / code editors).

Aliases

Some main methods have an alias for faster, intuitive and clean code use.

import { task, Flag } from 'task-scheduling'

const command_flags = [new Flag('data', { alias: 'd', type: 'number', default: 2 })]

//Scheduler.registerSimpleCommand
task('show-info', 'without description', command_flags, async ({ flags }) => {
  const data = flags.data.value
  console.log('What did you expect? A number? Take this:', data*2)
})