nodejs: support npm-shrinkwrap.json for package-lock translator

npm-shrinkwrap.json
(https://docs.npmjs.com/cli/v8/configuring-npm/npm-shrinkwrap-json) is
an alternative to package-lock.json that follows the same format. It is
typically used with applications (rather than libraries) distributed via
npm's registry. This change detects its presence and feeds it through
the package-lock translator if it exists.

Per the npm documentation, npm-shrinkwrap.json takes precedence over
package-lock.json.
This commit is contained in:
Noah Fontes 2022-10-20 21:05:58 -07:00
parent 74143c8c62
commit dd9a2cb04a
No known key found for this signature in database
GPG Key ID: 85B8C0A0B15FF53F
3 changed files with 17 additions and 7 deletions

View File

@ -45,7 +45,7 @@
&& (packageJson.workspaces or [] == [])
then ["package-lock"]
else
l.optionals (tree.files ? "package-lock.json") ["package-lock"]
l.optionals (tree.files ? "npm-shrinkwrap.json" || tree.files ? "package-lock.json") ["package-lock"]
++ l.optionals (tree.files ? "yarn.lock") ["yarn-lock"]
++ ["package-json"];
in

View File

@ -8,8 +8,16 @@
l = lib // builtins;
nodejsUtils = import ../utils.nix {inherit dlib lib;};
getPackageLockPath = tree: project: let
parent = nodejsUtils.getWorkspaceParent project;
node = tree.getNodeFromPath parent;
in
if node.files ? "npm-shrinkwrap.json"
then "npm-shrinkwrap.json"
else "package-lock.json";
getPackageLock = tree: project:
nodejsUtils.getWorkspaceLockFile tree project "package-lock.json";
nodejsUtils.getWorkspaceLockFile tree project (getPackageLockPath tree project);
translate = {
project,
@ -109,7 +117,7 @@
else
l.trace
''
WARNING: could not find dependency ${name} in package-lock.json
WARNING: could not find dependency ${name} in ${getPackageLockPath args.tree project}
This might be expected for bundled dependencies of sub-dependencies.
''
false)

View File

@ -16,12 +16,14 @@ in rec {
(packageJson.dependencies or {})
// (lib.optionalAttrs (! noDev) (packageJson.devDependencies or {}));
getWorkspaceParent = project:
if project ? subsystemInfo.workspaceParent
then "${project.subsystemInfo.workspaceParent}"
else "${project.relPath}";
getWorkspaceLockFile = tree: project: fname: let
# returns the parsed package-lock.json for a given project
dirRelPath =
if project ? subsystemInfo.workspaceParent
then "${project.subsystemInfo.workspaceParent}"
else "${project.relPath}";
dirRelPath = getWorkspaceParent project;
packageJson =
(tree.getNodeFromPath "${dirRelPath}/package.json").jsonContent;