Переглянути джерело

Package.json: lighter dependencies

[email protected] 5 роки тому
батько
коміт
3c41b9d59a

+ 6 - 2
.github/workflows/ci.yml

@@ -41,7 +41,9 @@ jobs:
         with:
           node-version: 10
       - name: Install packages
-        run: npm ci && npm run build-test
+        run: npm ci && npm ci --prefix test
+      - name: Build
+        run: npm run build
 
       - name: === Unit testing ===
         run: npm run test-unit
@@ -63,7 +65,9 @@ jobs:
         with:
           node-version: 10
       - name: Install packages
-        run: npm ci && sudo apt-get install xvfb && npm run build
+        run: npm ci && npm ci --prefix test && sudo apt-get install xvfb
+      - name: Build
+        run: npm run build
 
       - name: === E2E testing ===
         run: xvfb-run --auto-servernum npm run test-e2e

+ 2 - 2
.gitignore

@@ -1,10 +1,10 @@
 .DS_Store
 *.swp
 .project
-node_modules
 .idea/
 .vscode/
 npm-debug.log
 .jshintrc
 .vs/
-test/unit/three.*.unit.js
+**/node_modules
+test/unit/build

Різницю між файлами не показано, бо вона завелика
+ 3 - 737
package-lock.json


+ 1 - 9
package.json

