From 55f65eaa2e00515150cfbf87bb4a2ae7362b97c5 Mon Sep 17 00:00:00 2001 From: Nils Knappmeier Date: Sun, 31 May 2020 23:38:23 +0200 Subject: [PATCH 1/4] backup --- .eslintrc.js | 2 +- Gruntfile.js | 31 +- karma-setup/default/karma.conf.js | 8 + karma-setup/requirejs/karma.conf.js | 17 + karma-setup/shared/default-config.js | 6 + karma-setup/shared/default-files.js | 13 + karma-setup/shared/saucelabs.js | 47 + package-lock.json | 1535 ++++++++++++++---------- package.json | 4 + spec/amd.html | 3 +- spec/karma-includes/browser-context.js | 22 + spec/karma-includes/mocha.js | 2 + spec/karma-includes/require-config.js | 21 + spec/security.js | 67 +- 14 files changed, 1108 insertions(+), 670 deletions(-) create mode 100644 karma-setup/default/karma.conf.js create mode 100644 karma-setup/requirejs/karma.conf.js create mode 100644 karma-setup/shared/default-config.js create mode 100644 karma-setup/shared/default-files.js create mode 100644 karma-setup/shared/saucelabs.js create mode 100644 spec/karma-includes/browser-context.js create mode 100644 spec/karma-includes/mocha.js create mode 100644 spec/karma-includes/require-config.js diff --git a/.eslintrc.js b/.eslintrc.js index 2ac729358..eba775812 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -60,7 +60,7 @@ module.exports = { }, parserOptions: { sourceType: 'module', - ecmaVersion: 6, + ecmaVersion: 2018, ecmaFeatures: {} } }; diff --git a/Gruntfile.js b/Gruntfile.js index 528c0af82..f54791b52 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -165,6 +165,29 @@ module.exports = function(grunt) { } } }, + karma: { + options: { + configFile: 'karma.conf.js' + }, + saucelabs: { + build: process.env.TRAVIS_JOB_ID || 'non-travis', + configFile: 'karma-setup/default/karma.conf.js', + ...require('./karma-setup/shared/saucelabs'), + singleRun: true + }, + default: { + browsers: [], + configFile: 'karma-setup/default/karma.conf.js', + singleRun: false, + autoWatch: true + }, + amd: { + configFile: 'karma-setup/requirejs/karma.conf.js', + browsers: [], + singleRun: false, + autoWatch: true + } + }, 'saucelabs-mocha': { all: { options: { @@ -178,8 +201,8 @@ module.exports = function(grunt) { browsers: [ { browserName: 'chrome' }, { browserName: 'firefox', platform: 'Linux' }, - // {browserName: 'safari', version: 9, platform: 'OS X 10.11'}, - // {browserName: 'safari', version: 8, platform: 'OS X 10.10'}, + { browserName: 'safari', version: 9, platform: 'OS X 10.11' }, + { browserName: 'safari', version: 8, platform: 'OS X 10.10' }, { browserName: 'internet explorer', version: 11, @@ -238,7 +261,7 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-babel'); grunt.loadNpmTasks('grunt-bg-shell'); - grunt.loadNpmTasks('@knappi/grunt-saucelabs'); + grunt.loadNpmTasks('grunt-karma'); grunt.loadNpmTasks('grunt-webpack'); grunt.task.loadTasks('tasks'); @@ -268,7 +291,7 @@ module.exports = function(grunt) { grunt.registerTask('bench', ['metrics']); if (process.env.SAUCE_ACCESS_KEY) { - grunt.registerTask('sauce', ['concat:tests', 'connect', 'saucelabs-mocha']); + grunt.registerTask('sauce', ['karma:saucelabs']); } else { grunt.registerTask('sauce', []); } diff --git a/karma-setup/default/karma.conf.js b/karma-setup/default/karma.conf.js new file mode 100644 index 000000000..f4e64561e --- /dev/null +++ b/karma-setup/default/karma.conf.js @@ -0,0 +1,8 @@ +const files = require('../shared/default-files'); + +module.exports = function(config) { + config.set({ + ...require('../shared/default-config'), + files: [...files('dist/handlebars.js'), 'spec/*.js'] + }); +}; diff --git a/karma-setup/requirejs/karma.conf.js b/karma-setup/requirejs/karma.conf.js new file mode 100644 index 000000000..f65d76e49 --- /dev/null +++ b/karma-setup/requirejs/karma.conf.js @@ -0,0 +1,17 @@ +module.exports = function(config) { + config.set({ + ...require('../shared/default-config'), + ...require('../shared/saucelabs'), + files: [ + '../../node_modules/sinon/pkg/sinon.js', + '../../node_modules/chai/chai.js', + '../../node_modules/dirty-chai/lib/dirty-chai.js', + '../../node_modules/mocha/mocha.js', + '../../spec/karma-includes/browser-context.js', + '../../spec/karma-includes/mocha.js', + '../../spec/vendor/json2.js', + '../../spec/env/common.js', + { pattern: '../../spec/*.js', included: false } + ] + }); +}; diff --git a/karma-setup/shared/default-config.js b/karma-setup/shared/default-config.js new file mode 100644 index 000000000..ae02af213 --- /dev/null +++ b/karma-setup/shared/default-config.js @@ -0,0 +1,6 @@ +module.exports = { + frameworks: ['mocha'], + // concurrency: we have no concurrency set, because this seems to let Karma hang after the first batch + // of browsers have finished their tests. + reporters: ['dots'] +}; diff --git a/karma-setup/shared/default-files.js b/karma-setup/shared/default-files.js new file mode 100644 index 000000000..502fd231f --- /dev/null +++ b/karma-setup/shared/default-files.js @@ -0,0 +1,13 @@ +module.exports = function files(...additionalFiles) { + return [ + 'node_modules/sinon/pkg/sinon.js', + 'node_modules/chai/chai.js', + 'node_modules/dirty-chai/lib/dirty-chai.js', + 'node_modules/mocha/mocha.js', + ...additionalFiles, + 'spec/browser-setup/browser-context.js', + 'spec/browser-setup/mocha.js', + 'spec/vendor/json2.js', + 'spec/env/common.js' + ]; +}; diff --git a/karma-setup/shared/saucelabs.js b/karma-setup/shared/saucelabs.js new file mode 100644 index 000000000..497a7b9f9 --- /dev/null +++ b/karma-setup/shared/saucelabs.js @@ -0,0 +1,47 @@ +// Example set of browsers to run on Sauce Labs +// Check out https://saucelabs.com/platforms for all browser/platform combos +const customLaunchers = { + sl_chrome: { + base: 'SauceLabs', + browserName: 'chrome' + }, + sl_firefox: { + base: 'SauceLabs', + browserName: 'firefox', + platform: 'Linux' + }, + sl_safari_9: { + base: 'SauceLabs', + browserName: 'safari', + version: 9, + platform: 'OS X 10.11' + }, + sl_safari_8: { + base: 'SauceLabs', + browserName: 'safari', + version: 8, + platform: 'OS X 10.10' + }, + sl_ie_10: { + base: 'SauceLabs', + browserName: 'internet explorer', + version: 10, + platform: 'Windows 8' + }, + sl_ie_11: { + base: 'SauceLabs', + browserName: 'internet explorer', + platform: 'Windows 8.1', + version: '11' + } +}; + +const browsers = Object.keys(customLaunchers); + +module.exports = { + customLaunchers, + browsers, + sauceLabs: { + testName: 'handlebars-unit-tests' + } +}; diff --git a/package-lock.json b/package-lock.json index 28b4eb763..6c3a1fe6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "handlebars", - "version": "4.7.5", + "version": "4.7.6", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -343,6 +343,18 @@ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, + "adm-zip": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -544,6 +556,12 @@ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -640,6 +658,12 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "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 + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -957,6 +981,12 @@ "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", "dev": true }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1030,12 +1060,24 @@ } } }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -1074,6 +1116,15 @@ "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", "dev": true }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -1096,6 +1147,12 @@ "file-uri-to-path": "1.0.0" } }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, "bluebird": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", @@ -1358,6 +1415,12 @@ "caller-callsite": "^2.0.0" } }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1649,6 +1712,17 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -1761,12 +1835,24 @@ } } }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -2226,6 +2312,12 @@ "array-find-index": "^1.0.1" } }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2241,6 +2333,12 @@ "integrity": "sha512-8P1cDi8ebZyDxUyUprBXwidoEtiQAawYPGvpfb+Dg0G6JrQ+VozwOmm91xYC0vAv1+0VmLehEPb+isg4BGUFfA==", "dev": true }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, "dateformat": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", @@ -2560,6 +2658,12 @@ "defined": "^1.0.0" } }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, "diff": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", @@ -2598,6 +2702,18 @@ "esutils": "^2.0.2" } }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -2826,7 +2942,7 @@ "request": "^2.88.0", "strip-json-comments": "^2.0.1", "tslint": "^5.14.0", - "typescript": "^3.9.0-dev.20200402" + "typescript": "^4.0.0-dev.20200512" }, "dependencies": { "fs-extra": { @@ -2841,9 +2957,9 @@ } }, "typescript": { - "version": "3.9.0-dev.20200402", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.0-dev.20200402.tgz", - "integrity": "sha512-CxOOy4lmaPnuyG34aP1kF2l++aou/IM+T0XsEeXZWb6xbIwx+3rt1DbLNS0pQIsLxi7NITq3x4M1qXhOQOAE6A==", + "version": "4.0.0-dev.20200512", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.0-dev.20200512.tgz", + "integrity": "sha512-ZsVvhdxpQaA6KpjlT8wNNtweORzNsMtwgCo8viKWQmOvaU+BlMsd3MjD2LONQjFSiETCaw4uq0nNdyfKrCjjIw==", "dev": true } } @@ -2923,6 +3039,98 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, "enhanced-resolve": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", @@ -2942,6 +3150,12 @@ } } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -3904,628 +4118,14 @@ "dev": true }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, "optional": true, "requires": { "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "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, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": 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, - "optional": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "optional": 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-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": 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, - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "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, - "optional": true - }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": 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, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": 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" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "optional": 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, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.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, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - } + "nan": "^2.12.1" } }, "functional-red-black-tree": { @@ -5171,6 +4771,15 @@ } } }, + "grunt-karma": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/grunt-karma/-/grunt-karma-4.0.0.tgz", + "integrity": "sha512-L3YpIAW6NB5tQ3cb6VoJCCCWfIJ0nqeyxs/SF6N385sMSadZ6RjBllP2kOUE2plkT8T8DR3bGVqzgH+vUDTsuQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, "grunt-known-options": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", @@ -5278,6 +4887,29 @@ } } }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -5579,6 +5211,12 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -5965,6 +5603,12 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6195,12 +5839,226 @@ "verror": "1.10.0" } }, + "jszip": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.4.0.tgz", + "integrity": "sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + } + } + }, "just-extend": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, + "karma": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.5.tgz", + "integrity": "sha512-Q4Su7kNwkTgqS+KbSCYgH0p4a/0JIxVLyp7qKNV7vgPNhIF4kIoh0GlUfMKpw67BrR3hgPQSJoxgF7xnzUtPpg==", + "dev": true, + "requires": { + "body-parser": "^1.16.1", + "braces": "^3.0.2", + "chokidar": "^3.0.0", + "colors": "^1.1.0", + "connect": "^3.6.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^4.0.2", + "lodash": "^4.17.14", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "ua-parser-js": "0.7.21", + "yargs": "^15.3.1" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": 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" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "mime": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "requires": { + "minimist": "^1.2.3" + } + }, + "karma-sauce-launcher": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-4.1.4.tgz", + "integrity": "sha512-ZKVAYs2QHDDO1wiYU4L2V4dUdo7Dqvllt2ScA3Yq2vizIYGlXDn62PCbLFfEZTHuwIr/YS1JUgSMohEC/wHJ5w==", + "dev": true, + "requires": { + "sauce-connect-launcher": "^1.2.4", + "saucelabs": "^1.5.0", + "selenium-webdriver": "^4.0.0-alpha.1" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -6237,8 +6095,17 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" } }, "liftoff": { @@ -7126,6 +6993,30 @@ } } }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + }, + "dependencies": { + "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" + } + } + } + }, "lolex": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", @@ -7821,9 +7712,6 @@ "dev": true, "requires": { "underscore": ">= 1.1.5" - }, - "dependencies": { - "browserify": {} } }, "nopt": { @@ -8087,6 +7975,12 @@ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", "dev": true }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -8486,6 +8380,24 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -8765,6 +8677,12 @@ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", "dev": true }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -9507,6 +9425,12 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -9613,6 +9537,58 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sauce-connect-launcher": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.3.2.tgz", + "integrity": "sha512-wf0coUlidJ7rmeClgVVBh6Kw55/yalZCY/Un5RgjSnTXRAeGqagnTsTYpZaqC4dCtrY4myuYpOAZXCdbO7lHfQ==", + "dev": true, + "requires": { + "adm-zip": "~0.4.3", + "async": "^2.1.2", + "https-proxy-agent": "^5.0.0", + "lodash": "^4.16.6", + "rimraf": "^2.5.4" + }, + "dependencies": { + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "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" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + } + } + }, "saucelabs": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", @@ -9628,6 +9604,51 @@ "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", "dev": true }, + "selenium-webdriver": { + "version": "4.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz", + "integrity": "sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==", + "dev": true, + "requires": { + "jszip": "^3.2.2", + "rimraf": "^2.7.1", + "tmp": "0.0.30" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -9755,6 +9776,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -10030,6 +10057,128 @@ "kind-of": "^3.2.0" } }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "sockjs": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", @@ -10282,6 +10431,41 @@ "xtend": "^4.0.0" } }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, "string-argv": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", @@ -10646,6 +10830,12 @@ "os-tmpdir": "~1.0.2" } }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -10877,6 +11067,12 @@ "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "dev": true + }, "uglify-js": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", @@ -10893,6 +11089,12 @@ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "dev": true }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -11128,6 +11330,12 @@ "indexof": "0.0.1" } }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, "watchpack": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", @@ -11422,6 +11630,17 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -11448,6 +11667,25 @@ "signal-exit": "^3.0.2" } }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + }, + "dependencies": { + "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 + } + } + }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", @@ -11464,6 +11702,12 @@ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -11481,6 +11725,41 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true } } } diff --git a/package.json b/package.json index aa5c2dff6..480132774 100644 --- a/package.json +++ b/package.json @@ -58,9 +58,13 @@ "grunt-contrib-requirejs": "^1", "grunt-contrib-uglify": "^1", "grunt-contrib-watch": "^1.1.0", + "grunt-karma": "^4.0.0", "grunt-webpack": "^1.0.8", "husky": "^3.1.0", "jison": "~0.3.0", + "karma": "^5.0.5", + "karma-mocha": "^2.0.1", + "karma-sauce-launcher": "^4.1.4", "lint-staged": "^9.5.0", "mocha": "^5", "mock-stdin": "^0.3.0", diff --git a/spec/amd.html b/spec/amd.html index 1f783e02c..c3f3365cc 100644 --- a/spec/amd.html +++ b/spec/amd.html @@ -112,8 +112,7 @@ failedTests.push({ name: test.title, result: false, - message: err.message, - stack: err.stack, + message: err.message, stack: err.stack, titles: flattenTitles(test) }); } diff --git a/spec/karma-includes/browser-context.js b/spec/karma-includes/browser-context.js new file mode 100644 index 000000000..a2f689636 --- /dev/null +++ b/spec/karma-includes/browser-context.js @@ -0,0 +1,22 @@ +window.CompilerContext = { + compile: function(template, options) { + var templateSpec = handlebarsEnv.precompile(template, options); + return handlebarsEnv.template(safeEval(templateSpec)); + }, + compileWithPartial: function(template, options) { + return handlebarsEnv.compile(template, options); + } +}; + +function safeEval(templateSpec) { + try { + var ret; + // eslint-disable-next-line no-eval + eval('ret = ' + templateSpec); + return ret; + } catch (err) { + // eslint-disable-next-line no-console + console.error(templateSpec); + throw err; + } +} diff --git a/spec/karma-includes/mocha.js b/spec/karma-includes/mocha.js new file mode 100644 index 000000000..16e5b5670 --- /dev/null +++ b/spec/karma-includes/mocha.js @@ -0,0 +1,2 @@ +window.expect = chai.expect; +mocha.setup('bdd'); diff --git a/spec/karma-includes/require-config.js b/spec/karma-includes/require-config.js new file mode 100644 index 000000000..c61e6ebb0 --- /dev/null +++ b/spec/karma-includes/require-config.js @@ -0,0 +1,21 @@ +/* global requirejs */ + +var tests = []; + +requirejs.config({ + // Karma serves files from '/base' + baseUrl: '/base/src', + + paths: { + handlebars: '/dist/handlebars.amd', + tests: '/tmp/tests' + }, + + shim: {}, + + // ask Require.js to load these files (all our tests) + deps: ['handlebars', tests], + + // start test run, once Require.js is done + callback: window.__karma__.start +}); diff --git a/spec/security.js b/spec/security.js index 25aabeb7b..9bb20dedd 100644 --- a/spec/security.js +++ b/spec/security.js @@ -1,4 +1,15 @@ describe('security issues', function() { + var consoleErrorFake = null; + + beforeEach(function() { + consoleErrorFake = sinon.fake(); + sinon.replace(console, 'error', consoleErrorFake); + }); + + afterEach(function() { + sinon.restore(); + }); + describe('GH-1495: Prevent Remote Code Execution via constructor', function() { it('should not allow constructors to be accessed', function() { expectTemplate('{{lookup (lookup this "constructor") "name"}}') @@ -88,17 +99,15 @@ describe('security issues', function() { }); it('should not throw an exception when calling "{{blockHelperMissing "abc" .}}" ', function() { - var functionCalls = []; + var fakeFunction = sinon.fake(); var template = Handlebars.compile('{{blockHelperMissing "abc" .}}'); template( { - fn: function() { - functionCalls.push('called'); - } + fn: fakeFunction }, { allowCallsToHelperMissing: true } ); - equals(functionCalls.length, 1); + expect(fakeFunction.calledOnce).to.be.true(); }); it('should not throw an exception when calling "{{#blockHelperMissing .}}{{/blockHelperMissing}}"', function() { @@ -185,20 +194,18 @@ describe('security issues', function() { function checkProtoMethodAccess(compileOptions) { it('should be prohibited by default and log a warning', function() { - var spy = sinon.spy(console, 'error'); - expectTemplate('{{aMethod}}') .withInput(new TestClass()) .withCompileOptions(compileOptions) .toCompileTo(''); - expect(spy.calledOnce).to.be.true(); - expect(spy.args[0][0]).to.match(/Handlebars: Access has been denied/); + expect(consoleErrorFake.calledOnce).to.be.true(); + expect(consoleErrorFake.args[0][0]).to.match( + /Handlebars: Access has been denied/ + ); }); it('should only log the warning once', function() { - var spy = sinon.spy(console, 'error'); - expectTemplate('{{aMethod}}') .withInput(new TestClass()) .withCompileOptions(compileOptions) @@ -209,13 +216,13 @@ describe('security issues', function() { .withCompileOptions(compileOptions) .toCompileTo(''); - expect(spy.calledOnce).to.be.true(); - expect(spy.args[0][0]).to.match(/Handlebars: Access has been denied/); + expect(consoleErrorFake.calledOnce).to.be.true(); + expect(consoleErrorFake.args[0][0]).to.match( + /Handlebars: Access has been denied/ + ); }); it('can be allowed, which disables the warning', function() { - var spy = sinon.spy(console, 'error'); - expectTemplate('{{aMethod}}') .withInput(new TestClass()) .withCompileOptions(compileOptions) @@ -226,12 +233,10 @@ describe('security issues', function() { }) .toCompileTo('returnValue'); - expect(spy.callCount).to.equal(0); + expect(consoleErrorFake.callCount).to.equal(0); }); it('can be turned on by default, which disables the warning', function() { - var spy = sinon.spy(console, 'error'); - expectTemplate('{{aMethod}}') .withInput(new TestClass()) .withCompileOptions(compileOptions) @@ -240,12 +245,10 @@ describe('security issues', function() { }) .toCompileTo('returnValue'); - expect(spy.callCount).to.equal(0); + expect(consoleErrorFake.callCount).to.equal(0); }); it('can be turned off by default, which disables the warning', function() { - var spy = sinon.spy(console, 'error'); - expectTemplate('{{aMethod}}') .withInput(new TestClass()) .withCompileOptions(compileOptions) @@ -254,7 +257,7 @@ describe('security issues', function() { }) .toCompileTo(''); - expect(spy.callCount).to.equal(0); + expect(consoleErrorFake.callCount).to.equal(0); }); it('can be turned off, if turned on by default', function() { @@ -300,20 +303,18 @@ describe('security issues', function() { function checkProtoPropertyAccess(compileOptions) { it('should be prohibited by default and log a warning', function() { - var spy = sinon.spy(console, 'error'); - expectTemplate('{{aProperty}}') .withInput(new TestClass()) .withCompileOptions(compileOptions) .toCompileTo(''); - expect(spy.calledOnce).to.be.true(); - expect(spy.args[0][0]).to.match(/Handlebars: Access has been denied/); + expect(consoleErrorFake.calledOnce).to.be.true(); + expect(consoleErrorFake.args[0][0]).to.match( + /Handlebars: Access has been denied/ + ); }); it('can be explicitly prohibited by default, which disables the warning', function() { - var spy = sinon.spy(console, 'error'); - expectTemplate('{{aProperty}}') .withInput(new TestClass()) .withCompileOptions(compileOptions) @@ -322,12 +323,10 @@ describe('security issues', function() { }) .toCompileTo(''); - expect(spy.callCount).to.equal(0); + expect(consoleErrorFake.callCount).to.equal(0); }); it('can be turned on, which disables the warning', function() { - var spy = sinon.spy(console, 'error'); - expectTemplate('{{aProperty}}') .withInput(new TestClass()) .withCompileOptions(compileOptions) @@ -338,12 +337,10 @@ describe('security issues', function() { }) .toCompileTo('propertyValue'); - expect(spy.callCount).to.equal(0); + expect(consoleErrorFake.callCount).to.equal(0); }); it('can be turned on by default, which disables the warning', function() { - var spy = sinon.spy(console, 'error'); - expectTemplate('{{aProperty}}') .withInput(new TestClass()) .withCompileOptions(compileOptions) @@ -352,7 +349,7 @@ describe('security issues', function() { }) .toCompileTo('propertyValue'); - expect(spy.callCount).to.equal(0); + expect(consoleErrorFake.callCount).to.equal(0); }); it('can be turned off, if turned on by default', function() { From 6b1a4070c23308e19f4901ed8ba72056815c58fc Mon Sep 17 00:00:00 2001 From: Nils Knappmeier Date: Mon, 1 Jun 2020 22:28:13 +0200 Subject: [PATCH 2/4] wip --- karma-setup/karma-includes/.eslintrc | 48 +++++++++++++++++++ .../karma-includes/browser-context.js | 0 karma-setup/karma-includes/mocha.js | 8 ++++ karma-setup/karma-includes/require-config.js | 29 +++++++++++ karma-setup/requirejs/karma.conf.js | 24 +++++----- karma.conf.js | 18 +++++++ package-lock.json | 9 ++++ package.json | 2 + spec/karma-includes/mocha.js | 2 - spec/karma-includes/require-config.js | 21 -------- 10 files changed, 127 insertions(+), 34 deletions(-) create mode 100644 karma-setup/karma-includes/.eslintrc rename {spec => karma-setup}/karma-includes/browser-context.js (100%) create mode 100644 karma-setup/karma-includes/mocha.js create mode 100644 karma-setup/karma-includes/require-config.js create mode 100644 karma.conf.js delete mode 100644 spec/karma-includes/mocha.js delete mode 100644 spec/karma-includes/require-config.js diff --git a/karma-setup/karma-includes/.eslintrc b/karma-setup/karma-includes/.eslintrc new file mode 100644 index 000000000..cd3e0ecb6 --- /dev/null +++ b/karma-setup/karma-includes/.eslintrc @@ -0,0 +1,48 @@ +{ + "extends": [ + "../../.eslintrc.js", + "plugin:es5/no-es2015", + "prettier" + ], + "plugins": [ + "es5" + ], + "globals": { + "TODO: clean this up": true, + "CompilerContext": true, + "Handlebars": true, + "handlebarsEnv": true, + "shouldCompileTo": true, + "shouldCompileToWithPartials": true, + "shouldThrow": true, + "expectTemplate": true, + "compileWithPartials": true, + "console": true, + "require": true, + "suite": true, + "equal": true, + "equals": true, + "test": true, + "testBoth": true, + "raises": true, + "deepEqual": true, + "start": true, + "stop": true, + "ok": true, + "sinon": true, + "strictEqual": true, + "define": true, + "expect": true, + "chai": true + }, + "env": { + "mocha": true + }, + "rules": { + // Disabling for tests, for now. + "no-path-concat": "off", + + "no-var": "off", + "dot-notation": "off" + } +} diff --git a/spec/karma-includes/browser-context.js b/karma-setup/karma-includes/browser-context.js similarity index 100% rename from spec/karma-includes/browser-context.js rename to karma-setup/karma-includes/browser-context.js diff --git a/karma-setup/karma-includes/mocha.js b/karma-setup/karma-includes/mocha.js new file mode 100644 index 000000000..4b71be2be --- /dev/null +++ b/karma-setup/karma-includes/mocha.js @@ -0,0 +1,8 @@ +console.log('Setup starting'); + +window.expect = chai.expect; +mocha.setup('bdd'); +// eslint-disable-next-line no-undef +chai.use(dirtyChai); + +console.log('Setup complete'); diff --git a/karma-setup/karma-includes/require-config.js b/karma-setup/karma-includes/require-config.js new file mode 100644 index 000000000..7e5a5d420 --- /dev/null +++ b/karma-setup/karma-includes/require-config.js @@ -0,0 +1,29 @@ +/* global requirejs */ + +var tests = []; + +console.log('ABC', Object.keys(window.__karma__.files)); +requirejs.config({ + // Karma serves files from '/base' + baseUrl: '/', + + paths: { + handlebars: '/base/dist/handlebars.amd', + mochaConfig: '/base/karma-setup/karma-includes/mocha', + sinon: '/base/node_modules/sinon/pkg/sinon', + chai: '/base/node_modules/chai/chai', + dirtyChai: '/base/node_modules/dirty-chai/lib/dirty-chai' + }, + + shim: { + mochaConfig: { + deps: ['mocha', 'chai', 'dirtyChai', 'sinon'] + } + }, + + // ask Require.js to load these files (all our tests) + deps: ['handlebars', 'mochaConfig', tests], + + // start test run, once Require.js is done + callback: window.__karma__.start +}); diff --git a/karma-setup/requirejs/karma.conf.js b/karma-setup/requirejs/karma.conf.js index f65d76e49..e248bc1be 100644 --- a/karma-setup/requirejs/karma.conf.js +++ b/karma-setup/requirejs/karma.conf.js @@ -1,17 +1,19 @@ module.exports = function(config) { config.set({ - ...require('../shared/default-config'), - ...require('../shared/saucelabs'), + baseUrl: '../..', + reporters: ['dots'], + frameworks: ['mocha', 'requirejs'], + browsers: ['Chrome'], files: [ - '../../node_modules/sinon/pkg/sinon.js', - '../../node_modules/chai/chai.js', - '../../node_modules/dirty-chai/lib/dirty-chai.js', - '../../node_modules/mocha/mocha.js', - '../../spec/karma-includes/browser-context.js', - '../../spec/karma-includes/mocha.js', - '../../spec/vendor/json2.js', - '../../spec/env/common.js', - { pattern: '../../spec/*.js', included: false } + { pattern: 'node_modules/sinon/pkg/sinon.js', included: false }, + { pattern: 'node_modules/chai/chai.js', included: false }, + { pattern: 'node_modules/dirty-chai/lib/dirty-chai.js', included: false }, + { pattern: 'dist/handlebars.amd.js', included: false }, + 'karma-setup/karma-includes/browser-context.js', + 'spec/vendor/json2.js', + 'spec/env/common.js', + 'karma-setup/karma-includes/require-config.js', + { pattern: 'spec/*.js', included: false } ] }); }; diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 000000000..35897ced7 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,18 @@ +module.exports = function(config) { + config.set({ + reporters: ['dots'], + frameworks: ['mocha', 'requirejs'], + browsers: ['Chrome'], + files: [ + { pattern: 'node_modules/sinon/pkg/sinon.js', included: false }, + { pattern: 'node_modules/chai/chai.js', included: false }, + { pattern: 'node_modules/dirty-chai/lib/dirty-chai.js', included: false }, + { pattern: 'dist/handlebars.amd.js', included: false }, + 'karma-setup/karma-includes/browser-context.js', + 'spec/vendor/json2.js', + 'spec/env/common.js', + 'karma-setup/karma-includes/require-config.js', + { pattern: 'spec/*.js', included: false } + ] + }); +}; diff --git a/package-lock.json b/package-lock.json index 6c3a1fe6b..69f1774c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6039,6 +6039,15 @@ } } }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, "karma-mocha": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", diff --git a/package.json b/package.json index 480132774..dea9e8363 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,9 @@ "husky": "^3.1.0", "jison": "~0.3.0", "karma": "^5.0.5", + "karma-chrome-launcher": "^3.1.0", "karma-mocha": "^2.0.1", + "karma-requirejs": "^1.1.0", "karma-sauce-launcher": "^4.1.4", "lint-staged": "^9.5.0", "mocha": "^5", diff --git a/spec/karma-includes/mocha.js b/spec/karma-includes/mocha.js deleted file mode 100644 index 16e5b5670..000000000 --- a/spec/karma-includes/mocha.js +++ /dev/null @@ -1,2 +0,0 @@ -window.expect = chai.expect; -mocha.setup('bdd'); diff --git a/spec/karma-includes/require-config.js b/spec/karma-includes/require-config.js deleted file mode 100644 index c61e6ebb0..000000000 --- a/spec/karma-includes/require-config.js +++ /dev/null @@ -1,21 +0,0 @@ -/* global requirejs */ - -var tests = []; - -requirejs.config({ - // Karma serves files from '/base' - baseUrl: '/base/src', - - paths: { - handlebars: '/dist/handlebars.amd', - tests: '/tmp/tests' - }, - - shim: {}, - - // ask Require.js to load these files (all our tests) - deps: ['handlebars', tests], - - // start test run, once Require.js is done - callback: window.__karma__.start -}); From 416d8d810a83bd32c87b2099ee8963e67bad82b6 Mon Sep 17 00:00:00 2001 From: Nils Knappmeier Date: Tue, 2 Jun 2020 00:10:37 +0200 Subject: [PATCH 3/4] wip --- Gruntfile.js | 2 +- karma-setup/.eslintrc | 56 +++++++++++++++++++ .../amd/karma.conf.js | 5 +- karma-setup/amd/require-config.browser.js | 38 +++++++++++++ karma-setup/default/global-expect.browser.js | 1 + karma-setup/default/karma.conf.js | 20 +++++-- karma-setup/karma-includes/.eslintrc | 48 ---------------- karma-setup/karma-includes/mocha.js | 8 --- karma-setup/karma-includes/require-config.js | 29 ---------- karma-setup/requirejs/karma.conf.js | 19 ------- karma-setup/shared/default-config.js | 6 -- karma-setup/shared/default-files.js | 13 ----- .../global-compiler-context.browser.js} | 0 13 files changed, 115 insertions(+), 130 deletions(-) create mode 100644 karma-setup/.eslintrc rename karma.conf.js => karma-setup/amd/karma.conf.js (83%) create mode 100644 karma-setup/amd/require-config.browser.js create mode 100644 karma-setup/default/global-expect.browser.js delete mode 100644 karma-setup/karma-includes/.eslintrc delete mode 100644 karma-setup/karma-includes/mocha.js delete mode 100644 karma-setup/karma-includes/require-config.js delete mode 100644 karma-setup/requirejs/karma.conf.js delete mode 100644 karma-setup/shared/default-config.js delete mode 100644 karma-setup/shared/default-files.js rename karma-setup/{karma-includes/browser-context.js => shared/global-compiler-context.browser.js} (100%) diff --git a/Gruntfile.js b/Gruntfile.js index f54791b52..ca4f296e7 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -182,7 +182,7 @@ module.exports = function(grunt) { autoWatch: true }, amd: { - configFile: 'karma-setup/requirejs/karma.conf.js', + configFile: 'karma-setup/amd/karma.conf.js', browsers: [], singleRun: false, autoWatch: true diff --git a/karma-setup/.eslintrc b/karma-setup/.eslintrc new file mode 100644 index 000000000..490d99d05 --- /dev/null +++ b/karma-setup/.eslintrc @@ -0,0 +1,56 @@ +{ + "extends": [ + "../.eslintrc.js" + ], + "overrides": [ + { + "extends": [ + "plugin:es5/no-es2015", + "prettier" + ], + "files": ["**/*.browser.js"], + "plugins": [ + "es5" + ], + "globals": { + "TODO: clean this up": true, + "CompilerContext": true, + "Handlebars": true, + "handlebarsEnv": true, + "shouldCompileTo": true, + "shouldCompileToWithPartials": true, + "shouldThrow": true, + "expectTemplate": true, + "compileWithPartials": true, + "console": true, + "require": true, + "suite": true, + "equal": true, + "equals": true, + "test": true, + "testBoth": true, + "raises": true, + "deepEqual": true, + "start": true, + "stop": true, + "ok": true, + "sinon": true, + "strictEqual": true, + "define": true, + "expect": true, + "chai": true + }, + "env": { + "mocha": true + }, + "rules": { + // Disabling for tests, for now. + "no-path-concat": "off", + + "no-var": "off", + "dot-notation": "off" + } + }, + ] + +} diff --git a/karma.conf.js b/karma-setup/amd/karma.conf.js similarity index 83% rename from karma.conf.js rename to karma-setup/amd/karma.conf.js index 35897ced7..d1a63a6f8 100644 --- a/karma.conf.js +++ b/karma-setup/amd/karma.conf.js @@ -1,5 +1,6 @@ module.exports = function(config) { config.set({ + basePath: '../..', reporters: ['dots'], frameworks: ['mocha', 'requirejs'], browsers: ['Chrome'], @@ -8,10 +9,10 @@ module.exports = function(config) { { pattern: 'node_modules/chai/chai.js', included: false }, { pattern: 'node_modules/dirty-chai/lib/dirty-chai.js', included: false }, { pattern: 'dist/handlebars.amd.js', included: false }, - 'karma-setup/karma-includes/browser-context.js', + 'karma-setup/shared/*.browser.js', + 'karma-setup/amd/*.browser.js', 'spec/vendor/json2.js', 'spec/env/common.js', - 'karma-setup/karma-includes/require-config.js', { pattern: 'spec/*.js', included: false } ] }); diff --git a/karma-setup/amd/require-config.browser.js b/karma-setup/amd/require-config.browser.js new file mode 100644 index 000000000..f9b33ee02 --- /dev/null +++ b/karma-setup/amd/require-config.browser.js @@ -0,0 +1,38 @@ +/* global requirejs */ + +var tests = Object.keys(window.__karma__.files).filter(function(file) { + return file.match(/^\/base\/spec\/[^/]*\.js/); +}); + +requirejs.config({ + // Karma serves files from '/base' + baseUrl: '/base', + + paths: { + handlebars: 'dist/handlebars.amd', + sinon: 'node_modules/sinon/pkg/sinon', + chai: 'node_modules/chai/chai', + dirtyChai: 'node_modules/dirty-chai/lib/dirty-chai' + }, + + // start test run, once Require.js is done + callback: function() { + require(['handlebars', 'chai', 'dirtyChai', 'sinon'], function( + Handlebars, + chai, + dirtyChai, + sinon + ) { + window.Handlebars = Handlebars; + + chai.use(dirtyChai); + window.expect = chai.expect; + + window.sinon = sinon; + + require(tests, function() { + window.__karma__.start(); + }); + }); + } +}); diff --git a/karma-setup/default/global-expect.browser.js b/karma-setup/default/global-expect.browser.js new file mode 100644 index 000000000..583ac5ade --- /dev/null +++ b/karma-setup/default/global-expect.browser.js @@ -0,0 +1 @@ +window.expect = chai.expect; diff --git a/karma-setup/default/karma.conf.js b/karma-setup/default/karma.conf.js index f4e64561e..fe27fee3c 100644 --- a/karma-setup/default/karma.conf.js +++ b/karma-setup/default/karma.conf.js @@ -1,8 +1,20 @@ -const files = require('../shared/default-files'); - module.exports = function(config) { config.set({ - ...require('../shared/default-config'), - files: [...files('dist/handlebars.js'), 'spec/*.js'] + basePath: '../..', + reporters: ['dots'], + frameworks: ['mocha'], + browsers: ['Chrome'], + files: [ + 'node_modules/sinon/pkg/sinon.js', + 'node_modules/chai/chai.js', + 'node_modules/dirty-chai/lib/dirty-chai.js', + 'karma-setup/shared/*.browser.js', + 'karma-setup/default/*.browser.js', + 'spec/vendor/json2.js', + 'spec/env/common.js', + + 'dist/handlebars.js', + 'spec/*.js' + ] }); }; diff --git a/karma-setup/karma-includes/.eslintrc b/karma-setup/karma-includes/.eslintrc deleted file mode 100644 index cd3e0ecb6..000000000 --- a/karma-setup/karma-includes/.eslintrc +++ /dev/null @@ -1,48 +0,0 @@ -{ - "extends": [ - "../../.eslintrc.js", - "plugin:es5/no-es2015", - "prettier" - ], - "plugins": [ - "es5" - ], - "globals": { - "TODO: clean this up": true, - "CompilerContext": true, - "Handlebars": true, - "handlebarsEnv": true, - "shouldCompileTo": true, - "shouldCompileToWithPartials": true, - "shouldThrow": true, - "expectTemplate": true, - "compileWithPartials": true, - "console": true, - "require": true, - "suite": true, - "equal": true, - "equals": true, - "test": true, - "testBoth": true, - "raises": true, - "deepEqual": true, - "start": true, - "stop": true, - "ok": true, - "sinon": true, - "strictEqual": true, - "define": true, - "expect": true, - "chai": true - }, - "env": { - "mocha": true - }, - "rules": { - // Disabling for tests, for now. - "no-path-concat": "off", - - "no-var": "off", - "dot-notation": "off" - } -} diff --git a/karma-setup/karma-includes/mocha.js b/karma-setup/karma-includes/mocha.js deleted file mode 100644 index 4b71be2be..000000000 --- a/karma-setup/karma-includes/mocha.js +++ /dev/null @@ -1,8 +0,0 @@ -console.log('Setup starting'); - -window.expect = chai.expect; -mocha.setup('bdd'); -// eslint-disable-next-line no-undef -chai.use(dirtyChai); - -console.log('Setup complete'); diff --git a/karma-setup/karma-includes/require-config.js b/karma-setup/karma-includes/require-config.js deleted file mode 100644 index 7e5a5d420..000000000 --- a/karma-setup/karma-includes/require-config.js +++ /dev/null @@ -1,29 +0,0 @@ -/* global requirejs */ - -var tests = []; - -console.log('ABC', Object.keys(window.__karma__.files)); -requirejs.config({ - // Karma serves files from '/base' - baseUrl: '/', - - paths: { - handlebars: '/base/dist/handlebars.amd', - mochaConfig: '/base/karma-setup/karma-includes/mocha', - sinon: '/base/node_modules/sinon/pkg/sinon', - chai: '/base/node_modules/chai/chai', - dirtyChai: '/base/node_modules/dirty-chai/lib/dirty-chai' - }, - - shim: { - mochaConfig: { - deps: ['mocha', 'chai', 'dirtyChai', 'sinon'] - } - }, - - // ask Require.js to load these files (all our tests) - deps: ['handlebars', 'mochaConfig', tests], - - // start test run, once Require.js is done - callback: window.__karma__.start -}); diff --git a/karma-setup/requirejs/karma.conf.js b/karma-setup/requirejs/karma.conf.js deleted file mode 100644 index e248bc1be..000000000 --- a/karma-setup/requirejs/karma.conf.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = function(config) { - config.set({ - baseUrl: '../..', - reporters: ['dots'], - frameworks: ['mocha', 'requirejs'], - browsers: ['Chrome'], - files: [ - { pattern: 'node_modules/sinon/pkg/sinon.js', included: false }, - { pattern: 'node_modules/chai/chai.js', included: false }, - { pattern: 'node_modules/dirty-chai/lib/dirty-chai.js', included: false }, - { pattern: 'dist/handlebars.amd.js', included: false }, - 'karma-setup/karma-includes/browser-context.js', - 'spec/vendor/json2.js', - 'spec/env/common.js', - 'karma-setup/karma-includes/require-config.js', - { pattern: 'spec/*.js', included: false } - ] - }); -}; diff --git a/karma-setup/shared/default-config.js b/karma-setup/shared/default-config.js deleted file mode 100644 index ae02af213..000000000 --- a/karma-setup/shared/default-config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - frameworks: ['mocha'], - // concurrency: we have no concurrency set, because this seems to let Karma hang after the first batch - // of browsers have finished their tests. - reporters: ['dots'] -}; diff --git a/karma-setup/shared/default-files.js b/karma-setup/shared/default-files.js deleted file mode 100644 index 502fd231f..000000000 --- a/karma-setup/shared/default-files.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function files(...additionalFiles) { - return [ - 'node_modules/sinon/pkg/sinon.js', - 'node_modules/chai/chai.js', - 'node_modules/dirty-chai/lib/dirty-chai.js', - 'node_modules/mocha/mocha.js', - ...additionalFiles, - 'spec/browser-setup/browser-context.js', - 'spec/browser-setup/mocha.js', - 'spec/vendor/json2.js', - 'spec/env/common.js' - ]; -}; diff --git a/karma-setup/karma-includes/browser-context.js b/karma-setup/shared/global-compiler-context.browser.js similarity index 100% rename from karma-setup/karma-includes/browser-context.js rename to karma-setup/shared/global-compiler-context.browser.js From b7aa22efc3314318e19e535ea43f6a01c4e8a00f Mon Sep 17 00:00:00 2001 From: Nils Knappmeier Date: Tue, 2 Jun 2020 00:11:10 +0200 Subject: [PATCH 4/4] wip: only run "require"-test, if "require-extensions" exists "require" does not mean "amd" in this case... --- spec/require.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spec/require.js b/spec/require.js index f8ddba59a..8f8e9b089 100644 --- a/spec/require.js +++ b/spec/require.js @@ -1,4 +1,8 @@ -if (typeof require !== 'undefined' && require.extensions['.handlebars']) { +if ( + typeof require !== 'undefined' && + require.extensions && + require.extensions['.handlebars'] +) { describe('Require', function() { it('Load .handlebars files with require()', function() { var template = require('./artifacts/example_1');