From 22b7e36c0116ac57da45cde9b91e464e8d0f7d1d Mon Sep 17 00:00:00 2001 From: Surma Date: Tue, 14 Apr 2020 13:29:05 +0100 Subject: [PATCH 01/26] 1.10.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e35d0cd8..8bbdeaa0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "squoosh", - "version": "1.9.1", + "version": "1.10.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 77590c77..5f652615 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "squoosh", - "version": "1.9.1", + "version": "1.10.0", "license": "apache-2.0", "scripts": { "start": "webpack-dev-server --host 0.0.0.0 --hot", From 62c53c9fed60e706d117bd739d80ff667b45ee88 Mon Sep 17 00:00:00 2001 From: Surma Date: Thu, 16 Apr 2020 11:52:59 +0100 Subject: [PATCH 02/26] 1.10.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8bbdeaa0..337c6819 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "squoosh", - "version": "1.10.0", + "version": "1.10.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5f652615..1eb439de 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "squoosh", - "version": "1.10.0", + "version": "1.10.1", "license": "apache-2.0", "scripts": { "start": "webpack-dev-server --host 0.0.0.0 --hot", From f4a16022efb8da80760f1b3aa21e532fbddc79a5 Mon Sep 17 00:00:00 2001 From: Surma Date: Thu, 16 Apr 2020 20:07:42 +0100 Subject: [PATCH 03/26] 1.10.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 337c6819..9d265cd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "squoosh", - "version": "1.10.1", + "version": "1.10.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1eb439de..87eae7f9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "squoosh", - "version": "1.10.1", + "version": "1.10.2", "license": "apache-2.0", "scripts": { "start": "webpack-dev-server --host 0.0.0.0 --hot", From eeb3d3562a33da2bd756542299b680f025344622 Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Wed, 22 Apr 2020 17:35:39 +0100 Subject: [PATCH 04/26] 1.10.3 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9d265cd1..87383efa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "squoosh", - "version": "1.10.2", + "version": "1.10.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 87eae7f9..6b633183 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "squoosh", - "version": "1.10.2", + "version": "1.10.3", "license": "apache-2.0", "scripts": { "start": "webpack-dev-server --host 0.0.0.0 --hot", From 1542bfb7fd707ba1e7637044bca7d2441a6f2c2c Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Mon, 11 May 2020 21:21:07 +0100 Subject: [PATCH 05/26] Tweak up compile flags - Remove unnecessary `-x c++`. - Improve rebuild speed by caching: - Remove `-f` from `autoreconf` to reuse generated configure scripts. - Remove `--rm` from `docker run` to avoid rebuilding Emscripten stdlib. - Add `-C` to `./configure` to reuse stored information about `emcc`. - Remove `rm -rf build` from WebP encoder/decoder. --- codecs/hqx/package.json | 2 +- codecs/imagequant/build.sh | 1 - codecs/imagequant/package.json | 2 +- codecs/mozjpeg_enc/build.sh | 15 ++++++--------- codecs/mozjpeg_enc/mozjpeg_enc.cpp | 3 +++ codecs/mozjpeg_enc/mozjpeg_enc.wasm | Bin 228590 -> 228472 bytes codecs/mozjpeg_enc/package.json | 2 +- codecs/oxipng/package.json | 2 +- codecs/resize/package.json | 2 +- codecs/rotate/package.json | 2 +- codecs/webp_dec/build.sh | 10 +++------- codecs/webp_dec/package.json | 2 +- codecs/webp_enc/build.sh | 10 +++------- codecs/webp_enc/package.json | 2 +- 14 files changed, 23 insertions(+), 32 deletions(-) diff --git a/codecs/hqx/package.json b/codecs/hqx/package.json index 9c50eb01..55123770 100644 --- a/codecs/hqx/package.json +++ b/codecs/hqx/package.json @@ -2,6 +2,6 @@ "name": "hqx", "scripts": { "build:image": "docker build -t squoosh-hqx .", - "build": "docker run --rm -v $(pwd):/src squoosh-hqx ./build.sh" + "build": "docker run -v $(pwd):/src squoosh-hqx ./build.sh" } } diff --git a/codecs/imagequant/build.sh b/codecs/imagequant/build.sh index 9029af40..eb85850e 100755 --- a/codecs/imagequant/build.sh +++ b/codecs/imagequant/build.sh @@ -29,7 +29,6 @@ echo "=============================================" -I node_modules/libimagequant \ -o ./imagequant.js \ --std=c++11 \ - -x c++ \ imagequant.cpp \ node_modules/libimagequant/libimagequant.a ) diff --git a/codecs/imagequant/package.json b/codecs/imagequant/package.json index 7797faa7..01da35ff 100644 --- a/codecs/imagequant/package.json +++ b/codecs/imagequant/package.json @@ -2,7 +2,7 @@ "name": "imagequant", "scripts": { "install": "napa", - "build": "docker run --rm -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" + "build": "docker run -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" }, "napa": { "libimagequant": "ImageOptim/libimagequant#2.12.1" diff --git a/codecs/mozjpeg_enc/build.sh b/codecs/mozjpeg_enc/build.sh index 3382901e..22cb7b21 100755 --- a/codecs/mozjpeg_enc/build.sh +++ b/codecs/mozjpeg_enc/build.sh @@ -15,9 +15,9 @@ echo "Compiling mozjpeg" echo "=============================================" ( cd node_modules/mozjpeg - autoreconf -fiv - emconfigure ./configure --without-simd - emmake make libjpeg.la -j`nproc` + autoreconf -iv + emconfigure ./configure -C --without-simd + emmake make libjpeg.la rdswitch.o -j`nproc` ) echo "=============================================" echo "Compiling mozjpeg done" @@ -31,18 +31,15 @@ echo "=============================================" --bind \ ${OPTIMIZE} \ --closure 1 \ - -s WASM=1 \ -s ALLOW_MEMORY_GROWTH=1 \ -s MODULARIZE=1 \ -s 'EXPORT_NAME="mozjpeg_enc"' \ -I node_modules/mozjpeg \ -o ./mozjpeg_enc.js \ - -Wno-deprecated-register \ - -Wno-writable-strings \ - node_modules/mozjpeg/rdswitch.c \ - -x c++ -std=c++11 \ + -std=c++11 \ mozjpeg_enc.cpp \ - node_modules/mozjpeg/.libs/libjpeg.a + node_modules/mozjpeg/.libs/libjpeg.a \ + node_modules/mozjpeg/rdswitch.o ) echo "=============================================" echo "Compiling wasm bindings done" diff --git a/codecs/mozjpeg_enc/mozjpeg_enc.cpp b/codecs/mozjpeg_enc/mozjpeg_enc.cpp index a2a31db5..19615252 100644 --- a/codecs/mozjpeg_enc/mozjpeg_enc.cpp +++ b/codecs/mozjpeg_enc/mozjpeg_enc.cpp @@ -7,7 +7,10 @@ #include #include "config.h" #include "jpeglib.h" + +extern "C" { #include "cdjpeg.h" +} using namespace emscripten; diff --git a/codecs/mozjpeg_enc/mozjpeg_enc.wasm b/codecs/mozjpeg_enc/mozjpeg_enc.wasm index cdabb9e0bfd0a385f27c57dd880421c8f61e01c9..c41ae62a9d7ae2d398edb57c6c11f3cb666498f4 100644 GIT binary patch delta 5817 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 E-%?!EdH?_b delta 5868 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 diff --git a/codecs/mozjpeg_enc/package.json b/codecs/mozjpeg_enc/package.json index 67ab47dc..3ef467fd 100644 --- a/codecs/mozjpeg_enc/package.json +++ b/codecs/mozjpeg_enc/package.json @@ -2,7 +2,7 @@ "name": "mozjpeg_enc", "scripts": { "install": "napa", - "build": "docker run --rm -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" + "build": "docker run -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" }, "napa": { "mozjpeg": "mozilla/mozjpeg#v3.3.1" diff --git a/codecs/oxipng/package.json b/codecs/oxipng/package.json index 391c50cf..a8214274 100644 --- a/codecs/oxipng/package.json +++ b/codecs/oxipng/package.json @@ -2,6 +2,6 @@ "name": "oxipng", "scripts": { "build:image": "docker build -t squoosh-oxipng .", - "build": "docker run --rm -v $(pwd):/src squoosh-oxipng ./build.sh" + "build": "docker run -v $(pwd):/src squoosh-oxipng ./build.sh" } } diff --git a/codecs/resize/package.json b/codecs/resize/package.json index 439f4262..f0d0e462 100644 --- a/codecs/resize/package.json +++ b/codecs/resize/package.json @@ -2,6 +2,6 @@ "name": "resize", "scripts": { "build:image": "docker build -t squoosh-resize .", - "build": "docker run --rm -v $(pwd):/src squoosh-resize ./build.sh" + "build": "docker run -v $(pwd):/src squoosh-resize ./build.sh" } } diff --git a/codecs/rotate/package.json b/codecs/rotate/package.json index add6a95a..5ce6f41e 100644 --- a/codecs/rotate/package.json +++ b/codecs/rotate/package.json @@ -2,7 +2,7 @@ "name": "rotate", "scripts": { "build:image": "docker build -t squoosh-rotate .", - "build": "docker run --rm -v $(pwd):/src squoosh-rotate ./build.sh", + "build": "docker run -v $(pwd):/src squoosh-rotate ./build.sh", "benchmark": "echo File size after gzip && npm run benchmark:filesize && echo Optimizing && npm run -s benchmark:optimizing", "benchmark:baseline": "v8 --liftoff --no-wasm-tier-up --no-opt ./benchmark.js", "benchmark:optimizing": "v8 --no-liftoff --no-wasm-tier-up ./benchmark.js", diff --git a/codecs/webp_dec/build.sh b/codecs/webp_dec/build.sh index e17d29c9..a85a3a64 100755 --- a/codecs/webp_dec/build.sh +++ b/codecs/webp_dec/build.sh @@ -14,10 +14,8 @@ echo "Compiling libwebp" echo "=============================================" test -n "$SKIP_LIBWEBP" || ( cd node_modules/libwebp - autoreconf -fiv - rm -rf build || true - mkdir -p build && cd build - emconfigure ../configure \ + autoreconf -iv + emconfigure ./configure -C \ --disable-libwebpdemux \ --disable-wic \ --disable-gif \ @@ -44,12 +42,10 @@ echo "=============================================" -s ALLOW_MEMORY_GROWTH=1 \ -s MODULARIZE=1 \ -s 'EXPORT_NAME="webp_dec"' \ - --std=c++11 \ -I node_modules/libwebp \ -o ./webp_dec.js \ - -x c++ \ webp_dec.cpp \ - node_modules/libwebp/build/src/.libs/libwebp.a + node_modules/libwebp/src/.libs/libwebp.a ) echo "=============================================" echo "Compiling wasm bindings done" diff --git a/codecs/webp_dec/package.json b/codecs/webp_dec/package.json index 53abd454..dcd40203 100644 --- a/codecs/webp_dec/package.json +++ b/codecs/webp_dec/package.json @@ -2,7 +2,7 @@ "name": "webp_dec", "scripts": { "install": "napa", - "build": "docker run --rm -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" + "build": "docker run -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" }, "napa": { "libwebp": "webmproject/libwebp#v1.0.2" diff --git a/codecs/webp_enc/build.sh b/codecs/webp_enc/build.sh index 4fa61ee1..e81c44bc 100755 --- a/codecs/webp_enc/build.sh +++ b/codecs/webp_enc/build.sh @@ -15,10 +15,8 @@ echo "Compiling libwebp" echo "=============================================" test -n "$SKIP_LIBWEBP" || ( cd node_modules/libwebp - autoreconf -fiv - rm -rf build || true - mkdir -p build && cd build - emconfigure ../configure \ + autoreconf -iv + emconfigure ./configure -C \ --disable-libwebpdemux \ --disable-wic \ --disable-gif \ @@ -45,12 +43,10 @@ echo "=============================================" -s ALLOW_MEMORY_GROWTH=1 \ -s MODULARIZE=1 \ -s 'EXPORT_NAME="webp_enc"' \ - --std=c++11 \ -I node_modules/libwebp \ -o ./webp_enc.js \ - -x c++ \ webp_enc.cpp \ - node_modules/libwebp/build/src/.libs/libwebp.a + node_modules/libwebp/src/.libs/libwebp.a ) echo "=============================================" echo "Compiling wasm bindings done" diff --git a/codecs/webp_enc/package.json b/codecs/webp_enc/package.json index 406979a3..9ba163eb 100644 --- a/codecs/webp_enc/package.json +++ b/codecs/webp_enc/package.json @@ -2,7 +2,7 @@ "name": "webp_enc", "scripts": { "install": "napa", - "build": "docker run --rm -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" + "build": "docker run -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" }, "napa": { "libwebp": "webmproject/libwebp#v1.0.2" From de543b32062adb1e70c4809a9a8c51ce0ee7575a Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Mon, 11 May 2020 22:19:28 +0100 Subject: [PATCH 06/26] Further speed improvements - Store Emscripten cache inside node_modules/.em_cache. Docker image ships without LTO libs, so Emscripten has to rebuild stdlibs on every build otherwise. - Merge webp_enc + webp_dec build scripts. Core libwebp library is same in both cases, so there's no point in storing and building two copies of it. --- codecs/imagequant/build.sh | 1 + codecs/mozjpeg_enc/build.sh | 1 + codecs/{webp_dec => webp}/build.sh | 18 +- codecs/{webp_dec => webp/dec}/README.md | 0 codecs/{webp_dec => webp/dec}/example.html | 2 +- codecs/{webp_dec => webp/dec}/webp_dec.cpp | 0 codecs/{webp_dec => webp/dec}/webp_dec.d.ts | 0 codecs/{webp_dec => webp/dec}/webp_dec.js | 0 codecs/{webp_dec => webp/dec}/webp_dec.wasm | Bin codecs/{webp_enc => webp/enc}/README.md | 0 codecs/{webp_enc => webp/enc}/example.html | 2 +- codecs/{webp_enc => webp/enc}/webp_enc.cpp | 0 codecs/{webp_enc => webp/enc}/webp_enc.d.ts | 0 codecs/{webp_enc => webp/enc}/webp_enc.js | 0 codecs/{webp_enc => webp/enc}/webp_enc.wasm | Bin codecs/{webp_enc => webp}/package-lock.json | 2 +- codecs/{webp_enc => webp}/package.json | 2 +- codecs/webp_dec/package-lock.json | 1147 ------------------- codecs/webp_dec/package.json | 13 - codecs/webp_enc/build.sh | 58 - src/codecs/webp/decoder.ts | 4 +- src/codecs/webp/encoder.ts | 4 +- 22 files changed, 26 insertions(+), 1228 deletions(-) rename codecs/{webp_dec => webp}/build.sh (79%) mode change 100755 => 100644 rename codecs/{webp_dec => webp/dec}/README.md (100%) rename codecs/{webp_dec => webp/dec}/example.html (92%) rename codecs/{webp_dec => webp/dec}/webp_dec.cpp (100%) rename codecs/{webp_dec => webp/dec}/webp_dec.d.ts (100%) rename codecs/{webp_dec => webp/dec}/webp_dec.js (100%) rename codecs/{webp_dec => webp/dec}/webp_dec.wasm (100%) rename codecs/{webp_enc => webp/enc}/README.md (100%) rename codecs/{webp_enc => webp/enc}/example.html (96%) rename codecs/{webp_enc => webp/enc}/webp_enc.cpp (100%) rename codecs/{webp_enc => webp/enc}/webp_enc.d.ts (100%) rename codecs/{webp_enc => webp/enc}/webp_enc.js (100%) rename codecs/{webp_enc => webp/enc}/webp_enc.wasm (100%) rename codecs/{webp_enc => webp}/package-lock.json (99%) rename codecs/{webp_enc => webp}/package.json (91%) delete mode 100644 codecs/webp_dec/package-lock.json delete mode 100644 codecs/webp_dec/package.json delete mode 100755 codecs/webp_enc/build.sh diff --git a/codecs/imagequant/build.sh b/codecs/imagequant/build.sh index eb85850e..3b8020a1 100755 --- a/codecs/imagequant/build.sh +++ b/codecs/imagequant/build.sh @@ -2,6 +2,7 @@ set -e +export EM_CACHE="${PWD}/node_modules/.em_cache" export OPTIMIZE="-Os -flto --llvm-lto 1" export LDFLAGS="${OPTIMIZE}" export CFLAGS="${OPTIMIZE}" diff --git a/codecs/mozjpeg_enc/build.sh b/codecs/mozjpeg_enc/build.sh index 22cb7b21..8a92649a 100755 --- a/codecs/mozjpeg_enc/build.sh +++ b/codecs/mozjpeg_enc/build.sh @@ -2,6 +2,7 @@ set -e +export EM_CACHE="${PWD}/node_modules/.em_cache" export OPTIMIZE="-Os -flto --llvm-lto 1" export LDFLAGS="${OPTIMIZE}" export CFLAGS="${OPTIMIZE}" diff --git a/codecs/webp_dec/build.sh b/codecs/webp/build.sh old mode 100755 new mode 100644 similarity index 79% rename from codecs/webp_dec/build.sh rename to codecs/webp/build.sh index a85a3a64..c6544a41 --- a/codecs/webp_dec/build.sh +++ b/codecs/webp/build.sh @@ -2,6 +2,7 @@ set -e +export EM_CACHE="${PWD}/node_modules/.em_cache" export OPTIMIZE="-Os -flto --llvm-lto 1" export LDFLAGS="${OPTIMIZE}" export CFLAGS="${OPTIMIZE}" @@ -43,8 +44,21 @@ echo "=============================================" -s MODULARIZE=1 \ -s 'EXPORT_NAME="webp_dec"' \ -I node_modules/libwebp \ - -o ./webp_dec.js \ - webp_dec.cpp \ + -o dec/webp_dec.js \ + dec/webp_dec.cpp \ + node_modules/libwebp/src/.libs/libwebp.a +) +( + emcc \ + ${OPTIMIZE} \ + --closure 1 \ + --bind \ + -s ALLOW_MEMORY_GROWTH=1 \ + -s MODULARIZE=1 \ + -s 'EXPORT_NAME="webp_enc"' \ + -I node_modules/libwebp \ + -o enc/webp_enc.js \ + enc/webp_enc.cpp \ node_modules/libwebp/src/.libs/libwebp.a ) echo "=============================================" diff --git a/codecs/webp_dec/README.md b/codecs/webp/dec/README.md similarity index 100% rename from codecs/webp_dec/README.md rename to codecs/webp/dec/README.md diff --git a/codecs/webp_dec/example.html b/codecs/webp/dec/example.html similarity index 92% rename from codecs/webp_dec/example.html rename to codecs/webp/dec/example.html index 3f971ca7..26ee2527 100644 --- a/codecs/webp_dec/example.html +++ b/codecs/webp/dec/example.html @@ -10,7 +10,7 @@ Module.onRuntimeInitialized = async _ => { console.log('Version:', Module.version().toString(16)); - const image = await loadFile('../example.webp'); + const image = await loadFile('../../example.webp'); const result = Module.decode(image); const imageData = new ImageData(new Uint8ClampedArray(result.buffer), result.width, result.height); Module.free_result(); diff --git a/codecs/webp_dec/webp_dec.cpp b/codecs/webp/dec/webp_dec.cpp similarity index 100% rename from codecs/webp_dec/webp_dec.cpp rename to codecs/webp/dec/webp_dec.cpp diff --git a/codecs/webp_dec/webp_dec.d.ts b/codecs/webp/dec/webp_dec.d.ts similarity index 100% rename from codecs/webp_dec/webp_dec.d.ts rename to codecs/webp/dec/webp_dec.d.ts diff --git a/codecs/webp_dec/webp_dec.js b/codecs/webp/dec/webp_dec.js similarity index 100% rename from codecs/webp_dec/webp_dec.js rename to codecs/webp/dec/webp_dec.js diff --git a/codecs/webp_dec/webp_dec.wasm b/codecs/webp/dec/webp_dec.wasm similarity index 100% rename from codecs/webp_dec/webp_dec.wasm rename to codecs/webp/dec/webp_dec.wasm diff --git a/codecs/webp_enc/README.md b/codecs/webp/enc/README.md similarity index 100% rename from codecs/webp_enc/README.md rename to codecs/webp/enc/README.md diff --git a/codecs/webp_enc/example.html b/codecs/webp/enc/example.html similarity index 96% rename from codecs/webp_enc/example.html rename to codecs/webp/enc/example.html index 89cb7825..7ee96d78 100644 --- a/codecs/webp_enc/example.html +++ b/codecs/webp/enc/example.html @@ -19,7 +19,7 @@ module.onRuntimeInitialized = async _ => { console.log('Version:', module.version().toString(16)); - const image = await loadImage('../example.png'); + const image = await loadImage('../../example.png'); const result = module.encode(image.data, image.width, image.height, { quality: 75, target_size: 0, diff --git a/codecs/webp_enc/webp_enc.cpp b/codecs/webp/enc/webp_enc.cpp similarity index 100% rename from codecs/webp_enc/webp_enc.cpp rename to codecs/webp/enc/webp_enc.cpp diff --git a/codecs/webp_enc/webp_enc.d.ts b/codecs/webp/enc/webp_enc.d.ts similarity index 100% rename from codecs/webp_enc/webp_enc.d.ts rename to codecs/webp/enc/webp_enc.d.ts diff --git a/codecs/webp_enc/webp_enc.js b/codecs/webp/enc/webp_enc.js similarity index 100% rename from codecs/webp_enc/webp_enc.js rename to codecs/webp/enc/webp_enc.js diff --git a/codecs/webp_enc/webp_enc.wasm b/codecs/webp/enc/webp_enc.wasm similarity index 100% rename from codecs/webp_enc/webp_enc.wasm rename to codecs/webp/enc/webp_enc.wasm diff --git a/codecs/webp_enc/package-lock.json b/codecs/webp/package-lock.json similarity index 99% rename from codecs/webp_enc/package-lock.json rename to codecs/webp/package-lock.json index fa5ccbd9..1e8652cf 100644 --- a/codecs/webp_enc/package-lock.json +++ b/codecs/webp/package-lock.json @@ -1,5 +1,5 @@ { - "name": "webp_enc", + "name": "webp", "requires": true, "lockfileVersion": 1, "dependencies": { diff --git a/codecs/webp_enc/package.json b/codecs/webp/package.json similarity index 91% rename from codecs/webp_enc/package.json rename to codecs/webp/package.json index 9ba163eb..4fc83135 100644 --- a/codecs/webp_enc/package.json +++ b/codecs/webp/package.json @@ -1,5 +1,5 @@ { - "name": "webp_enc", + "name": "webp", "scripts": { "install": "napa", "build": "docker run -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" diff --git a/codecs/webp_dec/package-lock.json b/codecs/webp_dec/package-lock.json deleted file mode 100644 index 39878f31..00000000 --- a/codecs/webp_dec/package-lock.json +++ /dev/null @@ -1,1147 +0,0 @@ -{ - "name": "webp_dec", - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", - "dev": true - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "dev": true, - "requires": { - "base64-js": "0.0.8", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "caw": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", - "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", - "dev": true, - "requires": { - "get-proxy": "^2.0.0", - "isurl": "^1.0.0-alpha5", - "tunnel-agent": "^0.6.0", - "url-to-options": "^1.0.1" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "dev": true, - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "download": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", - "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", - "dev": true, - "requires": { - "caw": "^2.0.0", - "content-disposition": "^0.5.2", - "decompress": "^4.0.0", - "ext-name": "^5.0.0", - "file-type": "5.2.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^7.0.0", - "make-dir": "^1.0.0", - "p-event": "^1.0.0", - "pify": "^3.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "ext-list": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", - "dev": true, - "requires": { - "mime-db": "^1.28.0" - } - }, - "ext-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", - "dev": true, - "requires": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", - "dev": true - }, - "filenamify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.0.0.tgz", - "integrity": "sha1-vRYiYsC26Uv7zc8Zo7uzdk94VpU=", - "dev": true, - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "get-proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", - "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", - "dev": true, - "requires": { - "npm-conf": "^1.1.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", - "dev": true - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true - }, - "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mimic-response": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "napa": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/napa/-/napa-3.0.0.tgz", - "integrity": "sha1-7DqP3gcZC2ny/kNMOVo+aUaEG1Y=", - "dev": true, - "requires": { - "download": "^6.2.2", - "extend": "^3.0.1", - "load-json-file": "^2.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "npm-cache-filename": "^1.0.2", - "npmlog": "^4.1.0", - "rimraf": "^2.6.1", - "tar-pack": "^3.4.0", - "write-json-file": "^2.2.0" - } - }, - "npm-cache-filename": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz", - "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=", - "dev": true - }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "p-event": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", - "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", - "dev": true, - "requires": { - "p-timeout": "^1.1.1" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "dev": true, - "requires": { - "commander": "~2.8.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "sort-keys-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", - "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", - "dev": true, - "requires": { - "sort-keys": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, - "requires": { - "is-natural-number": "^4.0.1" - } - }, - "strip-outer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz", - "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", - "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", - "dev": true, - "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" - } - }, - "tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "dev": true - }, - "unbzip2-stream": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", - "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", - "dev": true, - "requires": { - "buffer": "^3.0.1", - "through": "^2.3.6" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" - }, - "dependencies": { - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.0.1" - } - } - } -} diff --git a/codecs/webp_dec/package.json b/codecs/webp_dec/package.json deleted file mode 100644 index dcd40203..00000000 --- a/codecs/webp_dec/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "webp_dec", - "scripts": { - "install": "napa", - "build": "docker run -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" - }, - "napa": { - "libwebp": "webmproject/libwebp#v1.0.2" - }, - "devDependencies": { - "napa": "3.0.0" - } -} diff --git a/codecs/webp_enc/build.sh b/codecs/webp_enc/build.sh deleted file mode 100755 index e81c44bc..00000000 --- a/codecs/webp_enc/build.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash - -set -e - -export OPTIMIZE="-Os -flto --llvm-lto 1" -export LDFLAGS="${OPTIMIZE}" -export CFLAGS="${OPTIMIZE}" -export CPPFLAGS="${OPTIMIZE}" - -apt-get update -apt-get install -qqy autoconf libtool pkg-config - -echo "=============================================" -echo "Compiling libwebp" -echo "=============================================" -test -n "$SKIP_LIBWEBP" || ( - cd node_modules/libwebp - autoreconf -iv - emconfigure ./configure -C \ - --disable-libwebpdemux \ - --disable-wic \ - --disable-gif \ - --disable-tiff \ - --disable-jpeg \ - --disable-png \ - --disable-sdl \ - --disable-gl \ - --disable-threading \ - --disable-neon-rtcd \ - --disable-neon \ - --disable-sse2 \ - --disable-sse4.1 - emmake make -j`nproc` -) -echo "=============================================" -echo "Compiling wasm bindings" -echo "=============================================" -( - emcc \ - ${OPTIMIZE} \ - --closure 1 \ - --bind \ - -s ALLOW_MEMORY_GROWTH=1 \ - -s MODULARIZE=1 \ - -s 'EXPORT_NAME="webp_enc"' \ - -I node_modules/libwebp \ - -o ./webp_enc.js \ - webp_enc.cpp \ - node_modules/libwebp/src/.libs/libwebp.a -) -echo "=============================================" -echo "Compiling wasm bindings done" -echo "=============================================" - -echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" -echo "Did you update your docker image?" -echo "Run \`docker pull trzeci/emscripten-upstream\`" -echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" diff --git a/src/codecs/webp/decoder.ts b/src/codecs/webp/decoder.ts index 6b25cbd2..d508f2f1 100644 --- a/src/codecs/webp/decoder.ts +++ b/src/codecs/webp/decoder.ts @@ -1,5 +1,5 @@ -import webp_dec, { WebPModule } from '../../../codecs/webp_dec/webp_dec'; -import wasmUrl from '../../../codecs/webp_dec/webp_dec.wasm'; +import webp_dec, { WebPModule } from '../../../codecs/webp/dec/webp_dec'; +import wasmUrl from '../../../codecs/webp/dec/webp_dec.wasm'; import { initEmscriptenModule } from '../util'; let emscriptenModule: Promise; diff --git a/src/codecs/webp/encoder.ts b/src/codecs/webp/encoder.ts index 5fafb577..d773c425 100644 --- a/src/codecs/webp/encoder.ts +++ b/src/codecs/webp/encoder.ts @@ -1,5 +1,5 @@ -import webp_enc, { WebPModule } from '../../../codecs/webp_enc/webp_enc'; -import wasmUrl from '../../../codecs/webp_enc/webp_enc.wasm'; +import webp_enc, { WebPModule } from '../../../codecs/webp/enc/webp_enc'; +import wasmUrl from '../../../codecs/webp/enc/webp_enc.wasm'; import { EncodeOptions } from './encoder-meta'; import { initEmscriptenModule } from '../util'; From a95cb740bfead2a0a21a9051054d98f888ff5481 Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Tue, 12 May 2020 18:36:38 +0100 Subject: [PATCH 07/26] Format C / C++ with Chromium style --- .clang-format | 2 + codecs/imagequant/imagequant.cpp | 140 ++++++++++++++--------------- codecs/mozjpeg_enc/mozjpeg_enc.cpp | 73 ++++++++------- codecs/webp/dec/webp_dec.cpp | 19 ++-- codecs/webp/enc/webp_enc.cpp | 71 +++++++-------- 5 files changed, 149 insertions(+), 156 deletions(-) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..b0522bad --- /dev/null +++ b/.clang-format @@ -0,0 +1,2 @@ +BasedOnStyle: Chromium +ColumnLimit: 120 diff --git a/codecs/imagequant/imagequant.cpp b/codecs/imagequant/imagequant.cpp index 7684f6ea..9fa9defe 100644 --- a/codecs/imagequant/imagequant.cpp +++ b/codecs/imagequant/imagequant.cpp @@ -1,36 +1,37 @@ -#include "emscripten/bind.h" -#include "emscripten/val.h" -#include +#include +#include #include #include #include +#include #include "libimagequant.h" using namespace emscripten; int version() { - return (((LIQ_VERSION/10000) % 100) << 16) | - (((LIQ_VERSION/100 ) % 100) << 8) | - (((LIQ_VERSION/1 ) % 100) << 0); + return (((LIQ_VERSION / 10000) % 100) << 16) | (((LIQ_VERSION / 100) % 100) << 8) | + (((LIQ_VERSION / 1) % 100) << 0); } class RawImage { -public: + public: val buffer; int width; int height; - RawImage(val b, int w, int h) - : buffer(b), width(w), height(h) {} + RawImage(val b, int w, int h) : buffer(b), width(w), height(h) {} }; - -liq_attr *attr; -liq_image *image; -liq_result *res; +liq_attr* attr; +liq_image* image; +liq_result* res; uint8_t* result; -RawImage quantize(std::string rawimage, int image_width, int image_height, int num_colors, float dithering) { +RawImage quantize(std::string rawimage, + int image_width, + int image_height, + int num_colors, + float dithering) { const uint8_t* image_buffer = (uint8_t*)rawimage.c_str(); int size = image_width * image_height; attr = liq_attr_create(); @@ -38,12 +39,12 @@ RawImage quantize(std::string rawimage, int image_width, int image_height, int n liq_set_max_colors(attr, num_colors); liq_image_quantize(image, attr, &res); liq_set_dithering_level(res, dithering); - uint8_t* image8bit = (uint8_t*) malloc(size); - result = (uint8_t*) malloc(size * 4); + uint8_t* image8bit = (uint8_t*)malloc(size); + result = (uint8_t*)malloc(size * 4); liq_write_remapped_image(res, image, image8bit, size); - const liq_palette *pal = liq_get_palette(res); + const liq_palette* pal = liq_get_palette(res); // Turn palletted image back into an RGBA image - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { result[i * 4 + 0] = pal->entries[image8bit[i]].r; result[i * 4 + 1] = pal->entries[image8bit[i]].g; result[i * 4 + 2] = pal->entries[image8bit[i]].b; @@ -53,43 +54,41 @@ RawImage quantize(std::string rawimage, int image_width, int image_height, int n liq_result_destroy(res); liq_image_destroy(image); liq_attr_destroy(attr); - return { - val(typed_memory_view(image_width*image_height*4, result)), - image_width, - image_height - }; + return {val(typed_memory_view(image_width * image_height * 4, result)), image_width, + image_height}; } const liq_color zx_colors[] = { - {.r = 0, .g = 0, .b = 0, .a = 255}, // regular black - {.r = 0, .g = 0, .b = 215, .a = 255}, // regular blue - {.r = 215, .g = 0, .b = 0, .a = 255}, // regular red - {.r = 215, .g = 0, .b = 215, .a = 255}, // regular magenta - {.r = 0, .g = 215, .b = 0, .a = 255}, // regular green - {.r = 0, .g = 215, .b = 215, .a = 255}, // regular cyan - {.r = 215, .g = 215, .b = 0, .a = 255}, // regular yellow - {.r = 215, .g = 215, .b = 215, .a = 255}, // regular white - {.r = 0, .g = 0, .b = 255, .a = 255}, // bright blue - {.r = 255, .g = 0, .b = 0, .a = 255}, // bright red - {.r = 255, .g = 0, .b = 255, .a = 255}, // bright magenta - {.r = 0, .g = 255, .b = 0, .a = 255}, // bright green - {.r = 0, .g = 255, .b = 255, .a = 255}, // bright cyan - {.r = 255, .g = 255, .b = 0, .a = 255}, // bright yellow - {.r = 255, .g = 255, .b = 255, .a = 255} // bright white + {.r = 0, .g = 0, .b = 0, .a = 255}, // regular black + {.r = 0, .g = 0, .b = 215, .a = 255}, // regular blue + {.r = 215, .g = 0, .b = 0, .a = 255}, // regular red + {.r = 215, .g = 0, .b = 215, .a = 255}, // regular magenta + {.r = 0, .g = 215, .b = 0, .a = 255}, // regular green + {.r = 0, .g = 215, .b = 215, .a = 255}, // regular cyan + {.r = 215, .g = 215, .b = 0, .a = 255}, // regular yellow + {.r = 215, .g = 215, .b = 215, .a = 255}, // regular white + {.r = 0, .g = 0, .b = 255, .a = 255}, // bright blue + {.r = 255, .g = 0, .b = 0, .a = 255}, // bright red + {.r = 255, .g = 0, .b = 255, .a = 255}, // bright magenta + {.r = 0, .g = 255, .b = 0, .a = 255}, // bright green + {.r = 0, .g = 255, .b = 255, .a = 255}, // bright cyan + {.r = 255, .g = 255, .b = 0, .a = 255}, // bright yellow + {.r = 255, .g = 255, .b = 255, .a = 255} // bright white }; uint8_t block[8 * 8 * 4]; /** - * The ZX has one bit per pixel, but can assign two colours to an 8x8 block. The two colours must - * both be 'regular' or 'bright'. Black exists as both regular and bright. + * The ZX has one bit per pixel, but can assign two colours to an 8x8 block. The + * two colours must both be 'regular' or 'bright'. Black exists as both regular + * and bright. */ RawImage zx_quantize(std::string rawimage, int image_width, int image_height, float dithering) { - const uint8_t* image_buffer = (uint8_t*) rawimage.c_str(); + const uint8_t* image_buffer = (uint8_t*)rawimage.c_str(); int size = image_width * image_height; int bytes_per_pixel = 4; - result = (uint8_t*) malloc(size * bytes_per_pixel); - uint8_t* image8bit = (uint8_t*) malloc(8 * 8); + result = (uint8_t*)malloc(size * bytes_per_pixel); + uint8_t* image8bit = (uint8_t*)malloc(8 * 8); // For each 8x8 grid for (int block_start_y = 0; block_start_y < image_height; block_start_y += 8) { @@ -99,7 +98,8 @@ RawImage zx_quantize(std::string rawimage, int image_width, int image_height, fl int block_width = 8; int block_height = 8; - // If the block hangs off the right/bottom of the image dimensions, make it smaller to fit. + // If the block hangs off the right/bottom of the image dimensions, make + // it smaller to fit. if (block_start_y + block_height > image_height) { block_height = image_height - block_start_y; } @@ -125,12 +125,11 @@ RawImage zx_quantize(std::string rawimage, int image_width, int image_height, fl for (int color_index = 0; color_index < 15; color_index++) { liq_color color = zx_colors[color_index]; - // Using Euclidean distance. LibQuant has better methods, but it requires conversion to - // LAB, so I don't think it's worth it. - int distance = - pow(color.r - image_buffer[pixel_start + 0], 2) + - pow(color.g - image_buffer[pixel_start + 1], 2) + - pow(color.b - image_buffer[pixel_start + 2], 2); + // Using Euclidean distance. LibQuant has better methods, but it + // requires conversion to LAB, so I don't think it's worth it. + int distance = pow(color.r - image_buffer[pixel_start + 0], 2) + + pow(color.g - image_buffer[pixel_start + 1], 2) + + pow(color.b - image_buffer[pixel_start + 2], 2); if (distance < smallest_distance) { winning_index = color_index; @@ -151,7 +150,8 @@ RawImage zx_quantize(std::string rawimage, int image_width, int image_height, fl for (int color_index = 0; color_index < 15; color_index++) { if (color_popularity[color_index] > highest_popularity) { - // Store this as the most popular pixel, and demote the current values: + // Store this as the most popular pixel, and demote the current + // values: third_color_index = second_color_index; third_highest_popularity = second_highest_popularity; second_color_index = first_color_index; @@ -169,8 +169,8 @@ RawImage zx_quantize(std::string rawimage, int image_width, int image_height, fl } } - // ZX images can't mix bright and regular colours, except black which appears in both. - // Resolve any conflict: + // ZX images can't mix bright and regular colours, except black which + // appears in both. Resolve any conflict: while (1) { // If either colour is black, there's no conflict to resolve. if (first_color_index != 0 && second_color_index != 0) { @@ -183,12 +183,13 @@ RawImage zx_quantize(std::string rawimage, int image_width, int image_height, fl } } - // If, during conflict resolving, we now have two of the same colour (because we initially - // selected the bright & regular version of the same colour), retry again with the third - // most popular colour. + // If, during conflict resolving, we now have two of the same colour + // (because we initially selected the bright & regular version of the + // same colour), retry again with the third most popular colour. if (first_color_index == second_color_index) { second_color_index = third_color_index; - } else break; + } else + break; } // Quantize @@ -200,13 +201,15 @@ RawImage zx_quantize(std::string rawimage, int image_width, int image_height, fl liq_image_quantize(image, attr, &res); liq_set_dithering_level(res, dithering); liq_write_remapped_image(res, image, image8bit, size); - const liq_palette *pal = liq_get_palette(res); + const liq_palette* pal = liq_get_palette(res); - // Turn palletted image back into an RGBA image, and write it into the full size result image. - for(int y = 0; y < block_height; y++) { - for(int x = 0; x < block_width; x++) { + // Turn palletted image back into an RGBA image, and write it into the + // full size result image. + for (int y = 0; y < block_height; y++) { + for (int x = 0; x < block_width; x++) { int image8BitPos = y * block_width + x; - int resultStartPos = ((block_start_y + y) * bytes_per_pixel * image_width) + ((block_start_x + x) * bytes_per_pixel); + int resultStartPos = ((block_start_y + y) * bytes_per_pixel * image_width) + + ((block_start_x + x) * bytes_per_pixel); result[resultStartPos + 0] = pal->entries[image8bit[image8BitPos]].r; result[resultStartPos + 1] = pal->entries[image8bit[image8BitPos]].g; result[resultStartPos + 2] = pal->entries[image8bit[image8BitPos]].b; @@ -221,11 +224,8 @@ RawImage zx_quantize(std::string rawimage, int image_width, int image_height, fl } free(image8bit); - return { - val(typed_memory_view(image_width*image_height*4, result)), - image_width, - image_height - }; + return {val(typed_memory_view(image_width * image_height * 4, result)), image_width, + image_height}; } void free_result() { @@ -234,9 +234,9 @@ void free_result() { EMSCRIPTEN_BINDINGS(my_module) { class_("RawImage") - .property("buffer", &RawImage::buffer) - .property("width", &RawImage::width) - .property("height", &RawImage::height); + .property("buffer", &RawImage::buffer) + .property("width", &RawImage::width) + .property("height", &RawImage::height); function("quantize", &quantize); function("zx_quantize", &zx_quantize); diff --git a/codecs/mozjpeg_enc/mozjpeg_enc.cpp b/codecs/mozjpeg_enc/mozjpeg_enc.cpp index 19615252..ae368c15 100644 --- a/codecs/mozjpeg_enc/mozjpeg_enc.cpp +++ b/codecs/mozjpeg_enc/mozjpeg_enc.cpp @@ -1,9 +1,9 @@ #include #include -#include #include -#include #include +#include +#include #include #include "config.h" #include "jpeglib.h" @@ -14,8 +14,9 @@ extern "C" { using namespace emscripten; -// MozJPEG doesn’t expose a numeric version, so I have to do some fun C macro hackery to turn it -// into a string. More details here: https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html +// MozJPEG doesn’t expose a numeric version, so I have to do some fun C macro +// hackery to turn it into a string. More details here: +// https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html #define xstr(s) str(s) #define str(s) #s @@ -42,8 +43,8 @@ int version() { char buffer[] = xstr(MOZJPEG_VERSION); int version = 0; int last_index = 0; - for(int i = 0; i < strlen(buffer); i++) { - if(buffer[i] == '.') { + for (int i = 0; i < strlen(buffer); i++) { + if (buffer[i] == '.') { buffer[i] = '\0'; version = version << 8 | atoi(&buffer[last_index]); buffer[i] = '.'; @@ -58,13 +59,12 @@ uint8_t* last_result; struct jpeg_compress_struct cinfo; val encode(std::string image_in, int image_width, int image_height, MozJpegOptions opts) { - uint8_t* image_buffer = (uint8_t*) image_in.c_str(); + uint8_t* image_buffer = (uint8_t*)image_in.c_str(); // The code below is basically the `write_JPEG_file` function from // https://github.com/mozilla/mozjpeg/blob/master/example.c // I just write to memory instead of a file. - /* This struct contains the JPEG compression parameters and pointers to * working space (which is allocated as needed by the JPEG library). * It is possible to have several such structures, representing multiple @@ -81,8 +81,8 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio */ struct jpeg_error_mgr jerr; /* More stuff */ - JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ - int row_stride; /* physical row width in image buffer */ + JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ + int row_stride; /* physical row width in image buffer */ uint8_t* output; unsigned long size; @@ -116,17 +116,17 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio /* First we supply a description of the input image. * Four fields of the cinfo struct must be filled in: */ - cinfo.image_width = image_width; /* image width and height, in pixels */ + cinfo.image_width = image_width; /* image width and height, in pixels */ cinfo.image_height = image_height; - cinfo.input_components = 4; /* # of color components per pixel */ - cinfo.in_color_space = JCS_EXT_RGBA; /* colorspace of input image */ + cinfo.input_components = 4; /* # of color components per pixel */ + cinfo.in_color_space = JCS_EXT_RGBA; /* colorspace of input image */ /* Now use the library's routine to set default compression parameters. * (You must set at least cinfo.in_color_space before calling this, * since the defaults depend on the source color space.) */ jpeg_set_defaults(&cinfo); - jpeg_set_colorspace(&cinfo, (J_COLOR_SPACE) opts.color_space); + jpeg_set_colorspace(&cinfo, (J_COLOR_SPACE)opts.color_space); if (opts.quant_table != -1) { jpeg_c_set_int_param(&cinfo, JINT_BASE_QUANT_TBL_IDX, opts.quant_table); @@ -146,17 +146,17 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio jpeg_c_set_bool_param(&cinfo, JBOOLEAN_TRELLIS_Q_OPT, opts.trellis_opt_table); jpeg_c_set_int_param(&cinfo, JINT_TRELLIS_NUM_LOOPS, opts.trellis_loops); - // A little hacky to build a string for this, but it means we can use set_quality_ratings which - // does some useful heuristic stuff. + // A little hacky to build a string for this, but it means we can use + // set_quality_ratings which does some useful heuristic stuff. std::string quality_str = std::to_string(opts.quality); if (opts.separate_chroma_quality && opts.color_space == JCS_YCbCr) { quality_str += "," + std::to_string(opts.chroma_quality); } - char const *pqual = quality_str.c_str(); + char const* pqual = quality_str.c_str(); - set_quality_ratings(&cinfo, (char*) pqual, opts.baseline); + set_quality_ratings(&cinfo, (char*)pqual, opts.baseline); if (!opts.auto_subsample && opts.color_space == JCS_YCbCr) { cinfo.comp_info[0].h_samp_factor = opts.chroma_subsample; @@ -191,8 +191,8 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio * Here the array is only one element long, but you could pass * more than one scanline at a time if that's more convenient. */ - row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; - (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); + row_pointer[0] = &image_buffer[cinfo.next_scanline * row_stride]; + (void)jpeg_write_scanlines(&cinfo, row_pointer, 1); } /* Step 6: Finish compression */ @@ -213,23 +213,22 @@ void free_result() { EMSCRIPTEN_BINDINGS(my_module) { value_object("MozJpegOptions") - .field("quality", &MozJpegOptions::quality) - .field("baseline", &MozJpegOptions::baseline) - .field("arithmetic", &MozJpegOptions::arithmetic) - .field("progressive", &MozJpegOptions::progressive) - .field("optimize_coding", &MozJpegOptions::optimize_coding) - .field("smoothing", &MozJpegOptions::smoothing) - .field("color_space", &MozJpegOptions::color_space) - .field("quant_table", &MozJpegOptions::quant_table) - .field("trellis_multipass", &MozJpegOptions::trellis_multipass) - .field("trellis_opt_zero", &MozJpegOptions::trellis_opt_zero) - .field("trellis_opt_table", &MozJpegOptions::trellis_opt_table) - .field("trellis_loops", &MozJpegOptions::trellis_loops) - .field("chroma_subsample", &MozJpegOptions::chroma_subsample) - .field("auto_subsample", &MozJpegOptions::auto_subsample) - .field("separate_chroma_quality", &MozJpegOptions::separate_chroma_quality) - .field("chroma_quality", &MozJpegOptions::chroma_quality) - ; + .field("quality", &MozJpegOptions::quality) + .field("baseline", &MozJpegOptions::baseline) + .field("arithmetic", &MozJpegOptions::arithmetic) + .field("progressive", &MozJpegOptions::progressive) + .field("optimize_coding", &MozJpegOptions::optimize_coding) + .field("smoothing", &MozJpegOptions::smoothing) + .field("color_space", &MozJpegOptions::color_space) + .field("quant_table", &MozJpegOptions::quant_table) + .field("trellis_multipass", &MozJpegOptions::trellis_multipass) + .field("trellis_opt_zero", &MozJpegOptions::trellis_opt_zero) + .field("trellis_opt_table", &MozJpegOptions::trellis_opt_table) + .field("trellis_loops", &MozJpegOptions::trellis_loops) + .field("chroma_subsample", &MozJpegOptions::chroma_subsample) + .field("auto_subsample", &MozJpegOptions::auto_subsample) + .field("separate_chroma_quality", &MozJpegOptions::separate_chroma_quality) + .field("chroma_quality", &MozJpegOptions::chroma_quality); function("version", &version); function("encode", &encode); diff --git a/codecs/webp/dec/webp_dec.cpp b/codecs/webp/dec/webp_dec.cpp index 1edff9ac..969338d5 100644 --- a/codecs/webp/dec/webp_dec.cpp +++ b/codecs/webp/dec/webp_dec.cpp @@ -1,8 +1,8 @@ +#include #include "emscripten/bind.h" #include "emscripten/val.h" #include "src/webp/decode.h" #include "src/webp/demux.h" -#include using namespace emscripten; @@ -11,24 +11,19 @@ int version() { } class RawImage { -public: + public: val buffer; int width; int height; - RawImage(val b, int w, int h) - : buffer(b), width(w), height(h) {} + RawImage(val b, int w, int h) : buffer(b), width(w), height(h) {} }; uint8_t* last_result; RawImage decode(std::string buffer) { int width, height; last_result = WebPDecodeRGBA((const uint8_t*)buffer.c_str(), buffer.size(), &width, &height); - return RawImage( - val(typed_memory_view(width*height*4, last_result)), - width, - height - ); + return RawImage(val(typed_memory_view(width * height * 4, last_result)), width, height); } void free_result() { @@ -37,9 +32,9 @@ void free_result() { EMSCRIPTEN_BINDINGS(my_module) { class_("RawImage") - .property("buffer", &RawImage::buffer) - .property("width", &RawImage::width) - .property("height", &RawImage::height); + .property("buffer", &RawImage::buffer) + .property("width", &RawImage::width) + .property("height", &RawImage::height); function("decode", &decode); function("version", &version); diff --git a/codecs/webp/enc/webp_enc.cpp b/codecs/webp/enc/webp_enc.cpp index 3f22badc..0cc4afef 100644 --- a/codecs/webp/enc/webp_enc.cpp +++ b/codecs/webp/enc/webp_enc.cpp @@ -1,9 +1,9 @@ #include #include -#include "src/webp/encode.h" #include #include #include +#include "src/webp/encode.h" using namespace emscripten; @@ -14,7 +14,7 @@ int version() { uint8_t* last_result; val encode(std::string img, int width, int height, WebPConfig config) { - uint8_t* img_in = (uint8_t*) img.c_str(); + uint8_t* img_in = (uint8_t*)img.c_str(); // A lot of this is duplicated from Encode in picture_enc.c WebPPicture pic; @@ -35,7 +35,7 @@ val encode(std::string img, int width, int height, WebPConfig config) { WebPMemoryWriterInit(&wrt); - ok = WebPPictureImportRGBA(&pic, (uint8_t*) img_in, width * 4) && WebPEncode(&config, &pic); + ok = WebPPictureImportRGBA(&pic, (uint8_t*)img_in, width * 4) && WebPEncode(&config, &pic); WebPPictureFree(&pic); if (!ok) { WebPMemoryWriterClear(&wrt); @@ -51,44 +51,41 @@ void free_result() { WebPFree(last_result); } - EMSCRIPTEN_BINDINGS(my_module) { enum_("WebPImageHint") - .value("WEBP_HINT_DEFAULT", WebPImageHint::WEBP_HINT_DEFAULT) - .value("WEBP_HINT_PICTURE", WebPImageHint::WEBP_HINT_PICTURE) - .value("WEBP_HINT_PHOTO", WebPImageHint::WEBP_HINT_PHOTO) - .value("WEBP_HINT_GRAPH", WebPImageHint::WEBP_HINT_GRAPH) - ; + .value("WEBP_HINT_DEFAULT", WebPImageHint::WEBP_HINT_DEFAULT) + .value("WEBP_HINT_PICTURE", WebPImageHint::WEBP_HINT_PICTURE) + .value("WEBP_HINT_PHOTO", WebPImageHint::WEBP_HINT_PHOTO) + .value("WEBP_HINT_GRAPH", WebPImageHint::WEBP_HINT_GRAPH); value_object("WebPConfig") - .field("lossless", &WebPConfig::lossless) - .field("quality", &WebPConfig::quality) - .field("method", &WebPConfig::method) - .field("image_hint", &WebPConfig::image_hint) - .field("target_size", &WebPConfig::target_size) - .field("target_PSNR", &WebPConfig::target_PSNR) - .field("segments", &WebPConfig::segments) - .field("sns_strength", &WebPConfig::sns_strength) - .field("filter_strength", &WebPConfig::filter_strength) - .field("filter_sharpness", &WebPConfig::filter_sharpness) - .field("filter_type", &WebPConfig::filter_type) - .field("autofilter", &WebPConfig::autofilter) - .field("alpha_compression", &WebPConfig::alpha_compression) - .field("alpha_filtering", &WebPConfig::alpha_filtering) - .field("alpha_quality", &WebPConfig::alpha_quality) - .field("pass", &WebPConfig::pass) - .field("show_compressed", &WebPConfig::show_compressed) - .field("preprocessing", &WebPConfig::preprocessing) - .field("partitions", &WebPConfig::partitions) - .field("partition_limit", &WebPConfig::partition_limit) - .field("emulate_jpeg_size", &WebPConfig::emulate_jpeg_size) - .field("thread_level", &WebPConfig::thread_level) - .field("low_memory", &WebPConfig::low_memory) - .field("near_lossless", &WebPConfig::near_lossless) - .field("exact", &WebPConfig::exact) - .field("use_delta_palette", &WebPConfig::use_delta_palette) - .field("use_sharp_yuv", &WebPConfig::use_sharp_yuv) - ; + .field("lossless", &WebPConfig::lossless) + .field("quality", &WebPConfig::quality) + .field("method", &WebPConfig::method) + .field("image_hint", &WebPConfig::image_hint) + .field("target_size", &WebPConfig::target_size) + .field("target_PSNR", &WebPConfig::target_PSNR) + .field("segments", &WebPConfig::segments) + .field("sns_strength", &WebPConfig::sns_strength) + .field("filter_strength", &WebPConfig::filter_strength) + .field("filter_sharpness", &WebPConfig::filter_sharpness) + .field("filter_type", &WebPConfig::filter_type) + .field("autofilter", &WebPConfig::autofilter) + .field("alpha_compression", &WebPConfig::alpha_compression) + .field("alpha_filtering", &WebPConfig::alpha_filtering) + .field("alpha_quality", &WebPConfig::alpha_quality) + .field("pass", &WebPConfig::pass) + .field("show_compressed", &WebPConfig::show_compressed) + .field("preprocessing", &WebPConfig::preprocessing) + .field("partitions", &WebPConfig::partitions) + .field("partition_limit", &WebPConfig::partition_limit) + .field("emulate_jpeg_size", &WebPConfig::emulate_jpeg_size) + .field("thread_level", &WebPConfig::thread_level) + .field("low_memory", &WebPConfig::low_memory) + .field("near_lossless", &WebPConfig::near_lossless) + .field("exact", &WebPConfig::exact) + .field("use_delta_palette", &WebPConfig::use_delta_palette) + .field("use_sharp_yuv", &WebPConfig::use_sharp_yuv); function("version", &version); function("encode", &encode); From 1ae93b527cd1d3b46fd14119f3425839d8d51882 Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Wed, 13 May 2020 14:59:44 +0100 Subject: [PATCH 08/26] Revert `docker run --rm` change --- codecs/hqx/package.json | 2 +- codecs/imagequant/package.json | 2 +- codecs/mozjpeg_enc/package.json | 2 +- codecs/oxipng/package.json | 2 +- codecs/resize/package.json | 2 +- codecs/rotate/package.json | 2 +- codecs/webp/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/codecs/hqx/package.json b/codecs/hqx/package.json index 55123770..9c50eb01 100644 --- a/codecs/hqx/package.json +++ b/codecs/hqx/package.json @@ -2,6 +2,6 @@ "name": "hqx", "scripts": { "build:image": "docker build -t squoosh-hqx .", - "build": "docker run -v $(pwd):/src squoosh-hqx ./build.sh" + "build": "docker run --rm -v $(pwd):/src squoosh-hqx ./build.sh" } } diff --git a/codecs/imagequant/package.json b/codecs/imagequant/package.json index 01da35ff..7797faa7 100644 --- a/codecs/imagequant/package.json +++ b/codecs/imagequant/package.json @@ -2,7 +2,7 @@ "name": "imagequant", "scripts": { "install": "napa", - "build": "docker run -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" + "build": "docker run --rm -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" }, "napa": { "libimagequant": "ImageOptim/libimagequant#2.12.1" diff --git a/codecs/mozjpeg_enc/package.json b/codecs/mozjpeg_enc/package.json index 3ef467fd..67ab47dc 100644 --- a/codecs/mozjpeg_enc/package.json +++ b/codecs/mozjpeg_enc/package.json @@ -2,7 +2,7 @@ "name": "mozjpeg_enc", "scripts": { "install": "napa", - "build": "docker run -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" + "build": "docker run --rm -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" }, "napa": { "mozjpeg": "mozilla/mozjpeg#v3.3.1" diff --git a/codecs/oxipng/package.json b/codecs/oxipng/package.json index a8214274..391c50cf 100644 --- a/codecs/oxipng/package.json +++ b/codecs/oxipng/package.json @@ -2,6 +2,6 @@ "name": "oxipng", "scripts": { "build:image": "docker build -t squoosh-oxipng .", - "build": "docker run -v $(pwd):/src squoosh-oxipng ./build.sh" + "build": "docker run --rm -v $(pwd):/src squoosh-oxipng ./build.sh" } } diff --git a/codecs/resize/package.json b/codecs/resize/package.json index f0d0e462..439f4262 100644 --- a/codecs/resize/package.json +++ b/codecs/resize/package.json @@ -2,6 +2,6 @@ "name": "resize", "scripts": { "build:image": "docker build -t squoosh-resize .", - "build": "docker run -v $(pwd):/src squoosh-resize ./build.sh" + "build": "docker run --rm -v $(pwd):/src squoosh-resize ./build.sh" } } diff --git a/codecs/rotate/package.json b/codecs/rotate/package.json index 5ce6f41e..add6a95a 100644 --- a/codecs/rotate/package.json +++ b/codecs/rotate/package.json @@ -2,7 +2,7 @@ "name": "rotate", "scripts": { "build:image": "docker build -t squoosh-rotate .", - "build": "docker run -v $(pwd):/src squoosh-rotate ./build.sh", + "build": "docker run --rm -v $(pwd):/src squoosh-rotate ./build.sh", "benchmark": "echo File size after gzip && npm run benchmark:filesize && echo Optimizing && npm run -s benchmark:optimizing", "benchmark:baseline": "v8 --liftoff --no-wasm-tier-up --no-opt ./benchmark.js", "benchmark:optimizing": "v8 --no-liftoff --no-wasm-tier-up ./benchmark.js", diff --git a/codecs/webp/package.json b/codecs/webp/package.json index 4fc83135..a6114aeb 100644 --- a/codecs/webp/package.json +++ b/codecs/webp/package.json @@ -2,7 +2,7 @@ "name": "webp", "scripts": { "install": "napa", - "build": "docker run -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" + "build": "docker run --rm -v $(pwd):/src trzeci/emscripten-upstream ./build.sh" }, "napa": { "libwebp": "webmproject/libwebp#v1.0.2" From f0c3ec9d519a94f9fc9e8a118a866e9167dbbcd1 Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Thu, 14 May 2020 16:30:12 +0100 Subject: [PATCH 09/26] Fixup clang-format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I've actually comitted files formatted with column limit of 100, but forgot to include updated .clang-format 🤦🏻‍♂️ --- .clang-format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.clang-format b/.clang-format index b0522bad..e7f5a74c 100644 --- a/.clang-format +++ b/.clang-format @@ -1,2 +1,2 @@ BasedOnStyle: Chromium -ColumnLimit: 120 +ColumnLimit: 100 From 265e6db2bd69f928c33572572ada57dd6c5329da Mon Sep 17 00:00:00 2001 From: Pete LePage Date: Tue, 23 Jun 2020 16:10:40 -0400 Subject: [PATCH 10/26] Adds install button to Squoosh --- src/components/intro/index.tsx | 84 ++++++++++++++++++++++++- src/components/intro/missing-types.d.ts | 32 ++++++++++ src/components/intro/style.scss | 20 ++++++ 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/components/intro/missing-types.d.ts diff --git a/src/components/intro/index.tsx b/src/components/intro/index.tsx index c9ca9536..753643af 100644 --- a/src/components/intro/index.tsx +++ b/src/components/intro/index.tsx @@ -47,11 +47,27 @@ interface Props { } interface State { fetchingDemoIndex?: number; + deferredPrompt?: BeforeInstallPromptEvent; + installSource?: String; } export default class Intro extends Component { - state: State = {}; + state: State = { + deferredPrompt: undefined, + installSource: undefined, + }; private fileInput?: HTMLInputElement; + private installButton?: HTMLButtonElement; + + constructor() { + super(); + + // Listen for beforeinstallprompt events, indicating Squoosh is installable. + window.addEventListener('beforeinstallprompt', this.onBeforeInstallPromptEvent); + + // Listen for the appinstalled event, indicating Squoosh has been installed. + window.addEventListener('appinstalled', this.onAppInstalled); + } @bind private resetFileInput() { @@ -90,6 +106,62 @@ export default class Intro extends Component { } } + @bind + private onBeforeInstallPromptEvent(event: BeforeInstallPromptEvent) { + // Don't show the mini-infobar on mobile + event.preventDefault(); + + // Save the beforeinstallprompt event so it can be called later. + this.setState({ deferredPrompt: event }); + + // Log the event. + ga('send', 'event', 'pwa-install', 'available'); + + // Make the install button visible + this.installButton!.style.display = 'inline-block'; + } + + @bind + private async onInstallClick(event: Event) { + // Get the deferred beforeinstallprompt event + const deferredPrompt = this.state.deferredPrompt; + + // If there's no deferred prompt, bail. + if (!deferredPrompt) return; + + // Set the install source as the intro install button. + const installSource = 'introInstallButton'; + this.setState({ installSource }); + + // Show the browser install prompt + deferredPrompt.prompt(); + + // Wait for the user to accept or dismiss the install prompt + const response = await deferredPrompt.userChoice; + + // Get the outcome and log it + const outcome = response.outcome; + ga('send', 'event', 'pwa-install', installSource, outcome); + + // If the prompt was dismissed, clear the installSource. + if (outcome === 'dismissed') { + this.setState({ installSource: undefined }); + } + } + + @bind + private onAppInstalled() { + // If install button is visible, hide it. + const installButton = this.installButton; + if (installButton) { + installButton.style.display = 'none'; + } + + // Try to get the install, if it's not set, use 'browser' + const source = this.state.installSource || 'browser'; + ga('send', 'event', 'pwa-install', 'installed', source); + } + render({ }: Props, { fetchingDemoIndex }: State) { return (
@@ -132,6 +204,16 @@ export default class Intro extends Component { )}
+
+ +
  • View the code
  • Report a bug
  • diff --git a/src/components/intro/missing-types.d.ts b/src/components/intro/missing-types.d.ts new file mode 100644 index 00000000..8c794d4e --- /dev/null +++ b/src/components/intro/missing-types.d.ts @@ -0,0 +1,32 @@ +/** + * The BeforeInstallPromptEvent is fired at the Window.onbeforeinstallprompt handler + * before a user is prompted to "install" a web site to a home screen on mobile. + */ +interface BeforeInstallPromptEvent extends Event { + + /** + * Returns an array of DOMString items containing the platforms on which the event was dispatched. + * This is provided for user agents that want to present a choice of versions to the user such as, + * for example, "web" or "play" which would allow the user to chose between a web version or + * an Android version. + */ + readonly platforms: Array; + + /** + * Returns a Promise that resolves to a DOMString containing either "accepted" or "dismissed". + */ + readonly userChoice: Promise<{ + outcome: 'accepted' | 'dismissed', + platform: string + }>; + + /** + * Allows a developer to show the install prompt at a time of their own choosing. + * This method returns a Promise. + */ + prompt(): Promise; +} + +interface WindowEventMap { + "beforeinstallprompt": BeforeInstallPromptEvent; +} diff --git a/src/components/intro/style.scss b/src/components/intro/style.scss index 0d776195..58b83692 100644 --- a/src/components/intro/style.scss +++ b/src/components/intro/style.scss @@ -170,6 +170,26 @@ --color: #fff; } +.install-button { + composes: unbutton from '../../lib/util.scss'; + + &:hover, + &:focus { + background: #f5f5f5; + } + + background: #fff; + border: 1px solid #e8e8e8; + + margin-top: 1em; + + align-items: center; + padding: 14px; + font-size: 1.3rem; + + display: none; +} + .related-links { display: flex; padding: 0; From 6065ceabfe4b6a5fe83aae5ad5a96a89ac7da7d5 Mon Sep 17 00:00:00 2001 From: Pete LePage Date: Tue, 23 Jun 2020 16:16:32 -0400 Subject: [PATCH 11/26] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1f32797f..72e6ed2a 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Google Analytics is used to record the following: * [Basic visit data](https://support.google.com/analytics/answer/6004245?ref_topic=2919631). * Before and after image size once an image is downloaded. These values are rounded to the nearest kilobyte. +* If install is available, when Squoosh is installed, and what method was used to install Squoosh. Image compression is handled locally; no additional data is sent to the server. From 079e56f1e109a58f89d47edd2a386fb9450dd9ee Mon Sep 17 00:00:00 2001 From: Pete LePage Date: Tue, 23 Jun 2020 16:34:47 -0400 Subject: [PATCH 12/26] Use a dimension to note how the user opened squoosh --- src/index.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index dfa2fc12..1e82b289 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,11 +13,19 @@ if (!('customElements' in self)) { } if (typeof PRERENDER === 'undefined') { + // Determine the current display mode. + let displayMode = 'browser'; + const mqStandAlone = '(display-mode: standalone)'; + if (navigator.standalone || window.matchMedia(mqStandAlone).matches) { + displayMode = 'standalone'; + } + // Setup analytics window.ga = window.ga || ((...args) => (ga.q = ga.q || []).push(args)); ga('create', 'UA-128752250-1', 'auto'); ga('set', 'transport', 'beacon'); + ga('set', 'dimensionX', displayMode); ga('send', 'pageview'); - // Load the GA script + // Load the GA script const s = document.createElement('script'); s.src = 'https://www.google-analytics.com/analytics.js'; document.head!.appendChild(s); From 7c89d091394ea8e82cd09907f590724404e99d33 Mon Sep 17 00:00:00 2001 From: Surma Date: Wed, 24 Jun 2020 14:08:52 +0100 Subject: [PATCH 13/26] Add missing prop to navigator --- src/missing-types.d.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/missing-types.d.ts b/src/missing-types.d.ts index 8d8366ae..9174f20e 100644 --- a/src/missing-types.d.ts +++ b/src/missing-types.d.ts @@ -39,3 +39,7 @@ declare var ga: { (...args: any[]): void; q: any[]; }; + +interface Navigator { + readonly standalone: boolean; +} From 4fa73be842976d91d7ad542868930ea7a6a0fb39 Mon Sep 17 00:00:00 2001 From: Pete LePage Date: Wed, 24 Jun 2020 09:40:56 -0400 Subject: [PATCH 14/26] Apply suggestions from code review Co-authored-by: Surma --- src/components/intro/index.tsx | 10 ++-------- src/components/intro/style.scss | 12 ++++++++++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/components/intro/index.tsx b/src/components/intro/index.tsx index 753643af..8ce390f6 100644 --- a/src/components/intro/index.tsx +++ b/src/components/intro/index.tsx @@ -52,10 +52,7 @@ interface State { } export default class Intro extends Component { - state: State = { - deferredPrompt: undefined, - installSource: undefined, - }; + state: State = {}; private fileInput?: HTMLInputElement; private installButton?: HTMLButtonElement; @@ -137,10 +134,7 @@ export default class Intro extends Component { deferredPrompt.prompt(); // Wait for the user to accept or dismiss the install prompt - const response = await deferredPrompt.userChoice; - - // Get the outcome and log it - const outcome = response.outcome; + const {outcome} = await deferredPrompt.userChoice; ga('send', 'event', 'pwa-install', installSource, outcome); // If the prompt was dismissed, clear the installSource. diff --git a/src/components/intro/style.scss b/src/components/intro/style.scss index 58b83692..4f03a635 100644 --- a/src/components/intro/style.scss +++ b/src/components/intro/style.scss @@ -181,13 +181,21 @@ background: #fff; border: 1px solid #e8e8e8; - margin-top: 1em; - align-items: center; padding: 14px; font-size: 1.3rem; + position: absolute; + top: 1rem; + right: 1rem; display: none; + opacity: 0; + + animation: fade-in .3s linear 1s forwards; +} + +@keyframes fade-in { + to {opacity: 1;} } .related-links { From 85eb94b725d01e241724a4d1bc28dc07a198677c Mon Sep 17 00:00:00 2001 From: Pete LePage Date: Wed, 24 Jun 2020 09:54:54 -0400 Subject: [PATCH 15/26] Set the dimension value --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 1e82b289..774931dd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,7 +23,7 @@ if (typeof PRERENDER === 'undefined') { window.ga = window.ga || ((...args) => (ga.q = ga.q || []).push(args)); ga('create', 'UA-128752250-1', 'auto'); ga('set', 'transport', 'beacon'); - ga('set', 'dimensionX', displayMode); + ga('set', 'dimension1', displayMode); ga('send', 'pageview'); // Load the GA script const s = document.createElement('script'); From 5c17fba34901c741eab96590e999a4999edd94dc Mon Sep 17 00:00:00 2001 From: Jake Archibald Date: Wed, 24 Jun 2020 15:12:48 +0100 Subject: [PATCH 16/26] Minor tweaks --- src/components/intro/index.tsx | 50 ++++++++++++++------------------- src/components/intro/style.scss | 8 ++---- 2 files changed, 23 insertions(+), 35 deletions(-) diff --git a/src/components/intro/index.tsx b/src/components/intro/index.tsx index 8ce390f6..79ed6fa8 100644 --- a/src/components/intro/index.tsx +++ b/src/components/intro/index.tsx @@ -41,20 +41,21 @@ const demos = [ }, ]; +const installButtonSource = 'introInstallButton'; + interface Props { onFile: (file: File | Fileish) => void; showSnack: SnackBarElement['showSnackbar']; } interface State { fetchingDemoIndex?: number; - deferredPrompt?: BeforeInstallPromptEvent; - installSource?: String; + installEvent?: BeforeInstallPromptEvent; } export default class Intro extends Component { state: State = {}; private fileInput?: HTMLInputElement; - private installButton?: HTMLButtonElement; + private installingViaButton = false; constructor() { super(); @@ -109,54 +110,46 @@ export default class Intro extends Component { event.preventDefault(); // Save the beforeinstallprompt event so it can be called later. - this.setState({ deferredPrompt: event }); + this.setState({ installEvent: event }); // Log the event. ga('send', 'event', 'pwa-install', 'available'); - - // Make the install button visible - this.installButton!.style.display = 'inline-block'; } @bind private async onInstallClick(event: Event) { // Get the deferred beforeinstallprompt event - const deferredPrompt = this.state.deferredPrompt; - + const deferredPrompt = this.state.installEvent; // If there's no deferred prompt, bail. if (!deferredPrompt) return; - // Set the install source as the intro install button. - const installSource = 'introInstallButton'; - this.setState({ installSource }); + this.installingViaButton = true; // Show the browser install prompt deferredPrompt.prompt(); // Wait for the user to accept or dismiss the install prompt - const {outcome} = await deferredPrompt.userChoice; - ga('send', 'event', 'pwa-install', installSource, outcome); + const { outcome } = await deferredPrompt.userChoice; + ga('send', 'event', 'pwa-install', installButtonSource, outcome); - // If the prompt was dismissed, clear the installSource. + // If the prompt was dismissed, we aren't going to install via the button. if (outcome === 'dismissed') { - this.setState({ installSource: undefined }); + this.installingViaButton = false; } } @bind private onAppInstalled() { - // If install button is visible, hide it. - const installButton = this.installButton; - if (installButton) { - installButton.style.display = 'none'; - } - // Try to get the install, if it's not set, use 'browser' - const source = this.state.installSource || 'browser'; + const source = this.installingViaButton ? installButtonSource : 'browser'; ga('send', 'event', 'pwa-install', 'installed', source); + + this.installingViaButton = false; + // We don't need the install button, if it's shown + this.setState({ installEvent: undefined }); } - render({ }: Props, { fetchingDemoIndex }: State) { + render({ }: Props, { fetchingDemoIndex, installEvent }: State) { return (
    @@ -186,7 +179,7 @@ export default class Intro extends Component { {fetchingDemoIndex === i &&
    - +
    }
    @@ -198,16 +191,15 @@ export default class Intro extends Component { )}
