Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Proposed v0.28.0 "bijou" release: smaller binaries, faster processing, more ARM64, integrated mozjpeg+pngquant #2604

Closed
14 of 17 tasks
lovell opened this issue Mar 2, 2021 · 14 comments
Milestone

Comments

@lovell
Copy link
Owner

lovell commented Mar 2, 2021

This is a meta-issue to track the many improvements that are planned/proposed for the forthcoming v0.28.0 of sharp.

The release date is very much to be determined; please don't ask.

Smaller install footprint, faster install time

The latest version of sharp v0.27.2 occupies 38MB of disk space, a figure that has been creeping up recently, especially with the addition of AVIF support via libaom.

$ npm install [email protected]
$ du -sh node_modules/
38M	node_modules/

For sharp v0.28.0, the plan is to approximately halve this to around 20MB of disk space.

Changes to prebuilt binaries:

  • Statically-compile a single libvips shared library with all of its dependencies (Linux and macOS)
  • Optimise select dependencies for binary size (-Os) where libvips' use of them does not benefit from performance (-O3)
  • Only decompress C header files when sharp is to be built from source
  • For AVIF de/compression, replace libaom with the smaller and slightly faster dav1d+rav1e combo
    This is not straightforward, so now being tracked at Experiment: consider switching from aom to dav1d+rav1e/svt-av1 sharp-libvips#97

Changes to npm dependency tree:

  • replace array-flatten dependency with [].concat(...arr)
  • revert simple-get dependency to v3.1.0 for de-duping with prebuild-install
  • replace npmlog dependency with console.log/error

Faster processing

Changes to prebuilt binaries:

  • Replace zlib with zlib-ng to improve PNG de/compression performance by ~20%
  • x64 binaries compiled with support for newer SIMD intrinsics (e.g. SSE4.2, CLMUL)

Improve ARM64 support

ARM64 is currently supported on modern glibc-based Linux such as Raspberry Pi OS. The aim is to expand the provision of binaries for more aarch64 platforms:

  • Apple M1 (darwin-arm64v8) libvips (but not sharp)
  • Alpine Linux aarch64 (linuxmusl-arm64v8) libvips and sharp
  • Replace Travis CI with services kindly donated to the libvips project by https://aarch64.com/
  • Find a CI provider that makes Apple M1 hardware available to open source projects

Optimise output

It's quite common for packages that depend on sharp to also depend on imagemin for imagemin-mozjpeg and imagemin-pngquant, which can lead to an inefficient two stage process.

Changes to prebuilt binaries:

  • Replace libjpeg-turbo with mozjpeg
  • Provide experimental libimagequant v2.4.1 (BSD 2-clause)

Supporting improvements to API and documentation:

  • Improve sharp jpeg API to easily select "maximum" mozjpeg options (see below)
  • Add code examples to docs with equivalents of running mozjpeg and pngquant

This will allow access to the features of mozjpeg and pngquant as part of your existing sharp image processing pipelines without the need to install further dependencies or spawn child processes.

// PROPOSED API - NOT YET AVAILABLE

sharp(input)
  .jpeg({ mozjpeg: true })
  .toBuffer()

sharp(input)
  .png({ palette: true })
  .toBuffer()

// PROPOSED API - NOT YET AVAILABLE
@abarisain
Copy link

Exciting news :)

I just want to let you know that if you need any help or simply testing with Intel/M1 macs, I'd be glad to help.

@billykwok
Copy link

Really excited about replacing libaom with dav1d and rav1e.
Currently most popular CI services are yet to support M1. CodeMagic (no affiliation) provides mac-based CI specifically and supports open-source projects according to their FAQs. Maybe it could be used as a secondary CI in addition to the non-M1 CI.

@mehdiraized

This comment has been minimized.

@lovell
Copy link
Owner Author

lovell commented Mar 14, 2021

The first pre-release of v0.28.0 is now available for some early testing:

npm install lovell/sharp#v0.28.0-alpha1

Notes:

  • Prebuilt libvips is v8.10.6-beta2
  • For Apple M1, prebuilt libvips binaries are provided but not prebuilt sharp binaries
  • 32-bit Windows support is not yet available in this pre-release
  • For help accessing mozjpeg and pngquant features, please see the updated documentation/examples for jpeg and png (temporary links)
  • The version of zlib-ng v2.0.0-RC2 is a release candidate

This pre-release uses ~1/3rd less disk space than v0.27.2, e.g. here's Linux x64:

$ du -sh node_modules/
27M	node_modules/

@SaviourSelf
Copy link

Can't seem to get Sharp running on M1. Tried this using M1, getting an issue:

⚠  Error: 'darwin-arm64v8' binaries cannot be used on the 'darwin-x64' platform. Please remove the 'node_modules/sharp' directory and run 'npm install' on the 'darwin-x64' platform. 

package.json:

"sharp": "github:lovell/sharp#v0.28.0-alpha1"
brew info vips
vips: stable 8.10.5 (bottled)
Image processing library
https://github.com/libvips/libvips
/opt/homebrew/Cellar/vips/8.10.5_2 (167 files, 14MB) *

Tried:
reinstalling libvips, removing node_modules directory and rerunning install. Tried non-alpha sharp version. Am I missing a step?

@lovell
Copy link
Owner Author

lovell commented Mar 17, 2021

@SaviourSelf The message 'darwin-arm64v8' binaries cannot be used on the 'darwin-x64' platform means that ARM64 Node.js is being used at npm install time but (Rosetta emulated) x64 Node.js is being used at runtime. You probably have multiple, conflicting architectures of Node.js installed.

@lovell
Copy link
Owner Author

lovell commented Mar 27, 2021

The (first and hopefully only) v0.28.0 beta release is now available. It would be especially great if those with Apple M1 devices are able to help test this:

npm install lovell/sharp#v0.28.0-beta1

Notes:

@mikeburgh
Copy link

Clean M1 Mac test:

  • Failed, without developer command line tools:
npm ERR! Error while executing:<br/>
npm ERR! /usr/bin/git ls-remote -h -t ssh://[email protected]/lovell/sharp.git<br/>
npm ERR! 
npm ERR! xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
npm ERR! 
npm ERR! exited with error code: 1
npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/mike/.npm/_logs/2021-03-27T19_17_49_305Z-debug.log
  • After installing the command line tools it installed fine!

I also tested it also in a Ubuntu20.04 container ( nvidia/cuda:11.1.1-cudnn8-runtime-ubuntu20.04 ), it failed using either of these commands:

