diff --git a/.travis.yml b/.travis.yml index 8a338ad..c5a2127 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,7 +26,7 @@ cache: directories: - node_modules before_deploy: -- ci/build.sh +- npm run build-stage deploy: skip_cleanup: true provider: script diff --git a/ci/build.sh b/ci/build.sh deleted file mode 100755 index 947e3c3..0000000 --- a/ci/build.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh -set -e -CLOSURE_COMPILER_URL="https://dl.google.com/closure-compiler/compiler-latest.zip" -PROD_GOOGLE_ANALYTICS="UA-112154345-1" -STAGE_GOOGLE_ANALYTCIS="UA-112154345-2" - -install_closure() { - wget $CLOSURE_COMPILER_URL -O /tmp/closure.zip - mkdir /tmp/closure/ - unzip /tmp/closure.zip -d /tmp/closure/ - CLOSURE_JAR=$(ls /tmp/closure/closure-compiler-*.jar) - export CLOSURE_PATH=$CLOSURE_JAR -} - -build_package() { - if [ -n "$TRAVIS_TAG" ]; then - export GOOGLE_ANALYTICS_TAG="$PROD_GOOGLE_ANALYTICS" - echo "Using prod google analytics tag" - else - export GOOGLE_ANALYTICS_TAG="$STAGE_GOOGLE_ANALYTCIS" - echo "Using stage google analytics tag" - fi - PRODUCTION=1 npm run webpack -} - -build_info() { - VERSION=$(git describe --tags --always) - echo "version: ${VERSION}" >> dist/version-info.txt - echo "time: $(TZ=UTC date +'%Y-%m-%d %H:%M')" >> dist/version-info.txt - if [ -n "$TRAVIS" ]; then - echo "build id: TRAVIS ${TRAVIS_JOB_NUMBER} (${TRAVIS_BUILD_ID})" >> dist/version-info.txt - fi -} - - -install_closure -build_package -build_info diff --git a/gulpfile.js b/gulpfile.js index 0010cdf..faa134c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -7,6 +7,8 @@ const istanbul = require("gulp-istanbul"); const remapIstanbul = require("remap-istanbul/lib/gulpRemapIstanbul"); const tsProject = ts.createProject("tsconfig.json"); const del = require('del'); +const { getWebpackConfig } = require('./webpack.base'); +const webpack = require('webpack'); function coverage_build() { return tsProject.src() @@ -52,8 +54,7 @@ function lint() { } function clean(cb) { - del(['dist', 'test-dist', 'coverage-dist', 'coverage']) - .then(paths => cb()); + del(['dist', 'test-dist', 'coverage-dist', 'coverage']).then(paths => cb()); } function test_build() { @@ -64,8 +65,28 @@ const test = gulp.series(test_build, function() { return gulp.src("test-dist/**/*.spec.js").pipe(jasmine()); }); +function build_webpack(gtag, cb) { + webpack(getWebpackConfig(true, gtag), (err, stats) => { + cb(); + }); +} + +function clean_dist(cb) { + del(['dist']).then(paths => cb()); +} + +function build_prod(cb) { + build_webpack("UA-112154345-1", cb); +} + +function build_stage(cb) { + build_webpack("UA-112154345-2", cb); +} + exports.lint = lint; exports.clean = clean; exports.test = test; exports.coverage = coverage; +exports.build_prod = gulp.series(clean_dist, build_prod); +exports.build_stage = gulp.series(clean_dist, build_stage); exports.default = gulp.parallel(lint, gulp.series(test, coverage)); diff --git a/package-lock.json b/package-lock.json index 13a4dc5..3068061 100644 --- a/package-lock.json +++ b/package-lock.json @@ -423,6 +423,23 @@ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, "adm-zip": { "version": "0.4.13", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", @@ -472,7 +489,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true + "dev": true, + "optional": true }, "ansi-colors": { "version": "1.1.0", @@ -521,12 +539,6 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", @@ -677,12 +689,6 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -1024,12 +1030,6 @@ "tweetnacl": "^0.14.3" } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1429,19 +1429,6 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, "chokidar": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", @@ -1628,12 +1615,6 @@ } } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, "clone-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", @@ -1651,12 +1632,6 @@ "shallow-clone": "^3.0.0" } }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, "cloneable-readable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", @@ -1668,6 +1643,19 @@ "readable-stream": "^2.3.5" } }, + "closure-webpack-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/closure-webpack-plugin/-/closure-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZQz24BstWdqOwyo3ttOOqS2V/CxZ9AXEO5P3W3oIO3e0ZtnL2KefFEJ+NtVwNcuvtp64ZiQf0zWs0Jur/QLtfA==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "schema-utils": "1.x", + "unquoted-property-validator": "^1.0.2", + "webpack-sources": "1.x" + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -2218,12 +2206,6 @@ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2605,41 +2587,6 @@ "domelementtype": "1" } }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -3828,7 +3775,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -3849,12 +3797,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3869,17 +3819,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -3996,7 +3949,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4008,6 +3962,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4022,6 +3977,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4029,12 +3985,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4053,6 +4011,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4133,7 +4092,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4145,6 +4105,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4230,7 +4191,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4266,6 +4228,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4285,6 +4248,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4328,12 +4292,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4414,16 +4380,42 @@ } }, "google-closure-compiler": { - "version": "20170626.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20170626.0.0.tgz", - "integrity": "sha1-DSqXXTReGqE7N+VYMlCdWbqKh+A=", + "version": "20190819.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20190819.0.0.tgz", + "integrity": "sha512-5cwcui89TSFrKCa+oH5zq6F0esSHkGbWt1U2LgywakFhe5F27j/0F6NR7QyFYkBf3leDt5kPBvC2Dlc3ZwuFVA==", "dev": true, "requires": { - "chalk": "^1.0.0", - "vinyl": "^2.0.1", + "chalk": "2.x", + "google-closure-compiler-java": "^20190819.0.0", + "google-closure-compiler-js": "^20190819.0.0", + "google-closure-compiler-linux": "^20190819.0.0", + "google-closure-compiler-osx": "^20190819.0.0", + "google-closure-compiler-windows": "^20190819.0.0", + "minimist": "1.x", + "vinyl": "2.x", "vinyl-sourcemaps-apply": "^0.2.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -4436,12 +4428,39 @@ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, + "google-closure-compiler-js": { + "version": "20190819.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20190819.0.0.tgz", + "integrity": "sha512-c1MrCW2sBsJ5d5judH6YnBPpxbOzts6D7XYa0KN4I97S0LjXzX5cENBlMUqMGGeSdFyjGr5FP0BxGp49k5UKxQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", @@ -4458,24 +4477,32 @@ } } }, - "google-closure-compiler-js": { - "version": "20170124.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20170124.0.0.tgz", - "integrity": "sha1-zXcpGhmkFY60H7JBaIpeUj4lA2Q=", + "google-closure-compiler-java": { + "version": "20190819.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20190819.0.0.tgz", + "integrity": "sha512-i8KzPJZBEF0aZWSn2vlkH0JCeQGIxBVfQaUwc2fCjPbm/v5YfpZzkj38LoMDbE95BlYsq2cPveHUNC4w85UgGw==", + "dev": true + }, + "google-closure-compiler-linux": { + "version": "20190819.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20190819.0.0.tgz", + "integrity": "sha512-+ia89Ot4dPyRioLlxvkfYiISwJO+2NV7SY0Zp/KfTt9x+eJaGQ9GRIQage50d1mGkUyPmFfxsdPUePpT1QlpaA==", "dev": true, - "requires": { - "gulp-util": "^3.0.7", - "minimist": "^1.2.0", - "webpack-core": "^0.6.8" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } + "optional": true + }, + "google-closure-compiler-osx": { + "version": "20190819.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20190819.0.0.tgz", + "integrity": "sha512-woANg+oA2zjFebtdYTA4lLtqbOVO9yE9yy8ibGjt76FNlw0bAyxTO4z2ab4CwUNNpOeRoxZyGt9CejlCmNpxJg==", + "dev": true, + "optional": true + }, + "google-closure-compiler-windows": { + "version": "20190819.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20190819.0.0.tgz", + "integrity": "sha512-WglPY706c1oN03KiZF02FUWr/7M0eFoev4CQPncSihfjYXpD5E5PMKJ3ppawhzj60CQ9ceC/Omx7VN7Kp0uOQg==", + "dev": true, + "optional": true }, "graceful-fs": { "version": "4.2.2", @@ -4901,46 +4928,6 @@ } } }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, "gulplog": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", @@ -5001,15 +4988,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", @@ -5039,15 +5017,6 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", @@ -6368,60 +6337,6 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -6434,83 +6349,18 @@ "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", "dev": true }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, "lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -6990,15 +6840,6 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, "mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -8124,12 +7965,6 @@ "is-finite": "^1.0.0" } }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, "replace-homedir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", @@ -9231,12 +9066,6 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, "sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", @@ -9279,24 +9108,6 @@ } } }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, "terser": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.4.tgz", @@ -10026,6 +9837,12 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unquoted-property-validator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unquoted-property-validator/-/unquoted-property-validator-1.1.0.tgz", + "integrity": "sha512-ZWeQoYZ7HN8DCLeaowNv2GvZIXqJptKB1uUWd08ZYc1qAmJt8tXh9nck26aoYmhJtE3jCjDqdqEfUTqcJ0R7bw==", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -10241,17 +10058,6 @@ "extsprintf": "^1.2.0" } }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, "vinyl-fs": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", @@ -10487,7 +10293,6 @@ "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10502,8 +10307,7 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", @@ -10514,8 +10318,7 @@ "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -10632,8 +10435,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -10645,7 +10447,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -10660,7 +10461,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -10668,14 +10468,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -10694,7 +10492,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -10775,8 +10572,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -10788,7 +10584,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -10910,7 +10705,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -11185,46 +10979,6 @@ } } }, - "webpack-closure-compiler": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/webpack-closure-compiler/-/webpack-closure-compiler-2.1.6.tgz", - "integrity": "sha512-oF+IeWTlutfJJ+KduZpCJzNsU3BsGn/vbhXnsjhU9/GBcbc0ORm1SbeHPCO01Dja5dQZpkbxUnnsmAg0+8cI6w==", - "dev": true, - "requires": { - "async": "^1.5.2", - "google-closure-compiler": "^20170626.0.0", - "google-closure-compiler-js": "^20170124.0.0", - "temp": "^0.8.3", - "webpack-core": "^0.6.9" - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "dev": true, - "requires": { - "source-list-map": "~0.1.7", - "source-map": "~0.4.1" - }, - "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "webpack-dev-middleware": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", @@ -11455,7 +11209,8 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", @@ -11466,7 +11221,8 @@ "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -11583,7 +11339,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -11595,6 +11352,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -11617,12 +11375,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -11641,6 +11401,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -11721,7 +11482,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -11733,6 +11495,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -11854,6 +11617,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", diff --git a/package.json b/package.json index fbd3817..7924b25 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,11 @@ }, "devDependencies": { "clean-webpack-plugin": "^3.0.0", + "closure-webpack-plugin": "^2.0.1", "copy-webpack-plugin": "^5.0.4", "coveralls": "^3.0.6", "del": "^5.0.0", + "google-closure-compiler": "^20190819.0.0", "gulp": "^4.0.2", "gulp-istanbul": "^1.1.3", "gulp-sourcemaps": "^2.6.4", @@ -34,7 +36,6 @@ "typescript": "^3.5.3", "webpack": "^4.39.2", "webpack-cli": "^3.3.6", - "webpack-closure-compiler": "^2.1.6", "webpack-dev-server": "^3.1.3" }, "scripts": { @@ -43,6 +44,8 @@ "cover": "gulp coverage", "clean": "gulp clean", "all": "gulp default", + "build-prod": "gulp build_prod", + "build-stage": "gulp build_stage", "browser-test": "karma start", "webpack": "webpack", "dev-server": "webpack-dev-server" diff --git a/src/googleAnalytics.ts b/src/googleAnalytics.ts index b39ea4e..98347c7 100644 --- a/src/googleAnalytics.ts +++ b/src/googleAnalytics.ts @@ -1,5 +1,6 @@ /* tslint:disable:no-empty */ /* tslint:disable:only-arrow-functions */ +/** @type {function(...*):void} */ export let gtag: (...args: any[]) => void = () => {}; if (GOOGLE_ANALYTICS_TAG) { diff --git a/src/keygen/asus.ts b/src/keygen/asus.ts index 8b26c3c..a4a06eb 100644 --- a/src/keygen/asus.ts +++ b/src/keygen/asus.ts @@ -2,6 +2,7 @@ /* tslint:disable:no-bitwise */ import { makeSolver } from "./utils"; +/** @type {function(number=,number=,number=):Array} */ function initTable(a1: number = 11, a2: number = 19, a3: number = 6): number[] { let table: number[] = []; const zeroCode = "0".charCodeAt(0); diff --git a/webpack.base.js b/webpack.base.js new file mode 100644 index 0000000..8d70461 --- /dev/null +++ b/webpack.base.js @@ -0,0 +1,131 @@ +const path = require('path'); +const ClosurePlugin = require('closure-webpack-plugin'); +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const { DefinePlugin } = require('webpack'); +const { exec } = require('child_process'); +const fs = require('fs'); + + +function makeClosureCompiler() { + const externDir = path.join(__dirname, "externs"); + const externs = [ + path.join(externDir, "googleAnalytics.js"), + path.join(externDir, "performance.js"), + path.join(externDir, "webassembly.js") + ]; + + var flags = { + compilation_level: "ADVANCED", + externs: externs + }; + + return new ClosurePlugin({mode: 'STANDARD'}, flags); +} + + +class VersionInfoPlugin { + constructor(options = {}) { + if (options.filename == void 0) { + throw new Error('[VersionInfoPlugin] filename should be set'); + } + this.options = options; + } + + apply(compiler) { + const plugin = { name: 'VersionInfoPlugin' } + compiler.hooks.afterEmit.tapAsync(plugin, (compilation, callback) => { + exec('git describe --tags --always', (error, stdout, stderr) => { + if (error) { + compilation.errors.push(error); + callback(); + return; + } + + var version_info = `version: ${stdout.trim()}\ntime: ${new Date().toISOString()}\n`; + if (process.env.TRAVIS) { + version_info += `build id: TRAVIS ${process.env.TRAVIS_JOB_NUMBER} (${process.env.TRAVIS_BUILD_ID})\n`; + } + + const filename = path.join(compiler.options.output.path, this.options.filename); + + fs.writeFile(filename, version_info, (err) => { + if (err) { + compilation.errors.push(err); + } + callback(); + }) + }); + }); + } +} + +function getWebpackConfig(production, gtag) { + var webpackMode; + + production = (typeof(production) === 'undefined') ? false : production; + gtag = (typeof(gtag) === 'undefined') ? "" : gtag; + + var plugins = [ + new CleanWebpackPlugin(), + new CopyWebpackPlugin([ + { + from: 'assets/bootstrap.min.css', + to: 'assets/' + } + ]), + new DefinePlugin({ + GOOGLE_ANALYTICS_TAG: JSON.stringify(gtag) + }), + new HtmlWebpackPlugin({ + minify: { + collapseWhitespace: true, + conservativeCollapse: true, + removeComments: true + }, + inject: true, + template: 'html/index.html' + }), + new VersionInfoPlugin({filename: 'version-info.txt'}) + ]; + + if (production) { + plugins.push(makeClosureCompiler()); + webpackMode = "production"; + } else { + webpackMode = "development"; + } + + return { + entry: "./src/ui.ts", + output: { + filename: "assets/bundle.[hash].js", + path: path.join(__dirname, "dist") + }, + plugins: plugins, + optimization: { + concatenateModules: false + }, + devtool: "source-map", + devServer: { + contentBase: path.join(__dirname, "dist"), + port: 9000 + }, + resolve: { + extensions: ['.ts', '.tsx', '.js'] + }, + mode: webpackMode, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [{loader: 'ts-loader', options: {transpileOnly: true}}] + } + ] + } + } +} + +exports.getWebpackConfig = getWebpackConfig diff --git a/webpack.config.js b/webpack.config.js index 1ddd7dc..8ae5468 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,89 +1,4 @@ -const path = require('path'); -const os = require('os'); -const ClosureCompilerPlugin = require('webpack-closure-compiler'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); -const { CleanWebpackPlugin } = require('clean-webpack-plugin'); -const webpack = require('webpack'); -var webpackMode; - -function makeClosureCompiler() { - const externDir = path.join(__dirname, "externs"); - const externs = [ - path.join(externDir, "googleAnalytics.js"), - path.join(externDir, "performance.js"), - path.join(externDir, "webassembly.js") - ]; - - var pluginOptions = { - compiler: { - compilation_level: "ADVANCED", - create_source_map: true, - externs: externs - }, - concurrency: os.cpus().length - }; - - if (process.env.CLOSURE_PATH) { - pluginOptions.compiler.jar = process.env.CLOSURE_PATH; - } - - return new ClosureCompilerPlugin(pluginOptions); -} - -var plugins = [ - new CleanWebpackPlugin(), - new CopyWebpackPlugin([ - { - from: 'assets/bootstrap.min.css', - to: 'assets/' - } - ]), - new webpack.DefinePlugin({ - GOOGLE_ANALYTICS_TAG: JSON.stringify(process.env.GOOGLE_ANALYTICS_TAG) - }), - new HtmlWebpackPlugin({ - minify: { - collapseWhitespace: true, - conservativeCollapse: true, - removeComments: true - }, - inject: true, - template: 'html/index.html' - }) -]; - -if (process.env.PRODUCTION) { - plugins.push(makeClosureCompiler()); - webpackMode = "production"; -} else { - webpackMode = "development"; -} +const { getWebpackConfig } = require('./webpack.base'); -module.exports = { - entry: "./src/ui.ts", - output: { - filename: "assets/bundle.[hash].js", - path: path.join(__dirname, "dist") - }, - plugins: plugins, - devtool: "source-map", - devServer: { - contentBase: path.join(__dirname, "dist"), - port: 9000 - }, - resolve: { - extensions: ['.ts', '.tsx', '.js'] - }, - mode: webpackMode, - module: { - rules: [ - { - test: /\.ts$/, - exclude: /node_modules/, - use: [{loader: 'ts-loader', options: {transpileOnly: true}}] - } - ] - } -} +module.exports = getWebpackConfig(process.env.PRODUCTION, process.env.GOOGLE_ANALYTICS_TAG);