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

prades

v0.4.6

Published

Tool to embed large binary objects in npm packages

Downloads

2

Readme

Prades is a tool to embed large binary objects in npm packages, it works using S3 as store and a signing microservice in the npm registry.

We need to install private npm packages with large binaries. Npm has an internal limitation of ~250Mb for packages. There are some solutions to distribute binaries (like node-pre-gyp) but all of them assume the packages are public. In this scenario, AWS S3 is a good solution to distribute private binaries with signed URLs.

Prades rely on the existence of a signing request microservice in the registry server. For example https://registry-node.starbreeze.com has a /-/releases endpoint that signs request (if user is authorized) and redirects to this signed S3 url.

How to use

Configure package.json

package.json contains three relevant section for prades

where we specify details about the binary file and location

  "binary": {
    "file": "{package_name}/{package_version}/{node_abi}-{platform}-{arch}.tar.gz",
    "path": "bin",
    "host": "https://registry-node.starbreeze.com/-/releases"
  }

more on package.json's binary format options below.

the dependency to prades

  "dependencies": {
    "@sb/prades": "*"
  }

the instruction to run a prades install when installing the package

  "scripts": {
    "install": "prades install"
  }

When publishing a package

When (after or before doesn't matter) we publish an npm package that contains large binaries, then we have to upload the binaries to S3.

Prades has a helper to do that through the same mechanism of signed requests.

./node_modules/.bin/prades publish

When installing a package

When we install a package we don't have to do anything special. The install script in the package.json will run the prades install and it will download the binaries and put them in the specified target directory.

npm install has an strange behaviour. There is no way to tell when you run npm install to install dependencies to build and publish, or when npm is installing as part of a depencency. When you checkout a git repo and try to build a package you will encounter errors because prades install is run as part of npm install but the binaries packages do not exist yet.

To prevent this catch, prades install will do nothing if there exists a .git folder. This behaviour can be disabled using -f (--force) command line option.

package.json options

Matching rules for path option

The path package.json inside the binary section allows specifying what files have to be included in the binary tarball. It is often impractical to specify all source filepaths individually, so prades supports filename expansion.

Prades uses grunt file blobbing and matching. Check grunt globbing patterns documentation for exhaustive info.

This options accepts either comma separated globbing patterns or an array of globbing patterns. Paths matching patterns that begin with ! will be excluded from the returned array. Patterns are processed in order, so inclusion and exclusion order is significant.

While this isn't a comprehensive tutorial on globbing patterns, know that in a filepath:

* matches any number of characters, but not / ? matches a single character, but not / ** matches any number of characters, including /, as long as it's the only thing in a path part {} allows for a comma-separated list of "or" expressions ! at the beginning of a pattern will negate the match

.gitignore and .npmignore

Prades honors .gitignore or .npmignore files. .npmignore takes precedence, if it exists .gitignore is not used.

os and cpu options

There are two optional 'os' and 'cpu' properties in the binary section of the package.json that allow customizing the behavior for different platforms.

publish:

  • works if there is no os or cpu
  • works if the os and cpu are enabled
  • gives an error if the os is NOT enabled
  • gives an error if the cpu is NOT enabled

install:

  • installs if there is no os or cpu
  • installs if the os and cpu are enabled
  • skips install if the os in NOT enabled
  • skips install if the cpu in NOT enabled

example:

 "binary": {
   "file": "{package_name}/{package_version}/{platform}-{arch}.tar.gz",
   "path": "bin",
   "host": "https://registry-node.starbreeze.com/-/releases",
   "os": ["win32"],
   "cpu": ["x64"]
 }
os

The host operating system is determined by process.platform You can specify which operating systems prades binaries will be installed on: "os" : [ "darwin", "linux" ]

cpu

The cpu architecture is determined by process.arch If your code only runs on certain cpu architectures, you can specify which ones. "cpu" : [ "x64", "ia32" ]

Relation with npm publish

If npm package is not published

  • prades can publish binaries

If npm package is published

  • prades cannot publish binaries
  • prades can force publish binaries ('-f, --force' option)
  • prades cannot unpublish binaries
  • prades can force unpublish binaries ('-f, --force' option)

prades info

Running prades info provides information about the published status.

If nothing is published

  • it shows nothing is published

If npm package is published, but no prades binary is

  • it shows npm info

If prades binary packages are published, but npm is not published

  • shows prades info (information about published binaries), example:
[ { file: 'sb/prades_test_1/0.0.1/node_46-darwin-x64.tar.gz',
    last_modified: '2016-05-12T01:38:50.000Z',
    size: 373,
    md5: '030dd2b937ba1d1e9b51c6cb1b060c7c' },
  { file: 'sb/prades_test_1/0.0.1/node_46-win32-x64.tar.gz',
    last_modified: '2016-05-13T09:08:10.000Z',
    size: 340,
    md5: '10519f392dc80b5f45ba797803c8dd2f' },
  { file: 'sb/prades_test_1/0.0.1/node_47-linux-x64.tar.gz',
    last_modified: '2016-10-20T20:02:26.000Z',
    size: 375,
    md5: '9ead89ddc369fd683f06d46879ea40ef' } ]