0
0
mirror of https://github.com/twbs/bootstrap.git synced 2025-02-19 16:54:24 +01:00

Update dependencies.

This commit is contained in:
Bardi Harborow 2017-03-20 05:07:18 +00:00
parent 38f89726b9
commit 09fb2b9af3
20 changed files with 8963 additions and 312 deletions

View File

@ -49,7 +49,7 @@ cdn:
css_hash: "sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ"
js: https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js
js_hash: "sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn"
jquery: https://code.jquery.com/jquery-3.1.1.slim.min.js
jquery_hash: "sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n"
jquery: https://code.jquery.com/jquery-3.2.0.slim.min.js
jquery_hash: "sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt"
tether: https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js
tether_hash: "sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb"

File diff suppressed because one or more lines are too long

View File

@ -116,7 +116,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../assets/js/vendor/holder.min.js"></script>

View File

@ -156,7 +156,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -174,7 +174,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -58,7 +58,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -252,7 +252,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -91,7 +91,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -94,7 +94,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -54,7 +54,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -54,7 +54,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -192,7 +192,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -125,7 +125,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -64,7 +64,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -62,7 +62,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -37,7 +37,7 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.2.0.slim.min.js" integrity="sha384-1IgS1w1Tef85fCJ4P3BUG2mk9zC/mUicyWWxzNPI1PIVe8Tnq0XHGbE6gWOTyBgt" crossorigin="anonymous"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="../../dist/js/bootstrap.min.js"></script>

View File