@@ -47,7 +47,6 @@
   "scripts": {
     "start": "npm run dev",
     "build": "rollup -c utils/build/rollup.config.js",
-    "build-test": "rollup -c test/rollup.unit.config.js",
     "build-closure": "rollup -c utils/build/rollup.config.js && google-closure-compiler --warning_level=VERBOSE --jscomp_off=globalThis --jscomp_off=checkTypes --externs utils/build/externs.js --language_in=ECMASCRIPT5_STRICT --js build/three.js --js_output_file build/three.min.js",
     "build-examples": "rollup -c utils/build/rollup-examples.config.js",
     "dev": "concurrently --names \"ROLLUP,HTTP\" -c \"bgBlue.bold,bgGreen.bold\" \"rollup -c utils/build/rollup.config.js -w -m inline\" \"http-server -c-1 -p 8080\"",
@@ -55,7 +54,7 @@
     "lint-docs": "eslint docs --ext html",
     "lint-examples": "eslint examples/jsm --ext js --ext ts --ignore-pattern libs && tsc -p utils/build/tsconfig-examples.lint.json",
     "test-lint": "eslint src --ext js --ext ts && tsc -p utils/build/tsconfig.lint.json",
-    "test-unit": "npm run build-test && qunit -r failonlyreporter test/unit/three.source.unit.js",
+    "test-unit": "npm run unit --prefix test",
     "test-e2e": "node test/e2e/puppeteer.js",
     "test-e2e-cov": "node test/e2e/check-coverage.js",
     "make-screenshot": "cross-env MAKE=true node test/e2e/puppeteer.js"
@@ -89,17 +88,10 @@
     "eslint": "^6.8.0",
     "eslint-config-mdcs": "^5.0.0",
     "eslint-plugin-html": "^6.0.2",
-    "failonlyreporter": "^1.0.0",
     "google-closure-compiler": "20200224.0.0",
     "http-server": "^0.12.3",
-    "image-output": "^2.4.2",
-    "pixelmatch": "5.2.0",
-    "pngjs": "5.0.0",
-    "puppeteer": "2.1.1",
-    "qunit": "^2.10.0",
     "rollup": "^2.10.0",
     "rollup-plugin-buble": "^0.19.8",
-    "serve-handler": "^6.1.2",
     "typescript": "^3.9.2"
   },
   "jspm": {

+ 1 - 1
test/e2e/check-coverage.js

@@ -43,7 +43,7 @@ if ( subES.length + subSE.length + subEF.length + subFE.length === 0 ) {
 
 } else {
 
-	if ( subES.length > 0 ) console.red( 'Add screenshots for example(s): ' + subES.join(' ') );
+	if ( subES.length > 0 ) console.red( 'Make screenshot for example(s): ' + subES.join(' ') );
 	if ( subSE.length > 0 ) console.red( 'Remove unnecessary screenshot(s): ' + subSE.join(' ') );
 	if ( subEF.length > 0 ) console.red( 'Add description in file.js for example(s): ' + subEF.join(' ') );
 	if ( subFE.length > 0 ) console.red( 'Remove description in file.js for example(s): ' + subFE.join(' ') );

+ 19 - 8
test/e2e/puppeteer.js

@@ -2,6 +2,17 @@
  * @author munrocket / https://github.com/munrocket
  */
 
+try {
+
+	require( 'puppeteer' );
+
+} catch {
+
+	console.log( '\x1b[31mError! You not installed dependencies. Please run `npm i --prefix test`\x1b[37m' );
+	process.exit( 1 );
+
+}
+
 const puppeteer = require( 'puppeteer' );
 const handler = require( 'serve-handler' );
 const http = require( 'http' );
@@ -14,6 +25,14 @@ const port = 1234;
 const pixelThreshold = 0.2; // threshold error in one pixel
 const maxFailedPixels = 0.05; // total failed pixels
 
+const networkTimeout = 600;
+const networkTax = 2000; // additional timeout for resources size
+const pageSizeMinTax = 1.0; // in mb, when networkTax = 0
+const pageSizeMaxTax = 5.0; // in mb, when networkTax = networkTax
+const renderTimeout = 1200;
+const maxAttemptId = 3; // progresseve attempts
+const progressFunc = n => 1 + n;
+
 const exceptionList = [
 
 	'index',
@@ -33,14 +52,6 @@ const exceptionList = [
 
 ] : [] );
 
-const networkTimeout = 600;
-const networkTax = 2000; // additional timeout for resources size
-const pageSizeMinTax = 1.0; // in mb, when networkTax = 0
-const pageSizeMaxTax = 5.0; // in mb, when networkTax = networkTax
-const renderTimeout = 1200;
-const maxAttemptId = 3; // progresseve attempts
-const progressFunc = n => 1 + n;
-
 console.green = ( msg ) => console.log( `\x1b[32m${ msg }\x1b[37m` );
 console.red = ( msg ) => console.log( `\x1b[31m${ msg }\x1b[37m` );
 console.null = () => {};

+ 1309 - 0
test/package-lock.json

@@ -0,0 +1,1309 @@
+{
+  "name": "test-deps-intaller",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@types/mime-types": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz",
+      "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=",
+      "dev": true
+    },
+    "agent-base": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz",
+      "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz",
+      "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "app-path": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/app-path/-/app-path-2.2.0.tgz",
+      "integrity": "sha1-KvXCtUSkDhX8GsVVSDFDl0YIRdA=",
+      "dev": true,
+      "requires": {
+        "execa": "^0.4.0"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "async-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+      "dev": true
+    },
+    "atob-lite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz",
+      "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=",
+      "dev": true
+    },
+    "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": "1.2.0",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
+      "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
+      "dev": true
+    },
+    "bmp-js": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
+      "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=",
+      "dev": true
+    },
+    "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-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
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "dev": true
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "clamp": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz",
+      "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=",
+      "dev": true
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-id": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz",
+      "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==",
+      "dev": true,
+      "requires": {
+        "clamp": "^1.0.1"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "commander": {
+      "version": "2.12.2",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
+      "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
+      "dev": true
+    },
+    "compute-dims": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz",
+      "integrity": "sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg==",
+      "dev": true,
+      "requires": {
+        "utils-copy": "^1.0.0",
+        "validate.io-array": "^1.0.6",
+        "validate.io-matrix-like": "^1.0.2",
+        "validate.io-ndarray-like": "^1.0.0",
+        "validate.io-positive-integer": "^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
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "const-max-uint32": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz",
+      "integrity": "sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY=",
+      "dev": true
+    },
+    "const-pinf-float64": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz",
+      "integrity": "sha1-9u+w15+cCYbT558pI6v5twtj1yY=",
+      "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
+    },
+    "cross-spawn": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^4.0.1",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
+    },
+    "cross-spawn-async": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz",
+      "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^4.0.0",
+        "which": "^1.2.8"
+      }
+    },
+    "debug": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+      "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+      "dev": true,
+      "requires": {
+        "ms": "^2.1.1"
+      }
+    },
+    "dtype": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz",
+      "integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ=",
+      "dev": true
+    },
+    "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
+    },
+    "execa": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz",
+      "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=",
+      "dev": true,
+      "requires": {
+        "cross-spawn-async": "^2.1.1",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "path-key": "^1.0.0",
+        "strip-eof": "^1.0.0"
+      }
+    },
+    "extract-zip": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
+      "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
+      "dev": true,
+      "requires": {
+        "concat-stream": "^1.6.2",
+        "debug": "^2.6.9",
+        "mkdirp": "^0.5.4",
+        "yauzl": "^2.10.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "failonlyreporter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/failonlyreporter/-/failonlyreporter-1.0.0.tgz",
+      "integrity": "sha512-daW559J4F/nWk0AiUPuxpCNCRXNa74yQdZNAVBIJt192VbsfKMNZocCqvRLjFIIp9BeBGu4gUhFJImmb4kSWOQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2"
+      }
+    },
+    "fast-url-parser": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
+      "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=",
+      "dev": true,
+      "requires": {
+        "punycode": "^1.3.2"
+      }
+    },
+    "fd-slicer": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+      "dev": true,
+      "requires": {
+        "pend": "~1.2.0"
+      }
+    },
+    "file-saver": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz",
+      "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==",
+      "dev": true
+    },
+    "file-type": {
+      "version": "10.11.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz",
+      "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==",
+      "dev": true
+    },
+    "flatten-vertex-data": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz",
+      "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==",
+      "dev": true,
+      "requires": {
+        "dtype": "^2.0.0"
+      }
+    },
+    "flip-pixels": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz",
+      "integrity": "sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA==",
+      "dev": true
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "get-ext": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/get-ext/-/get-ext-1.0.2.tgz",
+      "integrity": "sha1-/OiW0MxM1hXs58E6Dr1V5lJwBW0=",
+      "dev": true
+    },
+    "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.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "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"
+      }
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "https-proxy-agent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz",
+      "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==",
+      "dev": true,
+      "requires": {
+        "agent-base": "5",
+        "debug": "4"
+      }
+    },
+    "image-encode": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/image-encode/-/image-encode-1.3.0.tgz",
+      "integrity": "sha512-2SzuDscMQGK38jGiVMSuygquz2z3DnW4Smget/LipWfqvEnc7+L/qbaQAPDtzi9hsHqKpGGU22SUjl6G8TprJg==",
+      "dev": true,
+      "requires": {
+        "bmp-js": "^0.1.0",
+        "image-palette": "^2.0.1",
+        "image-type": "^3.0.0",
+        "is-plain-obj": "^1.1.0",
+        "jpeg-js": "^0.3.4",
+        "next-pow-2": "^1.0.0",
+        "object-assign": "^4.1.1",
+        "omggif": "^1.0.9",
+        "pngjs": "^3.3.3",
+        "pxls": "^2.3.1",
+        "to-array-buffer": "^3.0.0",
+        "utif": "^2.0.1"
+      },
+      "dependencies": {
+        "pngjs": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+          "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+          "dev": true
+        }
+      }
+    },
+    "image-output": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/image-output/-/image-output-2.4.2.tgz",
+      "integrity": "sha512-75e8ZSNydcrb2B/xITCYc3pDR95w7h5hmsdfhwAVgZ2CKRZQ/Tke1J3Sk3K/nCwmit4SCo6vSggYVL6x+FrRtw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "get-ext": "^1.0.2",
+        "image-encode": "^1.2.5",
+        "image-type": "^3.0.0",
+        "is-blob": "^2.0.1",
+        "is-buffer": "^2.0.3",
+        "is-float-array": "^1.0.0",
+        "is-obj": "^1.0.1",
+        "is-plain-obj": "^1.1.0",
+        "pxls": "^2.2.0",
+        "save-file": "^2.1.1",
+        "term-img": "^2.1.0",
+        "term-size": "^1.2.0",
+        "to-array-buffer": "^3.1.1",
+        "weak-map": "^1.0.5"
+      }
+    },
+    "image-palette": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz",
+      "integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==",
+      "dev": true,
+      "requires": {
+        "color-id": "^1.1.0",
+        "pxls": "^2.0.0",
+        "quantize": "^1.0.2"
+      }
+    },
+    "image-type": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/image-type/-/image-type-3.1.0.tgz",
+      "integrity": "sha512-edYRXKQ3WD2yHXFGUbwoJVn5v7j1A6Z505uZUYIfzCwOOhPGLYSc3VOucF9fqbsaUbgb37DdjOU+WV4uo7ZooQ==",
+      "dev": true,
+      "requires": {
+        "file-type": "^10.9.0"
+      }
+    },
+    "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.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "is-base64": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz",
+      "integrity": "sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg==",
+      "dev": true
+    },
+    "is-blob": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz",
+      "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==",
+      "dev": true
+    },
+    "is-browser": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz",
+      "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==",
+      "dev": true
+    },
+    "is-buffer": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+      "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+      "dev": true
+    },
+    "is-float-array": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz",
+      "integrity": "sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ==",
+      "dev": true
+    },
+    "is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+      "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-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
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "iterm2-version": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/iterm2-version/-/iterm2-version-2.3.0.tgz",
+      "integrity": "sha1-rmQABGHgK18f5TMfC58Oxxzg4Tg=",
+      "dev": true,
+      "requires": {
+        "app-path": "^2.1.0",
+        "plist": "^2.0.1"
+      }
+    },
+    "jpeg-js": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.7.tgz",
+      "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==",
+      "dev": true
+    },
+    "js-reporters": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/js-reporters/-/js-reporters-1.2.1.tgz",
+      "integrity": "sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs=",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+      "dev": true,
+      "requires": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      }
+    },
+    "mime": {
+      "version": "2.4.5",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz",
+      "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.44.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.27",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.44.0"
+      }
+    },
+    "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.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "next-pow-2": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/next-pow-2/-/next-pow-2-1.0.0.tgz",
+      "integrity": "sha1-y1wvHa4EDFbN1c2h3FxqOjOPQ2c=",
+      "dev": true
+    },
+    "node-watch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.6.1.tgz",
+      "integrity": "sha512-gwQiR7weFRV8mAtT0x0kXkZ18dfRLB45xH7q0hCOVQMLfLb2f1ZaSvR57q4/b/Vj6B0RwMNJYbvb69e1yM7qEA==",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz",
+      "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=",
+      "dev": true,
+      "requires": {
+        "path-key": "^1.0.0"
+      }
+    },
+    "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
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true
+    },
+    "omggif": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
+      "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==",
+      "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-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "dev": true
+    },
+    "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
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz",
+      "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
+    },
+    "path-to-regexp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz",
+      "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==",
+      "dev": true
+    },
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+      "dev": true
+    },
+    "pixelmatch": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.0.tgz",
+      "integrity": "sha512-TdleROuanI+Uo/4PcOAH7b7qgO4kjzJO8K4y/TBAo1wx/5BE8cn1B0I6Jfk3mKcJsGpWvX7zjM8OjU5o9i+aog==",
+      "dev": true,
+      "requires": {
+        "pngjs": "^4.0.1"
+      },
+      "dependencies": {
+        "pngjs": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz",
+          "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==",
+          "dev": true
+        }
+      }
+    },
+    "plist": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+      "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
+      "dev": true,
+      "requires": {
+        "base64-js": "1.2.0",
+        "xmlbuilder": "8.2.2",
+        "xmldom": "0.1.x"
+      }
+    },
+    "pngjs": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "dev": true
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
+    },
+    "proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "dev": true
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+      "dev": true
+    },
+    "puppeteer": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz",
+      "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==",
+      "dev": true,
+      "requires": {
+        "@types/mime-types": "^2.1.0",
+        "debug": "^4.1.0",
+        "extract-zip": "^1.6.6",
+        "https-proxy-agent": "^4.0.0",
+        "mime": "^2.0.3",
+        "mime-types": "^2.1.25",
+        "progress": "^2.0.1",
+        "proxy-from-env": "^1.0.0",
+        "rimraf": "^2.6.1",
+        "ws": "^6.1.0"
+      }
+    },
+    "pxls": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz",
+      "integrity": "sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw==",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "compute-dims": "^1.1.0",
+        "flip-pixels": "^1.0.2",
+        "is-browser": "^2.1.0",
+        "is-buffer": "^2.0.3",
+        "to-uint8": "^1.4.1"
+      }
+    },
+    "quantize": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz",
+      "integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4=",
+      "dev": true
+    },
+    "qunit": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.10.0.tgz",
+      "integrity": "sha512-EP9Q9Kf45z4l/X02ZJtyTQU9DBc82pEWAncSNx7Weo/73BDpX71xqbsdDAQrtEeeilK70cib7CY/lniJV6Cwwg==",
+      "dev": true,
+      "requires": {
+        "commander": "2.12.2",
+        "js-reporters": "1.2.1",
+        "minimatch": "3.0.4",
+        "node-watch": "0.6.1",
+        "resolve": "1.9.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "dev": true
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "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.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "regex-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz",
+      "integrity": "sha1-kEih6uuHD01IDavHb8Qs3MC8OnI=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz",
+      "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "save-file": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/save-file/-/save-file-2.3.1.tgz",
+      "integrity": "sha512-VOD2Ojb1/kuj0XbvSXzZ5xr4rRSZD8f+HzKWGztXNp93gBQDj3njFt9HMhmLtnwd7q0BjJkzLXqd8M2+PFS1qg==",
+      "dev": true,
+      "requires": {
+        "file-saver": "^2.0.0-rc.4",
+        "is-blob": "^1.0.0",
+        "is-buffer": "^2.0.0",
+        "simple-mime": "^0.1.0",
+        "to-array-buffer": "^3.2.0",
+        "write": "^1.0.0"
+      },
+      "dependencies": {
+        "is-blob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-1.0.0.tgz",
+          "integrity": "sha1-o9fZb+HD/wZex84nwsIea6ksGDI=",
+          "dev": true
+        }
+      }
+    },
+    "serve-handler": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.2.tgz",
+      "integrity": "sha512-RFh49wX7zJmmOVDcIjiDSJnMH+ItQEvyuYLYuDBVoA/xmQSCuj+uRmk1cmBB5QQlI3qOiWKp6p4DUGY+Z5AB2A==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "content-disposition": "0.5.2",
+        "fast-url-parser": "1.1.3",
+        "mime-types": "2.1.18",
+        "minimatch": "3.0.4",
+        "path-is-inside": "1.0.2",
+        "path-to-regexp": "2.2.1",
+        "range-parser": "1.2.0"
+      },
+      "dependencies": {
+        "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
+        },
+        "mime-types": {
+          "version": "2.1.18",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+          "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+          "dev": true,
+          "requires": {
+            "mime-db": "~1.33.0"
+          }
+        }
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "dev": true
+    },
+    "simple-mime": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/simple-mime/-/simple-mime-0.1.0.tgz",
+      "integrity": "sha1-lfUXxPRm18/1YacfydqyWW6p7y4=",
+      "dev": true
+    },
+    "string-to-arraybuffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz",
+      "integrity": "sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==",
+      "dev": true,
+      "requires": {
+        "atob-lite": "^2.0.0",
+        "is-base64": "^0.1.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "term-img": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/term-img/-/term-img-2.1.0.tgz",
+      "integrity": "sha512-j78Y+26QYTTWvtVVCmDx94idvQm6p59E+xRfQDSevIyM8dg45uUAtr/xbu13l0BeKrebPyUpgh8PM3noXlIBkw==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^2.0.0",
+        "iterm2-version": "^2.1.0"
+      }
+    },
+    "term-size": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+      "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+      "dev": true,
+      "requires": {
+        "execa": "^0.7.0"
+      },
+      "dependencies": {
+        "execa": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+          "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "npm-run-path": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+          "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+          "dev": true,
+          "requires": {
+            "path-key": "^2.0.0"
+          }
+        },
+        "path-key": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+          "dev": true
+        }
+      }
+    },
+    "to-array-buffer": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz",
+      "integrity": "sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ==",
+      "dev": true,
+      "requires": {
+        "flatten-vertex-data": "^1.0.2",
+        "is-blob": "^2.0.1",
+        "string-to-arraybuffer": "^1.0.0"
+      }
+    },
+    "to-uint8": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz",
+      "integrity": "sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg==",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "clamp": "^1.0.1",
+        "is-base64": "^0.1.0",
+        "is-float-array": "^1.0.0",
+        "to-array-buffer": "^3.0.0"
+      }
+    },
+    "type-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz",
+      "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=",
+      "dev": true
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "utif": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz",
+      "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
+      "dev": true,
+      "requires": {
+        "pako": "^1.0.5"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "utils-copy": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz",
+      "integrity": "sha1-biuXmCqozXPhGCo+b4vsPA9AWKc=",
+      "dev": true,
+      "requires": {
+        "const-pinf-float64": "^1.0.0",
+        "object-keys": "^1.0.9",
+        "type-name": "^2.0.0",
+        "utils-copy-error": "^1.0.0",
+        "utils-indexof": "^1.0.0",
+        "utils-regex-from-string": "^1.0.0",
+        "validate.io-array": "^1.0.3",
+        "validate.io-buffer": "^1.0.1",
+        "validate.io-nonnegative-integer": "^1.0.0"
+      }
+    },
+    "utils-copy-error": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz",
+      "integrity": "sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U=",
+      "dev": true,
+      "requires": {
+        "object-keys": "^1.0.9",
+        "utils-copy": "^1.1.0"
+      }
+    },
+    "utils-indexof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz",
+      "integrity": "sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w=",
+      "dev": true,
+      "requires": {
+        "validate.io-array-like": "^1.0.1",
+        "validate.io-integer-primitive": "^1.0.0"
+      }
+    },
+    "utils-regex-from-string": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz",
+      "integrity": "sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk=",
+      "dev": true,
+      "requires": {
+        "regex-regex": "^1.0.0",
+        "validate.io-string-primitive": "^1.0.0"
+      }
+    },
+    "validate.io-array": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz",
+      "integrity": "sha1-W1osr9j4uFq7L4hroVPy2Tond00=",
+      "dev": true
+    },
+    "validate.io-array-like": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz",
+      "integrity": "sha1-evn363tRcVvrIhVmjsXM5U+t21o=",
+      "dev": true,
+      "requires": {
+        "const-max-uint32": "^1.0.2",
+        "validate.io-integer-primitive": "^1.0.0"
+      }
+    },
+    "validate.io-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz",
+      "integrity": "sha1-hS1nNAIZFNXROvwyUxdh43IO1E4=",
+      "dev": true
+    },
+    "validate.io-integer": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz",
+      "integrity": "sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg=",
+      "dev": true,
+      "requires": {
+        "validate.io-number": "^1.0.3"
+      }
+    },
+    "validate.io-integer-primitive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz",
+      "integrity": "sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY=",
+      "dev": true,
+      "requires": {
+        "validate.io-number-primitive": "^1.0.0"
+      }
+    },
+    "validate.io-matrix-like": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz",
+      "integrity": "sha1-XsMqddCInaxzbepovdYUWxVe38M=",
+      "dev": true
+    },
+    "validate.io-ndarray-like": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz",
+      "integrity": "sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk=",
+      "dev": true
+    },
+    "validate.io-nonnegative-integer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz",
+      "integrity": "sha1-gGkkOgjF+Y6VQTySnf17GPP28p8=",
+      "dev": true,
+      "requires": {
+        "validate.io-integer": "^1.0.5"
+      }
+    },
+    "validate.io-number": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz",
+      "integrity": "sha1-9j/+2iSL8opnqNSODjtGGhZluvg=",
+      "dev": true
+    },
+    "validate.io-number-primitive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz",
+      "integrity": "sha1-0uAfICmJNp3PEVVElWQgOv5YTlU=",
+      "dev": true
+    },
+    "validate.io-positive-integer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz",
+      "integrity": "sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI=",
+      "dev": true,
+      "requires": {
+        "validate.io-integer": "^1.0.5"
+      }
+    },
+    "validate.io-string-primitive": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz",
+      "integrity": "sha1-uBNbn7E3K94C/dU60dDM1t55j+4=",
+      "dev": true
+    },
+    "weak-map": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz",
+      "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=",
+      "dev": true
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "write": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^0.5.1"
+      }
+    },
+    "ws": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+      "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+      "dev": true,
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "xmlbuilder": {
+      "version": "8.2.2",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+      "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
+      "dev": true
+    },
+    "xmldom": {
+      "version": "0.1.31",
+      "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
+      "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==",
+      "dev": true
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    },
+    "yauzl": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+      "dev": true,
+      "requires": {
+        "buffer-crc32": "~0.2.3",
+        "fd-slicer": "~1.1.0"
+      }
+    }
+  }
+}

