Start a Node project that uses at least five direct dependencies.
Leave it alone for three months.
Come back and try to install it.
Something in the dependency tree will yell at you that it is deprecated or discontinued. That thing will not be one of your direct dependencies.
NPM will tell you that you have at least one security vulnerability. At least one of the vulnerabilities will be impossible to trigger in your particular application. At least one of the vulnerabilities will not be able to be fixed by updating the versions of your dependencies.
(I am sure I exaggerate, but not by much!)
Why is it like this? How many hours per week does this running-to-stay-in-place cost the average Node project? How many hours per week of developer time is the minimum viable Node project actually supposed to have available?
If you set the versions of your dependencies in the package.json file, you’ll reinstall exactly the same ones.
You may get new vulnerability warnings popping up, but what is the issue here ? You’d rather not be aware that a vulnerability has been found since your last development ?
If you are not happy with others modules, dev your own and no one will let you know about security issues 😝
I'm struggling to understand how there can be so many security flaws, even in things that don't seem to matter for security. I think the bar for a security problem might be too low; a lot of these look like footguns that could give my package a security hole, rather than genuine security flaws in the packages they are reported on.
Here's a progress bar package with a "high" security vulnerability because it contains an internal utility that merges objects and doesn't stop you writing to the prototype. Did the progress bar package ever promise to provide an object merge function that was safe to use on untrusted user input?
Here's an arbitrary code execution vulnerability in sqlite3! High severity! The bug is that, if you tell sqlite3 to substitute an object into an SQL statement, it will run the ToString() method on the object. If an evil hacker has broken into your lead developer's house and written a malicious ToString() method into one of the classes of object you use as a database query parameter, then that code would run! The fix here was, instead of letting the normal Javascript stringification rules apply, to hardcode all objects to be inserted into the database as "[object Object]", because surely that is what the programmer meant to store.
The problem is that when you are alerted for trivial/non-actionable stuff it contributes to “alert-fatigue” and you just start ignoring all of the alerts.
As far as I’m aware, there’s also no way to triage an alert from an install other than to upgrade the offending package, which means you can’t really discriminate on the basis of “acceptable risk”
There's a whole industry of bug bounty hunters making money off this trivial stuff. At work I had to fix a "bug" which could only be exploited if an attacker took control of facebook first, and even then it just meant a user could be redirected to a different website. And the company paid the clown that found the "vulnerability".
If you mean computer science, then I'd say that webdevs have little in common with the industry that came up with stuff like ADA or functional correctness.
Yeah this, setting exact dependencies in package.json is a beginner misunderstanding of how package resolution works and is actually counterproductive.
Package.json is where you specify what version ranges your code is compatible with and should be as broad as possible. This makes it more likely that transitive dependencies on the same package will overlap, so the smallest possible number of libraries are included.
When you install for the first time the dependencies are resolved to exact versions and stored in the lock file, and they won't change on subsequent installs without developer intervention.
So putting exact versions in package.json doesn't do anything apart from practically guarantee you'll include multiple versions of each dependency in your project.