@ -49,9 +49,9 @@
}
},
"ajv": {
"version": "4.11.4",
"version": "4.11.5",
"from": "ajv@>=4.7.0 <5.0.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.4.tgz",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.5.tgz",
"dev": true
},
"ajv-keywords": {
@ -249,9 +249,9 @@
"dev": true
},
"babel-core": {
"version": "6.23.1",
"version": "6.24.0",
"from": "babel-core@>=6.0.12 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.23.1.tgz",
"resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.0.tgz",
"dev": true
},
"babel-eslint": {
@ -261,9 +261,9 @@
"dev": true
},
"babel-generator": {
"version": "6.23.0",
"from": "babel-generator@>=6.23.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.23.0.tgz",
"version": "6.24.0",
"from": "babel-generator@>=6.24.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.0.tgz",
"dev": true,
"dependencies": {
"jsesc": {
@ -401,15 +401,15 @@
"dev": true
},
"babel-plugin-transform-es2015-modules-amd": {
"version": "6.22.0",
"from": "babel-plugin-transform-es2015-modules-amd@>=6.22.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz",
"version": "6.24.0",
"from": "babel-plugin-transform-es2015-modules-amd@>=6.24.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.0.tgz",
"dev": true
},
"babel-plugin-transform-es2015-modules-commonjs": {
"version": "6.23.0",
"from": "babel-plugin-transform-es2015-modules-commonjs@>=6.22.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz",
"version": "6.24.0",
"from": "babel-plugin-transform-es2015-modules-commonjs@>=6.24.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.0.tgz",
"dev": true
},
"babel-plugin-transform-es2015-modules-strip": {
@ -425,9 +425,9 @@
"dev": true
},
"babel-plugin-transform-es2015-modules-umd": {
"version": "6.23.0",
"from": "babel-plugin-transform-es2015-modules-umd@>=6.22.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.23.0.tgz",
"version": "6.24.0",
"from": "babel-plugin-transform-es2015-modules-umd@>=6.24.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.0.tgz",
"dev": true
},
"babel-plugin-transform-es2015-object-super": {
@ -491,15 +491,15 @@
"dev": true
},
"babel-preset-es2015": {
"version": "6.22.0",
"from": "babel-preset-es2015@>=6.22.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.22.0.tgz",
"version": "6.24.0",
"from": "babel-preset-es2015@>=6.24.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.0.tgz",
"dev": true
},
"babel-register": {
"version": "6.23.0",
"from": "babel-register@>=6.23.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.23.0.tgz",
"version": "6.24.0",
"from": "babel-register@>=6.24.0 <7.0.0",
"resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.0.tgz",
"dev": true
},
"babel-runtime": {
@ -712,9 +712,9 @@
"dev": true
},
"caniuse-db": {
"version": "1.0.30000634",
"version": "1.0.30000637",
"from": "caniuse-db@>=1.0.30000634 <2.0.0",
"resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000634.tgz",
"resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000637.tgz",
"dev": true
},
"caseless": {
@ -762,15 +762,15 @@
"dev": true
},
"clean-css": {
"version": "4.0.8",
"from": "clean-css@>=4.0.8 <5.0.0",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.0.8.tgz",
"version": "4.0.9",
"from": "clean-css@>=4.0.9 <5.0.0",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.0.9.tgz",
"dev": true
},
"clean-css-cli": {
"version": "4.0.8",
"from": "clean-css-cli@>=4.0.8 <5.0.0",
"resolved": "https://registry.npmjs.org/clean-css-cli/-/clean-css-cli-4.0.8.tgz",
"version": "4.0.9",
"from": "clean-css-cli@>=4.0.9 <5.0.0",
"resolved": "https://registry.npmjs.org/clean-css-cli/-/clean-css-cli-4.0.9.tgz",
"dev": true
},
"cli": {
@ -854,9 +854,9 @@
"dev": true
},
"compress-commons": {
"version": "1.1.0",
"version": "1.2.0",
"from": "compress-commons@>=1.1.0 <2.0.0",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.1.0.tgz",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz",
"dev": true
},
"concat-map": {
@ -867,7 +867,7 @@
},
"concat-stream": {
"version": "1.6.0",
"from": "concat-stream@>=1.4.6 <2.0.0",
"from": "concat-stream@>=1.5.2 <2.0.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
"dev": true
},
@ -948,9 +948,9 @@
"dev": true
},
"crc32-stream": {
"version": "1.0.1",
"from": "crc32-stream@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-1.0.1.tgz",
"version": "2.0.0",
"from": "crc32-stream@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
"dev": true
},
"cross-spawn": {
@ -986,9 +986,9 @@
"dev": true
},
"d": {
"version": "0.1.1",
"from": "d@>=0.1.1 <0.2.0",
"resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz",
"version": "1.0.0",
"from": "d@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
"dev": true
},
"dashdash": {
@ -1024,9 +1024,9 @@
"dev": true
},
"debug": {
"version": "2.6.2",
"version": "2.6.3",
"from": "debug@>=2.2.0 <3.0.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.2.tgz",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.3.tgz",
"dev": true
},
"decamelize": {
@ -1084,9 +1084,9 @@
"dev": true
},
"doctrine": {
"version": "1.5.0",
"from": "doctrine@>=1.2.2 <2.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
"version": "2.0.0",
"from": "doctrine@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz",
"dev": true
},
"dom-serializer": {
@ -1141,9 +1141,9 @@
"dev": true
},
"electron-to-chromium": {
"version": "1.2.6",
"version": "1.2.7",
"from": "electron-to-chromium@>=1.2.5 <2.0.0",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.2.6.tgz",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.2.7.tgz",
"dev": true
},
"encodeurl": {
@ -1153,18 +1153,10 @@
"dev": true
},
"end-of-stream": {
"version": "1.2.0",
"version": "1.4.0",
"from": "end-of-stream@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.2.0.tgz",
"dev": true,
"dependencies": {
"once": {
"version": "1.3.3",
"from": "once@>=1.3.0 <1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
"dev": true
}
}
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz",
"dev": true
},
"entities": {
"version": "1.0.0",
@ -1179,27 +1171,27 @@
"dev": true
},
"es5-ext": {
"version": "0.10.12",
"from": "es5-ext@>=0.10.11 <0.11.0",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.12.tgz",
"version": "0.10.14",
"from": "es5-ext@>=0.10.14 <0.11.0",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.14.tgz",
"dev": true
},
"es6-iterator": {
"version": "2.0.0",
"from": "es6-iterator@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz",
"version": "2.0.1",
"from": "es6-iterator@>=2.0.1 <2.1.0",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
"dev": true
},
"es6-map": {
"version": "0.1.4",
"version": "0.1.5",
"from": "es6-map@>=0.1.3 <0.2.0",
"resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.4.tgz",
"resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
"dev": true
},
"es6-object-assign": {
"version": "1.0.3",
"version": "1.1.0",
"from": "es6-object-assign@>=1.0.3 <2.0.0",
"resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.0.3.tgz",
"resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
"dev": true
},
"es6-promise": {
@ -1209,21 +1201,21 @@
"dev": true
},
"es6-set": {
"version": "0.1.4",
"from": "es6-set@>=0.1.3 <0.2.0",
"resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.4.tgz",
"version": "0.1.5",
"from": "es6-set@>=0.1.5 <0.2.0",
"resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
"dev": true
},
"es6-symbol": {
"version": "3.1.0",
"from": "es6-symbol@>=3.1.0 <3.2.0",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz",
"version": "3.1.1",
"from": "es6-symbol@>=3.1.1 <3.2.0",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
"dev": true
},
"es6-weak-map": {
"version": "2.0.1",
"version": "2.0.2",
"from": "es6-weak-map@>=2.0.1 <3.0.0",
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.1.tgz",
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
"dev": true
},
"escape-html": {
@ -1245,9 +1237,9 @@
"dev": true
},
"eslint": {
"version": "3.17.1",
"from": "eslint@>=3.17.1 <4.0.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-3.17.1.tgz",
"version": "3.18.0",
"from": "eslint@>=3.18.0 <4.0.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-3.18.0.tgz",
"dev": true
},
"espree": {
@ -1262,6 +1254,12 @@
"resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
"dev": true
},
"esquery": {
"version": "1.0.0",
"from": "esquery@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
"dev": true
},
"esrecurse": {
"version": "4.1.0",
"from": "esrecurse@>=4.1.0 <5.0.0",
@ -1295,9 +1293,9 @@
"dev": true
},
"event-emitter": {
"version": "0.3.4",
"from": "event-emitter@>=0.3.4 <0.4.0",
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz",
"version": "0.3.5",
"from": "event-emitter@>=0.3.5 <0.4.0",
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
"dev": true
},
"eventemitter2": {
@ -1951,9 +1949,9 @@
"dev": true
},
"hosted-git-info": {
"version": "2.2.0",
"version": "2.3.1",
"from": "hosted-git-info@>=2.1.4 <3.0.0",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.2.0.tgz",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.3.1.tgz",
"dev": true
},
"htmlhint": {
@ -2057,9 +2055,9 @@
"dev": true
},
"ignore": {
"version": "3.2.4",
"version": "3.2.6",
"from": "ignore@>=3.2.0 <4.0.0",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.4.tgz",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.6.tgz",
"dev": true
},
"iltorb": {
@ -2335,9 +2333,9 @@
"optional": true
},
"jquery": {
"version": "3.1.1",
"version": "3.2.0",
"from": "jquery@>=1.9.1",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.1.1.tgz"
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.0.tgz"
},
"js-base64": {
"version": "2.1.9",
@ -2451,10 +2449,18 @@
"dev": true
},
"jsprim": {
"version": "1.3.1",
"version": "1.4.0",
"from": "jsprim@>=1.2.2 <2.0.0",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz",
"dev": true
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
"dev": true,
"dependencies": {
"assert-plus": {
"version": "1.0.0",
"from": "assert-plus@1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"dev": true
}
}
},
"kew": {
"version": "0.7.0",
@ -2771,9 +2777,9 @@
"dev": true
},
"node-gyp": {
"version": "3.5.0",
"version": "3.6.0",
"from": "node-gyp@>=3.3.1 <4.0.0",
"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.5.0.tgz",
"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.0.tgz",
"dev": true
},
"node-sass": {
@ -3079,11 +3085,17 @@
"dev": true
},
"postcss-cli": {
"version": "3.0.0-beta",
"from": "postcss-cli@>=3.0.0-beta <4.0.0",
"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-3.0.0-beta.tgz",
"version": "3.0.0",
"from": "postcss-cli@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-3.0.0.tgz",
"dev": true,
"dependencies": {
"camelcase": {
"version": "3.0.0",
"from": "camelcase@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
"dev": true
},
"get-stdin": {
"version": "5.0.1",
"from": "get-stdin@>=5.0.1 <6.0.0",
@ -3095,6 +3107,18 @@
"from": "globby@>=6.1.0 <7.0.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
"dev": true
},
"yargs": {
"version": "7.0.2",
"from": "yargs@>=7.0.2 <8.0.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-7.0.2.tgz",
"dev": true
},
"yargs-parser": {
"version": "5.0.0",
"from": "yargs-parser@>=5.0.0 <6.0.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
"dev": true
}
}
},
@ -3251,9 +3275,9 @@
"dev": true
},
"readable-stream": {
"version": "2.2.3",
"version": "2.2.6",
"from": "readable-stream@>=2.2.2 <3.0.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.3.tgz",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.6.tgz",
"dev": true
},
"readdirp": {
@ -3615,9 +3639,9 @@
"dev": true
},
"source-map-support": {
"version": "0.4.11",
"version": "0.4.14",
"from": "source-map-support@>=0.4.2 <0.5.0",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.11.tgz",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.14.tgz",
"dev": true
},
"spdx-correct": {
@ -3903,9 +3927,9 @@
"dev": true
},
"uglify-js": {
"version": "2.8.12",
"from": "uglify-js@>=2.8.12 <3.0.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.12.tgz",
"version": "2.8.14",
"from": "uglify-js@>=2.8.14 <3.0.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.14.tgz",
"dev": true,
"dependencies": {
"camelcase": {
@ -4091,9 +4115,9 @@
"dev": true
},
"yallist": {
"version": "2.0.0",
"version": "2.1.2",
"from": "yallist@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"dev": true
},
"yargs": {

View File

@ -1,12 +1,12 @@
/*!
* QUnit 2.1.1
* QUnit 2.2.0
* https://qunitjs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2017-01-06T01:52Z
* Date: 2017-03-11T16:19Z
*/
/** Font Family and Sizes */
@ -384,6 +384,7 @@
background-color: #EBECE9;
}
#qunit-tests .qunit-todo-label,
#qunit-tests .qunit-skipped-label {
background-color: #F4FF77;
display: inline-block;
@ -394,6 +395,10 @@
margin: -0.4em 0.4em -0.4em 0;
}
#qunit-tests .qunit-todo-label {
background-color: #EEE;
}
/** Result */
#qunit-testresult {