-
+ {installEvent && -
+ }
  • View the code
  • Report a bug
  • diff --git a/src/components/intro/style.scss b/src/components/intro/style.scss index 4f03a635..3c8a138b 100644 --- a/src/components/intro/style.scss +++ b/src/components/intro/style.scss @@ -180,22 +180,18 @@ background: #fff; border: 1px solid #e8e8e8; - - align-items: center; padding: 14px; font-size: 1.3rem; position: absolute; top: 1rem; right: 1rem; - display: none; - opacity: 0; - animation: fade-in .3s linear 1s forwards; + animation: fade-in .3s ease-in-out; } @keyframes fade-in { - to {opacity: 1;} + from { opacity: 0; } } .related-links { From 42e43730c82da0accaa63cb2b68a72564ddb34e9 Mon Sep 17 00:00:00 2001 From: Jake Archibald Date: Wed, 24 Jun 2020 15:16:38 +0100 Subject: [PATCH 17/26] Naming changes --- src/components/intro/index.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/intro/index.tsx b/src/components/intro/index.tsx index 79ed6fa8..f8c95ad7 100644 --- a/src/components/intro/index.tsx +++ b/src/components/intro/index.tsx @@ -49,7 +49,7 @@ interface Props { } interface State { fetchingDemoIndex?: number; - installEvent?: BeforeInstallPromptEvent; + beforeInstallEvent?: BeforeInstallPromptEvent; } export default class Intro extends Component { @@ -110,7 +110,7 @@ export default class Intro extends Component { event.preventDefault(); // Save the beforeinstallprompt event so it can be called later. - this.setState({ installEvent: event }); + this.setState({ beforeInstallEvent: event }); // Log the event. ga('send', 'event', 'pwa-install', 'available'); @@ -119,17 +119,17 @@ export default class Intro extends Component { @bind private async onInstallClick(event: Event) { // Get the deferred beforeinstallprompt event - const deferredPrompt = this.state.installEvent; + const beforeInstallEvent = this.state.beforeInstallEvent; // If there's no deferred prompt, bail. - if (!deferredPrompt) return; + if (!beforeInstallEvent) return; this.installingViaButton = true; // Show the browser install prompt - deferredPrompt.prompt(); + beforeInstallEvent.prompt(); // Wait for the user to accept or dismiss the install prompt - const { outcome } = await deferredPrompt.userChoice; + const { outcome } = await beforeInstallEvent.userChoice; ga('send', 'event', 'pwa-install', installButtonSource, outcome); // If the prompt was dismissed, we aren't going to install via the button. @@ -146,10 +146,10 @@ export default class Intro extends Component { this.installingViaButton = false; // We don't need the install button, if it's shown - this.setState({ installEvent: undefined }); + this.setState({ beforeInstallEvent: undefined }); } - render({ }: Props, { fetchingDemoIndex, installEvent }: State) { + render({ }: Props, { fetchingDemoIndex, beforeInstallEvent }: State) { return (
    @@ -191,7 +191,7 @@ export default class Intro extends Component { )}
- {installEvent && + {beforeInstallEvent &&