From 77ddd78d840ea994be245c95034fd979e7148d67 Mon Sep 17 00:00:00 2001 From: shmyga Date: Mon, 9 Sep 2019 17:56:08 +0300 Subject: [PATCH] [editor] support level pack edit --- gulpfile.js | 18 - package-lock.json | 1063 ++++++++++++----- package.json | 2 - .../haxe/ru/m/tankz/bundle/LevelBundle.hx | 13 +- src/client/haxe/ru/m/tankz/local/LocalGame.hx | 2 +- src/client/haxe/ru/m/tankz/view/LevelFrame.hx | 4 +- src/client/haxe/ru/m/tankz/view/MenuFrame.hx | 30 +- .../haxe/ru/m/tankz/view/MenuFrame.yaml | 143 ++- src/client/haxe/ru/m/tankz/view/ViewUtil.hx | 5 + src/common/haxe/ru/m/tankz/Type.hx | 4 + .../haxe/ru/m/tankz/bundle/ILevelBundle.hx | 1 + src/common/haxe/ru/m/tankz/util/LevelUtil.hx | 28 + src/common/resources/level/classic_modern.zip | Bin 0 -> 1532 bytes .../resources/level/classic_standard.zip | Bin 0 -> 8918 bytes src/common/resources/level/death_standard.zip | Bin 0 -> 1385 bytes src/common/resources/level/dota_standard.zip | Bin 0 -> 9124 bytes src/editor/haxe/ru/m/tankz/editor/Editor.hx | 2 + .../haxe/ru/m/tankz/editor/EditorStorage.hx | 22 + src/editor/haxe/ru/m/tankz/editor/FileUtil.hx | 17 +- .../haxe/ru/m/tankz/editor/view/PackFrame.hx | 50 +- .../ru/m/tankz/editor/view/PackFrame.yaml | 38 +- .../ru/m/tankz/editor/view/PackListFrame.hx | 57 +- .../ru/m/tankz/editor/view/PackListFrame.yaml | 29 +- .../haxe/ru/m/tankz/editor/view/PackView.hx | 50 + .../haxe/ru/m/tankz/editor/view/PackView.yaml | 14 + 25 files changed, 1125 insertions(+), 467 deletions(-) create mode 100644 src/common/resources/level/classic_modern.zip create mode 100644 src/common/resources/level/classic_standard.zip create mode 100644 src/common/resources/level/death_standard.zip create mode 100644 src/common/resources/level/dota_standard.zip create mode 100644 src/editor/haxe/ru/m/tankz/editor/EditorStorage.hx create mode 100644 src/editor/haxe/ru/m/tankz/editor/view/PackView.hx create mode 100644 src/editor/haxe/ru/m/tankz/editor/view/PackView.yaml diff --git a/gulpfile.js b/gulpfile.js index 59936c9..4df69b2 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,11 +1,8 @@ const gulp = require('gulp'); -const zip = require('gulp-zip'); -const foreach = require('gulp-foreach'); const gulpClean = require('gulp-clean'); const Config = require('./config.json'); const packageInfo = require('./package.json'); const {System, Sdk, Haxe, Project} = require('gulp-haxetool'); -const path = require('path'); const dateformat = require('dateformat'); const argv = require('yargs').argv; const publish = require('./tasks/gulp-publish'); @@ -26,19 +23,6 @@ exports.generate = function generate() { }); }; -exports.levels = function levels() { - return gulp.src("./src/common/level/*").pipe(foreach(function (stream, file) { - const type = file.path.substr(file.path.lastIndexOf(path.sep) + 1); - gulp.src("./src/common/level/" + type + "/*").pipe(foreach(function (stream, file) { - const name = file.path.substr(file.path.lastIndexOf(path.sep) + 1); - gulp.src("./src/common/level/" + type + "/" + name + "/*") - .pipe(zip(`${type}_${name}.zip`)) - .pipe(gulp.dest("./target/levels")); - })); - return stream; - })); -}; - /** * base config */ @@ -59,7 +43,6 @@ const config = new Project.Config({ ], assets: [ 'src/common/resources', - 'target/levels' ], flags: [ //'proto_debug', @@ -168,7 +151,6 @@ module.exports.publish = publish(packageInfo.name, packageInfo.version, Config.P */ const defaultSeries = [ exports.clean, - exports.levels, exports.generate, module.exports['client:flash:build'], module.exports['client:flash:html'], diff --git a/package-lock.json b/package-lock.json index 6cdc39c..edb0646 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,24 @@ { "name": "tankz", - "version": "0.15.1", + "version": "0.16.12", "lockfileVersion": 1, "requires": true, "dependencies": { "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -74,6 +83,12 @@ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -93,6 +108,151 @@ "buffer-equal": "^1.0.0" } }, + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "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 + }, + "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 + }, + "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, + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -232,12 +392,12 @@ "dev": true }, "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "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.11" + "lodash": "^4.17.14" } }, "async-done": { @@ -351,6 +511,12 @@ } } }, + "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 + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -379,6 +545,43 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "bl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", + "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", + "dev": true, + "requires": { + "readable-stream": "^3.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "bluebird": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", @@ -401,6 +604,12 @@ "type-is": "~1.5.1" }, "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, "depd": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.5.tgz", @@ -475,6 +684,16 @@ "integrity": "sha1-jfPNyiW/fVs1QtYVRdcwBT/OYEo=", "dev": true }, + "buffer": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.2.tgz", + "integrity": "sha512-iy9koArjAFCzGnx3ZvNA6Z0clIbbFgbdWQ0mKD3hO0krOrZh8UgA6qMKcZvwLJxS+D6iVR76+5/pV56yMNYTag==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -506,9 +725,9 @@ "dev": true }, "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, "cache-base": { @@ -529,25 +748,44 @@ } }, "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" }, "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } } } }, @@ -639,6 +877,43 @@ } } }, + "cli-progress": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.1.0.tgz", + "integrity": "sha512-kyJpr4D/TJpxJbXvlv564Aaapsz02b/INF3Wh0F2+o+baeTzw5ylhUR6FyQh7M/nFEubD1QYkydVPBOYkYQfKA==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -791,12 +1066,74 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "dev": true + }, "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 }, + "compress-commons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 + }, + "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 + }, + "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, + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -905,6 +1242,53 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -1006,6 +1390,12 @@ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", "dev": true }, + "defer-to-connect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", + "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==", + "dev": true + }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", @@ -1620,53 +2010,11 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "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, - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true }, "fs-extra": { "version": "5.0.0", @@ -2325,10 +2673,25 @@ "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } }, "get-value": { "version": "2.0.6", @@ -2483,36 +2846,22 @@ } }, "got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" } }, "graceful-fs": { @@ -3028,76 +3377,119 @@ } }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true } } }, - "gulp-foreach": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/gulp-foreach/-/gulp-foreach-0.1.0.tgz", - "integrity": "sha1-JUer/RobdfVptUGUGQ7xwLAolTg=", + "gulp-gzip": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gulp-gzip/-/gulp-gzip-1.4.2.tgz", + "integrity": "sha512-ZIxfkUwk2XmZPTT9pPHrHUQlZMyp9nPhg2sfoeN27mBGpi7OaHnOD+WCN41NXjfJQ69lV1nQ9LLm1hYxx4h3UQ==", "dev": true, "requires": { - "gulp-util": "~2.2.14", - "through2": "~0.6.3" + "ansi-colors": "^1.0.1", + "bytes": "^3.0.0", + "fancy-log": "^1.3.2", + "plugin-error": "^1.0.0", + "stream-to-array": "^2.3.0", + "through2": "^2.0.3" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "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 + }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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, "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" } }, "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true } } }, "gulp-haxetool": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/gulp-haxetool/-/gulp-haxetool-0.0.20.tgz", - "integrity": "sha512-ePL/TktdKuThiNY6I/UGiM9FH5gXucQDFBM42OhrUSWASEwdPOJUK3T39SXMX0taUngLpn3RNwHk8LbnA/rl3A==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gulp-haxetool/-/gulp-haxetool-0.1.0.tgz", + "integrity": "sha512-HTR8fUf/si6udIVD8OrH18d8inAZdZkAvX2lP5L+XWlyVDoRyIF0GTpkTJzuKezv5BGzNRjVn5cx9cQ7MwSJsQ==", "dev": true, "requires": { "ansi-colors": "^1.1.0", "async": "^2.6.0", + "cli-progress": "^3.0.0", "fancy-log": "^1.3.2", "fs-extra": "^5.0.0", - "got": "^8.3.0", + "got": "^9.6.0", "gulp": "^4.0.0", "gulp-debian": "^0.1.9", + "gulp-gzip": "^1.4.2", "gulp-rename": "^1.2.2", "gulp-spawn": "^0.4.0", + "gulp-tar": "^3.0.0", "gulp-webserver": "^0.9.1", + "gulp-zip": "^5.0.0", "lodash.defaults": "^4.2.0", "lodash.template": "^4.4.0", "plugin-error": "^1.0.1", - "progress": "^2.0.0", "promise-streams": "^2.1.1", "tail": "^1.2.3", - "tar": "^4.4.1", + "tar": "^4.4.10", "through2": "^2.0.3", "tmp-file": "^2.0.1", "unzip-stream": "^0.3.0", @@ -3130,22 +3522,22 @@ "dev": true }, "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "dev": true, "requires": { - "lodash._reinterpolate": "~3.0.0", + "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "dev": true, "requires": { - "lodash._reinterpolate": "~3.0.0" + "lodash._reinterpolate": "^3.0.0" } }, "plugin-error": { @@ -3215,9 +3607,9 @@ } }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true } } @@ -3252,6 +3644,87 @@ } } }, + "gulp-tar": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-tar/-/gulp-tar-3.0.0.tgz", + "integrity": "sha512-vgUeodtzF5QY4i74QEYHUVZN9YCY3OOTZhMWYHC3J76T1n/lMltJYupbNI1UZyYin7rwdLjV+dZDiN2w6Pjc6Q==", + "dev": true, + "requires": { + "archiver": "^3.1.1", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0" + }, + "dependencies": { + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, "gulp-util": { "version": "2.2.20", "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", @@ -3431,27 +3904,12 @@ "sparkles": "^1.0.0" } }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3500,9 +3958,9 @@ "dev": true }, "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", "dev": true }, "http-errors": { @@ -3529,6 +3987,12 @@ "integrity": "sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g=", "dev": true }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -3566,16 +4030,6 @@ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "dev": true, - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - } - }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", @@ -3749,18 +4203,6 @@ } } }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3779,12 +4221,6 @@ "is-unc-path": "^1.0.0" } }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3842,16 +4278,6 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -3889,9 +4315,9 @@ "dev": true }, "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, "requires": { "json-buffer": "3.0.0" @@ -4026,9 +4452,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash._basecopy": { @@ -4153,6 +4579,12 @@ "lodash.keys": "~2.4.1" } }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, "lodash.escape": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", @@ -4164,6 +4596,12 @@ "lodash.keys": "~2.4.1" } }, + "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", @@ -4185,6 +4623,12 @@ "lodash._objecttypes": "~2.4.1" } }, + "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": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", @@ -4227,6 +4671,12 @@ "lodash.escape": "~2.4.1" } }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "dev": true + }, "lodash.values": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", @@ -4439,9 +4889,9 @@ "dev": true }, "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.5.0.tgz", + "integrity": "sha512-9FwMVYhn6ERvMR8XFdOavRz4QK/VJV8elU1x50vYexf9lslDcWe/f4HBRxCPd185ekRSjU6CfYyJCECa/CQy7Q==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -4607,15 +5057,10 @@ } }, "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - } + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.3.0.tgz", + "integrity": "sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==", + "dev": true }, "now-and-later": { "version": "2.0.0", @@ -4829,9 +5274,9 @@ } }, "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, "p-defer": { @@ -4846,12 +5291,6 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", @@ -4870,15 +5309,6 @@ "p-limit": "^2.0.0" } }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -5004,37 +5434,21 @@ } }, "plexer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/plexer/-/plexer-1.0.2.tgz", - "integrity": "sha512-YvKSr441x/P9tNuNHUyDWGUSnzsCNXox425j14/3+YcwMyVnJs11qiz/ZWti/y+UNhCFu4SkDSelHYY5hXpifQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/plexer/-/plexer-1.0.3.tgz", + "integrity": "sha512-U8iVMgA9Asku2az1HCoYUywL54hypBQ0d2svuDb3aO8MsuvhQKz/I3db2WtZcRQWe42N/3E8Pru/F/WvzIh6UA==", "dev": true, "requires": { - "debug": "2.6.1", "isstream": "^0.1.2", "readable-stream": "^2.0.2" }, "dependencies": { - "debug": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz", - "integrity": "sha1-eYVQkLosTjEVzH2HaUkdWPBJE1E=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -5149,12 +5563,6 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "promise-streams": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/promise-streams/-/promise-streams-2.1.1.tgz", @@ -5197,17 +5605,6 @@ "integrity": "sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=", "dev": true }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -5222,6 +5619,14 @@ "requires": { "bytes": "1", "iconv-lite": "0.4.4" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + } } }, "read-pkg": { @@ -5805,15 +6210,6 @@ } } }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -5931,11 +6327,14 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true + "stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=", + "dev": true, + "requires": { + "any-promise": "^1.1.0" + } }, "string-width": { "version": "3.1.0", @@ -6041,6 +6440,47 @@ "yallist": "^3.0.3" } }, + "tar-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", + "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", + "dev": true, + "requires": { + "bl": "^3.0.0", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -6141,12 +6581,6 @@ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, "tiny-lr": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.1.4.tgz", @@ -6227,6 +6661,12 @@ } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -6532,12 +6972,6 @@ "prepend-http": "^2.0.0" } }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, "use": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", @@ -6884,6 +7318,45 @@ "requires": { "buffer-crc32": "~0.2.3" } + }, + "zip-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.2.tgz", + "integrity": "sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } } } } diff --git a/package.json b/package.json index b8cea06..59a2df2 100755 --- a/package.json +++ b/package.json @@ -7,9 +7,7 @@ "gulp": "^4.0.0", "gulp-add": "0.0.2", "gulp-clean": "^0.4.0", - "gulp-foreach": "^0.1.0", "gulp-haxetool": "0.1.0", - "gulp-zip": "^5.0.0", "yargs": "^13.2.4" }, "haxeDependencies": { diff --git a/src/client/haxe/ru/m/tankz/bundle/LevelBundle.hx b/src/client/haxe/ru/m/tankz/bundle/LevelBundle.hx index 3e6dd18..aa529fe 100644 --- a/src/client/haxe/ru/m/tankz/bundle/LevelBundle.hx +++ b/src/client/haxe/ru/m/tankz/bundle/LevelBundle.hx @@ -1,6 +1,7 @@ package ru.m.tankz.bundle; import openfl.Assets; +import openfl.utils.AssetType; import ru.m.tankz.config.Config; import ru.m.tankz.Type; import ru.m.tankz.util.LevelUtil; @@ -12,7 +13,7 @@ class LevelBundle implements ILevelBundle { public function new() {} private function resolve(id:PackId):LevelPack { - var bytes = Assets.getBytes('levels/${id}.zip'); + var bytes = Assets.getBytes('resources/level/${id}.zip'); return { id: id, data: LevelUtil.unpack(bytes).map(function(level) { @@ -28,4 +29,14 @@ class LevelBundle implements ILevelBundle { } return _cache.get(id); } + + public function list():Array { + var result = []; + for (path in Assets.list(AssetType.BINARY)) { + if (StringTools.startsWith(path, "resources/level")) { + result.push(PackId.fromString(path.split("/").pop().split(".").shift())); + } + } + return result; + } } diff --git a/src/client/haxe/ru/m/tankz/local/LocalGame.hx b/src/client/haxe/ru/m/tankz/local/LocalGame.hx index 66fa986..fe6b1d3 100644 --- a/src/client/haxe/ru/m/tankz/local/LocalGame.hx +++ b/src/client/haxe/ru/m/tankz/local/LocalGame.hx @@ -33,7 +33,7 @@ class LocalGame extends GameRunner { } } if (humansTeams.length == 1 && result.winner == humansTeams[0]) { - var progress = gameStorage.get(new PackId(result.state.type)); + var progress = gameStorage.get(result.level.packId); progress.completeLevel(result.level.id, result.state.presetId); gameStorage.set(progress); } diff --git a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx index 6484591..5c8993a 100644 --- a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx @@ -12,6 +12,8 @@ import ru.m.tankz.game.GameState; import ru.m.tankz.storage.GameStorage; import ru.m.tankz.Type.PackId; +using ru.m.tankz.view.ViewUtil; + @:template class LevelFrame extends FrameView { public static inline var ID = "level"; @@ -35,7 +37,7 @@ import ru.m.tankz.Type.PackId; } override public function onShow(data:PackId):Void { - header.text = data.type; + header.text = data.toPackLabel(); pack = levelBundle.get(data); levels.data = pack.data; } diff --git a/src/client/haxe/ru/m/tankz/view/MenuFrame.hx b/src/client/haxe/ru/m/tankz/view/MenuFrame.hx index 04fe352..2d31faf 100644 --- a/src/client/haxe/ru/m/tankz/view/MenuFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/MenuFrame.hx @@ -1,9 +1,11 @@ package ru.m.tankz.view; +import haxework.view.data.DataView; import haxework.view.form.ButtonView; import haxework.view.form.LabelView; import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameView; +import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.game.GameInit; import ru.m.tankz.game.GameState; import ru.m.tankz.network.NetworkManager; @@ -12,15 +14,19 @@ import ru.m.tankz.view.network.RoomFrame; import ru.m.tankz.view.network.RoomListFrame; import ru.m.tankz.view.popup.LoginPopup; +using ru.m.tankz.view.ViewUtil; + @:template class MenuFrame extends FrameView { public static var ID(default, never):String = "menu"; - @:provide var gameInit:GameInit; - @:provide var switcher:FrameSwitcher; - @:provide var network:NetworkManager; - @:provide var appUpdater:Updater; + @:provide static var gameInit:GameInit; + @:provide static var switcher:FrameSwitcher; + @:provide static var network:NetworkManager; + @:provide static var appUpdater:Updater; + @:provide static var levelBundle:ILevelBundle; + @:view var packs:DataView; @:view var username:LabelView; @:view("login") var loginButton:ButtonView; @:view("logout") var logoutButton:ButtonView; @@ -40,6 +46,9 @@ import ru.m.tankz.view.popup.LoginPopup; updateButton.text = 'Update ${appUpdater.bundle.version}'; } }); + var list = levelBundle.list(); + list.sort(function(a:PackId, b:PackId) return a.toPackLabel() > b.toPackLabel() ? 1 : -1); + packs.data = list; } override public function onHide():Void { @@ -47,9 +56,16 @@ import ru.m.tankz.view.popup.LoginPopup; network.stateSignal.disconnect(onConnectionState); } - private function startGame(type:GameType):Void { - gameInit = LOCAL({state: new GameState(type), level: null}); - switcher.change(LevelFrame.ID, new PackId(type)); + private function packButtonFactory(index:Int, packId:PackId):ButtonView { + var result = new ButtonView(); + result.style = "button.menu"; + result.text = packId.toPackLabel(); + return result; + } + + private function startGame(packId:PackId):Void { + gameInit = LOCAL({state: new GameState(packId.type), level: null}); + switcher.change(LevelFrame.ID, packId); } private function startNetwork():Void { diff --git a/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml b/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml index f2a6060..d4b4572 100644 --- a/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml @@ -1,79 +1,74 @@ --- views: - - $type: haxework.view.group.VGroupView - style: container - overflow.y: scroll - views: - - $type: haxework.view.group.VGroupView - layout.margin: 10 - layout.hAlign: center - views: - - $type: haxework.view.form.LabelView - text: Tank'z - style: font - font.size: 100 - geometry.margin.bottom: 30 - - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~startGame('classic') - text: Classic - - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~startGame('dota') - text: DotA - - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~startGame('death') - text: DeathMatch - - $type: haxework.view.SpriteView - style: line - geometry.width: 250 - geometry.margin: [0, 10] - visible: false - - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~switcher.change('record') - text: Records - visible: false - - id: network - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~startNetwork() - text: Network - visible: false - - $type: haxework.view.form.LabelView - geometry.hAlign: right - geometry.vAlign: top - geometry.position: absolute - geometry.margin: [0, 20, 20, 0] - style: text.box - text: $r:text:version - - $type: haxework.view.group.HGroupView - style: panel - layout.margin: 10 - views: - - id: settings - $type: haxework.view.form.ButtonView - style: button.settings - +onPress: ~switcher.change('settings') + - $type: haxework.view.group.VGroupView + style: container + overflow.y: scroll + views: + - $type: haxework.view.group.VGroupView + layout.margin: 10 + layout.hAlign: center + views: + - $type: haxework.view.form.LabelView + text: Tank'z + style: font + font.size: 100 + geometry.margin.bottom: 30 + - id: packs + $type: haxework.view.data.DataView + layout: + $type: haxework.view.layout.VerticalLayout + margin: 10 + factory: ~packButtonFactory + +onDataSelect: ~startGame - $type: haxework.view.SpriteView - geometry.width: 50% - - id: username - $type: haxework.view.form.LabelView - style: text - - id: login - $type: haxework.view.form.ButtonView - style: button.login - +onPress: ~login() - - id: logout - $type: haxework.view.form.ButtonView - style: button.logout - +onPress: ~logout() + style: line + geometry.width: 250 + geometry.margin: [0, 10] visible: false - - $type: haxework.view.SpriteView - geometry.width: 50% - - id: update - $type: haxework.view.form.ButtonView - style: button.active - +onPress: ~appUpdate() + - $type: haxework.view.form.ButtonView + style: button.menu + +onPress: ~switcher.change('record') + text: Records visible: false + - id: network + $type: haxework.view.form.ButtonView + style: button.menu + +onPress: ~startNetwork() + text: Network + visible: false + - $type: haxework.view.form.LabelView + geometry.hAlign: right + geometry.vAlign: top + geometry.position: absolute + geometry.margin: [0, 20, 20, 0] + style: text.box + text: $r:text:version + - $type: haxework.view.group.HGroupView + style: panel + layout.margin: 10 + views: + - id: settings + $type: haxework.view.form.ButtonView + style: button.settings + +onPress: ~switcher.change('settings') + - $type: haxework.view.SpriteView + geometry.width: 50% + - id: username + $type: haxework.view.form.LabelView + style: text + - id: login + $type: haxework.view.form.ButtonView + style: button.login + +onPress: ~login() + - id: logout + $type: haxework.view.form.ButtonView + style: button.logout + +onPress: ~logout() + visible: false + - $type: haxework.view.SpriteView + geometry.width: 50% + - id: update + $type: haxework.view.form.ButtonView + style: button.active + +onPress: ~appUpdate() + visible: false diff --git a/src/client/haxe/ru/m/tankz/view/ViewUtil.hx b/src/client/haxe/ru/m/tankz/view/ViewUtil.hx index ba61851..fe9ff25 100644 --- a/src/client/haxe/ru/m/tankz/view/ViewUtil.hx +++ b/src/client/haxe/ru/m/tankz/view/ViewUtil.hx @@ -1,5 +1,6 @@ package ru.m.tankz.view; +import ru.m.tankz.Type.PackId; import openfl.Assets; import ru.m.control.DeviceAction; import ru.m.tankz.config.Config; @@ -40,6 +41,10 @@ class ViewUtil { return result.join(oneline ? " " : "\n"); } + public static function toPackLabel(packId:PackId):String { + return packId.name != PackId.DEFAULT ? '${packId.type} #${packId.name}' : packId.type; + } + public static function toActionLabel(action:TankAction):String { return switch (action) { case MOVE(d): 'MOVE_$d'; diff --git a/src/common/haxe/ru/m/tankz/Type.hx b/src/common/haxe/ru/m/tankz/Type.hx index 3e4693e..5da2b6d 100644 --- a/src/common/haxe/ru/m/tankz/Type.hx +++ b/src/common/haxe/ru/m/tankz/Type.hx @@ -80,6 +80,10 @@ abstract PackId(Array) { return new PackId(value[0], value[1]); } + @:from static public function fromString(value:String):PackId { + return fromArray(value.split("_")); + } + @:to public inline function toString():String { return '${type}_${name}'; } diff --git a/src/common/haxe/ru/m/tankz/bundle/ILevelBundle.hx b/src/common/haxe/ru/m/tankz/bundle/ILevelBundle.hx index 90b44a6..66939fc 100644 --- a/src/common/haxe/ru/m/tankz/bundle/ILevelBundle.hx +++ b/src/common/haxe/ru/m/tankz/bundle/ILevelBundle.hx @@ -5,4 +5,5 @@ import ru.m.tankz.Type; interface ILevelBundle { public function get(id:PackId):LevelPack; + public function list():Array; } diff --git a/src/common/haxe/ru/m/tankz/util/LevelUtil.hx b/src/common/haxe/ru/m/tankz/util/LevelUtil.hx index 5b3110b..ee2e928 100644 --- a/src/common/haxe/ru/m/tankz/util/LevelUtil.hx +++ b/src/common/haxe/ru/m/tankz/util/LevelUtil.hx @@ -1,5 +1,9 @@ package ru.m.tankz.util; +import haxe.zip.Tools; +import haxe.io.BytesOutput; +import haxe.zip.Writer; +import flash.utils.ByteArray; import haxe.io.Bytes; import haxe.io.BytesInput; import haxe.zip.Entry; @@ -87,8 +91,32 @@ class LevelUtil { return level; } + private static function compress(level:LevelConfig):Entry { + var content = LevelUtil.dumps(null, level); + var bytes = Bytes.ofString(content); + var crc = haxe.crypto.Crc32.make(bytes); + var result:Entry = { + fileName: '${formatLevel(level.id)}.txt', + fileSize: bytes.length, + fileTime : Date.now(), + compressed : false, + dataSize : bytes.length, + data : bytes, + crc32 : crc, + }; + Tools.compress(result, 9); + return result; + } + public static function unpack(bytes:Bytes):Array { var files = Reader.readZip(new BytesInput(bytes)); return Lambda.array(files.map(extract)); } + + public static function pack(data:Array):Bytes { + var output = new BytesOutput(); + var writer = new Writer(output); + writer.write(Lambda.list(data.map(compress))); + return output.getBytes(); + } } diff --git a/src/common/resources/level/classic_modern.zip b/src/common/resources/level/classic_modern.zip new file mode 100644 index 0000000000000000000000000000000000000000..e7a5d52ffbf15d1e977d05dc5012e283ae818380 GIT binary patch literal 1532 zcmWIWW@Zs#U|`^2_|dKD-#Ou5kPRaPLpcir13OUEz`#JSq@rZ*q_cj94S0^fujR^q zuArOQ9T3M*_>jTd@i4f8Qow z+j{Jg zV@vB9`Rx|9v$(R=ca>hdwf_F^=WBvisN`&W9cC5%?UC@KncurNd3_GEkUqC`U-zj^ z5ue&UEEae5D?2{f*|8-;_;G;oXAc>zPN7E&&;Rf<)jM42d4J{KnU6NtP7aRBsI`)i zHMsDi^PqhAl(Z$m0;=yaR!!*bO(|lzx&M4y|7G8=wZC&hj#as%f3_uCsMb~zoGXVy06+D0q!2vw+HYkAG-v1W4wys-5UDK&jbW69xV$-H& zSH)P8Z|#1pV#_;=ar3P!-{#kClwBUZc)@M!Usmy7=9d0j@ZjT<-aJv0{IzAOH5v|a zO{H5Ezw>#ocze&L`nDx&_3rE%PIuOrX%G5s8GG;TomI?fZ@@3y8tYJVz23RvZQM1E z3VX#5@g2+0xig$Lb&{^R?#8yeFM_Z6{t1rMKAw-}$F^DA@aOV-zwH~ZVunaB=VShV zJ6CMI&Smx{Y_idsIXQi7j>~E;J#mUMwR^wzgcxUIhoLjm^XA~dAdX`N9TPvFOx4lU zJoKeaLCfiZijUAn7c1MPOJr2+wz=(ZIlPiz@^r+teaoI?{^VL0GWWfS_1r%$^}8>f zIos-{mv1e1yv^zIw3CiJUJ=1IUd4FurU>`UTb4b0-|q?2MCYtq{d@7l^FJR7_eosz z;H$pqnOeU0&E{)a&9?2=C!1~k^W;N_K!LL(=Yxf%lb7D8^I+Qg?g`sgQyHthp&kzo zG)~K#Cc?|UHM_-9m}ADB;5a6h)=GbgjN8^NukGgjZ`?6Yb-wGKNSE6cUUCZS#FSsG zkoA^0WBkWXK6%aNIQhFxm*cLlkU3Q9d~)I6X8ZK54hIum_kMCQxfC<$|AoCN1ye6C z6}yvv@@#nMn`6l_l5xj^q>>fq`svM6>slG?87X$(>u=4bC)TIWe~!36?azGsyUn)` zeSEv}k8$aJx071GnNY)Ndy!fJH!z&);NfHp3a70TQNl@5k9+;5H%-1lC)FfueXpC= zerNRSO7e|0dc^wUZ{3{YD~l$|^evja)$+?G_E}rqGT&J4nG@L6=3JZ6qW0nF!UZf- z)-AbfC&Hq2^<;U7Tk(r4``nn+`KAaS2+m#_^v3>atHYv7zG*c|j+f7gXnZ+7X<-Fd zSJLE1XBUV+*)Fw_(WJNh$?L8Pi7)+p;m=-F>^c8&*4J0J<<7Z>CgzHkiEJ%-T>jfT zj8jCW?C1WqMG?0-miG9bkcd^7aw*;@Cuq{0;BzY14{*)&^pcNN&pf_v$x=ohl{u$> z?iEbbDdW*k651sAar4eP=~oh)HD^xoIlbj{ul+Z-D}w*;IF{Yy5AbGW5@EnyCIX8^ zBmgZT(KVsxbA*mWVBi}VfO9>%CiFCn(6oyQqzRm&(KVq*C_>XCW{@Uu^agmdvVkO6 Mfba^C7GeeQ0JrXZ6aWAK literal 0 HcmV?d00001 diff --git a/src/common/resources/level/classic_standard.zip b/src/common/resources/level/classic_standard.zip new file mode 100644 index 0000000000000000000000000000000000000000..bba7a996c95a4320102dbc83d9ec6cbe3f873804 GIT binary patch literal 8918 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 { + var result = []; + var data:DynamicAccess = so.data; + for (id in data.keys()) { + result.push(PackId.fromString(id)); + } + return result; + } +} diff --git a/src/editor/haxe/ru/m/tankz/editor/FileUtil.hx b/src/editor/haxe/ru/m/tankz/editor/FileUtil.hx index 73095b3..9752b7b 100644 --- a/src/editor/haxe/ru/m/tankz/editor/FileUtil.hx +++ b/src/editor/haxe/ru/m/tankz/editor/FileUtil.hx @@ -1,19 +1,18 @@ package ru.m.tankz.editor; -import promhx.Deferred; -import flash.events.ProgressEvent; -import flash.events.IOErrorEvent; import flash.events.Event; +import flash.events.IOErrorEvent; +import flash.events.ProgressEvent; import flash.net.FileReference; +import haxe.io.Bytes; +import promhx.Deferred; import promhx.Promise; - typedef FileContent = { var name:String; - var content:String; + var content:Bytes; } - class FileUtil { public static function browse():Promise { @@ -30,10 +29,9 @@ class FileUtil { }); file.addEventListener(Event.COMPLETE, function(event:Event) { var f:FileReference = cast event.target; - var data = f.data.readUTFBytes(f.data.length); d.resolve({ name: f.name, - content: data + content: Bytes.ofData(f.data), }); }); file.browse(); @@ -42,7 +40,6 @@ class FileUtil { public static function save(content:FileContent):Void { var file = new FileReference(); - file.save(content.content, content.name); + file.save(content.content.getData(), content.name); } - } diff --git a/src/editor/haxe/ru/m/tankz/editor/view/PackFrame.hx b/src/editor/haxe/ru/m/tankz/editor/view/PackFrame.hx index e29aeea..be82e52 100644 --- a/src/editor/haxe/ru/m/tankz/editor/view/PackFrame.hx +++ b/src/editor/haxe/ru/m/tankz/editor/view/PackFrame.hx @@ -1,19 +1,18 @@ package ru.m.tankz.editor.view; -import haxework.view.list.LabelListItem; +import ru.m.tankz.util.LevelUtil; import haxework.view.data.DataView; import haxework.view.form.InputView; import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameView; +import haxework.view.list.LabelListItem; import haxework.view.list.ListView; import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.config.Config; -import ru.m.tankz.editor.FileUtil; import ru.m.tankz.editor.view.map.BrickView; import ru.m.tankz.editor.view.map.MapEditView; import ru.m.tankz.editor.view.map.SpawnPointView; import ru.m.tankz.Type; -import ru.m.tankz.util.LevelUtil; using ru.m.tankz.view.ViewUtil; @@ -24,6 +23,7 @@ using ru.m.tankz.view.ViewUtil; public var level(default, set):LevelConfig; private var fileName:String; + private var pack:LevelPack; @:view var levels:ListView; @:view var levelName:InputView; @@ -36,6 +36,7 @@ using ru.m.tankz.view.ViewUtil; @:provide var configBundle:IConfigBundle; @:provide var config:Config; @:provide static var switcher:FrameSwitcher; + @:provide static var storage:EditorStorage; public function new() { super(ID); @@ -43,8 +44,12 @@ using ru.m.tankz.view.ViewUtil; override public function onShow(data:LevelPack):Void { super.onShow(data); - type = data.id.type; - levels.data = data.data; + pack = data; + type = pack.id.type; + levels.data = pack.data; + if (pack.data.length > 0) { + level = pack.data[0]; + } } private function set_type(value:GameType):GameType { @@ -104,20 +109,14 @@ using ru.m.tankz.view.ViewUtil; updateSelected(null, point); } - private function open():Void { - FileUtil.browse().then(function(content:FileContent) { - fileName = content.name; - level = LevelUtil.loads(content.content); - }); - } - private function save():Void { var data = mapView.data; + data.id = level.id; + data.packId = pack.id; data.name = levelName.text; - FileUtil.save({ - name: fileName, - content: LevelUtil.dumps(config, data), - }); + pack.data[data.id] = data; + levels.data = pack.data; + storage.write(pack.id, pack); } private function applySize():Void { @@ -129,4 +128,23 @@ using ru.m.tankz.view.ViewUtil; heightInput.text = Std.string(config.map.grid.height); mapView.gridSize = null; } + + private function addLevel():Void { + var level = LevelUtil.empty(config.map.grid, 0); + level.id = pack.data.length; + level.packId = pack.id; + pack.data.push(level); + levels.data = pack.data; + this.level = level; + } + + private function removeLevel():Void { + if (level != null) { + pack.data.remove(level); + levels.data = pack.data; + if (pack.data.length > 0) { + this.level = pack.data[0]; + } + } + } } diff --git a/src/editor/haxe/ru/m/tankz/editor/view/PackFrame.yaml b/src/editor/haxe/ru/m/tankz/editor/view/PackFrame.yaml index 78aa424..adf6a7d 100644 --- a/src/editor/haxe/ru/m/tankz/editor/view/PackFrame.yaml +++ b/src/editor/haxe/ru/m/tankz/editor/view/PackFrame.yaml @@ -3,14 +3,20 @@ views: - $type: haxework.view.group.HGroupView geometry.stretch: true views: - - id: levels - $type: haxework.view.list.VListView - geometry.width: 200 + - $type: haxework.view.group.VGroupView geometry.height: 100% - factory: ~levelViewFactory - +onItemSelect: ~onLevelSelect - scroll: - $type: haxework.view.list.VScrollBarView + views: + - id: levels + $type: haxework.view.list.VListView + geometry.width: 200 + geometry.height: 100% + factory: ~levelViewFactory + +onItemSelect: ~onLevelSelect + scroll: + $type: haxework.view.list.VScrollBarView + - $type: haxework.view.form.ButtonView + text: + + +onPress: ~addLevel() - $type: haxework.view.group.VGroupView geometry.stretch: true views: @@ -69,22 +75,20 @@ views: overflow.x: crop overflow.y: crop views: - - $type: ru.m.tankz.view.game.GameViewContainer - views: - - id: mapView - $type: ru.m.tankz.editor.view.map.MapEditView + - $type: ru.m.tankz.view.game.GameViewContainer + views: + - id: mapView + $type: ru.m.tankz.editor.view.map.MapEditView - $type: haxework.view.group.HGroupView style: panel layout.margin: 10 views: - $type: haxework.view.SpriteView geometry.width: 100% - - id: openButton - $type: haxework.view.form.ButtonView - text: Open - +onPress: ~open() - - id: saveButton - $type: haxework.view.form.ButtonView + - $type: haxework.view.form.ButtonView + text: Remove + +onPress: ~removeLevel() + - $type: haxework.view.form.ButtonView text: Save +onPress: ~save() - $type: haxework.view.form.ButtonView diff --git a/src/editor/haxe/ru/m/tankz/editor/view/PackListFrame.hx b/src/editor/haxe/ru/m/tankz/editor/view/PackListFrame.hx index c4fed06..5a2dd2f 100644 --- a/src/editor/haxe/ru/m/tankz/editor/view/PackListFrame.hx +++ b/src/editor/haxe/ru/m/tankz/editor/view/PackListFrame.hx @@ -1,20 +1,22 @@ package ru.m.tankz.editor.view; import haxework.view.data.DataView; -import haxework.view.form.ButtonView; import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameView; import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.config.Config; +import ru.m.tankz.editor.FileUtil; import ru.m.tankz.Type; +import ru.m.tankz.util.LevelUtil; @:template class PackListFrame extends FrameView { public static inline var ID = "pack_list"; - @:view("packs") var packView:DataView; + @:view("packs") var packView:DataView; @:provide static var levelBundle:ILevelBundle; @:provide static var switcher:FrameSwitcher; + @:provide static var storage:EditorStorage; public function new() { super(ID); @@ -22,20 +24,49 @@ import ru.m.tankz.Type; override public function onShow(data:Dynamic):Void { super.onShow(data); - packView.data = [ - levelBundle.get(new PackId("classic")), - levelBundle.get(new PackId("dota")), - levelBundle.get(new PackId("death")), - ]; + packView.data = storage.packList(); } - private function packViewFactory(index:Int, value:LevelPack):ButtonView { - var result = new ButtonView(); - result.text = value.id; - return result; + private function onPackAction(value:PackId, action:String):Void { + switch action { + case "export": + var pack:LevelPack = storage.read(value); + FileUtil.save({ + name: '${value}.zip', + content: LevelUtil.pack(pack.data), + }); + case "edit": + switcher.change(PackFrame.ID, storage.read(value)); + case "delete": + storage.delete(value); + packView.data = storage.packList(); + case _: + } } - private function onPackSelect(value:LevelPack):Void { - switcher.change(PackFrame.ID, value); + private function create():Void { + var levelPack:LevelPack = { + id: new PackId("classic", "modern"), + data: [], + } + storage.write(levelPack.id, levelPack); + packView.data.push(levelPack.id); + packView.data = packView.data; + } + + private function open():Void { + FileUtil.browse().then(function(file:FileContent) { + var packId = PackId.fromArray(file.name.split("/").pop().split(".").shift().split("_")); + var levelPack:LevelPack = { + id: packId, + data: LevelUtil.unpack(file.content).map(function(level) { + level.packId = packId; + return level; + }), + }; + storage.write(levelPack.id, levelPack); + packView.data.push(levelPack.id); + packView.data = packView.data; + }); } } diff --git a/src/editor/haxe/ru/m/tankz/editor/view/PackListFrame.yaml b/src/editor/haxe/ru/m/tankz/editor/view/PackListFrame.yaml index 848ee99..392020e 100644 --- a/src/editor/haxe/ru/m/tankz/editor/view/PackListFrame.yaml +++ b/src/editor/haxe/ru/m/tankz/editor/view/PackListFrame.yaml @@ -1,17 +1,22 @@ --- views: - - id: packs - $type: haxework.view.data.DataView - geometry.width: 100% - geometry.height: 100% - geometry.padding: 30 - overflow.y: scroll - layout: - $type: haxework.view.layout.TailLayout - rowSize: 10 - margin: 5 - factory: ~packViewFactory - +onDataSelect: ~onPackSelect + - $type: haxework.view.group.VGroupView + style: container + layout.margin: 10 + views: + - $type: haxework.view.form.ButtonView + text: New + +onPress: ~create() + - id: packs + $type: haxework.view.data.DataView + layout: + $type: haxework.view.layout.VerticalLayout + margin: 5 + factory: ~ru.m.tankz.editor.view.PackView.factory + +onDataAction: ~onPackAction + - $type: haxework.view.form.ButtonView + text: Open + +onPress: ~open() - $type: haxework.view.group.HGroupView style: panel layout.margin: 10 diff --git a/src/editor/haxe/ru/m/tankz/editor/view/PackView.hx b/src/editor/haxe/ru/m/tankz/editor/view/PackView.hx new file mode 100644 index 0000000..c77490a --- /dev/null +++ b/src/editor/haxe/ru/m/tankz/editor/view/PackView.hx @@ -0,0 +1,50 @@ +package ru.m.tankz.editor.view; + +import haxework.signal.Signal; +import haxework.view.data.DataView; +import haxework.view.form.ButtonView; +import haxework.view.group.HGroupView; +import haxework.view.list.ListView; +import ru.m.tankz.Type; + +using ru.m.tankz.view.ViewUtil; + +@:template class PackView extends HGroupView implements IListItemView { + + public var item_index(default, default):Int; + public var data(default, set):PackId; + + private var actionSignal(get, null):Signal2; + + @:view var label:ButtonView; + + private function set_data(value:PackId):PackId { + data = value; + label.text = data.toPackLabel(); + return data; + } + + private function get_actionSignal():Signal2 { + var dataView:DataView = cast parent; + return dataView.onDataAction; + } + + private function export():Void { + actionSignal.emit(data, "export"); + } + + private function edit():Void { + actionSignal.emit(data, "edit"); + } + + private function delete():Void { + actionSignal.emit(data, "delete"); + } + + public static function factory(index:Int, value:PackId):PackView { + var result = new PackView(); + result.item_index = index; + result.data = value; + return result; + } +} diff --git a/src/editor/haxe/ru/m/tankz/editor/view/PackView.yaml b/src/editor/haxe/ru/m/tankz/editor/view/PackView.yaml new file mode 100644 index 0000000..54c52e3 --- /dev/null +++ b/src/editor/haxe/ru/m/tankz/editor/view/PackView.yaml @@ -0,0 +1,14 @@ +--- +layout.margin: 5 +views: + - $type: haxework.view.form.ButtonView + style: button.prev + +onPress: ~export() + - id: label + $type: haxework.view.form.ButtonView + geometry.width: 250 + +onPress: ~edit() + - $type: haxework.view.form.ButtonView + style: button.close + +onPress: ~delete() +