1.0.0 • Published 1 year ago

nestjs-repl v1.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

Type Safe, REPL module for a NestJS application enabling you to create REPL commands in a consistent way.

Uses zod object defintions to create typesafe command args, with automatic validation.

Features a built in help command which can be used to list all commands like so > .help or used to describe the args for a specific command, like so > .help foo.

Installation

npm i nestjs-repl

Example

  1. Register in app.module
import { ReplModule } from 'nestjs-repl';

@Module({
  imports: [ReplModule],
})
export class AppModule {}
  1. Wire-up to your repl entrypoint
export async function bootstrapRepl() {
  const repl = await import('repl');

  const app = await NestFactory.createApplicationContext(AppModule, {
    abortOnError: false,
    logger: new ReplLogger(),
  });

  await app.init();

  const replServer = repl.start({
    prompt: color(`> `),
    ignoreUndefined: true,
    preview: false,
  });

  replServer.setupHistory('.repl-history', (err, _repl) => {
    if (err) {
      console.error('error initializing history');
      console.error(inspect(err));
      throw err;
    }
  });

  /**
   * >>>>>>>> THIS BIT
   */
  app.get(ReplModule).setup(replServer);

  return replServer;
}
  1. Register your command
import { ReplCommand } from 'nestjs-repl';
import { z } from 'zod';

const schema = z.object({
  id: z.string().uuid(),
});

@ReplCommand('foo')
export class TestCommand {
  async execute(args: z.infer<typeof schema>) {
    //do stuff
  }
}

Usage

> help('foo')

foo: {
  args: {
    id: { type: string, format: 'uuid', required: true }
  }
}

> await foo({ id: "'62f60dc1-230f-4be0-b85e-cb7245f77f4b" })

TODO

  • Potentially wire-up inquirerjs to build args via a prompt?
  • Allow middlewares to only be applied to commands matching a pattern?