From 942b2240a7cc583bb4a676f9234b9077f20ca4d8 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 5 Jan 2018 17:45:55 +0000 Subject: [PATCH 001/134] Added more webdriver tests testing against a real browser. --- .babelrc | 11 +- .circleci/config.yml | 27 + .gitignore | 2 + circle.yml | 6 - config/wdio.conf.js | 16 +- config/webpack.production.config.js | 10 +- package-lock.json | 1177 ++++++++++------- package.json | 23 +- src/components/App.jsx | 35 +- src/components/Button.jsx | 2 + src/components/Toolbar.jsx | 11 +- src/components/fields/FunctionSpecField.jsx | 3 +- src/components/fields/SpecField.jsx | 119 +- src/components/filter/FilterEditor.jsx | 3 +- src/components/icons/LayerIcon.jsx | 1 - src/components/inputs/AutocompleteInput.jsx | 10 +- src/components/inputs/InputBlock.jsx | 2 + src/components/inputs/SelectInput.jsx | 2 + src/components/inputs/StringInput.jsx | 11 +- src/components/layers/CommentBlock.jsx | 6 +- src/components/layers/JSONEditor.jsx | 1 - src/components/layers/LayerEditor.jsx | 8 +- src/components/layers/LayerEditorGroup.jsx | 2 + src/components/layers/LayerIdBlock.jsx | 5 +- src/components/layers/LayerList.jsx | 2 + src/components/layers/LayerListGroup.jsx | 2 + src/components/layers/LayerListItem.jsx | 7 +- src/components/layers/LayerSourceBlock.jsx | 6 +- .../layers/LayerSourceLayerBlock.jsx | 5 +- src/components/layers/LayerTypeBlock.jsx | 5 +- src/components/layers/MaxZoomBlock.jsx | 4 +- src/components/layers/MinZoomBlock.jsx | 4 +- src/components/modals/AddModal.jsx | 16 +- src/components/modals/ExportModal.jsx | 2 +- src/components/modals/Modal.jsx | 6 +- src/components/modals/OpenModal.jsx | 5 +- src/components/modals/SettingsModal.jsx | 8 + src/libs/debug.js | 44 + src/styles/index.scss | 12 + test/artifacts.js | 39 + test/example-style.json | 12 + test/functional/advanced.js | 1077 +++++++++++++++ test/geojson-server.js | 93 ++ test/sources/example.json | 15 + test/sources/index.js | 3 + test/specs/simple.js | 15 - test/wd-helper.js | 6 + 47 files changed, 2244 insertions(+), 637 deletions(-) create mode 100644 .circleci/config.yml delete mode 100644 circle.yml create mode 100644 src/libs/debug.js create mode 100644 test/artifacts.js create mode 100644 test/example-style.json create mode 100644 test/functional/advanced.js create mode 100644 test/geojson-server.js create mode 100644 test/sources/example.json create mode 100644 test/sources/index.js delete mode 100644 test/specs/simple.js create mode 100644 test/wd-helper.js diff --git a/.babelrc b/.babelrc index a3b237f0..adae42de 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,13 @@ { "presets": ["env", "react"], - "plugins": ["transform-object-rest-spread", "transform-class-properties"] + "plugins": ["transform-object-rest-spread", "transform-class-properties"], + "env": { + "test": { + "plugins": [ + ["istanbul", { + exclude: ["node_modules/**", "test/**"] + }] + ] + } + } } diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..f78c4ee5 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,27 @@ +version: 2 +jobs: + build: + docker: + # specify the version you desire here + - image: node:8 + - image: selenium/standalone-chrome:3.1.0 + working_directory: ~/repo + steps: + - checkout + - run: + name: "Create artifacts directory" + command: mkdir /tmp/artifacts + - restore_cache: + key: v1-dependencies-{{ checksum "package.json" }} + + - run: npm install + + - save_cache: + paths: + - node_modules + key: v1-dependencies-{{ checksum "package.json" }} + + - run: mkdir -p /tmp/artifacts/logs + - run: DOCKER_HOST=localhost npm test + - run: npm run build + - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov diff --git a/.gitignore b/.gitignore index 99105f43..83a8308f 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ node_modules # Ignore build files public +/errorShots +/old diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 5e66cd33..00000000 --- a/circle.yml +++ /dev/null @@ -1,6 +0,0 @@ -machine: - node: - version: 6 -test: - post: - - npm run build diff --git a/config/wdio.conf.js b/config/wdio.conf.js index f0d33317..41fe910d 100644 --- a/config/wdio.conf.js +++ b/config/wdio.conf.js @@ -2,36 +2,36 @@ var webpack = require("webpack"); var WebpackDevServer = require("webpack-dev-server"); var webpackConfig = require("./webpack.production.config"); var testConfig = require("../test/config/specs"); +var artifacts = require("../test/artifacts"); +var isDocker = require("is-docker"); var server; +var SCREENSHOT_PATH = artifacts.pathSync("screenshots"); exports.config = { specs: [ - './test/specs/**/*.js' + './test/functional/advanced.js' ], exclude: [ ], maxInstances: 10, capabilities: [{ maxInstances: 5, - browserName: 'firefox' + browserName: 'chrome' }], sync: true, logLevel: 'verbose', coloredLogs: true, bail: 0, - screenshotPath: './errorShots/', + screenshotPath: SCREENSHOT_PATH, + host: (isDocker() ? process.env.DOCKER_HOST : "127.0.0.1"), baseUrl: 'http://localhost', waitforTimeout: 10000, connectionRetryTimeout: 90000, connectionRetryCount: 3, - services: ['phantomjs'], framework: 'mocha', reporters: ['spec'], - phantomjsOpts: { - webdriverLogfile: 'phantomjs.log' - }, mochaOpts: { ui: 'bdd', // Because we don't know how long the initial build will take... @@ -43,6 +43,6 @@ exports.config = { server.listen(testConfig.port); }, onComplete: function(exitCode) { - server.close(); + server.close() } } diff --git a/config/webpack.production.config.js b/config/webpack.production.config.js index 01a5c4e9..383bb7d5 100644 --- a/config/webpack.production.config.js +++ b/config/webpack.production.config.js @@ -1,4 +1,3 @@ - var webpack = require('webpack'); var path = require('path'); var loaders = require('./webpack.loaders'); @@ -7,14 +6,9 @@ var HtmlWebpackPlugin = require('html-webpack-plugin'); var WebpackCleanupPlugin = require('webpack-cleanup-plugin'); var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; var CopyWebpackPlugin = require('copy-webpack-plugin'); +var artifacts = require("../test/artifacts"); -var OUTPATH; -if(process.env.CIRCLE_ARTIFACTS) { - OUTPATH = path.join(process.env.CIRCLE_ARTIFACTS, "build"); -} -else { - OUTPATH = path.join(__dirname, '..', 'public'); -} +var OUTPATH = artifacts.pathSync("/build"); module.exports = { entry: { diff --git a/package-lock.json b/package-lock.json index f539a8f1..51652f84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -908,6 +908,17 @@ "babel-runtime": "6.26.0" } }, + "babel-plugin-istanbul": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz", + "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.9.1", + "test-exclude": "4.1.1" + } + }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", @@ -1879,6 +1890,45 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, + "cacache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.1.tgz", + "integrity": "sha512-dRHYcs9LvG9cHgdPzjiI+/eS7e1xRhULrcyOx04RZQsszNJXU2SL9CyG60yLnge282Qq5nwTv+ieK2fH+WPZmA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "1.3.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.0.0", + "unique-filename": "1.1.0", + "y18n": "3.2.1" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, "call-matcher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", @@ -2069,6 +2119,12 @@ "readdirp": "2.1.0" } }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -2238,9 +2294,9 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codemirror": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.32.0.tgz", - "integrity": "sha512-95OxAlYiigW0g4n4ixFdavG07clJGILp3MvHh2pKR3FvyrTuHHvqtKSVbrV3/Jz6o0YqGvyCDLDTbH4h6ciaSw==" + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.33.0.tgz", + "integrity": "sha512-HT6PKVqkwpzwB3jl5hXFoQteEWXbSWMzG3Z8RVYlx8hZwCOLCy4NU7vkSB3dYX3e6ORwRfGw4uFOXaw4rn/a9Q==" }, "color": { "version": "2.0.1", @@ -2355,15 +2411,6 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, - "combine-lists": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, "combined-stream": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", @@ -2536,6 +2583,20 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, "copy-to-clipboard": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz", @@ -2545,19 +2606,37 @@ } }, "copy-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-cL/Wl3Y1QmmKThl/mWeGB+HH3YH+25tn8nhqEGsZda4Yn7GqGnDZ+TbeKJ7A6zvrxyNhhuviYAxn/tCyyAqh8Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.3.1.tgz", + "integrity": "sha512-xlcFiW/U7KrpS6dFuWq3r8Wb7koJx7QVc7LDFCosqkikaVSxkaYOnwDLwilbjrszZ0LYZXThDAJKcQCSrvdShQ==", "dev": true, "requires": { - "bluebird": "3.5.1", - "glob": "7.1.2", + "cacache": "10.0.1", + "find-cache-dir": "1.0.0", + "globby": "7.1.1", "is-glob": "4.0.0", "loader-utils": "0.2.17", "lodash": "4.17.4", - "minimatch": "3.0.4" + "minimatch": "3.0.4", + "p-limit": "1.1.0", + "pify": "3.0.0", + "serialize-javascript": "1.4.0" }, "dependencies": { + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "glob": "7.1.2", + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2597,6 +2676,16 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "vary": "1.1.2" + } + }, "cosmiconfig": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", @@ -2672,6 +2761,16 @@ "sha.js": "2.4.9" } }, + "create-react-class": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", + "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -2992,6 +3091,12 @@ "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=" }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -3194,6 +3299,27 @@ "randombytes": "2.0.5" } }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + } + } + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -3446,6 +3572,18 @@ } } }, + "duplexify": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" + } + }, "earcut": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.1.2.tgz", @@ -4543,6 +4681,16 @@ "vlq": "0.2.3" } }, + "flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, "follow-redirects": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", @@ -4605,13 +4753,14 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "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": { - "null-check": "1.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.3" } }, "fs-extra": { @@ -4624,6 +4773,18 @@ "universalify": "0.1.1" } }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4681,6 +4842,21 @@ "globule": "1.2.0" } }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, "geojson-area": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/geojson-area/-/geojson-area-0.1.0.tgz", @@ -5433,6 +5609,12 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", @@ -5676,6 +5858,12 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, + "is-docker": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", + "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=", + "dev": true + }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", @@ -5738,6 +5926,18 @@ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -5809,6 +6009,12 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -5923,6 +6129,146 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.10", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.3.0", + "wordwrap": "1.0.0" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "dev": true, + "requires": { + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + } + } + }, "js-base64": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", @@ -6134,6 +6480,12 @@ "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", "dev": true }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -6166,325 +6518,6 @@ "resolved": "https://registry.npmjs.org/junk/-/junk-2.1.0.tgz", "integrity": "sha1-9DG0t/By3FAKXxDOf07HGTDnATQ=" }, - "karma": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "body-parser": "1.18.2", - "chokidar": "1.7.0", - "colors": "1.1.2", - "combine-lists": "1.0.1", - "connect": "3.6.5", - "core-js": "2.5.1", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "http-proxy": "1.16.2", - "isbinaryfile": "3.0.2", - "lodash": "3.10.1", - "log4js": "0.6.38", - "mime": "1.3.4", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.1.5", - "range-parser": "1.2.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "socket.io": "1.7.3", - "source-map": "0.5.7", - "tmp": "0.0.31", - "useragent": "2.2.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "engine.io": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", - "dev": true, - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.2" - } - }, - "engine.io-client": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "socket.io": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", - "dev": true, - "requires": { - "debug": "2.3.3", - "engine.io": "1.8.3", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.3", - "socket.io-parser": "2.3.1" - } - }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "dev": true, - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - } - }, - "socket.io-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.3", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", - "dev": true, - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - } - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", - "dev": true - } - } - }, - "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", - "dev": true, - "requires": { - "fs-access": "1.0.1", - "which": "1.3.0" - } - }, - "karma-firefox-launcher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.0.1.tgz", - "integrity": "sha1-zlj0fCATqIFW1VpdYTN8CZz1u1E=", - "dev": true - }, - "karma-mocha": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", - "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=", - "dev": true, - "requires": { - "minimist": "1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "karma-webpack": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.6.tgz", - "integrity": "sha512-dcKvtiW00caWrceCKwIvlKwHQu8zI+e3zWZYDLk7kr7nl1lYSp8uP+8fQoBvRCnZiPUGuwU5Psm20NbEIn7KlA==", - "dev": true, - "requires": { - "async": "0.9.2", - "loader-utils": "0.2.17", - "lodash": "3.10.1", - "source-map": "0.5.7", - "webpack-dev-middleware": "1.12.0" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, "kdbush": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-1.0.1.tgz", @@ -6692,16 +6725,6 @@ "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" }, - "lodash._createcompounder": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz", - "integrity": "sha1-XdLLVTctbnDg4jkvsjBNZjEJEHU=", - "dev": true, - "requires": { - "lodash.deburr": "3.2.0", - "lodash.words": "3.2.0" - } - }, "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", @@ -6713,12 +6736,6 @@ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", "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.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", @@ -6752,15 +6769,6 @@ "lodash._isiterateecall": "3.0.9" } }, - "lodash.deburr": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.2.0.tgz", - "integrity": "sha1-baj1QzSjZqfPTEx2742Aqhs2XtU=", - "dev": true, - "requires": { - "lodash._root": "3.0.1" - } - }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -6826,15 +6834,6 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, - "lodash.words": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.2.0.tgz", - "integrity": "sha1-TiqGSbwIdFsXxpWxo86P7llmI7M=", - "dev": true, - "requires": { - "lodash._root": "3.0.1" - } - }, "log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", @@ -7244,6 +7243,24 @@ "minipass": "2.2.1" } }, + "mississippi": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", + "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.1", + "end-of-stream": "1.4.0", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.3.5", + "stream-each": "1.2.2", + "through2": "2.0.3" + } + }, "mixin-object": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", @@ -7313,87 +7330,6 @@ } } }, - "mocha-loader": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mocha-loader/-/mocha-loader-1.1.1.tgz", - "integrity": "sha1-Ocm3jErWmrxTPtAuLas5gkTKM6s=", - "dev": true, - "requires": { - "css-loader": "0.23.1", - "loader-utils": "1.1.0", - "script-loader": "0.7.2", - "style-loader": "0.13.2" - }, - "dependencies": { - "css-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.23.1.tgz", - "integrity": "sha1-n6I/K1wJZSNZEK1ezvO4o2OQ/lA=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.5.4", - "cssnano": "3.10.0", - "loader-utils": "0.2.17", - "lodash.camelcase": "3.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "source-list-map": "0.1.8" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } - } - }, - "css-selector-tokenizer": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz", - "integrity": "sha1-E5uv00o1/QwUKEhwSeBpnm9qLCE=", - "dev": true, - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1" - } - }, - "lodash.camelcase": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz", - "integrity": "sha1-kyyLh/ikN3iXxnGXUzKC+Xrqwpg=", - "dev": true, - "requires": { - "lodash._createcompounder": "3.0.0" - } - }, - "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 - }, - "style-loader": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", - "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=", - "dev": true, - "requires": { - "loader-utils": "1.1.0" - } - } - } - }, "mousetrap": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.1.tgz", @@ -7404,6 +7340,20 @@ "resolved": "https://registry.npmjs.org/mout/-/mout-1.0.0.tgz", "integrity": "sha1-m98dSvV9ZtR8s1OmM1oygQmOFQE=" }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7758,12 +7708,6 @@ "boolbase": "1.0.0" } }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -8079,6 +8023,17 @@ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", "dev": true }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, "param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -9064,6 +9019,12 @@ "asap": "2.0.6" } }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, "prop-types": { "version": "15.6.0", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", @@ -9114,6 +9075,27 @@ "randombytes": "2.0.5" } }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", + "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", + "dev": true, + "requires": { + "duplexify": "3.5.1", + "inherits": "2.0.3", + "pump": "1.0.3" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -9124,12 +9106,6 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=" }, - "qjobs": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", - "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", - "dev": true - }, "qs": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", @@ -9276,12 +9252,6 @@ "unpipe": "1.0.0" } }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, "rbush": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.1.tgz", @@ -9291,10 +9261,11 @@ } }, "react": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.0.0.tgz", - "integrity": "sha1-zn348ZQbA28Cssyp29DLHw6FXi0=", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", "requires": { + "create-react-class": "15.6.2", "fbjs": "0.8.16", "loose-envify": "1.3.1", "object-assign": "4.1.1", @@ -9360,9 +9331,9 @@ "dev": true }, "react-dom": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.0.0.tgz", - "integrity": "sha1-nMMHnD3NcNTG4BuEqrKn40wwP1g=", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", + "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", "requires": { "fbjs": "0.8.16", "loose-envify": "1.3.1", @@ -10329,6 +10300,15 @@ "is-promise": "2.1.0" } }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.2.0" + } + }, "rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", @@ -10448,15 +10428,6 @@ } } }, - "script-loader": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz", - "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==", - "dev": true, - "requires": { - "raw-loader": "0.5.1" - } - }, "scss-tokenizer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", @@ -10489,6 +10460,111 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, + "selenium-standalone": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.11.0.tgz", + "integrity": "sha512-MedSwbiyLkv/nxr7JpI9zFNSAmSDpcz+bCaVSJC1krXYeIzFuj6tKMMss57xwu4VHgfInTy3IIMM2HdjN87xXQ==", + "dev": true, + "requires": { + "async": "2.5.0", + "commander": "2.11.0", + "cross-spawn": "5.1.0", + "debug": "2.6.9", + "lodash": "4.17.4", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "progress": "1.1.8", + "request": "2.79.0", + "tar-stream": "1.5.2", + "urijs": "1.19.0", + "which": "1.3.0", + "yauzl": "2.9.1" + }, + "dependencies": { + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.1", + "pinkie-promise": "2.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + } + }, + "tar-stream": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz", + "integrity": "sha1-+8bG6DwaGdTLSMfZYXH8JI7/x78=", + "dev": true, + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.0", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + } + } + }, "selfsigned": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", @@ -10543,6 +10619,12 @@ "upper-case-first": "1.1.2" } }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "dev": true + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -11099,6 +11181,15 @@ } } }, + "ssri": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.0.0.tgz", + "integrity": "sha512-728D4yoQcQm1ooZvSbywLkV1RjfITZXh0oWrhM/lnsx3nAHx7LsRGJWB/YyvoceAYRq98xqbstiN4JBv1/wNHg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, "stackframe": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", @@ -11241,6 +11332,16 @@ "through": "2.3.8" } }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "stream-shift": "1.0.0" + } + }, "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", @@ -11254,6 +11355,12 @@ "xtend": "4.0.1" } }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "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", @@ -11745,6 +11852,19 @@ } } }, + "test-exclude": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -12126,6 +12246,24 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, "universalify": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", @@ -12151,6 +12289,12 @@ "upper-case": "1.1.3" } }, + "urijs": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.0.tgz", + "integrity": "sha512-Qs2odXn0hST5VSPVjpi73CMqtbAoanahaqWBujGU+IyMrMqpWcIhDewxQRhCkmqYxuyvICDcSuLdv2O7ncWBGw==", + "dev": true + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -12459,6 +12603,49 @@ "phantomjs-prebuilt": "2.1.16" } }, + "wdio-selenium-standalone-service": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/wdio-selenium-standalone-service/-/wdio-selenium-standalone-service-0.0.9.tgz", + "integrity": "sha1-yA1P9Il0TVoLkdUYl2SRbUwMhWQ=", + "dev": true, + "requires": { + "fs-extra": "0.30.0", + "selenium-standalone": "6.11.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + } + } + }, "wdio-spec-reporter": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/wdio-spec-reporter/-/wdio-spec-reporter-0.1.2.tgz", @@ -13170,6 +13357,16 @@ } } }, + "yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", diff --git a/package.json b/package.json index c358b4b7..ba5d9e03 100644 --- a/package.json +++ b/package.json @@ -39,14 +39,14 @@ "ol-mapbox-style": "^1.0.1", "openlayers": "^4.4.2", "prop-types": "^15.6.0", - "react": "16.0.0", + "react": "^15.6.2", "react-addons-pure-render-mixin": "^15.6.2", "react-autocomplete": "^1.7.2", "react-codemirror2": "^3.0.7", "react-collapse": "^4.0.3", "react-color": "^2.13.8", "react-copy-to-clipboard": "^5.0.1", - "react-dom": "16.0.0", + "react-dom": "^15.6.2", "react-file-reader-input": "^1.1.4", "react-height": "^3.0.0", "react-icon-base": "^2.1.1", @@ -90,6 +90,7 @@ "babel-core": "^6.26.0", "babel-eslint": "^8.0.2", "babel-loader": "7.1.1", + "babel-plugin-istanbul": "^4.1.5", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-plugin-transform-flow-strip-types": "^6.22.0", @@ -97,34 +98,38 @@ "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-env": "^1.6.1", "babel-preset-react": "^6.24.1", + "babel-register": "^6.26.0", "babel-runtime": "^6.26.0", "base64-loader": "^1.0.0", "copy-webpack-plugin": "^4.2.0", + "cors": "^2.8.4", "css-loader": "^0.28.7", "eslint": "^4.10.0", "eslint-plugin-react": "^7.4.0", + "express": "^4.16.2", "extract-text-webpack-plugin": "^3.0.2", "file-loader": "^1.1.5", "html-webpack-plugin": "^2.30.1", + "is-docker": "^1.1.0", + "istanbul": "^0.4.5", + "istanbul-lib-coverage": "^1.1.1", "json-loader": "^0.5.7", - "karma": "^1.7.1", - "karma-chrome-launcher": "^2.2.0", - "karma-firefox-launcher": "^1.0.1", - "karma-mocha": "^1.3.0", - "karma-webpack": "^2.0.5", + "mkdirp": "^0.5.1", "mocha": "^4.0.1", - "mocha-loader": "^1.1.1", "node-sass": "^4.6.0", "react-hot-loader": "^3.1.1", "sass-loader": "^6.0.6", + "selenium-standalone": "^6.11.0", "style-loader": "^0.19.0", "stylelint": "^7.13.0", "stylelint-config-standard": "^15.0.1", "transform-loader": "^0.2.4", + "uuid": "^3.1.0", "wdio-mocha-framework": "^0.5.11", "wdio-phantomjs-service": "^0.2.2", + "wdio-selenium-standalone-service": "0.0.9", "wdio-spec-reporter": "^0.1.2", - "webdriverio": "^4.8.0", + "webdriverio": "^4.9.8", "webpack": "^3.8.1", "webpack-bundle-analyzer": "^2.9.0", "webpack-cleanup-plugin": "^0.5.1", diff --git a/src/components/App.jsx b/src/components/App.jsx index d51f7248..cd74f747 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -20,6 +20,7 @@ import { RevisionStore } from '../libs/revisions' import LayerWatcher from '../libs/layerwatcher' import tokens from '../config/tokens.json' import isEqual from 'lodash.isequal' +import Debug from '../libs/debug' function updateRootSpec(spec, fieldName, newValues) { return { @@ -53,9 +54,19 @@ export default class App extends React.Component { this.styleStore = new StyleStore() } this.styleStore.latestStyle(mapStyle => this.onStyleChanged(mapStyle)) + + if(Debug.enabled()) { + Debug.set("maputnik", "styleStore", this.styleStore); + Debug.set("maputnik", "revisionStore", this.revisionStore); + } }) } + if(Debug.enabled()) { + Debug.set("maputnik", "revisionStore", this.revisionStore); + Debug.set("maputnik", "styleStore", this.styleStore); + } + this.state = { errors: [], infos: [], @@ -70,22 +81,28 @@ export default class App extends React.Component { this.layerWatcher = new LayerWatcher({ onVectorLayersChange: v => this.setState({ vectorLayers: v }) }) + + this.onKeyDown = this.onKeyDown.bind(this); + } + + onKeyDown(e) { + console.log("??? keyCode ctrlKey="+e.ctrlKey+", keyCode="+e.keyCode) + // Control + Z + if(e.ctrlKey && e.keyCode === 90) { + this.onUndo(e); + } + else if(e.ctrlKey && e.keyCode === 89) { + this.onRedo(e); + } } componentDidMount() { this.fetchSources(); - Mousetrap.bind(['ctrl+z'], this.onUndo.bind(this)); - Mousetrap.bind(['ctrl+y'], this.onRedo.bind(this)); + document.addEventListener("keydown", this.onKeyDown); } componentWillUnmount() { - Mousetrap.unbind(['ctrl+z'], this.onUndo.bind(this)); - Mousetrap.unbind(['ctrl+y'], this.onRedo.bind(this)); - } - - onReset() { - this.styleStore.purge() - loadDefaultStyle(mapStyle => this.onStyleOpen(mapStyle)) + document.removeEventListener("keydown", this.onKeyDown); } saveStyle(snapshotStyle) { diff --git a/src/components/Button.jsx b/src/components/Button.jsx index d87b8517..b1189c17 100644 --- a/src/components/Button.jsx +++ b/src/components/Button.jsx @@ -4,6 +4,7 @@ import classnames from 'classnames' class Button extends React.Component { static propTypes = { + "data-wd-key": PropTypes.string, onClick: PropTypes.func, style: PropTypes.object, className: PropTypes.string, @@ -14,6 +15,7 @@ class Button extends React.Component { return {this.props.children} diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx index 6b30fb51..14fa0d13 100644 --- a/src/components/Toolbar.jsx +++ b/src/components/Toolbar.jsx @@ -63,6 +63,7 @@ class ToolbarAction extends React.Component { render() { return {this.props.children} @@ -139,23 +140,23 @@ export default class Toolbar extends React.Component {

Maputnik

- + Open - + Export - + Sources - + Style Settings - + { this.props.inspectModeEnabled && Map Mode } diff --git a/src/components/fields/FunctionSpecField.jsx b/src/components/fields/FunctionSpecField.jsx index 9772a33d..981bb1c9 100644 --- a/src/components/fields/FunctionSpecField.jsx +++ b/src/components/fields/FunctionSpecField.jsx @@ -131,8 +131,7 @@ export default class FunctionSpecProperty extends React.Component { /> ) } - - return
+ return
{specField}
} diff --git a/src/components/fields/SpecField.jsx b/src/components/fields/SpecField.jsx index 00796ef4..38c5675f 100644 --- a/src/components/fields/SpecField.jsx +++ b/src/components/fields/SpecField.jsx @@ -58,70 +58,79 @@ export default class SpecField extends React.Component { name: this.props.fieldName, onChange: newValue => this.props.onChange(this.props.fieldName, newValue) } - switch(this.props.fieldSpec.type) { - case 'number': return ( - - ) - case 'enum': - const options = Object.keys(this.props.fieldSpec.values).map(v => [v, capitalize(v)]) - if(options.length <= 3 && optionsLabelLength(options) <= 20) { - return - } else { - return - } - case 'string': - if(iconProperties.indexOf(this.props.fieldName) >= 0) { - return - } else { - return - } - case 'color': return ( - - ) - case 'boolean': return ( - - ) - case 'array': - if(this.props.fieldName === 'text-font') { - return - } else { - if (this.props.fieldSpec.length) { - return [v, capitalize(v)]) + + if(options.length <= 3 && optionsLabelLength(options) <= 20) { + return } else { - return } - } - default: return null + case 'string': + if(iconProperties.indexOf(this.props.fieldName) >= 0) { + return + } else { + return + } + case 'color': return ( + + ) + case 'boolean': return ( + + ) + case 'array': + if(this.props.fieldName === 'text-font') { + return + } else { + if (this.props.fieldSpec.length) { + return + } else { + return + } + } + default: return null + } } + + return ( +
+ {childNodes.call(this)} +
+ ); } } diff --git a/src/components/filter/FilterEditor.jsx b/src/components/filter/FilterEditor.jsx index 73cb2f13..02ee2a40 100644 --- a/src/components/filter/FilterEditor.jsx +++ b/src/components/filter/FilterEditor.jsx @@ -89,7 +89,7 @@ export default class CombiningFilterEditor extends React.Component { } return
-
+
diff --git a/src/components/modals/ExportModal.jsx b/src/components/modals/ExportModal.jsx index 13718357..d8b2a742 100644 --- a/src/components/modals/ExportModal.jsx +++ b/src/components/modals/ExportModal.jsx @@ -5,7 +5,6 @@ import { saveAs } from 'file-saver' import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import StringInput from '../inputs/StringInput' -import SelectInput from '../inputs/SelectInput' import CheckboxInput from '../inputs/CheckboxInput' import Button from '../Button' import Modal from './Modal' @@ -215,6 +214,7 @@ class ExportModal extends React.Component { render() { return -
+

{this.props.title}

this.props.onOpenToggle(false)} + data-wd-key={this.props["data-wd-key"]+".close-modal"} > diff --git a/src/components/modals/OpenModal.jsx b/src/components/modals/OpenModal.jsx index bcd1ba8a..4ce76f56 100644 --- a/src/components/modals/OpenModal.jsx +++ b/src/components/modals/OpenModal.jsx @@ -133,6 +133,7 @@ class OpenModal extends React.Component { } return this.onOpenToggle()} title={'Open Style'} @@ -151,9 +152,9 @@ class OpenModal extends React.Component {

Load from a URL. Note that the URL must have CORS enabled.

- this.styleUrlElement = input} className="maputnik-input" placeholder="Enter URL..."/> + this.styleUrlElement = input} className="maputnik-input" placeholder="Enter URL..."/>
- +
diff --git a/src/components/modals/SettingsModal.jsx b/src/components/modals/SettingsModal.jsx index ef50ad26..941a8189 100644 --- a/src/components/modals/SettingsModal.jsx +++ b/src/components/modals/SettingsModal.jsx @@ -42,6 +42,7 @@ class SettingsModal extends React.Component { const metadata = this.props.mapStyle.metadata || {} const inputProps = { } return @@ -68,6 +72,7 @@ class SettingsModal extends React.Component { @@ -75,6 +80,7 @@ class SettingsModal extends React.Component { @@ -82,6 +88,7 @@ class SettingsModal extends React.Component { @@ -89,6 +96,7 @@ class SettingsModal extends React.Component { + */ +try { +browser.addCommand('setValueSafe', function(selector, text) { + for(var i=0; i<10; i++) { + console.log(">>>> waiting for visible"); + browser.waitForVisible(selector); + + var elements = browser.elements(selector); + if(elements.length > 1) { + console.error(">>> Too many elements found"); + throw "Too many elements found"; + } + + console.log(">>>> setting value"); + browser.setValue(selector, text); + var browserText = browser.getValue(selector); + + console.log("browserText='%s' test='%s'", browserText, text); + + if(browserText == text) { + return; + } + else { + console.error("Warning: setValue failed, trying again"); + } + } + + // Wait for change events to fire and state updated + browser.flushReactUpdates(); +}) + +browser.addCommand('takeScreenShot', function(filepath) { + var data = browser.screenshot(); + fs.writeFileSync(path.join(SCREENSHOTS_PATH, filepath), data.value, 'base64'); +}); + +browser.addCommand('flushReactUpdates', function() { + browser.executeAsync(function(done) { + // For any events to propogate + setImmediate(function() { + // For the DOM to be updated. + setImmediate(done); + }) + }) +}) + +} catch(err) { + console.error(err); +} + +describe('maputnik', function() { + var geoserver; + + before(function(done) { + // Start style server + geoserver = geoServer.listen(9002, done); + }); + + function getStyleStore(browser) { + var result = browser.executeAsync(function(done) { + window.debug.get("maputnik", "styleStore").latestStyle(done); + }) + return result.value; + } + + function getRevisionStore(browser) { + var result = browser.execute(function(done) { + var rs = window.debug.get("maputnik", "revisionStore") + + return { + currentIdx: rs.currentIdx, + revisions: rs.revisions + }; + }) + return result.value; + } + + function getStyleUrl(styles) { + var port = geoserver.address().port; + return "http://localhost:"+port+"/styles/empty/"+styles.join(","); + } + + function getGeoServerUrl(urlPath) { + var port = geoserver.address().port; + return "http://localhost:"+port+"/"+urlPath; + } + + beforeEach(function() { + browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + "geojson:example", + "raster:raster" + ])); + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + }); + + it('check logo exists', function () { + var src = browser.getAttribute(".maputnik-toolbar-link img", "src"); + assert.equal(src, config.baseUrl+'/img/logo-color.svg'); + }); + + function closeModal(wdKey) { + console.log(">> A"); + browser.waitUntil(function() { + return browser.isVisibleWithinViewport(wd.$(wdKey)); + }); + + console.log(">> B"); + var closeBtnSelector = wd.$(wdKey+".close-modal"); + browser.click(closeBtnSelector); + + console.log(">> C"); + browser.waitUntil(function() { + return !browser.isVisibleWithinViewport(wd.$(wdKey)); + }); + } + + describe("modal", function() { + describe("open", function() { + var styleFilePath = __dirname+"/../example-style.json"; + var styleFileData = JSON.parse(fs.readFileSync(styleFilePath)); + + beforeEach(function() { + browser.url(config.baseUrl+"?debug"); + + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:open")) + browser.flushReactUpdates(); + }); + + it("close", function() { + closeModal("open-modal"); + }); + + it("upload", function() { + browser.waitForExist("*[type='file']") + browser.chooseFile("*[type='file']", styleFilePath); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleFileData, styleObj); + }); + + it("load from url", function() { + var styleFileUrl = getGeoServerUrl("example-style.json"); + + browser.setValueSafe(wd.$("open-modal.url.input"), styleFileUrl); + + var selector = wd.$("open-modal.url.button"); + console.log("selector", selector); + browser.click(selector); + + // Allow the network request to happen + // NOTE: Its localhost so this should be fast. + browser.pause(300); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + console.log("styleFileData", styleFileData); + assert.deepEqual(styleFileData, styleObj); + }); + + // TODO: Need to work out how to mock out the end points + it("gallery") + }) + + describe("export", function() { + + beforeEach(function() { + browser.url(config.baseUrl+"?debug"); + + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:export")) + browser.flushReactUpdates(); + }); + + it("close", function() { + closeModal("export-modal"); + }); + + // TODO: Work out how to download a file and check the contents + it("download") + // TODO: Work out how to mock the end git points + it("save to gist") + }) + + describe("sources", function() { + it("active sources") + it("public source") + it("add new source") + }) + + describe("inspect", function() { + it("toggle", function() { + browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + "geojson:example" + ])); + + browser.click(wd.$("nav:inspect")); + }) + }) + + describe("style settings", function() { + beforeEach(function() { + browser.url(config.baseUrl+"?debug"); + + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:settings")) + browser.flushReactUpdates(); + }); + + it("name", function() { + browser.setValueSafe(wd.$("modal-settings.name"), "foobar") + browser.click(wd.$("modal-settings.owner")) + browser.flushReactUpdates(); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.name, "foobar"); + }) + it("owner", function() { + browser.setValueSafe(wd.$("modal-settings.owner"), "foobar") + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.owner, "foobar"); + }) + it("sprite url", function() { + browser.setValueSafe(wd.$("modal-settings.sprite"), "http://example.com") + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.sprite, "http://example.com"); + }) + it("glyphs url", function() { + var glyphsUrl = "http://example.com/{fontstack}/{range}.pbf" + browser.setValueSafe(wd.$("modal-settings.glyphs"), glyphsUrl) + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.glyphs, glyphsUrl); + }) + + it("mapbox access token", function() { + var apiKey = "testing123"; + browser.setValueSafe(wd.$("modal-settings.maputnik:mapbox_access_token"), apiKey); + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + browser.waitUntil(function() { + return styleObj.metadata["maputnik:mapbox_access_token"] == apiKey; + }) + }) + + it("open map tiles access token", function() { + var apiKey = "testing123"; + browser.setValueSafe(wd.$("modal-settings.maputnik:openmaptiles_access_token"), apiKey); + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.metadata["maputnik:openmaptiles_access_token"], apiKey); + }) + + it("style renderer", function() { + var selector = wd.$("modal-settings.maputnik:renderer"); + browser.selectByValue(selector, "ol3"); + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.metadata["maputnik:renderer"], "ol3"); + }) + }) + + describe("sources", function() { + it("toggle") + }) + }) + + describe.skip("zoom level", function() { + it("via url", function() { + var zoomLevel = "12.37" + browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + "geojson:example" + ])+"#"+zoomLevel+"/41.3805/2.1635"); + + browser.waitUntil(function () { + return ( + browser.isVisible(".mapboxgl-ctrl-zoom") + && browser.getText(".mapboxgl-ctrl-zoom") === "Zoom level: "+(zoomLevel) + ); + }, 10*1000) + }) + it("via map controls", function() { + var zoomLevel = 12.37; + browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + "geojson:example" + ])+"#"+zoomLevel+"/41.3805/2.1635"); + + browser.click(".mapboxgl-ctrl-zoom-in") + browser.waitUntil(function () { + var text = browser.getText(".mapboxgl-ctrl-zoom") + return text === "Zoom level: "+(zoomLevel+1); + }, 10*1000) + }) + }) + + describe.skip("groups", function() { + it("simple", function() { + browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + "geojson:example" + ])); + + modelCommands.addLayer.open(); + var aId = modelCommands.addLayer.fill({ + id: "foo", + type: "background" + }) + + modelCommands.addLayer.open(); + var bId = modelCommands.addLayer.fill({ + id: "foo_bar", + type: "background" + }) + + modelCommands.addLayer.open(); + var bId = modelCommands.addLayer.fill({ + id: "foo_baz", + type: "background" + }) + + browser.waitForExist(wd.$("layer-list-group:foo-0")); + + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo")), false); + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_bar")), false); + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_baz")), false); + + browser.click(wd.$("layer-list-group:foo-0")); + + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo")), true); + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_bar")), true); + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_baz")), true); + }) + }) + + describe.skip("history", function() { + /** + * See + */ + it("undo/redo", function() { + var styleObj; + + browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + "geojson:example" + ])); + + modelCommands.addLayer.open(); + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, []); + + modelCommands.addLayer.fill({ + id: "step 1", + type: "background" + }) + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + } + ]); + + modelCommands.addLayer.open(); + modelCommands.addLayer.fill({ + id: "step 2", + type: "background" + }) + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + }, + { + "id": "step 2", + "type": 'background' + } + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + + browser + .keys(['Control', 'z']) + .keys(['Control']); + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + } + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + + browser + .keys(['Control', 'z']) + .keys(['Control']); + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + + browser + .keys(['Control', 'y']) + .keys(['Control']); + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + } + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + + browser + .keys(['Control', 'y']) + .keys(['Control']); + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + }, + { + "id": "step 2", + "type": 'background' + } + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + }); + }) + + describe("layers", function() { + beforeEach(function() { + modelCommands.addLayer.open(); + }); + + describe("ops", function() { + it("delete", function() { + var styleObj; + var id = modelCommands.addLayer.fill({ + type: "background" + }) + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'background' + }, + ]); + + browser.click(wd.$("layer-list-item:"+id+":delete", "")); + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + ]); + }); + + it("duplicate", function() { + var styleObj; + var id = modelCommands.addLayer.fill({ + type: "background" + }) + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'background' + }, + ]); + + browser.click(wd.$("layer-list-item:"+id+":copy", "")); + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id+"-copy", + "type": "background" + }, + { + "id": id, + "type": "background" + }, + ]); + }); + + it("hide", function() { + var styleObj; + var id = modelCommands.addLayer.fill({ + type: "background" + }) + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'background' + }, + ]); + + browser.click(wd.$("layer-list-item:"+id+":toggle-visibility", "")); + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "background", + "layout": { + "visibility": "none" + } + }, + ]); + + browser.click(wd.$("layer-list-item:"+id+":toggle-visibility", "")); + + styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "background", + "layout": { + "visibility": "visible" + } + }, + ]); + }) + }) + + describe("grouped", function() { + it("with underscore") + it("no without underscore") + it("double underscore only grouped once") + }) + + describe("tooltips", function() { + }) + + describe("help", function() { + }) + + + describe('background', function () { + + it.skip("add", function() { + var id = modelCommands.addLayer.fill({ + type: "background" + }) + + browser.waitUntil(function() { + var styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'background' + } + ]); + }); + }); + + describe("modify", function() { + function createBackground() { + // Setup + var id = uuid(); + + browser.selectByValue(wd.$("add-layer.layer-type", "select"), "background"); + browser.flushReactUpdates(); + browser.setValueSafe(wd.$("add-layer.layer-id", "input"), "background:"+id); + + browser.click(wd.$("add-layer")); + + var styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+id, + "type": 'background' + } + ]); + return id; + } + + // ====> THESE SHOULD BE FROM THE SPEC + describe("layer", function() { + it("expand/collapse"); + it("id", function() { + var bgId = createBackground(); + + browser.click(wd.$("layer-list-item:background:"+bgId)) + + var id = uuid(); + browser.setValueSafe(wd.$("layer-editor.layer-id", "input"), "foobar:"+id) + browser.click(wd.$("min-zoom")) + + var styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": 'foobar:'+id, + "type": 'background' + } + ]); + }); + + // NOTE: This needs to be removed from the code + it("type"); + + it("min-zoom", function() { + var bgId = createBackground(); + + browser.click(wd.$("layer-list-item:background:"+bgId)) + browser.setValueSafe(wd.$("min-zoom", "input"), 1) + browser.click(wd.$("layer-editor.layer-id", "input")); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+bgId, + "type": 'background', + "minzoom": 1 + } + ]); + + // AND RESET! + // browser.setValueSafe(wd.$("min-zoom", "input"), "") + // browser.click(wd.$("max-zoom", "input")); + + // var styleObj = getStyleStore(browser); + // console.log("styleObj", styleObj); + + // assert.deepEqual(styleObj.layers, [ + // { + // "id": 'background:'+bgId, + // "type": 'background' + // } + // ]); + }); + + it("max-zoom", function() { + var bgId = createBackground(); + + browser.click(wd.$("layer-list-item:background:"+bgId)) + browser.setValueSafe(wd.$("max-zoom", "input"), 1) + browser.click(wd.$("layer-editor.layer-id", "input")); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+bgId, + "type": 'background', + "maxzoom": 1 + } + ]); + }); + + it("comments", function() { + var bgId = createBackground(); + var id = uuid(); + + browser.click(wd.$("layer-list-item:background:"+bgId)); + browser.setValueSafe(wd.$("layer-comment", "textarea"), id); + browser.click(wd.$("layer-editor.layer-id", "input")); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+bgId, + "type": 'background', + metadata: { + 'maputnik:comment': id + } + } + ]); + + // Unset it again. + // TODO: This fails + // browser.setValueSafe(wd.$("layer-comment", "textarea"), ""); + // browser.click(wd.$("min-zoom", "input")); + // browser.flushReactUpdates(); + + // var styleObj = getStyleStore(browser); + // console.log("styleObj", styleObj); + // assert.deepEqual(styleObj.layers, [ + // { + // "id": 'background:'+bgId, + // "type": 'background' + // } + // ]); + }); + + it("color", null, function() { + var bgId = createBackground(); + var id = uuid(); + + browser.click(wd.$("layer-list-item:background:"+bgId)); + + browser.click(wd.$("spec-field:background-color", "input")) + // browser.debug(); + + var styleObj = getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+bgId, + "type": 'background' + } + ]); + + }) + }) + + describe("filter", function() { + it("expand/collapse"); + it("compound filter"); + }) + + describe("paint", function() { + it("expand/collapse"); + it("color"); + it("pattern"); + it("opacity"); + }) + // <===== + + describe("json-editor", function() { + it("expand/collapse"); + it("modify"); + + // TODO + it.skip("parse error", function() { + var bgId = createBackground(); + var id = uuid(); + + browser.click(wd.$("layer-list-item:background:"+bgId)); + + var errorSelector = ".CodeMirror-lint-marker-error"; + assert.equal(browser.isExisting(errorSelector), false); + + browser.click(".CodeMirror") + browser.keys("\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013 {"); + browser.waitForExist(errorSelector) + + browser.click(wd.$("layer-editor.layer-id")); + }); + }); + }) + }); + + describe('fill', function () { + it.skip("add", function() { + // browser.debug(); + + var id = modelCommands.addLayer.fill({ + type: "fill", + layer: "example" + }); + + var styleObj = getStyleStore(browser); + console.log("STYLEOBJ", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'fill', + "source": "example" + } + ]); + }) + + // TODO: Change source + it("change source") + }); + + describe('line', function () { + it.skip("add", function() { + var id = modelCommands.addLayer.fill({ + type: "line", + layer: "example" + }); + + var styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "line", + "source": "example", + } + ]); + }); + + it("groups", null, function() { + // TODO + // Click each of the layer groups. + }) + }); + + describe('symbol', function () { + it.skip("add", function() { + var id = modelCommands.addLayer.fill({ + type: "symbol", + layer: "example" + }); + + var styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "symbol", + "source": "example", + } + ]); + }); + }); + + describe('raster', function () { + it.skip("add", function() { + var id = modelCommands.addLayer.fill({ + type: "raster", + layer: "raster" + }); + + var styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "raster", + "source": "raster", + } + ]); + }); + }); + + describe('circle', function () { + it.skip("add", function() { + var id = modelCommands.addLayer.fill({ + type: "circle", + layer: "example" + }); + + var styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "circle", + "source": "example", + } + ]); + }); + + }); + + describe('fill extrusion', function () { + it.skip("add", function() { + var id = modelCommands.addLayer.fill({ + type: "fill-extrusion", + layer: "example" + }); + + var styleObj = getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'fill-extrusion', + "source": "example" + } + ]); + }); + }); + + // These get used in the marketing material. They are also useful to do a quick manual check of the styling across browsers + // NOTE: These duplicate some of the tests, however this is indended becuase it's likely these will change for aesthetic reasons over time + }); + + // describe('screenshots', function() { + + // beforeEach(function() { + // browser.windowHandleSize({ + // width: 1280, + // height: 800 + // }); + // }) + + // it("front_page", function() { + // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + // "geojson:example" + // ])); + // browser.waitForExist(".maputnik-toolbar-link"); + // browser.flushReactUpdates(); + + // browser.takeScreenShot("/front_page.png") + // }) + + // it("open", function() { + // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + // "geojson:example" + // ])); + // browser.waitForExist(".maputnik-toolbar-link"); + // browser.flushReactUpdates(); + + // browser.click(wd.$("nav:open")) + // browser.flushReactUpdates(); + + // browser.takeScreenShot("/open.png") + // }) + + // it("export", function() { + // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + // "geojson:example" + // ])); + // browser.waitForExist(".maputnik-toolbar-link"); + // browser.flushReactUpdates(); + + // browser.click(wd.$("nav:export")) + // browser.flushReactUpdates(); + + // browser.takeScreenShot("/export.png") + // }) + + // it("sources", function() { + // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + // "geojson:example" + // ])); + // browser.waitForExist(".maputnik-toolbar-link"); + // browser.flushReactUpdates(); + + // browser.click(wd.$("nav:sources")) + // browser.flushReactUpdates(); + + // browser.takeScreenShot("/sources.png") + // }) + + // it("style settings", function() { + // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + // "geojson:example" + // ])); + // browser.waitForExist(".maputnik-toolbar-link"); + // browser.flushReactUpdates(); + + // browser.click(wd.$("nav:settings")) + // browser.flushReactUpdates(); + + // browser.takeScreenShot("/settings.png") + // }) + + // it("inspect", function() { + // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + // "geojson:example" + // ])); + // browser.waitForExist(".maputnik-toolbar-link"); + // browser.flushReactUpdates(); + + // browser.click(wd.$("nav:inspect")) + // browser.flushReactUpdates(); + + // browser.takeScreenShot("/inspect.png") + // }) + // }) + + var coverage = istanbulCov.createCoverageMap({}); + + afterEach(function() { + // Code coverage + var results = browser.execute(function() { + return window.__coverage__; + }); + + coverage.merge(results.value); + }) + + after(function() { + var jsonStr = JSON.stringify(coverage, null, 2); + fs.writeFileSync(COVERAGE_PATH+"/coverage.json", jsonStr); + }) + +}); + diff --git a/test/geojson-server.js b/test/geojson-server.js new file mode 100644 index 00000000..cac65e11 --- /dev/null +++ b/test/geojson-server.js @@ -0,0 +1,93 @@ +const cors = require("cors"); +const express = require("express"); +const fs = require("fs"); +const sourceData = require("./sources"); + + +var app = express(); + +app.use(cors()); + + +function buildStyle(opts) { + opts = opts || {}; + opts = Object.assign({ + sources: {} + }, opts); + + return { + "id": "test-style", + "version": 8, + "name": "Test Style", + "metadata": { + "maputnik:renderer": "mbgljs" + }, + "sources": opts.sources, + "glyphs": "https://demo.tileserver.org/fonts/{fontstack}/{range}.pbf", + "sprites": "https://demo.tileserver.org/fonts/{fontstack}/{range}.pbf", + "layers": [] + } +} + +function buildGeoJSONSource(data) { + return { + type: "vector", + data: data + }; +} + +function buildResterSource(req, key) { + return { + "tileSize": 256, + "tiles": [ + req.protocol + '://' + req.get('host') + "/" + key + "/{x}/{y}/{z}" + ], + "type": "raster" + }; +} + + +app.get("/sources/raster/{x}/{y}/{z}", function(req, res) { + res.status(404).end(); +}) + +app.get("/styles/empty/:sources", function(req, res) { + var reqSources = req.params.sources.split(","); + + var sources = {}; + // reqSources.forEach(function(key) { + // sources[key] = buildGeoJSONSource(sourceData[key]); + // }); + reqSources.forEach(function(key) { + var parts = key.split(":"); + var type = parts[0]; + var key = parts[1]; + + if(type === "geojson") { + sources[key] = buildGeoJSONSource(sourceData[key]); + } + else if(type === "raster") { + sources[key] = buildResterSource(req, key); + } + else { + console.error("ERR: Invalid type: %s", type); + throw "Invalid type" + } + }); + + var json = buildStyle({ + sources: sources + }); + res.send(json); +}) + +app.get("/example-style.json", function(req, res) { + res.json( + JSON.parse( + fs.readFileSync(__dirname+"/example-style.json").toString() + ) + ); +}) + + +module.exports = app; diff --git a/test/sources/example.json b/test/sources/example.json new file mode 100644 index 00000000..43246f9b --- /dev/null +++ b/test/sources/example.json @@ -0,0 +1,15 @@ +{ + "type":"FeatureCollection", + "features":[ + { + "type":"Feature", + "properties": { + "name": "Dinagat Islands" + }, + "geometry":{ + "type": "Point", + "coordinates": [125.6, 10.1] + } + } + ] +} diff --git a/test/sources/index.js b/test/sources/index.js new file mode 100644 index 00000000..894cce78 --- /dev/null +++ b/test/sources/index.js @@ -0,0 +1,3 @@ +module.exports = { + example: require("./example") +}; diff --git a/test/specs/simple.js b/test/specs/simple.js deleted file mode 100644 index fb6ca499..00000000 --- a/test/specs/simple.js +++ /dev/null @@ -1,15 +0,0 @@ -var assert = require('assert'); -var config = require("../config/specs"); - - -describe('maputnik', function() { - - it('check logo exists', function () { - browser.url(config.baseUrl); - browser.waitForExist(".maputnik-toolbar-link"); - - var src = browser.getAttribute(".maputnik-toolbar-link img", "src"); - assert.equal(src, config.baseUrl+'/img/logo-color.svg'); - }); - -}); diff --git a/test/wd-helper.js b/test/wd-helper.js new file mode 100644 index 00000000..c1691295 --- /dev/null +++ b/test/wd-helper.js @@ -0,0 +1,6 @@ +module.exports = { + "$": function(key, selector) { + selector = selector || ""; + return "*[data-wd-key='"+key+"'] "+selector; + } +} From a7739584036a9a58f38636e75d3e4be6c7020304 Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 10 Jan 2018 13:19:34 +0000 Subject: [PATCH 002/134] Tidy tests. --- config/wdio.conf.js | 2 +- test/functional/advanced.js | 1077 ----------------------- test/functional/helper.js | 79 ++ test/functional/history/index.js | 205 +++++ test/functional/index.js | 33 + test/functional/layers/index.js | 497 +++++++++++ test/functional/map/index.js | 35 + test/functional/modals/index.js | 203 +++++ test/functional/screenshots/index.js | 93 ++ test/functional/util/coverage.js | 26 + test/functional/util/webdriverio-ext.js | 56 ++ 11 files changed, 1228 insertions(+), 1078 deletions(-) delete mode 100644 test/functional/advanced.js create mode 100644 test/functional/helper.js create mode 100644 test/functional/history/index.js create mode 100644 test/functional/index.js create mode 100644 test/functional/layers/index.js create mode 100644 test/functional/map/index.js create mode 100644 test/functional/modals/index.js create mode 100644 test/functional/screenshots/index.js create mode 100644 test/functional/util/coverage.js create mode 100644 test/functional/util/webdriverio-ext.js diff --git a/config/wdio.conf.js b/config/wdio.conf.js index 41fe910d..9109e7a7 100644 --- a/config/wdio.conf.js +++ b/config/wdio.conf.js @@ -11,7 +11,7 @@ var SCREENSHOT_PATH = artifacts.pathSync("screenshots"); exports.config = { specs: [ - './test/functional/advanced.js' + './test/functional/index.js' ], exclude: [ ], diff --git a/test/functional/advanced.js b/test/functional/advanced.js deleted file mode 100644 index 0f77f106..00000000 --- a/test/functional/advanced.js +++ /dev/null @@ -1,1077 +0,0 @@ -var assert = require('assert'); -var config = require("../config/specs"); -var uuid = require('uuid/v1'); -var geoServer = require("../geojson-server"); -var wd = require("../wd-helper"); -var fs = require("fs"); -var path = require("path"); -var mkdirp = require("mkdirp"); -var artifacts = require("../artifacts"); -var istanbulCov = require('istanbul-lib-coverage'); - -var COVERAGE_PATH = artifacts.pathSync("/coverage"); -var SCREENSHOTS_PATH = artifacts.pathSync("/screenshots"); - - -browser.timeoutsAsyncScript(10*1000); -browser.timeoutsImplicitWait(10*1000); - - - -var modelCommands = { - addLayer: { - open: function() { - var selector = wd.$('layer-list:add-layer'); - browser.click(selector); - - // Wait for events - browser.flushReactUpdates(); - - browser.waitForExist(wd.$('modal:add-layer')); - browser.isVisible(wd.$('modal:add-layer')); - browser.isVisibleWithinViewport(wd.$('modal:add-layer')); - - // Wait for events - browser.flushReactUpdates(); - }, - fill: function(opts) { - var type = opts.type; - var layer = opts.layer; - var id; - if(opts.id) { - id = opts.id - } - else { - id = type+":"+uuid(); - } - - browser.selectByValue(wd.$("add-layer.layer-type", "select"), type); - browser.flushReactUpdates(); - - browser.setValueSafe(wd.$("add-layer.layer-id", "input"), id); - if(layer) { - browser.setValueSafe(wd.$("add-layer.layer-source-block", "input"), layer); - } - - browser.flushReactUpdates(); - browser.click(wd.$("add-layer")); - - return id; - } - } -} - -/** - * Sometimes chrome driver can result in the wrong text. - * - * See - */ -try { -browser.addCommand('setValueSafe', function(selector, text) { - for(var i=0; i<10; i++) { - console.log(">>>> waiting for visible"); - browser.waitForVisible(selector); - - var elements = browser.elements(selector); - if(elements.length > 1) { - console.error(">>> Too many elements found"); - throw "Too many elements found"; - } - - console.log(">>>> setting value"); - browser.setValue(selector, text); - var browserText = browser.getValue(selector); - - console.log("browserText='%s' test='%s'", browserText, text); - - if(browserText == text) { - return; - } - else { - console.error("Warning: setValue failed, trying again"); - } - } - - // Wait for change events to fire and state updated - browser.flushReactUpdates(); -}) - -browser.addCommand('takeScreenShot', function(filepath) { - var data = browser.screenshot(); - fs.writeFileSync(path.join(SCREENSHOTS_PATH, filepath), data.value, 'base64'); -}); - -browser.addCommand('flushReactUpdates', function() { - browser.executeAsync(function(done) { - // For any events to propogate - setImmediate(function() { - // For the DOM to be updated. - setImmediate(done); - }) - }) -}) - -} catch(err) { - console.error(err); -} - -describe('maputnik', function() { - var geoserver; - - before(function(done) { - // Start style server - geoserver = geoServer.listen(9002, done); - }); - - function getStyleStore(browser) { - var result = browser.executeAsync(function(done) { - window.debug.get("maputnik", "styleStore").latestStyle(done); - }) - return result.value; - } - - function getRevisionStore(browser) { - var result = browser.execute(function(done) { - var rs = window.debug.get("maputnik", "revisionStore") - - return { - currentIdx: rs.currentIdx, - revisions: rs.revisions - }; - }) - return result.value; - } - - function getStyleUrl(styles) { - var port = geoserver.address().port; - return "http://localhost:"+port+"/styles/empty/"+styles.join(","); - } - - function getGeoServerUrl(urlPath) { - var port = geoserver.address().port; - return "http://localhost:"+port+"/"+urlPath; - } - - beforeEach(function() { - browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - "geojson:example", - "raster:raster" - ])); - browser.waitForExist(".maputnik-toolbar-link"); - browser.flushReactUpdates(); - }); - - it('check logo exists', function () { - var src = browser.getAttribute(".maputnik-toolbar-link img", "src"); - assert.equal(src, config.baseUrl+'/img/logo-color.svg'); - }); - - function closeModal(wdKey) { - console.log(">> A"); - browser.waitUntil(function() { - return browser.isVisibleWithinViewport(wd.$(wdKey)); - }); - - console.log(">> B"); - var closeBtnSelector = wd.$(wdKey+".close-modal"); - browser.click(closeBtnSelector); - - console.log(">> C"); - browser.waitUntil(function() { - return !browser.isVisibleWithinViewport(wd.$(wdKey)); - }); - } - - describe("modal", function() { - describe("open", function() { - var styleFilePath = __dirname+"/../example-style.json"; - var styleFileData = JSON.parse(fs.readFileSync(styleFilePath)); - - beforeEach(function() { - browser.url(config.baseUrl+"?debug"); - - browser.waitForExist(".maputnik-toolbar-link"); - browser.flushReactUpdates(); - - browser.click(wd.$("nav:open")) - browser.flushReactUpdates(); - }); - - it("close", function() { - closeModal("open-modal"); - }); - - it("upload", function() { - browser.waitForExist("*[type='file']") - browser.chooseFile("*[type='file']", styleFilePath); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.deepEqual(styleFileData, styleObj); - }); - - it("load from url", function() { - var styleFileUrl = getGeoServerUrl("example-style.json"); - - browser.setValueSafe(wd.$("open-modal.url.input"), styleFileUrl); - - var selector = wd.$("open-modal.url.button"); - console.log("selector", selector); - browser.click(selector); - - // Allow the network request to happen - // NOTE: Its localhost so this should be fast. - browser.pause(300); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - console.log("styleFileData", styleFileData); - assert.deepEqual(styleFileData, styleObj); - }); - - // TODO: Need to work out how to mock out the end points - it("gallery") - }) - - describe("export", function() { - - beforeEach(function() { - browser.url(config.baseUrl+"?debug"); - - browser.waitForExist(".maputnik-toolbar-link"); - browser.flushReactUpdates(); - - browser.click(wd.$("nav:export")) - browser.flushReactUpdates(); - }); - - it("close", function() { - closeModal("export-modal"); - }); - - // TODO: Work out how to download a file and check the contents - it("download") - // TODO: Work out how to mock the end git points - it("save to gist") - }) - - describe("sources", function() { - it("active sources") - it("public source") - it("add new source") - }) - - describe("inspect", function() { - it("toggle", function() { - browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - "geojson:example" - ])); - - browser.click(wd.$("nav:inspect")); - }) - }) - - describe("style settings", function() { - beforeEach(function() { - browser.url(config.baseUrl+"?debug"); - - browser.waitForExist(".maputnik-toolbar-link"); - browser.flushReactUpdates(); - - browser.click(wd.$("nav:settings")) - browser.flushReactUpdates(); - }); - - it("name", function() { - browser.setValueSafe(wd.$("modal-settings.name"), "foobar") - browser.click(wd.$("modal-settings.owner")) - browser.flushReactUpdates(); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.equal(styleObj.name, "foobar"); - }) - it("owner", function() { - browser.setValueSafe(wd.$("modal-settings.owner"), "foobar") - browser.click(wd.$("modal-settings.name")) - browser.flushReactUpdates(); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.equal(styleObj.owner, "foobar"); - }) - it("sprite url", function() { - browser.setValueSafe(wd.$("modal-settings.sprite"), "http://example.com") - browser.click(wd.$("modal-settings.name")) - browser.flushReactUpdates(); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.equal(styleObj.sprite, "http://example.com"); - }) - it("glyphs url", function() { - var glyphsUrl = "http://example.com/{fontstack}/{range}.pbf" - browser.setValueSafe(wd.$("modal-settings.glyphs"), glyphsUrl) - browser.click(wd.$("modal-settings.name")) - browser.flushReactUpdates(); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.equal(styleObj.glyphs, glyphsUrl); - }) - - it("mapbox access token", function() { - var apiKey = "testing123"; - browser.setValueSafe(wd.$("modal-settings.maputnik:mapbox_access_token"), apiKey); - browser.click(wd.$("modal-settings.name")) - browser.flushReactUpdates(); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - browser.waitUntil(function() { - return styleObj.metadata["maputnik:mapbox_access_token"] == apiKey; - }) - }) - - it("open map tiles access token", function() { - var apiKey = "testing123"; - browser.setValueSafe(wd.$("modal-settings.maputnik:openmaptiles_access_token"), apiKey); - browser.click(wd.$("modal-settings.name")) - browser.flushReactUpdates(); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.equal(styleObj.metadata["maputnik:openmaptiles_access_token"], apiKey); - }) - - it("style renderer", function() { - var selector = wd.$("modal-settings.maputnik:renderer"); - browser.selectByValue(selector, "ol3"); - browser.click(wd.$("modal-settings.name")) - browser.flushReactUpdates(); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.equal(styleObj.metadata["maputnik:renderer"], "ol3"); - }) - }) - - describe("sources", function() { - it("toggle") - }) - }) - - describe.skip("zoom level", function() { - it("via url", function() { - var zoomLevel = "12.37" - browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - "geojson:example" - ])+"#"+zoomLevel+"/41.3805/2.1635"); - - browser.waitUntil(function () { - return ( - browser.isVisible(".mapboxgl-ctrl-zoom") - && browser.getText(".mapboxgl-ctrl-zoom") === "Zoom level: "+(zoomLevel) - ); - }, 10*1000) - }) - it("via map controls", function() { - var zoomLevel = 12.37; - browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - "geojson:example" - ])+"#"+zoomLevel+"/41.3805/2.1635"); - - browser.click(".mapboxgl-ctrl-zoom-in") - browser.waitUntil(function () { - var text = browser.getText(".mapboxgl-ctrl-zoom") - return text === "Zoom level: "+(zoomLevel+1); - }, 10*1000) - }) - }) - - describe.skip("groups", function() { - it("simple", function() { - browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - "geojson:example" - ])); - - modelCommands.addLayer.open(); - var aId = modelCommands.addLayer.fill({ - id: "foo", - type: "background" - }) - - modelCommands.addLayer.open(); - var bId = modelCommands.addLayer.fill({ - id: "foo_bar", - type: "background" - }) - - modelCommands.addLayer.open(); - var bId = modelCommands.addLayer.fill({ - id: "foo_baz", - type: "background" - }) - - browser.waitForExist(wd.$("layer-list-group:foo-0")); - - assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo")), false); - assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_bar")), false); - assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_baz")), false); - - browser.click(wd.$("layer-list-group:foo-0")); - - assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo")), true); - assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_bar")), true); - assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_baz")), true); - }) - }) - - describe.skip("history", function() { - /** - * See - */ - it("undo/redo", function() { - var styleObj; - - browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - "geojson:example" - ])); - - modelCommands.addLayer.open(); - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, []); - - modelCommands.addLayer.fill({ - id: "step 1", - type: "background" - }) - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - } - ]); - - modelCommands.addLayer.open(); - modelCommands.addLayer.fill({ - id: "step 2", - type: "background" - }) - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - }, - { - "id": "step 2", - "type": 'background' - } - ]); - - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) - - browser - .keys(['Control', 'z']) - .keys(['Control']); - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - } - ]); - - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) - - browser - .keys(['Control', 'z']) - .keys(['Control']); - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - ]); - - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) - - browser - .keys(['Control', 'y']) - .keys(['Control']); - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - } - ]); - - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) - - browser - .keys(['Control', 'y']) - .keys(['Control']); - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - }, - { - "id": "step 2", - "type": 'background' - } - ]); - - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) - }); - }) - - describe("layers", function() { - beforeEach(function() { - modelCommands.addLayer.open(); - }); - - describe("ops", function() { - it("delete", function() { - var styleObj; - var id = modelCommands.addLayer.fill({ - type: "background" - }) - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'background' - }, - ]); - - browser.click(wd.$("layer-list-item:"+id+":delete", "")); - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - ]); - }); - - it("duplicate", function() { - var styleObj; - var id = modelCommands.addLayer.fill({ - type: "background" - }) - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'background' - }, - ]); - - browser.click(wd.$("layer-list-item:"+id+":copy", "")); - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id+"-copy", - "type": "background" - }, - { - "id": id, - "type": "background" - }, - ]); - }); - - it("hide", function() { - var styleObj; - var id = modelCommands.addLayer.fill({ - type: "background" - }) - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'background' - }, - ]); - - browser.click(wd.$("layer-list-item:"+id+":toggle-visibility", "")); - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "background", - "layout": { - "visibility": "none" - } - }, - ]); - - browser.click(wd.$("layer-list-item:"+id+":toggle-visibility", "")); - - styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "background", - "layout": { - "visibility": "visible" - } - }, - ]); - }) - }) - - describe("grouped", function() { - it("with underscore") - it("no without underscore") - it("double underscore only grouped once") - }) - - describe("tooltips", function() { - }) - - describe("help", function() { - }) - - - describe('background', function () { - - it.skip("add", function() { - var id = modelCommands.addLayer.fill({ - type: "background" - }) - - browser.waitUntil(function() { - var styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'background' - } - ]); - }); - }); - - describe("modify", function() { - function createBackground() { - // Setup - var id = uuid(); - - browser.selectByValue(wd.$("add-layer.layer-type", "select"), "background"); - browser.flushReactUpdates(); - browser.setValueSafe(wd.$("add-layer.layer-id", "input"), "background:"+id); - - browser.click(wd.$("add-layer")); - - var styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+id, - "type": 'background' - } - ]); - return id; - } - - // ====> THESE SHOULD BE FROM THE SPEC - describe("layer", function() { - it("expand/collapse"); - it("id", function() { - var bgId = createBackground(); - - browser.click(wd.$("layer-list-item:background:"+bgId)) - - var id = uuid(); - browser.setValueSafe(wd.$("layer-editor.layer-id", "input"), "foobar:"+id) - browser.click(wd.$("min-zoom")) - - var styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": 'foobar:'+id, - "type": 'background' - } - ]); - }); - - // NOTE: This needs to be removed from the code - it("type"); - - it("min-zoom", function() { - var bgId = createBackground(); - - browser.click(wd.$("layer-list-item:background:"+bgId)) - browser.setValueSafe(wd.$("min-zoom", "input"), 1) - browser.click(wd.$("layer-editor.layer-id", "input")); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+bgId, - "type": 'background', - "minzoom": 1 - } - ]); - - // AND RESET! - // browser.setValueSafe(wd.$("min-zoom", "input"), "") - // browser.click(wd.$("max-zoom", "input")); - - // var styleObj = getStyleStore(browser); - // console.log("styleObj", styleObj); - - // assert.deepEqual(styleObj.layers, [ - // { - // "id": 'background:'+bgId, - // "type": 'background' - // } - // ]); - }); - - it("max-zoom", function() { - var bgId = createBackground(); - - browser.click(wd.$("layer-list-item:background:"+bgId)) - browser.setValueSafe(wd.$("max-zoom", "input"), 1) - browser.click(wd.$("layer-editor.layer-id", "input")); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+bgId, - "type": 'background', - "maxzoom": 1 - } - ]); - }); - - it("comments", function() { - var bgId = createBackground(); - var id = uuid(); - - browser.click(wd.$("layer-list-item:background:"+bgId)); - browser.setValueSafe(wd.$("layer-comment", "textarea"), id); - browser.click(wd.$("layer-editor.layer-id", "input")); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+bgId, - "type": 'background', - metadata: { - 'maputnik:comment': id - } - } - ]); - - // Unset it again. - // TODO: This fails - // browser.setValueSafe(wd.$("layer-comment", "textarea"), ""); - // browser.click(wd.$("min-zoom", "input")); - // browser.flushReactUpdates(); - - // var styleObj = getStyleStore(browser); - // console.log("styleObj", styleObj); - // assert.deepEqual(styleObj.layers, [ - // { - // "id": 'background:'+bgId, - // "type": 'background' - // } - // ]); - }); - - it("color", null, function() { - var bgId = createBackground(); - var id = uuid(); - - browser.click(wd.$("layer-list-item:background:"+bgId)); - - browser.click(wd.$("spec-field:background-color", "input")) - // browser.debug(); - - var styleObj = getStyleStore(browser); - console.log("styleObj", styleObj); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+bgId, - "type": 'background' - } - ]); - - }) - }) - - describe("filter", function() { - it("expand/collapse"); - it("compound filter"); - }) - - describe("paint", function() { - it("expand/collapse"); - it("color"); - it("pattern"); - it("opacity"); - }) - // <===== - - describe("json-editor", function() { - it("expand/collapse"); - it("modify"); - - // TODO - it.skip("parse error", function() { - var bgId = createBackground(); - var id = uuid(); - - browser.click(wd.$("layer-list-item:background:"+bgId)); - - var errorSelector = ".CodeMirror-lint-marker-error"; - assert.equal(browser.isExisting(errorSelector), false); - - browser.click(".CodeMirror") - browser.keys("\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013 {"); - browser.waitForExist(errorSelector) - - browser.click(wd.$("layer-editor.layer-id")); - }); - }); - }) - }); - - describe('fill', function () { - it.skip("add", function() { - // browser.debug(); - - var id = modelCommands.addLayer.fill({ - type: "fill", - layer: "example" - }); - - var styleObj = getStyleStore(browser); - console.log("STYLEOBJ", styleObj); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'fill', - "source": "example" - } - ]); - }) - - // TODO: Change source - it("change source") - }); - - describe('line', function () { - it.skip("add", function() { - var id = modelCommands.addLayer.fill({ - type: "line", - layer: "example" - }); - - var styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "line", - "source": "example", - } - ]); - }); - - it("groups", null, function() { - // TODO - // Click each of the layer groups. - }) - }); - - describe('symbol', function () { - it.skip("add", function() { - var id = modelCommands.addLayer.fill({ - type: "symbol", - layer: "example" - }); - - var styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "symbol", - "source": "example", - } - ]); - }); - }); - - describe('raster', function () { - it.skip("add", function() { - var id = modelCommands.addLayer.fill({ - type: "raster", - layer: "raster" - }); - - var styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "raster", - "source": "raster", - } - ]); - }); - }); - - describe('circle', function () { - it.skip("add", function() { - var id = modelCommands.addLayer.fill({ - type: "circle", - layer: "example" - }); - - var styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "circle", - "source": "example", - } - ]); - }); - - }); - - describe('fill extrusion', function () { - it.skip("add", function() { - var id = modelCommands.addLayer.fill({ - type: "fill-extrusion", - layer: "example" - }); - - var styleObj = getStyleStore(browser); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'fill-extrusion', - "source": "example" - } - ]); - }); - }); - - // These get used in the marketing material. They are also useful to do a quick manual check of the styling across browsers - // NOTE: These duplicate some of the tests, however this is indended becuase it's likely these will change for aesthetic reasons over time - }); - - // describe('screenshots', function() { - - // beforeEach(function() { - // browser.windowHandleSize({ - // width: 1280, - // height: 800 - // }); - // }) - - // it("front_page", function() { - // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - // "geojson:example" - // ])); - // browser.waitForExist(".maputnik-toolbar-link"); - // browser.flushReactUpdates(); - - // browser.takeScreenShot("/front_page.png") - // }) - - // it("open", function() { - // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - // "geojson:example" - // ])); - // browser.waitForExist(".maputnik-toolbar-link"); - // browser.flushReactUpdates(); - - // browser.click(wd.$("nav:open")) - // browser.flushReactUpdates(); - - // browser.takeScreenShot("/open.png") - // }) - - // it("export", function() { - // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - // "geojson:example" - // ])); - // browser.waitForExist(".maputnik-toolbar-link"); - // browser.flushReactUpdates(); - - // browser.click(wd.$("nav:export")) - // browser.flushReactUpdates(); - - // browser.takeScreenShot("/export.png") - // }) - - // it("sources", function() { - // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - // "geojson:example" - // ])); - // browser.waitForExist(".maputnik-toolbar-link"); - // browser.flushReactUpdates(); - - // browser.click(wd.$("nav:sources")) - // browser.flushReactUpdates(); - - // browser.takeScreenShot("/sources.png") - // }) - - // it("style settings", function() { - // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - // "geojson:example" - // ])); - // browser.waitForExist(".maputnik-toolbar-link"); - // browser.flushReactUpdates(); - - // browser.click(wd.$("nav:settings")) - // browser.flushReactUpdates(); - - // browser.takeScreenShot("/settings.png") - // }) - - // it("inspect", function() { - // browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ - // "geojson:example" - // ])); - // browser.waitForExist(".maputnik-toolbar-link"); - // browser.flushReactUpdates(); - - // browser.click(wd.$("nav:inspect")) - // browser.flushReactUpdates(); - - // browser.takeScreenShot("/inspect.png") - // }) - // }) - - var coverage = istanbulCov.createCoverageMap({}); - - afterEach(function() { - // Code coverage - var results = browser.execute(function() { - return window.__coverage__; - }); - - coverage.merge(results.value); - }) - - after(function() { - var jsonStr = JSON.stringify(coverage, null, 2); - fs.writeFileSync(COVERAGE_PATH+"/coverage.json", jsonStr); - }) - -}); - diff --git a/test/functional/helper.js b/test/functional/helper.js new file mode 100644 index 00000000..310265a9 --- /dev/null +++ b/test/functional/helper.js @@ -0,0 +1,79 @@ +var wd = require("../wd-helper"); +var uuid = require('uuid/v1'); +var geoServer = require("../geojson-server"); + + +// This should be sync... +var geoserver = geoServer.listen(9002); + + +module.exports = { + getStyleUrl: function(styles) { + var port = geoserver.address().port; + return "http://localhost:"+port+"/styles/empty/"+styles.join(","); + }, + getGeoServerUrl: function(urlPath) { + var port = geoserver.address().port; + return "http://localhost:"+port+"/"+urlPath; + }, + getStyleStore: function(browser) { + var result = browser.executeAsync(function(done) { + window.debug.get("maputnik", "styleStore").latestStyle(done); + }) + return result.value; + }, + getRevisionStore: function(browser) { + var result = browser.execute(function(done) { + var rs = window.debug.get("maputnik", "revisionStore") + + return { + currentIdx: rs.currentIdx, + revisions: rs.revisions + }; + }) + return result.value; + }, + modal: { + addLayer: { + open: function() { + var selector = wd.$('layer-list:add-layer'); + browser.click(selector); + + // Wait for events + browser.flushReactUpdates(); + + browser.waitForExist(wd.$('modal:add-layer')); + browser.isVisible(wd.$('modal:add-layer')); + browser.isVisibleWithinViewport(wd.$('modal:add-layer')); + + // Wait for events + browser.flushReactUpdates(); + }, + fill: function(opts) { + var type = opts.type; + var layer = opts.layer; + var id; + if(opts.id) { + id = opts.id + } + else { + id = type+":"+uuid(); + } + + browser.selectByValue(wd.$("add-layer.layer-type", "select"), type); + browser.flushReactUpdates(); + + browser.setValueSafe(wd.$("add-layer.layer-id", "input"), id); + if(layer) { + browser.setValueSafe(wd.$("add-layer.layer-source-block", "input"), layer); + } + + browser.flushReactUpdates(); + browser.click(wd.$("add-layer")); + + return id; + } + } + } +} + diff --git a/test/functional/history/index.js b/test/functional/history/index.js new file mode 100644 index 00000000..41895562 --- /dev/null +++ b/test/functional/history/index.js @@ -0,0 +1,205 @@ +var assert = require("assert"); +var config = require("../../config/specs"); +var helper = require("../helper"); +var wd = require("../../wd-helper"); + + +describe.skip("history", function() { + /** + * See + */ + it("undo/redo", function() { + var styleObj; + + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])); + + helper.modal.addLayer.open(); + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, []); + + helper.modal.addLayer.fill({ + id: "step 1", + type: "background" + }) + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + } + ]); + + helper.modal.addLayer.open(); + helper.modal.addLayer.fill({ + id: "step 2", + type: "background" + }) + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + }, + { + "id": "step 2", + "type": 'background' + } + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + + browser + .keys(['Control', 'z']) + .keys(['Control']); + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + } + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + + browser + .keys(['Control', 'z']) + .keys(['Control']); + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + + browser + .keys(['Control', 'y']) + .keys(['Control']); + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + } + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + + browser + .keys(['Control', 'y']) + .keys(['Control']); + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": "step 1", + "type": 'background' + }, + { + "id": "step 2", + "type": 'background' + } + ]); + + console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) + }); + + + // /** + // * See + // */ + // it("undo/redo", function() { + // var styleObj; + + // browser.debug(); + + // browser.url(helper.config.baseUrl+"?debug&style="+helper.getStyleUrl([ + // "geojson:example" + // ])); + // browser.waitForExist(".maputnik-toolbar-link"); + + // helper.modalCommands.addLayer.open(browser); + + // styleObj = helper.helper.getStyleStore(browser); + // console.log("styleObj", styleObj); + // assert.deepEqual(styleObj.layers, []); + + // helper.modalCommands.addLayer.fill(browser, { + // id: "step 1", + // type: "background" + // }) + + // styleObj = helper.helper.getStyleStore(browser); + // assert.deepEqual(styleObj.layers, [ + // { + // "id": "step 1", + // "type": 'background' + // } + // ]); + + // helper.modalCommands.addLayer.open(browser); + // helper.modalCommands.addLayer.fill(browser, { + // id: "step 2", + // type: "background" + // }) + + // styleObj = helper.helper.getStyleStore(browser); + // assert.deepEqual(styleObj.layers, [ + // { + // "id": "step 1", + // "type": 'background' + // }, + // { + // "id": "step 2", + // "type": 'background' + // } + // ]); + + // browser + // .keys(['Control', 'z']) + // .keys(['Control']); + // styleObj = helper.helper.getStyleStore(browser); + // assert.deepEqual(styleObj.layers, [ + // { + // "id": "step 1", + // "type": 'background' + // } + // ]); + + // browser + // .keys(['Control', 'z']) + // .keys(['Control']); + // styleObj = helper.helper.getStyleStore(browser); + // assert.deepEqual(styleObj.layers, [ + // ]); + + // browser + // .keys(['Control', 'y']) + // .keys(['Control']); + // styleObj = helper.helper.getStyleStore(browser); + // assert.deepEqual(styleObj.layers, [ + // { + // "id": "step 1", + // "type": 'background' + // } + // ]); + + // browser + // .keys(['Control', 'y']) + // .keys(['Control']); + // styleObj = helper.helper.getStyleStore(browser); + // assert.deepEqual(styleObj.layers, [ + // { + // "id": "step 1", + // "type": 'background' + // }, + // { + // "id": "step 2", + // "type": 'background' + // } + // ]); + + // }) +}) diff --git a/test/functional/index.js b/test/functional/index.js new file mode 100644 index 00000000..34d5e626 --- /dev/null +++ b/test/functional/index.js @@ -0,0 +1,33 @@ +var assert = require('assert'); +var config = require("../config/specs"); +var geoServer = require("../geojson-server"); +var helper = require("./helper"); + +require("./util/webdriverio-ext"); + + +describe('maputnik', function() { + + beforeEach(function() { + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example", + "raster:raster" + ])); + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + }); + + // -------- setup -------- + require("./util/coverage"); + // ----------------------- + + // ---- All the tests ---- + require("./history"); + require("./layers"); + require("./map"); + require("./modals"); + // require("./screenshots"); + // ------------------------ + +}); + diff --git a/test/functional/layers/index.js b/test/functional/layers/index.js new file mode 100644 index 00000000..d8f4acfd --- /dev/null +++ b/test/functional/layers/index.js @@ -0,0 +1,497 @@ +var assert = require("assert"); +var config = require("../../config/specs"); +var helper = require("../helper"); +var uuid = require('uuid/v1'); +var wd = require("../../wd-helper"); + + +describe("layers", function() { + beforeEach(function() { + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example", + "raster:raster" + ])); + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + helper.modal.addLayer.open(); + }); + + describe("ops", function() { + it("delete", function() { + var styleObj; + var id = helper.modal.addLayer.fill({ + type: "background" + }) + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'background' + }, + ]); + + browser.click(wd.$("layer-list-item:"+id+":delete", "")); + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + ]); + }); + + it("duplicate", function() { + var styleObj; + var id = helper.modal.addLayer.fill({ + type: "background" + }) + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'background' + }, + ]); + + browser.click(wd.$("layer-list-item:"+id+":copy", "")); + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id+"-copy", + "type": "background" + }, + { + "id": id, + "type": "background" + }, + ]); + }); + + it("hide", function() { + var styleObj; + var id = helper.modal.addLayer.fill({ + type: "background" + }) + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'background' + }, + ]); + + browser.click(wd.$("layer-list-item:"+id+":toggle-visibility", "")); + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "background", + "layout": { + "visibility": "none" + } + }, + ]); + + browser.click(wd.$("layer-list-item:"+id+":toggle-visibility", "")); + + styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "background", + "layout": { + "visibility": "visible" + } + }, + ]); + }) + }) + + describe("grouped", function() { + it("with underscore") + it("no without underscore") + it("double underscore only grouped once") + }) + + describe("tooltips", function() { + }) + + describe("help", function() { + }) + + + describe('background', function () { + + it.skip("add", function() { + var id = helper.modal.addLayer.fill({ + type: "background" + }) + + browser.waitUntil(function() { + var styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'background' + } + ]); + }); + }); + + describe("modify", function() { + function createBackground() { + // Setup + var id = uuid(); + + browser.selectByValue(wd.$("add-layer.layer-type", "select"), "background"); + browser.flushReactUpdates(); + browser.setValueSafe(wd.$("add-layer.layer-id", "input"), "background:"+id); + + browser.click(wd.$("add-layer")); + + var styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+id, + "type": 'background' + } + ]); + return id; + } + + // ====> THESE SHOULD BE FROM THE SPEC + describe("layer", function() { + it("expand/collapse"); + it("id", function() { + var bgId = createBackground(); + + browser.click(wd.$("layer-list-item:background:"+bgId)) + + var id = uuid(); + browser.setValueSafe(wd.$("layer-editor.layer-id", "input"), "foobar:"+id) + browser.click(wd.$("min-zoom")) + + var styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": 'foobar:'+id, + "type": 'background' + } + ]); + }); + + // NOTE: This needs to be removed from the code + it("type"); + + it("min-zoom", function() { + var bgId = createBackground(); + + browser.click(wd.$("layer-list-item:background:"+bgId)) + browser.setValueSafe(wd.$("min-zoom", "input"), 1) + browser.click(wd.$("layer-editor.layer-id", "input")); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+bgId, + "type": 'background', + "minzoom": 1 + } + ]); + + // AND RESET! + // browser.setValueSafe(wd.$("min-zoom", "input"), "") + // browser.click(wd.$("max-zoom", "input")); + + // var styleObj = helper.getStyleStore(browser); + // console.log("styleObj", styleObj); + + // assert.deepEqual(styleObj.layers, [ + // { + // "id": 'background:'+bgId, + // "type": 'background' + // } + // ]); + }); + + it("max-zoom", function() { + var bgId = createBackground(); + + browser.click(wd.$("layer-list-item:background:"+bgId)) + browser.setValueSafe(wd.$("max-zoom", "input"), 1) + browser.click(wd.$("layer-editor.layer-id", "input")); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+bgId, + "type": 'background', + "maxzoom": 1 + } + ]); + }); + + it("comments", function() { + var bgId = createBackground(); + var id = uuid(); + + browser.click(wd.$("layer-list-item:background:"+bgId)); + browser.setValueSafe(wd.$("layer-comment", "textarea"), id); + browser.click(wd.$("layer-editor.layer-id", "input")); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+bgId, + "type": 'background', + metadata: { + 'maputnik:comment': id + } + } + ]); + + // Unset it again. + // TODO: This fails + // browser.setValueSafe(wd.$("layer-comment", "textarea"), ""); + // browser.click(wd.$("min-zoom", "input")); + // browser.flushReactUpdates(); + + // var styleObj = helper.getStyleStore(browser); + // console.log("styleObj", styleObj); + // assert.deepEqual(styleObj.layers, [ + // { + // "id": 'background:'+bgId, + // "type": 'background' + // } + // ]); + }); + + it("color", null, function() { + var bgId = createBackground(); + var id = uuid(); + + browser.click(wd.$("layer-list-item:background:"+bgId)); + + browser.click(wd.$("spec-field:background-color", "input")) + // browser.debug(); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": 'background:'+bgId, + "type": 'background' + } + ]); + + }) + }) + + describe("filter", function() { + it("expand/collapse"); + it("compound filter"); + }) + + describe("paint", function() { + it("expand/collapse"); + it("color"); + it("pattern"); + it("opacity"); + }) + // <===== + + describe("json-editor", function() { + it("expand/collapse"); + it("modify"); + + // TODO + it.skip("parse error", function() { + var bgId = createBackground(); + var id = uuid(); + + browser.click(wd.$("layer-list-item:background:"+bgId)); + + var errorSelector = ".CodeMirror-lint-marker-error"; + assert.equal(browser.isExisting(errorSelector), false); + + browser.click(".CodeMirror") + browser.keys("\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013 {"); + browser.waitForExist(errorSelector) + + browser.click(wd.$("layer-editor.layer-id")); + }); + }); + }) + }); + + describe('fill', function () { + it.skip("add", function() { + // browser.debug(); + + var id = helper.modal.addLayer.fill({ + type: "fill", + layer: "example" + }); + + var styleObj = helper.getStyleStore(browser); + console.log("STYLEOBJ", styleObj); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'fill', + "source": "example" + } + ]); + }) + + // TODO: Change source + it("change source") + }); + + describe('line', function () { + it.skip("add", function() { + var id = helper.modal.addLayer.fill({ + type: "line", + layer: "example" + }); + + var styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "line", + "source": "example", + } + ]); + }); + + it("groups", null, function() { + // TODO + // Click each of the layer groups. + }) + }); + + describe('symbol', function () { + it.skip("add", function() { + var id = helper.modal.addLayer.fill({ + type: "symbol", + layer: "example" + }); + + var styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "symbol", + "source": "example", + } + ]); + }); + }); + + describe('raster', function () { + it.skip("add", function() { + var id = helper.modal.addLayer.fill({ + type: "raster", + layer: "raster" + }); + + var styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "raster", + "source": "raster", + } + ]); + }); + }); + + describe('circle', function () { + it.skip("add", function() { + var id = helper.modal.addLayer.fill({ + type: "circle", + layer: "example" + }); + + var styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": "circle", + "source": "example", + } + ]); + }); + + }); + + describe('fill extrusion', function () { + it.skip("add", function() { + var id = helper.modal.addLayer.fill({ + type: "fill-extrusion", + layer: "example" + }); + + var styleObj = helper.getStyleStore(browser); + assert.deepEqual(styleObj.layers, [ + { + "id": id, + "type": 'fill-extrusion', + "source": "example" + } + ]); + }); + }); + + // These get used in the marketing material. They are also useful to do a quick manual check of the styling across browsers + // NOTE: These duplicate some of the tests, however this is indended becuase it's likely these will change for aesthetic reasons over time + // + + + + describe.skip("groups", function() { + it("simple", function() { + browser.url(config.baseUrl+"?debug&style="+getStyleUrl([ + "geojson:example" + ])); + + helper.modal.addLayer.open(); + var aId = helper.modal.addLayer.fill({ + id: "foo", + type: "background" + }) + + helper.modal.addLayer.open(); + var bId = helper.modal.addLayer.fill({ + id: "foo_bar", + type: "background" + }) + + helper.modal.addLayer.open(); + var bId = helper.modal.addLayer.fill({ + id: "foo_baz", + type: "background" + }) + + browser.waitForExist(wd.$("layer-list-group:foo-0")); + + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo")), false); + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_bar")), false); + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_baz")), false); + + browser.click(wd.$("layer-list-group:foo-0")); + + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo")), true); + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_bar")), true); + assert.equal(browser.isVisibleWithinViewport(wd.$("layer-list-item:foo_baz")), true); + }) + }) +}); + diff --git a/test/functional/map/index.js b/test/functional/map/index.js new file mode 100644 index 00000000..498c0a1d --- /dev/null +++ b/test/functional/map/index.js @@ -0,0 +1,35 @@ +var assert = require('assert'); +var wd = require("../../wd-helper"); +var config = require("../../config/specs"); +var helper = require("../helper"); + + +describe("map", function() { + describe.skip("zoom level", function() { + it("via url", function() { + var zoomLevel = "12.37" + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])+"#"+zoomLevel+"/41.3805/2.1635"); + + browser.waitUntil(function () { + return ( + browser.isVisible(".mapboxgl-ctrl-zoom") + && browser.getText(".mapboxgl-ctrl-zoom") === "Zoom level: "+(zoomLevel) + ); + }, 10*1000) + }) + it("via map controls", function() { + var zoomLevel = 12.37; + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])+"#"+zoomLevel+"/41.3805/2.1635"); + + browser.click(".mapboxgl-ctrl-zoom-in") + browser.waitUntil(function () { + var text = browser.getText(".mapboxgl-ctrl-zoom") + return text === "Zoom level: "+(zoomLevel+1); + }, 10*1000) + }) + }) +}) diff --git a/test/functional/modals/index.js b/test/functional/modals/index.js new file mode 100644 index 00000000..3a5a897a --- /dev/null +++ b/test/functional/modals/index.js @@ -0,0 +1,203 @@ +var assert = require('assert'); +var fs = require("fs"); +var wd = require("../../wd-helper"); +var config = require("../../config/specs"); +var helper = require("../helper"); + + + +// TODO: Is this needed? +function closeModal(wdKey) { + console.log(">> A"); + browser.waitUntil(function() { + return browser.isVisibleWithinViewport(wd.$(wdKey)); + }); + + console.log(">> B"); + var closeBtnSelector = wd.$(wdKey+".close-modal"); + browser.click(closeBtnSelector); + + console.log(">> C"); + browser.waitUntil(function() { + return !browser.isVisibleWithinViewport(wd.$(wdKey)); + }); +} + +describe("modals", function() { + describe("open", function() { + var styleFilePath = __dirname+"/../../example-style.json"; + var styleFileData = JSON.parse(fs.readFileSync(styleFilePath)); + + beforeEach(function() { + browser.url(config.baseUrl+"?debug"); + + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:open")) + browser.flushReactUpdates(); + }); + + it("close", function() { + closeModal("open-modal"); + }); + + it("upload", function() { + browser.waitForExist("*[type='file']") + browser.chooseFile("*[type='file']", styleFilePath); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.deepEqual(styleFileData, styleObj); + }); + + it("load from url", function() { + var styleFileUrl = helper.getGeoServerUrl("example-style.json"); + + browser.setValueSafe(wd.$("open-modal.url.input"), styleFileUrl); + + var selector = wd.$("open-modal.url.button"); + console.log("selector", selector); + browser.click(selector); + + // Allow the network request to happen + // NOTE: Its localhost so this should be fast. + browser.pause(300); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + console.log("styleFileData", styleFileData); + assert.deepEqual(styleFileData, styleObj); + }); + + // TODO: Need to work out how to mock out the end points + it("gallery") + }) + + describe("export", function() { + + beforeEach(function() { + browser.url(config.baseUrl+"?debug"); + + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:export")) + browser.flushReactUpdates(); + }); + + it("close", function() { + closeModal("export-modal"); + }); + + // TODO: Work out how to download a file and check the contents + it("download") + // TODO: Work out how to mock the end git points + it("save to gist") + }) + + describe("sources", function() { + it("active sources") + it("public source") + it("add new source") + }) + + describe("inspect", function() { + it("toggle", function() { + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])); + + browser.click(wd.$("nav:inspect")); + }) + }) + + describe("style settings", function() { + beforeEach(function() { + browser.url(config.baseUrl+"?debug"); + + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:settings")) + browser.flushReactUpdates(); + }); + + it("name", function() { + browser.setValueSafe(wd.$("modal-settings.name"), "foobar") + browser.click(wd.$("modal-settings.owner")) + browser.flushReactUpdates(); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.name, "foobar"); + }) + it("owner", function() { + browser.setValueSafe(wd.$("modal-settings.owner"), "foobar") + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.owner, "foobar"); + }) + it("sprite url", function() { + browser.setValueSafe(wd.$("modal-settings.sprite"), "http://example.com") + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.sprite, "http://example.com"); + }) + it("glyphs url", function() { + var glyphsUrl = "http://example.com/{fontstack}/{range}.pbf" + browser.setValueSafe(wd.$("modal-settings.glyphs"), glyphsUrl) + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.glyphs, glyphsUrl); + }) + + it("mapbox access token", function() { + var apiKey = "testing123"; + browser.setValueSafe(wd.$("modal-settings.maputnik:mapbox_access_token"), apiKey); + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + browser.waitUntil(function() { + return styleObj.metadata["maputnik:mapbox_access_token"] == apiKey; + }) + }) + + it("open map tiles access token", function() { + var apiKey = "testing123"; + browser.setValueSafe(wd.$("modal-settings.maputnik:openmaptiles_access_token"), apiKey); + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.metadata["maputnik:openmaptiles_access_token"], apiKey); + }) + + it("style renderer", function() { + var selector = wd.$("modal-settings.maputnik:renderer"); + browser.selectByValue(selector, "ol3"); + browser.click(wd.$("modal-settings.name")) + browser.flushReactUpdates(); + + var styleObj = helper.getStyleStore(browser); + console.log("styleObj", styleObj); + assert.equal(styleObj.metadata["maputnik:renderer"], "ol3"); + }) + }) + + describe("sources", function() { + it("toggle") + }) +}) diff --git a/test/functional/screenshots/index.js b/test/functional/screenshots/index.js new file mode 100644 index 00000000..ad206b48 --- /dev/null +++ b/test/functional/screenshots/index.js @@ -0,0 +1,93 @@ +var artifacts = require("../../artifacts"); +var config = require("../../config/specs"); +var helper = require("../helper"); +var wd = require("../../wd-helper"); + +var SCREENSHOTS_PATH = artifacts.pathSync("/screenshots"); + + +describe('screenshots', function() { + + beforeEach(function() { + browser.windowHandleSize({ + width: 1280, + height: 800 + }); + }) + + it("front_page", function() { + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])); + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.takeScreenShot("/front_page.png") + }) + + it("open", function() { + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])); + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:open")) + browser.flushReactUpdates(); + + browser.takeScreenShot("/open.png") + }) + + it("export", function() { + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])); + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:export")) + browser.flushReactUpdates(); + + browser.takeScreenShot("/export.png") + }) + + it("sources", function() { + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])); + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:sources")) + browser.flushReactUpdates(); + + browser.takeScreenShot("/sources.png") + }) + + it("style settings", function() { + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])); + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:settings")) + browser.flushReactUpdates(); + + browser.takeScreenShot("/settings.png") + }) + + it("inspect", function() { + browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([ + "geojson:example" + ])); + browser.waitForExist(".maputnik-toolbar-link"); + browser.flushReactUpdates(); + + browser.click(wd.$("nav:inspect")) + browser.flushReactUpdates(); + + browser.takeScreenShot("/inspect.png") + }) +}) + diff --git a/test/functional/util/coverage.js b/test/functional/util/coverage.js new file mode 100644 index 00000000..335decd1 --- /dev/null +++ b/test/functional/util/coverage.js @@ -0,0 +1,26 @@ +var artifacts = require("../../artifacts"); +var fs = require("fs"); +var istanbulCov = require('istanbul-lib-coverage'); + +var COVERAGE_PATH = artifacts.pathSync("/coverage"); + + +var coverage = istanbulCov.createCoverageMap({}); + +describe("coverage", function() { + // Capture the coverage after each test + afterEach(function() { + // Code coverage + var results = browser.execute(function() { + return window.__coverage__; + }); + + coverage.merge(results.value); + }) + + // Dump the coverage to a file + after(function() { + var jsonStr = JSON.stringify(coverage, null, 2); + fs.writeFileSync(COVERAGE_PATH+"/coverage.json", jsonStr); + }) +}) diff --git a/test/functional/util/webdriverio-ext.js b/test/functional/util/webdriverio-ext.js new file mode 100644 index 00000000..bfd7fbbd --- /dev/null +++ b/test/functional/util/webdriverio-ext.js @@ -0,0 +1,56 @@ +browser.timeoutsAsyncScript(10*1000); +browser.timeoutsImplicitWait(10*1000); + +/** + * Sometimes chrome driver can result in the wrong text. + * + * See + */ +try { + browser.addCommand('setValueSafe', function(selector, text) { + for(var i=0; i<10; i++) { + console.log(">>>> waiting for visible"); + browser.waitForVisible(selector); + + var elements = browser.elements(selector); + if(elements.length > 1) { + console.error(">>> Too many elements found"); + throw "Too many elements found"; + } + + console.log(">>>> setting value"); + browser.setValue(selector, text); + var browserText = browser.getValue(selector); + + console.log("browserText='%s' test='%s'", browserText, text); + + if(browserText == text) { + return; + } + else { + console.error("Warning: setValue failed, trying again"); + } + } + + // Wait for change events to fire and state updated + browser.flushReactUpdates(); + }) + + browser.addCommand('takeScreenShot', function(filepath) { + var data = browser.screenshot(); + fs.writeFileSync(path.join(SCREENSHOTS_PATH, filepath), data.value, 'base64'); + }); + + browser.addCommand('flushReactUpdates', function() { + browser.executeAsync(function(done) { + // For any events to propogate + setImmediate(function() { + // For the DOM to be updated. + setImmediate(done); + }) + }) + }) + +} catch(err) { + console.error(">>> Ignored error: "+err); +} From 2e8a188bce82d9010ab65a2ddef5656fa27aac76 Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 14:51:25 +0000 Subject: [PATCH 003/134] Increased timeouts. --- test/functional/util/webdriverio-ext.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/functional/util/webdriverio-ext.js b/test/functional/util/webdriverio-ext.js index bfd7fbbd..26f91348 100644 --- a/test/functional/util/webdriverio-ext.js +++ b/test/functional/util/webdriverio-ext.js @@ -1,5 +1,5 @@ -browser.timeoutsAsyncScript(10*1000); -browser.timeoutsImplicitWait(10*1000); +browser.timeoutsAsyncScript(20*1000); +browser.timeoutsImplicitWait(20*1000); /** * Sometimes chrome driver can result in the wrong text. From 1eb6c28617f08afcdf8f53583bb9ea2a6166319d Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 14:59:48 +0000 Subject: [PATCH 004/134] Removed logging. --- test/functional/history/index.js | 10 ---------- test/functional/layers/index.js | 7 ------- test/functional/modals/index.js | 14 -------------- test/functional/util/webdriverio-ext.js | 5 ----- 4 files changed, 36 deletions(-) diff --git a/test/functional/history/index.js b/test/functional/history/index.js index 41895562..d699c075 100644 --- a/test/functional/history/index.js +++ b/test/functional/history/index.js @@ -51,8 +51,6 @@ describe.skip("history", function() { } ]); - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) - browser .keys(['Control', 'z']) .keys(['Control']); @@ -64,8 +62,6 @@ describe.skip("history", function() { } ]); - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) - browser .keys(['Control', 'z']) .keys(['Control']); @@ -73,8 +69,6 @@ describe.skip("history", function() { assert.deepEqual(styleObj.layers, [ ]); - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) - browser .keys(['Control', 'y']) .keys(['Control']); @@ -86,8 +80,6 @@ describe.skip("history", function() { } ]); - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) - browser .keys(['Control', 'y']) .keys(['Control']); @@ -103,7 +95,6 @@ describe.skip("history", function() { } ]); - console.log(">>> LOGS", JSON.stringify(browser.log("browser"), null, 2)) }); @@ -123,7 +114,6 @@ describe.skip("history", function() { // helper.modalCommands.addLayer.open(browser); // styleObj = helper.helper.getStyleStore(browser); - // console.log("styleObj", styleObj); // assert.deepEqual(styleObj.layers, []); // helper.modalCommands.addLayer.fill(browser, { diff --git a/test/functional/layers/index.js b/test/functional/layers/index.js index d8f4acfd..14c5d797 100644 --- a/test/functional/layers/index.js +++ b/test/functional/layers/index.js @@ -194,7 +194,6 @@ describe("layers", function() { browser.click(wd.$("layer-editor.layer-id", "input")); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.deepEqual(styleObj.layers, [ { "id": 'background:'+bgId, @@ -208,7 +207,6 @@ describe("layers", function() { // browser.click(wd.$("max-zoom", "input")); // var styleObj = helper.getStyleStore(browser); - // console.log("styleObj", styleObj); // assert.deepEqual(styleObj.layers, [ // { @@ -226,7 +224,6 @@ describe("layers", function() { browser.click(wd.$("layer-editor.layer-id", "input")); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.deepEqual(styleObj.layers, [ { "id": 'background:'+bgId, @@ -245,7 +242,6 @@ describe("layers", function() { browser.click(wd.$("layer-editor.layer-id", "input")); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.deepEqual(styleObj.layers, [ { "id": 'background:'+bgId, @@ -263,7 +259,6 @@ describe("layers", function() { // browser.flushReactUpdates(); // var styleObj = helper.getStyleStore(browser); - // console.log("styleObj", styleObj); // assert.deepEqual(styleObj.layers, [ // { // "id": 'background:'+bgId, @@ -282,7 +277,6 @@ describe("layers", function() { // browser.debug(); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.deepEqual(styleObj.layers, [ { "id": 'background:'+bgId, @@ -340,7 +334,6 @@ describe("layers", function() { }); var styleObj = helper.getStyleStore(browser); - console.log("STYLEOBJ", styleObj); assert.deepEqual(styleObj.layers, [ { "id": id, diff --git a/test/functional/modals/index.js b/test/functional/modals/index.js index 3a5a897a..24f9ffd5 100644 --- a/test/functional/modals/index.js +++ b/test/functional/modals/index.js @@ -8,16 +8,13 @@ var helper = require("../helper"); // TODO: Is this needed? function closeModal(wdKey) { - console.log(">> A"); browser.waitUntil(function() { return browser.isVisibleWithinViewport(wd.$(wdKey)); }); - console.log(">> B"); var closeBtnSelector = wd.$(wdKey+".close-modal"); browser.click(closeBtnSelector); - console.log(">> C"); browser.waitUntil(function() { return !browser.isVisibleWithinViewport(wd.$(wdKey)); }); @@ -47,7 +44,6 @@ describe("modals", function() { browser.chooseFile("*[type='file']", styleFilePath); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.deepEqual(styleFileData, styleObj); }); @@ -57,7 +53,6 @@ describe("modals", function() { browser.setValueSafe(wd.$("open-modal.url.input"), styleFileUrl); var selector = wd.$("open-modal.url.button"); - console.log("selector", selector); browser.click(selector); // Allow the network request to happen @@ -65,8 +60,6 @@ describe("modals", function() { browser.pause(300); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); - console.log("styleFileData", styleFileData); assert.deepEqual(styleFileData, styleObj); }); @@ -129,7 +122,6 @@ describe("modals", function() { browser.flushReactUpdates(); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.equal(styleObj.name, "foobar"); }) it("owner", function() { @@ -138,7 +130,6 @@ describe("modals", function() { browser.flushReactUpdates(); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.equal(styleObj.owner, "foobar"); }) it("sprite url", function() { @@ -147,7 +138,6 @@ describe("modals", function() { browser.flushReactUpdates(); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.equal(styleObj.sprite, "http://example.com"); }) it("glyphs url", function() { @@ -157,7 +147,6 @@ describe("modals", function() { browser.flushReactUpdates(); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.equal(styleObj.glyphs, glyphsUrl); }) @@ -168,7 +157,6 @@ describe("modals", function() { browser.flushReactUpdates(); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); browser.waitUntil(function() { return styleObj.metadata["maputnik:mapbox_access_token"] == apiKey; }) @@ -181,7 +169,6 @@ describe("modals", function() { browser.flushReactUpdates(); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.equal(styleObj.metadata["maputnik:openmaptiles_access_token"], apiKey); }) @@ -192,7 +179,6 @@ describe("modals", function() { browser.flushReactUpdates(); var styleObj = helper.getStyleStore(browser); - console.log("styleObj", styleObj); assert.equal(styleObj.metadata["maputnik:renderer"], "ol3"); }) }) diff --git a/test/functional/util/webdriverio-ext.js b/test/functional/util/webdriverio-ext.js index 26f91348..2a2edfd1 100644 --- a/test/functional/util/webdriverio-ext.js +++ b/test/functional/util/webdriverio-ext.js @@ -9,21 +9,16 @@ browser.timeoutsImplicitWait(20*1000); try { browser.addCommand('setValueSafe', function(selector, text) { for(var i=0; i<10; i++) { - console.log(">>>> waiting for visible"); browser.waitForVisible(selector); var elements = browser.elements(selector); if(elements.length > 1) { - console.error(">>> Too many elements found"); throw "Too many elements found"; } - console.log(">>>> setting value"); browser.setValue(selector, text); var browserText = browser.getValue(selector); - console.log("browserText='%s' test='%s'", browserText, text); - if(browserText == text) { return; } From ad34147f28458940726f086691ba0d8c81a4165c Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 15:39:17 +0000 Subject: [PATCH 005/134] Fixed screenshots. --- test/functional/index.js | 2 +- test/functional/screenshots/index.js | 2 -- test/functional/util/webdriverio-ext.js | 7 +++++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/test/functional/index.js b/test/functional/index.js index 34d5e626..7f9b5322 100644 --- a/test/functional/index.js +++ b/test/functional/index.js @@ -26,7 +26,7 @@ describe('maputnik', function() { require("./layers"); require("./map"); require("./modals"); - // require("./screenshots"); + require("./screenshots"); // ------------------------ }); diff --git a/test/functional/screenshots/index.js b/test/functional/screenshots/index.js index ad206b48..b64d0c9c 100644 --- a/test/functional/screenshots/index.js +++ b/test/functional/screenshots/index.js @@ -3,8 +3,6 @@ var config = require("../../config/specs"); var helper = require("../helper"); var wd = require("../../wd-helper"); -var SCREENSHOTS_PATH = artifacts.pathSync("/screenshots"); - describe('screenshots', function() { diff --git a/test/functional/util/webdriverio-ext.js b/test/functional/util/webdriverio-ext.js index 2a2edfd1..ee35b486 100644 --- a/test/functional/util/webdriverio-ext.js +++ b/test/functional/util/webdriverio-ext.js @@ -1,6 +1,13 @@ +var artifacts = require("../../artifacts"); +var fs = require("fs"); +var path = require("path"); + + browser.timeoutsAsyncScript(20*1000); browser.timeoutsImplicitWait(20*1000); +var SCREENSHOTS_PATH = artifacts.pathSync("/screenshots"); + /** * Sometimes chrome driver can result in the wrong text. * From 0c2934c4899a2402c7099d0c934192be9ef257ca Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 15:44:00 +0000 Subject: [PATCH 006/134] Code to store artifacts on circle ci --- .circleci/config.yml | 2 ++ test/artifacts.js | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f78c4ee5..d6e8922e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,3 +25,5 @@ jobs: - run: DOCKER_HOST=localhost npm test - run: npm run build - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov + - store_artifacts: + path: /tmp/artifacts diff --git a/test/artifacts.js b/test/artifacts.js index 73943aad..efebbe9b 100644 --- a/test/artifacts.js +++ b/test/artifacts.js @@ -6,8 +6,8 @@ function genPath(subPath) { subPath = subPath || "."; var buildPath; - if(process.env.CIRCLE_ARTIFACTS) { - buildPath = path.join(process.env.CIRCLE_ARTIFACTS, subPath); + if(process.env.CIRCLECI) { + buildPath = path.join("/tmp/artifacts", subPath); } else { buildPath = path.join(__dirname, '..', 'build', subPath); From c1312fb28816c5e92005296079234a79ca071c1c Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 15:46:48 +0000 Subject: [PATCH 007/134] Added '/build' to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 83a8308f..af33419d 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ node_modules public /errorShots /old +/build From 211850c81327b3b6308f8253a8c98d0a3b1c558c Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 16:53:42 +0000 Subject: [PATCH 008/134] Added cross-env --- package-lock.json | 16 ++++++++++++++++ package.json | 5 +++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 51652f84..cdf2cdd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2771,6 +2771,16 @@ "object-assign": "4.1.1" } }, + "cross-env": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.3.tgz", + "integrity": "sha512-UOokgwvDzCT0mqRSLEkJzUhYXB1vK3E5UgDrD41QiXsm9UetcW2rCGHYz/O3p873lMJ1VZbFCF9Izkwh7nYR5A==", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "is-windows": "1.0.1" + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -6085,6 +6095,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", + "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", + "dev": true + }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", diff --git a/package.json b/package.json index ba5d9e03..7e8b5086 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "scripts": { "stats": "webpack --config config/webpack.production.config.js --profile --json > stats.json", "build": "webpack --config config/webpack.production.config.js --progress --profile --colors", - "test": "wdio config/wdio.conf.js", - "test-watch": "wdio config/wdio.conf.js --watch", + "test": "cross-env NODE_ENV=test wdio config/wdio.conf.js", + "test-watch": "cross-env NODE_ENV=test wdio config/wdio.conf.js --watch", "start": "webpack-dev-server --progress --profile --colors --config config/webpack.config.js", "lint": "eslint --ext js --ext jsx {src,test}", "lint-styles": "stylelint 'src/styles/*.scss'" @@ -103,6 +103,7 @@ "base64-loader": "^1.0.0", "copy-webpack-plugin": "^4.2.0", "cors": "^2.8.4", + "cross-env": "^5.1.3", "css-loader": "^0.28.7", "eslint": "^4.10.0", "eslint-plugin-react": "^7.4.0", From bc19aea4387b29e4aabb34eb86a4512b855c2380 Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 17:01:55 +0000 Subject: [PATCH 009/134] CircleCI test now just calls npm test --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d6e8922e..c194ce86 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,6 +24,6 @@ jobs: - run: mkdir -p /tmp/artifacts/logs - run: DOCKER_HOST=localhost npm test - run: npm run build - - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov + - run: npm test - store_artifacts: path: /tmp/artifacts From 0cec0cf595670de0e1b2779c5ef7244f83d8b375 Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 17:36:46 +0000 Subject: [PATCH 010/134] Fix coverage in tests. --- .circleci/config.yml | 2 +- test/functional/util/coverage.js | 28 +++++++++++++--------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c194ce86..d6e8922e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,6 +24,6 @@ jobs: - run: mkdir -p /tmp/artifacts/logs - run: DOCKER_HOST=localhost npm test - run: npm run build - - run: npm test + - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov - store_artifacts: path: /tmp/artifacts diff --git a/test/functional/util/coverage.js b/test/functional/util/coverage.js index 335decd1..173e44a9 100644 --- a/test/functional/util/coverage.js +++ b/test/functional/util/coverage.js @@ -7,20 +7,18 @@ var COVERAGE_PATH = artifacts.pathSync("/coverage"); var coverage = istanbulCov.createCoverageMap({}); -describe("coverage", function() { - // Capture the coverage after each test - afterEach(function() { - // Code coverage - var results = browser.execute(function() { - return window.__coverage__; - }); +// Capture the coverage after each test +afterEach(function() { + // Code coverage + var results = browser.execute(function() { + return window.__coverage__; + }); - coverage.merge(results.value); - }) - - // Dump the coverage to a file - after(function() { - var jsonStr = JSON.stringify(coverage, null, 2); - fs.writeFileSync(COVERAGE_PATH+"/coverage.json", jsonStr); - }) + coverage.merge(results.value); +}) + +// Dump the coverage to a file +after(function() { + var jsonStr = JSON.stringify(coverage, null, 2); + fs.writeFileSync(COVERAGE_PATH+"/coverage.json", jsonStr); }) From 3f492e6208fb99a75a3f77ffadff28ff740059fb Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 17:43:26 +0000 Subject: [PATCH 011/134] Change artifacts destination. --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index d6e8922e..339d534d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,3 +27,4 @@ jobs: - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov - store_artifacts: path: /tmp/artifacts + destination: /artifacts From 383a1191272b071c8300b046c440799d1a9e42a5 Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 17:55:21 +0000 Subject: [PATCH 012/134] Added linting to circleci tests. --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 339d534d..68a5bdb3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -22,8 +22,10 @@ jobs: key: v1-dependencies-{{ checksum "package.json" }} - run: mkdir -p /tmp/artifacts/logs - - run: DOCKER_HOST=localhost npm test - run: npm run build + - run: npm run lint + - run: npm run lint-styles + - run: DOCKER_HOST=localhost npm test - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov - store_artifacts: path: /tmp/artifacts From dc40ce7d9e85b996597a46cc34e44c7e50420adc Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 17 Jan 2018 17:58:01 +0000 Subject: [PATCH 013/134] Fixed lint errors. --- src/styles/index.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/src/styles/index.scss b/src/styles/index.scss index 7f3583f9..32735cf4 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -37,7 +37,6 @@ $toolbar-offset: 0; @import 'popup'; @import 'map'; - /** * Hacks for webdriverio isVisibleWithinViewport */ From cb4f5ea9635b2a6d2923f52b4c7eba25c9438969 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 18 Jan 2018 23:15:59 +0000 Subject: [PATCH 014/134] Updated to react/react-dom v16.2.0 --- package-lock.json | 23 ++++++----------------- package.json | 4 ++-- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9bcc1e27..0ef5f7e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2760,16 +2760,6 @@ "sha.js": "2.4.9" } }, - "create-react-class": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", - "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - } - }, "cross-env": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.3.tgz", @@ -10198,11 +10188,10 @@ } }, "react": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", - "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", + "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", "requires": { - "create-react-class": "15.6.2", "fbjs": "0.8.16", "loose-envify": "1.3.1", "object-assign": "4.1.1", @@ -10268,9 +10257,9 @@ "dev": true }, "react-dom": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.2.0.tgz", + "integrity": "sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==", "requires": { "fbjs": "0.8.16", "loose-envify": "1.3.1", diff --git a/package.json b/package.json index 0390d832..0c046938 100644 --- a/package.json +++ b/package.json @@ -39,14 +39,14 @@ "ol-mapbox-style": "^1.0.1", "openlayers": "^4.4.2", "prop-types": "^15.6.0", - "react": "^15.6.2", + "react": "^16.2.0", "react-addons-pure-render-mixin": "^15.6.2", "react-autocomplete": "^1.7.2", "react-codemirror2": "^3.0.7", "react-collapse": "^4.0.3", "react-color": "^2.13.8", "react-copy-to-clipboard": "^5.0.1", - "react-dom": "^15.6.2", + "react-dom": "^16.2.0", "react-file-reader-input": "^1.1.4", "react-height": "^3.0.0", "react-icon-base": "^2.1.1", From e0ff342702e0e36432edb512286764a480dba9e8 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 15:06:23 +0000 Subject: [PATCH 015/134] Added yaml inheritance to .circleci/config.yml --- .circleci/config.yml | 52 +++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 68a5bdb3..772c4c14 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,32 +1,34 @@ version: 2 +templates: + steps: &steps + - checkout + - run: + name: "Create artifacts directory" + command: mkdir /tmp/artifacts + - restore_cache: + key: v1-dependencies-{{ checksum "package.json" }} + + - run: npm install + + - save_cache: + paths: + - node_modules + key: v1-dependencies-{{ checksum "package.json" }} + + - run: mkdir -p /tmp/artifacts/logs + - run: npm run build + - run: npm run lint + - run: npm run lint-styles + - run: DOCKER_HOST=localhost npm test + - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov + - store_artifacts: + path: /tmp/artifacts + destination: /artifacts jobs: - build: + build-linux-node-v8: docker: # specify the version you desire here - image: node:8 - image: selenium/standalone-chrome:3.1.0 working_directory: ~/repo - steps: - - checkout - - run: - name: "Create artifacts directory" - command: mkdir /tmp/artifacts - - restore_cache: - key: v1-dependencies-{{ checksum "package.json" }} - - - run: npm install - - - save_cache: - paths: - - node_modules - key: v1-dependencies-{{ checksum "package.json" }} - - - run: mkdir -p /tmp/artifacts/logs - - run: npm run build - - run: npm run lint - - run: npm run lint-styles - - run: DOCKER_HOST=localhost npm test - - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov - - store_artifacts: - path: /tmp/artifacts - destination: /artifacts + steps: *steps From ac519024359bcb0f3c4eb04b203ad0238b030dfd Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 15:08:45 +0000 Subject: [PATCH 016/134] Added missing workflow to .circleci/config.yml --- .circleci/config.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 772c4c14..1a6bddcc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -32,3 +32,9 @@ jobs: - image: selenium/standalone-chrome:3.1.0 working_directory: ~/repo steps: *steps + +workflows: + version: 2 + build: + jobs: + - build-linux-node-v8 From fe0e7af033f81a6c7f32b428ceb908e88207e1bd Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 15:13:46 +0000 Subject: [PATCH 017/134] Added multiple nodejs versions. --- .circleci/config.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1a6bddcc..66b40f7c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,6 +25,13 @@ templates: path: /tmp/artifacts destination: /artifacts jobs: + build-linux-node-v6: + docker: + # specify the version you desire here + - image: node:6 + - image: selenium/standalone-chrome:3.1.0 + working_directory: ~/repo + steps: *steps build-linux-node-v8: docker: # specify the version you desire here @@ -32,9 +39,19 @@ jobs: - image: selenium/standalone-chrome:3.1.0 working_directory: ~/repo steps: *steps + build-linux-node-v9: + docker: + # specify the version you desire here + - image: node:9 + - image: selenium/standalone-chrome:3.1.0 + working_directory: ~/repo + steps: *steps workflows: version: 2 build: jobs: + - build-linux-node-v6 - build-linux-node-v8 + - build-linux-node-v9 + From c82f38c1032d9c45b798c7e7a2fb55de2b4507b5 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 17:14:56 +0000 Subject: [PATCH 018/134] Multiple working directories for test versions. --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 66b40f7c..b6af96d7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,21 +30,21 @@ jobs: # specify the version you desire here - image: node:6 - image: selenium/standalone-chrome:3.1.0 - working_directory: ~/repo + working_directory: ~/repo-linux-node-v6 steps: *steps build-linux-node-v8: docker: # specify the version you desire here - image: node:8 - image: selenium/standalone-chrome:3.1.0 - working_directory: ~/repo + working_directory: ~/repo-linux-node-v8 steps: *steps build-linux-node-v9: docker: # specify the version you desire here - image: node:9 - image: selenium/standalone-chrome:3.1.0 - working_directory: ~/repo + working_directory: ~/repo-linux-node-v9 steps: *steps workflows: From f8dcbb8fb7dbd0cbefae93d99f4c62ba0df317be Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 17:24:29 +0000 Subject: [PATCH 019/134] Reduce to single job. --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b6af96d7..9027fd62 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -51,7 +51,7 @@ workflows: version: 2 build: jobs: - - build-linux-node-v6 - build-linux-node-v8 - - build-linux-node-v9 + # - build-linux-node-v6 + # - build-linux-node-v9 From 3cab1dc49f127a8e77e5fec2bab15d2ababc62da Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 17:29:55 +0000 Subject: [PATCH 020/134] Remove special directory. --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9027fd62..1a767d77 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -37,7 +37,7 @@ jobs: # specify the version you desire here - image: node:8 - image: selenium/standalone-chrome:3.1.0 - working_directory: ~/repo-linux-node-v8 + working_directory: ~/repo steps: *steps build-linux-node-v9: docker: From 18e7ead78a235ffcf052f6a4222d367f852fb940 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 17:35:19 +0000 Subject: [PATCH 021/134] Revert to old config. --- .circleci/config.yml | 71 ++++++++++++++------------------------------ 1 file changed, 23 insertions(+), 48 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1a767d77..68a5bdb3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,57 +1,32 @@ version: 2 -templates: - steps: &steps - - checkout - - run: - name: "Create artifacts directory" - command: mkdir /tmp/artifacts - - restore_cache: - key: v1-dependencies-{{ checksum "package.json" }} - - - run: npm install - - - save_cache: - paths: - - node_modules - key: v1-dependencies-{{ checksum "package.json" }} - - - run: mkdir -p /tmp/artifacts/logs - - run: npm run build - - run: npm run lint - - run: npm run lint-styles - - run: DOCKER_HOST=localhost npm test - - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov - - store_artifacts: - path: /tmp/artifacts - destination: /artifacts jobs: - build-linux-node-v6: - docker: - # specify the version you desire here - - image: node:6 - - image: selenium/standalone-chrome:3.1.0 - working_directory: ~/repo-linux-node-v6 - steps: *steps - build-linux-node-v8: + build: docker: # specify the version you desire here - image: node:8 - image: selenium/standalone-chrome:3.1.0 working_directory: ~/repo - steps: *steps - build-linux-node-v9: - docker: - # specify the version you desire here - - image: node:9 - - image: selenium/standalone-chrome:3.1.0 - working_directory: ~/repo-linux-node-v9 - steps: *steps + steps: + - checkout + - run: + name: "Create artifacts directory" + command: mkdir /tmp/artifacts + - restore_cache: + key: v1-dependencies-{{ checksum "package.json" }} -workflows: - version: 2 - build: - jobs: - - build-linux-node-v8 - # - build-linux-node-v6 - # - build-linux-node-v9 + - run: npm install + - save_cache: + paths: + - node_modules + key: v1-dependencies-{{ checksum "package.json" }} + + - run: mkdir -p /tmp/artifacts/logs + - run: npm run build + - run: npm run lint + - run: npm run lint-styles + - run: DOCKER_HOST=localhost npm test + - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov + - store_artifacts: + path: /tmp/artifacts + destination: /artifacts From 8062e304b774d948790aa86cb76a3eee1b3829e9 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 17:51:08 +0000 Subject: [PATCH 022/134] Update selenium/standalone-chrome --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 68a5bdb3..dd03e082 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ jobs: docker: # specify the version you desire here - image: node:8 - - image: selenium/standalone-chrome:3.1.0 + - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo steps: - checkout From 62f08432838271d743c953c0d6f137fe5330c226 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 17:55:37 +0000 Subject: [PATCH 023/134] Moved back to workflows. --- .circleci/config.yml | 75 +++++++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index dd03e082..9027fd62 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,32 +1,57 @@ version: 2 +templates: + steps: &steps + - checkout + - run: + name: "Create artifacts directory" + command: mkdir /tmp/artifacts + - restore_cache: + key: v1-dependencies-{{ checksum "package.json" }} + + - run: npm install + + - save_cache: + paths: + - node_modules + key: v1-dependencies-{{ checksum "package.json" }} + + - run: mkdir -p /tmp/artifacts/logs + - run: npm run build + - run: npm run lint + - run: npm run lint-styles + - run: DOCKER_HOST=localhost npm test + - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov + - store_artifacts: + path: /tmp/artifacts + destination: /artifacts jobs: - build: + build-linux-node-v6: + docker: + # specify the version you desire here + - image: node:6 + - image: selenium/standalone-chrome:3.1.0 + working_directory: ~/repo-linux-node-v6 + steps: *steps + build-linux-node-v8: docker: # specify the version you desire here - image: node:8 - - image: selenium/standalone-chrome:3.8.1 - working_directory: ~/repo - steps: - - checkout - - run: - name: "Create artifacts directory" - command: mkdir /tmp/artifacts - - restore_cache: - key: v1-dependencies-{{ checksum "package.json" }} + - image: selenium/standalone-chrome:3.1.0 + working_directory: ~/repo-linux-node-v8 + steps: *steps + build-linux-node-v9: + docker: + # specify the version you desire here + - image: node:9 + - image: selenium/standalone-chrome:3.1.0 + working_directory: ~/repo-linux-node-v9 + steps: *steps - - run: npm install +workflows: + version: 2 + build: + jobs: + - build-linux-node-v8 + # - build-linux-node-v6 + # - build-linux-node-v9 - - save_cache: - paths: - - node_modules - key: v1-dependencies-{{ checksum "package.json" }} - - - run: mkdir -p /tmp/artifacts/logs - - run: npm run build - - run: npm run lint - - run: npm run lint-styles - - run: DOCKER_HOST=localhost npm test - - run: ./node_modules/.bin/istanbul report --include /tmp/artifacts/coverage/coverage.json --dir /tmp/artifacts/coverage html lcov - - store_artifacts: - path: /tmp/artifacts - destination: /artifacts From 094c4747d3b140cd8a352c91ded3cb65d4c93961 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 18:02:08 +0000 Subject: [PATCH 024/134] Update selenium/standalone-chrome to 3.8.1 --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9027fd62..d408831b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -29,21 +29,21 @@ jobs: docker: # specify the version you desire here - image: node:6 - - image: selenium/standalone-chrome:3.1.0 + - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v6 steps: *steps build-linux-node-v8: docker: # specify the version you desire here - image: node:8 - - image: selenium/standalone-chrome:3.1.0 + - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v8 steps: *steps build-linux-node-v9: docker: # specify the version you desire here - image: node:9 - - image: selenium/standalone-chrome:3.1.0 + - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v9 steps: *steps From e64ca3eb93824247359ccdca665576051ca98757 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 19 Jan 2018 18:15:46 +0000 Subject: [PATCH 025/134] Added back in other jobs. --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d408831b..9289fc54 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -52,6 +52,6 @@ workflows: build: jobs: - build-linux-node-v8 - # - build-linux-node-v6 - # - build-linux-node-v9 + - build-linux-node-v6 + - build-linux-node-v9 From 1de7ba7e861c42a67ab588c5121683aa05d5b89f Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 6 Mar 2018 21:11:58 +0000 Subject: [PATCH 026/134] Use dev settings for test. --- config/wdio.conf.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/wdio.conf.js b/config/wdio.conf.js index c4a0c141..18bc7ad7 100644 --- a/config/wdio.conf.js +++ b/config/wdio.conf.js @@ -1,6 +1,6 @@ var webpack = require("webpack"); var WebpackDevServer = require("webpack-dev-server"); -var webpackConfig = require("./webpack.production.config"); +var webpackConfig = require("./webpack.config"); var testConfig = require("../test/config/specs"); var artifacts = require("../test/artifacts"); var isDocker = require("is-docker"); From dbe2c2637e5a0f65cc97a2bd39b97023ebfd060b Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 9 Apr 2018 10:20:37 +0100 Subject: [PATCH 027/134] Better onPrepare for wdio --- config/wdio.conf.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/config/wdio.conf.js b/config/wdio.conf.js index 18bc7ad7..e8839dd0 100644 --- a/config/wdio.conf.js +++ b/config/wdio.conf.js @@ -38,9 +38,22 @@ exports.config = { timeout: 4*60*1000 }, onPrepare: function (config, capabilities) { - var compiler = webpack(webpackConfig); - server = new WebpackDevServer(compiler, {}); - server.listen(testConfig.port); + return new Promise(function(resolve, reject) { + var compiler = webpack(webpackConfig); + server = new WebpackDevServer(compiler, { + stats: { + colors: true + } + }); + server.listen(testConfig.port, "127.0.0.1", function(err) { + if(err) { + reject(); + } + else { + resolve(); + } + }); + }) }, onComplete: function(exitCode) { server.close() From 050e22918a4853641f950861d0dffc572005c2c4 Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 9 Apr 2018 17:49:56 +0100 Subject: [PATCH 028/134] Fix for running within docker. --- config/wdio.conf.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config/wdio.conf.js b/config/wdio.conf.js index e8839dd0..fad25495 100644 --- a/config/wdio.conf.js +++ b/config/wdio.conf.js @@ -25,7 +25,8 @@ exports.config = { coloredLogs: true, bail: 0, screenshotPath: SCREENSHOT_PATH, - host: (isDocker() ? process.env.DOCKER_HOST : "127.0.0.1"), + // Note: This is here because @orangemug currently runs Maputnik inside a docker container. + host: (isDocker() ? "host.docker.internal" : "0.0.0.0"), baseUrl: 'http://localhost', waitforTimeout: 10000, connectionRetryTimeout: 90000, @@ -45,9 +46,9 @@ exports.config = { colors: true } }); - server.listen(testConfig.port, "127.0.0.1", function(err) { + server.listen(testConfig.port, (isDocker() ? "0.0.0.0" : "localhost"), function(err) { if(err) { - reject(); + reject(err); } else { resolve(); From 84f39707300ed0db80edd3f2618705e9ab6f2697 Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 9 Apr 2018 17:51:12 +0100 Subject: [PATCH 029/134] Updated selenium-standalone & webdriverio --- package-lock.json | 41 +++++++++++++++++++++++++++++++++-------- package.json | 4 ++-- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a552bb9..716b19ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8580,6 +8580,12 @@ "integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g==", "dev": true }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -11612,14 +11618,14 @@ "dev": true }, "selenium-standalone": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.12.0.tgz", - "integrity": "sha1-eJcw2wmhBfHM4SxkJNeV0RxUO9Q=", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.13.0.tgz", + "integrity": "sha512-JV1+AySJ9RccsAIZlnDb8QUx/SDeVGK8j/zCJcNlbz/LCRiketU3Su0YE5Uc1raaBGpT/venof0+9Ry0oGuvYw==", "dev": true, "requires": { "async": "2.6.0", "commander": "2.14.1", - "cross-spawn": "5.1.0", + "cross-spawn": "6.0.5", "debug": "3.1.0", "lodash": "4.17.5", "minimist": "1.2.0", @@ -11659,6 +11665,19 @@ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", "dev": true }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.4", + "path-key": "2.0.1", + "semver": "5.5.0", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", @@ -11769,6 +11788,12 @@ "uuid": "3.2.1" } }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, "sntp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", @@ -14440,7 +14465,7 @@ "dev": true, "requires": { "fs-extra": "0.30.0", - "selenium-standalone": "6.12.0" + "selenium-standalone": "6.13.0" }, "dependencies": { "fs-extra": { @@ -14512,9 +14537,9 @@ } }, "webdriverio": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.11.0.tgz", - "integrity": "sha1-KJuq4iVzAdlc/s797CA4pqprlMU=", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.12.0.tgz", + "integrity": "sha1-40De8nIYPIFopN0LOCMi+de+4Q0=", "dev": true, "requires": { "archiver": "2.1.1", diff --git a/package.json b/package.json index c74a97ca..decce6fa 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "nsp": "^3.1.0", "react-hot-loader": "^3.1.1", "sass-loader": "^6.0.6", - "selenium-standalone": "^6.11.0", + "selenium-standalone": "^6.13.0", "style-loader": "^0.19.0", "stylelint": "^7.13.0", "stylelint-config-standard": "^15.0.1", @@ -135,7 +135,7 @@ "wdio-phantomjs-service": "^0.2.2", "wdio-selenium-standalone-service": "0.0.9", "wdio-spec-reporter": "^0.1.2", - "webdriverio": "^4.9.8", + "webdriverio": "^4.12.0", "webpack": "^3.8.1", "webpack-bundle-analyzer": "^2.9.0", "webpack-cleanup-plugin": "^0.5.1", From a346d757fdf716acaaf6cc6ad085c9b0f84456eb Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 9 Apr 2018 18:18:15 +0100 Subject: [PATCH 030/134] Don't assume docker for mac. --- config/wdio.conf.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/wdio.conf.js b/config/wdio.conf.js index fad25495..b520bcfc 100644 --- a/config/wdio.conf.js +++ b/config/wdio.conf.js @@ -26,7 +26,7 @@ exports.config = { bail: 0, screenshotPath: SCREENSHOT_PATH, // Note: This is here because @orangemug currently runs Maputnik inside a docker container. - host: (isDocker() ? "host.docker.internal" : "0.0.0.0"), + host: process.env.DOCKER_HOST || "0.0.0.0", baseUrl: 'http://localhost', waitforTimeout: 10000, connectionRetryTimeout: 90000, From 0bd62985b9465a61728b70e644b963b68286e527 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 12:45:44 +0100 Subject: [PATCH 031/134] Revert change to undo/redo --- src/components/App.jsx | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/components/App.jsx b/src/components/App.jsx index f757f1fe..c7bf3fd2 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -85,28 +85,17 @@ export default class App extends React.Component { this.layerWatcher = new LayerWatcher({ onVectorLayersChange: v => this.setState({ vectorLayers: v }) }) - - this.onKeyDown = this.onKeyDown.bind(this); - } - - onKeyDown(e) { - console.log("??? keyCode ctrlKey="+e.ctrlKey+", keyCode="+e.keyCode) - // Control + Z - if(e.ctrlKey && e.keyCode === 90) { - this.onUndo(e); - } - else if(e.ctrlKey && e.keyCode === 89) { - this.onRedo(e); - } } componentDidMount() { this.fetchSources(); - document.addEventListener("keydown", this.onKeyDown); + Mousetrap.bind(['ctrl+z'], this.onUndo.bind(this)); + Mousetrap.bind(['ctrl+y'], this.onRedo.bind(this)); } componentWillUnmount() { - document.removeEventListener("keydown", this.onKeyDown); + Mousetrap.unbind(['ctrl+z'], this.onUndo.bind(this)); + Mousetrap.unbind(['ctrl+y'], this.onRedo.bind(this)); } saveStyle(snapshotStyle) { From 6138257a893ba657dff66d7a7ce449f1d5833132 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 12:47:00 +0100 Subject: [PATCH 032/134] Remove logging. --- src/components/inputs/StringInput.jsx | 3 --- src/components/modals/AddModal.jsx | 1 - 2 files changed, 4 deletions(-) diff --git a/src/components/inputs/StringInput.jsx b/src/components/inputs/StringInput.jsx index 2f7bf1fe..6987b3cd 100644 --- a/src/components/inputs/StringInput.jsx +++ b/src/components/inputs/StringInput.jsx @@ -19,7 +19,6 @@ class StringInput extends React.Component { } componentWillReceiveProps(nextProps) { - console.log("@@ STRING componentWillReceiveProps", JSON.stringify(nextProps)) this.setState({ value: nextProps.value || '' }) } @@ -48,13 +47,11 @@ class StringInput extends React.Component { value: this.state.value, placeholder: this.props.default, onChange: e => { - console.log("@@ STRING CHANGE", JSON.stringify(e.target.value)); this.setState({ value: e.target.value }) }, onBlur: () => { - console.log("@@ STRING BLUR", JSON.stringify(this.state.value), "props:", JSON.stringify(this.props.value)); if(this.state.value!==this.props.value) this.props.onChange(this.state.value) } }); diff --git a/src/components/modals/AddModal.jsx b/src/components/modals/AddModal.jsx index 84cb6625..feb83434 100644 --- a/src/components/modals/AddModal.jsx +++ b/src/components/modals/AddModal.jsx @@ -125,7 +125,6 @@ class AddModal extends React.Component { value={this.state.id} wdKey="add-layer.layer-id" onChange={v => { - console.log("@@ upper_id_change", JSON.stringify(v)) this.setState({ id: v }) }} /> From 8c7a1f7075367be81f7f3366266ceed1aea642a8 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 13:05:58 +0100 Subject: [PATCH 033/134] Updated build config for circleci to only test webdriver in one job --- .circleci/config.yml | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9289fc54..1a4a0738 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,6 +1,30 @@ version: 2 templates: - steps: &steps + # Test the build **only** no webdriver + build-steps: &build-steps + - checkout + - run: + name: "Create artifacts directory" + command: mkdir /tmp/artifacts + - restore_cache: + key: v1-dependencies-{{ checksum "package.json" }} + + - run: npm install + + - save_cache: + paths: + - node_modules + key: v1-dependencies-{{ checksum "package.json" }} + + - run: mkdir -p /tmp/artifacts/logs + - run: npm run build + - run: npm run lint + - run: npm run lint-styles + - store_artifacts: + path: /tmp/artifacts + destination: /artifacts + # Test in webdriver + wdio-steps: &steps - checkout - run: name: "Create artifacts directory" @@ -31,27 +55,35 @@ jobs: - image: node:6 - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v6 - steps: *steps + steps: *build-steps build-linux-node-v8: docker: # specify the version you desire here - image: node:8 - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v8 - steps: *steps + steps: *wdio-steps build-linux-node-v9: docker: # specify the version you desire here - image: node:9 - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v9 - steps: *steps + steps: *build-steps + build-linux-node-v10: + docker: + # specify the version you desire here + - image: node:10 + - image: selenium/standalone-chrome:3.8.1 + working_directory: ~/repo-linux-node-v10 + steps: *build-steps workflows: version: 2 build: jobs: - - build-linux-node-v8 - build-linux-node-v6 + - build-linux-node-v8 - build-linux-node-v9 + - build-linux-node-v10 From 3ae37f1c46a8b7a0020cda4e2f48d6eaf2fcdae0 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 13:08:55 +0100 Subject: [PATCH 034/134] Updated appveyor to no longer test, only build/lint --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 1a33cc12..b50173eb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,9 +1,9 @@ environment: matrix: - nodejs_version: "6" - - nodejs_version: "7" - nodejs_version: "8" - nodejs_version: "9" + - nodejs_version: "10" platform: - x86 - x64 @@ -16,4 +16,4 @@ build_script: - npm run build test_script: - npm run lint - - npm test + - npm run lint-styles From bd44e6d0716ee4d58a4e5ceb73370d6c602b50b2 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 13:11:42 +0100 Subject: [PATCH 035/134] Fixed typo. --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1a4a0738..a552d405 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,7 +24,7 @@ templates: path: /tmp/artifacts destination: /artifacts # Test in webdriver - wdio-steps: &steps + wdio-steps: &wdio-steps - checkout - run: name: "Create artifacts directory" From fb0e531f4a47da846dd7eefb5d19c509dcad84f6 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 13:17:59 +0100 Subject: [PATCH 036/134] Removed node:10 as it doesn't exist yet. --- .circleci/config.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a552d405..f8179605 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -70,13 +70,6 @@ jobs: - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v9 steps: *build-steps - build-linux-node-v10: - docker: - # specify the version you desire here - - image: node:10 - - image: selenium/standalone-chrome:3.8.1 - working_directory: ~/repo-linux-node-v10 - steps: *build-steps workflows: version: 2 @@ -85,5 +78,4 @@ workflows: - build-linux-node-v6 - build-linux-node-v8 - build-linux-node-v9 - - build-linux-node-v10 From 7ecbc14c3932c0c59db12697db33ecec5cfbb71c Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 13:29:48 +0100 Subject: [PATCH 037/134] Added OSX build to tests. --- .circleci/config.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f8179605..d01979f5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -53,7 +53,6 @@ jobs: docker: # specify the version you desire here - image: node:6 - - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v6 steps: *build-steps build-linux-node-v8: @@ -67,7 +66,14 @@ jobs: docker: # specify the version you desire here - image: node:9 - - image: selenium/standalone-chrome:3.8.1 + working_directory: ~/repo-linux-node-v9 + steps: *build-steps + build-osx-node-v9: + macos: + xcode: "9.0" + dependencies: + override: + - brew install node@9 working_directory: ~/repo-linux-node-v9 steps: *build-steps @@ -78,4 +84,5 @@ workflows: - build-linux-node-v6 - build-linux-node-v8 - build-linux-node-v9 + - build-osx-node-v9 From 6bf695cd4bb28bc9c11dad2c80ab09f1a654f739 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 13:34:20 +0100 Subject: [PATCH 038/134] Removed linux from travis. CircleCI now takes care of that --- .travis.yml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index 30b303d4..9d83eff8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,30 +1,12 @@ language: node_js -addons: - firefox: latest matrix: include: - - os: linux - node_js: "6" - - os: linux - env: CXX=g++-4.8 - node_js: "7" - - os: linux - node_js: "8" - - os: linux - env: CXX=g++-4.8 - node_js: "9" - os: osx node_js: "6" - - os: osx - node_js: "7" - os: osx node_js: "8" - os: osx node_js: "9" -before_install: - - export CHROME_BIN=chromium-browser - - export DISPLAY=:99.0 - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sh -e /etc/init.d/xvfb start; fi install: - npm install script: @@ -32,7 +14,6 @@ script: - node --stack_size=100000 $(which npm) run build - npm run lint - npm run lint-styles - - npm run test addons: apt: sources: From 15962481ee2c7d1abc0d75a7695230c69965ce83 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 13:35:02 +0100 Subject: [PATCH 039/134] Disable OSX until we get a open source plan for maputnik/editor --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d01979f5..776b2f98 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -84,5 +84,4 @@ workflows: - build-linux-node-v6 - build-linux-node-v8 - build-linux-node-v9 - - build-osx-node-v9 From 6fa06e54836ab3fb7c0f628102fd67e5e60e228b Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 14:02:36 +0100 Subject: [PATCH 040/134] Removed un-useful comments --- .circleci/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 776b2f98..1bf8bb3e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -51,20 +51,17 @@ templates: jobs: build-linux-node-v6: docker: - # specify the version you desire here - image: node:6 working_directory: ~/repo-linux-node-v6 steps: *build-steps build-linux-node-v8: docker: - # specify the version you desire here - image: node:8 - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v8 steps: *wdio-steps build-linux-node-v9: docker: - # specify the version you desire here - image: node:9 working_directory: ~/repo-linux-node-v9 steps: *build-steps From aee4a041fe5ac84d821a1f9e61469e7723401ef7 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 14:03:09 +0100 Subject: [PATCH 041/134] Removed node:10 from appveyor --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index b50173eb..d469d985 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,7 +3,6 @@ environment: - nodejs_version: "6" - nodejs_version: "8" - nodejs_version: "9" - - nodejs_version: "10" platform: - x86 - x64 From 7a60df370e9df077c6166238787905122b3c4435 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 14:20:13 +0100 Subject: [PATCH 042/134] Changed url to be local (although not used) --- test/example-style.json | 4 ++-- test/geojson-server.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/example-style.json b/test/example-style.json index adf11e41..f2ec9da7 100644 --- a/test/example-style.json +++ b/test/example-style.json @@ -6,7 +6,7 @@ "maputnik:renderer": "mbgljs" }, "sources": {}, - "glyphs": "https://demo.tileserver.org/fonts/{fontstack}/{range}.pbf", - "sprites": "https://demo.tileserver.org/fonts/{fontstack}/{range}.pbf", + "glyphs": "https://example.local/fonts/{fontstack}/{range}.pbf", + "sprites": "https://example.local/fonts/{fontstack}/{range}.pbf", "layers": [] } diff --git a/test/geojson-server.js b/test/geojson-server.js index cac65e11..56f1ba7b 100644 --- a/test/geojson-server.js +++ b/test/geojson-server.js @@ -23,8 +23,8 @@ function buildStyle(opts) { "maputnik:renderer": "mbgljs" }, "sources": opts.sources, - "glyphs": "https://demo.tileserver.org/fonts/{fontstack}/{range}.pbf", - "sprites": "https://demo.tileserver.org/fonts/{fontstack}/{range}.pbf", + "glyphs": "https://example.local/fonts/{fontstack}/{range}.pbf", + "sprites": "https://example.local/fonts/{fontstack}/{range}.pbf", "layers": [] } } From 9e82599464fcc37ec5454f1e5ebbd8f11e93d23c Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 14:23:11 +0100 Subject: [PATCH 043/134] Removed old comments. --- test/functional/helper.js | 2 - test/functional/history/index.js | 95 -------------------------------- test/functional/modals/index.js | 3 +- test/geojson-server.js | 3 - 4 files changed, 1 insertion(+), 102 deletions(-) diff --git a/test/functional/helper.js b/test/functional/helper.js index 310265a9..98324502 100644 --- a/test/functional/helper.js +++ b/test/functional/helper.js @@ -3,10 +3,8 @@ var uuid = require('uuid/v1'); var geoServer = require("../geojson-server"); -// This should be sync... var geoserver = geoServer.listen(9002); - module.exports = { getStyleUrl: function(styles) { var port = geoserver.address().port; diff --git a/test/functional/history/index.js b/test/functional/history/index.js index d699c075..2cd5b0e6 100644 --- a/test/functional/history/index.js +++ b/test/functional/history/index.js @@ -97,99 +97,4 @@ describe.skip("history", function() { }); - - // /** - // * See - // */ - // it("undo/redo", function() { - // var styleObj; - - // browser.debug(); - - // browser.url(helper.config.baseUrl+"?debug&style="+helper.getStyleUrl([ - // "geojson:example" - // ])); - // browser.waitForExist(".maputnik-toolbar-link"); - - // helper.modalCommands.addLayer.open(browser); - - // styleObj = helper.helper.getStyleStore(browser); - // assert.deepEqual(styleObj.layers, []); - - // helper.modalCommands.addLayer.fill(browser, { - // id: "step 1", - // type: "background" - // }) - - // styleObj = helper.helper.getStyleStore(browser); - // assert.deepEqual(styleObj.layers, [ - // { - // "id": "step 1", - // "type": 'background' - // } - // ]); - - // helper.modalCommands.addLayer.open(browser); - // helper.modalCommands.addLayer.fill(browser, { - // id: "step 2", - // type: "background" - // }) - - // styleObj = helper.helper.getStyleStore(browser); - // assert.deepEqual(styleObj.layers, [ - // { - // "id": "step 1", - // "type": 'background' - // }, - // { - // "id": "step 2", - // "type": 'background' - // } - // ]); - - // browser - // .keys(['Control', 'z']) - // .keys(['Control']); - // styleObj = helper.helper.getStyleStore(browser); - // assert.deepEqual(styleObj.layers, [ - // { - // "id": "step 1", - // "type": 'background' - // } - // ]); - - // browser - // .keys(['Control', 'z']) - // .keys(['Control']); - // styleObj = helper.helper.getStyleStore(browser); - // assert.deepEqual(styleObj.layers, [ - // ]); - - // browser - // .keys(['Control', 'y']) - // .keys(['Control']); - // styleObj = helper.helper.getStyleStore(browser); - // assert.deepEqual(styleObj.layers, [ - // { - // "id": "step 1", - // "type": 'background' - // } - // ]); - - // browser - // .keys(['Control', 'y']) - // .keys(['Control']); - // styleObj = helper.helper.getStyleStore(browser); - // assert.deepEqual(styleObj.layers, [ - // { - // "id": "step 1", - // "type": 'background' - // }, - // { - // "id": "step 2", - // "type": 'background' - // } - // ]); - - // }) }) diff --git a/test/functional/modals/index.js b/test/functional/modals/index.js index 24f9ffd5..9f262270 100644 --- a/test/functional/modals/index.js +++ b/test/functional/modals/index.js @@ -5,8 +5,6 @@ var config = require("../../config/specs"); var helper = require("../helper"); - -// TODO: Is this needed? function closeModal(wdKey) { browser.waitUntil(function() { return browser.isVisibleWithinViewport(wd.$(wdKey)); @@ -85,6 +83,7 @@ describe("modals", function() { // TODO: Work out how to download a file and check the contents it("download") + // TODO: Work out how to mock the end git points it("save to gist") }) diff --git a/test/geojson-server.js b/test/geojson-server.js index 56f1ba7b..457eb92f 100644 --- a/test/geojson-server.js +++ b/test/geojson-server.js @@ -55,9 +55,6 @@ app.get("/styles/empty/:sources", function(req, res) { var reqSources = req.params.sources.split(","); var sources = {}; - // reqSources.forEach(function(key) { - // sources[key] = buildGeoJSONSource(sourceData[key]); - // }); reqSources.forEach(function(key) { var parts = key.split(":"); var type = parts[0]; From f0744f024db8dde24b58b588f45e3e846ffddc86 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 15:07:36 +0100 Subject: [PATCH 044/134] Moved commit. --- test/functional/layers/index.js | 5 ----- test/functional/screenshots/index.js | 2 ++ 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/test/functional/layers/index.js b/test/functional/layers/index.js index 14c5d797..012b6729 100644 --- a/test/functional/layers/index.js +++ b/test/functional/layers/index.js @@ -443,11 +443,6 @@ describe("layers", function() { }); }); - // These get used in the marketing material. They are also useful to do a quick manual check of the styling across browsers - // NOTE: These duplicate some of the tests, however this is indended becuase it's likely these will change for aesthetic reasons over time - // - - describe.skip("groups", function() { it("simple", function() { diff --git a/test/functional/screenshots/index.js b/test/functional/screenshots/index.js index b64d0c9c..9c5634c8 100644 --- a/test/functional/screenshots/index.js +++ b/test/functional/screenshots/index.js @@ -4,6 +4,8 @@ var helper = require("../helper"); var wd = require("../../wd-helper"); +// These will get used in the marketing material. They are also useful to do a quick manual check of the styling across browsers +// NOTE: These duplicate some of the tests, however this is indended becuase it's likely these will change for aesthetic reasons over time describe('screenshots', function() { beforeEach(function() { From 687c08527d0cddd862c786742616b438ee8b3345 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 15:13:55 +0100 Subject: [PATCH 045/134] Added test docs. --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 597d144d..fe3793c6 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,25 @@ npm run lint npm run lint-styles ``` + +## Tests +For testing we use [webdriverio](http://webdriver.io) and [selenium-standalone](https://github.com/vvo/selenium-standalone) + +[selenium-standalone](https://github.com/vvo/selenium-standalone) starts a server that will launch browsers on your local machine. We use chrome so you **must** have chrome installed on your machine. Now open and terminal and run + +``` +./node_modules/.bin/selenium-standalone +``` + +Then open another terminal and run + +``` +npm test +``` + +After some time you should see a browser launch which will be automated by the test runner. + + ## Related Projects - [maputnik-dev-server](https://github.com/nycplanning/labs-maputnik-dev-server) - An express.js server that allows for quickly loading the style from any mapboxGL map into mapuntnik. From 8ba2123a26e7654155504e55e4d47e09f22c73ca Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 15:15:29 +0100 Subject: [PATCH 046/134] Added missing propType. --- src/components/Toolbar.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx index bad7de7f..efe47f68 100644 --- a/src/components/Toolbar.jsx +++ b/src/components/Toolbar.jsx @@ -58,7 +58,8 @@ class ToolbarLink extends React.Component { class ToolbarAction extends React.Component { static propTypes = { children: PropTypes.node, - onClick: PropTypes.func + onClick: PropTypes.func, + wdKey: PropTypes.string } render() { From 1805aee7ba559327b6aa068d7662120f62d65c62 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 10 Apr 2018 16:16:51 +0100 Subject: [PATCH 047/134] Removed lint-styles in appveyor It doesn't work in windows and should be addressed in another PR --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index d469d985..0b100cc9 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,4 +15,3 @@ build_script: - npm run build test_script: - npm run lint - - npm run lint-styles From e8b0bd4d0ad5f043d526dd91febd1bba77642095 Mon Sep 17 00:00:00 2001 From: oterral Date: Fri, 13 Apr 2018 14:24:39 +0200 Subject: [PATCH 048/134] Update mapbox-gl-inspect dependency --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f04a1a6..66e939af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7597,9 +7597,9 @@ } }, "mapbox-gl-inspect": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mapbox-gl-inspect/-/mapbox-gl-inspect-1.3.0.tgz", - "integrity": "sha512-84qABwzuCenZz3oNF8vzqymE5dBoDhEkG5FUdPE2XFXaYabLo4lODRLReMYzeoNPn/4IJFUb9Qy3MN7lGG8CfA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mapbox-gl-inspect/-/mapbox-gl-inspect-1.3.1.tgz", + "integrity": "sha512-qkcT8lcYQy2x8wn+BUb6a6YXCEIHeGKHlt01/FSf58yYEmeufuihtbCjN9of2JDQm2XeRGdDEksAH7if7tPyyg==", "requires": { "lodash.isequal": "4.5.0", "randomcolor": "0.4.4" diff --git a/package.json b/package.json index 00775c84..df6ccc44 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "lodash.isequal": "^4.5.0", "lodash.throttle": "^4.1.1", "mapbox-gl": "^0.44.1", - "mapbox-gl-inspect": "^1.3.0", + "mapbox-gl-inspect": "^1.3.1", "maputnik-design": "github:maputnik/design", "mousetrap": "^1.6.1", "ol-mapbox-style": "^2.10.1", From 044349e65f146a6b6ecc7c44d111306b22406af6 Mon Sep 17 00:00:00 2001 From: oterral Date: Fri, 13 Apr 2018 14:25:08 +0200 Subject: [PATCH 049/134] Block popup on click in inspect mode --- src/components/map/MapboxGlMap.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/map/MapboxGlMap.jsx b/src/components/map/MapboxGlMap.jsx index 5dc4e0d0..c65410e3 100644 --- a/src/components/map/MapboxGlMap.jsx +++ b/src/components/map/MapboxGlMap.jsx @@ -121,6 +121,7 @@ export default class MapboxGlMap extends React.Component { showMapPopupOnHover: false, showInspectMapPopupOnHover: true, showInspectButton: false, + blockHoverPopupOnClick: true, assignLayerColor: (layerId, alpha) => { return Color(colors.brightColor(layerId, alpha)).desaturate(0.5).string() }, From b62533fa3e053f653b611dabe6eafc8718e65d6d Mon Sep 17 00:00:00 2001 From: oterral Date: Fri, 13 Apr 2018 15:55:16 +0200 Subject: [PATCH 050/134] Use a fixed position for autocomplete menu --- src/components/inputs/AutocompleteInput.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/inputs/AutocompleteInput.jsx b/src/components/inputs/AutocompleteInput.jsx index a81ab513..a633e60d 100644 --- a/src/components/inputs/AutocompleteInput.jsx +++ b/src/components/inputs/AutocompleteInput.jsx @@ -54,7 +54,7 @@ class AutocompleteInput extends React.Component { > Date: Fri, 13 Apr 2018 17:00:51 +0100 Subject: [PATCH 051/134] Fix to allow layers sections to expand smoothly. Fixes #244 --- src/components/layers/LayerEditorGroup.jsx | 4 +++- src/styles/_react-collapse.scss | 5 +++++ src/styles/index.scss | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 src/styles/_react-collapse.scss diff --git a/src/components/layers/LayerEditorGroup.jsx b/src/components/layers/LayerEditorGroup.jsx index 7c82fc1c..0a803e05 100644 --- a/src/components/layers/LayerEditorGroup.jsx +++ b/src/components/layers/LayerEditorGroup.jsx @@ -21,7 +21,9 @@ export default class LayerEditorGroup extends React.Component {
- {this.props.children} +
+ {this.props.children} +
} diff --git a/src/styles/_react-collapse.scss b/src/styles/_react-collapse.scss new file mode 100644 index 00000000..a58dddeb --- /dev/null +++ b/src/styles/_react-collapse.scss @@ -0,0 +1,5 @@ +// See +.react-collapse-container { + position: relative; + overflow: hidden; +} diff --git a/src/styles/index.scss b/src/styles/index.scss index 1472bf67..64f4be9b 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -36,3 +36,4 @@ $toolbar-offset: 0; @import 'zoomproperty'; @import 'popup'; @import 'map'; +@import 'react-collapse'; From c4b92fa0a90acb1fe21b2604ecd6ec59d5602882 Mon Sep 17 00:00:00 2001 From: orangemug Date: Sun, 15 Apr 2018 09:17:07 +0100 Subject: [PATCH 052/134] Updated test instructions in README --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fe3793c6..d8630aa8 100644 --- a/README.md +++ b/README.md @@ -72,10 +72,18 @@ npm run lint-styles ## Tests For testing we use [webdriverio](http://webdriver.io) and [selenium-standalone](https://github.com/vvo/selenium-standalone) -[selenium-standalone](https://github.com/vvo/selenium-standalone) starts a server that will launch browsers on your local machine. We use chrome so you **must** have chrome installed on your machine. Now open and terminal and run +[selenium-standalone](https://github.com/vvo/selenium-standalone) starts a server that will launch browsers on your local machine. We use chrome so you **must** have chrome installed on your machine. + +Now open and terminal and run the following. This will install the drivers on your local machine ``` -./node_modules/.bin/selenium-standalone +./node_modules/.bin/selenium-standalone install +``` + +Now start the standalone server + +``` +./node_modules/.bin/selenium-standalone start ``` Then open another terminal and run From 3d4579288cedf9eacc2fc1439746a2fb27897e69 Mon Sep 17 00:00:00 2001 From: pjsier Date: Sun, 15 Apr 2018 17:08:54 -0500 Subject: [PATCH 053/134] Handle data functions without zoom --- src/components/fields/_DataProperty.jsx | 16 +++++++++++----- src/styles/_zoomproperty.scss | 3 +++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/fields/_DataProperty.jsx b/src/components/fields/_DataProperty.jsx index a4aefa22..9fa1e440 100644 --- a/src/components/fields/_DataProperty.jsx +++ b/src/components/fields/_DataProperty.jsx @@ -51,7 +51,8 @@ export default class DataProperty extends React.Component { changeStop(changeIdx, stopData, value) { const stops = this.props.value.stops.slice(0) - stops[changeIdx] = [stopData, value] + const changedStop = stopData.zoom === undefined ? stopData.value : stopData + stops[changeIdx] = [changedStop, value] const changedValue = { ...this.props.value, stops: stops, @@ -75,8 +76,8 @@ export default class DataProperty extends React.Component { } const dataFields = this.props.value.stops.map((stop, idx) => { - const zoomLevel = stop[0].zoom - const dataLevel = stop[0].value + const zoomLevel = typeof stop[0] === 'object' ? stop[0].zoom : undefined; + const dataLevel = typeof stop[0] === 'object' ? stop[0].value : stop[0]; const value = stop[1] const deleteStopBtn = @@ -94,8 +95,9 @@ export default class DataProperty extends React.Component { dataInput = } - return -
+ let zoomInput = null; + if(zoomLevel !== undefined) { + zoomInput =
this.changeStop(idx, {zoom: newZoom, value: dataLevel}, value)} @@ -103,6 +105,10 @@ export default class DataProperty extends React.Component { max={22} />
+ } + + return + {zoomInput}
{dataInput}
diff --git a/src/styles/_zoomproperty.scss b/src/styles/_zoomproperty.scss index d6510c9b..04764f98 100644 --- a/src/styles/_zoomproperty.scss +++ b/src/styles/_zoomproperty.scss @@ -129,6 +129,9 @@ } .maputnik-data-spec-property-stop-data { + width: 100%; + } + .maputnik-data-spec-property-stop-edit + .maputnik-data-spec-property-stop-data { width: 78%; } } From e936dd16bfa0a2aa2edefc46060e353ff2cf1597 Mon Sep 17 00:00:00 2001 From: pjsier Date: Mon, 16 Apr 2018 07:44:00 -0500 Subject: [PATCH 054/134] Fix style linting error --- src/styles/_zoomproperty.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/_zoomproperty.scss b/src/styles/_zoomproperty.scss index 04764f98..ca8fd895 100644 --- a/src/styles/_zoomproperty.scss +++ b/src/styles/_zoomproperty.scss @@ -131,6 +131,7 @@ .maputnik-data-spec-property-stop-data { width: 100%; } + .maputnik-data-spec-property-stop-edit + .maputnik-data-spec-property-stop-data { width: 78%; } From 328e0b8ff75255f4670bc5a1e2c2b1da413a1aec Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 17 Apr 2018 10:45:24 +0100 Subject: [PATCH 055/134] Updated deps. --- package-lock.json | 1191 ++++++++++++++++++++++++++++++--------------- package.json | 56 +-- 2 files changed, 821 insertions(+), 426 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d6b04e5..0efeb72a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,175 +4,26 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz", - "integrity": "sha512-eVXQSbu/RimU6OKcK2/gDJVTFcxXJI4sHbIqw2mhwMZeQ2as/8AhS9DGkEDoHMBBNJZ5B0US63lF56x+KDcxiA==", + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", "dev": true, "requires": { - "@babel/highlight": "7.0.0-beta.40" - } - }, - "@babel/generator": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.40.tgz", - "integrity": "sha512-c91BQcXyTq/5aFV4afgOionxZS1dxWt8OghEx5Q52SKssdGRFSiMKnk9tGkev1pYULPJBqjSDZU2Pcuc58ffZw==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.40", - "jsesc": "2.5.1", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "@babel/types": "7.0.0-beta.44" }, "dependencies": { - "jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.40.tgz", - "integrity": "sha512-cK9BVLtOfisSISTTHXKGvBc2OBh65tjEk4PgXhsSnnH0i8RP2v+5RCxoSlh2y/i+l2fxQqKqv++Qo5RMiwmRCA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.40", - "@babel/template": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.40.tgz", - "integrity": "sha512-MwquaPznI4cUoZEgHC/XGkddOXtqKqD4DvZDOyJK2LR9Qi6TbMbAhc6IaFoRX7CRTFCmtGeu8gdXW2dBotBBTA==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.40" - } - }, - "@babel/highlight": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.40.tgz", - "integrity": "sha512-mOhhTrzieV6VO7odgzFGFapiwRK0ei8RZRhfzHhb6cpX3QM8XXuCLXWjN8qBB7JReDdUR80V3LFfFrGUYevhNg==", - "dev": true, - "requires": { - "chalk": "2.3.2", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "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==", + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", "dev": true, "requires": { - "color-convert": "1.9.1" + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "2.0.0" } }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" - } - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "@babel/template": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.40.tgz", - "integrity": "sha512-RlQiVB7eL7fxsKN6JvnCCwEwEL28CBYalXSgWWULuFlEHjtMoXBqQanSie3bNyhrANJx67sb+Sd/vuGivoMwLQ==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40", - "babylon": "7.0.0-beta.40", - "lodash": "4.17.5" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", - "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==", - "dev": true - } - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.40.tgz", - "integrity": "sha512-h96SQorjvdSuxQ6hHFIuAa3oxnad1TA5bU1Zz88+XqzwmM5QM0/k2D+heXGGy/76gT5ajl7xYLKGiPA/KTyVhQ==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.40", - "@babel/generator": "7.0.0-beta.40", - "@babel/helper-function-name": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40", - "babylon": "7.0.0-beta.40", - "debug": "3.1.0", - "globals": "11.3.0", - "invariant": "2.2.3", - "lodash": "4.17.5" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", - "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", - "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.40.tgz", - "integrity": "sha512-uXCGCzTgMZxcSUzutCPtZmXbVC+cvENgS2e0tRuhn+Y1hZnMb8IHP0Trq7Q2MB/eFmG5pKrAeTIUfQIe5kA4Tg==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "2.0.0" - }, - "dependencies": { "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -748,23 +599,179 @@ } }, "babel-eslint": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.2.tgz", - "integrity": "sha512-Qt2lz2egBxNYWqN9JIO2z4NOOf8i4b5JS6CFoYrOZZTDssueiV1jH/jsefyg+86SeNY3rB361/mi3kE1WK2WYQ==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.3.tgz", + "integrity": "sha512-0HeSTtaXg/Em7FCUWxwOT+KeFSO1O7LuRuzhk7g+1BjwdlQGlHq4OyMi3GqGxrNfEq8jEi6Hmt5ylEQUhurgiQ==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.40", - "@babel/traverse": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40", - "babylon": "7.0.0-beta.40", + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", "eslint-scope": "3.7.1", "eslint-visitor-keys": "1.0.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "2.5.1", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "2.4.0", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "4.17.5" + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "3.1.0", + "globals": "11.4.0", + "invariant": "2.2.3", + "lodash": "4.17.5" + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "2.0.0" + } + }, + "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.1" + } + }, "babylon": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", - "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==", + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "chalk": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz", + "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==", + "dev": true + }, + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true } } @@ -942,9 +949,9 @@ } }, "babel-loader": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.1.tgz", - "integrity": "sha1-uHE0yLEuPkwqlOBUYIW8aAorhIg=", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.4.tgz", + "integrity": "sha512-/hbyEvPzBJuGpk9o80R0ZyTej6heEOr59GoEUtn8qFKbnx4cJm9FWES6J/iv644sYgrtVw9JJQkjaLW/bqb5gw==", "dev": true, "requires": { "find-cache-dir": "1.0.0", @@ -971,14 +978,317 @@ } }, "babel-plugin-istanbul": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz", - "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "dev": true, "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", "find-up": "2.1.0", - "istanbul-lib-instrument": "1.9.2", - "test-exclude": "4.2.0" + "istanbul-lib-instrument": "1.10.1", + "test-exclude": "4.2.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.1", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "test-exclude": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", + "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "3.1.10", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + } } }, "babel-plugin-syntax-async-functions": { @@ -1813,12 +2123,6 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, "browserify-aes": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", @@ -2512,9 +2816,9 @@ "dev": true }, "codemirror": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.35.0.tgz", - "integrity": "sha512-8HQICjZlDfe1ai7bvU6m2uHxuZuFgsUCdDRU9OHVB+2RTRd+FftN1ezVCqbquG0Fyq+wETqyadKhUX46DswSUQ==" + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.36.0.tgz", + "integrity": "sha512-XGR+ic+9DSMSE4mD2XLinGrMcIO4xbHpNrPzAFpCW5bjy+Em8fUOTCpagVP/+LLtTQsAROqrq1f55KyRxDcokA==" }, "collection-visit": { "version": "1.0.0", @@ -2527,9 +2831,9 @@ } }, "color": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color/-/color-2.0.1.tgz", - "integrity": "sha512-ubUCVVKfT7r2w2D3qtHakj8mbmKms+tThR8gI8zEYCbUBl8/voqFGt3kgBqGwXAopgXybnkuOq+qMYCRrp4cXw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", "requires": { "color-convert": "1.9.1", "color-string": "1.5.2" @@ -2697,7 +3001,7 @@ }, "compression": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "dev": true, "requires": { @@ -2841,9 +3145,9 @@ } }, "copy-webpack-plugin": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.0.tgz", - "integrity": "sha512-ROQ85fWKuhJfUkBTdHvfV+Zv6Ltm3G/vPVFdLPFwzWzd9RUY1yLw3rt6FmKK2PaeNQCNvmwgFhuarkjuV4PVDQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz", + "integrity": "sha512-OlTo6DYg0XfTKOF8eLf79wcHm4Ut10xU2cRBRPMW/NA5F9VMjZGTfRHWDIYC3s+1kObGYrBLshXWU1K0hILkNQ==", "dev": true, "requires": { "cacache": "10.0.4", @@ -2969,9 +3273,9 @@ } }, "cross-env": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.3.tgz", - "integrity": "sha512-UOokgwvDzCT0mqRSLEkJzUhYXB1vK3E5UgDrD41QiXsm9UetcW2rCGHYz/O3p873lMJ1VZbFCF9Izkwh7nYR5A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.4.tgz", + "integrity": "sha512-Mx8mw6JWhfpYoEk7PGvHxJMLQwQHORAs8+2bX+C1lGQ4h3GkDb1zbzC2Nw85YH9ZQMlO0BHZxMacgrfPmMFxbg==", "dev": true, "requires": { "cross-spawn": "5.1.0", @@ -3056,9 +3360,9 @@ "dev": true }, "css-loader": { - "version": "0.28.10", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.10.tgz", - "integrity": "sha512-X1IJteKnW9Llmrd+lJ0f7QZHh9Arf+11S7iRcoT2+riig3BK0QaCaOtubAulMK6Itbo08W6d3l8sW21r+Jhp5Q==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", + "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", "dev": true, "requires": { "babel-code-frame": "6.26.0", @@ -3518,12 +3822,6 @@ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=" }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, "diffie-hellman": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", @@ -4167,14 +4465,14 @@ } }, "eslint": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz", - "integrity": "sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { "ajv": "5.5.2", "babel-code-frame": "6.26.0", - "chalk": "2.3.2", + "chalk": "2.4.0", "concat-stream": "1.6.1", "cross-spawn": "5.1.0", "debug": "3.1.0", @@ -4187,7 +4485,7 @@ "file-entry-cache": "2.0.0", "functional-red-black-tree": "1.0.1", "glob": "7.1.2", - "globals": "11.3.0", + "globals": "11.4.0", "ignore": "3.3.7", "imurmurhash": "0.1.4", "inquirer": "3.3.0", @@ -4203,6 +4501,7 @@ "path-is-inside": "1.0.2", "pluralize": "7.0.0", "progress": "2.0.0", + "regexpp": "1.1.0", "require-uncached": "1.0.3", "semver": "5.5.0", "strip-ansi": "4.0.0", @@ -4227,14 +4526,14 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "supports-color": "5.4.0" } }, "debug": { @@ -4247,9 +4546,9 @@ } }, "globals": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", - "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz", + "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==", "dev": true }, "semver": { @@ -4268,9 +4567,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" @@ -4483,9 +4782,9 @@ } }, "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "dev": true, "requires": { "accepts": "1.3.5", @@ -4500,7 +4799,7 @@ "encodeurl": "1.0.2", "escape-html": "1.0.3", "etag": "1.8.1", - "finalhandler": "1.1.0", + "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "1.1.2", @@ -4511,10 +4810,10 @@ "qs": "6.5.1", "range-parser": "1.2.0", "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", + "send": "0.16.2", + "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.3.1", + "statuses": "1.4.0", "type-is": "1.6.16", "utils-merge": "1.0.1", "vary": "1.1.2" @@ -4530,17 +4829,65 @@ "negotiator": "0.6.1" } }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" + } + }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true } } }, @@ -4779,9 +5126,9 @@ } }, "file-saver": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz", - "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz", + "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==" }, "filename-regex": { "version": "2.0.1", @@ -6367,25 +6714,20 @@ "dev": true }, "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", "dev": true, "requires": { - "bluebird": "3.5.1", "html-minifier": "3.5.10", "loader-utils": "0.2.17", "lodash": "4.17.5", "pretty-error": "2.1.1", - "toposort": "1.0.6" + "tapable": "1.0.0", + "toposort": "1.0.6", + "util.promisify": "1.0.0" }, "dependencies": { - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, "loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", @@ -6397,6 +6739,12 @@ "json5": "0.5.1", "object-assign": "4.1.1" } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true } } }, @@ -7312,34 +7660,11 @@ } }, "istanbul-lib-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz", - "integrity": "sha512-tZYA0v5A7qBSsOzcebJJ/z3lk3oSzH62puG78DbBA1+zupipX2CakDyiPV3pOb8He+jBwVimuwB0dTnh38hX0w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", "dev": true }, - "istanbul-lib-instrument": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz", - "integrity": "sha512-nz8t4HQ2206a/3AXi+NHFWEa844DMpPsgbcUteJbt1j8LX1xg56H9rOMnhvcvVvPbW60qAIyrSk44H8ZDqaSSA==", - "dev": true, - "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.2", - "semver": "5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - } - } - }, "js-base64": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", @@ -7976,9 +8301,9 @@ } }, "mapbox-gl": { - "version": "0.44.1", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-0.44.1.tgz", - "integrity": "sha512-K6GfXfvumPgiw3NSFGTPYU7VinhWLKFbRmNTx/mPWzxzazfKZsChuyZ9IEhZ6LuFEnV1qzquyg5kLUCledVzvg==", + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-0.44.2.tgz", + "integrity": "sha512-UzrfDEit6pX+HSj5qQTDG633JiF4JKn1MD8vz58S7kAnGRqnnSfFc7rrSVXZ/E6G5SFKsfESURUbLLuGkOcfWA==", "requires": { "@mapbox/gl-matrix": "0.0.1", "@mapbox/mapbox-gl-supported": "1.3.0", @@ -8045,7 +8370,7 @@ "requires": { "@mapbox/mapbox-gl-style-spec": "9.0.1", "mapbox-to-css-font": "2.1.0", - "ol": "4.6.4" + "ol": "4.6.5" }, "dependencies": { "@mapbox/mapbox-gl-style-spec": { @@ -8365,23 +8690,30 @@ } }, "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.0.tgz", + "integrity": "sha512-d6RWgYPILd+AoWVOxiD0UwUqRicnE1inTxMr40CXOgqYve1MvnKntoLAtLIcxjEeVjEoYYTe5QAq3mUc6/ySjQ==", "dev": true, "requires": { - "browser-stdout": "1.3.0", + "browser-stdout": "1.3.1", "commander": "2.11.0", "debug": "3.1.0", - "diff": "3.3.1", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", "glob": "7.1.2", "growl": "1.10.3", "he": "1.1.1", + "minimatch": "3.0.4", "mkdirp": "0.5.1", "supports-color": "4.4.0" }, "dependencies": { + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", @@ -8397,6 +8729,12 @@ "ms": "2.0.0" } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -8493,7 +8831,8 @@ "nan": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", - "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==" + "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", + "optional": true }, "nanomatch": { "version": "1.2.9", @@ -8624,7 +8963,7 @@ "nopt": "3.0.6", "npmlog": "4.1.2", "osenv": "0.1.5", - "request": "2.83.0", + "request": "2.85.0", "rimraf": "2.6.2", "semver": "5.3.0", "tar": "2.2.1", @@ -8679,9 +9018,9 @@ } }, "node-sass": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", - "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.8.3.tgz", + "integrity": "sha512-tfFWhUsCk/Y19zarDcPo5xpj+IW3qCfOjVdHtYeG6S1CKbQOh1zqylnQK6cV3z9k80yxAnFX9Y+a9+XysDhhfg==", "dev": true, "requires": { "async-foreach": "0.1.3", @@ -8696,7 +9035,7 @@ "lodash.mergewith": "4.6.1", "meow": "3.7.0", "mkdirp": "0.5.1", - "nan": "2.9.2", + "nan": "2.10.0", "node-gyp": "3.6.2", "npmlog": "4.1.2", "request": "2.79.0", @@ -8803,6 +9142,12 @@ "sshpk": "1.13.1" } }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true + }, "qs": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", @@ -9314,6 +9659,16 @@ "object-keys": "1.0.11" } }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.10.0" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -9347,9 +9702,9 @@ "dev": true }, "ol": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/ol/-/ol-4.6.4.tgz", - "integrity": "sha512-9Eo0auMLU7dyCbMFfNKbyVqWH0JrfyLGrP9/jywisdGX/cqjFKtgiENFGr8wZAUzkVDNWdnKcrrIZsLMbnd68Q==", + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/ol/-/ol-4.6.5.tgz", + "integrity": "sha512-FtXsY3WY07c5vEP53rUkkw3jN7orcmg07lbmTfeS2hGyIZ0Noy1xC5urP+n6XTggnQZv0NlOkAt9lxNEmAQWQw==", "requires": { "pbf": "3.1.0", "pixelworks": "1.1.0", @@ -9364,7 +9719,7 @@ "@mapbox/mapbox-gl-style-spec": "9.0.1", "mapbox-to-css-font": "2.1.0", "mapbox-to-ol-style": "3.4.0", - "ol": "4.6.4", + "ol": "4.6.5", "webfont-matcher": "1.1.0" }, "dependencies": { @@ -9810,7 +10165,7 @@ "hasha": "2.2.0", "kew": "0.7.0", "progress": "1.1.8", - "request": "2.83.0", + "request": "2.85.0", "request-progress": "2.0.1", "which": "1.3.0" }, @@ -10788,9 +11143,9 @@ } }, "react": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", - "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react/-/react-16.3.2.tgz", + "integrity": "sha512-o5GPdkhciQ3cEph6qgvYB7LTOHw/GB0qRI6ZFNugj49qJCFfgHwVNjZ5u+b7nif4vOeMIOuYj3CeYe2IBD74lg==", "requires": { "fbjs": "0.8.16", "loose-envify": "1.3.1", @@ -10817,9 +11172,9 @@ } }, "react-codemirror2": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/react-codemirror2/-/react-codemirror2-3.0.7.tgz", - "integrity": "sha512-l0iUmKZxKmMAtr9x/6lcHgAMmUZIVufRd0YdTKIe6Y/4Fv4z+0nvaInPituRep/hpeG5WUoEVaZoIV7qEltfDg==" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-codemirror2/-/react-codemirror2-4.2.1.tgz", + "integrity": "sha512-LK1KzJb1oKcVA6+Mq4yxMwTRzCVJeF82q8XNyyZdAG09ywxMW3VEU0wV7r0qV0Gab9su9Kfx4B222Mpcpjmg9Q==" }, "react-collapse": { "version": "4.0.3", @@ -10830,9 +11185,9 @@ } }, "react-color": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.14.0.tgz", - "integrity": "sha512-5D/2rRGuqTA9fgKLXdHDyCuQJrjgu257B4+ORsoJ1mOPCw7dvPdCJdC5q+/QO6QGQAPe0TSPHGObBPIkMUNhQg==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.14.1.tgz", + "integrity": "sha512-ssv2ArSZdhTbIs29hyfw8JW+s3G4BCx/ILkwCajWZzrcx/2ZQfRpsaLVt38LAPbxe50LLszlmGtRerA14JzzRw==", "requires": { "lodash": "4.17.5", "material-colors": "1.2.5", @@ -10857,9 +11212,9 @@ "dev": true }, "react-dom": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.2.0.tgz", - "integrity": "sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==", + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz", + "integrity": "sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA==", "requires": { "fbjs": "0.8.16", "loose-envify": "1.3.1", @@ -11170,6 +11525,12 @@ } } }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -11256,9 +11617,9 @@ } }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { "aws-sign2": "0.7.0", "aws4": "1.6.0", @@ -11558,9 +11919,9 @@ } }, "sass-loader": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", - "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.0.1.tgz", + "integrity": "sha512-MeVVJFejJELlAbA7jrRchi88PGP6U9yIfqyiG+bBC4a9s2PX+ulJB9h8bbEohtPBfZmlLhNZ0opQM9hovRXvlw==", "dev": true, "requires": { "clone-deep": "2.0.2", @@ -11618,9 +11979,9 @@ "dev": true }, "selenium-standalone": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.13.0.tgz", - "integrity": "sha512-JV1+AySJ9RccsAIZlnDb8QUx/SDeVGK8j/zCJcNlbz/LCRiketU3Su0YE5Uc1raaBGpT/venof0+9Ry0oGuvYw==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.14.0.tgz", + "integrity": "sha512-NTpcPZq8OkMuuhcPRXoI3Gx2qELMDFvs970h7jzoayLkmRd8DxqjNXy8L7Ainxnmo0er0uF2GsUda07Eu0k5EA==", "dev": true, "requires": { "async": "2.6.0", @@ -11825,41 +12186,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" }, - "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - } - } - }, "sentence-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", @@ -11909,18 +12235,6 @@ } } }, - "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", - "dev": true, - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -12899,13 +13213,43 @@ "dev": true }, "style-loader": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", - "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.20.3.tgz", + "integrity": "sha512-2I7AVP73MvK33U7B9TKlYZAqdROyMXDYSMvHLX43qy3GCOaJNiV6i0v/sv9idWIaQ42Yn2dNv79Q5mKXbKhAZg==", "dev": true, "requires": { "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "schema-utils": "0.4.5" + }, + "dependencies": { + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1", + "uri-js": "3.0.2" + } + }, + "ajv-keywords": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", + "dev": true + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "dev": true, + "requires": { + "ajv": "6.4.0", + "ajv-keywords": "3.1.0" + } + } } }, "style-search": { @@ -13246,19 +13590,6 @@ "xtend": "4.0.1" } }, - "test-exclude": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.0.tgz", - "integrity": "sha512-8hMFzjxbPv6xSlwGhXSvOMJ/vTy3bkng+2pxmf6E1z6VF7I9nIyNfvHtaw+NBPgvz647gADBbMSbwLfZYppT/w==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -13569,9 +13900,9 @@ "optional": true }, "uglifyjs-webpack-plugin": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz", - "integrity": "sha512-CG/NvzXfemUAm5Y4Guh5eEaJYHtkG7kKNpXEJHp9QpxsFVB5/qKvYWoMaq4sa99ccZ0hM3MK8vQV9XPZB4357A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.4.tgz", + "integrity": "sha512-z0IbjpW8b3O/OVn+TTZN4pI29RN1zktFBXLIzzfZ+++cUtZ1ERSlLWgpE/5OERuEUs1ijVQnpYAkSlpoVmQmSQ==", "dev": true, "requires": { "cacache": "10.0.4", @@ -13585,14 +13916,15 @@ }, "dependencies": { "ajv": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.1.tgz", - "integrity": "sha1-KKarxJOiq+D7TIUHrK7bQ/pVBnE=", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", "dev": true, "requires": { "fast-deep-equal": "1.1.0", "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "json-schema-traverse": "0.3.1", + "uri-js": "3.0.2" } }, "ajv-keywords": { @@ -13613,7 +13945,7 @@ "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", "dev": true, "requires": { - "ajv": "6.2.1", + "ajv": "6.4.0", "ajv-keywords": "3.1.0" } }, @@ -13819,6 +14151,23 @@ "upper-case": "1.1.3" } }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } + } + }, "urijs": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", @@ -13989,6 +14338,16 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "object.getownpropertydescriptors": "2.0.3" + } + }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -14438,13 +14797,13 @@ "dev": true }, "wdio-mocha-framework": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/wdio-mocha-framework/-/wdio-mocha-framework-0.5.12.tgz", - "integrity": "sha512-PHqomnVFjNUU+TS4e9lb/DanlaUlobRa3UlIdRMKvsHdsfaCh2oAc7V9OU1rHANNYS9AqKedHDM+GvvGh1VZgA==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/wdio-mocha-framework/-/wdio-mocha-framework-0.5.13.tgz", + "integrity": "sha512-sg9EXWJLVTaLgJBOESvfhz3IWN8ujYFU35bazLtHCfmH3t8G9Fy7nNezJ/QdMBB5Ug1yyISynXkn2XWFJ+Tvgw==", "dev": true, "requires": { "babel-runtime": "6.26.0", - "mocha": "4.1.0", + "mocha": "5.1.0", "wdio-sync": "0.7.1" } }, @@ -14459,13 +14818,13 @@ } }, "wdio-selenium-standalone-service": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/wdio-selenium-standalone-service/-/wdio-selenium-standalone-service-0.0.9.tgz", - "integrity": "sha1-yA1P9Il0TVoLkdUYl2SRbUwMhWQ=", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/wdio-selenium-standalone-service/-/wdio-selenium-standalone-service-0.0.10.tgz", + "integrity": "sha512-PnpY6r8DcMwU2ZVk5y1d8vKhqOq6bXJILy/g5O5ncMpFaxIZcLkFA1u/11XBJwgzWXgUAXPPnIchkb+/t1dbXA==", "dev": true, "requires": { "fs-extra": "0.30.0", - "selenium-standalone": "6.13.0" + "selenium-standalone": "6.14.0" }, "dependencies": { "fs-extra": { @@ -14571,6 +14930,42 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, "supports-color": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", @@ -14860,7 +15255,7 @@ "chalk": "2.3.2", "commander": "2.14.1", "ejs": "2.5.7", - "express": "4.16.2", + "express": "4.16.3", "filesize": "3.6.0", "gzip-size": "4.1.0", "lodash": "4.17.5", @@ -14959,7 +15354,7 @@ "connect-history-api-fallback": "1.5.0", "debug": "3.1.0", "del": "3.0.0", - "express": "4.16.2", + "express": "4.16.3", "html-entities": "1.2.1", "http-proxy-middleware": "0.17.4", "import-local": "1.0.0", diff --git a/package.json b/package.json index 8d25cfdf..3152d0e9 100644 --- a/package.json +++ b/package.json @@ -24,30 +24,30 @@ "@mapbox/mapbox-gl-rtl-text": "^0.1.1", "@mapbox/mapbox-gl-style-spec": "^11.1.1", "classnames": "^2.2.5", - "codemirror": "^5.32.0", - "color": "^2.0.0", - "file-saver": "^1.3.3", + "codemirror": "^5.36.0", + "color": "^3.0.0", + "file-saver": "^1.3.8", "github-api": "^3.0.0", "jsonlint": "github:josdejong/jsonlint#85a19d7", "lodash.capitalize": "^4.2.1", "lodash.clonedeep": "^4.5.0", "lodash.isequal": "^4.5.0", "lodash.throttle": "^4.1.1", - "mapbox-gl": "^0.44.1", + "mapbox-gl": "^0.44.2", "mapbox-gl-inspect": "^1.3.1", "maputnik-design": "github:maputnik/design", "mousetrap": "^1.6.1", "ol-mapbox-style": "^2.10.1", - "ol": "^4.6.4", + "ol": "^4.6.5", "prop-types": "^15.6.0", - "react": "^16.2.0", + "react": "^16.3.2", "react-addons-pure-render-mixin": "^15.6.2", "react-autocomplete": "^1.7.2", - "react-codemirror2": "^3.0.7", + "react-codemirror2": "^4.2.1", "react-collapse": "^4.0.3", - "react-color": "^2.13.8", + "react-color": "^2.14.1", "react-copy-to-clipboard": "^5.0.1", - "react-dom": "^16.2.0", + "react-dom": "^16.3.2", "react-file-reader-input": "^1.1.4", "react-height": "^3.0.0", "react-icon-base": "^2.1.1", @@ -55,7 +55,7 @@ "react-motion": "^0.5.2", "react-sortable-hoc": "^0.6.8", "reconnecting-websocket": "^3.2.2", - "request": "^2.83.0", + "request": "^2.85.0", "url": "^0.11.0" }, "jshintConfig": { @@ -89,9 +89,9 @@ }, "devDependencies": { "babel-core": "^6.26.0", - "babel-eslint": "^8.0.2", - "babel-loader": "7.1.1", - "babel-plugin-istanbul": "^4.1.5", + "babel-eslint": "^8.2.3", + "babel-loader": "7.1.4", + "babel-plugin-istanbul": "^4.1.6", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-plugin-transform-flow-strip-types": "^6.22.0", @@ -104,36 +104,36 @@ "babel-register": "^6.26.0", "babel-runtime": "^6.26.0", "base64-loader": "^1.0.0", - "copy-webpack-plugin": "^4.2.0", + "copy-webpack-plugin": "^4.5.1", "cors": "^2.8.4", - "cross-env": "^5.1.3", - "css-loader": "^0.28.7", - "eslint": "^4.10.0", + "cross-env": "^5.1.4", + "css-loader": "^0.28.11", + "eslint": "^4.19.1", "eslint-plugin-react": "^7.4.0", - "express": "^4.16.2", + "express": "^4.16.3", "extract-text-webpack-plugin": "^3.0.2", "file-loader": "^1.1.5", - "html-webpack-plugin": "^2.30.1", + "html-webpack-plugin": "^3.2.0", "is-docker": "^1.1.0", "istanbul": "^0.4.5", - "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-coverage": "^1.2.0", "json-loader": "^0.5.7", "mkdirp": "^0.5.1", - "mocha": "^4.0.1", - "node-sass": "^4.6.0", + "mocha": "^5.1.0", + "node-sass": "^4.8.3", "nsp": "^3.1.0", "react-hot-loader": "^3.1.1", - "sass-loader": "^6.0.6", - "selenium-standalone": "^6.13.0", - "style-loader": "^0.19.0", + "sass-loader": "^7.0.1", + "selenium-standalone": "^6.14.0", + "style-loader": "^0.20.3", "stylelint": "^7.13.0", "stylelint-config-standard": "^15.0.1", "transform-loader": "^0.2.4", + "uglifyjs-webpack-plugin": "^1.2.4", "uuid": "^3.1.0", - "uglifyjs-webpack-plugin": "^1.1.8", - "wdio-mocha-framework": "^0.5.11", + "wdio-mocha-framework": "^0.5.13", "wdio-phantomjs-service": "^0.2.2", - "wdio-selenium-standalone-service": "0.0.9", + "wdio-selenium-standalone-service": "0.0.10", "wdio-spec-reporter": "^0.1.2", "webdriverio": "^4.12.0", "webpack": "^3.8.1", From d0ca732fe730cbc969fa5bbcf6c675e35d54d99b Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 17 Apr 2018 14:55:13 +0100 Subject: [PATCH 056/134] Updated stylelint and fixed scss for 'stylelint-config-recommended-scss' --- package-lock.json | 2228 +++++++++++++++++++++++---------- package.json | 10 +- src/styles/_filtereditor.scss | 47 +- src/styles/_toolbar.scss | 5 +- src/styles/_zoomproperty.scss | 15 +- 5 files changed, 1577 insertions(+), 728 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0efeb72a..84a50627 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,114 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/core": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0-beta.44.tgz", + "integrity": "sha512-E16ps55Av+GAO6qVTZeVR5FMVppraUPjiJEHuH0sANsbmkEjqQ70XQiv0KXPYbPzHBd+gijx6uLakSacjvtwIA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helpers": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "convert-source-map": "1.5.1", + "debug": "3.1.0", + "json5": "0.5.1", + "lodash": "4.17.5", + "micromatch": "2.3.11", + "resolve": "1.5.0", + "semver": "5.5.0", + "source-map": "0.5.7" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "2.5.1", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, "@babel/helper-split-export-declaration": { "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", @@ -32,6 +140,139 @@ } } }, + "@babel/helpers": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0-beta.44.tgz", + "integrity": "sha512-7qXsqiaMZzVuI0dobFGa9dQhCd6Y19lGeu4HrFHJo13/y9NKngepg/CYMzBi79TacKeaWfJNj3TeVCyRtfZqUg==", + "dev": true, + "requires": { + "@babel/template": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "2.4.0", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "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.1" + } + }, + "chalk": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "4.17.5" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "3.1.0", + "globals": "11.4.0", + "invariant": "2.2.3", + "lodash": "4.17.5" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz", + "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, "@mapbox/geojson-area": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz", @@ -116,14 +357,14 @@ "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.0.0.tgz", "integrity": "sha1-wd5CkwgUJNo6wwwjr6hQrxAZu1Q=" }, - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { - "jsonparse": "0.0.5", - "through": "2.3.8" + "call-me-maybe": "1.0.1", + "glob-to-regexp": "0.3.0" } }, "JSV": { @@ -366,12 +607,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "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-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -394,6 +629,12 @@ "es-abstract": "1.10.0" } }, + "array-iterate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", + "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==", + "dev": true + }, "array-slice": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", @@ -1883,6 +2124,12 @@ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, + "bail": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", + "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2373,6 +2620,12 @@ "estraverse": "4.2.0" } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -2468,6 +2721,12 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "ccount": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.2.tgz", + "integrity": "sha1-U7ai+BW7d7nChx97mnLDol8djok=", + "dev": true + }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", @@ -2516,6 +2775,30 @@ "upper-case-first": "1.1.2" } }, + "character-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.1.tgz", + "integrity": "sha1-92hxvl72bdt/j440eOzDdMJ9bco=", + "dev": true + }, + "character-entities-html4": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", + "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz", + "integrity": "sha1-9Ad53xoQGHK7UQo9KV4fzPFHIC8=", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz", + "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=", + "dev": true + }, "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", @@ -2820,6 +3103,12 @@ "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.36.0.tgz", "integrity": "sha512-XGR+ic+9DSMSE4mD2XLinGrMcIO4xbHpNrPzAFpCW5bjy+Em8fUOTCpagVP/+LLtTQsAROqrq1f55KyRxDcokA==" }, + "collapse-white-space": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", + "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", + "dev": true + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -2847,12 +3136,6 @@ "color-name": "1.1.3" } }, - "color-diff": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz", - "integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=", - "dev": true - }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", @@ -2867,44 +3150,6 @@ "simple-swizzle": "0.2.2" } }, - "colorguard": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorguard/-/colorguard-1.2.1.tgz", - "integrity": "sha512-qYVKTg626qpDg4/eBnPXidEPXn5+krbYqHVfyyEFBWV5z3IF4p44HKY/eE2t1ohlcrlIkDgHmFJMfQ8qMLnSFw==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "color-diff": "0.1.7", - "log-symbols": "1.0.2", - "object-assign": "4.1.1", - "pipetteur": "2.0.3", - "plur": "2.1.2", - "postcss": "5.2.18", - "postcss-reporter": "1.4.1", - "text-table": "0.2.0", - "yargs": "1.3.3" - }, - "dependencies": { - "postcss-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", - "integrity": "sha1-wTbwpbFhkV83ndN2XGEHX357mvI=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "lodash": "4.17.5", - "log-symbols": "1.0.2", - "postcss": "5.2.18" - } - }, - "yargs": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.3.3.tgz", - "integrity": "sha1-BU3oth8i7v23IHBZ6u+da4P7kxo=", - "dev": true - } - } - }, "colormin": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", @@ -3197,29 +3442,6 @@ "vary": "1.1.2" } }, - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.11.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "crc": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", @@ -3390,77 +3612,6 @@ "css": "2.2.1" } }, - "css-rule-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz", - "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=", - "dev": true, - "requires": { - "css-tokenize": "1.0.1", - "duplexer2": "0.0.2", - "ldjson-stream": "1.2.1", - "through2": "0.6.5" - }, - "dependencies": { - "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.14" - } - }, - "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.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "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 - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } - } - } - } - }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -3497,42 +3648,6 @@ } } }, - "css-tokenize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz", - "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" - }, - "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.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "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 - } - } - }, "css-value": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", @@ -3677,6 +3792,16 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "1.2.0", + "map-obj": "1.0.1" + } + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -3888,104 +4013,6 @@ "esutils": "2.0.2" } }, - "doiuse": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-2.6.0.tgz", - "integrity": "sha1-GJLRC2Gpo1at2/K2FJM+gfi7ODQ=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000813", - "css-rule-stream": "1.1.0", - "duplexer2": "0.0.2", - "jsonfilter": "1.1.2", - "ldjson-stream": "1.2.1", - "lodash": "4.17.5", - "multimatch": "2.1.0", - "postcss": "5.2.18", - "source-map": "0.4.4", - "through2": "0.6.5", - "yargs": "3.10.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "1.0.30000813", - "electron-to-chromium": "1.3.36" - } - }, - "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.14" - } - }, - "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.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "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": "1.0.1" - } - }, - "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 - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } - } - } - } - }, "dom-converter": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", @@ -4083,6 +4110,15 @@ "no-case": "2.3.2" } }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -5006,6 +5042,323 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, + "fast-glob": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz", + "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "2.2.1", + "glob-parent": "3.1.0", + "is-glob": "4.0.0", + "merge2": "1.2.1", + "micromatch": "3.1.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.1", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + } + } + } + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -6143,12 +6496,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "gather-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", - "integrity": "sha1-szmUr0V6gRVwDUEPMXczy+egkEs=", - "dev": true - }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -6306,6 +6653,12 @@ "is-glob": "2.0.1" } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, "global": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", @@ -6353,6 +6706,23 @@ "minimatch": "3.0.4" } }, + "gonzales-pe": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.3.tgz", + "integrity": "sha512-Kjhohco0esHQnOiqqdJeNz/5fyPkOMD/d6XVjwTAoPGUFh0mCollPUTUTa2OZy4dYNAqlPIQdTiNzJTWdd9Htw==", + "dev": true, + "requires": { + "minimist": "1.1.3" + }, + "dependencies": { + "minimist": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", + "dev": true + } + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -6985,6 +7355,12 @@ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true + }, "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", @@ -7149,12 +7525,6 @@ "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", "dev": true }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true - }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -7178,6 +7548,28 @@ } } }, + "is-alphabetical": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.1.tgz", + "integrity": "sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg=", + "dev": true + }, + "is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", + "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz", + "integrity": "sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts=", + "dev": true, + "requires": { + "is-alphabetical": "1.0.1", + "is-decimal": "1.0.1" + } + }, "is-arrayish": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.1.tgz", @@ -7234,6 +7626,12 @@ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, + "is-decimal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.1.tgz", + "integrity": "sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI=", + "dev": true + }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -7311,6 +7709,12 @@ "is-extglob": "1.0.0" } }, + "is-hexadecimal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz", + "integrity": "sha1-bghLvJIGH7sJcexYts5tQE4k2mk=", + "dev": true + }, "is-lower-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", @@ -7357,6 +7761,12 @@ } } }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, "is-odd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", @@ -7510,12 +7920,24 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-whitespace-character": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz", + "integrity": "sha1-muAXbzKCtlRXoZks2whPil+DPjs=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-word-character": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.1.tgz", + "integrity": "sha1-WgP6HqkazopusMfNdw64bWXIvvs=", + "dev": true + }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -7709,6 +8131,12 @@ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -7750,60 +8178,6 @@ "graceful-fs": "4.1.11" } }, - "jsonfilter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz", - "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=", - "dev": true, - "requires": { - "JSONStream": "0.8.4", - "minimist": "1.2.0", - "stream-combiner": "0.2.2", - "through2": "0.6.5" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "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=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "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 - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, "jsonlint": { "version": "github:josdejong/jsonlint#85a19d77126771f3177582e3d09c6ffae185d391", "requires": { @@ -7811,12 +8185,6 @@ "nomnom": "1.8.1" } }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true - }, "jsonpointer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", @@ -7916,12 +8284,6 @@ "graceful-fs": "4.1.11" } }, - "known-css-properties": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.2.0.tgz", - "integrity": "sha512-UTCzU28rRI9wkb8qSGoZa9pgWvxr4LjP2MEhi9XHb/1XMOJy0uTnIxaxzj8My/PORG+kQG6VzAcGvRw66eIOfA==", - "dev": true - }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -7946,52 +8308,6 @@ "invert-kv": "1.0.0" } }, - "ldjson-stream": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz", - "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=", - "dev": true, - "requires": { - "split2": "0.2.1", - "through2": "0.6.5" - }, - "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.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "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 - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -8161,15 +8477,6 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - }, "log4js": { "version": "0.6.38", "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", @@ -8214,6 +8521,12 @@ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, + "longest-streak": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", + "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", + "dev": true + }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", @@ -8409,6 +8722,18 @@ "maputnik-design": { "version": "github:maputnik/design#afd4550db2a1562159092a858be181b5baa221f7" }, + "markdown-escapes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.1.tgz", + "integrity": "sha1-GZTfLTr0gR3lmmcUk0wrIpJzRRg=", + "dev": true + }, + "markdown-table": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.1.tgz", + "integrity": "sha1-Sz3ToTPRUYuO8NvHCb8qG0gkvIw=", + "dev": true + }, "material-colors": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.5.tgz", @@ -8448,6 +8773,16 @@ } } }, + "mdast-util-compact": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz", + "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=", + "dev": true, + "requires": { + "unist-util-modify-children": "1.1.1", + "unist-util-visit": "1.3.0" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -8519,6 +8854,12 @@ } } }, + "merge2": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", + "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -8623,6 +8964,16 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "is-plain-obj": "1.1.0" + } + }, "mississippi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", @@ -8810,18 +9161,6 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" - } - }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -9778,12 +10117,6 @@ "wrappy": "1.0.2" } }, - "onecolor": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-3.0.5.tgz", - "integrity": "sha1-Nu/zIgE3nv3xGA+0ReUajiQl+fY=", - "dev": true - }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -9981,6 +10314,20 @@ "pbkdf2": "3.0.14" } }, + "parse-entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.1.tgz", + "integrity": "sha1-gRLYhHExnyerrk1klksSL+ThuJA=", + "dev": true, + "requires": { + "character-entities": "1.2.1", + "character-entities-legacy": "1.1.1", + "character-reference-invalid": "1.1.1", + "is-alphanumerical": "1.0.1", + "is-decimal": "1.0.1", + "is-hexadecimal": "1.0.1" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -10199,16 +10546,6 @@ "pinkie": "2.0.4" } }, - "pipetteur": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pipetteur/-/pipetteur-2.0.3.tgz", - "integrity": "sha1-GVV2CVno0aEcsqUOyD7sRwYz5J8=", - "dev": true, - "requires": { - "onecolor": "3.0.5", - "synesthesia": "1.0.1" - } - }, "pixelworks": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pixelworks/-/pixelworks-1.1.0.tgz", @@ -10223,15 +10560,6 @@ "find-up": "2.1.0" } }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "1.4.0" - } - }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", @@ -10386,13 +10714,49 @@ "uniqid": "4.1.1" } }, - "postcss-less": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-0.14.0.tgz", - "integrity": "sha1-xjGwicbM5CK5oQ86lY0r7dOBkyQ=", + "postcss-html": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.18.0.tgz", + "integrity": "sha512-7llFZ5hlINmUu/8iUBIXCTZ4OMyGB+NBeb7jDadXrH9g+hpcUEBhZv3rjqesmOsHNC3bITqx1EkVz77RuHJygw==", "dev": true, "requires": { - "postcss": "5.2.18" + "@babel/core": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "htmlparser2": "3.9.2", + "remark": "9.0.0", + "unist-util-find-all-after": "1.0.1" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + } } }, "postcss-media-query-parser": { @@ -10765,31 +11129,113 @@ "postcss-value-parser": "3.3.0" } }, - "postcss-reporter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-3.0.0.tgz", - "integrity": "sha1-CeoPN6RExWk4eGBuCbAY6+/3z48=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "lodash": "4.17.5", - "log-symbols": "1.0.2", - "postcss": "5.2.18" - } - }, "postcss-resolve-nested-selector": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", "dev": true }, - "postcss-scss": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-0.4.1.tgz", - "integrity": "sha1-rXcbgfD3L19IRdCKpg+TVXZT1Uw=", + "postcss-safe-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-3.0.1.tgz", + "integrity": "sha1-t1Pv9sfArqXoN1++TN6L+QY/8UI=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "6.0.21" + }, + "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.1" + } + }, + "chalk": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "postcss": { + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", + "dev": true, + "requires": { + "chalk": "2.4.0", + "source-map": "0.6.1", + "supports-color": "5.4.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-sass": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.0.tgz", + "integrity": "sha512-nZJEFS2bT007CmzMjlZfZwcZKpSJ/JeFiVEdgrgvGZtAnORU+5BvN0cioNuDAVxwXHXp3hksCJzbZYPWkuw41Q==", + "dev": true, + "requires": { + "gonzales-pe": "4.2.3", + "postcss": "6.0.21" + }, + "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.1" + } + }, + "chalk": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "postcss": { + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", + "dev": true, + "requires": { + "chalk": "2.4.0", + "source-map": "0.6.1", + "supports-color": "5.4.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } } }, "postcss-selector-parser": { @@ -11019,6 +11465,12 @@ "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", "dev": true }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, "quickselect": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.0.1.tgz", @@ -11319,15 +11771,6 @@ "lodash": "4.17.5" } }, - "read-file-stdin": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", - "integrity": "sha1-JezP86FTtoCa+ssj7hU4fbng7mE=", - "dev": true, - "requires": { - "gather-stream": "1.0.0" - } - }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -11571,6 +12014,62 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, + "remark": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-9.0.0.tgz", + "integrity": "sha512-amw8rGdD5lHbMEakiEsllmkdBP+/KpjW/PRK6NSGPZKCQowh0BT4IWXDAkRMyG3SB9dKPXWMviFjNusXzXNn3A==", + "dev": true, + "requires": { + "remark-parse": "5.0.0", + "remark-stringify": "5.0.0", + "unified": "6.1.6" + } + }, + "remark-parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", + "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", + "dev": true, + "requires": { + "collapse-white-space": "1.0.4", + "is-alphabetical": "1.0.1", + "is-decimal": "1.0.1", + "is-whitespace-character": "1.0.1", + "is-word-character": "1.0.1", + "markdown-escapes": "1.0.1", + "parse-entities": "1.1.1", + "repeat-string": "1.6.1", + "state-toggle": "1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "1.1.0", + "unherit": "1.1.0", + "unist-util-remove-position": "1.1.1", + "vfile-location": "2.0.2", + "xtend": "4.0.1" + } + }, + "remark-stringify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-5.0.0.tgz", + "integrity": "sha512-Ws5MdA69ftqQ/yhRF9XhVV29mhxbfGhbz0Rx5bQH+oJcNhhSM6nCu1EpLod+DjrFGrU0BMPs+czVmJZU7xiS7w==", + "dev": true, + "requires": { + "ccount": "1.0.2", + "is-alphanumeric": "1.0.0", + "is-decimal": "1.0.1", + "is-whitespace-character": "1.0.1", + "longest-streak": "2.0.2", + "markdown-escapes": "1.0.1", + "markdown-table": "1.1.1", + "mdast-util-compact": "1.0.1", + "parse-entities": "1.1.1", + "repeat-string": "1.6.1", + "state-toggle": "1.0.0", + "stringify-entities": "1.3.1", + "unherit": "1.1.0", + "xtend": "4.0.1" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -11616,6 +12115,12 @@ "is-finite": "1.0.2" } }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, "request": { "version": "2.85.0", "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", @@ -11667,12 +12172,6 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -12879,51 +13378,6 @@ } } }, - "split2": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz", - "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=", - "dev": true, - "requires": { - "through2": "0.6.5" - }, - "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.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "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 - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -12959,6 +13413,12 @@ "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=", "dev": true }, + "state-toggle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.0.tgz", + "integrity": "sha1-0g+aYWu08MO5i5GSLSW2QKorxCU=", + "dev": true + }, "static-eval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.0.tgz", @@ -13084,16 +13544,6 @@ "readable-stream": "2.3.5" } }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "0.1.1", - "through": "2.3.8" - } - }, "stream-each": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", @@ -13164,6 +13614,18 @@ "safe-buffer": "5.1.1" } }, + "stringify-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.1.tgz", + "integrity": "sha1-sVDsLXKsTBtfMktR+2soyc3/BYw=", + "dev": true, + "requires": { + "character-entities-html4": "1.1.2", + "character-entities-legacy": "1.1.1", + "is-alphanumerical": "1.0.1", + "is-hexadecimal": "1.0.1" + } + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", @@ -13258,98 +13720,51 @@ "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", "dev": true }, - "stylehacks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-2.3.2.tgz", - "integrity": "sha1-ZMg+BDimjJ7fRJ6MVSp9mrYAmws=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "chalk": "1.1.3", - "log-symbols": "1.0.2", - "minimist": "1.2.0", - "plur": "2.1.2", - "postcss": "5.2.18", - "postcss-reporter": "1.4.1", - "postcss-selector-parser": "2.2.3", - "read-file-stdin": "0.2.1", - "text-table": "0.2.0", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "1.0.30000813", - "electron-to-chromium": "1.3.36" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "postcss-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", - "integrity": "sha1-wTbwpbFhkV83ndN2XGEHX357mvI=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "lodash": "4.17.5", - "log-symbols": "1.0.2", - "postcss": "5.2.18" - } - } - } - }, "stylelint": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-7.13.0.tgz", - "integrity": "sha1-ER+Xttpy53XICADWu29fhpmXeF0=", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.2.0.tgz", + "integrity": "sha512-aBlnuLyTvyNfIVoc+reaqx88aW41Awc9Ccu7ZXrO2fnSvv0MVSQeyL3ci/nD1H1eYvH3X+MXTwMYC3Mf5+2Ckw==", "dev": true, "requires": { - "autoprefixer": "6.7.7", - "balanced-match": "0.4.2", - "chalk": "2.3.2", - "colorguard": "1.2.1", - "cosmiconfig": "2.2.2", - "debug": "2.6.9", - "doiuse": "2.6.0", + "autoprefixer": "8.3.0", + "balanced-match": "1.0.0", + "chalk": "2.4.0", + "cosmiconfig": "4.0.0", + "debug": "3.1.0", "execall": "1.0.0", "file-entry-cache": "2.0.0", - "get-stdin": "5.0.1", - "globby": "6.1.0", + "get-stdin": "6.0.0", + "globby": "8.0.1", "globjoin": "0.1.4", "html-tags": "2.0.0", "ignore": "3.3.7", + "import-lazy": "3.1.0", "imurmurhash": "0.1.4", - "known-css-properties": "0.2.0", + "known-css-properties": "0.6.1", "lodash": "4.17.5", - "log-symbols": "1.0.2", + "log-symbols": "2.2.0", "mathml-tag-names": "2.0.1", - "meow": "3.7.0", + "meow": "4.0.0", "micromatch": "2.3.11", "normalize-selector": "0.2.0", - "pify": "2.3.0", - "postcss": "5.2.18", - "postcss-less": "0.14.0", + "pify": "3.0.0", + "postcss": "6.0.21", + "postcss-html": "0.18.0", + "postcss-less": "1.1.5", "postcss-media-query-parser": "0.2.3", - "postcss-reporter": "3.0.0", + "postcss-reporter": "5.0.0", "postcss-resolve-nested-selector": "0.1.1", - "postcss-scss": "0.4.1", - "postcss-selector-parser": "2.2.3", + "postcss-safe-parser": "3.0.1", + "postcss-sass": "0.3.0", + "postcss-scss": "1.0.5", + "postcss-selector-parser": "3.1.1", "postcss-value-parser": "3.3.0", - "resolve-from": "3.0.0", + "resolve-from": "4.0.0", + "signal-exit": "3.0.2", "specificity": "0.3.2", "string-width": "2.1.1", "style-search": "0.1.0", - "stylehacks": "2.3.2", - "sugarss": "0.2.0", + "sugarss": "1.0.1", "svg-tags": "1.0.0", "table": "4.0.2" }, @@ -13363,78 +13778,427 @@ "color-convert": "1.9.1" } }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "autoprefixer": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.3.0.tgz", + "integrity": "sha512-HY2K4efAvC97v6j83pgV97Lieal51xhIV8EitvS4SrWcI+IGVZgjpihvXImsmIUzA6kb/tglPKzERG1oRFOvRA==", + "dev": true, + "requires": { + "browserslist": "3.2.4", + "caniuse-lite": "1.0.30000830", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.21", + "postcss-value-parser": "3.3.0" + } + }, + "browserslist": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.4.tgz", + "integrity": "sha512-Dwe62y/fNAcMfknzGJnkh7feISrrN0SmRvMFozb+Y2+qg7rfTIH5MS8yHzaIXcEWl8fPeIcdhZNQi1Lux+7dlg==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000830", + "electron-to-chromium": "1.3.42" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000830", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000830.tgz", + "integrity": "sha512-yMqGkujkoOIZfvOYiWdqPALgY/PVGiqCHUJb6yNq7xhI/pR+gQO0U2K6lRDqAiJv4+CIU3CtTLblNGw0QGnr6g==", "dev": true }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "supports-color": "5.4.0" } }, + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.11.0", + "parse-json": "4.0.0", + "require-from-string": "2.0.2" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.42", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.42.tgz", + "integrity": "sha1-lcM78B0MxAVVauyJn+Yf1NduoPk=", + "dev": true + }, "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "dev": true, "requires": { "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.0", "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "known-css-properties": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.6.1.tgz", + "integrity": "sha512-nQRpMcHm1cQ6gmztdvLcIvxocznSMqH/y6XtERrWrHaymOYdDGroRqetJvJycxGEr1aakXiigDgn7JnzuXlk6A==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "2.4.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", + "dev": true, + "requires": { + "camelcase-keys": "4.2.0", + "decamelize-keys": "1.1.0", + "loud-rejection": "1.6.0", + "minimist": "1.2.0", + "minimist-options": "3.0.2", + "normalize-package-data": "2.4.0", + "read-pkg-up": "3.0.0", + "redent": "2.0.0", + "trim-newlines": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.2" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "postcss": { + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", + "dev": true, + "requires": { + "chalk": "2.4.0", + "source-map": "0.6.1", + "supports-color": "5.4.0" + } + }, + "postcss-less": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.5.tgz", + "integrity": "sha512-QQIiIqgEjNnquc0d4b6HDOSFZxbFQoy4MPpli2lSLpKhMyBkKwwca2HFqu4xzxlKID/F2fxSOowwtKpgczhF7A==", + "dev": true, + "requires": { + "postcss": "5.2.18" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "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.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-reporter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", + "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", + "dev": true, + "requires": { + "chalk": "2.4.0", + "lodash": "4.17.5", + "log-symbols": "2.2.0", + "postcss": "6.0.21" + } + }, + "postcss-scss": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.5.tgz", + "integrity": "sha512-gJB1tKYMkBy0MU+COt6WXA4ZiRctAKoWLa6qD7a6bbEbBMqrpa/BhfQdN80eYMV+JkKddZVEpZlOggnGShpvyg==", + "dev": true, + "requires": { + "postcss": "6.0.21" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "sugarss": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz", + "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", + "dev": true, + "requires": { + "postcss": "6.0.21" + } + }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "3.0.0" } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true } } }, - "stylelint-config-standard": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-15.0.1.tgz", - "integrity": "sha1-9YjgNrymu1I5HqeEGY53OpynDv4=", + "stylelint-config-recommended": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-2.1.0.tgz", + "integrity": "sha512-ajMbivOD7JxdsnlS5945KYhvt7L/HwN6YeYF2BH6kE4UCLJR0YvXMf+2j7nQpJyYLZx9uZzU5G1ZOSBiWAc6yA==", "dev": true }, - "sugarss": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-0.2.0.tgz", - "integrity": "sha1-rDQjdWMyfG/4l7ZHQr9q7BkK054=", + "stylelint-config-recommended-scss": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-3.2.0.tgz", + "integrity": "sha512-M8BFHMRf8KNz5EQPKJd8nMCGmBd2o5coDEObfHVbEkyLDgjIf1V+U5dHjaGgvhm0zToUxshxN+Gc5wpbOOew4g==", "dev": true, "requires": { - "postcss": "5.2.18" + "stylelint-config-recommended": "2.1.0" + } + }, + "stylelint-scss": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.0.0.tgz", + "integrity": "sha512-Lam8+VuQaeXpSZ57L+zRl7m2HnDlAmyojS+rplsqMk50enJrKMwGTbLov4kN/Zk0Am5+8TbkjgwD9tSoC6jDyQ==", + "dev": true, + "requires": { + "lodash": "4.17.5", + "postcss-media-query-parser": "0.2.3", + "postcss-resolve-nested-selector": "0.1.1", + "postcss-selector-parser": "3.1.1", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + } } }, "supercluster": { @@ -13499,23 +14263,6 @@ "upper-case": "1.1.3" } }, - "synesthesia": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/synesthesia/-/synesthesia-1.0.1.tgz", - "integrity": "sha1-XvlepUjA1cbm+btLDQcx3/hkp3c=", - "dev": true, - "requires": { - "css-color-names": "0.0.3" - }, - "dependencies": { - "css-color-names": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.3.tgz", - "integrity": "sha1-3gzvFvTYqoIioyDVttfpu62nufY=", - "dev": true - } - } - }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", @@ -13793,6 +14540,12 @@ "loader-utils": "1.1.0" } }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -13805,6 +14558,18 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "trim-trailing-lines": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz", + "integrity": "sha1-eu+7eAjfnWafbaLkOMrIxGradoQ=", + "dev": true + }, + "trough": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.2.tgz", + "integrity": "sha512-FHkoUZvG6Egrv9XZAyYGKEyb1JMsFphgPjoczkZC2y6W93U1jswcVURB8MUvtsahEPEVACyxD47JAL63vF4JsQ==", + "dev": true + }, "true-case-path": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", @@ -14014,6 +14779,31 @@ "through": "2.3.8" } }, + "unherit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz", + "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "xtend": "4.0.1" + } + }, + "unified": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.6.tgz", + "integrity": "sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w==", + "dev": true, + "requires": { + "bail": "1.0.3", + "extend": "3.0.1", + "is-plain-obj": "1.1.0", + "trough": "1.0.2", + "vfile": "2.3.0", + "x-is-function": "1.0.4", + "x-is-string": "0.1.0" + } + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -14079,6 +14869,54 @@ "imurmurhash": "0.1.4" } }, + "unist-util-find-all-after": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.1.tgz", + "integrity": "sha1-TlUSq/734GFnga7Pex7XUcAK+Qg=", + "dev": true, + "requires": { + "unist-util-is": "2.1.1" + } + }, + "unist-util-is": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.1.tgz", + "integrity": "sha1-DDEmKeP5YMZukx6BLT2A53AQlHs=", + "dev": true + }, + "unist-util-modify-children": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.1.tgz", + "integrity": "sha1-ZtfmpEnm9nIguXarPLi166w55R0=", + "dev": true, + "requires": { + "array-iterate": "1.1.2" + } + }, + "unist-util-remove-position": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz", + "integrity": "sha1-WoXBVV/BugwQG4ZwfRXlD6TIcbs=", + "dev": true, + "requires": { + "unist-util-visit": "1.3.0" + } + }, + "unist-util-stringify-position": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz", + "integrity": "sha1-PMvcU2ee7W7PN3fdf14yKcG2qjw=", + "dev": true + }, + "unist-util-visit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.0.tgz", + "integrity": "sha512-9ntYcxPFtl44gnwXrQKZ5bMqXMY0ZHzUpqMFiU4zcc8mmf/jzYm8GhYgezuUlX4cJIM1zIDYaO6fG/fI+L6iiQ==", + "dev": true, + "requires": { + "unist-util-is": "2.1.1" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -14396,6 +15234,33 @@ "extsprintf": "1.3.0" } }, + "vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "dev": true, + "requires": { + "is-buffer": "1.1.6", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "1.1.1", + "vfile-message": "1.0.0" + } + }, + "vfile-location": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.2.tgz", + "integrity": "sha1-02dcWch3SY5JK0dW/2Xkrxp1IlU=", + "dev": true + }, + "vfile-message": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.0.tgz", + "integrity": "sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw==", + "dev": true, + "requires": { + "unist-util-stringify-position": "1.1.1" + } + }, "vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", @@ -16042,12 +16907,6 @@ "mkdirp": "0.5.1" } }, - "write-file-stdout": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/write-file-stdout/-/write-file-stdout-0.0.2.tgz", - "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=", - "dev": true - }, "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", @@ -16062,6 +16921,18 @@ "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=" }, + "x-is-function": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/x-is-function/-/x-is-function-1.0.4.tgz", + "integrity": "sha1-XSlNw9Joy90GJYDgxd93o5HR+h4=", + "dev": true + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", + "dev": true + }, "xml-char-classes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", @@ -16094,6 +16965,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, + "optional": true, "requires": { "camelcase": "1.2.1", "cliui": "2.1.0", diff --git a/package.json b/package.json index 3152d0e9..5ae4e4f4 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,10 @@ "esversion": 6 }, "stylelint": { - "extends": "stylelint-config-standard" + "extends": "stylelint-config-recommended-scss", + "rules": { + "no-descending-specificity": null + } }, "eslintConfig": { "plugins": [ @@ -126,8 +129,9 @@ "sass-loader": "^7.0.1", "selenium-standalone": "^6.14.0", "style-loader": "^0.20.3", - "stylelint": "^7.13.0", - "stylelint-config-standard": "^15.0.1", + "stylelint": "^9.2.0", + "stylelint-config-recommended-scss": "^3.2.0", + "stylelint-scss": "^3.0.0", "transform-loader": "^0.2.4", "uglifyjs-webpack-plugin": "^1.2.4", "uuid": "^3.1.0", diff --git a/src/styles/_filtereditor.scss b/src/styles/_filtereditor.scss index 411ff68e..7c3d1542 100644 --- a/src/styles/_filtereditor.scss +++ b/src/styles/_filtereditor.scss @@ -3,24 +3,34 @@ } .maputnik-filter-editor { + @extend .clearfix; color: $color-lowgray; } .maputnik-filter-editor-property { display: inline-block; - width: '22%'; + width: 25%; } .maputnik-filter-editor-operator { - display: inline-block; - width: 19%; margin-left: 2%; + display: inline-block; + width: 17%; + + .maputnik-select { + width: 100%; + } } .maputnik-filter-editor-args { display: inline-block; width: 54%; margin-left: 2%; + + .maputnik-string, + .maputnik-number { + width: 100%; + } } .maputnik-filter-editor-compound-select { @@ -40,10 +50,6 @@ color: $color-midgray; } -.maputnik-filter-editor { - @extend .clearfix; -} - .maputnik-add-filter { display: inline-block; float: right; @@ -57,9 +63,6 @@ .maputnik-filter-editor-block-action { margin-top: $margin-2; margin-bottom: $margin-2; -} - -.maputnik-filter-editor-block-action { display: inline-block; width: 6%; margin-right: 1.5%; @@ -70,27 +73,3 @@ width: 92.5%; } -.maputnik-filter-editor-property { - display: inline-block; - width: 25%; -} - -.maputnik-filter-editor-operator { - display: inline-block; - width: 17%; - - .maputnik-select { - width: 100%; - } -} - -.maputnik-filter-editor-args { - display: inline-block; - width: 54%; - - .maputnik-string, - .maputnik-number { - width: 100%; - } -} - diff --git a/src/styles/_toolbar.scss b/src/styles/_toolbar.scss index cf71aa31..8e9e428a 100644 --- a/src/styles/_toolbar.scss +++ b/src/styles/_toolbar.scss @@ -10,6 +10,7 @@ } .maputnik-toolbar-logo { + flex: 0 0 170px; width: 180px; text-align: left; background-color: $color-black; @@ -67,10 +68,6 @@ margin-left: $margin-1; } -.maputnik-toolbar-logo { - flex: 0 0 170px; -} - .maputnik-toolbar__inner { display: flex; } diff --git a/src/styles/_zoomproperty.scss b/src/styles/_zoomproperty.scss index d6510c9b..6911cb95 100644 --- a/src/styles/_zoomproperty.scss +++ b/src/styles/_zoomproperty.scss @@ -64,10 +64,6 @@ margin-right: $margin-3; } -.maputnik-zoom-spec-property .maputnik-input-block:not(:first-child) .maputnik-input-block-label { - visibility: hidden; -} - // DATA FUNC .maputnik-make-data-function { background-color: transparent; @@ -79,16 +75,15 @@ @extend .maputnik-icon-button; } -// DATA PROPERTY -.maputnik-data-spec-block { - overflow: auto; -} - .maputnik-data-spec-property { .maputnik-input-block-label { width: 30%; } + .maputnik-input-block:not(:first-child) .maputnik-input-block-label { + visibility: hidden; + } + .maputnik-input-block-content { width: 70%; } @@ -117,6 +112,8 @@ } .maputnik-data-spec-block { + overflow: auto; + .maputnik-data-spec-property-stop-edit, .maputnik-data-spec-property-stop-data { display: inline-block; From 334932b2981c15fa8d1869592248683b1614f29a Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 20 Apr 2018 14:53:51 +0100 Subject: [PATCH 057/134] 1.2.0-beta --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84a50627..1a7d5159 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.1.0", + "version": "1.2.0-beta", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5ae4e4f4..5f30ed5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.1.0", + "version": "1.2.0-beta", "description": "A MapboxGL visual style editor", "main": "''", "scripts": { From 5bd25fc2ed293232adc75ef3651b0864268dfb93 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 20 Apr 2018 15:09:37 +0100 Subject: [PATCH 058/134] Fix to allow beta version strings to not wrap. --- src/styles/_toolbar.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/styles/_toolbar.scss b/src/styles/_toolbar.scss index 8e9e428a..a76c708c 100644 --- a/src/styles/_toolbar.scss +++ b/src/styles/_toolbar.scss @@ -10,7 +10,7 @@ } .maputnik-toolbar-logo { - flex: 0 0 170px; + flex: 0 0 180px; width: 180px; text-align: left; background-color: $color-black; @@ -53,6 +53,7 @@ font-size: 10px; bottom: -2px; margin-left: 4px; + white-space: nowrap; } .maputnik-toolbar-action { From dbcfb08c15ecd63307cf247ffdede400caff0326 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 20 Apr 2018 15:31:00 +0100 Subject: [PATCH 059/134] 1.2.0-beta2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a7d5159..fcf9f68a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.2.0-beta", + "version": "1.2.0-beta2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5f30ed5e..816612cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.2.0-beta", + "version": "1.2.0-beta2", "description": "A MapboxGL visual style editor", "main": "''", "scripts": { From 3487056c7dd9b4931b75507132f053780e900963 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 8 May 2018 15:21:14 +0100 Subject: [PATCH 060/134] Disable gist, see --- src/components/modals/ExportModal.jsx | 2 +- src/styles/_base.scss | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/modals/ExportModal.jsx b/src/components/modals/ExportModal.jsx index 1fe1329b..c897a494 100644 --- a/src/components/modals/ExportModal.jsx +++ b/src/components/modals/ExportModal.jsx @@ -258,7 +258,7 @@ class ExportModal extends React.Component {
-
+

Save style

diff --git a/src/styles/_base.scss b/src/styles/_base.scss index b3273d4e..ce411725 100644 --- a/src/styles/_base.scss +++ b/src/styles/_base.scss @@ -76,3 +76,7 @@ label:hover { a { color: white; } + +.hide { + display: none !important; +} From 502586e5d56e98cfe9c887a603647bda711a7eca Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 8 May 2018 16:11:13 +0100 Subject: [PATCH 061/134] 1.2.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index fcf9f68a..5e04b6ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.2.0-beta2", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 816612cd..e3905308 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.2.0-beta2", + "version": "1.2.0", "description": "A MapboxGL visual style editor", "main": "''", "scripts": { From 32db3c3c9b7262ad4462fc8d25c9a76150b1476b Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 8 May 2018 17:23:03 +0100 Subject: [PATCH 062/134] Added build-osx-node-v9 to CircleCI --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1bf8bb3e..c65378dd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -81,4 +81,5 @@ workflows: - build-linux-node-v6 - build-linux-node-v8 - build-linux-node-v9 + - build-osx-node-v9 From 8e7b838bf7d1a0c10f6b4a8412881a8e0a8ab8b7 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 8 May 2018 17:30:42 +0100 Subject: [PATCH 063/134] Altered versions for node.js release schedule See --- .circleci/config.yml | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c65378dd..b488aab4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -60,18 +60,34 @@ jobs: - image: selenium/standalone-chrome:3.8.1 working_directory: ~/repo-linux-node-v8 steps: *wdio-steps - build-linux-node-v9: + build-linux-node-v10: docker: - - image: node:9 - working_directory: ~/repo-linux-node-v9 + - image: node:10 + working_directory: ~/repo-linux-node-v10 + steps: *build-steps + build-osx-node-v6: + macos: + xcode: "9.0" + dependencies: + override: + - brew install node@6 + working_directory: ~/repo-linux-node-v6 + steps: *build-steps + build-osx-node-v8: + macos: + xcode: "9.0" + dependencies: + override: + - brew install node@8 + working_directory: ~/repo-linux-node-v8 steps: *build-steps build-osx-node-v9: macos: xcode: "9.0" dependencies: override: - - brew install node@9 - working_directory: ~/repo-linux-node-v9 + - brew install node@10 + working_directory: ~/repo-linux-node-v10 steps: *build-steps workflows: @@ -80,6 +96,8 @@ workflows: jobs: - build-linux-node-v6 - build-linux-node-v8 - - build-linux-node-v9 - - build-osx-node-v9 + - build-linux-node-v10 + - build-osx-node-v6 + - build-osx-node-v8 + - build-osx-node-v10 From e9aa1f6dd6e72c8b8057680744b51d53d759ae1e Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 8 May 2018 17:34:09 +0100 Subject: [PATCH 064/134] Fixed typo --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b488aab4..9d16b64c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -81,7 +81,7 @@ jobs: - brew install node@8 working_directory: ~/repo-linux-node-v8 steps: *build-steps - build-osx-node-v9: + build-osx-node-v10: macos: xcode: "9.0" dependencies: From 8abf84ebc0fdb99242d68783ce5de0783a7b1c52 Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 9 May 2018 09:39:03 +0100 Subject: [PATCH 065/134] Updated deps. --- package-lock.json | 375 ++++++++++++++++++++-------------------------- package.json | 12 +- 2 files changed, 169 insertions(+), 218 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e04b6ca..93ad1293 100644 --- a/package-lock.json +++ b/package-lock.json @@ -286,6 +286,11 @@ "resolved": "https://registry.npmjs.org/@mapbox/gl-matrix/-/gl-matrix-0.0.1.tgz", "integrity": "sha1-5RJqq01kw2uBx6l9CuDd3eV3PSs=" }, + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.1.tgz", + "integrity": "sha512-LGegvJq+ks4UFnEAvtAhygFRZxaNg2vw7PsvLOAXY8ziJLv5aFDSdHDEMJA/Q8PG5dNhMioUvo0kNqb7U5dPoQ==" + }, "@mapbox/mapbox-gl-rtl-text": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-rtl-text/-/mapbox-gl-rtl-text-0.1.2.tgz", @@ -297,7 +302,7 @@ "integrity": "sha512-4l/q05NO26u2HmkjIKpFsMs2Ed56wd+w9nC8pXAVVsBZBG+LHwynJZyg6Ijy/6gLyp+nnmLFtzkXFfneuFCIjw==", "requires": { "@mapbox/unitbezier": "0.0.0", - "brfs": "1.5.0", + "brfs": "1.6.1", "bubleify": "0.7.0", "csscolorparser": "1.0.3", "in-publish": "2.0.0", @@ -320,9 +325,9 @@ } }, "@mapbox/mapbox-gl-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.3.0.tgz", - "integrity": "sha512-ACfuqIMxAzIoKRp3e7J2VjTJFBbrOoXqt4b7vy1x5uz5Od5Drroe2Ei/+R416eKpTXE1L0zHq5D2m3Q+SyM9WQ==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.3.1.tgz", + "integrity": "sha512-tMdtbKjxVaA3WZubFTKIPjAHKNz8PCqUGdRgT7RIpqLHLxZi3eQWzixrnyYA5dglEnbfcIEPvtRQu/4yXPt2YQ==" }, "@mapbox/point-geometry": { "version": "0.1.0", @@ -501,7 +506,8 @@ "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true }, "ansi-escapes": { "version": "3.0.0", @@ -525,6 +531,11 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=" + }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", @@ -805,9 +816,9 @@ } }, "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { "babel-code-frame": "6.26.0", @@ -2054,7 +2065,7 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", + "babel-core": "6.26.3", "babel-runtime": "6.26.0", "core-js": "2.5.3", "home-or-tmp": "2.0.0", @@ -2354,13 +2365,13 @@ } }, "brfs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.5.0.tgz", - "integrity": "sha512-PscWJn5IGjcK5g5lqEeRPYJ5efZk93YbopLu6UXZcb9dPZUfMN/UMyyT/tddpi7A9yIDM9TEdCOA3A4WGST1hg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "requires": { "quote-stream": "1.0.2", "resolve": "1.5.0", - "static-module": "2.2.0", + "static-module": "2.2.4", "through2": "2.0.3" } }, @@ -2370,6 +2381,12 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "browserify-aes": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", @@ -2406,11 +2423,6 @@ "inherits": "2.0.3" } }, - "browserify-package-json": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-package-json/-/browserify-package-json-1.0.1.tgz", - "integrity": "sha1-mN3oqlxWH9bT/km7qhArdLOW/eo=" - }, "browserify-rsa": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", @@ -2609,17 +2621,6 @@ } } }, - "call-matcher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", - "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", - "requires": { - "core-js": "2.5.3", - "deep-equal": "1.0.1", - "espurify": "1.7.0", - "estraverse": "4.2.0" - } - }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -2716,6 +2717,15 @@ "integrity": "sha512-A8ITSmH5SFdMFdC704ggjg+x2z5PzQmVlG8tavwnfvbC33Q1UYrj0+G+Xm0SNAnd4He36fwUE/KEWytOEchw+A==", "dev": true }, + "cardinal": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.4.tgz", + "integrity": "sha1-ylu2iltRG5D+k7ms6km97lwyv+I=", + "requires": { + "ansicolors": "0.2.1", + "redeyed": "0.4.4" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -3099,9 +3109,9 @@ "dev": true }, "codemirror": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.36.0.tgz", - "integrity": "sha512-XGR+ic+9DSMSE4mD2XLinGrMcIO4xbHpNrPzAFpCW5bjy+Em8fUOTCpagVP/+LLtTQsAROqrq1f55KyRxDcokA==" + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.37.0.tgz", + "integrity": "sha512-dQaayDJCLU4UJcwg2RM44oFrs0dMNndTp6qxQJF6XI71l1xN3RB4IqiKES0b0rccbARbrD/UBB4t8DNknfaOTw==" }, "collapse-white-space": { "version": "1.0.4", @@ -3811,7 +3821,8 @@ "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true }, "deep-is": { "version": "0.1.3", @@ -3947,6 +3958,12 @@ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=" }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "diffie-hellman": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", @@ -4656,14 +4673,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" }, - "espurify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", - "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", - "requires": { - "core-js": "2.5.3" - } - }, "esquery": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", @@ -4817,6 +4826,11 @@ "fill-range": "2.2.3" } }, + "expect.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.2.0.tgz", + "integrity": "sha1-EChTPSwcNj90pnlv9X7AUg3tK+E=" + }, "express": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", @@ -6559,13 +6573,14 @@ } }, "geojson-rewind": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/geojson-rewind/-/geojson-rewind-0.3.0.tgz", - "integrity": "sha512-5dsjiZGk6p///Ju9kh7uGW+I74CZriHsxqBNPbIN4bbInfKmHwwM+f8fZ42fmpV5emeUYLTTC+GWs3EC1TMjNQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/geojson-rewind/-/geojson-rewind-0.3.1.tgz", + "integrity": "sha1-IiQHl8hHzC8MHTE+SqDJFa+n8p0=", "requires": { "@mapbox/geojson-area": "0.2.2", "concat-stream": "1.6.1", - "minimist": "1.2.0" + "minimist": "1.2.0", + "sharkdown": "0.1.0" }, "dependencies": { "minimist": { @@ -6576,9 +6591,9 @@ } }, "geojson-vt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.0.0.tgz", - "integrity": "sha512-FL7VV56gYBDBh0F7EWyZV5G9/L2EHEHh9SyhEpJz4c8YDPerM6dnP9VbRcsbyg1wH+1oyoHRA9dlJkGs/IXULA==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.1.1.tgz", + "integrity": "sha512-Idr9VfV+EtycnleWLKgYbTFAthfE1V700eCqTlC6P2ODh715fTp4cCQYleYh3TPLzlzn2K4Gk514TstsoDue9w==" }, "get-caller-file": { "version": "1.0.2", @@ -8576,9 +8591,9 @@ "dev": true }, "magic-string": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", - "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "requires": { "vlq": "0.2.3" } @@ -8614,29 +8629,27 @@ } }, "mapbox-gl": { - "version": "0.44.2", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-0.44.2.tgz", - "integrity": "sha512-UzrfDEit6pX+HSj5qQTDG633JiF4JKn1MD8vz58S7kAnGRqnnSfFc7rrSVXZ/E6G5SFKsfESURUbLLuGkOcfWA==", + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-0.45.0.tgz", + "integrity": "sha1-r3HMgk8NflHM1cUF6q5BG8CRDM0=", "requires": { "@mapbox/gl-matrix": "0.0.1", - "@mapbox/mapbox-gl-supported": "1.3.0", + "@mapbox/jsonlint-lines-primitives": "2.0.1", + "@mapbox/mapbox-gl-supported": "1.3.1", "@mapbox/point-geometry": "0.1.0", "@mapbox/shelf-pack": "3.1.0", "@mapbox/tiny-sdf": "1.1.0", "@mapbox/unitbezier": "0.0.0", "@mapbox/vector-tile": "1.3.1", "@mapbox/whoots-js": "3.0.0", - "brfs": "1.5.0", - "bubleify": "0.7.0", + "brfs": "1.6.1", "csscolorparser": "1.0.3", "earcut": "2.1.3", - "geojson-rewind": "0.3.0", - "geojson-vt": "3.0.0", + "geojson-rewind": "0.3.1", + "geojson-vt": "3.1.1", "gray-matter": "3.1.1", "grid-index": "1.0.0", - "jsonlint-lines-primitives": "1.6.0", "minimist": "0.0.8", - "package-json-versionify": "1.0.4", "pbf": "3.1.0", "quickselect": "1.0.1", "rw": "1.3.3", @@ -8645,21 +8658,7 @@ "supercluster": "2.3.0", "through2": "2.0.3", "tinyqueue": "1.2.3", - "unassertify": "2.1.0", - "unflowify": "1.0.1", - "vt-pbf": "3.1.0", - "webworkify": "1.5.0" - }, - "dependencies": { - "jsonlint-lines-primitives": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/jsonlint-lines-primitives/-/jsonlint-lines-primitives-1.6.0.tgz", - "integrity": "sha1-u4n2DIubYS/ZE92qI2ZJuEDYZhE=", - "requires": { - "JSV": "4.0.2", - "nomnom": "1.8.1" - } - } + "vt-pbf": "3.1.0" } }, "mapbox-gl-inspect": { @@ -8676,49 +8675,6 @@ "resolved": "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.1.0.tgz", "integrity": "sha512-hJ1cKkvdJ21qbBLxGk/IXQvvMIeHRSMatWIjc5UbpM4KTTOfl2V18UvqqxFd82VpA1fZ+IP7WSa2RvSwYRE02g==" }, - "mapbox-to-ol-style": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/mapbox-to-ol-style/-/mapbox-to-ol-style-3.4.0.tgz", - "integrity": "sha512-88N8kUt2Zs6MbstQdrfZV1YthTa/B5SIwTB2IgkeexdnT108CphTdz5gPCRYiKhEkoLmkw+vThjipl9rsBOwMA==", - "requires": { - "@mapbox/mapbox-gl-style-spec": "9.0.1", - "mapbox-to-css-font": "2.1.0", - "ol": "4.6.5" - }, - "dependencies": { - "@mapbox/mapbox-gl-style-spec": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-9.0.1.tgz", - "integrity": "sha512-j3qgGIk1LDYlDOo7VGEge5o/rHkhW4Z+w9fSdgbq8ZEg8KkXdxlDZeUbeaO14s4n0ML6Nz7hSF8JNlwYXl8R7A==", - "requires": { - "csscolorparser": "1.0.3", - "jsonlint-lines-primitives": "1.6.0", - "lodash.isequal": "3.0.4", - "minimist": "0.0.8", - "rw": "1.3.3", - "sort-object": "0.3.2" - } - }, - "jsonlint-lines-primitives": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/jsonlint-lines-primitives/-/jsonlint-lines-primitives-1.6.0.tgz", - "integrity": "sha1-u4n2DIubYS/ZE92qI2ZJuEDYZhE=", - "requires": { - "JSV": "4.0.2", - "nomnom": "1.8.1" - } - }, - "lodash.isequal": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-3.0.4.tgz", - "integrity": "sha1-HDXrO27wzR/1F0Pj6jz3/f/ay2Q=", - "requires": { - "lodash._baseisequal": "3.0.7", - "lodash._bindcallback": "3.0.1" - } - } - } - }, "maputnik-design": { "version": "github:maputnik/design#afd4550db2a1562159092a858be181b5baa221f7" }, @@ -9041,9 +8997,9 @@ } }, "mocha": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.0.tgz", - "integrity": "sha512-d6RWgYPILd+AoWVOxiD0UwUqRicnE1inTxMr40CXOgqYve1MvnKntoLAtLIcxjEeVjEoYYTe5QAq3mUc6/ySjQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.1.tgz", + "integrity": "sha512-kKKs/H1KrMMQIEsWNxGmb4/BGsmj0dkeyotEvbrAuQ01FcWRLssUNXCEUZk6SZtyJBi6EE7SL0zDDtItw1rGhw==", "dev": true, "requires": { "browser-stdout": "1.3.1", @@ -9059,12 +9015,6 @@ "supports-color": "4.4.0" }, "dependencies": { - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", @@ -9080,12 +9030,6 @@ "ms": "2.0.0" } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -9127,24 +9071,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "multi-stage-sourcemap": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz", - "integrity": "sha1-sJ/IWG6qF/gdV1xK0C4Pej9rEQU=", - "requires": { - "source-map": "0.1.43" - }, - "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "requires": { - "amdefine": "1.0.1" - } - } - } - }, "multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", @@ -9357,9 +9283,9 @@ } }, "node-sass": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.8.3.tgz", - "integrity": "sha512-tfFWhUsCk/Y19zarDcPo5xpj+IW3qCfOjVdHtYeG6S1CKbQOh1zqylnQK6cV3z9k80yxAnFX9Y+a9+XysDhhfg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz", + "integrity": "sha512-QFHfrZl6lqRU3csypwviz2XLgGNOoWQbo2GOvtsfQqOfL4cy1BtWnhx/XUeAO9LT3ahBzSRXcEO6DdvAH9DzSg==", "dev": true, "requires": { "async-foreach": "0.1.3", @@ -10051,14 +9977,12 @@ } }, "ol-mapbox-style": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-2.10.1.tgz", - "integrity": "sha512-lI2mY811TnWgdI7EO/nmzSMe/7oqjLnYK2QS4tVCD0+5hjMduc0HHdNbdGxam4L3TJp0firnu1nzgq94QJZD5g==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-2.11.2.tgz", + "integrity": "sha512-5tmxuP2RapS1ntBWjtdYLYmktp+lPr89vZL1RAgPfkXgrT1mscwVzS9O+t2gTPmPvH1Q1nd42gLkgyBemPB2Qg==", "requires": { "@mapbox/mapbox-gl-style-spec": "9.0.1", "mapbox-to-css-font": "2.1.0", - "mapbox-to-ol-style": "3.4.0", - "ol": "4.6.5", "webfont-matcher": "1.1.0" }, "dependencies": { @@ -10267,14 +10191,6 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "package-json-versionify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/package-json-versionify/-/package-json-versionify-1.0.4.tgz", - "integrity": "sha1-WGBYepRIc6a35tJujlH/siMVvxc=", - "requires": { - "browserify-package-json": "1.0.1" - } - }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -11871,6 +11787,21 @@ "strip-indent": "1.0.1" } }, + "redeyed": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", + "integrity": "sha1-N+mQpvKyGyoRwuakj9QTVpjLqX8=", + "requires": { + "esprima": "1.0.4" + }, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + } + } + }, "reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", @@ -12802,6 +12733,26 @@ "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" }, + "sharkdown": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/sharkdown/-/sharkdown-0.1.0.tgz", + "integrity": "sha1-YdT+Up510CRCEnzJI0NiJlCZIU8=", + "requires": { + "cardinal": "0.4.4", + "expect.js": "0.2.0", + "minimist": "0.0.5", + "split": "0.2.10", + "stream-spigot": "2.1.2", + "through": "2.3.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz", + "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=" + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -13348,6 +13299,14 @@ "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", "dev": true }, + "split": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", + "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "requires": { + "through": "2.3.8" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -13500,9 +13459,9 @@ } }, "static-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.0.tgz", - "integrity": "sha512-LSwwmrb1QBl3WJa3R9J4AkqrNtp+uvA0n0m+SJMkUyCnTPX/l69gT4Xq/LFZY12VS4rB9Qf9agN/8farqpR/Rw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.4.tgz", + "integrity": "sha512-qlzhn8tYcfLsXK2RTWtkx1v/cqiPtS9eFy+UmQ9UnpEDYcwtgbceOybnKp5JncsOnLI/pyGeyzI9Bej9tv0xiA==", "requires": { "concat-stream": "1.6.1", "convert-source-map": "1.5.1", @@ -13510,7 +13469,7 @@ "escodegen": "1.9.1", "falafel": "2.1.0", "has": "1.0.1", - "magic-string": "0.22.4", + "magic-string": "0.22.5", "merge-source-map": "1.0.4", "object-inspect": "1.4.1", "quote-stream": "1.0.2", @@ -13573,6 +13532,37 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "stream-spigot": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/stream-spigot/-/stream-spigot-2.1.2.tgz", + "integrity": "sha1-feFF6Bn43Q20UJDRPc9zqO08wDU=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -14731,40 +14721,6 @@ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" }, - "unassert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.5.1.tgz", - "integrity": "sha1-y8iOw4dBfFpeTALTzQe+mL11/3Y=", - "requires": { - "acorn": "4.0.13", - "call-matcher": "1.0.1", - "deep-equal": "1.0.1", - "espurify": "1.7.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } - } - }, - "unassertify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unassertify/-/unassertify-2.1.0.tgz", - "integrity": "sha512-CB3C3vbOwrZydRuGdU8H421r4/qhM8RLuEOo3G+wEFf7kDP4TR+7oDuj1yOik5pUzXMaJmzxICM7akupP1AlJw==", - "requires": { - "acorn": "5.5.0", - "convert-source-map": "1.5.1", - "escodegen": "1.9.1", - "multi-stage-sourcemap": "0.2.1", - "through": "2.3.8", - "unassert": "1.5.1" - } - }, "underscore": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", @@ -15668,7 +15624,7 @@ "dev": true, "requires": { "babel-runtime": "6.26.0", - "mocha": "5.1.0", + "mocha": "5.1.1", "wdio-sync": "0.7.1" } }, @@ -16746,11 +16702,6 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, - "webworkify": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/webworkify/-/webworkify-1.5.0.tgz", - "integrity": "sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g==" - }, "wgs84": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/wgs84/-/wgs84-0.0.0.tgz", diff --git a/package.json b/package.json index e3905308..5de85a29 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,10 @@ "license": "MIT", "homepage": "https://github.com/maputnik/editor#readme", "dependencies": { - "@mapbox/mapbox-gl-rtl-text": "^0.1.1", + "@mapbox/mapbox-gl-rtl-text": "^0.1.2", "@mapbox/mapbox-gl-style-spec": "^11.1.1", "classnames": "^2.2.5", - "codemirror": "^5.36.0", + "codemirror": "^5.37.0", "color": "^3.0.0", "file-saver": "^1.3.8", "github-api": "^3.0.0", @@ -33,7 +33,7 @@ "lodash.clonedeep": "^4.5.0", "lodash.isequal": "^4.5.0", "lodash.throttle": "^4.1.1", - "mapbox-gl": "^0.44.2", + "mapbox-gl": "^0.45.0", "mapbox-gl-inspect": "^1.3.1", "maputnik-design": "github:maputnik/design", "mousetrap": "^1.6.1", @@ -91,7 +91,7 @@ } }, "devDependencies": { - "babel-core": "^6.26.0", + "babel-core": "^6.26.3", "babel-eslint": "^8.2.3", "babel-loader": "7.1.4", "babel-plugin-istanbul": "^4.1.6", @@ -122,8 +122,8 @@ "istanbul-lib-coverage": "^1.2.0", "json-loader": "^0.5.7", "mkdirp": "^0.5.1", - "mocha": "^5.1.0", - "node-sass": "^4.8.3", + "mocha": "^5.1.1", + "node-sass": "^4.9.0", "nsp": "^3.1.0", "react-hot-loader": "^3.1.1", "sass-loader": "^7.0.1", From a41b25eea70d0ed1600d75d265dc0c6df073008f Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 10 May 2018 16:05:55 +0100 Subject: [PATCH 066/134] Added 'prefers-reduced-motion' css support. --- .../layers/CollapseReducedMotion.jsx | 35 +++++++++++++++++++ src/components/layers/LayerEditorGroup.jsx | 7 ++-- src/styles/_input.scss | 4 +++ src/styles/_layer.scss | 4 +++ 4 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 src/components/layers/CollapseReducedMotion.jsx diff --git a/src/components/layers/CollapseReducedMotion.jsx b/src/components/layers/CollapseReducedMotion.jsx new file mode 100644 index 00000000..f85f416b --- /dev/null +++ b/src/components/layers/CollapseReducedMotion.jsx @@ -0,0 +1,35 @@ +import React from 'react' +import PropTypes from 'prop-types' +import Collapse from 'react-collapse' +import lodash from 'lodash' + + +// Wait 3 seconds so when a use enables it they don't have to refresh the page. +const isReduceMotionEnabled = lodash.throttle(() => { + return window.matchMedia("(prefers-reduced-motion: reduce)").matches +}, 3000); + +export default class CollapseReducedMotion extends React.Component { + static propTypes = { + isActive: PropTypes.bool.isRequired, + children: PropTypes.element.isRequired + } + + render() { + if (isReduceMotionEnabled()) { + return ( +
+ {this.props.children} +
+ ) + } + else { + return ( + + {this.props.children} + + ) + } + } +} + diff --git a/src/components/layers/LayerEditorGroup.jsx b/src/components/layers/LayerEditorGroup.jsx index 46788769..867ab343 100644 --- a/src/components/layers/LayerEditorGroup.jsx +++ b/src/components/layers/LayerEditorGroup.jsx @@ -1,7 +1,8 @@ import React from 'react' import PropTypes from 'prop-types' -import Collapse from 'react-collapse' import Collapser from './Collapser' +import CollapseReducedMotion from './CollapseReducedMotion' + export default class LayerEditorGroup extends React.Component { static propTypes = { @@ -22,11 +23,11 @@ export default class LayerEditorGroup extends React.Component {
- +
{this.props.children}
-
+
} } diff --git a/src/styles/_input.scss b/src/styles/_input.scss index 89bbded2..bc9b27e5 100644 --- a/src/styles/_input.scss +++ b/src/styles/_input.scss @@ -126,6 +126,10 @@ border-width: 2px; border-color: $color-gray; transition: background-color 0.1s ease-out; + + @media screen and (prefers-reduced-motion: reduce) { + transition-duration: 0ms; + } } &-icon { diff --git a/src/styles/_layer.scss b/src/styles/_layer.scss index 08cbd457..e3855eab 100644 --- a/src/styles/_layer.scss +++ b/src/styles/_layer.scss @@ -43,6 +43,10 @@ -webkit-transition: opacity 600ms, visibility 600ms; transition: opacity 600ms, visibility 600ms; + @media screen and (prefers-reduced-motion: reduce) { + transition-duration: 0; + } + @include flex-row; } From 7b8b797f9cc216fdd12b615de9a6c869f4110b2d Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 10 May 2018 16:07:34 +0100 Subject: [PATCH 067/134] Fixed typo. --- src/components/layers/CollapseReducedMotion.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layers/CollapseReducedMotion.jsx b/src/components/layers/CollapseReducedMotion.jsx index f85f416b..28bfa9b9 100644 --- a/src/components/layers/CollapseReducedMotion.jsx +++ b/src/components/layers/CollapseReducedMotion.jsx @@ -4,7 +4,7 @@ import Collapse from 'react-collapse' import lodash from 'lodash' -// Wait 3 seconds so when a use enables it they don't have to refresh the page. +// Wait 3 seconds so when a user enables it they don't have to refresh the page. const isReduceMotionEnabled = lodash.throttle(() => { return window.matchMedia("(prefers-reduced-motion: reduce)").matches }, 3000); From 198ff143f6cfa45d53f640ff305fa7deb39c01ba Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 10 May 2018 16:18:13 +0100 Subject: [PATCH 068/134] Make color swatch larger so its easier to see. --- src/styles/_input.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/_input.scss b/src/styles/_input.scss index 89bbded2..6cb50de6 100644 --- a/src/styles/_input.scss +++ b/src/styles/_input.scss @@ -41,7 +41,7 @@ .maputnik-color-swatch { height: 26px; - width: 3px; + width: 14px; flex-shrink: 0; flex-grow: 0; } From c241a6e28045613ed717c36586cd833edd02d603 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 10 May 2018 16:30:23 +0100 Subject: [PATCH 069/134] Ignore 'prefers-reduced-motion' in stylelint --- package.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 5de85a29..7c17eab2 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,15 @@ "stylelint": { "extends": "stylelint-config-recommended-scss", "rules": { - "no-descending-specificity": null + "no-descending-specificity": null, + "media-feature-name-no-unknown": [ + true, + { + "ignoreMediaFeatureNames": [ + "prefers-reduced-motion" + ] + } + ] } }, "eslintConfig": { From 11d73595fcea7c290e4bbdea205d641208036aed Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 10 May 2018 16:50:37 +0100 Subject: [PATCH 070/134] Made buttons keyboard accessible. --- src/components/Toolbar.jsx | 4 ++-- src/components/layers/LayerList.jsx | 8 ++++---- src/styles/_components.scss | 1 + src/styles/_input.scss | 1 - src/styles/_toolbar.scss | 2 ++ 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx index efe47f68..caa1c5e8 100644 --- a/src/components/Toolbar.jsx +++ b/src/components/Toolbar.jsx @@ -63,13 +63,13 @@ class ToolbarAction extends React.Component { } render() { - return {this.props.children} - + } } diff --git a/src/components/layers/LayerList.jsx b/src/components/layers/LayerList.jsx index d0706ffe..a9b144fb 100644 --- a/src/components/layers/LayerList.jsx +++ b/src/components/layers/LayerList.jsx @@ -208,21 +208,21 @@ class LayerListContainer extends React.Component { diff --git a/src/styles/_components.scss b/src/styles/_components.scss index 6ac5ce51..048307de 100644 --- a/src/styles/_components.scss +++ b/src/styles/_components.scss @@ -53,6 +53,7 @@ font-size: $font-size-6; padding: $margin-2; user-select: none; + border-width: 0; border-radius: 2px; box-sizing: border-box; diff --git a/src/styles/_input.scss b/src/styles/_input.scss index 89bbded2..199fa364 100644 --- a/src/styles/_input.scss +++ b/src/styles/_input.scss @@ -91,7 +91,6 @@ .maputnik-button-selected { background-color: lighten($color-midgray, 12); - outline: 1px $color-white; color: white; } diff --git a/src/styles/_toolbar.scss b/src/styles/_toolbar.scss index a76c708c..b02c31f7 100644 --- a/src/styles/_toolbar.scss +++ b/src/styles/_toolbar.scss @@ -57,6 +57,8 @@ } .maputnik-toolbar-action { + background: inherit; + border-width: 0; @extend .maputnik-toolbar-link; } From 7cb2c36ac954f9fb1a2cadad8b49bf35df08673f Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 11 May 2018 09:32:57 +0100 Subject: [PATCH 071/134] Move accessibility checks into module. --- src/components/layers/CollapseReducedMotion.jsx | 9 ++------- src/libs/accessibility.js | 12 ++++++++++++ 2 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 src/libs/accessibility.js diff --git a/src/components/layers/CollapseReducedMotion.jsx b/src/components/layers/CollapseReducedMotion.jsx index 28bfa9b9..6a1b64e1 100644 --- a/src/components/layers/CollapseReducedMotion.jsx +++ b/src/components/layers/CollapseReducedMotion.jsx @@ -1,14 +1,9 @@ import React from 'react' import PropTypes from 'prop-types' import Collapse from 'react-collapse' -import lodash from 'lodash' +import accessibility from '../../libs/accessibility' -// Wait 3 seconds so when a user enables it they don't have to refresh the page. -const isReduceMotionEnabled = lodash.throttle(() => { - return window.matchMedia("(prefers-reduced-motion: reduce)").matches -}, 3000); - export default class CollapseReducedMotion extends React.Component { static propTypes = { isActive: PropTypes.bool.isRequired, @@ -16,7 +11,7 @@ export default class CollapseReducedMotion extends React.Component { } render() { - if (isReduceMotionEnabled()) { + if (accessibility.reducedMotionEnabled()) { return (
{this.props.children} diff --git a/src/libs/accessibility.js b/src/libs/accessibility.js new file mode 100644 index 00000000..095e9538 --- /dev/null +++ b/src/libs/accessibility.js @@ -0,0 +1,12 @@ +import lodash from 'lodash' + + +// Throttle for 3 seconds so when a user enables it they don't have to refresh the page. +const reducedMotionEnabled = lodash.throttle(() => { + return window.matchMedia("(prefers-reduced-motion: reduce)").matches +}, 3000); + + +export default { + reducedMotionEnabled +} From 221cd4ffd2dd34f77eb6cdea2db76f00e5653255 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 11 May 2018 10:55:32 +0100 Subject: [PATCH 072/134] Added accessible modal via react-aria-modal --- package-lock.json | 51 +++++++++++++++++++++++++------ package.json | 1 + src/components/Button.jsx | 4 +-- src/components/modals/Modal.jsx | 51 ++++++++++++++++++++----------- src/components/modals/Overlay.jsx | 24 --------------- src/styles/_modal.scss | 26 +--------------- 6 files changed, 78 insertions(+), 79 deletions(-) delete mode 100644 src/components/modals/Overlay.jsx diff --git a/package-lock.json b/package-lock.json index 93ad1293..44661bb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5598,6 +5598,22 @@ "readable-stream": "2.3.5" } }, + "focus-trap": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-2.4.4.tgz", + "integrity": "sha512-tut5fKeBRY4ZmNoygXNRL0xg2KppL1S+zsT+1L7cbB/D7hymKsHR8kJk+8mbYSySfYFzxoENQ+knkWLj4l1h/Q==", + "requires": { + "tabbable": "1.1.3" + } + }, + "focus-trap-react": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-3.1.2.tgz", + "integrity": "sha512-MoQmONoy9gRPyrC5DGezkcOMGgx7MtIOAQDHe098UtL2sA2vmucJwEmQisb+8LRXNYFHxuw5zJ1oLFeKu4Mteg==", + "requires": { + "focus-trap": "2.4.4" + } + }, "follow-redirects": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", @@ -8193,13 +8209,6 @@ "graceful-fs": "4.1.11" } }, - "jsonlint": { - "version": "github:josdejong/jsonlint#85a19d77126771f3177582e3d09c6ffae185d391", - "requires": { - "JSV": "4.0.2", - "nomnom": "1.8.1" - } - }, "jsonpointer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", @@ -8675,9 +8684,6 @@ "resolved": "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.1.0.tgz", "integrity": "sha512-hJ1cKkvdJ21qbBLxGk/IXQvvMIeHRSMatWIjc5UbpM4KTTOfl2V18UvqqxFd82VpA1fZ+IP7WSa2RvSwYRE02g==" }, - "maputnik-design": { - "version": "github:maputnik/design#afd4550db2a1562159092a858be181b5baa221f7" - }, "markdown-escapes": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.1.tgz", @@ -9199,6 +9205,11 @@ "lower-case": "1.1.4" } }, + "no-scroll": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/no-scroll/-/no-scroll-2.1.1.tgz", + "integrity": "sha512-YTzGAJOo/B6hkodeT5SKKHpOhAzjMfkUCCXjLJwjWk2F4/InIg+HbdH9kmT7bKpleDuqLZDTRy2OdNtAj0IVyQ==" + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -11530,6 +11541,16 @@ "object-assign": "4.1.1" } }, + "react-aria-modal": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/react-aria-modal/-/react-aria-modal-2.12.1.tgz", + "integrity": "sha512-38/O/4F2zpDycZgz8CSqIeDLORspJK8sJtNiq/9VZ1asnX4imVJMUNIpZEfzSch69e2XHJoQMFUOlccHgX0J/Q==", + "requires": { + "focus-trap-react": "3.1.2", + "no-scroll": "2.1.1", + "react-displace": "2.3.0" + } + }, "react-autocomplete": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/react-autocomplete/-/react-autocomplete-1.8.1.tgz", @@ -11579,6 +11600,11 @@ "integrity": "sha1-jqQmPNZFWgULN0RbPwj9g52G6Qk=", "dev": true }, + "react-displace": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-displace/-/react-displace-2.3.0.tgz", + "integrity": "sha512-T8g/lyn3IX8kxLO4k4vJ/oIO9G72pRTc9GYslqKsfPcN4gY5+FYR5OHxeTH1skPjVylJrveGE3OC2qCt3BuHeA==" + }, "react-dom": { "version": "16.3.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz", @@ -14253,6 +14279,11 @@ "upper-case": "1.1.3" } }, + "tabbable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-1.1.3.tgz", + "integrity": "sha512-nOWwx35/JuDI4ONuF0ZTo6lYvI0fY0tZCH1ErzY2EXfu4az50ZyiUX8X073FLiZtmWUVlkRnuXsehjJgCw9tYg==" + }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", diff --git a/package.json b/package.json index 5de85a29..fc8f058b 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "prop-types": "^15.6.0", "react": "^16.3.2", "react-addons-pure-render-mixin": "^15.6.2", + "react-aria-modal": "^2.12.1", "react-autocomplete": "^1.7.2", "react-codemirror2": "^4.2.1", "react-collapse": "^4.0.3", diff --git a/src/components/Button.jsx b/src/components/Button.jsx index b1189c17..0815368c 100644 --- a/src/components/Button.jsx +++ b/src/components/Button.jsx @@ -12,13 +12,13 @@ class Button extends React.Component { } render() { - return {this.props.children} - + } } diff --git a/src/components/modals/Modal.jsx b/src/components/modals/Modal.jsx index 1b1e2dad..34acf3e5 100644 --- a/src/components/modals/Modal.jsx +++ b/src/components/modals/Modal.jsx @@ -1,7 +1,8 @@ import React from 'react' import PropTypes from 'prop-types' import CloseIcon from 'react-icons/lib/md/close' -import Overlay from './Overlay' +import AriaModal from 'react-aria-modal' + class Modal extends React.Component { static propTypes = { @@ -12,26 +13,40 @@ class Modal extends React.Component { children: PropTypes.node, } + getApplicationNode() { + return document.getElementById('app'); + } + render() { - return -
this.props.onOpenToggle(false)} > -
-

{this.props.title}

- - this.props.onOpenToggle(false)} - data-wd-key={this.props["data-wd-key"]+".close-modal"} - > - - -
-
-
{this.props.children}
+ -
- + + } + else { + return false; + } } } diff --git a/src/components/modals/Overlay.jsx b/src/components/modals/Overlay.jsx deleted file mode 100644 index 75374785..00000000 --- a/src/components/modals/Overlay.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' - - -class Overlay extends React.Component { - static propTypes = { - isOpen: PropTypes.bool.isRequired, - children: PropTypes.element.isRequired - } - - render() { - let overlayStyle = {} - if(!this.props.isOpen) { - overlayStyle['display'] = 'none'; - } - - return
-
- {this.props.children} -
- } -} - -export default Overlay diff --git a/src/styles/_modal.scss b/src/styles/_modal.scss index 897a836f..883b151e 100644 --- a/src/styles/_modal.scss +++ b/src/styles/_modal.scss @@ -7,6 +7,7 @@ box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3); z-index: 3; position: relative; + font-family: $font-family; } .maputnik-modal-section { @@ -60,31 +61,6 @@ @extend .maputnik-space; } -//OVERLAY -.maputnik-overlay-viewport { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - opacity: 0.875; - background-color: rgb(28, 31, 36); -} - -.maputnik-overlay { - top: 0; - right: 0; - bottom: 0; - left: 0; - position: fixed; - align-items: center; - justify-content: center; - z-index: 9; - - @include flex-row; -} - //OPEN MODAL .maputnik-upload-button { @extend .maputnik-big-button; From 54e79e5eb860231ca99dbbbb87ca315a402b93ca Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 11 May 2018 11:26:43 +0100 Subject: [PATCH 073/134] Added missing data-wd-key attribute. --- src/components/modals/Modal.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/modals/Modal.jsx b/src/components/modals/Modal.jsx index 34acf3e5..e2e24a3a 100644 --- a/src/components/modals/Modal.jsx +++ b/src/components/modals/Modal.jsx @@ -22,6 +22,7 @@ class Modal extends React.Component { return this.props.onOpenToggle(false)} > From b8f32d46cf68d97fc23b39934a9abcf409c08040 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 11 May 2018 14:03:46 +0100 Subject: [PATCH 074/134] Rename to --- .../layers/{CollapseReducedMotion.jsx => Collapse.jsx} | 2 +- src/components/layers/LayerEditorGroup.jsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/components/layers/{CollapseReducedMotion.jsx => Collapse.jsx} (90%) diff --git a/src/components/layers/CollapseReducedMotion.jsx b/src/components/layers/Collapse.jsx similarity index 90% rename from src/components/layers/CollapseReducedMotion.jsx rename to src/components/layers/Collapse.jsx index 6a1b64e1..a0981e19 100644 --- a/src/components/layers/CollapseReducedMotion.jsx +++ b/src/components/layers/Collapse.jsx @@ -4,7 +4,7 @@ import Collapse from 'react-collapse' import accessibility from '../../libs/accessibility' -export default class CollapseReducedMotion extends React.Component { +export default class Collapse extends React.Component { static propTypes = { isActive: PropTypes.bool.isRequired, children: PropTypes.element.isRequired diff --git a/src/components/layers/LayerEditorGroup.jsx b/src/components/layers/LayerEditorGroup.jsx index 867ab343..e132dd59 100644 --- a/src/components/layers/LayerEditorGroup.jsx +++ b/src/components/layers/LayerEditorGroup.jsx @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import Collapser from './Collapser' -import CollapseReducedMotion from './CollapseReducedMotion' +import Collapse from './Collapse' export default class LayerEditorGroup extends React.Component { @@ -23,11 +23,11 @@ export default class LayerEditorGroup extends React.Component {
- +
{this.props.children}
-
+
} } From 78d71a4e7e9357ef20d321eb072f7b0ab2d68e96 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 11 May 2018 14:52:48 +0100 Subject: [PATCH 075/134] Fixed duplicate definition. --- src/components/layers/Collapse.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layers/Collapse.jsx b/src/components/layers/Collapse.jsx index a0981e19..aeaa09b0 100644 --- a/src/components/layers/Collapse.jsx +++ b/src/components/layers/Collapse.jsx @@ -4,7 +4,7 @@ import Collapse from 'react-collapse' import accessibility from '../../libs/accessibility' -export default class Collapse extends React.Component { +export default class CollapseAlt extends React.Component { static propTypes = { isActive: PropTypes.bool.isRequired, children: PropTypes.element.isRequired From 4f19f6a08cb2192516c53ce58f088896da286114 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 17 May 2018 10:44:54 +0100 Subject: [PATCH 076/134] Added support for encoding to raster-dem source, enabling terrarium tiles. --- package-lock.json | 129 ++++-------------- package.json | 2 +- src/components/App.jsx | 2 +- src/components/filter/FilterEditor.jsx | 2 +- src/components/layers/LayerIdBlock.jsx | 2 +- src/components/layers/LayerSourceBlock.jsx | 2 +- .../layers/LayerSourceLayerBlock.jsx | 2 +- src/components/layers/LayerTypeBlock.jsx | 2 +- src/components/layers/MaxZoomBlock.jsx | 2 +- src/components/layers/MinZoomBlock.jsx | 2 +- src/components/modals/ExportModal.jsx | 2 +- src/components/modals/SettingsModal.jsx | 2 +- src/components/modals/SourcesModal.jsx | 2 +- src/components/sources/SourceTypeEditor.jsx | 102 +++++++++++++- src/libs/diffmessage.js | 2 +- src/libs/filterops.js | 2 +- src/libs/layer.js | 2 +- 17 files changed, 139 insertions(+), 122 deletions(-) diff --git a/package-lock.json b/package-lock.json index 93ad1293..4ee62e40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -297,31 +297,16 @@ "integrity": "sha512-x5xSHNAD5MeuasbEpGyDBGy4zPQysDdvDUlnjDKMxic8KqmcxcCP3ojlIaqEWYFvMmq7FKyWIF7K8jO4bHavKQ==" }, "@mapbox/mapbox-gl-style-spec": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-11.1.1.tgz", - "integrity": "sha512-4l/q05NO26u2HmkjIKpFsMs2Ed56wd+w9nC8pXAVVsBZBG+LHwynJZyg6Ijy/6gLyp+nnmLFtzkXFfneuFCIjw==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-12.0.0.tgz", + "integrity": "sha1-dRW/rbs6hZ66HFbZn8E4P6YpJ0c=", "requires": { + "@mapbox/jsonlint-lines-primitives": "2.0.1", "@mapbox/unitbezier": "0.0.0", - "brfs": "1.6.1", - "bubleify": "0.7.0", "csscolorparser": "1.0.3", - "in-publish": "2.0.0", - "jsonlint-lines-primitives": "1.6.0", "minimist": "0.0.8", "rw": "1.3.3", - "sort-object": "0.3.2", - "unflowify": "1.0.1" - }, - "dependencies": { - "jsonlint-lines-primitives": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/jsonlint-lines-primitives/-/jsonlint-lines-primitives-1.6.0.tgz", - "integrity": "sha1-u4n2DIubYS/ZE92qI2ZJuEDYZhE=", - "requires": { - "JSV": "4.0.2", - "nomnom": "1.8.1" - } - } + "sort-object": "0.3.2" } }, "@mapbox/mapbox-gl-supported": { @@ -418,6 +403,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, "requires": { "acorn": "3.3.0" }, @@ -425,22 +411,8 @@ "acorn": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - } - } - }, - "acorn-object-spread": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/acorn-object-spread/-/acorn-object-spread-1.0.0.tgz", - "integrity": "sha1-SOrQ9KjrFplaF6Dbn/xqyq2kumg=", - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true } } }, @@ -524,12 +496,14 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "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=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "ansicolors": { "version": "0.2.1", @@ -2128,7 +2102,8 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true }, "backo2": { "version": "1.0.2", @@ -2467,49 +2442,6 @@ "electron-to-chromium": "1.3.36" } }, - "buble": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/buble/-/buble-0.15.2.tgz", - "integrity": "sha1-VH/EdIP45egXbYKqXrzLGDsC1hM=", - "requires": { - "acorn": "3.3.0", - "acorn-jsx": "3.0.1", - "acorn-object-spread": "1.0.0", - "chalk": "1.1.3", - "magic-string": "0.14.0", - "minimist": "1.2.0", - "os-homedir": "1.0.2" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - }, - "magic-string": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.14.0.tgz", - "integrity": "sha1-VyJK7xcByu7Sc7F6OalW5ysXJGI=", - "requires": { - "vlq": "0.2.3" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "bubleify": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/bubleify/-/bubleify-0.7.0.tgz", - "integrity": "sha1-0I6mQv/Qhf+HEciEP1cHLw1euPY=", - "requires": { - "buble": "0.15.2", - "object-assign": "4.1.1" - } - }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -2751,6 +2683,7 @@ "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.5", @@ -4491,7 +4424,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "1.9.1", @@ -5579,15 +5513,6 @@ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", "dev": true }, - "flow-remove-types": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-1.2.3.tgz", - "integrity": "sha512-ypq/U3V+t9atYiOuSJd40tekCra03EHKoRsiK/wXGrsZimuum0kdwVY7Yv0HTaoXgHW1WiayomYd+Q3kkvPl9Q==", - "requires": { - "babylon": "6.18.0", - "vlq": "0.2.3" - } - }, "flush-write-stream": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", @@ -6857,6 +6782,7 @@ "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.1.1" } @@ -7395,7 +7321,8 @@ "in-publish": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true }, "indent-string": { "version": "2.1.0", @@ -10129,7 +10056,8 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-locale": { "version": "1.4.0", @@ -13625,6 +13553,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -14202,7 +14131,8 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "svg-tags": { "version": "1.0.0", @@ -14726,15 +14656,6 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" }, - "unflowify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unflowify/-/unflowify-1.0.1.tgz", - "integrity": "sha1-ouoNJcCv/MRpVeZHNXX3xaH0ppY=", - "requires": { - "flow-remove-types": "1.2.3", - "through": "2.3.8" - } - }, "unherit": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz", diff --git a/package.json b/package.json index 5de85a29..e021ba7a 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "homepage": "https://github.com/maputnik/editor#readme", "dependencies": { "@mapbox/mapbox-gl-rtl-text": "^0.1.2", - "@mapbox/mapbox-gl-style-spec": "^11.1.1", + "@mapbox/mapbox-gl-style-spec": "^12.0.0", "classnames": "^2.2.5", "codemirror": "^5.37.0", "color": "^3.0.0", diff --git a/src/components/App.jsx b/src/components/App.jsx index c985cc73..61b2ea7a 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -10,7 +10,7 @@ import AppLayout from './AppLayout' import MessagePanel from './MessagePanel' import { downloadGlyphsMetadata, downloadSpriteMetadata } from '../libs/metadata' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import style from '../libs/style.js' import { initialStyleUrl, loadStyleUrl } from '../libs/urlopen' import { undoMessages, redoMessages } from '../libs/diffmessage' diff --git a/src/components/filter/FilterEditor.jsx b/src/components/filter/FilterEditor.jsx index 02ee2a40..abbad2a5 100644 --- a/src/components/filter/FilterEditor.jsx +++ b/src/components/filter/FilterEditor.jsx @@ -2,7 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import { combiningFilterOps } from '../../libs/filterops.js' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import DocLabel from '../fields/DocLabel' import SelectInput from '../inputs/SelectInput' import SingleFilterEditor from './SingleFilterEditor' diff --git a/src/components/layers/LayerIdBlock.jsx b/src/components/layers/LayerIdBlock.jsx index d12e9d35..cebb298b 100644 --- a/src/components/layers/LayerIdBlock.jsx +++ b/src/components/layers/LayerIdBlock.jsx @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import StringInput from '../inputs/StringInput' diff --git a/src/components/layers/LayerSourceBlock.jsx b/src/components/layers/LayerSourceBlock.jsx index 5fb4a03a..3773f73d 100644 --- a/src/components/layers/LayerSourceBlock.jsx +++ b/src/components/layers/LayerSourceBlock.jsx @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import StringInput from '../inputs/StringInput' import AutocompleteInput from '../inputs/AutocompleteInput' diff --git a/src/components/layers/LayerSourceLayerBlock.jsx b/src/components/layers/LayerSourceLayerBlock.jsx index 950db551..804e93f4 100644 --- a/src/components/layers/LayerSourceLayerBlock.jsx +++ b/src/components/layers/LayerSourceLayerBlock.jsx @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import StringInput from '../inputs/StringInput' import AutocompleteInput from '../inputs/AutocompleteInput' diff --git a/src/components/layers/LayerTypeBlock.jsx b/src/components/layers/LayerTypeBlock.jsx index a579ee85..fce683d1 100644 --- a/src/components/layers/LayerTypeBlock.jsx +++ b/src/components/layers/LayerTypeBlock.jsx @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import SelectInput from '../inputs/SelectInput' diff --git a/src/components/layers/MaxZoomBlock.jsx b/src/components/layers/MaxZoomBlock.jsx index 98de68a6..d0257355 100644 --- a/src/components/layers/MaxZoomBlock.jsx +++ b/src/components/layers/MaxZoomBlock.jsx @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import NumberInput from '../inputs/NumberInput' diff --git a/src/components/layers/MinZoomBlock.jsx b/src/components/layers/MinZoomBlock.jsx index 4026a8cd..6729f5bc 100644 --- a/src/components/layers/MinZoomBlock.jsx +++ b/src/components/layers/MinZoomBlock.jsx @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import NumberInput from '../inputs/NumberInput' diff --git a/src/components/modals/ExportModal.jsx b/src/components/modals/ExportModal.jsx index c897a494..e75391da 100644 --- a/src/components/modals/ExportModal.jsx +++ b/src/components/modals/ExportModal.jsx @@ -2,7 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import { saveAs } from 'file-saver' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import StringInput from '../inputs/StringInput' import CheckboxInput from '../inputs/CheckboxInput' diff --git a/src/components/modals/SettingsModal.jsx b/src/components/modals/SettingsModal.jsx index 941a8189..3f8790dc 100644 --- a/src/components/modals/SettingsModal.jsx +++ b/src/components/modals/SettingsModal.jsx @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import StringInput from '../inputs/StringInput' import SelectInput from '../inputs/SelectInput' diff --git a/src/components/modals/SourcesModal.jsx b/src/components/modals/SourcesModal.jsx index b5db455b..c19a7b0b 100644 --- a/src/components/modals/SourcesModal.jsx +++ b/src/components/modals/SourcesModal.jsx @@ -1,6 +1,6 @@ import React from 'react' import PropTypes from 'prop-types' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import Modal from './Modal' import Button from '../Button' import InputBlock from '../inputs/InputBlock' diff --git a/src/components/sources/SourceTypeEditor.jsx b/src/components/sources/SourceTypeEditor.jsx index e415feac..403a9807 100644 --- a/src/components/sources/SourceTypeEditor.jsx +++ b/src/components/sources/SourceTypeEditor.jsx @@ -1,9 +1,105 @@ import React from 'react' import PropTypes from 'prop-types' -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import InputBlock from '../inputs/InputBlock' import StringInput from '../inputs/StringInput' import NumberInput from '../inputs/NumberInput' +import SelectInput from '../inputs/SelectInput' + +class DemJSONSourceEditor extends React.Component { + static propTypes = { + source: PropTypes.object.isRequired, + onChange: PropTypes.func.isRequired, + } + + render() { + return
+ + this.props.onChange({ + ...this.props.source, + url: url + })} + /> + + + this.props.onChange({ + ...this.props.source, + encoding: encoding + })} + value={this.props.source.encoding || styleSpec.latest.source_raster_dem.encoding.default} + /> + +
+ } +} + +class DemURLSourceEditor extends React.Component { + static propTypes = { + source: PropTypes.object.isRequired, + onChange: PropTypes.func.isRequired, + } + + changeTileUrl(idx, value) { + const tiles = this.props.source.tiles.slice(0) + tiles[idx] = value + this.props.onChange({ + ...this.props.source, + tiles: tiles + }) + } + + renderTileUrls() { + const prefix = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th'] + const tiles = this.props.source.tiles || [] + return tiles.map((tileUrl, tileIndex) => { + return + + + }) + } + + render() { + return
+ {this.renderTileUrls()} + + this.props.onChange({ + ...this.props.source, + minzoom: minzoom + })} + /> + + + this.props.onChange({ + ...this.props.source, + maxzoom: maxzoom + })} + /> + + + this.props.onChange({ + ...this.props.source, + encoding: encoding + })} + value={this.props.source.encoding || styleSpec.latest.source_raster_dem.encoding.default} + /> + +
+ + } +} class TileJSONSourceEditor extends React.Component { static propTypes = { @@ -115,8 +211,8 @@ class SourceTypeEditor extends React.Component { case 'tilexyz_vector': return case 'tilejson_raster': return case 'tilexyz_raster': return - case 'tilejson_raster-dem': return - case 'tilexyz_raster-dem': return + case 'tilejson_raster-dem': return + case 'tilexyz_raster-dem': return default: return null } } diff --git a/src/libs/diffmessage.js b/src/libs/diffmessage.js index 6536c3a4..1cb32668 100644 --- a/src/libs/diffmessage.js +++ b/src/libs/diffmessage.js @@ -1,4 +1,4 @@ -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' export function diffMessages(beforeStyle, afterStyle) { const changes = styleSpec.diff(beforeStyle, afterStyle) diff --git a/src/libs/filterops.js b/src/libs/filterops.js index 61613e88..156669c0 100644 --- a/src/libs/filterops.js +++ b/src/libs/filterops.js @@ -1,4 +1,4 @@ -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' export const combiningFilterOps = ['all', 'any', 'none'] export const setFilterOps = ['in', '!in'] export const otherFilterOps = Object diff --git a/src/libs/layer.js b/src/libs/layer.js index 8f9832ff..8e5edf34 100644 --- a/src/libs/layer.js +++ b/src/libs/layer.js @@ -1,4 +1,4 @@ -import styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' +import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' export function changeType(layer, newType) { const changedPaintProps = { ...layer.paint } From 79b251d8b970245ce10693c57f22bc50d3ffb2f4 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 17 May 2018 10:55:55 +0100 Subject: [PATCH 077/134] DRY up the code. --- src/components/sources/SourceTypeEditor.jsx | 131 ++++---------------- 1 file changed, 26 insertions(+), 105 deletions(-) diff --git a/src/components/sources/SourceTypeEditor.jsx b/src/components/sources/SourceTypeEditor.jsx index 403a9807..c55b46d2 100644 --- a/src/components/sources/SourceTypeEditor.jsx +++ b/src/components/sources/SourceTypeEditor.jsx @@ -6,100 +6,6 @@ import StringInput from '../inputs/StringInput' import NumberInput from '../inputs/NumberInput' import SelectInput from '../inputs/SelectInput' -class DemJSONSourceEditor extends React.Component { - static propTypes = { - source: PropTypes.object.isRequired, - onChange: PropTypes.func.isRequired, - } - - render() { - return
- - this.props.onChange({ - ...this.props.source, - url: url - })} - /> - - - this.props.onChange({ - ...this.props.source, - encoding: encoding - })} - value={this.props.source.encoding || styleSpec.latest.source_raster_dem.encoding.default} - /> - -
- } -} - -class DemURLSourceEditor extends React.Component { - static propTypes = { - source: PropTypes.object.isRequired, - onChange: PropTypes.func.isRequired, - } - - changeTileUrl(idx, value) { - const tiles = this.props.source.tiles.slice(0) - tiles[idx] = value - this.props.onChange({ - ...this.props.source, - tiles: tiles - }) - } - - renderTileUrls() { - const prefix = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th'] - const tiles = this.props.source.tiles || [] - return tiles.map((tileUrl, tileIndex) => { - return - - - }) - } - - render() { - return
- {this.renderTileUrls()} - - this.props.onChange({ - ...this.props.source, - minzoom: minzoom - })} - /> - - - this.props.onChange({ - ...this.props.source, - maxzoom: maxzoom - })} - /> - - - this.props.onChange({ - ...this.props.source, - encoding: encoding - })} - value={this.props.source.encoding || styleSpec.latest.source_raster_dem.encoding.default} - /> - -
- - } -} class TileJSONSourceEditor extends React.Component { static propTypes = { @@ -108,15 +14,18 @@ class TileJSONSourceEditor extends React.Component { } render() { - return - this.props.onChange({ - ...this.props.source, - url: url - })} - /> - + return
+ + this.props.onChange({ + ...this.props.source, + url: url + })} + /> + + {this.props.children} +
} } @@ -169,6 +78,7 @@ class TileURLSourceEditor extends React.Component { })} /> + {this.props.children}
} @@ -211,8 +121,19 @@ class SourceTypeEditor extends React.Component { case 'tilexyz_vector': return case 'tilejson_raster': return case 'tilexyz_raster': return - case 'tilejson_raster-dem': return - case 'tilexyz_raster-dem': return + case 'tilejson_raster-dem': return + case 'tilexyz_raster-dem': return + + this.props.onChange({ + ...this.props.source, + encoding: encoding + })} + value={this.props.source.encoding || styleSpec.latest.source_raster_dem.encoding.default} + /> + + default: return null } } From 77da0a6d308061888ec87fd3700c9a0c7845202d Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 17 May 2018 11:24:39 +0100 Subject: [PATCH 078/134] React v16.3.0 fixes. --- src/components/fields/_ZoomProperty.jsx | 4 ++-- src/components/inputs/NumberInput.jsx | 2 +- src/components/inputs/StringInput.jsx | 2 +- src/components/layers/JSONEditor.jsx | 2 +- src/components/layers/LayerEditor.jsx | 2 +- src/components/map/MapboxGlMap.jsx | 2 +- src/components/map/OpenLayers3Map.jsx | 2 +- src/components/modals/ExportModal.jsx | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/fields/_ZoomProperty.jsx b/src/components/fields/_ZoomProperty.jsx index 5659b145..bca99adb 100644 --- a/src/components/fields/_ZoomProperty.jsx +++ b/src/components/fields/_ZoomProperty.jsx @@ -37,7 +37,7 @@ export default class ZoomProperty extends React.Component { } } - componentWillMount() { + componentDidMount() { this.setState({ refs: this.setStopRefs(this.props) }) @@ -66,7 +66,7 @@ export default class ZoomProperty extends React.Component { return newRefs; } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { const newRefs = this.setStopRefs(nextProps); if(newRefs) { this.setState({ diff --git a/src/components/inputs/NumberInput.jsx b/src/components/inputs/NumberInput.jsx index c57af00c..f4f3ebec 100644 --- a/src/components/inputs/NumberInput.jsx +++ b/src/components/inputs/NumberInput.jsx @@ -17,7 +17,7 @@ class NumberInput extends React.Component { } } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { this.setState({ value: nextProps.value }) } diff --git a/src/components/inputs/StringInput.jsx b/src/components/inputs/StringInput.jsx index 6987b3cd..54685fac 100644 --- a/src/components/inputs/StringInput.jsx +++ b/src/components/inputs/StringInput.jsx @@ -18,7 +18,7 @@ class StringInput extends React.Component { } } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { this.setState({ value: nextProps.value || '' }) } diff --git a/src/components/layers/JSONEditor.jsx b/src/components/layers/JSONEditor.jsx index ca30c5bb..8cec16d0 100644 --- a/src/components/layers/JSONEditor.jsx +++ b/src/components/layers/JSONEditor.jsx @@ -29,7 +29,7 @@ class JSONEditor extends React.Component { } } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { this.setState({ code: JSON.stringify(nextProps.layer, null, 2) }) diff --git a/src/components/layers/LayerEditor.jsx b/src/components/layers/LayerEditor.jsx index 15c22d9f..d2056408 100644 --- a/src/components/layers/LayerEditor.jsx +++ b/src/components/layers/LayerEditor.jsx @@ -69,7 +69,7 @@ export default class LayerEditor extends React.Component { this.state = { editorGroups } } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { const additionalGroups = { ...this.state.editorGroups } layout[nextProps.layer.type].groups.forEach(group => { diff --git a/src/components/map/MapboxGlMap.jsx b/src/components/map/MapboxGlMap.jsx index c65410e3..b5ff174d 100644 --- a/src/components/map/MapboxGlMap.jsx +++ b/src/components/map/MapboxGlMap.jsx @@ -79,7 +79,7 @@ export default class MapboxGlMap extends React.Component { } } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { if(!this.state.map) return const metadata = nextProps.mapStyle.metadata || {} MapboxGl.accessToken = metadata['maputnik:mapbox_access_token'] || tokens.mapbox diff --git a/src/components/map/OpenLayers3Map.jsx b/src/components/map/OpenLayers3Map.jsx index bb67432c..113781a5 100644 --- a/src/components/map/OpenLayers3Map.jsx +++ b/src/components/map/OpenLayers3Map.jsx @@ -29,7 +29,7 @@ class OpenLayers3Map extends React.Component { const styleFunc = olms.apply(this.map, newMapStyle) } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { require.ensure(["ol", "ol-mapbox-style"], () => { if(!this.map) return this.updateStyle(nextProps.mapStyle) diff --git a/src/components/modals/ExportModal.jsx b/src/components/modals/ExportModal.jsx index e75391da..c08a9c6e 100644 --- a/src/components/modals/ExportModal.jsx +++ b/src/components/modals/ExportModal.jsx @@ -31,7 +31,7 @@ class Gist extends React.Component { } } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { this.setState({ ...this.state, preview: !!(nextProps.mapStyle.metadata || {})['maputnik:openmaptiles_access_token'] From d80d76724cc8929788a5645c1ec1c29c092147a1 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 17 May 2018 11:46:33 +0100 Subject: [PATCH 079/134] Fixed more lint errors. --- src/components/modals/AddModal.jsx | 2 +- src/components/sources/SourceTypeEditor.jsx | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/modals/AddModal.jsx b/src/components/modals/AddModal.jsx index feb83434..b42b736f 100644 --- a/src/components/modals/AddModal.jsx +++ b/src/components/modals/AddModal.jsx @@ -55,7 +55,7 @@ class AddModal extends React.Component { } } - componentWillUpdate(nextProps, nextState) { + UNSAFE_componentWillUpdate(nextProps, nextState) { // Check if source is valid for new type const oldType = this.state.type; const newType = nextState.type; diff --git a/src/components/sources/SourceTypeEditor.jsx b/src/components/sources/SourceTypeEditor.jsx index c55b46d2..de8c9022 100644 --- a/src/components/sources/SourceTypeEditor.jsx +++ b/src/components/sources/SourceTypeEditor.jsx @@ -11,6 +11,7 @@ class TileJSONSourceEditor extends React.Component { static propTypes = { source: PropTypes.object.isRequired, onChange: PropTypes.func.isRequired, + children: PropTypes.node, } render() { @@ -33,6 +34,7 @@ class TileURLSourceEditor extends React.Component { static propTypes = { source: PropTypes.object.isRequired, onChange: PropTypes.func.isRequired, + children: PropTypes.node, } changeTileUrl(idx, value) { From 51a115d65adf7dd844a1e564adb8b485eb394448 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 17 May 2018 11:43:25 +0100 Subject: [PATCH 080/134] Disable spell checking on 's --- src/components/fields/ColorField.jsx | 1 + src/components/inputs/AutocompleteInput.jsx | 3 ++- src/components/inputs/NumberInput.jsx | 1 + src/components/inputs/StringInput.jsx | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/fields/ColorField.jsx b/src/components/fields/ColorField.jsx index 25b1670a..6e538c97 100644 --- a/src/components/fields/ColorField.jsx +++ b/src/components/fields/ColorField.jsx @@ -105,6 +105,7 @@ class ColorField extends React.Component { {this.state.pickerOpened && picker}
this.colorInput = input} onClick={this.togglePicker.bind(this)} diff --git a/src/components/inputs/AutocompleteInput.jsx b/src/components/inputs/AutocompleteInput.jsx index a633e60d..d33bdbd8 100644 --- a/src/components/inputs/AutocompleteInput.jsx +++ b/src/components/inputs/AutocompleteInput.jsx @@ -63,7 +63,8 @@ class AutocompleteInput extends React.Component { style: null }} inputProps={{ - className: "maputnik-string" + className: "maputnik-string", + spellCheck: false }} value={this.props.value} items={this.props.options} diff --git a/src/components/inputs/NumberInput.jsx b/src/components/inputs/NumberInput.jsx index f4f3ebec..447fab80 100644 --- a/src/components/inputs/NumberInput.jsx +++ b/src/components/inputs/NumberInput.jsx @@ -67,6 +67,7 @@ class NumberInput extends React.Component { render() { return Date: Thu, 17 May 2018 13:49:24 +0100 Subject: [PATCH 081/134] Updated package-lock.json --- package-lock.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/package-lock.json b/package-lock.json index 27b2698d..35c46c97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8136,6 +8136,13 @@ "graceful-fs": "4.1.11" } }, + "jsonlint": { + "version": "github:josdejong/jsonlint#85a19d77126771f3177582e3d09c6ffae185d391", + "requires": { + "JSV": "4.0.2", + "nomnom": "1.8.1" + } + }, "jsonpointer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", @@ -8611,6 +8618,9 @@ "resolved": "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.1.0.tgz", "integrity": "sha512-hJ1cKkvdJ21qbBLxGk/IXQvvMIeHRSMatWIjc5UbpM4KTTOfl2V18UvqqxFd82VpA1fZ+IP7WSa2RvSwYRE02g==" }, + "maputnik-design": { + "version": "github:maputnik/design#afd4550db2a1562159092a858be181b5baa221f7" + }, "markdown-escapes": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.1.tgz", From a2a6f6dcab431d4d7675df6816fb6315694539ba Mon Sep 17 00:00:00 2001 From: orangemug Date: Sat, 19 May 2018 08:23:41 +0100 Subject: [PATCH 082/134] Added aria-label to public styles, also fixed button to reserve space in DOM (fixes #245) --- src/components/Button.jsx | 2 ++ src/components/modals/OpenModal.jsx | 10 ++++++---- src/styles/_modal.scss | 4 ++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/Button.jsx b/src/components/Button.jsx index 0815368c..e7690074 100644 --- a/src/components/Button.jsx +++ b/src/components/Button.jsx @@ -5,6 +5,7 @@ import classnames from 'classnames' class Button extends React.Component { static propTypes = { "data-wd-key": PropTypes.string, + "aria-label": PropTypes.string, onClick: PropTypes.func, style: PropTypes.object, className: PropTypes.string, @@ -14,6 +15,7 @@ class Button extends React.Component { render() { return
} diff --git a/src/styles/_modal.scss b/src/styles/_modal.scss index 883b151e..4fe3acfa 100644 --- a/src/styles/_modal.scss +++ b/src/styles/_modal.scss @@ -85,6 +85,7 @@ background-color: $color-gray; padding: $margin-3; display: block; + width: 100%; &:hover { background-color: $color-midgray; @@ -99,6 +100,9 @@ display: block; margin-top: $margin-2; width: 100%; + padding-top: calc(400 / 600 * 100%); + background-size: cover; + background-color: $color-midgray; } .maputnik-add-layer { From bd9076c4ffecd6397993e516d14f9c9674a86de6 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 22 May 2018 21:16:46 +0100 Subject: [PATCH 083/134] Added additional menu in This is to make the following options accessible to keyboard users - reorder layers - duplicate layer - delete layer - hide/show layer --- package-lock.json | 25 +++++++++ package.json | 2 + src/components/App.jsx | 66 ++++++++++++++++++++++ src/components/layers/LayerEditor.jsx | 75 +++++++++++++++++++++++++ src/components/layers/LayerList.jsx | 49 ++-------------- src/components/layers/LayerListItem.jsx | 10 ++-- src/styles/_layer.scss | 50 ++++++++++++++++- 7 files changed, 227 insertions(+), 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index 35c46c97..4667ddc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5523,6 +5523,11 @@ "readable-stream": "2.3.5" } }, + "focus-group": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/focus-group/-/focus-group-0.3.1.tgz", + "integrity": "sha1-4PMu2GsNq91v/OvfiY7LMuR/7c4=" + }, "focus-trap": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-2.4.4.tgz", @@ -8365,6 +8370,11 @@ "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=" }, + "lodash.clamp": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/lodash.clamp/-/lodash.clamp-4.0.3.tgz", + "integrity": "sha1-XCS+3u7vB1NWDcK0y0Zx+Qpt36o=" + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -11479,6 +11489,16 @@ "object-assign": "4.1.1" } }, + "react-aria-menubutton": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-aria-menubutton/-/react-aria-menubutton-5.1.1.tgz", + "integrity": "sha512-ceBjPvuqwM2jnRFsfMlpfPdyqQ5cz4STNH7NlKpxStr2uETB/zQ2sHiIUMTuqSuOszU1kgUB2vm3aVn3xdjhcA==", + "requires": { + "focus-group": "0.3.1", + "prop-types": "15.6.1", + "teeny-tap": "0.2.0" + } + }, "react-aria-modal": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/react-aria-modal/-/react-aria-modal-2.12.1.tgz", @@ -14298,6 +14318,11 @@ "xtend": "4.0.1" } }, + "teeny-tap": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/teeny-tap/-/teeny-tap-0.2.0.tgz", + "integrity": "sha1-Fn5kUYLQasIi1iuyq2eUenClimg=" + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", diff --git a/package.json b/package.json index 01847275..575c9abd 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "github-api": "^3.0.0", "jsonlint": "github:josdejong/jsonlint#85a19d7", "lodash.capitalize": "^4.2.1", + "lodash.clamp": "^4.0.3", "lodash.clonedeep": "^4.5.0", "lodash.isequal": "^4.5.0", "lodash.throttle": "^4.1.1", @@ -42,6 +43,7 @@ "prop-types": "^15.6.0", "react": "^16.3.2", "react-addons-pure-render-mixin": "^15.6.2", + "react-aria-menubutton": "^5.1.1", "react-aria-modal": "^2.12.1", "react-autocomplete": "^1.7.2", "react-codemirror2": "^4.2.1", diff --git a/src/components/App.jsx b/src/components/App.jsx index 61b2ea7a..857931f9 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -1,5 +1,8 @@ import React from 'react' import Mousetrap from 'mousetrap' +import cloneDeep from 'lodash.clonedeep' +import clamp from 'lodash.clamp' +import {arrayMove} from 'react-sortable-hoc'; import MapboxGlMap from './map/MapboxGlMap' import OpenLayers3Map from './map/OpenLayers3Map' @@ -164,6 +167,24 @@ export default class App extends React.Component { }) } + onSortEnd(move) { + let { oldIndex, newIndex } = move; + let layers = this.state.mapStyle.layers; + oldIndex = clamp(oldIndex, 0, layers.length-1); + newIndex = clamp(newIndex, 0, layers.length-1); + if(oldIndex === newIndex) return; + + if (oldIndex === this.state.selectedLayerIndex) { + this.setState({ + selectedLayerIndex: newIndex + }); + } + + layers = layers.slice(0); + layers = arrayMove(layers, oldIndex, newIndex); + this.onLayersChange(layers); + } + onLayersChange(changedLayers) { const changedStyle = { ...this.state.mapStyle, @@ -172,6 +193,40 @@ export default class App extends React.Component { this.onStyleChanged(changedStyle) } + onLayerDestroy(layerId) { + let layers = this.state.mapStyle.layers; + const remainingLayers = layers.slice(0); + const idx = style.indexOfLayer(remainingLayers, layerId) + remainingLayers.splice(idx, 1); + this.onLayersChange(remainingLayers); + } + + onLayerCopy(layerId) { + let layers = this.state.mapStyle.layers; + const changedLayers = layers.slice(0) + const idx = style.indexOfLayer(changedLayers, layerId) + + const clonedLayer = cloneDeep(changedLayers[idx]) + clonedLayer.id = clonedLayer.id + "-copy" + changedLayers.splice(idx, 0, clonedLayer) + this.onLayersChange(changedLayers) + } + + onLayerVisibilityToggle(layerId) { + let layers = this.state.mapStyle.layers; + const changedLayers = layers.slice(0) + const idx = style.indexOfLayer(changedLayers, layerId) + + const layer = { ...changedLayers[idx] } + const changedLayout = 'layout' in layer ? {...layer.layout} : {} + changedLayout.visibility = changedLayout.visibility === 'none' ? 'visible' : 'none' + + layer.layout = changedLayout + changedLayers[idx] = layer + this.onLayersChange(changedLayers) + } + + onLayerIdChange(oldId, newId) { const changedLayers = this.state.mapStyle.layers.slice(0) const idx = style.indexOfLayer(changedLayers, oldId) @@ -297,6 +352,10 @@ export default class App extends React.Component { /> const layerList = : null diff --git a/src/components/layers/LayerEditor.jsx b/src/components/layers/LayerEditor.jsx index d2056408..16c8d28c 100644 --- a/src/components/layers/LayerEditor.jsx +++ b/src/components/layers/LayerEditor.jsx @@ -1,5 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' +import { Wrapper, Button, Menu, MenuItem } from 'react-aria-menubutton' +import classnames from 'classnames' import JSONEditor from './JSONEditor' import FilterEditor from '../filter/FilterEditor' @@ -13,6 +15,8 @@ import CommentBlock from './CommentBlock' import LayerSourceBlock from './LayerSourceBlock' import LayerSourceLayerBlock from './LayerSourceLayerBlock' +import MoreVertIcon from 'react-icons/lib/md/more-vert' + import InputBlock from '../inputs/InputBlock' import MultiButtonInput from '../inputs/MultiButtonInput' @@ -176,6 +180,13 @@ export default class LayerEditor extends React.Component { } } + moveLayer(offset) { + this.props.onSortEnd({ + oldIndex: this.props.layerIndex, + newIndex: this.props.layerIndex+offset + }) + } + render() { const layerType = this.props.layer.type const groups = layoutGroups(layerType).filter(group => { @@ -192,8 +203,72 @@ export default class LayerEditor extends React.Component { }) + + const items = { + delete: { + text: "Delete", + handler: () => this.props.onLayerDestroy(this.props.layer.id) + }, + duplicate: { + text: "Duplicate", + handler: () => this.props.onLayerCopy(this.props.layer.id) + }, + hide: { + text: "Hide", + handler: () => this.props.onLayerVisibilityToggle(this.props.layer.id) + }, + moveLayerUp: { + text: "Move layer up", + // Not actually used... + disabled: this.props.isFirstLayer, + handler: () => this.moveLayer(-1) + }, + moveLayerDown: { + text: "Move layer down", + // Not actually used... + disabled: this.props.isLastLayer, + handler: () => this.moveLayer(+1) + } + } + + function handleSelection(id, event) { + event.stopPropagation; + items[id].handler(); + } + return
+
+
+

+ Layer: {this.props.layer.id} +

+
+ + + +
    + {Object.keys(items).map((id, idx) => { + const item = items[id]; + return
  • + + {item.text} + +
  • + })} +
+
+
+
+
+ +
{groups}
} diff --git a/src/components/layers/LayerList.jsx b/src/components/layers/LayerList.jsx index a9b144fb..25312f66 100644 --- a/src/components/layers/LayerList.jsx +++ b/src/components/layers/LayerList.jsx @@ -1,7 +1,6 @@ import React from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import cloneDeep from 'lodash.clonedeep' import Button from '../Button' import LayerListGroup from './LayerListGroup' @@ -10,7 +9,7 @@ import AddIcon from 'react-icons/lib/md/add-circle-outline' import AddModal from '../modals/AddModal' import style from '../../libs/style.js' -import {SortableContainer, SortableHandle, arrayMove} from 'react-sortable-hoc'; +import {SortableContainer, SortableHandle} from 'react-sortable-hoc'; const layerListPropTypes = { layers: PropTypes.array.isRequired, @@ -57,36 +56,6 @@ class LayerListContainer extends React.Component { } } - onLayerDestroy(layerId) { - const remainingLayers = this.props.layers.slice(0) - const idx = style.indexOfLayer(remainingLayers, layerId) - remainingLayers.splice(idx, 1); - this.props.onLayersChange(remainingLayers) - } - - onLayerCopy(layerId) { - const changedLayers = this.props.layers.slice(0) - const idx = style.indexOfLayer(changedLayers, layerId) - - const clonedLayer = cloneDeep(changedLayers[idx]) - clonedLayer.id = clonedLayer.id + "-copy" - changedLayers.splice(idx, 0, clonedLayer) - this.props.onLayersChange(changedLayers) - } - - onLayerVisibilityToggle(layerId) { - const changedLayers = this.props.layers.slice(0) - const idx = style.indexOfLayer(changedLayers, layerId) - - const layer = { ...changedLayers[idx] } - const changedLayout = 'layout' in layer ? {...layer.layout} : {} - changedLayout.visibility = changedLayout.visibility === 'none' ? 'visible' : 'none' - - layer.layout = changedLayout - changedLayers[idx] = layer - this.props.onLayersChange(changedLayers) - } - toggleModal(modalName) { this.setState({ isOpen: { @@ -186,9 +155,9 @@ class LayerListContainer extends React.Component { visibility={(layer.layout || {}).visibility} isSelected={idx === this.props.selectedLayerIndex} onLayerSelect={this.props.onLayerSelect} - onLayerDestroy={this.onLayerDestroy.bind(this)} - onLayerCopy={this.onLayerCopy.bind(this)} - onLayerVisibilityToggle={this.onLayerVisibilityToggle.bind(this)} + onLayerDestroy={this.props.onLayerDestroy.bind(this)} + onLayerCopy={this.props.onLayerCopy.bind(this)} + onLayerVisibilityToggle={this.props.onLayerVisibilityToggle.bind(this)} /> listItems.push(listItem) idx += 1 @@ -236,18 +205,10 @@ class LayerListContainer extends React.Component { export default class LayerList extends React.Component { static propTypes = {...layerListPropTypes} - onSortEnd(move) { - const { oldIndex, newIndex } = move - if(oldIndex === newIndex) return - let layers = this.props.layers.slice(0) - layers = arrayMove(layers, oldIndex, newIndex) - this.props.onLayersChange(layers) - } - render() { return } diff --git a/src/components/layers/LayerListItem.jsx b/src/components/layers/LayerListItem.jsx index 91c9217d..5c651880 100644 --- a/src/components/layers/LayerListItem.jsx +++ b/src/components/layers/LayerListItem.jsx @@ -38,7 +38,7 @@ class IconAction extends React.Component { renderIcon() { switch(this.props.action) { - case 'copy': return + case 'duplicate': return case 'show': return case 'hide': return case 'delete': return @@ -46,13 +46,15 @@ class IconAction extends React.Component { } render() { - return {this.renderIcon()} - + } } @@ -109,7 +111,7 @@ class LayerListItem extends React.Component { /> this.props.onLayerCopy(this.props.layerId)} /> Date: Tue, 22 May 2018 21:26:11 +0100 Subject: [PATCH 084/134] Remove empty scss blocks --- src/styles/_layer.scss | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/styles/_layer.scss b/src/styles/_layer.scss index d4f27d09..8013f3ae 100644 --- a/src/styles/_layer.scss +++ b/src/styles/_layer.scss @@ -183,9 +183,6 @@ .more-menu { position: relative; - &__button { - } - &__menu { position: absolute; z-index: 9999; From 28af87391d49b38521bf50c8cf28db704c80b19d Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 22 May 2018 21:43:35 +0100 Subject: [PATCH 085/134] Fixed public source button size. --- src/styles/_modal.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/_modal.scss b/src/styles/_modal.scss index 4fe3acfa..0e93dca8 100644 --- a/src/styles/_modal.scss +++ b/src/styles/_modal.scss @@ -136,6 +136,7 @@ font-size: $font-size-5; color: $color-lowgray; background-color: transparent; + width: 100%; @include flex-row; } From a82ba26f861096201aa3cfe4e44342d62330980a Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 28 May 2018 10:50:19 +0100 Subject: [PATCH 086/134] Added skip-menu link for keyboard users. --- src/components/Toolbar.jsx | 4 ++++ src/components/layers/LayerList.jsx | 1 + src/styles/_toolbar.scss | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx index caa1c5e8..7d24d748 100644 --- a/src/components/Toolbar.jsx +++ b/src/components/Toolbar.jsx @@ -135,9 +135,13 @@ export default class Toolbar extends React.Component { />
+ + Skip the menu + Maputnik

Maputnik v{pkgJson.version} diff --git a/src/components/layers/LayerList.jsx b/src/components/layers/LayerList.jsx index a9b144fb..0bbd2abb 100644 --- a/src/components/layers/LayerList.jsx +++ b/src/components/layers/LayerList.jsx @@ -209,6 +209,7 @@ class LayerListContainer extends React.Component {
    diff --git a/src/components/layers/LayerList.jsx b/src/components/layers/LayerList.jsx index 25312f66..1b50b898 100644 --- a/src/components/layers/LayerList.jsx +++ b/src/components/layers/LayerList.jsx @@ -208,7 +208,7 @@ export default class LayerList extends React.Component { render() { return } diff --git a/src/styles/_layer.scss b/src/styles/_layer.scss index 8013f3ae..c5a3a9a0 100644 --- a/src/styles/_layer.scss +++ b/src/styles/_layer.scss @@ -192,6 +192,11 @@ min-width: 120px; } + &__button__svg { + width: 24px; + height: 24px; + } + &__menu__item { padding: 4px; } From d59d9cde9577da3bd5b63b2212e7ce5a01267d1e Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 28 May 2018 11:19:04 +0100 Subject: [PATCH 088/134] Fixed OSX working directory if CircleCI config. --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9d16b64c..bd9e5d88 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -71,7 +71,7 @@ jobs: dependencies: override: - brew install node@6 - working_directory: ~/repo-linux-node-v6 + working_directory: ~/repo-osx-node-v6 steps: *build-steps build-osx-node-v8: macos: @@ -79,7 +79,7 @@ jobs: dependencies: override: - brew install node@8 - working_directory: ~/repo-linux-node-v8 + working_directory: ~/repo-osx-node-v8 steps: *build-steps build-osx-node-v10: macos: @@ -87,7 +87,7 @@ jobs: dependencies: override: - brew install node@10 - working_directory: ~/repo-linux-node-v10 + working_directory: ~/repo-osx-node-v10 steps: *build-steps workflows: From 272f662a341946e6bcfa8d201a136d19139de1c8 Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 28 May 2018 11:29:49 +0100 Subject: [PATCH 089/134] Changed 'skip' wording As outlined in --- src/components/Toolbar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx index 7d24d748..f53996a7 100644 --- a/src/components/Toolbar.jsx +++ b/src/components/Toolbar.jsx @@ -140,7 +140,7 @@ export default class Toolbar extends React.Component { className="maputnik-toolbar-logo" > - Skip the menu + Skip navigation Maputnik

    Maputnik From fc7395df962ec79a42ef869ced4597a90d8a6b43 Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 28 May 2018 11:34:12 +0100 Subject: [PATCH 090/134] Fixed CircleCI cache to include `{{arch}}` --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bd9e5d88..68ffeebf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,14 +7,14 @@ templates: name: "Create artifacts directory" command: mkdir /tmp/artifacts - restore_cache: - key: v1-dependencies-{{ checksum "package.json" }} + key: v1-dependencies-{{ arch }}-{{ checksum "package.json" }} - run: npm install - save_cache: paths: - node_modules - key: v1-dependencies-{{ checksum "package.json" }} + key: v1-dependencies-{{ arch }}-{{ checksum "package.json" }} - run: mkdir -p /tmp/artifacts/logs - run: npm run build @@ -30,14 +30,14 @@ templates: name: "Create artifacts directory" command: mkdir /tmp/artifacts - restore_cache: - key: v1-dependencies-{{ checksum "package.json" }} + key: v1-dependencies-{{ arch }}-{{ checksum "package.json" }} - run: npm install - save_cache: paths: - node_modules - key: v1-dependencies-{{ checksum "package.json" }} + key: v1-dependencies-{{ arch }}-{{ checksum "package.json" }} - run: mkdir -p /tmp/artifacts/logs - run: npm run build From 6200edea25feb0fb0d74cefbb53b29bde12de9b1 Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 28 May 2018 12:03:47 +0100 Subject: [PATCH 091/134] Added initial shortcuts. --- src/components/App.jsx | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/components/App.jsx b/src/components/App.jsx index 78175034..4e776768 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -50,6 +50,43 @@ export default class App extends React.Component { onLocalStyleChange: mapStyle => this.onStyleChanged(mapStyle, false) }) + document.body.addEventListener("keyup", (e) => { + if(e.keyCode === 27) { + e.target.blur(); + document.body.focus(); + } + else if(document.activeElement === document.body) { + console.log(">>> e", e.keyCode); + if(e.keyCode === 191) { + console.log("TODO: SHORTCUTS"); + } + else if(e.keyCode === 79) { + console.log("TODO: OPEN"); + } + else if(e.keyCode === 69) { + console.log("TODO: EXPORT"); + } + else if(e.keyCode === 83) { + console.log("TODO: SOURCES"); + } + else if(e.keyCode === 80) { + console.log("TODO: METADATA"); + } + else if(e.keyCode === 73) { + console.log("TODO: INSPECT"); + } + else if(e.keyCode === 76) { + console.log("TODO: LAYER LIST"); + } + else if(e.keyCode === 67) { + console.log("TODO: CURRENT LAYER"); + } + else if(e.keyCode === 77) { + console.log("TODO: MAP"); + } + } + }) + const styleUrl = initialStyleUrl() if(styleUrl) { this.styleStore = new StyleStore() From 019428a241bf816c0fa4afbc2eef66cb85d9d244 Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 28 May 2018 12:06:22 +0100 Subject: [PATCH 092/134] Added missing prop-types. --- src/components/layers/LayerEditor.jsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/layers/LayerEditor.jsx b/src/components/layers/LayerEditor.jsx index 6f6f44c8..906ac9c8 100644 --- a/src/components/layers/LayerEditor.jsx +++ b/src/components/layers/LayerEditor.jsx @@ -48,6 +48,13 @@ export default class LayerEditor extends React.Component { spec: PropTypes.object.isRequired, onLayerChanged: PropTypes.func, onLayerIdChange: PropTypes.func, + onMoveLayer: PropTypes.func, + onLayerDestroy: PropTypes.func, + onLayerCopy: PropTypes.func, + onLayerVisibilityToggle: PropTypes.func, + isFirstLayer: PropTypes.bool, + isLastLayer: PropTypes.bool, + layerIndex: PropTypes.number, } static defaultProps = { From 35353d75f5761d4a4ea8781d5b9849a0ef065b32 Mon Sep 17 00:00:00 2001 From: orangemug Date: Tue, 29 May 2018 17:06:00 +0100 Subject: [PATCH 093/134] Added application shortcuts and shortcut modal. Also moved modals into App.jsx to move the business logic to one place. --- src/components/App.jsx | 147 ++++++++++++++++++----- src/components/AppLayout.jsx | 1 + src/components/Toolbar.jsx | 44 +------ src/components/modals/ShortcutsModal.jsx | 75 ++++++++++++ 4 files changed, 199 insertions(+), 68 deletions(-) create mode 100644 src/components/modals/ShortcutsModal.jsx diff --git a/src/components/App.jsx b/src/components/App.jsx index 4e776768..9265b934 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -12,6 +12,12 @@ import Toolbar from './Toolbar' import AppLayout from './AppLayout' import MessagePanel from './MessagePanel' +import SettingsModal from './modals/SettingsModal' +import ExportModal from './modals/ExportModal' +import SourcesModal from './modals/SourcesModal' +import OpenModal from './modals/OpenModal' +import ShortcutsModal from './modals/ShortcutsModal' + import { downloadGlyphsMetadata, downloadSpriteMetadata } from '../libs/metadata' import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import style from '../libs/style.js' @@ -50,39 +56,75 @@ export default class App extends React.Component { onLocalStyleChange: mapStyle => this.onStyleChanged(mapStyle, false) }) + + const keyCodes = { + "esc": 27, + "?": 191, + "o": 79, + "e": 69, + "s": 83, + "p": 80, + "i": 73, + "m": 77, + } + + const shortcuts = [ + { + keyCode: keyCodes["?"], + handler: () => { + this.toggleModal("shortcuts"); + } + }, + { + keyCode: keyCodes["o"], + handler: () => { + this.toggleModal("open"); + } + }, + { + keyCode: keyCodes["e"], + handler: () => { + this.toggleModal("export"); + } + }, + { + keyCode: keyCodes["s"], + handler: () => { + this.toggleModal("sources"); + } + }, + { + keyCode: keyCodes["p"], + handler: () => { + this.toggleModal("settings"); + } + }, + { + keyCode: keyCodes["i"], + handler: () => { + this.changeInspectMode(); + } + }, + { + keyCode: keyCodes["m"], + handler: () => { + document.querySelector(".mapboxgl-canvas").focus(); + } + }, + ] + document.body.addEventListener("keyup", (e) => { - if(e.keyCode === 27) { + if(e.keyCode === keyCodes["esc"]) { e.target.blur(); document.body.focus(); } else if(document.activeElement === document.body) { - console.log(">>> e", e.keyCode); - if(e.keyCode === 191) { - console.log("TODO: SHORTCUTS"); - } - else if(e.keyCode === 79) { - console.log("TODO: OPEN"); - } - else if(e.keyCode === 69) { - console.log("TODO: EXPORT"); - } - else if(e.keyCode === 83) { - console.log("TODO: SOURCES"); - } - else if(e.keyCode === 80) { - console.log("TODO: METADATA"); - } - else if(e.keyCode === 73) { - console.log("TODO: INSPECT"); - } - else if(e.keyCode === 76) { - console.log("TODO: LAYER LIST"); - } - else if(e.keyCode === 67) { - console.log("TODO: CURRENT LAYER"); - } - else if(e.keyCode === 77) { - console.log("TODO: MAP"); + const shortcut = shortcuts.find((shortcut) => { + return (shortcut.keyCode === e.keyCode) + }) + + if(shortcut) { + shortcut.handler(e); } } }) @@ -120,6 +162,13 @@ export default class App extends React.Component { vectorLayers: {}, inspectModeEnabled: false, spec: styleSpec.latest, + isOpen: { + settings: false, + sources: false, + open: false, + shortcuts: false, + export: false, + } } this.layerWatcher = new LayerWatcher({ @@ -374,6 +423,15 @@ export default class App extends React.Component { this.setState({ selectedLayerIndex: idx }) } + toggleModal(modalName) { + this.setState({ + isOpen: { + ...this.state.isOpen, + [modalName]: !this.state.isOpen[modalName] + } + }) + } + render() { const layers = this.state.mapStyle.layers || [] const selectedLayer = layers.length > 0 ? layers[this.state.selectedLayerIndex] : null @@ -386,6 +444,7 @@ export default class App extends React.Component { onStyleChanged={this.onStyleChanged.bind(this)} onStyleOpen={this.onStyleChanged.bind(this)} onInspectModeToggle={this.changeInspectMode.bind(this)} + onToggleModal={this.toggleModal.bind(this)} /> const layerList = : null + + const modals =
    + + + + + +
    + return } } diff --git a/src/components/AppLayout.jsx b/src/components/AppLayout.jsx index 1804686d..63fc5c6c 100644 --- a/src/components/AppLayout.jsx +++ b/src/components/AppLayout.jsx @@ -39,6 +39,7 @@ class AppLayout extends React.Component { {this.props.bottom}

} + {this.props.modals}
} } diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx index caa1c5e8..2d856531 100644 --- a/src/components/Toolbar.jsx +++ b/src/components/Toolbar.jsx @@ -18,10 +18,6 @@ import HelpIcon from 'react-icons/lib/md/help-outline' import InspectionIcon from 'react-icons/lib/md/find-in-page' import logoImage from 'maputnik-design/logos/logo-color.svg' -import SettingsModal from './modals/SettingsModal' -import ExportModal from './modals/ExportModal' -import SourcesModal from './modals/SourcesModal' -import OpenModal from './modals/OpenModal' import pkgJson from '../../package.json' import style from '../libs/style' @@ -99,40 +95,8 @@ export default class Toolbar extends React.Component { } } - toggleModal(modalName) { - this.setState({ - isOpen: { - ...this.state.isOpen, - [modalName]: !this.state.isOpen[modalName] - } - }) - } - render() { return
- - - -
- + Open - + Export - + Sources - + Style Settings diff --git a/src/components/modals/ShortcutsModal.jsx b/src/components/modals/ShortcutsModal.jsx new file mode 100644 index 00000000..a8db17e3 --- /dev/null +++ b/src/components/modals/ShortcutsModal.jsx @@ -0,0 +1,75 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import Button from '../Button' +import Modal from './Modal' + + +class ShortcutsModal extends React.Component { + static propTypes = { + isOpen: PropTypes.bool.isRequired, + onOpenToggle: PropTypes.func.isRequired, + } + + constructor(props) { + super(props); + } + + render() { + const help = [ + { + key: "?", + text: "Show shortcuts menu" + }, + { + key: "o", + text: "Open modal" + }, + { + key: "e", + text: "Export modal" + }, + { + key: "s", + text: "Sources modal" + }, + { + key: "p", + text: "Source settings modal" + }, + { + key: "i", + text: "Toggle map" + }, + { + key: "m", + text: "Focus map" + }, + ] + + + return +
+
    + {help.map((item) => { + return
  • + {item.key} {item.text} +
  • + })} +
+

+ +

+
+
+ } +} + +export default ShortcutsModal From f5e8d473ad0cd68792cebcec5a0701fd4fb4cc99 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 31 May 2018 20:40:21 +0100 Subject: [PATCH 094/134] Changed toggle visibility text from hide to show/hide --- src/components/layers/LayerEditor.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layers/LayerEditor.jsx b/src/components/layers/LayerEditor.jsx index 906ac9c8..4965774d 100644 --- a/src/components/layers/LayerEditor.jsx +++ b/src/components/layers/LayerEditor.jsx @@ -220,7 +220,7 @@ export default class LayerEditor extends React.Component { handler: () => this.props.onLayerCopy(this.props.layer.id) }, hide: { - text: "Hide", + text: (this.props.layer.layout.visibility === "visible") ? "Hide" : "Show", handler: () => this.props.onLayerVisibilityToggle(this.props.layer.id) }, moveLayerUp: { From 13fc699d4a30f20f54cf1a3f96809d5c01524275 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 31 May 2018 21:09:31 +0100 Subject: [PATCH 095/134] Styling fixes. --- src/styles/_layer.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/styles/_layer.scss b/src/styles/_layer.scss index c5a3a9a0..391c66a6 100644 --- a/src/styles/_layer.scss +++ b/src/styles/_layer.scss @@ -137,6 +137,7 @@ user-select: none; padding: $margin-2; line-height: 20px; + border-top: solid 1px #36383e; @include flex-row; @@ -206,10 +207,11 @@ display: flex; padding: 6px; background: $color-black; - border-bottom: solid 1px $color-midgray; &__title { flex: 1; + margin: 0; + line-height: 24px; } &__info { From aa2f4a091c380f63ad22391f29845f09b5157023 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 1 Jun 2018 09:22:18 +0100 Subject: [PATCH 096/134] Initial attempt at color blindness emulation --- src/components/App.jsx | 18 ++++++++-- src/template.html | 81 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/src/components/App.jsx b/src/components/App.jsx index 61b2ea7a..780470ba 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -1,5 +1,6 @@ import React from 'react' import Mousetrap from 'mousetrap' +import url from 'url' import MapboxGlMap from './map/MapboxGlMap' import OpenLayers3Map from './map/OpenLayers3Map' @@ -71,6 +72,8 @@ export default class App extends React.Component { Debug.set("maputnik", "styleStore", this.styleStore); } + const queryObj = url.parse(window.location.href, true).query; + this.state = { errors: [], infos: [], @@ -80,6 +83,7 @@ export default class App extends React.Component { vectorLayers: {}, inspectModeEnabled: false, spec: styleSpec.latest, + mapFilter: queryObj["color-blindness-emulation"], } this.layerWatcher = new LayerWatcher({ @@ -266,15 +270,25 @@ export default class App extends React.Component { const metadata = this.state.mapStyle.metadata || {} const renderer = metadata['maputnik:renderer'] || 'mbgljs' + let mapElement; + // Check if OL3 code has been loaded? if(renderer === 'ol3') { - return + mapElement = } else { - return } + + const elementStyle = { + "filter": `url('#${this.state.mapFilter}')` + }; + + return
+ {mapElement} +
} onLayerSelect(layerId) { diff --git a/src/template.html b/src/template.html index bfa8284c..268f2299 100644 --- a/src/template.html +++ b/src/template.html @@ -69,6 +69,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Loading...
From f9f5e8f925b7400a464a7d9ce7642bed33d6fe79 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 1 Jun 2018 20:40:51 +0100 Subject: [PATCH 097/134] Changed close button from to
{this.props.children}
diff --git a/src/styles/_modal.scss b/src/styles/_modal.scss index 4fe3acfa..f87a00cc 100644 --- a/src/styles/_modal.scss +++ b/src/styles/_modal.scss @@ -43,7 +43,10 @@ } .maputnik-modal-header-toggle { - cursor: pointer; + border: none; + background: initial; + color: white; + padding: 0; } .maputnik-modal-scroller { From dd122d1bacb6e64b39d295f94e1cdc9bfe22efbb Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 1 Jun 2018 20:45:05 +0100 Subject: [PATCH 098/134] Hide hidden FileReaderInput from keyboard focus --- src/components/modals/OpenModal.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/modals/OpenModal.jsx b/src/components/modals/OpenModal.jsx index 64df02f7..c31ffd3d 100644 --- a/src/components/modals/OpenModal.jsx +++ b/src/components/modals/OpenModal.jsx @@ -144,7 +144,7 @@ class OpenModal extends React.Component {

Upload Style

Upload a JSON style from your computer.

- +
From ab9c39b86296d0d20d34375a5c889df854914bc9 Mon Sep 17 00:00:00 2001 From: orangemug Date: Fri, 1 Jun 2018 20:51:21 +0100 Subject: [PATCH 099/134] Removed additional close button --- src/components/modals/ShortcutsModal.jsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/components/modals/ShortcutsModal.jsx b/src/components/modals/ShortcutsModal.jsx index a8db17e3..99e660ce 100644 --- a/src/components/modals/ShortcutsModal.jsx +++ b/src/components/modals/ShortcutsModal.jsx @@ -62,11 +62,6 @@ class ShortcutsModal extends React.Component { })} -

- -

} From 480d54c2d8e962df96e5cf993151d120849cfd21 Mon Sep 17 00:00:00 2001 From: orangemug Date: Sat, 2 Jun 2018 10:17:39 +0100 Subject: [PATCH 100/134] Finished shortcuts modal styling --- src/components/modals/ShortcutsModal.jsx | 11 +++++++---- src/styles/_modal.scss | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/components/modals/ShortcutsModal.jsx b/src/components/modals/ShortcutsModal.jsx index 99e660ce..b14b4131 100644 --- a/src/components/modals/ShortcutsModal.jsx +++ b/src/components/modals/ShortcutsModal.jsx @@ -19,7 +19,7 @@ class ShortcutsModal extends React.Component { const help = [ { key: "?", - text: "Show shortcuts menu" + text: "Shortcuts menu" }, { key: "o", @@ -35,11 +35,11 @@ class ShortcutsModal extends React.Component { }, { key: "p", - text: "Source settings modal" + text: "Style settings modal" }, { key: "i", - text: "Toggle map" + text: "Toggle inspect" }, { key: "m", @@ -54,7 +54,10 @@ class ShortcutsModal extends React.Component { onOpenToggle={this.props.onOpenToggle} title={'Shortcuts'} > -
+
+

+ Press ESC to lose focus of any active elements, then press one of: +

diff --git a/src/components/modals/SurveyModal.jsx b/src/components/modals/SurveyModal.jsx new file mode 100644 index 00000000..7c11353d --- /dev/null +++ b/src/components/modals/SurveyModal.jsx @@ -0,0 +1,36 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import Button from '../Button' +import Modal from './Modal' + +import Logo from './../../img/maputnik.png' + +class SurveyModal extends React.Component { + static propTypes = { + isOpen: PropTypes.bool.isRequired, + onOpenToggle: PropTypes.func.isRequired, + } + + constructor(props) { super(props); } + + render() { + return +
+ +

You + Maputnik = Maputnik better for you

+

We don’t track you, so we don’t know how you use Maputnik. Help us make Maputnik better for you by completing a 7–minute survey carried out by our contributing designer. +

+ Take the Maputnik Survey +

It takes 7 minutes, tops! Every question is optional.

+
+
+ } +} + +export default SurveyModal diff --git a/src/index.jsx b/src/index.jsx index 147313c3..aa78b0c1 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -1,8 +1,10 @@ import React from 'react'; import ReactDOM from 'react-dom'; +import { CookiesProvider } from 'react-cookie' + import './favicon.ico' import './styles/index.scss' import App from './components/App'; -ReactDOM.render(, document.querySelector("#app")); +ReactDOM.render(, document.querySelector("#app")); diff --git a/src/styles/_base.scss b/src/styles/_base.scss index ce411725..2784e9e2 100644 --- a/src/styles/_base.scss +++ b/src/styles/_base.scss @@ -80,3 +80,7 @@ a { .hide { display: none !important; } + +.green { + color: $color-green; +} \ No newline at end of file diff --git a/src/styles/_components.scss b/src/styles/_components.scss index 170d855d..57db6379 100644 --- a/src/styles/_components.scss +++ b/src/styles/_components.scss @@ -56,6 +56,7 @@ border-width: 0; border-radius: 2px; box-sizing: border-box; + text-decoration: none; &:hover { background-color: lighten($color-midgray, 12); @@ -70,6 +71,25 @@ font-size: $font-size-5; } +.maputnik-wide-button { + padding: $margin-2 $margin-3; +} + +.maputnik-green-button { + background-color: $color-green; + color: $color-black; +} + +.maputnik-green-hover-button:hover, .maputnik-green-hover-button:focus { + background-color: $color-green; + color: $color-white; +} + +.maputnik-white-button { + background-color: $color-white; + color: $color-black; +} + .maputnik-icon-button { background-color: transparent; @@ -135,9 +155,3 @@ color: $color-red; } } - -.maputnik-dialog { - &__buttons { - text-align: right; - } -} diff --git a/src/styles/_toolbar.scss b/src/styles/_toolbar.scss index 75993dd1..d13db953 100644 --- a/src/styles/_toolbar.scss +++ b/src/styles/_toolbar.scss @@ -57,6 +57,33 @@ } } +.maputnik-toolbar-link--highlighted { + color: $color-green; +} + +.maputnik-toolbar-link--highlighted2 { + line-height: 1; + padding: $margin-2 $margin-3; + + .maputnik-toolbar-link-wrapper { + background-color: $color-white; + border-radius: 2px; + padding: $margin-2; + margin-top: $margin-1; + color: $color-black; + display: block; + } + + &:hover { + background-color: $color-black; + } + + &:hover .maputnik-toolbar-link-wrapper { + background-color: $color-green; + color: $color-white; + } +} + .maputnik-toolbar-version { font-size: 10px; margin-left: 4px; diff --git a/src/styles/index.scss b/src/styles/index.scss index d72c22ff..b34a65c2 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -4,6 +4,7 @@ $color-midgray: #36383e; $color-lowgray: #8e8e8e; $color-white: #f0f0f0; $color-red: #cf4a4a; +$color-green: #53b972; $margin-1: 3px; $margin-2: 5px; $margin-3: 10px; From e35f106482c86ff45605c394f8db472f89c2dbf8 Mon Sep 17 00:00:00 2001 From: pathmapper Date: Fri, 29 Jun 2018 11:20:32 +0200 Subject: [PATCH 117/134] Update repository for OSM Liberty --- src/config/styles.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/styles.json b/src/config/styles.json index 1359febf..d89e3f34 100644 --- a/src/config/styles.json +++ b/src/config/styles.json @@ -26,8 +26,8 @@ { "id": "osm-liberty", "title": "OSM Liberty", - "url": "https://rawgit.com/lukasmartinelli/osm-liberty/gh-pages/style.json", - "thumbnail": "https://cdn.rawgit.com/lukasmartinelli/osm-liberty/gh-pages/thumbnail.png" + "url": "https://rawgit.com/maputnik/osm-liberty/gh-pages/style.json", + "thumbnail": "https://cdn.rawgit.com/maputnik/osm-liberty/gh-pages/thumbnail.png" }, { "id": "empty-style", From 8b0aa194cfde3cb9d36be78a9013c8512ee9950c Mon Sep 17 00:00:00 2001 From: Gregory Wolanski Date: Sat, 30 Jun 2018 10:09:23 +0200 Subject: [PATCH 118/134] Survey (#328) Elements promoting the survey inside Maputnik after feedback --- package-lock.json | 24 ------------------------ package.json | 1 - src/components/App.jsx | 16 ++++------------ src/components/modals/SurveyModal.jsx | 19 ++++++++++++------- src/index.jsx | 4 +--- src/styles/_modal.scss | 17 +++++++++++++++++ 6 files changed, 34 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index e23eb95f..9a5530da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6983,11 +6983,6 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -11550,16 +11545,6 @@ "tinycolor2": "^1.4.1" } }, - "react-cookie": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-2.2.0.tgz", - "integrity": "sha512-W6e+ZyeEkgUhJV4D/p41QaApfFKsChW/OLvhDXLcBRcV2pmKOh88YhHkBz2QwZt20J5xaiqcN0NqGGK+58gn/g==", - "requires": { - "hoist-non-react-statics": "^2.3.1", - "prop-types": "^15.0.0", - "universal-cookie": "^2.2.0" - } - }, "react-copy-to-clipboard": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.1.tgz", @@ -14877,15 +14862,6 @@ "unist-util-is": "^2.1.1" } }, - "universal-cookie": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-2.2.0.tgz", - "integrity": "sha512-weEuvQvnMs74WGwqKSbeapCRv/7ATHDCqrfZtj579r3fQCxcwtoXYMoaZ8YOCQga/ctQTYy20xMOH1u7cAAU6w==", - "requires": { - "cookie": "^0.3.1", - "object-assign": "^4.1.0" - } - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index 83991ea2..575c9abd 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ "react-codemirror2": "^4.2.1", "react-collapse": "^4.0.3", "react-color": "^2.14.1", - "react-cookie": "^2.1.6", "react-copy-to-clipboard": "^5.0.1", "react-dom": "^16.3.2", "react-file-reader-input": "^1.1.4", diff --git a/src/components/App.jsx b/src/components/App.jsx index 8cfa9a1d..5de60a49 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -1,10 +1,8 @@ import React from 'react' -import {instanceOf} from 'prop-types'; import Mousetrap from 'mousetrap' import cloneDeep from 'lodash.clonedeep' import clamp from 'lodash.clamp' -import {arrayMove} from 'react-sortable-hoc'; -import {withCookies, Cookies} from 'react-cookie' +import {arrayMove} from 'react-sortable-hoc' import url from 'url' import MapboxGlMap from './map/MapboxGlMap' @@ -53,11 +51,7 @@ function updateRootSpec(spec, fieldName, newValues) { } } -class App extends React.Component { - static propTypes = { - cookies: instanceOf(Cookies).isRequired - } - +export default class App extends React.Component { constructor(props) { super(props) this.revisionStore = new RevisionStore() @@ -179,7 +173,7 @@ class App extends React.Component { open: false, shortcuts: false, export: false, - survey: this.props.cookies.get('survey') ? false : true + survey: localStorage.hasOwnProperty('survey') ? false : true }, mapOptions: { showTileBoundaries: queryUtil.asBool(queryObj, "show-tile-boundaries") @@ -459,7 +453,7 @@ class App extends React.Component { }) if(modalName === 'survey') { - this.props.cookies.set('survey'); + localStorage.setItem('survey', ''); } } @@ -556,5 +550,3 @@ class App extends React.Component { /> } } - -export default withCookies(App) \ No newline at end of file diff --git a/src/components/modals/SurveyModal.jsx b/src/components/modals/SurveyModal.jsx index 7c11353d..6ce5e7b4 100644 --- a/src/components/modals/SurveyModal.jsx +++ b/src/components/modals/SurveyModal.jsx @@ -14,20 +14,25 @@ class SurveyModal extends React.Component { constructor(props) { super(props); } + onClick = () => { + window.open('https://gregorywolanski.typeform.com/to/cPgaSY', '_blank'); + + this.props.onOpenToggle(); + } + render() { return -
- +
+

You + Maputnik = Maputnik better for you

-

We don’t track you, so we don’t know how you use Maputnik. Help us make Maputnik better for you by completing a 7–minute survey carried out by our contributing designer. -

- Take the Maputnik Survey -

It takes 7 minutes, tops! Every question is optional.

+

We don’t track you, so we don’t know how you use Maputnik. Help us make Maputnik better for you by completing a 7–minute survey carried out by our contributing designer.

+ +

It takes 7 minutes, tops! Every question is optional.

} diff --git a/src/index.jsx b/src/index.jsx index aa78b0c1..147313c3 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -1,10 +1,8 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import { CookiesProvider } from 'react-cookie' - import './favicon.ico' import './styles/index.scss' import App from './components/App'; -ReactDOM.render(, document.querySelector("#app")); +ReactDOM.render(, document.querySelector("#app")); diff --git a/src/styles/_modal.scss b/src/styles/_modal.scss index c54016ad..981ab346 100644 --- a/src/styles/_modal.scss +++ b/src/styles/_modal.scss @@ -240,3 +240,20 @@ margin-bottom: 4px; } } + +.maputnik-modal-survey { + width: 372px; +} + +.maputnik-modal-survey__logo { + display: block; + margin: 0 auto; +} + +.maputnik-modal-survey__description { + line-height: 1.5; +} + +.maputnik-modal-survey__footnote { + margin-top: 16px; +} From 452706f35c380a3ae502483c92d0c2ba0764160d Mon Sep 17 00:00:00 2001 From: Gregory Wolanski Date: Sat, 30 Jun 2018 10:17:14 +0200 Subject: [PATCH 119/134] Survey (#328) --- src/styles/_base.scss | 4 ---- src/styles/_modal.scss | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/styles/_base.scss b/src/styles/_base.scss index 2784e9e2..b1d746f2 100644 --- a/src/styles/_base.scss +++ b/src/styles/_base.scss @@ -79,8 +79,4 @@ a { .hide { display: none !important; -} - -.green { - color: $color-green; } \ No newline at end of file diff --git a/src/styles/_modal.scss b/src/styles/_modal.scss index 981ab346..b54f7d1c 100644 --- a/src/styles/_modal.scss +++ b/src/styles/_modal.scss @@ -255,5 +255,6 @@ } .maputnik-modal-survey__footnote { + color: $color-green; margin-top: 16px; } From a88ca031d0833b69b4d0f71a786b32178d8bc500 Mon Sep 17 00:00:00 2001 From: Gregory Wolanski Date: Sun, 8 Jul 2018 14:34:46 +0200 Subject: [PATCH 120/134] Survey (#328) Elements promoting the survey inside Maputnik after feedback --- src/components/modals/SurveyModal.jsx | 6 +++--- src/styles/_components.scss | 5 ----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/components/modals/SurveyModal.jsx b/src/components/modals/SurveyModal.jsx index 6ce5e7b4..e1ae021a 100644 --- a/src/components/modals/SurveyModal.jsx +++ b/src/components/modals/SurveyModal.jsx @@ -4,7 +4,7 @@ import PropTypes from 'prop-types' import Button from '../Button' import Modal from './Modal' -import Logo from './../../img/maputnik.png' +import logoImage from 'maputnik-design/logos/logo-color.svg' class SurveyModal extends React.Component { static propTypes = { @@ -28,10 +28,10 @@ class SurveyModal extends React.Component { title="Maputnik Survey" >
- +

You + Maputnik = Maputnik better for you

We don’t track you, so we don’t know how you use Maputnik. Help us make Maputnik better for you by completing a 7–minute survey carried out by our contributing designer.

- +

It takes 7 minutes, tops! Every question is optional.

diff --git a/src/styles/_components.scss b/src/styles/_components.scss index 57db6379..74dfe413 100644 --- a/src/styles/_components.scss +++ b/src/styles/_components.scss @@ -80,11 +80,6 @@ color: $color-black; } -.maputnik-green-hover-button:hover, .maputnik-green-hover-button:focus { - background-color: $color-green; - color: $color-white; -} - .maputnik-white-button { background-color: $color-white; color: $color-black; From 4df63c7287a28e01c7d6acc512747afdba28d617 Mon Sep 17 00:00:00 2001 From: Gregory Wolanski Date: Sun, 8 Jul 2018 14:38:52 +0200 Subject: [PATCH 121/134] Update _base.scss --- src/styles/_base.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/_base.scss b/src/styles/_base.scss index b1d746f2..ce411725 100644 --- a/src/styles/_base.scss +++ b/src/styles/_base.scss @@ -79,4 +79,4 @@ a { .hide { display: none !important; -} \ No newline at end of file +} From 5de9e708e93c808dff9f0faf252ceb9237cac1ac Mon Sep 17 00:00:00 2001 From: Gregory Wolanski Date: Sun, 8 Jul 2018 14:42:49 +0200 Subject: [PATCH 122/134] Survey (#328): Cleaning --- src/components/Toolbar.jsx | 2 +- src/styles/_toolbar.scss | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx index d4e635dd..ede36f2e 100644 --- a/src/components/Toolbar.jsx +++ b/src/components/Toolbar.jsx @@ -63,7 +63,7 @@ class ToolbarLinkHighlighted extends React.Component { render() { return Date: Sun, 8 Jul 2018 16:27:59 +0200 Subject: [PATCH 123/134] Survey (#328): Proper contrast ratio --- src/styles/_toolbar.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/_toolbar.scss b/src/styles/_toolbar.scss index 8d6a8e8a..70ae9861 100644 --- a/src/styles/_toolbar.scss +++ b/src/styles/_toolbar.scss @@ -75,7 +75,7 @@ } &:hover .maputnik-toolbar-link-wrapper { - background-color: $color-green; + background-color: lighten($color-midgray, 12); color: $color-white; } } From 7c00775515b549c17ddc8cb67235c50adb71add1 Mon Sep 17 00:00:00 2001 From: orangemug Date: Wed, 11 Jul 2018 08:22:30 +0100 Subject: [PATCH 124/134] 1.3.0-beta --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a5530da..29f5d300 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.2.0", + "version": "1.3.0-beta", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 575c9abd..39b0440b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.2.0", + "version": "1.3.0-beta", "description": "A MapboxGL visual style editor", "main": "''", "scripts": { From d88bc59720a38fe4f3280b3f8e23725ea81ba0b3 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 12 Jul 2018 12:33:40 +0100 Subject: [PATCH 125/134] Fixed normalizeSourceURL import issue. --- src/components/App.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/App.jsx b/src/components/App.jsx index 5de60a49..3051b464 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -35,7 +35,7 @@ import Debug from '../libs/debug' import queryUtil from '../libs/query-util' import MapboxGl from 'mapbox-gl' -import mapboxUtil from 'mapbox-gl/src/util/mapbox' +import { normalizeSourceURL } from 'mapbox-gl/src/util/mapbox' function updateRootSpec(spec, fieldName, newValues) { @@ -365,7 +365,7 @@ export default class App extends React.Component { if(!this.state.sources.hasOwnProperty(key) && val.type === "vector" && val.hasOwnProperty("url")) { let url = val.url; try { - url = mapboxUtil.normalizeSourceURL(url, MapboxGl.accessToken); + url = normalizeSourceURL(url, MapboxGl.accessToken); } catch(err) { console.warn("Failed to normalizeSourceURL: ", err); } From b211f1cd1262a2122bda5a696775a26e69738105 Mon Sep 17 00:00:00 2001 From: orangemug Date: Thu, 12 Jul 2018 15:54:01 +0100 Subject: [PATCH 126/134] 1.3.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29f5d300..5863c696 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.3.0-beta", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 39b0440b..49f810cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maputnik", - "version": "1.3.0-beta", + "version": "1.3.0", "description": "A MapboxGL visual style editor", "main": "''", "scripts": { From 968d7d7fdadd6e271e8e7e69c6109d3aada0c54e Mon Sep 17 00:00:00 2001 From: orangemug Date: Sun, 15 Jul 2018 13:17:47 +0100 Subject: [PATCH 127/134] Fixed overflow issues. --- src/styles/_layout.scss | 2 +- src/styles/_react-collapse.scss | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/styles/_layout.scss b/src/styles/_layout.scss index 4857e560..25299b27 100644 --- a/src/styles/_layout.scss +++ b/src/styles/_layout.scss @@ -1,6 +1,6 @@ //SCROLLING .maputnik-scroll-container { - overflow-x: visible; + overflow-x: hidden; overflow-y: scroll; bottom: 0; left: 0; diff --git a/src/styles/_react-collapse.scss b/src/styles/_react-collapse.scss index ab81c170..3ee0cae7 100644 --- a/src/styles/_react-collapse.scss +++ b/src/styles/_react-collapse.scss @@ -1,6 +1,7 @@ // See .react-collapse-container { display: flex; + max-width: 100%; > * { flex: 1; From 252b442ca9f098fa1ccd84615adbf8b006d2b108 Mon Sep 17 00:00:00 2001 From: orangemug Date: Sun, 15 Jul 2018 21:51:25 +0100 Subject: [PATCH 128/134] The UI is 100% height so prevent bounce scroll on OSX --- src/styles/_base.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/styles/_base.scss b/src/styles/_base.scss index ce411725..e35f6611 100644 --- a/src/styles/_base.scss +++ b/src/styles/_base.scss @@ -18,6 +18,11 @@ html { box-sizing: border-box; } +body { + // The UI is 100% height so prevent bounce scroll on OSX + overflow: hidden; +} + *, *::before, *::after { From 960b2022ed595946ee8a4ceb6e10fdf306f2d9a6 Mon Sep 17 00:00:00 2001 From: orangemug Date: Sun, 15 Jul 2018 22:07:14 +0100 Subject: [PATCH 129/134] Fixed map width (fixes #260) --- src/styles/_components.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/styles/_components.scss b/src/styles/_components.scss index 74dfe413..e257211d 100644 --- a/src/styles/_components.scss +++ b/src/styles/_components.scss @@ -5,7 +5,11 @@ right: 0; bottom: 0; height: calc(100% - #{$toolbar-height + $toolbar-offset}); - width: 75%; + width: calc( + 100% + - 200px /* layer list */ + - 350px /* layer editor */ + ); } // DOC LABEL From c0480a50eab9e3005750bb4731727dd46591adb7 Mon Sep 17 00:00:00 2001 From: orangemug Date: Sun, 15 Jul 2018 22:51:57 +0100 Subject: [PATCH 130/134] Option to download styles with own tokens. --- src/components/modals/ExportModal.jsx | 32 ++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/components/modals/ExportModal.jsx b/src/components/modals/ExportModal.jsx index c08a9c6e..c6f397d6 100644 --- a/src/components/modals/ExportModal.jsx +++ b/src/components/modals/ExportModal.jsx @@ -235,10 +235,24 @@ class ExportModal extends React.Component { } downloadStyle() { - const blob = new Blob([styleSpec.format(stripAccessTokens(this.props.mapStyle))], {type: "application/json;charset=utf-8"}); + const tokenStyle = styleSpec.format(stripAccessTokens(style.replaceAccessToken(this.props.mapStyle))); + + const blob = new Blob([tokenStyle], {type: "application/json;charset=utf-8"}); saveAs(blob, this.props.mapStyle.id + ".json"); } + changeMetadataProperty(property, value) { + const changedStyle = { + ...this.props.mapStyle, + metadata: { + ...this.props.mapStyle.metadata, + [property]: value + } + } + this.props.onStyleChanged(changedStyle) + } + + render() { return Download a JSON style to your computer.

+ +

+ + + + + + +

+