Skip to content

Commit b2b9119

Browse files
authored
Merge pull request #3719 from pre-commit/npm-unknown-options
install via git for `language: node`
2 parents ff8541f + b1cc920 commit b2b9119

5 files changed

Lines changed: 27 additions & 27 deletions

File tree

‎pre_commit/languages/node.py‎

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from pre_commit.prefix import Prefix
1818
from pre_commit.util import cmd_output
1919
from pre_commit.util import cmd_output_b
20-
from pre_commit.util import rmtree
2120

2221
ENVIRONMENT_DIR = 'node_env'
2322
run_hook = lang_base.basic_run_hook
@@ -77,7 +76,18 @@ def health_check(prefix: Prefix, version: str) -> str | None:
7776
def install_environment(
7877
prefix: Prefix, version: str, additional_dependencies: Sequence[str],
7978
) -> None:
80-
assert prefix.exists('package.json')
79+
if prefix.exists('.git') and prefix.exists('package.json'):
80+
# this requires a new-enough npm (2019ish?)
81+
pkgs = (f'git+file://{prefix.prefix_dir}', *additional_dependencies)
82+
else:
83+
pkgs = (*additional_dependencies,)
84+
85+
if not pkgs:
86+
raise AssertionError(
87+
'`language: node` must have package.json or '
88+
'additional_dependencies',
89+
)
90+
8191
envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version)
8292

8393
# https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx?f=255&MSPPError=-2147217396#maxpath
@@ -89,22 +99,5 @@ def install_environment(
8999
cmd_output_b(*cmd)
90100

91101
with in_env(prefix, version):
92-
# https://npm.community/t/npm-install-g-git-vs-git-clone-cd-npm-install-g/5449
93-
# install as if we installed from git
94-
95-
local_install_cmd = (
96-
'npm', 'install', '--include=dev', '--include=prod',
97-
'--ignore-prepublish', '--no-progress', '--no-save',
98-
)
99-
lang_base.setup_cmd(prefix, local_install_cmd)
100-
101-
_, pkg, _ = cmd_output('npm', 'pack', cwd=prefix.prefix_dir)
102-
pkg = prefix.path(pkg.strip())
103-
104-
install = ('npm', 'install', '-g', pkg, *additional_dependencies)
102+
install = ('npm', 'install', '--allow-git=root', '-g', *pkgs)
105103
lang_base.setup_cmd(prefix, install)
106-
107-
# clean these up after installation
108-
if prefix.exists('node_modules'): # pragma: win32 no cover
109-
rmtree(prefix.path('node_modules'))
110-
os.remove(pkg)

‎pre_commit/resources/empty_template_.npmignore‎

Lines changed: 0 additions & 1 deletion
This file was deleted.

‎pre_commit/resources/empty_template_package.json‎

Lines changed: 0 additions & 4 deletions
This file was deleted.

‎pre_commit/store.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ def _get_default_directory() -> str:
3737

3838

3939
_LOCAL_RESOURCES = (
40-
'Cargo.toml', 'main.go', 'go.mod', 'main.rs', '.npmignore',
41-
'package.json', 'pre-commit-package-dev-1.rockspec',
40+
'Cargo.toml', 'main.go', 'go.mod', 'main.rs',
41+
'pre-commit-package-dev-1.rockspec',
4242
'pre_commit_placeholder_package.gemspec', 'setup.py',
4343
'environment.yml', 'Makefile.PL', 'pubspec.yaml',
4444
'renv.lock', 'renv/activate.R', 'renv/LICENSE.renv',

‎tests/languages/node_test.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
from pre_commit.prefix import Prefix
1616
from pre_commit.store import _make_local_repo
1717
from pre_commit.util import cmd_output
18+
from pre_commit.util import cmd_output_b
1819
from testing.language_helpers import run_language
20+
from testing.util import git_commit
1921
from testing.util import xfailif_windows
2022

2123

@@ -40,6 +42,12 @@ def find_exe_mck():
4042
yield mck
4143

4244

45+
def _make_repo(r):
46+
cmd_output_b('git', 'init', r)
47+
cmd_output_b('git', 'add', '.', cwd=r)
48+
git_commit(cwd=r)
49+
50+
4351
@pytest.mark.usefixtures('is_linux')
4452
def test_sets_system_when_node_and_npm_are_available(find_exe_mck):
4553
find_exe_mck.return_value = '/path/to/exe'
@@ -61,6 +69,7 @@ def test_sets_default_on_windows(find_exe_mck):
6169
@xfailif_windows # pragma: win32 no cover
6270
def test_healthy_system_node(tmpdir):
6371
tmpdir.join('package.json').write('{"name": "t", "version": "1.0.0"}')
72+
_make_repo(str(tmpdir))
6473

6574
prefix = Prefix(str(tmpdir))
6675
node.install_environment(prefix, 'system', ())
@@ -75,6 +84,7 @@ def test_unhealthy_if_system_node_goes_missing(tmpdir):
7584

7685
prefix_dir = tmpdir.join('prefix').ensure_dir()
7786
prefix_dir.join('package.json').write('{"name": "t", "version": "1.0.0"}')
87+
_make_repo(str(prefix_dir))
7888

7989
path = ('PATH', (str(bin_dir), os.pathsep, envcontext.Var('PATH')))
8090
with envcontext.envcontext((path,)):
@@ -101,6 +111,7 @@ def test_installs_without_links_outside_env(tmpdir):
101111
'dependencies': {'lodash': '*'},
102112
}),
103113
)
114+
_make_repo(str(tmpdir))
104115

105116
prefix = Prefix(str(tmpdir))
106117
node.install_environment(prefix, 'system', ())
@@ -124,6 +135,7 @@ def _make_hello_world(tmp_path):
124135
'#!/usr/bin/env node\n'
125136
'console.log("Hello World");\n',
126137
)
138+
_make_repo(str(tmp_path))
127139

128140

129141
def test_node_hook_system(tmp_path):

0 commit comments

Comments
 (0)