npm install lovell/sharp#v0.28.0-beta1
npm --arch=x64 --platform=linux install lovell/sharp#v0.28.0-beta1

Current version of sharp installs in the container without issue.

NPM output log


0 verbose cli [
0 verbose cli '/home/mike/.nvm/versions/node/v14.15.4/bin/node',
0 verbose cli '/home/mike/.nvm/versions/node/v14.15.4/bin/npm',
0 verbose cli '--arch=x64',
0 verbose cli '--platform=linux',
0 verbose cli 'install',
0 verbose cli 'lovell/sharp#v0.28.0-beta1'
0 verbose cli ]
1 info using [email protected]
2 info using [email protected]
3 timing config:load:defaults Completed in 1ms
4 timing config:load:file:/home/mike/.nvm/versions/node/v14.15.4/lib/node_modules/npm/npmrc Completed in 1ms
5 timing config:load:builtin Completed in 1ms
6 timing config:load:cli Completed in 1ms
7 timing config:load:env Completed in 0ms
8 timing config:load:file:/home/mike/Dev/test/.npmrc Completed in 0ms
9 timing config:load:project Completed in 1ms
10 timing config:load:file:/home/mike/.npmrc Completed in 0ms
11 timing config:load:user Completed in 0ms
12 timing config:load:file:/home/mike/.nvm/versions/node/v14.15.4/etc/npmrc Completed in 1ms
13 timing config:load:global Completed in 1ms
14 timing config:load:cafile Completed in 0ms
15 timing config:load:validate Completed in 0ms
16 timing config:load:setUserAgent Completed in 0ms
17 timing config:load:setEnvs Completed in 1ms
18 timing config:load Completed in 6ms
19 verbose npm-session 53d4bb78e0095dba
20 timing npm:load Completed in 10ms
21 http fetch GET 200 https://registry.npmjs.org/npm 296ms
22 timing arborist:ctor Completed in 0ms
23 timing arborist:ctor Completed in 0ms
24 timing idealTree:init Completed in 5ms
25 timing idealTree:userRequests Completed in 3999ms
26 silly idealTree buildDeps
27 silly fetch manifest sharp@lovell/sharp#v0.28.0-beta1
28 silly placeDep ROOT [email protected] OK for: want: lovell/sharp#v0.28.0-beta1
29 silly fetch manifest color@^3.1.3
30 silly fetch manifest detect-libc@^1.0.3
31 silly fetch manifest node-addon-api@^3.1.0
32 silly fetch manifest prebuild-install@^6.0.1
33 silly fetch manifest semver@^7.3.5
34 silly fetch manifest simple-get@^3.1.0
35 silly fetch manifest tar-fs@^2.1.1
36 silly fetch manifest tunnel-agent@^0.6.0
37 http fetch GET 200 https://registry.npmjs.org/color 92ms
38 http fetch GET 200 https://registry.npmjs.org/detect-libc 98ms
39 http fetch GET 200 https://registry.npmjs.org/simple-get 105ms
40 http fetch GET 200 https://registry.npmjs.org/tunnel-agent 106ms
41 http fetch GET 200 https://registry.npmjs.org/semver 130ms
42 http fetch GET 200 https://registry.npmjs.org/node-addon-api 132ms
43 http fetch GET 200 https://registry.npmjs.org/tar-fs 133ms
44 http fetch GET 200 https://registry.npmjs.org/prebuild-install 149ms
45 timing idealTree:#root Completed in 3577ms
46 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.1.3
47 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.3
48 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.1.0
49 silly placeDep ROOT [email protected] OK for: [email protected] want: ^6.0.1
50 silly placeDep ROOT [email protected] OK for: [email protected] want: ^7.3.5
51 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.1.0
52 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.1.1
53 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.6.0
54 silly fetch manifest color-convert@^1.9.1
55 silly fetch manifest color-string@^1.5.4
56 silly fetch manifest expand-template@^2.0.3
57 silly fetch manifest [email protected]
58 silly fetch manifest minimist@^1.2.3
59 silly fetch manifest mkdirp-classic@^0.5.3
60 silly fetch manifest napi-build-utils@^1.0.1
61 silly fetch manifest node-abi@^2.7.0
62 silly fetch manifest noop-logger@^0.1.1
63 silly fetch manifest npmlog@^4.0.1
64 silly fetch manifest pump@^3.0.0
65 silly fetch manifest rc@^1.2.7
66 silly fetch manifest which-pm-runs@^1.0.0
67 silly fetch manifest lru-cache@^6.0.0
68 silly fetch manifest decompress-response@^4.2.0
69 silly fetch manifest once@^1.3.1
70 silly fetch manifest simple-concat@^1.0.0
71 silly fetch manifest chownr@^1.1.1
72 silly fetch manifest mkdirp-classic@^0.5.2
73 silly fetch manifest tar-stream@^2.1.4
74 silly fetch manifest safe-buffer@^5.0.1
75 http fetch GET 200 https://registry.npmjs.org/napi-build-utils 64ms
76 http fetch GET 200 https://registry.npmjs.org/minimist 67ms
77 http fetch GET 200 https://registry.npmjs.org/mkdirp-classic 65ms
78 http fetch GET 200 https://registry.npmjs.org/expand-template 68ms
79 http fetch GET 200 https://registry.npmjs.org/color-convert 72ms
80 http fetch GET 200 https://registry.npmjs.org/github-from-package 68ms
81 http fetch GET 200 https://registry.npmjs.org/color-string 74ms
82 http fetch GET 200 https://registry.npmjs.org/node-abi 69ms
83 http fetch GET 200 https://registry.npmjs.org/simple-concat 88ms
84 http fetch GET 200 https://registry.npmjs.org/which-pm-runs 94ms
85 http fetch GET 200 https://registry.npmjs.org/lru-cache 93ms
86 http fetch GET 200 https://registry.npmjs.org/decompress-response 92ms
87 http fetch GET 200 https://registry.npmjs.org/once 100ms
88 http fetch GET 200 https://registry.npmjs.org/pump 110ms
89 http fetch GET 200 https://registry.npmjs.org/chownr 104ms
90 http fetch GET 200 https://registry.npmjs.org/npmlog 112ms
91 http fetch GET 200 https://registry.npmjs.org/safe-buffer 103ms
92 http fetch GET 200 https://registry.npmjs.org/noop-logger 114ms
93 http fetch GET 200 https://registry.npmjs.org/tar-stream 105ms
94 http fetch GET 200 https://registry.npmjs.org/rc 134ms
95 timing idealTree:node_modules/sharp Completed in 163ms
96 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.9.1
97 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.5.4
98 silly fetch manifest [email protected]
99 silly fetch manifest color-name@^1.0.0
100 silly fetch manifest simple-swizzle@^0.2.2
101 http fetch GET 200 https://registry.npmjs.org/color-name 41ms
102 http fetch GET 200 https://registry.npmjs.org/simple-swizzle 49ms
103 timing idealTree:node_modules/color Completed in 53ms
104 silly placeDep ROOT [email protected] OK for: [email protected] want: 1.1.3
105 timing idealTree:node_modules/color-convert Completed in 1ms
106 timing idealTree:node_modules/color-name Completed in 0ms
107 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.2.2
108 silly fetch manifest is-arrayish@^0.3.1
109 http fetch GET 200 https://registry.npmjs.org/is-arrayish 40ms
110 timing idealTree:node_modules/color-string Completed in 41ms
111 timing idealTree:node_modules/detect-libc Completed in 0ms
112 timing idealTree:node_modules/node-addon-api Completed in 0ms
113 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.3
114 silly placeDep ROOT [email protected] OK for: [email protected] want: 0.0.0
115 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.2.3
116 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.5.3
117 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.1
118 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.7.0
119 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.1.1
120 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.0.1
121 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
122 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.2.7
123 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
124 silly fetch manifest semver@^5.4.1
125 silly fetch manifest are-we-there-yet@~1.1.2
126 silly fetch manifest console-control-strings@~1.1.0
127 silly fetch manifest gauge@~2.7.3
128 silly fetch manifest set-blocking@~2.0.0
129 silly fetch manifest end-of-stream@^1.1.0
130 silly fetch manifest deep-extend@^0.6.0
131 silly fetch manifest ini@~1.3.0
132 silly fetch manifest strip-json-comments@~2.0.1
133 http fetch GET 200 https://registry.npmjs.org/console-control-strings 54ms
134 http fetch GET 200 https://registry.npmjs.org/ini 52ms
135 http fetch GET 200 https://registry.npmjs.org/end-of-stream 54ms
136 http fetch GET 200 https://registry.npmjs.org/gauge 56ms
137 http fetch GET 200 https://registry.npmjs.org/deep-extend 56ms
138 http fetch GET 200 https://registry.npmjs.org/set-blocking 57ms
139 http fetch GET 200 https://registry.npmjs.org/are-we-there-yet 61ms
140 http fetch GET 200 https://registry.npmjs.org/strip-json-comments 65ms
141 timing idealTree:node_modules/prebuild-install Completed in 77ms
142 timing idealTree:node_modules/expand-template Completed in 1ms
143 timing idealTree:node_modules/github-from-package Completed in 0ms
144 timing idealTree:node_modules/minimist Completed in 0ms
145 timing idealTree:node_modules/mkdirp-classic Completed in 0ms
146 timing idealTree:node_modules/napi-build-utils Completed in 0ms
147 silly placeDep node_modules/node-abi [email protected] OK for: [email protected] want: ^5.4.1
148 timing idealTree:node_modules/node-abi Completed in 1ms
149 timing idealTree:node_modules/noop-logger Completed in 0ms
150 silly placeDep ROOT [email protected] OK for: [email protected] want: ~1.1.2
151 silly placeDep ROOT [email protected] OK for: [email protected] want: ~1.1.0
152 silly placeDep ROOT [email protected] OK for: [email protected] want: ~2.7.3
153 silly placeDep ROOT [email protected] OK for: [email protected] want: ~2.0.0
154 silly fetch manifest delegates@^1.0.0
155 silly fetch manifest readable-stream@^2.0.6
156 silly fetch manifest aproba@^1.0.3
157 silly fetch manifest has-unicode@^2.0.0
158 silly fetch manifest object-assign@^4.1.0
159 silly fetch manifest signal-exit@^3.0.0
160 silly fetch manifest string-width@^1.0.1
161 silly fetch manifest strip-ansi@^3.0.1
162 silly fetch manifest wide-align@^1.1.0
163 http fetch GET 200 https://registry.npmjs.org/delegates 56ms
164 http fetch GET 200 https://registry.npmjs.org/signal-exit 53ms
165 http fetch GET 200 https://registry.npmjs.org/aproba 56ms
166 http fetch GET 200 https://registry.npmjs.org/strip-ansi 53ms
167 http fetch GET 200 https://registry.npmjs.org/wide-align 53ms
168 http fetch GET 200 https://registry.npmjs.org/object-assign 56ms
169 http fetch GET 200 https://registry.npmjs.org/string-width 56ms
170 http fetch GET 200 https://registry.npmjs.org/has-unicode 60ms
171 http fetch GET 200 https://registry.npmjs.org/readable-stream 67ms
172 timing idealTree:node_modules/npmlog Completed in 74ms
173 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
174 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.6
175 silly fetch manifest core-util-is@~1.0.0
176 silly fetch manifest inherits@~2.0.3
177 silly fetch manifest isarray@~1.0.0
178 silly fetch manifest process-nextick-args@~2.0.0
179 silly fetch manifest safe-buffer@~5.1.1
180 silly fetch manifest string_decoder@~1.1.1
181 silly fetch manifest util-deprecate@~1.0.1
182 http fetch GET 200 https://registry.npmjs.org/core-util-is 51ms
183 http fetch GET 200 https://registry.npmjs.org/util-deprecate 48ms
184 http fetch GET 200 https://registry.npmjs.org/string_decoder 50ms
185 http fetch GET 200 https://registry.npmjs.org/inherits 52ms
186 http fetch GET 200 https://registry.npmjs.org/process-nextick-args 62ms
187 http fetch GET 200 https://registry.npmjs.org/isarray 64ms
188 timing idealTree:node_modules/are-we-there-yet Completed in 69ms
189 timing idealTree:node_modules/console-control-strings Completed in 0ms
190 timing idealTree:node_modules/delegates Completed in 0ms
191 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.3
192 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
193 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.1.0
194 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
195 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.1
196 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.1
197 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.1.0
198 silly fetch manifest code-point-at@^1.0.0
199 silly fetch manifest is-fullwidth-code-point@^1.0.0
200 silly fetch manifest ansi-regex@^2.0.0
201 http fetch GET 200 https://registry.npmjs.org/ansi-regex 45ms
202 http fetch GET 200 https://registry.npmjs.org/code-point-at 50ms
203 http fetch GET 200 https://registry.npmjs.org/is-fullwidth-code-point 50ms
204 timing idealTree:node_modules/gauge Completed in 55ms
205 timing idealTree:node_modules/aproba Completed in 0ms
206 timing idealTree:node_modules/has-unicode Completed in 0ms
207 timing idealTree:node_modules/object-assign Completed in 0ms
208 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.1.0
209 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.3.1
210 silly fetch manifest wrappy@1
211 http fetch GET 200 https://registry.npmjs.org/wrappy 39ms
212 timing idealTree:node_modules/pump Completed in 43ms
213 timing idealTree:node_modules/end-of-stream Completed in 0ms
214 silly placeDep ROOT [email protected] OK for: [email protected] want: 1
215 timing idealTree:node_modules/once Completed in 1ms
216 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.6.0
217 silly placeDep ROOT [email protected] OK for: [email protected] want: ~1.3.0
218 silly placeDep ROOT [email protected] OK for: [email protected] want: ~2.0.1
219 timing idealTree:node_modules/rc Completed in 1ms
220 timing idealTree:node_modules/deep-extend Completed in 0ms
221 timing idealTree:node_modules/ini Completed in 0ms
222 silly placeDep ROOT [email protected] OK for: [email protected] want: ~1.0.0
223 silly placeDep ROOT [email protected] OK for: [email protected] want: ~2.0.3
224 silly placeDep ROOT [email protected] OK for: [email protected] want: ~1.0.0
225 silly placeDep ROOT [email protected] OK for: [email protected] want: ~2.0.0
226 silly placeDep ROOT [email protected] OK for: [email protected] want: ~5.1.1
227 silly placeDep ROOT [email protected] OK for: [email protected] want: ~1.1.1
228 silly placeDep ROOT [email protected] OK for: [email protected] want: ~1.0.1
229 timing idealTree:node_modules/readable-stream Completed in 2ms
230 timing idealTree:node_modules/core-util-is Completed in 0ms
231 timing idealTree:node_modules/inherits Completed in 0ms
232 timing idealTree:node_modules/isarray Completed in 0ms
233 timing idealTree:node_modules/process-nextick-args Completed in 0ms
234 timing idealTree:node_modules/safe-buffer Completed in 0ms
235 silly placeDep ROOT [email protected] OK for: [email protected] want: ^6.0.0
236 silly fetch manifest yallist@^4.0.0
237 http fetch GET 200 https://registry.npmjs.org/yallist 42ms
238 timing idealTree:node_modules/semver Completed in 43ms
239 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.0.0
240 timing idealTree:node_modules/lru-cache Completed in 1ms
241 timing idealTree:node_modules/set-blocking Completed in 0ms
242 timing idealTree:node_modules/signal-exit Completed in 0ms
243 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.2.0
244 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
245 silly fetch manifest mimic-response@^2.0.0
246 http fetch GET 200 https://registry.npmjs.org/mimic-response 42ms
247 timing idealTree:node_modules/simple-get Completed in 44ms
248 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
249 timing idealTree:node_modules/decompress-response Completed in 0ms
250 timing idealTree:node_modules/mimic-response Completed in 0ms
251 timing idealTree:node_modules/simple-concat Completed in 0ms
252 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.3.1
253 timing idealTree:node_modules/simple-swizzle Completed in 1ms
254 timing idealTree:node_modules/is-arrayish Completed in 0ms
255 timing idealTree:node_modules/string_decoder Completed in 0ms
256 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
257 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
258 silly fetch manifest number-is-nan@^1.0.0
259 http fetch GET 200 https://registry.npmjs.org/number-is-nan 34ms
260 timing idealTree:node_modules/string-width Completed in 37ms
261 timing idealTree:node_modules/code-point-at Completed in 0ms
262 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
263 timing idealTree:node_modules/is-fullwidth-code-point Completed in 1ms
264 timing idealTree:node_modules/number-is-nan Completed in 0ms
265 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
266 timing idealTree:node_modules/strip-ansi Completed in 0ms
267 timing idealTree:node_modules/ansi-regex Completed in 0ms
268 timing idealTree:node_modules/strip-json-comments Completed in 0ms
269 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.1.1
270 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.1.4
271 silly fetch manifest bl@^4.0.3
272 silly fetch manifest fs-constants@^1.0.0
273 silly fetch manifest readable-stream@^3.1.1
274 http fetch GET 200 https://registry.npmjs.org/fs-constants 46ms
275 http fetch GET 200 https://registry.npmjs.org/bl 73ms
276 timing idealTree:node_modules/tar-fs Completed in 74ms
277 timing idealTree:node_modules/chownr Completed in 0ms
278 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.0.3
279 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
280 silly placeDep node_modules/tar-stream [email protected] OK for: [email protected] want: ^3.1.1
281 silly fetch manifest buffer@^5.5.0
282 silly fetch manifest readable-stream@^3.4.0
283 http fetch GET 200 https://registry.npmjs.org/buffer 59ms
284 timing idealTree:node_modules/tar-stream Completed in 64ms
285 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.5.0
286 silly placeDep node_modules/bl [email protected] OK for: [email protected] want: ^3.4.0
287 silly fetch manifest base64-js@^1.3.1
288 silly fetch manifest ieee754@^1.1.13
289 http fetch GET 200 https://registry.npmjs.org/base64-js 44ms
290 http fetch GET 200 https://registry.npmjs.org/ieee754 52ms
291 timing idealTree:node_modules/bl Completed in 55ms
292 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.3.1
293 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.1.13
294 timing idealTree:node_modules/buffer Completed in 1ms
295 timing idealTree:node_modules/base64-js Completed in 0ms
296 timing idealTree:node_modules/fs-constants Completed in 0ms
297 timing idealTree:node_modules/ieee754 Completed in 0ms
298 timing idealTree:node_modules/tunnel-agent Completed in 0ms
299 timing idealTree:node_modules/util-deprecate Completed in 0ms
300 timing idealTree:node_modules/which-pm-runs Completed in 0ms
301 timing idealTree:node_modules/wide-align Completed in 0ms
302 timing idealTree:node_modules/wrappy Completed in 0ms
303 timing idealTree:node_modules/yallist Completed in 0ms
304 timing idealTree:node_modules/bl/node_modules/readable-stream Completed in 0ms
305 timing idealTree:node_modules/node-abi/node_modules/semver Completed in 0ms
306 timing idealTree:node_modules/tar-stream/node_modules/readable-stream Completed in 0ms
307 timing idealTree:buildDeps Completed in 4485ms
308 timing idealTree:fixDepFlags Completed in 0ms
309 timing idealTree Completed in 8490ms
310 timing reify:loadTrees Completed in 8490ms
311 timing reify:diffTrees Completed in 1ms
312 silly reify moves {}
313 timing reify:retireShallow Completed in 0ms
314 timing reify:createSparse Completed in 12ms
315 timing reify:loadBundles Completed in 0ms
316 silly tarball no local data for ieee754@https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz. Extracting by manifest.
317 silly tarball no local data for fs-constants@https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz. Extracting by manifest.
318 silly tarball no local data for base64-js@https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz. Extracting by manifest.
319 silly tarball no local data for buffer@https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz. Extracting by manifest.
320 silly tarball no local data for readable-stream@https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz. Extracting by manifest.
321 silly tarball no local data for chownr@https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz. Extracting by manifest.
322 silly tarball no local data for ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz. Extracting by manifest.
323 silly tarball no local data for readable-stream@https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz. Extracting by manifest.
324 silly tarball no local data for is-fullwidth-code-point@https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz. Extracting by manifest.
325 silly tarball no local data for number-is-nan@https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz. Extracting by manifest.
326 silly tarball no local data for code-point-at@https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz. Extracting by manifest.
327 silly tarball no local data for is-arrayish@https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz. Extracting by manifest.
328 silly tarball no local data for mimic-response@https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz. Extracting by manifest.
329 silly tarball no local data for simple-concat@https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz. Extracting by manifest.
330 silly tarball no local data for lru-cache@https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz. Extracting by manifest.
331 silly tarball no local data for decompress-response@https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz. Extracting by manifest.
332 silly tarball no local data for yallist@https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz. Extracting by manifest.
333 silly tarball no local data for util-deprecate@https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz. Extracting by manifest.
334 silly tarball no local data for safe-buffer@https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz. Extracting by manifest.
335 silly tarball no local data for process-nextick-args@https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz. Extracting by manifest.
336 silly tarball no local data for string_decoder@https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz. Extracting by manifest.
337 silly tarball no local data for core-util-is@https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz. Extracting by manifest.
338 silly tarball no local data for inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz. Extracting by manifest.
339 silly tarball no local data for strip-json-comments@https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz. Extracting by manifest.
340 silly tarball no local data for isarray@https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz. Extracting by manifest.
341 silly tarball no local data for ini@https://registry.npmjs.org/ini/-/ini-1.3.8.tgz. Extracting by manifest.
342 silly tarball no local data for wrappy@https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz. Extracting by manifest.
343 silly tarball no local data for deep-extend@https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz. Extracting by manifest.
344 silly tarball no local data for once@https://registry.npmjs.org/once/-/once-1.4.0.tgz. Extracting by manifest.
345 silly tarball no local data for wide-align@https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz. Extracting by manifest.
346 silly tarball no local data for strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz. Extracting by manifest.
347 silly tarball no local data for end-of-stream@https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz. Extracting by manifest.
348 silly tarball no local data for string-width@https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz. Extracting by manifest.
349 silly tarball no local data for aproba@https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz. Extracting by manifest.
350 silly tarball no local data for signal-exit@https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz. Extracting by manifest.
351 silly tarball no local data for object-assign@https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz. Extracting by manifest.
352 silly tarball no local data for has-unicode@https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz. Extracting by manifest.
353 silly tarball no local data for delegates@https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz. Extracting by manifest.
354 silly tarball no local data for readable-stream@https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz. Extracting by manifest.
355 silly tarball no local data for gauge@https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz. Extracting by manifest.
356 silly tarball no local data for set-blocking@https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz. Extracting by manifest.
357 silly tarball no local data for console-control-strings@https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz. Extracting by manifest.
358 silly tarball no local data for which-pm-runs@https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz. Extracting by manifest.
359 silly tarball no local data for are-we-there-yet@https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz. Extracting by manifest.
360 silly tarball no local data for rc@https://registry.npmjs.org/rc/-/rc-1.2.8.tgz. Extracting by manifest.
361 silly tarball no local data for pump@https://registry.npmjs.org/pump/-/pump-3.0.0.tgz. Extracting by manifest.
362 silly tarball no local data for npmlog@https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz. Extracting by manifest.
363 silly tarball no local data for noop-logger@https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz. Extracting by manifest.
364 silly tarball no local data for napi-build-utils@https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz. Extracting by manifest.
365 silly tarball no local data for mkdirp-classic@https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz. Extracting by manifest.
366 silly tarball no local data for expand-template@https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz. Extracting by manifest.
367 silly tarball no local data for github-from-package@https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz. Extracting by manifest.
368 silly tarball no local data for semver@https://registry.npmjs.org/semver/-/semver-5.7.1.tgz. Extracting by manifest.
369 silly tarball no local data for simple-swizzle@https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz. Extracting by manifest.
370 silly tarball no local data for minimist@https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz. Extracting by manifest.
371 silly tarball no local data for color-name@https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz. Extracting by manifest.
372 silly tarball no local data for color-string@https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz. Extracting by manifest.
373 silly tarball no local data for tunnel-agent@https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz. Extracting by manifest.
374 silly tarball no local data for color-convert@https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz. Extracting by manifest.
375 silly tarball no local data for simple-get@https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz. Extracting by manifest.
376 silly tarball no local data for tar-fs@https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz. Extracting by manifest.
377 silly tarball no local data for semver@https://registry.npmjs.org/semver/-/semver-7.3.5.tgz. Extracting by manifest.
378 silly tarball no local data for node-addon-api@https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz. Extracting by manifest.
379 silly tarball no local data for prebuild-install@https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.1.tgz. Extracting by manifest.
380 silly tarball no local data for detect-libc@https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz. Extracting by manifest.
381 silly tarball no local data for color@https://registry.npmjs.org/color/-/color-3.1.3.tgz. Extracting by manifest.
382 silly tarball no local data for bl@https://registry.npmjs.org/bl/-/bl-4.1.0.tgz. Extracting by manifest.
383 silly tarball no local data for tar-stream@https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz. Extracting by manifest.
384 silly tarball no local data for node-abi@https://registry.npmjs.org/node-abi/-/node-abi-2.21.0.tgz. Extracting by manifest.
385 http fetch GET 200 https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz 235ms
386 timing reifyNode:node_modules/ieee754 Completed in 261ms
387 http fetch GET 200 https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz 247ms
388 timing reifyNode:node_modules/is-fullwidth-code-point Completed in 291ms
389 http fetch GET 200 https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz 255ms
390 timing reifyNode:node_modules/ansi-regex Completed in 293ms
391 http fetch GET 200 https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz 273ms
392 timing reifyNode:node_modules/fs-constants Completed in 302ms
393 http fetch GET 200 https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz 251ms
394 timing reifyNode:node_modules/code-point-at Completed in 303ms
395 http fetch GET 200 https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz 275ms
396 timing reifyNode:node_modules/chownr Completed in 310ms
397 http fetch GET 200 https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz 266ms
398 timing reifyNode:node_modules/number-is-nan Completed in 316ms
399 http fetch GET 200 https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz 298ms
400 timing reifyNode:node_modules/base64-js Completed in 329ms
401 http fetch GET 200 https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz 280ms
402 timing reifyNode:node_modules/decompress-response Completed in 345ms
403 http fetch GET 200 https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz 291ms
404 timing reifyNode:node_modules/simple-concat Completed in 349ms
405 http fetch GET 200 https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz 277ms
406 timing reifyNode:node_modules/process-nextick-args Completed in 358ms
407 http fetch GET 200 https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz 307ms
408 timing reifyNode:node_modules/lru-cache Completed in 368ms
409 http fetch GET 200 https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz 315ms
410 timing reifyNode:node_modules/mimic-response Completed in 371ms
411 http fetch GET 200 https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz 309ms
412 timing reifyNode:node_modules/util-deprecate Completed in 378ms
413 http fetch GET 200 https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz 305ms
414 timing reifyNode:node_modules/safe-buffer Completed in 383ms
415 http fetch GET 200 https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz 301ms
416 timing reifyNode:node_modules/string_decoder Completed in 385ms
417 http fetch GET 200 https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz 300ms
418 timing reifyNode:node_modules/core-util-is Completed in 387ms
419 http fetch GET 200 https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz 324ms
420 timing reifyNode:node_modules/yallist Completed in 391ms
421 http fetch GET 200 https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz 300ms
422 timing reifyNode:node_modules/isarray Completed in 400ms
423 http fetch GET 200 https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz 372ms
424 timing reifyNode:node_modules/buffer Completed in 404ms
425 http fetch GET 200 https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz 374ms
426 timing reifyNode:node_modules/bl/node_modules/readable-stream Completed in 407ms
427 http fetch GET 200 https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz 307ms
428 timing reifyNode:node_modules/wrappy Completed in 416ms
429 http fetch GET 200 https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz 382ms
430 timing reifyNode:node_modules/tar-stream/node_modules/readable-stream Completed in 424ms
431 http fetch GET 200 https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz 335ms
432 timing reifyNode:node_modules/inherits Completed in 426ms
433 http fetch GET 200 https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz 377ms
434 timing reifyNode:node_modules/is-arrayish Completed in 431ms
435 http fetch GET 200 https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz 353ms
436 timing reifyNode:node_modules/strip-json-comments Completed in 450ms
437 http fetch GET 200 https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz 343ms
438 timing reifyNode:node_modules/wide-align Completed in 462ms
439 http fetch GET 200 https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz 335ms
440 timing reifyNode:node_modules/end-of-stream Completed in 466ms
441 http fetch POST 200 https://registry.npmjs.org/-/npm/v1/security/advisories/bulk 474ms
442 timing auditReport:getReport Completed in 475ms
443 timing auditReport:init Completed in 0ms
444 timing reify:audit Completed in 477ms
445 http fetch GET 200 https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz 349ms
446 timing reifyNode:node_modules/string-width Completed in 482ms
447 http fetch GET 200 https://registry.npmjs.org/ini/-/ini-1.3.8.tgz 384ms
448 timing reifyNode:node_modules/ini Completed in 486ms
449 http fetch GET 200 https://registry.npmjs.org/once/-/once-1.4.0.tgz 373ms
450 timing reifyNode:node_modules/once Completed in 489ms
451 http fetch GET 200 https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz 377ms
452 timing reifyNode:node_modules/strip-ansi Completed in 499ms
453 http fetch GET 200 https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz 362ms
454 timing reifyNode:node_modules/delegates Completed in 505ms
455 http fetch GET 200 https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz 395ms
456 timing reifyNode:node_modules/deep-extend Completed in 508ms
457 http fetch GET 200 https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz 376ms
458 timing reifyNode:node_modules/aproba Completed in 511ms
459 http fetch GET 200 https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz 374ms
460 timing reifyNode:node_modules/has-unicode Completed in 515ms
461 http fetch GET 200 https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz 381ms
462 timing reifyNode:node_modules/object-assign Completed in 521ms
463 http fetch GET 200 https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz 367ms
464 timing reifyNode:node_modules/which-pm-runs Completed in 525ms
465 http fetch GET 200 https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz 374ms
466 timing reifyNode:node_modules/set-blocking Completed in 527ms
467 http fetch GET 200 https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz 394ms
468 timing reifyNode:node_modules/signal-exit Completed in 531ms
469 http fetch GET 200 https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz 380ms
470 timing reifyNode:node_modules/console-control-strings Completed in 536ms
471 http fetch GET 200 https://registry.npmjs.org/pump/-/pump-3.0.0.tgz 374ms
472 timing reifyNode:node_modules/pump Completed in 539ms
473 http fetch GET 200 https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz 359ms
474 timing reifyNode:node_modules/simple-swizzle Completed in 543ms
475 http fetch GET 200 https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz 371ms
476 timing reifyNode:node_modules/mkdirp-classic Completed in 546ms
477 http fetch GET 200 https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz 368ms
478 timing reifyNode:node_modules/github-from-package Completed in 548ms
479 http fetch GET 200 https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz 389ms
480 timing reifyNode:node_modules/npmlog Completed in 555ms
481 http fetch GET 200 https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz 398ms
482 timing reifyNode:node_modules/are-we-there-yet Completed in 558ms
483 http fetch GET 200 https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz 386ms
484 timing reifyNode:node_modules/napi-build-utils Completed in 559ms
485 http fetch GET 200 https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz 385ms
486 timing reifyNode:node_modules/expand-template Completed in 563ms
487 http fetch GET 200 https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz 399ms
488 timing reifyNode:node_modules/noop-logger Completed in 569ms
489 http fetch GET 200 https://registry.npmjs.org/rc/-/rc-1.2.8.tgz 410ms
490 timing reifyNode:node_modules/rc Completed in 572ms
491 http fetch GET 200 https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz 376ms
492 timing reifyNode:node_modules/color-convert Completed in 575ms
493 http fetch GET 200 https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz 394ms
494 timing reifyNode:node_modules/color-name Completed in 584ms
495 http fetch GET 200 https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz 392ms
496 timing reifyNode:node_modules/tunnel-agent Completed in 589ms
497 http fetch GET 200 https://registry.npmjs.org/semver/-/semver-5.7.1.tgz 410ms
498 timing reifyNode:node_modules/node-abi/node_modules/semver Completed in 592ms
499 http fetch GET 200 https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz 402ms
500 timing reifyNode:node_modules/color-string Completed in 594ms
501 http fetch GET 200 https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz 396ms
502 timing reifyNode:node_modules/simple-get Completed in 596ms
503 http fetch GET 200 https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz 385ms
504 timing reifyNode:node_modules/detect-libc Completed in 598ms
505 http fetch GET 200 https://registry.npmjs.org/color/-/color-3.1.3.tgz 382ms
506 timing reifyNode:node_modules/color Completed in 600ms
507 http fetch GET 200 https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz 460ms
508 timing reifyNode:node_modules/readable-stream Completed in 605ms
509 http fetch GET 200 https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz 420ms
510 timing reifyNode:node_modules/minimist Completed in 609ms
511 http fetch GET 200 https://registry.npmjs.org/node-abi/-/node-abi-2.21.0.tgz 379ms
512 timing reifyNode:node_modules/node-abi Completed in 613ms
513 http fetch GET 200 https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz 391ms
514 timing reifyNode:node_modules/tar-stream Completed in 616ms
515 http fetch GET 200 https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz 469ms
516 timing reifyNode:node_modules/gauge Completed in 618ms
517 http fetch GET 200 https://registry.npmjs.org/bl/-/bl-4.1.0.tgz 398ms
518 timing reifyNode:node_modules/bl Completed in 622ms
519 http fetch GET 200 https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.1.tgz 410ms
520 timing reifyNode:node_modules/prebuild-install Completed in 621ms
521 http fetch GET 200 https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz 428ms
522 timing reifyNode:node_modules/tar-fs Completed in 630ms
523 http fetch GET 200 https://registry.npmjs.org/semver/-/semver-7.3.5.tgz 432ms
524 timing reifyNode:node_modules/semver Completed in 636ms
525 http fetch GET 200 https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz 443ms
526 timing reifyNode:node_modules/node-addon-api Completed in 655ms
527 http fetch GET 200 https://codeload.github.com/lovell/sharp/tar.gz/861cd93324eed683052084f6ab01414ced17bae5 2445ms
528 timing reifyNode:node_modules/sharp Completed in 35828ms
529 timing reify:unpack Completed in 35831ms
530 timing reify:unretire Completed in 0ms
531 timing build:queue Completed in 2ms
532 timing build:link:node_modules/detect-libc Completed in 593ms
533 timing build:link:node_modules/node-abi/node_modules/semver Completed in 593ms
534 timing build:link:node_modules/prebuild-install Completed in 709ms
535 timing build:link:node_modules/rc Completed in 709ms
536 timing build:link:node_modules/semver Completed in 709ms
537 timing build:link Completed in 710ms
538 info run [email protected] install node_modules/sharp (node install/libvips && node install/dll-copy && prebuild-install) || (node-gyp rebuild && node install/dll-copy)
539 info run [email protected] install { code: 1, signal: null }
540 timing reify:rollback:createSparse Completed in 79ms
541 timing reify:rollback:retireShallow Completed in 0ms
542 timing command:install Completed in 47439ms
543 notice �[40m�[37m�[39m�[49m
543 notice �[40m�[37mNew �[33mminor�[39m�[37m version of npm available! �[31m7.6.3�[39m�[37m -> �[32m7.7.5�[39m�[37m�[39m�[49m
543 notice �[40m�[37mChangelog: �[36mhttps://github.com/npm/cli/releases/tag/v7.7.5�[39m�[37m�[39m�[49m
543 notice �[40m�[37mRun �[32mnpm install -g [email protected]�[39m�[37m to update!�[39m�[49m
543 notice �[40m�[37m�[39m�[49m
544 verbose stack Error: command failed
544 verbose stack at ChildProcess. (/home/mike/.nvm/versions/node/v14.15.4/lib/node_modules/npm/node_modules/@npmcli/promise-spawn/index.js:64:27)
544 verbose stack at ChildProcess.emit (events.js:315:20)
544 verbose stack at maybeClose (internal/child_process.js:1048:16)
544 verbose stack at Socket. (internal/child_process.js:439:11)
544 verbose stack at Socket.emit (events.js:315:20)
544 verbose stack at Pipe. (net.js:673:12)
545 verbose pkgid [email protected]
546 verbose cwd /home/mike/Dev/test
547 verbose Linux 5.10.21-Unraid
548 verbose argv "/home/mike/.nvm/versions/node/v14.15.4/bin/node" "/home/mike/.nvm/versions/node/v14.15.4/bin/npm" "--arch=x64" "--platform=linux" "install" "lovell/sharp#v0.28.0-beta1"
549 verbose node v14.15.4
550 verbose npm v7.6.3
551 error code 1
552 error path /home/mike/Dev/test/node_modules/sharp
553 error command failed
554 error command sh -c (node install/libvips && node install/dll-copy && prebuild-install) || (node-gyp rebuild && node install/dll-copy)
555 error sharp: Using cached /home/mike/.npm/_libvips/libvips-8.10.6-linux-x64.tar.br
555 error make: Entering directory '/home/mike/Dev/test/node_modules/sharp/build'
555 error CC(target) Release/obj.target/nothing/../node-addon-api/nothing.o
555 error AR(target) Release/obj.target/../node-addon-api/nothing.a
555 error COPY Release/nothing.a
555 error TOUCH Release/obj.target/libvips-cpp.stamp
555 error CXX(target) Release/obj.target/sharp/src/common.o
555 error make: Leaving directory '/home/mike/Dev/test/node_modules/sharp/build'
556 error gyp info it worked if it ends with ok
556 error gyp info using [email protected]
556 error gyp info using [email protected] | linux | x64
556 error gyp info find Python using Python version 3.8.5 found at "/usr/bin/python3"
556 error gyp info spawn /usr/bin/python3
556 error gyp info spawn args [
556 error gyp info spawn args '/home/mike/.nvm/versions/node/v14.15.4/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py',
556 error gyp info spawn args 'binding.gyp',
556 error gyp info spawn args '-f',
556 error gyp info spawn args 'make',
556 error gyp info spawn args '-I',
556 error gyp info spawn args '/home/mike/Dev/test/node_modules/sharp/build/config.gypi',
556 error gyp info spawn args '-I',
556 error gyp info spawn args '/home/mike/.nvm/versions/node/v14.15.4/lib/node_modules/npm/node_modules/node-gyp/addon.gypi',
556 error gyp info spawn args '-I',
556 error gyp info spawn args '/home/mike/.cache/node-gyp/14.15.4/include/node/common.gypi',
556 error gyp info spawn args '-Dlibrary=shared_library',
556 error gyp info spawn args '-Dvisibility=default',
556 error gyp info spawn args '-Dnode_root_dir=/home/mike/.cache/node-gyp/14.15.4',
556 error gyp info spawn args '-Dnode_gyp_dir=/home/mike/.nvm/versions/node/v14.15.4/lib/node_modules/npm/node_modules/node-gyp',
556 error gyp info spawn args '-Dnode_lib_file=/home/mike/.cache/node-gyp/14.15.4/<(target_arch)/node.lib',
556 error gyp info spawn args '-Dmodule_root_dir=/home/mike/Dev/test/node_modules/sharp',
556 error gyp info spawn args '-Dnode_engine=v8',
556 error gyp info spawn args '--depth=.',
556 error gyp info spawn args '--no-parallel',
556 error gyp info spawn args '--generator-output',
556 error gyp info spawn args 'build',
556 error gyp info spawn args '-Goutput_dir=.'
556 error gyp info spawn args ]
556 error gyp info spawn make
556 error gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
556 error ../src/common.cc:24:10: fatal error: vips/vips8: No such file or directory
556 error 24 | #include <vips/vips8>
556 error | ^~~~~~~~~~~~
556 error compilation terminated.
556 error make: *** [sharp.target.mk:139: Release/obj.target/sharp/src/common.o] Error 1
556 error gyp ERR! build error
556 error gyp ERR! stack Error: make failed with exit code: 2
556 error gyp ERR! stack at ChildProcess.onExit (/home/mike/.nvm/versions/node/v14.15.4/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23)
556 error gyp ERR! stack at ChildProcess.emit (events.js:315:20)
556 error gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:277:12)
556 error gyp ERR! System Linux 5.10.21-Unraid
556 error gyp ERR! command "/home/mike/.nvm/versions/node/v14.15.4/bin/node" "/home/mike/.nvm/versions/node/v14.15.4/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
556 error gyp ERR! cwd /home/mike/Dev/test/node_modules/sharp
556 error gyp ERR! node -v v14.15.4
556 error gyp ERR! node-gyp -v v7.1.2
556 error gyp ERR! not ok
557 verbose exit 1


@lovell
Copy link
Owner Author

lovell commented Mar 27, 2021

@mikeburgh Thank you very much for testing.

After installing the command line tools it installed fine!

This is the expected behaviour. Prebuilt darwin-arm64v8 binaries will be provided for libvips but not sharp. This will be documented - see https://github.com/lovell/sharp/blob/bijou/docs/install.md#apple-m1

The Linux problem looks like it might be an npm v7 permissions thing. You mentioned Ubuntu 20.04 but the appearance of "Linux 5.10.21-Unraid" suggests this could be some kind of NAS device? If attempting to install a known-good tag e.g. npm install lovell/sharp#v0.27.2 fails in the same manner than it's unlikely to be related to the changes in v0.28.0.

@mikeburgh
Copy link

@lovell On the M1, figured the command tools would be required, just wanted to give you full results from a clean machine.

With linux, yes the container runs inside an Unraid machine (https://unraid.net/), however installing prior versions work, which is why I raised it:

npm install lovell/sharp#v0.27.2:

[                  ] \ reify:sharp: http fetch GET 200 https://codeload.github.com/lovell/sharp/tar.gz/956f7e29db3c[                  ] \ reify:sharp: http fetch GET 200 https://codeload.github.com/lovell/sharp/tar.gz/956f7e29db3c[                  ] \ reify:sharp: http fetch GET 200 https://codeload.github.com/lovell/sharp/tar.gz/956f7e29db3c[                  ] \ reify:sharp: http fetch GET 200 https://codeload.github.com/lovell/sharp/tar.gz/956f7e29db3c
added 74 packages, and audited 75 packages in 54s

9 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

@lovell
Copy link
Owner Author

lovell commented Mar 28, 2021

@mikeburgh I've tried using Node.js 14 installed via nvm in a clean Ubuntu 20.04 container and sharp v0.28.0-beta1 installs (from GitHub) correctly. If this problem persists on your specific machine after sharp v0.28.0 is published to npm, we can work out what's wrong in a new issue.

$ docker run -it --rm ubuntu:20.04 /bin/bash

Inside the container:

# apt-get update
# apt-get install -y curl git
# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
# source /root/.bashrc
# nvm install 14
# node -v  
v14.16.0
# npm -v
6.14.11
# npm install lovell/sharp#v0.28.0-beta1
+ [email protected]
added 70 packages from 186 contributors and audited 70 packages in 17.314s

@lovell
Copy link
Owner Author

lovell commented Mar 29, 2021

v0.28.0 is now available, thanks for everyone's help, please open a new issue for any problems.

As well as the performance improvements and added features of mozjpeg and pngquant, filesystem usage has been reduced by 30% (12MB) and we have identified further, future possible savings.

$ npm install [email protected]
$ du -sh node_modules/
26M	node_modules/

If you work at an organisation that benefits commercially from sharp and libvips, please consider a donation to https://opencollective.com/libvips as we're looking for financial help to cover paid summer internships.

@lovell lovell closed this as completed Mar 29, 2021
@mikeburgh
Copy link

@lovell yeah, what ever was up with it in my container, it's fine via the 0.28.0 release! Thanks for the great updates in this release!

@lovell
Copy link
Owner Author

lovell commented Apr 5, 2021

Due to a small administrative error on my part, the just-published v0.28.1 contains the complete set of filesystem savings that should have been part of v0.28.0.

https://packagephobia.com/result?p=sharp reports that v0.28.1 has an install size of 23MB.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants
@lovell @abarisain @mikeburgh @mehdiraized @SaviourSelf @billykwok and others