+ 18 - 0
test/package.json

@@ -0,0 +1,18 @@
+{
+  "name": "test-deps-intaller",
+  "version": "1.0.0",
+  "description": "This package hiding test dependincies from main repo because puppeteer is pretty big.",
+  "scripts": {
+    "unit": "rollup -c rollup.unit.config.js && qunit -r failonlyreporter unit/build/three.source.unit.js"
+  },
+  "devDependencies": {
+    "failonlyreporter": "^1.0.0",
+    "image-output": "^2.4.2",
+    "pixelmatch": "^5.2.0",
+    "pngjs": "^5.0.0",
+    "puppeteer": "2.1.1",
+    "qunit": "^2.10.0",
+    "serve-handler": "^6.1.2"
+  },
+  "license": "MIT"
+}

+ 18 - 6
test/rollup.unit.config.js

@@ -1,3 +1,15 @@
+try {
+
+	require( 'qunit' );
+
+} catch {
+
+	console.log( '\x1b[31mError! You not installed dependencies. Please run `npm i --prefix test`\x1b[37m' );
+	process.exit( 1 );
+
+}
+
+
 function glsl() {
 
 	return {
@@ -26,7 +38,7 @@ function glsl() {
 export default [
 	// editor unit conf
 	{
-		input: 'test/three.editor.unit.js',
+		input: 'unit/three.editor.unit.js',
 		plugins: [
 			glsl()
 		],
@@ -35,7 +47,7 @@ export default [
 			{
 				format: 'umd',
 				name: 'THREE',
-				file: 'test/unit/three.editor.unit.js',
+				file: 'unit/build/three.editor.unit.js',
 				intro: 'QUnit.module( "Editor", () => {',
 				outro: '} );',
 				indent: '\t',
@@ -44,7 +56,7 @@ export default [
 	},
 	// example unit conf
 	{
-		input: 'test/three.example.unit.js',
+		input: 'unit/three.example.unit.js',
 		plugins: [
 			glsl()
 		],
@@ -53,7 +65,7 @@ export default [
 			{
 				format: 'umd',
 				name: 'THREE',
-				file: 'test/unit/three.example.unit.js',
+				file: 'unit/build/three.example.unit.js',
 				intro: 'QUnit.module( "Example", () => {',
 				outro: '} );',
 				indent: '\t',
@@ -62,7 +74,7 @@ export default [
 	},
 	// source unit conf
 	{
-		input: 'test/three.source.unit.js',
+		input: 'unit/three.source.unit.js',
 		plugins: [
 			glsl()
 		],
@@ -71,7 +83,7 @@ export default [
 			{
 				format: 'umd',
 				name: 'THREE',
-				file: 'test/unit/three.source.unit.js',
+				file: 'unit/build/three.source.unit.js',
 				intro: 'QUnit.module( "Source", () => {',
 				outro: '} );',
 				indent: '\t',

+ 0 - 81
test/three.editor.unit.js

@@ -1,81 +0,0 @@
-/**
- * @author TristanVALCKE / https://github.com/Itee
- */
-
-// TODO (Itee) Editor is not es6 module so care to include order !!!
-// TODO: all views could not be testable, waiting modular code before implement units tests on them
-
-import './unit/qunit-utils.js';
-
-//editor
-import './unit/editor/Command.tests';
-import './unit/editor/Config.tests';
-import './unit/editor/Editor.tests';
-import './unit/editor/History.tests';
-import './unit/editor/Loader.tests';
-import './unit/editor/Player.tests';
-import './unit/editor/Script.tests';
-
-import './unit/editor/Menubar.tests';
-import './unit/editor/Menubar.Add.tests';
-import './unit/editor/Menubar.Edit.tests';
-import './unit/editor/Menubar.Examples.tests';
-import './unit/editor/Menubar.File.tests';
-import './unit/editor/Menubar.Help.tests';
-import './unit/editor/Menubar.Play.tests';
-import './unit/editor/Menubar.Status.tests';
-import './unit/editor/Menubar.View.tests';
-
-import './unit/editor/Sidebar.tests';
-import './unit/editor/Sidebar.Animation.tests';
-import './unit/editor/Sidebar.Geometry.tests';
-import './unit/editor/Sidebar.Geometry.BoxGeometry.tests';
-import './unit/editor/Sidebar.Geometry.BufferGeometry.tests';
-import './unit/editor/Sidebar.Geometry.CircleGeometry.tests';
-import './unit/editor/Sidebar.Geometry.CylinderGeometry.tests';
-import './unit/editor/Sidebar.Geometry.Geometry.tests';
-import './unit/editor/Sidebar.Geometry.IcosahedronGeometry.tests';
-import './unit/editor/Sidebar.Geometry.LatheGeometry.tests';
-import './unit/editor/Sidebar.Geometry.Modifiers.tests';
-import './unit/editor/Sidebar.Geometry.PlaneGeometry.tests';
-import './unit/editor/Sidebar.Geometry.SphereGeometry.tests';
-import './unit/editor/Sidebar.Geometry.TeapotBufferGeometry.tests';
-import './unit/editor/Sidebar.Geometry.TorusGeometry.tests';
-import './unit/editor/Sidebar.Geometry.TorusKnotGeometry.tests';
-import './unit/editor/Sidebar.History.tests';
-import './unit/editor/Sidebar.Material.tests';
-import './unit/editor/Sidebar.Object.tests';
-import './unit/editor/Sidebar.Project.tests';
-import './unit/editor/Sidebar.Properties.tests';
-import './unit/editor/Sidebar.Scene.tests';
-import './unit/editor/Sidebar.Script.tests';
-import './unit/editor/Sidebar.Settings.tests';
-
-import './unit/editor/Storage.tests';
-import './unit/editor/Toolbar.tests';
-import './unit/editor/Viewport.tests';
-import './unit/editor/Viewport.Info.tests';
-
-//editor/commands
-import './unit/editor/commands/AddObjectCommand.tests';
-import './unit/editor/commands/AddScriptCommand.tests';
-import './unit/editor/commands/MoveObjectCommand.tests';
-import './unit/editor/commands/MultiCmdsCommand.tests';
-import './unit/editor/commands/RemoveObjectCommand.tests';
-import './unit/editor/commands/RemoveScriptCommand.tests';
-import './unit/editor/commands/SetColorCommand.tests';
-import './unit/editor/commands/SetGeometryCommand.tests';
-import './unit/editor/commands/SetGeometryValueCommand.tests';
-import './unit/editor/commands/SetMaterialColorCommand.tests';
-import './unit/editor/commands/SetMaterialCommand.tests';
-import './unit/editor/commands/SetMaterialMapCommand.tests';
-import './unit/editor/commands/SetMaterialValueCommand.tests';
-import './unit/editor/commands/SetPositionCommand.tests';
-import './unit/editor/commands/SetRotationCommand.tests';
-import './unit/editor/commands/SetScaleCommand.tests';
-import './unit/editor/commands/SetSceneCommand.tests';
-import './unit/editor/commands/SetScriptValueCommand.tests';
-import './unit/editor/commands/SetUuidCommand.tests';
-import './unit/editor/commands/SetValueCommand.tests';
-
-//editor/others

+ 0 - 10
test/three.example.unit.js

@@ -1,10 +0,0 @@
-/**
- * @author TristanVALCKE / https://github.com/Itee
- */
-
-import './unit/qunit-utils.js';
-
-import './unit/example/utils/BufferGeometryUtils.tests';
-import './unit/example/exporters/GLTFExporter.tests';
-import './unit/example/loaders/GLTFLoader.tests';
-import './unit/example/objects/Lensflare.tests';

+ 0 - 280
test/three.source.unit.js

@@ -1,280 +0,0 @@
-/**
- * @author TristanVALCKE / https://github.com/Itee
- */
-
-import './unit/qunit-utils.js';
-
-//src
-import './unit/src/constants.tests';
-import './unit/src/polyfills.tests';
-import './unit/src/utils.tests';
-
-
-//src/animation
-import './unit/src/animation/AnimationAction.tests';
-import './unit/src/animation/AnimationClip.tests';
-import './unit/src/animation/AnimationMixer.tests';
-import './unit/src/animation/AnimationObjectGroup.tests';
-import './unit/src/animation/AnimationUtils.tests';
-import './unit/src/animation/KeyframeTrack.tests';
-import './unit/src/animation/PropertyBinding.tests';
-import './unit/src/animation/PropertyMixer.tests';
-
-//src/animation/tracks
-import './unit/src/animation/tracks/BooleanKeyframeTrack.tests';
-import './unit/src/animation/tracks/ColorKeyframeTrack.tests';
-import './unit/src/animation/tracks/NumberKeyframeTrack.tests';
-import './unit/src/animation/tracks/QuaternionKeyframeTrack.tests';
-import './unit/src/animation/tracks/StringKeyframeTrack.tests';
-import './unit/src/animation/tracks/VectorKeyframeTrack.tests';
-
-
-//src/audio
-import './unit/src/audio/Audio.tests';
-import './unit/src/audio/AudioAnalyser.tests';
-import './unit/src/audio/AudioContext.tests';
-import './unit/src/audio/AudioListener.tests';
-import './unit/src/audio/PositionalAudio.tests';
-
-
-//src/cameras
-import './unit/src/cameras/ArrayCamera.tests';
-import './unit/src/cameras/Camera.tests';
-import './unit/src/cameras/CubeCamera.tests';
-import './unit/src/cameras/OrthographicCamera.tests';
-import './unit/src/cameras/PerspectiveCamera.tests';
-import './unit/src/cameras/StereoCamera.tests';
-
-
-//src/core
-import './unit/src/core/BufferAttribute.tests';
-import './unit/src/core/BufferGeometry.tests';
-import './unit/src/core/Clock.tests';
-import './unit/src/core/DirectGeometry.tests';
-import './unit/src/core/EventDispatcher.tests';
-import './unit/src/core/Face3.tests';
-import './unit/src/core/Geometry.tests';
-import './unit/src/core/InstancedBufferAttribute.tests';
-import './unit/src/core/InstancedBufferGeometry.tests';
-import './unit/src/core/InstancedInterleavedBuffer.tests';
-import './unit/src/core/InterleavedBuffer.tests';
-import './unit/src/core/InterleavedBufferAttribute.tests';
-import './unit/src/core/Layers.tests';
-import './unit/src/core/Object3D.tests';
-import './unit/src/core/Raycaster.tests';
-import './unit/src/core/Uniform.tests';
-
-
-//src/extras
-import './unit/src/extras/ShapeUtils.tests';
-
-//src/extras/core
-import './unit/src/extras/core/Curve.tests';
-import './unit/src/extras/core/CurvePath.tests';
-import './unit/src/extras/core/Font.tests';
-import './unit/src/extras/core/Interpolations.tests';
-import './unit/src/extras/core/Path.tests';
-import './unit/src/extras/core/Shape.tests';
-import './unit/src/extras/core/ShapePath.tests';
-
-//src/extras/curves
-import './unit/src/extras/curves/ArcCurve.tests';
-import './unit/src/extras/curves/CatmullRomCurve3.tests';
-import './unit/src/extras/curves/CubicBezierCurve.tests';
-import './unit/src/extras/curves/CubicBezierCurve3.tests';
-import './unit/src/extras/curves/EllipseCurve.tests';
-import './unit/src/extras/curves/LineCurve.tests';
-import './unit/src/extras/curves/LineCurve3.tests';
-import './unit/src/extras/curves/QuadraticBezierCurve.tests';
-import './unit/src/extras/curves/QuadraticBezierCurve3.tests';
-import './unit/src/extras/curves/SplineCurve.tests';
-
-//src/extras/objects
-import './unit/src/extras/objects/ImmediateRenderObject.tests';
-
-
-//src/geometries
-import './unit/src/geometries/BoxGeometry.tests';
-import './unit/src/geometries/CircleGeometry.tests';
-import './unit/src/geometries/ConeGeometry.tests';
-import './unit/src/geometries/CylinderGeometry.tests';
-import './unit/src/geometries/DodecahedronGeometry.tests';
-import './unit/src/geometries/EdgesGeometry.tests';
-import './unit/src/geometries/ExtrudeGeometry.tests';
-import './unit/src/geometries/IcosahedronGeometry.tests';
-import './unit/src/geometries/LatheGeometry.tests';
-import './unit/src/geometries/OctahedronGeometry.tests';
-import './unit/src/geometries/ParametricGeometry.tests';
-import './unit/src/geometries/PlaneGeometry.tests';
-import './unit/src/geometries/PolyhedronGeometry.tests';
-import './unit/src/geometries/RingGeometry.tests';
-import './unit/src/geometries/ShapeGeometry.tests';
-import './unit/src/geometries/SphereGeometry.tests';
-import './unit/src/geometries/TetrahedronGeometry.tests';
-import './unit/src/geometries/TextGeometry.tests';
-import './unit/src/geometries/TorusGeometry.tests';
-import './unit/src/geometries/TorusKnotGeometry.tests';
-import './unit/src/geometries/TubeGeometry.tests';
-import './unit/src/geometries/WireframeGeometry.tests';
-
-
-//src/helpers
-import './unit/src/helpers/ArrowHelper.tests';
-import './unit/src/helpers/AxesHelper.tests';
-import './unit/src/helpers/Box3Helper.tests';
-import './unit/src/helpers/BoxHelper.tests';
-import './unit/src/helpers/CameraHelper.tests';
-import './unit/src/helpers/DirectionalLightHelper.tests';
-import './unit/src/helpers/GridHelper.tests';
-import './unit/src/helpers/HemisphereLightHelper.tests';
-import './unit/src/helpers/PlaneHelper.tests';
-import './unit/src/helpers/PointLightHelper.tests';
-import './unit/src/helpers/PolarGridHelper.tests';
-import './unit/src/helpers/SkeletonHelper.tests';
-import './unit/src/helpers/SpotLightHelper.tests';
-
-
-//src/lights
-import './unit/src/lights/AmbientLight.tests';
-import './unit/src/lights/DirectionalLight.tests';
-import './unit/src/lights/DirectionalLightShadow.tests';
-import './unit/src/lights/HemisphereLight.tests';
-import './unit/src/lights/Light.tests';
-import './unit/src/lights/LightShadow.tests';
-import './unit/src/lights/PointLight.tests';
-import './unit/src/lights/RectAreaLight.tests';
-import './unit/src/lights/SpotLight.tests';
-import './unit/src/lights/SpotLightShadow.tests';
-
-
-//src/loaders
-import './unit/src/loaders/AnimationLoader.tests';
-import './unit/src/loaders/AudioLoader.tests';
-import './unit/src/loaders/BufferGeometryLoader.tests';
-import './unit/src/loaders/Cache.tests';
-import './unit/src/loaders/CompressedTextureLoader.tests';
-import './unit/src/loaders/CubeTextureLoader.tests';
-import './unit/src/loaders/DataTextureLoader.tests';
-import './unit/src/loaders/FileLoader.tests';
-import './unit/src/loaders/FontLoader.tests';
-import './unit/src/loaders/ImageLoader.tests';
-import './unit/src/loaders/Loader.tests';
-import './unit/src/loaders/LoaderUtils.tests';
-import './unit/src/loaders/LoadingManager.tests';
-import './unit/src/loaders/MaterialLoader.tests';
-import './unit/src/loaders/ObjectLoader.tests';
-import './unit/src/loaders/TextureLoader.tests';
-
-
-//src/materials
-import './unit/src/materials/LineBasicMaterial.tests';
-import './unit/src/materials/LineDashedMaterial.tests';
-import './unit/src/materials/Material.tests';
-import './unit/src/materials/MeshBasicMaterial.tests';
-import './unit/src/materials/MeshDepthMaterial.tests';
-import './unit/src/materials/MeshDistanceMaterial.tests';
-import './unit/src/materials/MeshLambertMaterial.tests';
-import './unit/src/materials/MeshNormalMaterial.tests';
-import './unit/src/materials/MeshPhongMaterial.tests';
-import './unit/src/materials/MeshPhysicalMaterial.tests';
-import './unit/src/materials/MeshStandardMaterial.tests';
-import './unit/src/materials/MeshToonMaterial.tests';
-import './unit/src/materials/PointsMaterial.tests';
-import './unit/src/materials/RawShaderMaterial.tests';
-import './unit/src/materials/ShaderMaterial.tests';
-import './unit/src/materials/ShadowMaterial.tests';
-import './unit/src/materials/SpriteMaterial.tests';
-
-
-//src/math
-import './unit/src/math/Box2.tests';
-import './unit/src/math/Box3.tests';
-import './unit/src/math/Color.tests';
-import './unit/src/math/Cylindrical.tests';
-import './unit/src/math/Euler.tests';
-import './unit/src/math/Frustum.tests';
-import './unit/src/math/Interpolant.tests';
-import './unit/src/math/Line3.tests';
-import './unit/src/math/MathUtils.tests';
-import './unit/src/math/Matrix3.tests';
-import './unit/src/math/Matrix4.tests';
-import './unit/src/math/Plane.tests';
-import './unit/src/math/Quaternion.tests';
-import './unit/src/math/Ray.tests';
-import './unit/src/math/Sphere.tests';
-import './unit/src/math/Spherical.tests';
-import './unit/src/math/Triangle.tests';
-import './unit/src/math/Vector2.tests';
-import './unit/src/math/Vector3.tests';
-import './unit/src/math/Vector4.tests';
-
-//src/math/interpolants
-import './unit/src/math/interpolants/CubicInterpolant.tests';
-import './unit/src/math/interpolants/DiscreteInterpolant.tests';
-import './unit/src/math/interpolants/LinearInterpolant.tests';
-import './unit/src/math/interpolants/QuaternionLinearInterpolant.tests';
-
-
-//src/objects
-import './unit/src/objects/Bone.tests';
-import './unit/src/objects/Group.tests';
-import './unit/src/objects/Line.tests';
-import './unit/src/objects/LineLoop.tests';
-import './unit/src/objects/LineSegments.tests';
-import './unit/src/objects/LOD.tests';
-import './unit/src/objects/Mesh.tests';
-import './unit/src/objects/Points.tests';
-import './unit/src/objects/Skeleton.tests';
-import './unit/src/objects/SkinnedMesh.tests';
-import './unit/src/objects/Sprite.tests';
-
-
-//src/renderers
-import './unit/src/renderers/WebGLRenderer.tests';
-import './unit/src/renderers/WebGLRenderTarget.tests';
-import './unit/src/renderers/WebGLCubeRenderTarget.tests';
-
-//src/renderers/shaders
-import './unit/src/renderers/shaders/ShaderChunk.tests';
-import './unit/src/renderers/shaders/ShaderLib.tests';
-import './unit/src/renderers/shaders/UniformsLib.tests';
-import './unit/src/renderers/shaders/UniformsUtils.tests';
-
-//src/renderers/webgl
-import './unit/src/renderers/webgl/WebGLAttributes.tests';
-import './unit/src/renderers/webgl/WebGLBackground.tests';
-import './unit/src/renderers/webgl/WebGLBufferRenderer.tests';
-import './unit/src/renderers/webgl/WebGLCapabilities.tests';
-import './unit/src/renderers/webgl/WebGLClipping.tests';
-import './unit/src/renderers/webgl/WebGLExtensions.tests';
-import './unit/src/renderers/webgl/WebGLGeometries.tests';
-import './unit/src/renderers/webgl/WebGLIndexedBufferRenderer.tests';
-import './unit/src/renderers/webgl/WebGLLights.tests';
-import './unit/src/renderers/webgl/WebGLMorphtargets.tests';
-import './unit/src/renderers/webgl/WebGLObjects.tests';
-import './unit/src/renderers/webgl/WebGLProgram.tests';
-import './unit/src/renderers/webgl/WebGLPrograms.tests';
-import './unit/src/renderers/webgl/WebGLProperties.tests';
-import './unit/src/renderers/webgl/WebGLRenderLists.tests';
-import './unit/src/renderers/webgl/WebGLShader.tests';
-import './unit/src/renderers/webgl/WebGLShadowMap.tests';
-import './unit/src/renderers/webgl/WebGLState.tests';
-import './unit/src/renderers/webgl/WebGLTextures.tests';
-import './unit/src/renderers/webgl/WebGLUniforms.tests';
-import './unit/src/renderers/webgl/WebGLUtils.tests';
-
-
-//src/scenes
-import './unit/src/scenes/Fog.tests';
-import './unit/src/scenes/FogExp2.tests';
-import './unit/src/scenes/Scene.tests';
-
-
-//src/textures
-import './unit/src/textures/CanvasTexture.tests';
-import './unit/src/textures/CompressedTexture.tests';
-import './unit/src/textures/CubeTexture.tests';
-import './unit/src/textures/DataTexture.tests';
-import './unit/src/textures/DepthTexture.tests';
-import './unit/src/textures/Texture.tests';
-import './unit/src/textures/VideoTexture.tests';

+ 5 - 5
test/unit/UnitTests.html

@@ -3,22 +3,22 @@
     <head>
         <meta charset="utf-8">
         <title>ThreeJS Unit Tests - Using Files in /src</title>
-        <link rel="stylesheet" href="../../node_modules/qunit/qunit/qunit.css">
+        <link rel="stylesheet" href="../node_modules/qunit/qunit/qunit.css">
     </head>
     <body>
 
         <div id="qunit"></div>
         <div id="qunit-fixture"></div>
 
-        <script src="../../node_modules/qunit/qunit/qunit.js"></script>
+        <script src="../node_modules/qunit/qunit/qunit.js"></script>
 
         <!-- We need three.js because qunit-utils cannot be es6 module and use THREE stuff... -->
         <script src="../../build/three.js"></script>
 
         <!-- add sources to test below -->
-        <!-- <script src="three.editor.unit.js"></script> -->
-        <script src="three.source.unit.js"></script>
-        <script src="three.example.unit.js"></script>
+        <!-- <script src="build/three.editor.unit.js"></script> -->
+        <script src="build/three.source.unit.js"></script>
+        <script src="build/three.example.unit.js"></script>
 
     </body>
 </html>

+ 81 - 0
test/unit/three.editor.unit.js

@@ -0,0 +1,81 @@
+/**
+ * @author TristanVALCKE / https://github.com/Itee
+ */
+
+// TODO (Itee) Editor is not es6 module so care to include order !!!
+// TODO: all views could not be testable, waiting modular code before implement units tests on them
+
+import './qunit-utils.js';
+
+//editor
+import './editor/Command.tests';
+import './editor/Config.tests';
+import './editor/Editor.tests';
+import './editor/History.tests';
+import './editor/Loader.tests';
+import './editor/Player.tests';
+import './editor/Script.tests';
+
+import './editor/Menubar.tests';
+import './editor/Menubar.Add.tests';
+import './editor/Menubar.Edit.tests';
+import './editor/Menubar.Examples.tests';
+import './editor/Menubar.File.tests';
+import './editor/Menubar.Help.tests';
+import './editor/Menubar.Play.tests';
+import './editor/Menubar.Status.tests';
+import './editor/Menubar.View.tests';
+
+import './editor/Sidebar.tests';
+import './editor/Sidebar.Animation.tests';
+import './editor/Sidebar.Geometry.tests';
+import './editor/Sidebar.Geometry.BoxGeometry.tests';
+import './editor/Sidebar.Geometry.BufferGeometry.tests';
+import './editor/Sidebar.Geometry.CircleGeometry.tests';
+import './editor/Sidebar.Geometry.CylinderGeometry.tests';
+import './editor/Sidebar.Geometry.Geometry.tests';
+import './editor/Sidebar.Geometry.IcosahedronGeometry.tests';
+import './editor/Sidebar.Geometry.LatheGeometry.tests';
+import './editor/Sidebar.Geometry.Modifiers.tests';
+import './editor/Sidebar.Geometry.PlaneGeometry.tests';
+import './editor/Sidebar.Geometry.SphereGeometry.tests';
+import './editor/Sidebar.Geometry.TeapotBufferGeometry.tests';
+import './editor/Sidebar.Geometry.TorusGeometry.tests';
+import './editor/Sidebar.Geometry.TorusKnotGeometry.tests';
+import './editor/Sidebar.History.tests';
+import './editor/Sidebar.Material.tests';
+import './editor/Sidebar.Object.tests';
+import './editor/Sidebar.Project.tests';
+import './editor/Sidebar.Properties.tests';
+import './editor/Sidebar.Scene.tests';
+import './editor/Sidebar.Script.tests';
+import './editor/Sidebar.Settings.tests';
+
+import './editor/Storage.tests';
+import './editor/Toolbar.tests';
+import './editor/Viewport.tests';
+import './editor/Viewport.Info.tests';
+
+//editor/commands
+import './editor/commands/AddObjectCommand.tests';
+import './editor/commands/AddScriptCommand.tests';
+import './editor/commands/MoveObjectCommand.tests';
+import './editor/commands/MultiCmdsCommand.tests';
+import './editor/commands/RemoveObjectCommand.tests';
+import './editor/commands/RemoveScriptCommand.tests';
+import './editor/commands/SetColorCommand.tests';
+import './editor/commands/SetGeometryCommand.tests';
+import './editor/commands/SetGeometryValueCommand.tests';
+import './editor/commands/SetMaterialColorCommand.tests';
+import './editor/commands/SetMaterialCommand.tests';
+import './editor/commands/SetMaterialMapCommand.tests';
+import './editor/commands/SetMaterialValueCommand.tests';
+import './editor/commands/SetPositionCommand.tests';
+import './editor/commands/SetRotationCommand.tests';
+import './editor/commands/SetScaleCommand.tests';
+import './editor/commands/SetSceneCommand.tests';
+import './editor/commands/SetScriptValueCommand.tests';
+import './editor/commands/SetUuidCommand.tests';
+import './editor/commands/SetValueCommand.tests';
+
+//editor/others

+ 10 - 0
test/unit/three.example.unit.js

@@ -0,0 +1,10 @@
+/**
+ * @author TristanVALCKE / https://github.com/Itee
+ */
+
+import './qunit-utils.js';
+
+import './example/utils/BufferGeometryUtils.tests';
+import './example/exporters/GLTFExporter.tests';
+import './example/loaders/GLTFLoader.tests';
+import './example/objects/Lensflare.tests';

+ 280 - 0
test/unit/three.source.unit.js

@@ -0,0 +1,280 @@
+/**
+ * @author TristanVALCKE / https://github.com/Itee
+ */
+
+import './qunit-utils.js';
+
+//src
+import './src/constants.tests';
+import './src/polyfills.tests';
+import './src/utils.tests';
+
+
+//src/animation
+import './src/animation/AnimationAction.tests';
+import './src/animation/AnimationClip.tests';
+import './src/animation/AnimationMixer.tests';
+import './src/animation/AnimationObjectGroup.tests';
+import './src/animation/AnimationUtils.tests';
+import './src/animation/KeyframeTrack.tests';
+import './src/animation/PropertyBinding.tests';
+import './src/animation/PropertyMixer.tests';
+
+//src/animation/tracks
+import './src/animation/tracks/BooleanKeyframeTrack.tests';
+import './src/animation/tracks/ColorKeyframeTrack.tests';
+import './src/animation/tracks/NumberKeyframeTrack.tests';
+import './src/animation/tracks/QuaternionKeyframeTrack.tests';
+import './src/animation/tracks/StringKeyframeTrack.tests';
+import './src/animation/tracks/VectorKeyframeTrack.tests';
+
+
+//src/audio
+import './src/audio/Audio.tests';
+import './src/audio/AudioAnalyser.tests';
+import './src/audio/AudioContext.tests';
+import './src/audio/AudioListener.tests';
+import './src/audio/PositionalAudio.tests';
+
+
+//src/cameras
+import './src/cameras/ArrayCamera.tests';
+import './src/cameras/Camera.tests';
+import './src/cameras/CubeCamera.tests';
+import './src/cameras/OrthographicCamera.tests';
+import './src/cameras/PerspectiveCamera.tests';
+import './src/cameras/StereoCamera.tests';
+
+
+//src/core
+import './src/core/BufferAttribute.tests';
+import './src/core/BufferGeometry.tests';
+import './src/core/Clock.tests';
+import './src/core/DirectGeometry.tests';
+import './src/core/EventDispatcher.tests';
+import './src/core/Face3.tests';
+import './src/core/Geometry.tests';
+import './src/core/InstancedBufferAttribute.tests';
+import './src/core/InstancedBufferGeometry.tests';
+import './src/core/InstancedInterleavedBuffer.tests';
+import './src/core/InterleavedBuffer.tests';
+import './src/core/InterleavedBufferAttribute.tests';
+import './src/core/Layers.tests';
+import './src/core/Object3D.tests';
+import './src/core/Raycaster.tests';
+import './src/core/Uniform.tests';
+
+
+//src/extras
+import './src/extras/ShapeUtils.tests';
+
+//src/extras/core
+import './src/extras/core/Curve.tests';
+import './src/extras/core/CurvePath.tests';
+import './src/extras/core/Font.tests';
+import './src/extras/core/Interpolations.tests';
+import './src/extras/core/Path.tests';
+import './src/extras/core/Shape.tests';
+import './src/extras/core/ShapePath.tests';
+
+//src/extras/curves
+import './src/extras/curves/ArcCurve.tests';
+import './src/extras/curves/CatmullRomCurve3.tests';
+import './src/extras/curves/CubicBezierCurve.tests';
+import './src/extras/curves/CubicBezierCurve3.tests';
+import './src/extras/curves/EllipseCurve.tests';
+import './src/extras/curves/LineCurve.tests';
+import './src/extras/curves/LineCurve3.tests';
+import './src/extras/curves/QuadraticBezierCurve.tests';
+import './src/extras/curves/QuadraticBezierCurve3.tests';
+import './src/extras/curves/SplineCurve.tests';
+
+//src/extras/objects
+import './src/extras/objects/ImmediateRenderObject.tests';
+
+
+//src/geometries
+import './src/geometries/BoxGeometry.tests';
+import './src/geometries/CircleGeometry.tests';
+import './src/geometries/ConeGeometry.tests';
+import './src/geometries/CylinderGeometry.tests';
+import './src/geometries/DodecahedronGeometry.tests';
+import './src/geometries/EdgesGeometry.tests';
+import './src/geometries/ExtrudeGeometry.tests';
+import './src/geometries/IcosahedronGeometry.tests';
+import './src/geometries/LatheGeometry.tests';
+import './src/geometries/OctahedronGeometry.tests';
+import './src/geometries/ParametricGeometry.tests';
+import './src/geometries/PlaneGeometry.tests';
+import './src/geometries/PolyhedronGeometry.tests';
+import './src/geometries/RingGeometry.tests';
+import './src/geometries/ShapeGeometry.tests';
+import './src/geometries/SphereGeometry.tests';
+import './src/geometries/TetrahedronGeometry.tests';
+import './src/geometries/TextGeometry.tests';
+import './src/geometries/TorusGeometry.tests';
+import './src/geometries/TorusKnotGeometry.tests';
+import './src/geometries/TubeGeometry.tests';
+import './src/geometries/WireframeGeometry.tests';
+
+
+//src/helpers
+import './src/helpers/ArrowHelper.tests';
+import './src/helpers/AxesHelper.tests';
+import './src/helpers/Box3Helper.tests';
+import './src/helpers/BoxHelper.tests';
+import './src/helpers/CameraHelper.tests';
+import './src/helpers/DirectionalLightHelper.tests';
+import './src/helpers/GridHelper.tests';
+import './src/helpers/HemisphereLightHelper.tests';
+import './src/helpers/PlaneHelper.tests';
+import './src/helpers/PointLightHelper.tests';
+import './src/helpers/PolarGridHelper.tests';
+import './src/helpers/SkeletonHelper.tests';
+import './src/helpers/SpotLightHelper.tests';
+
+
+//src/lights
+import './src/lights/AmbientLight.tests';
+import './src/lights/DirectionalLight.tests';
+import './src/lights/DirectionalLightShadow.tests';
+import './src/lights/HemisphereLight.tests';
+import './src/lights/Light.tests';
+import './src/lights/LightShadow.tests';
+import './src/lights/PointLight.tests';
+import './src/lights/RectAreaLight.tests';
+import './src/lights/SpotLight.tests';
+import './src/lights/SpotLightShadow.tests';
+
+
+//src/loaders
+import './src/loaders/AnimationLoader.tests';
+import './src/loaders/AudioLoader.tests';
+import './src/loaders/BufferGeometryLoader.tests';
+import './src/loaders/Cache.tests';
+import './src/loaders/CompressedTextureLoader.tests';
+import './src/loaders/CubeTextureLoader.tests';
+import './src/loaders/DataTextureLoader.tests';
+import './src/loaders/FileLoader.tests';
+import './src/loaders/FontLoader.tests';
+import './src/loaders/ImageLoader.tests';
+import './src/loaders/Loader.tests';
+import './src/loaders/LoaderUtils.tests';
+import './src/loaders/LoadingManager.tests';
+import './src/loaders/MaterialLoader.tests';
+import './src/loaders/ObjectLoader.tests';
+import './src/loaders/TextureLoader.tests';
+
+
+//src/materials
+import './src/materials/LineBasicMaterial.tests';
+import './src/materials/LineDashedMaterial.tests';
+import './src/materials/Material.tests';
+import './src/materials/MeshBasicMaterial.tests';
+import './src/materials/MeshDepthMaterial.tests';
+import './src/materials/MeshDistanceMaterial.tests';
+import './src/materials/MeshLambertMaterial.tests';
+import './src/materials/MeshNormalMaterial.tests';
+import './src/materials/MeshPhongMaterial.tests';
+import './src/materials/MeshPhysicalMaterial.tests';
+import './src/materials/MeshStandardMaterial.tests';
+import './src/materials/MeshToonMaterial.tests';
+import './src/materials/PointsMaterial.tests';
+import './src/materials/RawShaderMaterial.tests';
+import './src/materials/ShaderMaterial.tests';
+import './src/materials/ShadowMaterial.tests';
+import './src/materials/SpriteMaterial.tests';
+
+
+//src/math
+import './src/math/Box2.tests';
+import './src/math/Box3.tests';
+import './src/math/Color.tests';
+import './src/math/Cylindrical.tests';
+import './src/math/Euler.tests';
+import './src/math/Frustum.tests';
+import './src/math/Interpolant.tests';
+import './src/math/Line3.tests';
+import './src/math/MathUtils.tests';
+import './src/math/Matrix3.tests';
+import './src/math/Matrix4.tests';
+import './src/math/Plane.tests';
+import './src/math/Quaternion.tests';
+import './src/math/Ray.tests';
+import './src/math/Sphere.tests';
+import './src/math/Spherical.tests';
+import './src/math/Triangle.tests';
+import './src/math/Vector2.tests';
+import './src/math/Vector3.tests';
+import './src/math/Vector4.tests';
+
+//src/math/interpolants
+import './src/math/interpolants/CubicInterpolant.tests';
+import './src/math/interpolants/DiscreteInterpolant.tests';
+import './src/math/interpolants/LinearInterpolant.tests';
+import './src/math/interpolants/QuaternionLinearInterpolant.tests';
+
+
+//src/objects
+import './src/objects/Bone.tests';
+import './src/objects/Group.tests';
+import './src/objects/Line.tests';
+import './src/objects/LineLoop.tests';
+import './src/objects/LineSegments.tests';
+import './src/objects/LOD.tests';
+import './src/objects/Mesh.tests';
+import './src/objects/Points.tests';
+import './src/objects/Skeleton.tests';
+import './src/objects/SkinnedMesh.tests';
+import './src/objects/Sprite.tests';
+
+
+//src/renderers
+import './src/renderers/WebGLRenderer.tests';
+import './src/renderers/WebGLRenderTarget.tests';
+import './src/renderers/WebGLCubeRenderTarget.tests';
+
+//src/renderers/shaders
+import './src/renderers/shaders/ShaderChunk.tests';
+import './src/renderers/shaders/ShaderLib.tests';
+import './src/renderers/shaders/UniformsLib.tests';
+import './src/renderers/shaders/UniformsUtils.tests';
+
+//src/renderers/webgl
+import './src/renderers/webgl/WebGLAttributes.tests';
+import './src/renderers/webgl/WebGLBackground.tests';
+import './src/renderers/webgl/WebGLBufferRenderer.tests';
+import './src/renderers/webgl/WebGLCapabilities.tests';
+import './src/renderers/webgl/WebGLClipping.tests';
+import './src/renderers/webgl/WebGLExtensions.tests';
+import './src/renderers/webgl/WebGLGeometries.tests';
+import './src/renderers/webgl/WebGLIndexedBufferRenderer.tests';
+import './src/renderers/webgl/WebGLLights.tests';
+import './src/renderers/webgl/WebGLMorphtargets.tests';
+import './src/renderers/webgl/WebGLObjects.tests';
+import './src/renderers/webgl/WebGLProgram.tests';
+import './src/renderers/webgl/WebGLPrograms.tests';
+import './src/renderers/webgl/WebGLProperties.tests';
+import './src/renderers/webgl/WebGLRenderLists.tests';
+import './src/renderers/webgl/WebGLShader.tests';
+import './src/renderers/webgl/WebGLShadowMap.tests';
+import './src/renderers/webgl/WebGLState.tests';
+import './src/renderers/webgl/WebGLTextures.tests';
+import './src/renderers/webgl/WebGLUniforms.tests';
+import './src/renderers/webgl/WebGLUtils.tests';
+
+
+//src/scenes
+import './src/scenes/Fog.tests';
+import './src/scenes/FogExp2.tests';
+import './src/scenes/Scene.tests';
+
+
+//src/textures
+import './src/textures/CanvasTexture.tests';
+import './src/textures/CompressedTexture.tests';
+import './src/textures/CubeTexture.tests';
+import './src/textures/DataTexture.tests';
+import './src/textures/DepthTexture.tests';
+import './src/textures/Texture.tests';
+import './src/textures/VideoTexture.tests';

+ 2 - 2
test/unit/unittests_editor_toRemoveAfterEditorES6Refactoring.html

@@ -3,14 +3,14 @@
 <head>
   <meta charset="utf-8">
   <title>ThreeJS Unit Tests - Using Files in /editor</title>
-  <link rel="stylesheet" href="../../node_modules/qunit/qunit/qunit.css">
+  <link rel="stylesheet" href="../node_modules/qunit/qunit/qunit.css">
 </head>
 <body>
 
   <div id="qunit"></div>
   <div id="qunit-fixture"></div>
 
-  <script src="../../node_modules/qunit/qunit/qunit.js"></script>
+  <script src="../node_modules/qunit/qunit/qunit.js"></script>
   <script src="qunit-utils.js"></script>
   <script src="SmartComparer.js"></script>
 

Деякі файли не було показано, через те що забагато файлів було змінено