View File

@ -1,12 +1,12 @@
/*!
* QUnit 2.1.1
* QUnit 2.2.0
* https://qunitjs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2017-01-06T01:52Z
* Date: 2017-03-11T16:19Z
*/
(function (global$1) {
'use strict';
@ -20,7 +20,17 @@
var document = window && window.document;
var navigator = window && window.navigator;
var sessionStorage = window && window.sessionStorage;
var sessionStorage = function () {
var x = "qunit-test-string";
try {
sessionStorage.setItem(x, x);
sessionStorage.removeItem(x);
return sessionStorage;
} catch (e) {
return undefined;
}
}();
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
return typeof obj;
@ -141,19 +151,16 @@
return result;
}
// From jquery.js
/**
* Determines whether an element exists in a given array or not.
*
* @method inArray
* @param {Any} elem
* @param {Array} array
* @return {Boolean}
*/
function inArray(elem, array) {
if (array.indexOf) {
return array.indexOf(elem);
}
for (var i = 0, length = array.length; i < length; i++) {
if (array[i] === elem) {
return i;
}
}
return -1;
return array.indexOf(elem) !== -1;
}
/**
@ -232,25 +239,25 @@
}
// Test for equality any JavaScript type.
// Author: Philippe Rathé <prathe@gmail.com>
// Authors: Philippe Rathé <prathe@gmail.com>, David Chan <david@troi.org>
var equiv = (function () {
// Stack to decide between skip/abort functions
var callers = [];
// Stack to avoiding loops from circular referencing
var parents = [];
var parentsB = [];
// Value pairs queued for comparison. Used for breadth-first processing order, recursion
// detection and avoiding repeated comparison (see below for details).
// Elements are { a: val, b: val }.
var pairs = [];
var getProto = Object.getPrototypeOf || function (obj) {
return obj.__proto__;
};
function useStrictEquality(b, a) {
function useStrictEquality(a, b) {
// To catch short annotation VS 'new' annotation of a declaration. e.g.:
// This only gets called if a and b are not strict equal, and is used to compare on
// the primitive values inside object wrappers. For example:
// `var i = 1;`
// `var j = new Number(1);`
// Neither a nor b can be null, as a !== b and they have the same type.
if ((typeof a === "undefined" ? "undefined" : _typeof(a)) === "object") {
a = a.valueOf();
}
@ -293,6 +300,31 @@
return "flags" in regexp ? regexp.flags : regexp.toString().match(/[gimuy]*$/)[0];
}
function isContainer(val) {
return ["object", "array", "map", "set"].indexOf(objectType(val)) !== -1;
}
function breadthFirstCompareChild(a, b) {
// If a is a container not reference-equal to b, postpone the comparison to the
// end of the pairs queue -- unless (a, b) has been seen before, in which case skip
// over the pair.
if (a === b) {
return true;
}
if (!isContainer(a)) {
return typeEquiv(a, b);
}
if (pairs.every(function (pair) {
return pair.a !== a || pair.b !== b;
})) {
// Not yet started comparing this pair
pairs.push({ a: a, b: b });
}
return true;
}
var callbacks = {
"string": useStrictEquality,
"boolean": useStrictEquality,
@ -306,24 +338,20 @@
return true;
},
"regexp": function regexp(b, a) {
"regexp": function regexp(a, b) {
return a.source === b.source &&
// Include flags in the comparison
getRegExpFlags(a) === getRegExpFlags(b);
},
// - skip when the property is a method of an instance (OOP)
// - abort otherwise,
// initial === would have catch identical references anyway
"function": function _function(b, a) {
var caller = callers[callers.length - 1];
return caller !== Object && typeof caller !== "undefined" && a.toString() === b.toString();
// abort (identical references / instance methods were skipped earlier)
"function": function _function() {
return false;
},
"array": function array(b, a) {
var i, j, len, loop, aCircular, bCircular;
"array": function array(a, b) {
var i, len;
len = a.length;
if (len !== b.length) {
@ -332,50 +360,63 @@
return false;
}
// Track reference to avoid circular references
parents.push(a);
parentsB.push(b);
for (i = 0; i < len; i++) {
loop = false;
for (j = 0; j < parents.length; j++) {
aCircular = parents[j] === a[i];
bCircular = parentsB[j] === b[i];
if (aCircular || bCircular) {
if (a[i] === b[i] || aCircular && bCircular) {
loop = true;
} else {
parents.pop();
parentsB.pop();
return false;
}
}
}
if (!loop && !innerEquiv(a[i], b[i])) {
parents.pop();
parentsB.pop();
// Compare non-containers; queue non-reference-equal containers
if (!breadthFirstCompareChild(a[i], b[i])) {
return false;
}
}
parents.pop();
parentsB.pop();
return true;
},
"set": function set$$1(b, a) {
// Define sets a and b to be equivalent if for each element aVal in a, there
// is some element bVal in b such that aVal and bVal are equivalent. Element
// repetitions are not counted, so these are equivalent:
// a = new Set( [ {}, [], [] ] );
// b = new Set( [ {}, {}, [] ] );
"set": function set$$1(a, b) {
var innerEq,
outerEq = true;
if (a.size !== b.size) {
// This optimization has certain quirks because of the lack of
// repetition counting. For instance, adding the same
// (reference-identical) element to two equivalent sets can
// make them non-equivalent.
return false;
}
a.forEach(function (aVal) {
// Short-circuit if the result is already known. (Using for...of
// with a break clause would be cleaner here, but it would cause
// a syntax error on older Javascript implementations even if
// Set is unused)
if (!outerEq) {
return;
}
innerEq = false;
b.forEach(function (bVal) {
var parentPairs;
// Likewise, short-circuit if the result is already known
if (innerEq) {
return;
}
// Swap out the global pairs list, as the nested call to
// innerEquiv will clobber its contents
parentPairs = pairs;
if (innerEquiv(bVal, aVal)) {
innerEq = true;
}
// Replace the global pairs list
pairs = parentPairs;
});
if (!innerEq) {
@ -386,21 +427,54 @@
return outerEq;
},
"map": function map(b, a) {
// Define maps a and b to be equivalent if for each key-value pair (aKey, aVal)
// in a, there is some key-value pair (bKey, bVal) in b such that
// [ aKey, aVal ] and [ bKey, bVal ] are equivalent. Key repetitions are not
// counted, so these are equivalent:
// a = new Map( [ [ {}, 1 ], [ {}, 1 ], [ [], 1 ] ] );
// b = new Map( [ [ {}, 1 ], [ [], 1 ], [ [], 1 ] ] );
"map": function map(a, b) {
var innerEq,
outerEq = true;
if (a.size !== b.size) {
// This optimization has certain quirks because of the lack of
// repetition counting. For instance, adding the same
// (reference-identical) key-value pair to two equivalent maps
// can make them non-equivalent.
return false;
}
a.forEach(function (aVal, aKey) {
// Short-circuit if the result is already known. (Using for...of
// with a break clause would be cleaner here, but it would cause
// a syntax error on older Javascript implementations even if
// Map is unused)
if (!outerEq) {
return;
}
innerEq = false;
b.forEach(function (bVal, bKey) {
var parentPairs;
// Likewise, short-circuit if the result is already known
if (innerEq) {
return;
}
// Swap out the global pairs list, as the nested call to
// innerEquiv will clobber its contents
parentPairs = pairs;
if (innerEquiv([bVal, bKey], [aVal, aKey])) {
innerEq = true;
}
// Replace the global pairs list
pairs = parentPairs;
});
if (!innerEq) {
@ -411,53 +485,32 @@
return outerEq;
},
"object": function object(b, a) {
var i, j, loop, aCircular, bCircular;
// Default to true
var eq = true;
var aProperties = [];
var bProperties = [];
"object": function object(a, b) {
var i,
aProperties = [],
bProperties = [];
if (compareConstructors(a, b) === false) {
return false;
}
// Stack constructor before traversing properties
callers.push(a.constructor);
// Track reference to avoid circular references
parents.push(a);
parentsB.push(b);
// Be strict: don't ensure hasOwnProperty and go deep
for (i in a) {
loop = false;
for (j = 0; j < parents.length; j++) {
aCircular = parents[j] === a[i];
bCircular = parentsB[j] === b[i];
if (aCircular || bCircular) {
if (a[i] === b[i] || aCircular && bCircular) {
loop = true;
} else {
eq = false;
break;
}
}
}
// Collect a's properties
aProperties.push(i);
if (!loop && !innerEquiv(a[i], b[i])) {
eq = false;
break;
// Skip OOP methods that look the same
if (a.constructor !== Object && typeof a.constructor !== "undefined" && typeof a[i] === "function" && typeof b[i] === "function" && a[i].toString() === b[i].toString()) {
continue;
}
// Compare non-containers; queue non-reference-equal containers
if (!breadthFirstCompareChild(a[i], b[i])) {
return false;
}
}
parents.pop();
parentsB.pop();
// Unstack, we are done
callers.pop();
for (i in b) {
// Collect b's properties
@ -465,28 +518,52 @@
}
// Ensures identical properties name
return eq && innerEquiv(aProperties.sort(), bProperties.sort());
return typeEquiv(aProperties.sort(), bProperties.sort());
}
};
function typeEquiv(a, b) {
var type = objectType(a);
return objectType(b) === type && callbacks[type](b, a);
// Callbacks for containers will append to the pairs queue to achieve breadth-first
// search order. The pairs queue is also used to avoid reprocessing any pair of
// containers that are reference-equal to a previously visited pair (a special case
// this being recursion detection).
//
// Because of this approach, once typeEquiv returns a false value, it should not be
// called again without clearing the pair queue else it may wrongly report a visited
// pair as being equivalent.
return objectType(b) === type && callbacks[type](a, b);
}
// The real equiv function
function innerEquiv(a, b) {
var i, pair;
// We're done when there's nothing more to compare
if (arguments.length < 2) {
return true;
}
// Require type-specific equality
return (a === b || typeEquiv(a, b)) && (
// Clear the global pair queue and add the top-level values being compared
pairs = [{ a: a, b: b }];
for (i = 0; i < pairs.length; i++) {
pair = pairs[i];
// Perform type-specific comparison on any pairs that are not strictly
// equal. For container types, that comparison will postpone comparison
// of any sub-container pair to the end of the pair queue. This gives
// breadth-first search order. It also avoids the reprocessing of
// reference-equal siblings, cousins etc, which can have a significant speed
// impact when comparing a container of small objects each of which has a
// reference to the same (singleton) large object.
if (pair.a !== pair.b && !typeEquiv(pair.a, pair.b)) {
return false;
}
}
// ...across all consecutive argument pairs
arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1)));
return arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1));
}
return innerEquiv;
@ -616,10 +693,10 @@
var res,
parser,
parserType,
inStack = inArray(obj, stack);
objIndex = stack.indexOf(obj);
if (inStack !== -1) {
return "recursion(" + (inStack - stack.length) + ")";
if (objIndex !== -1) {
return "recursion(" + (objIndex - stack.length) + ")";
}
objType = objType || this.typeOf(obj);
@ -749,7 +826,7 @@
nonEnumerableProperties = ["message", "name"];
for (i in nonEnumerableProperties) {
key = nonEnumerableProperties[i];
if (key in map && inArray(key, keys) < 0) {
if (key in map && !inArray(key, keys)) {
keys.push(key);
}
}
@ -843,6 +920,64 @@
return dump;
})();
var LISTENERS = Object.create(null);
var SUPPORTED_EVENTS = ["runStart", "suiteStart", "testStart", "assertion", "testEnd", "suiteEnd", "runEnd"];
/**
* Emits an event with the specified data to all currently registered listeners.
* Callbacks will fire in the order in which they are registered (FIFO). This
* function is not exposed publicly; it is used by QUnit internals to emit
* logging events.
*
* @private
* @method emit
* @param {String} eventName
* @param {Object} data
* @return {Void}
*/
function emit(eventName, data) {
if (objectType(eventName) !== "string") {
throw new TypeError("eventName must be a string when emitting an event");
}
// Clone the callbacks in case one of them registers a new callback
var originalCallbacks = LISTENERS[eventName];
var callbacks = originalCallbacks ? [].concat(toConsumableArray(originalCallbacks)) : [];
for (var i = 0; i < callbacks.length; i++) {
callbacks[i](data);
}
}
/**
* Registers a callback as a listener to the specified event.
*
* @public
* @method on
* @param {String} eventName
* @param {Function} callback
* @return {Void}
*/
function on(eventName, callback) {
if (objectType(eventName) !== "string") {
throw new TypeError("eventName must be a string when registering a listener");
} else if (!inArray(eventName, SUPPORTED_EVENTS)) {
var events = SUPPORTED_EVENTS.join(", ");
throw new Error("\"" + eventName + "\" is not a valid event; must be one of: " + events + ".");
} else if (objectType(callback) !== "function") {
throw new TypeError("callback must be a function when registering a listener");
}
if (!LISTENERS[eventName]) {
LISTENERS[eventName] = [];
}
// Don't register the same callback more than once
if (!inArray(callback, LISTENERS[eventName])) {
LISTENERS[eventName].push(callback);
}
}
// Register logging callbacks
function registerLoggingCallbacks(obj) {
var i,
@ -929,6 +1064,95 @@
return extractStacktrace(error, offset);
}
var TestReport = function () {
function TestReport(name, suite, options) {
classCallCheck(this, TestReport);
this.name = name;
this.suiteName = suite.name;
this.fullName = suite.fullName.concat(name);
this.runtime = 0;
this.assertions = [];
this.skipped = !!options.skip;
this.todo = !!options.todo;
this._startTime = 0;
this._endTime = 0;
suite.pushTest(this);
}
createClass(TestReport, [{
key: "start",
value: function start(recordTime) {
if (recordTime) {
this._startTime = Date.now();
}
return {
name: this.name,
suiteName: this.suiteName,
fullName: this.fullName.slice()
};
}
}, {
key: "end",
value: function end(recordTime) {
if (recordTime) {
this._endTime = Date.now();
}
return extend(this.start(), {
runtime: this.getRuntime(),
status: this.getStatus(),
errors: this.getFailedAssertions(),
assertions: this.getAssertions()
});
}
}, {
key: "pushAssertion",
value: function pushAssertion(assertion) {
this.assertions.push(assertion);
}
}, {
key: "getRuntime",
value: function getRuntime() {
return this._endTime - this._startTime;
}
}, {
key: "getStatus",
value: function getStatus() {
if (this.skipped) {
return "skipped";
}
var testPassed = this.getFailedAssertions().length > 0 ? this.todo : !this.todo;
if (!testPassed) {
return "failed";
} else if (this.todo) {
return "todo";
} else {
return "passed";
}
}
}, {
key: "getFailedAssertions",
value: function getFailedAssertions() {
return this.assertions.filter(function (assertion) {
return !assertion.passed;
});
}
}, {
key: "getAssertions",
value: function getAssertions() {
return this.assertions.slice();
}
}]);
return TestReport;
}();
var unitSampler;
var focused = false;
var priorityCount = 0;
@ -945,6 +1169,12 @@
this.usedAsync = false;
this.module = config.currentModule;
this.stack = sourceFromStacktrace(3);
this.steps = [];
this.testReport = new TestReport(settings.testName, this.module.suiteReport, {
todo: settings.todo,
skip: settings.skip
});
// Register unique strings
for (i = 0, l = this.module.tests; i < l.length; i++) {
@ -995,6 +1225,7 @@
for (i = notStartedModules.length - 1; i >= 0; i--) {
startModule = notStartedModules[i];
startModule.stats = { all: 0, bad: 0, started: now() };
emit("suiteStart", startModule.suiteReport.start(true));
runLoggingCallbacks("moduleStart", {
name: startModule.name,
tests: startModule.tests
@ -1012,6 +1243,7 @@
this.testEnvironment = extend({}, module.testEnvironment);
this.started = now();
emit("testStart", this.testReport.start(true));
runLoggingCallbacks("testStart", {
name: this.testName,
module: module.name,
@ -1129,6 +1361,7 @@
moduleName = module.name,
testName = this.testName,
skipped = !!this.skip,
todo = !!this.todo,
bad = 0,
storage = config.storage;
@ -1156,10 +1389,12 @@
}
}
emit("testEnd", this.testReport.end(true));
runLoggingCallbacks("testDone", {
name: testName,
module: moduleName,
skipped: skipped,
todo: todo,
failed: bad,
passed: this.assertions.length - bad,
total: this.assertions.length,
@ -1174,6 +1409,7 @@
});
if (module.testsRun === numberOfTests(module)) {
emit("suiteEnd", module.suiteReport.end(true));
runLoggingCallbacks("moduleDone", {
name: module.name,
tests: module.tests,
@ -1242,18 +1478,19 @@
expected: resultInfo.expected,
testId: this.testId,
negative: resultInfo.negative || false,
runtime: now() - this.started
runtime: now() - this.started,
todo: !!this.todo
};
if (!resultInfo.result) {
source = sourceFromStacktrace();
source = resultInfo.source || sourceFromStacktrace();
if (source) {
details.source = source;
}
}
runLoggingCallbacks("log", details);
this.logAssertion(details);
this.assertions.push({
result: !!resultInfo.result,
@ -1266,28 +1503,37 @@
throw new Error("pushFailure() assertion outside test context, was " + sourceFromStacktrace(2));
}
var details = {
module: this.module.name,
name: this.testName,
this.assert.pushResult({
result: false,
message: message || "error",
actual: actual || null,
testId: this.testId,
runtime: now() - this.started
};
if (source) {
details.source = source;
}
runLoggingCallbacks("log", details);
this.assertions.push({
result: false,
message: message
expected: null,
source: source
});
},
/**
* Log assertion details using both the old QUnit.log interface and
* QUnit.on( "assertion" ) interface.
*
* @private
*/
logAssertion: function logAssertion(details) {
runLoggingCallbacks("log", details);
var assertion = {
passed: details.result,
actual: details.actual,
expected: details.expected,
message: details.message,
stack: details.source,
todo: details.todo
};
this.testReport.pushAssertion(assertion);
emit("assertion", assertion);
},
resolvePromise: function resolvePromise(promise, phase) {
var then,
resume,
@ -1331,7 +1577,7 @@
}
function moduleChainIdMatch(testModule) {
return inArray(testModule.moduleId, config.moduleId) > -1 || testModule.parentModule && moduleChainIdMatch(testModule.parentModule);
return inArray(testModule.moduleId, config.moduleId) || testModule.parentModule && moduleChainIdMatch(testModule.parentModule);
}
// Internally-generated tests are always valid
@ -1344,7 +1590,7 @@
return false;
}
if (config.testId && config.testId.length > 0 && inArray(this.testId, config.testId) < 0) {
if (config.testId && config.testId.length > 0 && !inArray(this.testId, config.testId)) {
return false;
}
@ -1511,9 +1757,7 @@
return;
}
var newTest;
newTest = new Test({
var newTest = new Test({
testName: testName,
callback: callback
});
@ -1521,6 +1765,20 @@
newTest.queue();
}
function todo(testName, callback) {
if (focused) {
return;
}
var newTest = new Test({
testName: testName,
callback: callback,
todo: true
});
newTest.queue();
}
// Will be exposed as QUnit.skip
function skip(testName) {
if (focused) {
@ -1537,8 +1795,6 @@
// Will be exposed as QUnit.only
function only(testName, callback) {
var newTest;
if (focused) {
return;
}
@ -1546,7 +1802,7 @@
config.queue.length = 0;
focused = true;
newTest = new Test({
var newTest = new Test({
testName: testName,
callback: callback
});
@ -1653,6 +1909,24 @@
}
}
/**
* Returns a function that proxies to the given method name on the globals
* console object. The proxy will also detect if the console doesn't exist and
* will appropriately no-op. This allows support for IE9, which doesn't have a
* console if the developer tools are not open.
*/
function consoleProxy(method) {
return function () {
if (console) {
console[method].apply(console, arguments);
}
};
}
var Logger = {
warn: consoleProxy("warn")
};
var Assert = function () {
function Assert(testContext) {
classCallCheck(this, Assert);
@ -1662,11 +1936,34 @@
// Assert helpers
// Specify the number of expected assertions to guarantee that failed test
// (no assertions are run at all) don't slip through.
// Documents a "step", which is a string value, in a test as a passing assertion
createClass(Assert, [{
key: "step",
value: function step(message) {
var result = !!message;
this.test.steps.push(message);
return this.pushResult({
result: result,
message: message || "You must provide a message to assert.step"
});
}
// Verifies the steps in a test match a given array of string values
}, {
key: "verifySteps",
value: function verifySteps(steps, message) {
this.deepEqual(this.test.steps, steps, message);
}
// Specify the number of expected assertions to guarantee that failed test
// (no assertions are run at all) don't slip through.
}, {
key: "expect",
value: function expect(asserts) {
if (arguments.length === 1) {
@ -1714,7 +2011,7 @@
}, {
key: "push",
value: function push(result, actual, expected, message, negative) {
console.warn("assert.push is deprecated and will be removed in QUnit 3.0." + " Please use assert.pushResult instead (http://api.qunitjs.com/pushResult/).");
Logger.warn("assert.push is deprecated and will be removed in QUnit 3.0." + " Please use assert.pushResult instead (http://api.qunitjs.com/pushResult/).");
var currentAssert = this instanceof Assert ? this : config.current.assert;
return currentAssert.pushResult({
@ -2011,45 +2308,148 @@
}
}
(function () {
if (!defined.document) {
return;
var SuiteReport = function () {
function SuiteReport(name, parentSuite) {
classCallCheck(this, SuiteReport);
this.name = name;
this.fullName = parentSuite ? parentSuite.fullName.concat(name) : [];
this.tests = [];
this.childSuites = [];
if (parentSuite) {
parentSuite.pushChildSuite(this);
}
}
// `onErrorFnPrev` initialized at top of scope
// Preserve other handlers
var onErrorFnPrev = window.onerror;
// Cover uncaught exceptions
// Returning true will suppress the default browser handler,
// returning false will let it run.
window.onerror = function (error, filePath, linerNr) {
var ret = false;
if (onErrorFnPrev) {
ret = onErrorFnPrev(error, filePath, linerNr);
}
// Treat return value as window.onerror itself does,
// Only do our handling if not suppressed.
if (ret !== true) {
if (config.current) {
if (config.current.ignoreGlobalErrors) {
return true;
}
pushFailure(error, filePath + ":" + linerNr);
} else {
test("global failure", extend(function () {
pushFailure(error, filePath + ":" + linerNr);
}, { validTest: true }));
createClass(SuiteReport, [{
key: "start",
value: function start(recordTime) {
if (recordTime) {
this._startTime = Date.now();
}
return false;
}
return ret;
};
})();
return {
name: this.name,
fullName: this.fullName.slice(),
tests: this.tests.map(function (test) {
return test.start();
}),
childSuites: this.childSuites.map(function (suite) {
return suite.start();
}),
testCounts: {
total: this.getTestCounts().total
}
};
}
}, {
key: "end",
value: function end(recordTime) {
if (recordTime) {
this._endTime = Date.now();
}
return {
name: this.name,
fullName: this.fullName.slice(),
tests: this.tests.map(function (test) {
return test.end();
}),
childSuites: this.childSuites.map(function (suite) {
return suite.end();
}),
testCounts: this.getTestCounts(),
runtime: this.getRuntime(),
status: this.getStatus()
};
}
}, {
key: "pushChildSuite",
value: function pushChildSuite(suite) {
this.childSuites.push(suite);
}
}, {
key: "pushTest",
value: function pushTest(test) {
this.tests.push(test);
}
}, {
key: "getRuntime",
value: function getRuntime() {
return this._endTime - this._startTime;
}
}, {
key: "getTestCounts",
value: function getTestCounts() {
var counts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { passed: 0, failed: 0, skipped: 0, todo: 0, total: 0 };
counts = this.tests.reduce(function (counts, test) {
counts[test.getStatus()]++;
counts.total++;
return counts;
}, counts);
return this.childSuites.reduce(function (counts, suite) {
return suite.getTestCounts(counts);
}, counts);
}
}, {
key: "getStatus",
value: function getStatus() {
var _getTestCounts = this.getTestCounts(),
total = _getTestCounts.total,
failed = _getTestCounts.failed,
skipped = _getTestCounts.skipped,
todo = _getTestCounts.todo;
if (failed) {
return "failed";
} else {
if (skipped === total) {
return "skipped";
} else if (todo === total) {
return "todo";
} else {
return "passed";
}
}
}
}]);
return SuiteReport;
}();
// Handle an unhandled exception. By convention, returns true if further
// error handling should be suppressed and false otherwise.
// In this case, we will only suppress further error handling if the
// "ignoreGlobalErrors" configuration option is enabled.
function onError(error) {
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
if (config.current) {
if (config.current.ignoreGlobalErrors) {
return true;
}
pushFailure.apply(undefined, [error.message, error.fileName + ":" + error.lineNumber].concat(args));
} else {
test("global failure", extend(function () {
pushFailure.apply(undefined, [error.message, error.fileName + ":" + error.lineNumber].concat(args));
}, { validTest: true }));
}
return false;
}
var QUnit = {};
var globalSuite = new SuiteReport();
// The initial "currentModule" represents the global (or top-level) module that
// is not explicitly defined by the user, therefore we add the "globalSuite" to
// it since each module has a suiteReport associated with it.
config.currentModule.suiteReport = globalSuite;
var globalStartCalled = false;
var runStarted = false;
@ -2062,9 +2462,10 @@
QUnit.isLocal = !(defined.document && window.location.protocol !== "file:");
// Expose the current QUnit version
QUnit.version = "2.1.1";
QUnit.version = "2.2.0";
extend(QUnit, {
on: on,
// Call on start of module test to prepend name to all tests
module: function module(name, testEnvironment, executeNow) {
@ -2100,13 +2501,16 @@
function createModule() {
var parentModule = config.moduleStack.length ? config.moduleStack.slice(-1)[0] : null;
var moduleName = parentModule !== null ? [parentModule.name, name].join(" > ") : name;
var parentSuite = parentModule ? parentModule.suiteReport : globalSuite;
var module = {
name: moduleName,
parentModule: parentModule,
tests: [],
moduleId: generateHash(moduleName),
testsRun: 0,
childModules: []
childModules: [],
suiteReport: new SuiteReport(name, parentSuite)
};
var env = {};
@ -2130,6 +2534,8 @@
test: test,
todo: todo,
skip: skip,
only: only,
@ -2146,14 +2552,18 @@
throw new Error("Called start() outside of a test context too many times");
} else if (config.autostart) {
throw new Error("Called start() outside of a test context when " + "QUnit.config.autostart was true");
} else if (!defined.document && !config.pageLoaded) {
// Starts from Node even if .load was not previously called
QUnit.load();
} else if (!config.pageLoaded) {
// The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it
// The page isn't completely loaded yet, so we set autostart and then
// load if we're in Node or wait for the browser's load event.
config.autostart = true;
// Starts from Node even if .load was not previously called. We still return
// early otherwise we'll wind up "beginning" twice.
if (!defined.document) {
QUnit.load();
}
return;
}
} else {
@ -2195,7 +2605,9 @@
stack: function stack(offset) {
offset = (offset || 0) + 2;
return sourceFromStacktrace(offset);
}
},
onError: onError
});
QUnit.pushFailure = pushFailure;
@ -2244,6 +2656,7 @@
}
// The test run is officially beginning now
emit("runStart", globalSuite.start(true));
runLoggingCallbacks("begin", {
totalTests: Test.count,
modules: modulesLog
@ -2292,6 +2705,7 @@
runtime = now() - config.started;
passed = config.stats.all - config.stats.bad;
emit("runEnd", globalSuite.end(true));
runLoggingCallbacks("done", {
failed: config.stats.bad,
passed: passed,
@ -2456,6 +2870,13 @@
}
})();
var stats = {
passedTests: 0,
failedTests: 0,
skippedTests: 0,
todoTests: 0
};
// Escape text for attribute or text content.
function escapeText(s) {
if (!s) {
@ -3046,7 +3467,8 @@
var banner = id("qunit-banner"),
tests = id("qunit-tests"),
abortButton = id("qunit-abort-tests-button"),
html = ["Tests completed in ", details.runtime, " milliseconds.<br />", "<span class='passed'>", details.passed, "</span> assertions of <span class='total'>", details.total, "</span> passed, <span class='failed'>", details.failed, "</span> failed."].join(""),
totalTests = stats.passedTests + stats.skippedTests + stats.todoTests + stats.failedTests,
html = [totalTests, " tests completed in ", details.runtime, " milliseconds, with ", stats.failedTests, " failed, ", stats.skippedTests, " skipped, and ", stats.todoTests, " todo.<br />", "<span class='passed'>", details.passed, "</span> assertions of <span class='total'>", details.total, "</span> passed, <span class='failed'>", details.failed, "</span> failed."].join(""),
test,
assertLi,
assertList;
@ -3069,7 +3491,7 @@
}
if (banner && (!abortButton || abortButton.disabled === false)) {
banner.className = details.failed ? "qunit-fail" : "qunit-pass";
banner.className = stats.failedTests ? "qunit-fail" : "qunit-pass";
}
if (abortButton) {
@ -3084,7 +3506,7 @@
// Show ✖ for good, ✔ for bad suite result in title
// use escape sequences in case file gets loaded with non-utf-8-charset
document$$1.title = [details.failed ? "\u2716" : "\u2714", document$$1.title.replace(/^[\u2714\u2716] /i, "")].join(" ");
document$$1.title = [stats.failedTests ? "\u2716" : "\u2714", document$$1.title.replace(/^[\u2714\u2716] /i, "")].join(" ");
}
// Scroll back to top to show results
@ -3224,7 +3646,10 @@
good = details.passed;
bad = details.failed;
if (bad === 0) {
// This test passed if it has no unexpected failed assertions
var testPassed = details.failed > 0 ? details.todo : !details.todo;
if (testPassed) {
// Collapse the passing tests
addClass(assertList, "qunit-collapsed");
@ -3248,6 +3673,8 @@
testTitle.innerHTML += " <b class='counts'>(" + testCounts + details.assertions.length + ")</b>";
if (details.skipped) {
stats.skippedTests++;
testItem.className = "skipped";
skipped = document$$1.createElement("em");
skipped.className = "qunit-skipped-label";
@ -3258,12 +3685,27 @@
toggleClass(assertList, "qunit-collapsed");
});
testItem.className = bad ? "fail" : "pass";
testItem.className = testPassed ? "pass" : "fail";
if (details.todo) {
var todoLabel = document$$1.createElement("em");
todoLabel.className = "qunit-todo-label";
todoLabel.innerHTML = "todo";
testItem.insertBefore(todoLabel, testTitle);
}
time = document$$1.createElement("span");
time.className = "runtime";
time.innerHTML = details.runtime + " ms";
testItem.insertBefore(time, assertList);
if (!testPassed) {
stats.failedTests++;
} else if (details.todo) {
stats.todoTests++;
} else {
stats.passedTests++;
}
}
// Show the source of the test when showing assertions
@ -3271,7 +3713,7 @@
sourceName = document$$1.createElement("p");
sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
addClass(sourceName, "qunit-source");
if (bad === 0) {
if (testPassed) {
addClass(sourceName, "qunit-collapsed");
}
addEvent(testTitle, "click", function () {
@ -3292,6 +3734,39 @@
} else {
addEvent(window, "load", QUnit.load);
}
// Wrap window.onerror. We will call the original window.onerror to see if
// the existing handler fully handles the error; if not, we will call the
// QUnit.onError function.
var originalWindowOnError = window.onerror;
// Cover uncaught exceptions
// Returning true will suppress the default browser handler,
// returning false will let it run.
window.onerror = function (message, fileName, lineNumber) {
var ret = false;
if (originalWindowOnError) {
for (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
args[_key - 3] = arguments[_key];
}
ret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber].concat(args));
}
// Treat return value as window.onerror itself does,
// Only do our handling if not suppressed.
if (ret !== true) {
var error = {
message: message,
fileName: fileName,
lineNumber: lineNumber
};
ret = QUnit.onError(error);
}
return ret;
};
})();
/*

View File

@ -55,9 +55,9 @@
"autoprefixer": "^6.7.7",
"babel-eslint": "^7.1.1",
"babel-plugin-transform-es2015-modules-strip": "^0.1.0",
"babel-preset-es2015": "^6.22.0",
"clean-css-cli": "^4.0.8",
"eslint": "^3.17.1",
"babel-preset-es2015": "^6.24.0",
"clean-css-cli": "^4.0.9",
"eslint": "^3.18.0",
"grunt": "^1.0.1",
"grunt-babel": "^6.0.0",
"grunt-build-control": "^0.7.1",
@ -76,12 +76,12 @@
"is-travis": "^1.0.0",
"load-grunt-tasks": "^3.5.2",
"node-sass": "^4.5.0",
"postcss-cli": "^3.0.0-beta",
"postcss-cli": "^3.0.0",
"postcss-flexbugs-fixes": "^2.1.0",
"shelljs": "^0.7.7",
"shx": "^0.2.2",
"time-grunt": "^1.4.0",
"uglify-js": "^2.8.12"
"uglify-js": "^2.8.14"
},
"engines": {
"node": ">=4"