deno/tests/testdata/npm
Nathan Whitaker 780b741555
perf(npm): load npm resolution snapshot directly from lockfile (#28647)
Fixes #27264. Fixes https://github.com/denoland/deno/issues/28161.

Currently the new lockfile version is gated behind an unstable flag
(`--unstable-lockfile-v5`) until the next minor release, where it will
become the default.

The main motivation here is that it improves startup performance when
using the global cache or `--node-modules-dir=auto`.

In a create-next-app project, running an empty file:
```
❯ hyperfine --warmup 25 -N --setup "rm -f deno.lock" "deno run --node-modules-dir=auto -A empty.js" "deno-this-pr run --node-modules-dir=auto -A empty.js" "deno-this-pr run --node-modules-dir=auto --unstable-lockfile-v5 empty.js" "deno run --node-modules-dir=manual -A empty.js" "deno-this-pr run --node-modules-dir=manual -A empty.js"
Benchmark 1: deno run --node-modules-dir=auto -A empty.js
  Time (mean ± σ):     247.6 ms ±   1.7 ms    [User: 228.7 ms, System: 19.0 ms]
  Range (min … max):   245.5 ms … 251.5 ms    12 runs

Benchmark 2: deno-this-pr run --node-modules-dir=auto -A empty.js
  Time (mean ± σ):     169.8 ms ±   1.0 ms    [User: 152.9 ms, System: 17.9 ms]
  Range (min … max):   168.9 ms … 172.5 ms    17 runs

Benchmark 3: deno-this-pr run --node-modules-dir=auto --unstable-lockfile-v5 empty.js
  Time (mean ± σ):      16.2 ms ±   0.7 ms    [User: 12.3 ms, System: 5.7 ms]
  Range (min … max):    15.2 ms …  19.2 ms    185 runs

Benchmark 4: deno run --node-modules-dir=manual -A empty.js
  Time (mean ± σ):      16.2 ms ±   0.8 ms    [User: 11.6 ms, System: 5.5 ms]
  Range (min … max):    14.9 ms …  19.7 ms    187 runs

Benchmark 5: deno-this-pr run --node-modules-dir=manual -A empty.js
  Time (mean ± σ):      16.0 ms ±   0.9 ms    [User: 12.0 ms, System: 5.5 ms]
  Range (min … max):    14.8 ms …  22.3 ms    190 runs

  Warning: Statistical outliers were detected. Consider re-running this benchmark on a quiet system without any interferences from other programs. It might help to use the '--warmup' or '--prepare' options.

Summary
  deno-this-pr run --node-modules-dir=manual -A empty.js ran
    1.01 ± 0.08 times faster than deno run --node-modules-dir=manual -A empty.js
    1.01 ± 0.07 times faster than deno-this-pr run --node-modules-dir=auto --unstable-lockfile-v5 empty.js
   10.64 ± 0.60 times faster than deno-this-pr run --node-modules-dir=auto -A empty.js
   15.51 ± 0.88 times faster than deno run --node-modules-dir=auto -A empty.js
```

When using the new lockfile version, this leads to a 15.5x faster
startup time compared to the current deno version.

Install times benefit as well, though to a lesser degree.

`deno install` on a create-next-app project, with everything cached
(just setting up node_modules from scratch):

```
❯ hyperfine --warmup 5 -N --prepare "rm -rf node_modules" --setup "rm -rf deno.lock" "deno i" "deno-this-pr i" "deno-this-pr i --unstable-lockfile-v5"
Benchmark 1: deno i
  Time (mean ± σ):     464.4 ms ±   8.8 ms    [User: 227.7 ms, System: 217.3 ms]
  Range (min … max):   452.6 ms … 478.3 ms    10 runs

Benchmark 2: deno-this-pr i
  Time (mean ± σ):     368.8 ms ±  22.0 ms    [User: 150.8 ms, System: 198.1 ms]
  Range (min … max):   344.8 ms … 397.6 ms    10 runs

Benchmark 3: deno-this-pr i --unstable-lockfile-v5
  Time (mean ± σ):     211.9 ms ±  17.1 ms    [User: 7.1 ms, System: 177.2 ms]
  Range (min … max):   191.3 ms … 233.4 ms    10 runs

Summary
  deno-this-pr i --unstable-lockfile-v5 ran
    1.74 ± 0.17 times faster than deno-this-pr i
    2.19 ± 0.18 times faster than deno i
```

With lockfile v5, a 2.19x faster install time compared to the current
deno.
2025-04-08 02:06:17 +00:00
..
binary_package chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
cached_only refactor: remove CliNpmRegistryApi (#27222) 2024-12-03 19:44:56 -05:00
cached_only_after_first_run chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
cjs_with_deps fix(info): move "version" field to top of json output (#25890) 2024-09-26 15:57:12 -04:00
different_nested_dep chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
dual_cjs_esm chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
dynamic_import chore: fix flaky net_listen_allow_localhost_4555 (#23726) 2024-05-07 17:21:56 +00:00
dynamic_import_json chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
exec_file fix(ext/node): improve shelljs compat with managed npm execution (#24912) 2024-08-16 12:48:48 +09:00
no_npm_after_first_run chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
reload chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
require_resolve_url chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
run_existing_npm_package fix(npm): ensure scoped package name is encoded in URLs (#26390) 2024-10-18 20:38:57 +02:00
compile_npm_no_permissions.out feat: Deno.cwd() no longer requires --allow-read permission (#27192) 2025-01-27 15:13:59 +01:00
deno_run_cjs.out chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
deno_run_cowsay.out chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
deno_run_cowthink.out chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
deno_run_esm.out chore: move cli/tests/ -> tests/ (#22369) 2024-02-10 20:22:13 +00:00
README.md chore: fix flaky net_listen_allow_localhost_4555 (#23726) 2024-05-07 17:21:56 +00:00

npm test data

This folder contains test data for npm specifiers.

Registry

The registry is served by the test server (server in tests/util/server) at http://localhost:4260/ via the ./registry folder.

Updating with real npm packages

  1. Set the DENO_TEST_UTIL_UPDATE_NPM=1 environment variable
  2. Run the test and it should download the packages.

Using a custom npm package

  1. Add the custom package to ./registry/@denotest
  2. Reference npm:@denotest/<your-package-name> in the tests.