Skip to content

Commit

Permalink
Merge pull request #1667 from pre-commit/improve_node_install
Browse files Browse the repository at this point in the history
improve node install by using npm pack
  • Loading branch information
asottile committed Oct 28, 2020
2 parents 2779bde + 29f3e67 commit 0c339e0
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 4 deletions.
21 changes: 17 additions & 4 deletions pre_commit/languages/node.py
Expand Up @@ -19,6 +19,7 @@
from pre_commit.util import clean_path_on_failure
from pre_commit.util import cmd_output
from pre_commit.util import cmd_output_b
from pre_commit.util import rmtree

ENVIRONMENT_DIR = 'node_env'

Expand Down Expand Up @@ -99,11 +100,23 @@ def install_environment(
with in_env(prefix, version):
# https://npm.community/t/npm-install-g-git-vs-git-clone-cd-npm-install-g/5449
# install as if we installed from git
helpers.run_setup_cmd(prefix, ('npm', 'install'))
helpers.run_setup_cmd(
prefix,
('npm', 'install', '-g', '.', *additional_dependencies),

local_install_cmd = (
'npm', 'install', '--dev', '--prod',
'--ignore-prepublish', '--no-progress', '--no-save',
)
helpers.run_setup_cmd(prefix, local_install_cmd)

_, pkg, _ = cmd_output('npm', 'pack', cwd=prefix.prefix_dir)
pkg = prefix.path(pkg.strip())

install = ('npm', 'install', '-g', pkg, *additional_dependencies)
helpers.run_setup_cmd(prefix, install)

# clean these up after installation
if prefix.exists('node_modules'): # pragma: win32 no cover
rmtree(prefix.path('node_modules'))
os.remove(pkg)


def run_hook(
Expand Down
28 changes: 28 additions & 0 deletions tests/languages/node_test.py
@@ -1,3 +1,4 @@
import json
import os
import shutil
import sys
Expand All @@ -10,6 +11,7 @@
from pre_commit import parse_shebang
from pre_commit.languages import node
from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output
from testing.util import xfailif_windows


Expand Down Expand Up @@ -78,3 +80,29 @@ def test_unhealthy_if_system_node_goes_missing(tmpdir):

node_bin.remove()
assert not node.healthy(prefix, 'system')


@xfailif_windows # pragma: win32 no cover
def test_installs_without_links_outside_env(tmpdir):
tmpdir.join('bin/main.js').ensure().write(
'#!/usr/bin/env node\n'
'_ = require("lodash"); console.log("success!")\n',
)
tmpdir.join('package.json').write(
json.dumps({
'name': 'foo',
'version': '0.0.1',
'bin': {'foo': './bin/main.js'},
'dependencies': {'lodash': '*'},
}),
)

prefix = Prefix(str(tmpdir))
node.install_environment(prefix, 'system', ())
assert node.healthy(prefix, 'system')

# this directory shouldn't exist, make sure we succeed without it existing
cmd_output('rm', '-rf', str(tmpdir.join('node_modules')))

with node.in_env(prefix, 'system'):
assert cmd_output('foo')[1] == 'success!\n'

0 comments on commit 0c339e0

Please sign in to comment.