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

robbyrussell

v0.1.4

Published

Robby Russell's theme written in JavaScript

Downloads

26

Readme

robbyrussell-img

robbyrussell-node

NPM version Node.js version Dependency status Build status Donate

Cross-shell robbyrussell theme written in JavaScript

Motivation

I'm developing 🚀⭐️ spaceship-zsh-theme which is an extremely powerful and customizable prompt for ZSH. It supports a lot of environments and tools to make you enjoy using it. However, there are plenty issues I faced: zsh is hard, dependency management is difficult, testing is near to impossible and so on.

This project is just a proof of concept. Definitely, that's not the best implementation, nevertheless, it opens interesting possibilities:

  • high-level language — ZSH is nice, but not for programming. JavaScript or Python seems more comfortable for these cases.
  • single code base — Single source code for all shells. The core logic is written in a high-level language while the shell-specific code is located in special files called adapters.
  • cross-shell — different shells are too specific. Single code base on high-level language with unified interface gives us an ability to use it with any shell(fish, zsh, bash, sh, etc).
  • cross-platform — things like pkg allows us to package prompt into binary and use it wherever we want, even without installed language runtime.
  • testable — high-level language and its infrastructure make it possible to test prompt components with tools like Mocha, Jest or tape (unlike traditional prompts which are usually untested).
  • dependency managementNPM, RubyGems and PyPI store thousands of packages that could be used for special prompt's needs. It's also possible to install prompt itself with one of these package managers.
  • asynchronous checks — the more synchronous checks you do, the slower prompt becomes. Things like async/await or Promise.all() could perform environment checks concurrently, so we can achieve significant performance improvement.

Why JavaScript? Just because it's a high-level language which provides wide infrastructure with a good package manager, lots of packages and good community. It's quite fast and easy to make a simple working example.

Installation

npm

npm install -g robbyrussell

Done. This command should source the corresponding adapter for your shell. Just reload your terminal.

Binaries

If you don't have Node.js installed on your machine, you can download pre-built binaries with built-in Node.js version.

⬇️ Download binary ⬇️

Use them in your shell configuration with adapters.

bash:

# BASH-specific adapter
robbyrussell_bash_adapter() {
  robbyrussell_previous_exit_code="$?"
  /path/to/robbyrussell $robbyrussell_previous_exit_code 'bash'
}

# set prompt
PS1='$(robbyrussell_bash_adapter)'

zsh:

# ZSH-specific adapter
robbyrussell_zsh_adapter() {
  robbyrussell_previous_exit_code="$?"
  /path/to/robbyrussell $robbyrussell_previous_exit_code 'zsh'
}

# set prompt
PROMPT='$(robbyrussell_zsh_adapter)'

fish:

# FISH-specific adapter
function robbyrussell_fish_adapter -d "a robbyrussell theme adapter for fish"
  set robbyrussell_previous_exit_code "$status"
  /path/to/robbyrussell $robbyrussell_previous_exit_code 'fish'
end

# set prompt
function fish_prompt
  # fish splits command substitutions on newlines
  # need to temporarily reset IFS to empty
  #   @see: http://stackoverflow.com/a/34186172/5508862
  set -l IFS
  robbyrussell_fish_adapter
end

Configuration

Exposing the pormpt settings as environment variables is a known problem. This prompt reads a special configuration file from your home directory, which allows you to define more complex configs. A prompt automatically looks for ~/.prompt-config.js or ~/.prompt-config.json files. These files should export configuration object.

Important: A prompt needs to escape colors codes, otherwise it would behave incorrectly. This prompt includes patched chalk package with escape codes for current process.env.SHELL.

Default config looks like this:

// Patched for current shell chalk/chalk colors
const styles = require('robbyrussell/utils/colors');

module.exports = {
  /**
   * Check git status asynchronously
   */
  async: false,
  /**
   * Prompt prefix and suffix
   */
  prompt: {
    open: styles.bold.open,
    close: styles.bold.close + styles.reset.close
  },
  /**
   * Status code
   */
  status: {
    char: '➜',
    success: styles.green.open,
    failure: styles.red.open,
  },
  /**
   * Directory style
   */
  dir: {
    color: styles.cyan.open
  },
  /**
   * Git status styles
   */
  git: {
    indicator: styles.blue.open,
    branch: styles.red.open,
    dirty: styles.yellow.open,
    dirtyChar: '✗'
  }
};

License

MIT © Denys Dovhan