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

symdeps

v2.0.0

Published

Manage where your dependencies should live from package.json.

Downloads

1,146

Readme

symdeps

Manage where your dependencies should live from package.json. With symdeps, your dependencies are automatically symlinked according to configuration, eliminating the need for extra code that just moves files around. Need hard links? That’s cool too.

Hang on. My task runner already does this.

If your task runner’s only role in your workflow is to move files around, you’re essentially using a D11 bulldozer to move a bucket of dirt. If you use a task runner to do more than just that, consider whether declaring where your dependencies live should be done in your task runner config or in your package manager config.

Installation

To install symdeps, run:

npm install --save-dev symdeps

The switch from v0.2.x to v1.0.0 or later should be seamless for most workflows, but there is one fundamental difference in the way this library operates, so a new major version was created to be safe. v0.2.2 and below created symlinks using absolute paths (that is, paths relative to the root of your environment). For example, a symlink created at:

/Users/testy-mctestface/projects/project-name/js/build/libs/dependency.min.js

might point to:

/Users/testy-mctestface/projects/project-name/node_modules/dependency-name/dist/dependency.min.js

Starting with v1.0.0, symdeps uses paths relative to the symlink’s parent directory. This means that the sample link described above would get the following path to the source file instead of an absolute path:

../../../node_modules/dependency-name/dist/dependency.min.js

This is a more nimble implementation because symlinks created in one context (say, directly in your local environment) will still be valid in a different context (say, a docker container running on your machine, as is the case when using something like Lando). They also work if you move the project location or if you deploy an artifact to a remote environment where you don’t want to run npm commands.

Chances are you won’t run into issues when upgrading to v1.0.0 or later, but if you do, it’s probably because your project has a dependency on these paths being absolute. In that case, try using the absolute option in your symdeps config and you should be fine.

Please feel free to open a ticket if you’re still running into issues with this upgrade.

Usage

Add something like this to your package.json:

// package.json
"symdeps": {
  "paths": {
    "public/js/vendor": [ "jquery", "mediaelement" ]
  }
}

and invoke symdeps from an npm script, like postinstall:

// package.json
"scripts": {
  "postinstall": "symdeps"
}

Now every time a dependency is installed, symdeps will create symbolic links in your public/js/vendor/ directory like this:

// relative to project root

public/js/vendor/jquery
public/js/vendor/mediaelement

Naïve behavior

symdeps will create any directories that don’t already exist along the base path (public/js/vendor in the example above). Also note that if the destination already exists (whether it be a file, symlink, or directory) it will be replaced with the symlink.

Linking files directly

You can target individual files quite simply like so:

// package.json
"symdeps": {
  "paths": {
    "public/js/vendor": [
      "jquery/dist/jquery.min.js",
      "mediaelement/build/mediaelement-and-player.min.js"
    ]
  }
}

This will symlink these dependencies like this:

// relative to project root

public/js/vendor/jquery.min.js
public/js/vendor/mediaelement-and-player.min.js

Linking scoped dependencies

If you’re installing a dependency that’s scoped (e.g. @project/library), symdeps will symlink the library name directly (excluding the scope segment in the package name). So adding @project/library to the path array in the examples above would result in a symlink at: project_root/public/js/vendor/library.

Using absolute paths

This library can generate symbolic links using absolute source paths (i.e. relative to the root of your machine) instead of relative to the symlink’s parent directory (which is the default starting with v1.0.0). This might be useful in some contexts where the symlink might need to be moved or duplicated by a process after the initial symlink is created. In such cases, you can make symdeps use absolute paths by setting "absolute": true in your package.json’s symdeps config, or by using the --absolute flag from the command line.

Creating hard links

Depending on your workflow, you might want to create hard links instead of symbolic links. This is particularly useful if your deployment process does not install dependencies on the remote (e.g. you might push an already built artifact), or if you want to track front-end dependencies in version control but don’t want to track everything in node_modules. You can make symdeps create hard links by setting "hard": true in your package.json’s symdeps config, or by using the --hard flag from the command line.