From 705e150000f47edbd0c8e80ee9ad75d38708223f Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Fri, 27 Oct 2017 12:35:57 -0500 Subject: [PATCH 01/27] Use rjsx-mode for JS files in src/webextension --- src/webextension/.dir-locals.el | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/webextension/.dir-locals.el diff --git a/src/webextension/.dir-locals.el b/src/webextension/.dir-locals.el new file mode 100644 index 00000000..6f410468 --- /dev/null +++ b/src/webextension/.dir-locals.el @@ -0,0 +1,2 @@ +; Use rjsx-mode instead of js2-mode for files in this directory. +((js2-mode . ((mode . rjsx)))) From 7a3afc90169ff25ef910401885908db7246d3abc Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 19 Oct 2017 14:26:59 -0500 Subject: [PATCH 02/27] Add placeholder for empty list --- src/webextension/locales/en-US/manage.ftl | 6 ++++++ .../manage/components/item-list.css | 8 ++++++++ .../manage/components/item-list.js | 12 ++++++++++++ .../manage/containers/all-items.js | 18 +++++++++++++++--- test/manage/containers/all-items-test.js | 3 +++ 5 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/webextension/locales/en-US/manage.ftl b/src/webextension/locales/en-US/manage.ftl index 3970016e..566e0756 100644 --- a/src/webextension/locales/en-US/manage.ftl +++ b/src/webextension/locales/en-US/manage.ftl @@ -14,6 +14,12 @@ toolbar-send-feedback = Feedback item-filter .placeholder = Search for an entry +all-items-empty = + Looks like you don't have any entries saved yet… + + Create a new entry so Lockie has something to protect. +all-items-filtered = No results + item-summary-new-item = New Entry item-summary-no-title = (No Entry Name) item-summary-no-username = (No Username) diff --git a/src/webextension/manage/components/item-list.css b/src/webextension/manage/components/item-list.css index 2514477d..7eb5c358 100644 --- a/src/webextension/manage/components/item-list.css +++ b/src/webextension/manage/components/item-list.css @@ -2,6 +2,14 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +.empty { + white-space: pre-wrap; + margin: 3em 1em; + font-style: italic; + text-align: center; + color: #626262; +} + .item:nth-child(2n+1) { background-color: #f1f1f1; } diff --git a/src/webextension/manage/components/item-list.js b/src/webextension/manage/components/item-list.js index 193f97b8..a2e79072 100644 --- a/src/webextension/manage/components/item-list.js +++ b/src/webextension/manage/components/item-list.js @@ -34,3 +34,15 @@ ItemList.propTypes = { selected: PropTypes.string, onItemSelected: PropTypes.func.isRequired, }; + +export function ItemListPlaceholder({children}) { + return ( +
+ {children} +
+ ); +} + +ItemListPlaceholder.propTypes = { + children: PropTypes.node, +}; diff --git a/src/webextension/manage/containers/all-items.js b/src/webextension/manage/containers/all-items.js index e9eb9d32..2843addf 100644 --- a/src/webextension/manage/containers/all-items.js +++ b/src/webextension/manage/containers/all-items.js @@ -2,18 +2,19 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { withLocalization } from "fluent-react"; +import { Localized, withLocalization } from "fluent-react"; +import PropTypes from "prop-types"; import React from "react"; import { connect } from "react-redux"; import { requestSelectItem } from "../actions"; import { parseFilterString, filterItem } from "../filter"; import { NEW_ITEM_ID } from "../common"; -import ItemList from "../components/item-list"; +import ItemList, { ItemListPlaceholder } from "../components/item-list"; const collator = new Intl.Collator(); -function AllItems({items, selected, getString, ...props}) { +function AllItems({totalItemCount, items, selected, getString, ...props}) { if (selected === NEW_ITEM_ID) { items = [ { title: getString("item-summary-new-item"), @@ -23,10 +24,20 @@ function AllItems({items, selected, getString, ...props}) { ]; } + if (items.length === 0) { + return ( + + + lOOKs lIKe yOu dON't hAVe aNy eNTRIEs sAVEd yEt... + + + ); + } return ; } AllItems.propTypes = { + totalItemCount: PropTypes.number.isRequired, ...ItemList.propTypes, }; @@ -34,6 +45,7 @@ export default connect( (state, ownProps) => { const filter = parseFilterString(state.filter); return { + totalItemCount: state.cache.items.length, items: state.cache.items .filter((i) => filterItem(filter, i)) .sort((a, b) => collator.compare(a.title, b.title)), diff --git a/test/manage/containers/all-items-test.js b/test/manage/containers/all-items-test.js index 3820c5ba..0c870994 100644 --- a/test/manage/containers/all-items-test.js +++ b/test/manage/containers/all-items-test.js @@ -41,6 +41,9 @@ describe("manage > containers > ", () => { it("render items", () => { expect(wrapper.find(ItemSummary)).to.have.length(0); + expect(wrapper.find("div")).to.have.text( + "lOOKs lIKe yOu dON't hAVe aNy eNTRIEs sAVEd yEt..." + ); }); }); From 88e6560da512bb332b9bd5032bd73b9af0f4bedb Mon Sep 17 00:00:00 2001 From: Devin Reams Date: Wed, 1 Nov 2017 14:43:46 -0600 Subject: [PATCH 03/27] Pre-release notes to include and push in 0.1.1-alpha1 (#279) * Bump to version 0.1.1-alpha * Add obvious warnings for repository and docs * Add release notes to explain the pre-release warning * Consistent strong treatment for pre-release warning --- README.md | 3 +++ docs/index.md | 3 +++ docs/release-notes.md | 17 ++++++++++++++++- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7b3de9ed..0868c607 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,9 @@ Lockbox for Firefox is a work-in-progress extension for Firefox to improve upon Firefox's built-in password management. If you're interested, you should probably come back later when we have more to show! +:warning: **Note: This is a rapidly evolving prototype that will change. Any +data stored here is not guaranteed to be retained in future updates.** + ## [Quick Installation][install-link] If you'd like to quickly **start up a new Firefox profile on Nightly** with diff --git a/docs/index.md b/docs/index.md index 2cfe9609..ac675473 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,3 +5,6 @@ Click below to install the Lockbox extension: [install][install-link]{: .button-link } [install-link]: https://testpilot.firefox.com/files/lockbox@mozilla.com/latest + +**Note: This is a rapidly evolving prototype that will change. Any data stored +is not guaranteed to be retained in future updates.** diff --git a/docs/release-notes.md b/docs/release-notes.md index c0e545e3..78300820 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,5 +1,20 @@ # Lockbox Release Notes +## 0.1.1-alpha1 + +_Date: 2017-11-01_ + +### What's Fixed + +* We added language to the first-run experience to remind testers that this is pre-release software and both **subject to change and data may not be retained**. + +### Known Issues + +* There is no way to change your Lockbox master password. If you forget your master password, you'll need to start over fresh by either: + - Opening the this extension's Preferences and clicking the "`💥💣 Reset 💣💥`" button; or + - Uninstalling and re-installing the extension +* Firefox's default prompt to save logins is only disabled on new installs of this extension; updating Lockbox will not change your current Firefox preferences. + ## 0.1.1-alpha _Date: 2017-10-30_ @@ -43,6 +58,6 @@ This starts as a signed Firefox extension where you can: ### Known Issues -* Lockbox has only been tested on Firefox 57 and above. Installing on Firefox 56 or lower may not function at all. +* Lockbox has only been tested on Firefox 57 and above. Installing on Firefox 56 or lower may not function at all. * There is no way to reset your Lockbox master password. If you forget your master password, you'll need to start over fresh by uninstalling and re-installing this extension. * This is a Lockbox account, which stays local to your Firefox installation. There is no integration with Firefox accounts to sync (yet). diff --git a/package-lock.json b/package-lock.json index 89104547..04d274a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lockbox", - "version": "0.1.1-alpha", + "version": "0.1.1-alpha1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b4f2f447..0c8a95f0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "title": "Lockbox", "name": "lockbox", "id": "lockbox@mozilla.com", - "version": "0.1.1-alpha", + "version": "0.1.1-alpha1", "main": "dist/bootstrap.js", "description": "A Lockbox extension for Firefox", "author": "Lockbox Team ", From 4c75cac3b73462b308a3ecf29fee4d6389d69f51 Mon Sep 17 00:00:00 2001 From: Devin Reams Date: Wed, 1 Nov 2017 14:50:08 -0600 Subject: [PATCH 04/27] Add a warning to first run introduction about this being a pre-release (#275) * Add a warning to first run introduction Fixes #270 requested by @sandysage to explain features may change and data may not be retained between releases * missing a word * Better semantics for important message * Clearer warning, doesn't bury lede, not as scary * Quick hack to get strong tag output after localization happens --- src/webextension/firstrun/components/welcome.js | 9 +++++++++ src/webextension/locales/en-US/firstrun.ftl | 6 +++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/webextension/firstrun/components/welcome.js b/src/webextension/firstrun/components/welcome.js index 57074972..816512cc 100644 --- a/src/webextension/firstrun/components/welcome.js +++ b/src/webextension/firstrun/components/welcome.js @@ -20,6 +20,15 @@ export default function Welcome() { adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Cras mattis consectetur purus sit amet fermentum.

+

+ + Lorem ipsum dolor sit amet, consectetur. + Mauris, aliquam vel pellentesque et, mattis bibendum tellus. Fusce + sodales, tellus a auctor accumsan, diam risus pharetra orci, at lacinia + libero eros ut erat. Fusce ex neque, pharetra id rhoncus in, + pellentesque quis urna. + +

Curabitur blandit tempus porttitor. Nulla vitae elit libero, a pharetra augue. Vestibulum id ligula porta felis euismod semper. diff --git a/src/webextension/locales/en-US/firstrun.ftl b/src/webextension/locales/en-US/firstrun.ftl index ff4cb5bd..87a965e3 100644 --- a/src/webextension/locales/en-US/firstrun.ftl +++ b/src/webextension/locales/en-US/firstrun.ftl @@ -9,10 +9,14 @@ welcome-intro = new entries, and then later you can view, search, edit, and delete those entries. +welcome-warning = + This is a rapidly evolving prototype that will change as Alpha progresses. + Any data stored here is not guaranteed to be retained in future updates. + welcome-feedback = Please be sure to let us know your thoughts using our feedback button within the tool, including any issues you may find, things - you like, and the things you're looking forward in the future. + you like, and the things you're looking forward to in the future. master-password-setup-formtitle = Please create a master password below: From 1ec24a358d01787ee61c66e4bf56e627c30605eb Mon Sep 17 00:00:00 2001 From: Devin Reams Date: Wed, 1 Nov 2017 14:54:47 -0600 Subject: [PATCH 05/27] Add release instructions (#158) * Add instructions on how to prepare a new release * forgot to remove old instructions when re-arranging * include versioning notes, we follow semver * add changelog convention and manual check step * update releases.md based on conversations/reviews * update changelog/release-notes section to reflect current realities * reformat to account for mkdocs sublist handling * updates based on personal experience * expanding the last step into two * (WIP) account for checklists * cleanup and wording based on talks with @m8ttyB and @sandysage * added line to releases.md about user stories/epics * tweask to section * fix a typo --- docs/releases.md | 64 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index f1475a64..0442e598 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1,23 +1,67 @@ -## Releases +# Releases -## Preparation +## Checklist -To **prepare the extension for a new version**, you must: +Before a release can be made, the following must be done: -- update and commit the version in `package.json` -- update and commit the `CHANGELOG.md` -- tag, push, and merge to the `master` branch on GitHub +* Any user stories labeled as `epic` to be included in the release are approved by Product and PI +* All finished work is verified to work as expected and committed to `master` +* Any unfinished work has been triaged and assigned to the appropriate milestone +* Product, Engineering, and PI have voiced approval to release (e.g., via Slack team channel) -## Packaging -To **build a signed extension .xpi**, you must: commit and push to the -`production` branch (ideally as a merge commit from `master`) on GitHub. +## Instructions + +**NOTE:** these instructions assume: + +* All of the [checklist items](#checklist) are complete +* You are an administrator of the project `lockbox-extension` +* Your local git working copy has a remote named `upstream` pointing to `git@github.com:mozilla-lockbox/lockbox-extension.git` + +To generate the next release binary: + +1. Update "version" in package.json (and package-lock.json) + - we follow the [semver](http://semver.org/) syntax + - _Alpha_ releases will be labeled with "-alpha" (e.g., "0.1.0-alpha") + - _Beta_ releases will be labeled with "-beta" (e.g., "1.0.0-beta") + - _Stable_ releases will **not** be labeled, and follow semver from the last Beta release (e.g., "1.0.0") +2. Update `docs/release-notes.md`: + - latest release is at the top, under a second-level header + - each release includes the sub headings "What's New", "What's Fixed", and "Known Issues" + - consult with Product Management on wording if needed +2. Commit and ultimately merge to `master` branch +3. Merge the `master` branch into `production` branch and push to GitHub: + - `git checkout master` + - `git pull upstream master` (to make sure you have the latest) + - `git checkout production` + - `git pull upstream production` (to make sure you have the latest) + - `git merge master` + - `git push upstream production` + - Test Pilot's Jenkins will now build and sign the extension (see ["Extension Signing"](#extension-signing)) +4. Tag the latest commit on `production` branch with an annotated version and push the tag: + - `git tag -a -m "Release 0.1.0" 0.1.0` + - `git push upstream 0.1.0` + - Travis-CI will build and generate a GitHub Release +7. Edit the resulting GitHub Release + - Set the GitHub Release title to match the version + - Set the GitHub Release notes to match the `docs/release-notes.md` + - Download the signed add-on: `wget -O signed-addon.xpi https://testpilot.firefox.com/files/lockbox@mozilla.com/latest` + - Attach to the GitHub Release the downloaded signed add-on +8. Send an announcement to the team (e.g., via Slack team channel) + ## Extension Signing Learn about the Test Pilot extension deployment and hosting process here: https://github.com/mozilla/testpilot/blob/master/docs/development/hosting.md -This repository is in the "testpilot-mozillaextension" Jenkins pipeline. +This repository is in the **"testpilot-mozillaextension"** Jenkins pipeline. The CloudOps team manages access to, and can help report on, the status of the builds. + +The resulting files deployed are: + +- Updates file for automatic browser extension updates: [https://testpilot.firefox.com/files/lockbox@mozilla.com/updates.json](https://testpilot.firefox.com/files/lockbox@mozilla.com/updates.json) +- Latest version of the signed extension XPI: [https://testpilot.firefox.com/files/lockbox@mozilla.com/latest](https://testpilot.firefox.com/files/lockbox@mozilla.com/latest) + +**IMPORTANT:** Test Pilot reports the status of build, signing, and deployment of its artifacts on the IRC channel **#testpilot-bots**. Be sure to join the channel prior to pushing the `production` branch to GitHub in order to receive the status updates. From a958b98d888fde6464a81f0e802740e1c6407a1c Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 26 Oct 2017 14:13:57 -0500 Subject: [PATCH 06/27] Make `nsp` a dev-dependency so it can be run locally (and so we're not just assuming Travis will always have nsp installed) --- .travis.yml | 2 +- package-lock.json | 283 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 + 3 files changed, 286 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fa1e520f..8ad07ab3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ addons: script: - STRICT_LINT=1 npm run test - - npx nsp check + - npm run nsp after_success: - npm run codecov diff --git a/package-lock.json b/package-lock.json index 04d274a1..54148350 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10144,6 +10144,289 @@ "path-key": "2.0.1" } }, + "nsp": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/nsp/-/nsp-2.8.1.tgz", + "integrity": "sha512-jvjDg2Gsw4coD/iZ5eQddsDlkvnwMCNnpG05BproSnuG+Gr1bSQMwWMcQeYje+qdDl3XznmhblMPLpZLecTORQ==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-table": "0.3.1", + "cvss": "1.0.2", + "https-proxy-agent": "1.0.0", + "joi": "6.10.1", + "nodesecurity-npm-utils": "5.0.0", + "path-is-absolute": "1.0.1", + "rc": "1.2.1", + "semver": "5.4.1", + "subcommand": "2.1.0", + "wreck": "6.3.0" + }, + "dependencies": { + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "requires": { + "extend": "3.0.1", + "semver": "5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + } + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "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" + } + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "cliclopts": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cliclopts/-/cliclopts-1.1.1.tgz", + "integrity": "sha1-aUMcfLWvcjd0sNORG0w3USQxkQ8=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "cvss": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cvss/-/cvss-1.0.2.tgz", + "integrity": "sha1-32fpK/EqeW9J6Sh5nI2zunS5/NY=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "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=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.1" + } + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "isemail": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=", + "dev": true + }, + "joi": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", + "dev": true, + "requires": { + "hoek": "2.16.3", + "isemail": "1.2.0", + "moment": "2.18.1", + "topo": "1.1.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "moment": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nodesecurity-npm-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nodesecurity-npm-utils/-/nodesecurity-npm-utils-5.0.0.tgz", + "integrity": "sha1-Baow3jDKjIRcQEjpT9eOXgi1Xtk=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "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 + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "subcommand": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/subcommand/-/subcommand-2.1.0.tgz", + "integrity": "sha1-XkzspaN3njNlsVEeBfhmh3MC92A=", + "dev": true, + "requires": { + "cliclopts": "1.1.1", + "debug": "2.6.9", + "minimist": "1.2.0", + "xtend": "4.0.1" + } + }, + "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 + }, + "topo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", + "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "wreck": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz", + "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=", + "dev": true, + "requires": { + "boom": "2.10.1", + "hoek": "2.16.3" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", diff --git a/package.json b/package.json index 0c8a95f0..1fdab21b 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "run": "jpm run --addon-dir dist/ ${npm_config_jpm_runflags} --prefs jpm-prefs.json", "pretest": "npm run-script autolint", "test": "cross-env NODE_ENV=test karma start", + "nsp": "nsp check", "codecov": "codecov", "clean": "git clean -fX ./dist ./*.xpi ./addon.env && npm run :clean:doc ", "distclean": "git clean -dfX", @@ -115,6 +116,7 @@ "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^2.0.5", "mocha": "^4.0.1", + "nsp": "^2.8.1", "raw-loader": "^0.5.1", "react-document-title": "^2.0.3", "react-test-renderer": "^16.0.0", From 4189865271a9e8f59a62a57de42fa8e63e727edc Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 26 Oct 2017 15:04:25 -0500 Subject: [PATCH 07/27] Update dependencies to all the latest versions --- package-lock.json | 1107 ++++++++++++++++++++++++--------------------- package.json | 34 +- 2 files changed, 605 insertions(+), 536 deletions(-) diff --git a/package-lock.json b/package-lock.json index 54148350..7688883e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1944,9 +1944,9 @@ } }, "babel-preset-env": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.0.tgz", - "integrity": "sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", "dev": true, "requires": { "babel-plugin-check-es2015-constants": "6.22.0", @@ -1976,21 +1976,27 @@ "babel-plugin-transform-es2015-unicode-regex": "6.24.1", "babel-plugin-transform-exponentiation-operator": "6.24.1", "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.4.0", + "browserslist": "2.5.1", "invariant": "2.2.2", "semver": "5.4.1" }, "dependencies": { "browserslist": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.4.0.tgz", - "integrity": "sha512-aM2Gt4x9bVlCUteADBS6JP0F+2tMWKM1jQzUulVROtdFWFIcIVvY76AJbr7GDqy0eDhn+PcnpzzivGxY4qiaKQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.5.1.tgz", + "integrity": "sha512-jAvM2ku7YDJ+leAq3bFH1DE0Ylw+F+EQDq4GkqZfgPEqpWYw9ofQH85uKSB9r3Tv7XDbfqVtE+sdvKJW7IlPJA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000718", - "electron-to-chromium": "1.3.18" + "caniuse-lite": "1.0.30000751", + "electron-to-chromium": "1.3.27" } }, + "electron-to-chromium": { + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", + "dev": true + }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", @@ -1999,38 +2005,6 @@ } } }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, "babel-preset-flow": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", @@ -2828,9 +2802,9 @@ "dev": true }, "browserify-aes": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz", - "integrity": "sha512-WYCMOT/PtGTlpOKFht0YJFYcPy6pLCR98CtWfzK13zoynLlBMvAdEMSRGmgnJCw2M2j/5qxBkinZQFobieM8dQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", "dev": true, "requires": { "buffer-xor": "1.0.3", @@ -2847,7 +2821,7 @@ "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", "dev": true, "requires": { - "browserify-aes": "1.0.8", + "browserify-aes": "1.1.1", "browserify-des": "1.0.0", "evp_bytestokey": "1.0.3" } @@ -3073,9 +3047,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30000718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000718.tgz", - "integrity": "sha1-DdJCkL6xExCy2A9rcKgjwqZab60=", + "version": "1.0.30000751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000751.tgz", + "integrity": "sha1-KYrTQYLKQ1l1e0qTr8aBt7kX41g=", "dev": true }, "caseless": { @@ -3277,7 +3251,7 @@ "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", - "kind-of": "5.0.2" + "kind-of": "5.1.0" } }, "isobject": { @@ -3287,9 +3261,9 @@ "dev": true }, "kind-of": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.0.2.tgz", - "integrity": "sha512-ru8+TQHbN8956c7ZlkgK5Imjx0GMat3jN45GNIthpPeb+SzLrqSg/NG7llQtIqUTbrdu5Oi0lSnIoJmDTwwSzw==", + "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 }, "lazy-cache": { @@ -3389,9 +3363,9 @@ "dev": true }, "codecov": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-2.3.0.tgz", - "integrity": "sha1-rSWixuBELRN0DZ1N27mj4nFDMPQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.0.tgz", + "integrity": "sha1-wnO4xPEpRXI+jcnSWAPYk0Pl8o4=", "dev": true, "requires": { "argv": "0.0.2", @@ -3480,12 +3454,6 @@ "requires": { "safe-buffer": "5.1.1" } - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true } } }, @@ -3799,9 +3767,9 @@ } }, "copy-webpack-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.1.1.tgz", - "integrity": "sha512-qcjV9uj5PFuKo9GDr0xYAZ3DwFA3ugwDcfbLHfiDrvnUx66Z7C4r00/ds856GaGb2cGHqLTwrGxwfvW+lgAQew==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.2.0.tgz", + "integrity": "sha512-eZERim02YjJcepLjrToQMapOoRLfiXewJi9zJON6xXNNJSUhkGzL1L/yFjOufS0KxsnWUzc2szg9t8ZaZKJXAg==", "dev": true, "requires": { "bluebird": "3.5.1", @@ -3968,9 +3936,9 @@ } }, "cross-env": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.0.5.tgz", - "integrity": "sha1-Q4PTZNlmCHPdGFs5ivO/717//vM=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.0.tgz", + "integrity": "sha512-R+0paw9UZQc7odHjIxElqyYotgyMlhcUMTfRxiv4I22grgvS5WOSSfCpyfAZUDhP/c9ShSRv+Hzfxs6fY4JA7g==", "dev": true, "requires": { "cross-spawn": "5.1.0", @@ -4225,6 +4193,12 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "decompress-zip": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz", @@ -4249,6 +4223,11 @@ "type-detect": "4.0.3" } }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -4448,9 +4427,9 @@ } }, "documentation": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/documentation/-/documentation-5.3.2.tgz", - "integrity": "sha512-6/pRZohBGzOXvN4Zp9trq+3A++rS9/FOEasu6zDnn/plH2rqR0RZmO3hWiTRmRmhzG3zXiKFBEv0bjowqWP0WQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/documentation/-/documentation-5.3.3.tgz", + "integrity": "sha512-Avfo2uXeavwN/iiQ0djoJbSHAlzIU2MuZeebmDoFs2HmcAf+OHqokWSWZSD/wSuQXuhH7yiIsbM6dWGXb1gruw==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -4458,28 +4437,28 @@ "babel-generator": "6.25.0", "babel-plugin-system-import-transformer": "3.1.0", "babel-plugin-transform-decorators-legacy": "1.3.4", - "babel-preset-es2015": "6.24.1", + "babel-preset-env": "1.6.1", "babel-preset-react": "6.24.1", "babel-preset-stage-0": "6.24.1", "babel-traverse": "6.25.0", "babel-types": "6.25.0", "babelify": "7.3.0", "babylon": "6.17.4", - "chalk": "2.1.0", + "chalk": "2.3.0", "chokidar": "1.7.0", "concat-stream": "1.6.0", "disparity": "2.0.0", "doctrine-temporary-fork": "2.0.0-alpha-allowarrayindex", "get-port": "3.2.0", "git-url-parse": "6.2.2", - "github-slugger": "1.1.3", + "github-slugger": "1.2.0", "glob": "7.1.2", "globals-docs": "2.3.0", "highlight.js": "9.12.0", "js-yaml": "3.10.0", "lodash": "4.11.1", "mdast-util-inject": "1.1.0", - "micromatch": "3.1.0", + "micromatch": "3.1.3", "mime": "1.4.1", "module-deps-sortable": "4.0.6", "parse-filepath": "1.0.1", @@ -4500,7 +4479,7 @@ "vfile-sort": "2.1.0", "vinyl": "2.1.0", "vinyl-fs": "2.4.4", - "yargs": "6.6.0" + "yargs": "9.0.1" }, "dependencies": { "ansi-styles": { @@ -4525,9 +4504,9 @@ "dev": true }, "braces": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.2.2.tgz", - "integrity": "sha1-JB+GjCsmkNn+vu5afIP7vyXQCxs=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz", + "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==", "dev": true, "requires": { "arr-flatten": "1.1.0", @@ -4539,47 +4518,19 @@ "repeat-element": "1.1.2", "snapdragon": "0.8.1", "snapdragon-node": "2.1.1", - "split-string": "2.1.1", + "split-string": "3.0.2", "to-regex": "3.0.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" - } - } } }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "supports-color": "4.5.0" } }, "expand-brackets": { @@ -4622,17 +4573,6 @@ "regex-not": "1.0.0", "snapdragon": "0.8.1", "to-regex": "3.0.1" - }, - "dependencies": { - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - } } }, "fill-range": { @@ -4645,17 +4585,6 @@ "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" - } - } } }, "has-flag": { @@ -4672,7 +4601,15 @@ "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", - "kind-of": "5.0.2" + "kind-of": "5.1.0" + }, + "dependencies": { + "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 + } } }, "is-number": { @@ -4702,9 +4639,9 @@ "dev": true }, "kind-of": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.0.2.tgz", - "integrity": "sha512-ru8+TQHbN8956c7ZlkgK5Imjx0GMat3jN45GNIthpPeb+SzLrqSg/NG7llQtIqUTbrdu5Oi0lSnIoJmDTwwSzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.0.tgz", + "integrity": "sha512-sUd5AnFyOPh+RW+ZIHd1FHuwM4OFvhKCPVxxhamLxWLpmv1xQ394lzRMmhLQOiMpXvnB64YRLezWaJi5xGk7Dg==", "dev": true }, "load-json-file": { @@ -4728,72 +4665,24 @@ } }, "micromatch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", - "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.3.tgz", + "integrity": "sha512-gVCSW2StFfuHZYfh/p/HJpdTyB/YX/mr/EATvmw9zMQa6BSUioG4hg4duKEKc47OaXioikzhgFYS/m4EyLmXXg==", "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", - "braces": "2.2.2", + "braces": "2.3.0", "define-property": "1.0.0", "extend-shallow": "2.0.1", "extglob": "2.0.2", "fragment-cache": "0.2.1", - "kind-of": "5.0.2", - "nanomatch": "1.2.3", + "kind-of": "6.0.0", + "nanomatch": "1.2.5", "object.pick": "1.3.0", "regex-not": "1.0.0", "snapdragon": "0.8.1", "to-regex": "3.0.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" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "nanomatch": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.3.tgz", - "integrity": "sha512-HqDMQWJlwpXbfKDpAnkc6AJQh5PFqVlrjYbruDjYVAS+05TQUb1qhIde4G9jMzHbs/u6bgEok1jMAV4yJzoh+w==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "is-odd": "1.0.0", - "kind-of": "5.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.0", - "snapdragon": "0.8.1", - "to-regex": "3.0.1" - } - } - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" } }, "path-type": { @@ -4847,115 +4736,13 @@ "dev": true }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { "has-flag": "2.0.0" } - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } } } }, @@ -5337,16 +5124,17 @@ } }, "enzyme-adapter-react-16": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.1.tgz", - "integrity": "sha1-Bmyxc15l2NlYQaAj+U2rPOYQnhc=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.2.tgz", + "integrity": "sha512-ePlf3ikzau4NatDCzBP1Y/rFgLhR6MnS1YQVrxD2KXFI31nE1HtL+6ciqALF8kHe5q7Y7lFAd1MYOLIriRqgcw==", "dev": true, "requires": { "enzyme-adapter-utils": "1.0.1", "lodash": "4.17.4", "object.assign": "4.0.4", "object.values": "1.0.4", - "prop-types": "15.6.0" + "prop-types": "15.6.0", + "react-test-renderer": "16.0.0" }, "dependencies": { "lodash": { @@ -5595,14 +5383,14 @@ } }, "eslint": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.8.0.tgz", - "integrity": "sha1-Ip7w41Tg5h2DfHqA/fuoJeGZgV4=", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.9.0.tgz", + "integrity": "sha1-doedJ0BoJhsZH+Dy9Wx0wvQgjos=", "dev": true, "requires": { "ajv": "5.2.2", "babel-code-frame": "6.22.0", - "chalk": "2.1.0", + "chalk": "2.3.0", "concat-stream": "1.6.0", "cross-spawn": "5.1.0", "debug": "3.1.0", @@ -5635,7 +5423,7 @@ "semver": "5.4.1", "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", - "table": "4.0.1", + "table": "4.0.2", "text-table": "0.2.0" }, "dependencies": { @@ -5655,14 +5443,14 @@ } }, "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" + "supports-color": "4.5.0" } }, "debug": { @@ -5708,9 +5496,9 @@ } }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { "has-flag": "2.0.0" @@ -5731,13 +5519,13 @@ "dev": true, "requires": { "debug": "2.6.8", - "resolve": "1.4.0" + "resolve": "1.5.0" }, "dependencies": { "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -5786,9 +5574,9 @@ } }, "eslint-plugin-import": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz", - "integrity": "sha512-HGYmpU9f/zJaQiKNQOVfHUh2oLWW3STBrCgH0sHTX1xtsxYlH1zjLh8FlQGEIdZSdTbUMaV36WaZ6ImXkenGxQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", "dev": true, "requires": { "builtin-modules": "1.1.1", @@ -5879,9 +5667,9 @@ } }, "eslint-plugin-mozilla": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-mozilla/-/eslint-plugin-mozilla-0.4.4.tgz", - "integrity": "sha512-6JHqGep5/2PtWV9GyFn8Cna/+zZe28N/1Z26og5/RvvBj6YC2Dsla0dmyr0byXuA1DxyMVq0l47PdPytdTRlhA==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-mozilla/-/eslint-plugin-mozilla-0.4.5.tgz", + "integrity": "sha512-RSc+xcUaFqU+Zqr9eoxsAcrHtTAGykfNGJ14VMDaIAfW78ILSF1GBvOmQRzef7xELjIB+rHyCIbasCdSBbuATA==", "dev": true, "requires": { "ini-parser": "0.0.2", @@ -6110,17 +5898,23 @@ } }, "eslint-plugin-node": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.0.tgz", - "integrity": "sha512-N9FLFwknT5LhRhjz1lmHguNss/MCwkrLCS4CjqqTZZTJaUhLRfDNK3zxSHL/Il3Aa0Mw+xY3T1gtsJrUNoJy8Q==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", "dev": true, "requires": { - "ignore": "3.3.5", + "ignore": "3.3.7", "minimatch": "3.0.4", - "resolve": "1.4.0", + "resolve": "1.5.0", "semver": "5.3.0" }, "dependencies": { + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -6131,9 +5925,9 @@ } }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -6154,9 +5948,9 @@ "dev": true }, "eslint-plugin-promise": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz", - "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", + "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", "dev": true }, "eslint-plugin-react": { @@ -6401,9 +6195,9 @@ } }, "extract-text-webpack-plugin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.1.tgz", - "integrity": "sha512-zv0/Cg2mU8uMzeQQ3oyfJvZU4Iv/GbQYUIr/HU+8pZetT/0W3xj6XAbxoG4gsp8SbnYcFd4BOsCAZPl9NvplPw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "dev": true, "requires": { "async": "2.5.0", @@ -6451,6 +6245,12 @@ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", "dev": true }, + "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", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -6725,6 +6525,15 @@ "samsam": "1.3.0" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, "fs-extra": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", @@ -6900,9 +6709,9 @@ } }, "github-slugger": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.1.3.tgz", - "integrity": "sha1-MUpudZoYwrDMV2DVEsy6tUnFSac=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.0.tgz", + "integrity": "sha512-wIaa75k1vZhyPm9yWrD08A5Xnx/V+RmzGrpjQuLemGKSb77Qukiaei58Bogrl/LZSADDfPzKJX8jhLs4CRTl7Q==", "dev": true, "requires": { "emoji-regex": "6.1.1" @@ -7424,9 +7233,9 @@ "dev": true }, "html-minifier": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.5.tgz", - "integrity": "sha512-g+1+NBycQI0fGnggd52JM8TRUweG7+9W2wrtjGitMAqc4G7maweAHvVAAjz9veHseIH3tYKE2lk2USGSoewIrQ==", + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.6.tgz", + "integrity": "sha512-88FjtKrlak2XjczhxrBomgzV4jmGzM3UnHRBScRkJcmcRum0kb+IwhVAETJ8AVp7j0p3xugjSaw9L+RmI5/QOA==", "dev": true, "requires": { "camel-case": "3.0.0", @@ -7436,7 +7245,7 @@ "ncname": "1.0.0", "param-case": "2.1.1", "relateurl": "0.2.7", - "uglify-js": "3.1.1" + "uglify-js": "3.1.5" }, "dependencies": { "commander": { @@ -7460,7 +7269,7 @@ "dev": true, "requires": { "bluebird": "3.5.0", - "html-minifier": "3.5.5", + "html-minifier": "3.5.6", "loader-utils": "0.2.17", "lodash": "4.17.4", "pretty-error": "2.1.1", @@ -7552,9 +7361,9 @@ } }, "http-parser-js": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.8.tgz", - "integrity": "sha512-jmHp99g6/fLx0pRNJqzsQgjsclCHAY7NhIeA3/U+bsGNvgbvUCQFQY9m5AYpqpAxY/2VcikfbKpjQozSTiz0jA==", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", + "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", "dev": true }, "http-proxy": { @@ -7726,7 +7535,7 @@ "dev": true, "requires": { "ansi-escapes": "3.0.0", - "chalk": "2.1.0", + "chalk": "2.3.0", "cli-cursor": "2.1.0", "cli-width": "2.2.0", "external-editor": "2.0.5", @@ -7757,14 +7566,14 @@ } }, "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" + "supports-color": "4.5.0" } }, "has-flag": { @@ -7799,9 +7608,9 @@ } }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { "has-flag": "2.0.0" @@ -7943,13 +7752,13 @@ "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", - "kind-of": "5.0.2" + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.0.2.tgz", - "integrity": "sha512-ru8+TQHbN8956c7ZlkgK5Imjx0GMat3jN45GNIthpPeb+SzLrqSg/NG7llQtIqUTbrdu5Oi0lSnIoJmDTwwSzw==", + "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 } } @@ -8434,6 +8243,11 @@ "topo": "1.1.0" } }, + "joi-browser": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/joi-browser/-/joi-browser-10.6.1.tgz", + "integrity": "sha1-HPwaJEySQjJ4QsJDVNjq0cL+NXE=" + }, "jpm": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jpm/-/jpm-1.3.1.tgz", @@ -8520,6 +8334,14 @@ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, + "json-merge-patch": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-merge-patch/-/json-merge-patch-0.2.3.tgz", + "integrity": "sha1-+ixrWvh9p3uuKWalidUuI+2B/kA=", + "requires": { + "deep-equal": "1.0.1" + } + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -8650,9 +8472,9 @@ } }, "just-extend": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.22.tgz", - "integrity": "sha1-MzCvdWyralQnAMZLLk5KoGLVL/8=", + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.26.tgz", + "integrity": "sha512-IIG0FXHB/XpUZ7vGbktoc2EGsF+fLHJ1tU+vaqoKkVRBwH2FDxLTmkGkSp0XHRp6Y3KGZPIldH1YW8lOluGYrA==", "dev": true }, "jwa": { @@ -8767,12 +8589,12 @@ } }, "karma-mocha-reporter": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.4.tgz", - "integrity": "sha1-DJyyLCfYZND2aU3wzwHKq86QZNQ=", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", + "integrity": "sha1-FRIAlejtgZGG5HoLAS8810GJVWA=", "dev": true, "requires": { - "chalk": "2.1.0", + "chalk": "2.3.0", "log-symbols": "2.1.0", "strip-ansi": "4.0.0" }, @@ -8793,14 +8615,14 @@ } }, "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" + "supports-color": "4.5.0" } }, "has-flag": { @@ -8819,9 +8641,9 @@ } }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { "has-flag": "2.0.0" @@ -9023,12 +8845,53 @@ } }, "lockbox-datastore": { - "version": "git+https://github.com/mozilla-lockbox/lockbox-datastore.git#2fc1bd6b940c5a858cd2f2a51923f7059310fde2", + "version": "git+https://github.com/mozilla-lockbox/lockbox-datastore.git#dff86556265e63ae50a05f9cec2333e671f4f843", "requires": { "dexie": "1.5.1", "fake-indexeddb": "2.0.3", + "joi": "13.0.1", + "joi-browser": "10.6.1", + "json-merge-patch": "0.2.3", "node-jose": "0.10.0", "uuid": "3.1.0" + }, + "dependencies": { + "hoek": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.1.tgz", + "integrity": "sha512-sZ2Et6jQxNCSShCUlPqzLNVD5bjWQxrCE6Bi4pgxcWaqIGk6dwdWszcJTn1qwrQLRwflxTaxfDX+QU3kioDuvw==" + }, + "isemail": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.0.0.tgz", + "integrity": "sha512-rz0ng/c+fX+zACpLgDB8fnUQ845WSU06f4hlhk4K8TJxmR6f5hyvitu9a9JdMD7aq/P4E0XdG1uaab2OiXgHlA==", + "requires": { + "punycode": "2.1.0" + } + }, + "joi": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-13.0.1.tgz", + "integrity": "sha512-ChTMfmbIg5yrN9pUdeaLL8vzylMQhUteXiXa1MWINsMUs3jTQ8I87lUZwR5GdfCLJlpK04U7UgrxgmU8Zp7PhQ==", + "requires": { + "hoek": "5.0.1", + "isemail": "3.0.0", + "topo": "3.0.0" + } + }, + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + }, + "topo": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.0.tgz", + "integrity": "sha512-Tlu1fGlR90iCdIPURqPiufqAlCZYzLjHYVVbcFWDMcX7+tK8hdZWAfsMrD/pBul9jqHHwFjNdf1WaxA9vTRRhw==", + "requires": { + "hoek": "5.0.1" + } + } } }, "lodash": { @@ -9175,7 +9038,7 @@ "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", "dev": true, "requires": { - "chalk": "2.1.0" + "chalk": "2.3.0" }, "dependencies": { "ansi-styles": { @@ -9188,14 +9051,14 @@ } }, "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" + "supports-color": "4.5.0" } }, "has-flag": { @@ -9205,9 +9068,9 @@ "dev": true }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { "has-flag": "2.0.0" @@ -9407,15 +9270,15 @@ } }, "mdast-util-to-hast": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-2.4.2.tgz", - "integrity": "sha1-8Rbovz2ncrpaOXqS2rCQ9bqRyqA=", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-2.5.0.tgz", + "integrity": "sha1-8IeETSVcdUDzaQbaMLoQbA7l7i8=", "dev": true, "requires": { "collapse-white-space": "1.0.3", "detab": "2.0.1", "mdast-util-definitions": "1.2.2", - "normalize-uri": "1.1.0", + "mdurl": "1.0.1", "trim": "0.0.1", "trim-lines": "1.1.0", "unist-builder": "1.0.2", @@ -9437,11 +9300,17 @@ "integrity": "sha1-sdLLI7+wH4Evp7Vb/+iwqL7fbyE=", "dev": true, "requires": { - "github-slugger": "1.1.3", + "github-slugger": "1.2.0", "mdast-util-to-string": "1.0.4", "unist-util-visit": "1.1.3" } }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -9747,7 +9616,7 @@ "inherits": "2.0.3", "parents": "1.0.1", "readable-stream": "2.3.3", - "resolve": "1.4.0", + "resolve": "1.5.0", "stream-combiner2": "1.1.1", "subarg": "1.0.0", "through2": "2.0.3", @@ -9814,9 +9683,9 @@ } }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -9873,11 +9742,44 @@ } } }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", - "dev": true + "nanomatch": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.5.tgz", + "integrity": "sha512-ZHJamn1utzcUvW8Bais+Kk7pobp6dKmUEKOSQ/HI2glGwOMA/GvjRRKlLyORBUrdRXnwTU/6LIBcW7jYSlutgg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "is-odd": "1.0.0", + "kind-of": "5.1.0", + "object.pick": "1.3.0", + "regex-not": "1.0.0", + "snapdragon": "0.8.1", + "to-regex": "3.0.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 + }, + "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 + } + } }, "natural-compare": { "version": "1.4.0", @@ -9912,13 +9814,13 @@ "dev": true }, "nise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.1.1.tgz", - "integrity": "sha512-f5DMJB0MqBaSuP2NAwPx7HyVKPdaozds0KsNe9XIP3npKWt/QUg73l5TTLRTSwfG/Y3AB0ktacuxX4QNcg6vVw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.0.tgz", + "integrity": "sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA==", "dev": true, "requires": { "formatio": "1.2.0", - "just-extend": "1.1.22", + "just-extend": "1.1.26", "lolex": "1.6.0", "path-to-regexp": "1.7.0", "text-encoding": "0.6.4" @@ -10117,12 +10019,6 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, - "normalize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/normalize-uri/-/normalize-uri-1.1.0.tgz", - "integrity": "sha1-AftEDH/QWbnZvoZFqsFDQe/QWd0=", - "dev": true - }, "normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -10493,13 +10389,13 @@ "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", - "kind-of": "5.0.2" + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.0.2.tgz", - "integrity": "sha512-ru8+TQHbN8956c7ZlkgK5Imjx0GMat3jN45GNIthpPeb+SzLrqSg/NG7llQtIqUTbrdu5Oi0lSnIoJmDTwwSzw==", + "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 } } @@ -10731,12 +10627,14 @@ "dev": true }, "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "lcid": "1.0.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "os-shim": { @@ -10814,7 +10712,7 @@ "dev": true, "requires": { "asn1.js": "4.9.1", - "browserify-aes": "1.0.8", + "browserify-aes": "1.1.1", "create-hash": "1.1.3", "evp_bytestokey": "1.0.3", "pbkdf2": "3.0.14" @@ -12036,9 +11934,9 @@ } }, "react-modal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.0.0.tgz", - "integrity": "sha512-LXaEz4PqJoDmmY9HvrjVD8B6ivJto5LFz4Zsn4UUsbEY77dBzguYkb2m7+7lwB3nXQx7zMe1xqCYRPC6Cv783g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.1.0.tgz", + "integrity": "sha512-4sVW7Flm6sdaQeWr8OxXqMOuothdg+jnCA4MqloP65g2iWtOtho8VeI+z3SCsqunWefbuCHCnncxIBmDgPehQQ==", "requires": { "exenv": "1.2.2", "prop-types": "15.6.0" @@ -12448,7 +12346,7 @@ "requires": { "hast-util-sanitize": "1.1.2", "hast-util-to-html": "3.1.0", - "mdast-util-to-hast": "2.4.2", + "mdast-util-to-hast": "2.5.0", "xtend": "4.0.1" } }, @@ -12481,7 +12379,7 @@ "integrity": "sha1-jZh9Dl5j1KSeo3uQ/pmaPc/IG3I=", "dev": true, "requires": { - "github-slugger": "1.1.3", + "github-slugger": "1.2.0", "mdast-util-to-string": "1.0.4", "unist-util-visit": "1.1.3" } @@ -12877,17 +12775,6 @@ "is-extendable": "0.1.1", "is-plain-object": "2.0.4", "split-string": "3.0.2" - }, - "dependencies": { - "split-string": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.0.2.tgz", - "integrity": "sha512-d6myUSfwmBz1izkY4r7r7I0PL41rh21qUDYK1OgclmGHeoqQoujduGxMbzw6BlF3HKmJR4sMpbWVo7/Xzg4YBQ==", - "dev": true, - "requires": { - "extend-shallow": "2.0.1" - } - } } }, "setimmediate": { @@ -13014,21 +12901,35 @@ "dev": true }, "sinon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.0.1.tgz", - "integrity": "sha512-4qIY0pCWCvGCJpV/1JkFu9kbsNEZ9O34cG1oru/c7OCDtrEs50Gq/VjkA2ID5ZwLyoNx1i1ws118oh/p6fVeDg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.0.2.tgz", + "integrity": "sha512-4mUsjHfjrHyPFGDTtNJl0q8cv4VOJGvQykI1r3fnn05ys0sQL9M1Y+DyyGNWLD2PMcoyqjJ/nFDm4K54V1eQOg==", "dev": true, "requires": { "diff": "3.3.1", "formatio": "1.2.0", "lodash.get": "4.4.2", "lolex": "2.1.3", - "native-promise-only": "0.8.1", - "nise": "1.1.1", - "path-to-regexp": "1.7.0", - "samsam": "1.3.0", - "text-encoding": "0.6.4", + "nise": "1.2.0", + "supports-color": "4.5.0", "type-detect": "4.0.3" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } } }, "sinon-chai": { @@ -13061,7 +12962,7 @@ "extend-shallow": "2.0.1", "map-cache": "0.2.2", "source-map": "0.5.6", - "source-map-resolve": "0.5.0", + "source-map-resolve": "0.5.1", "use": "2.0.2" }, "dependencies": { @@ -13082,13 +12983,13 @@ "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", - "kind-of": "5.0.2" + "kind-of": "5.1.0" } }, "kind-of": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.0.2.tgz", - "integrity": "sha512-ru8+TQHbN8956c7ZlkgK5Imjx0GMat3jN45GNIthpPeb+SzLrqSg/NG7llQtIqUTbrdu5Oi0lSnIoJmDTwwSzw==", + "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 } } @@ -13282,12 +13183,13 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.0.tgz", - "integrity": "sha1-/K0LZLcK+ydpnkJZUMtevNQQvCA=", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "dev": true, "requires": { "atob": "2.0.3", + "decode-uri-component": "0.2.0", "resolve-url": "0.2.1", "source-map-url": "0.4.0", "urix": "0.1.0" @@ -13357,9 +13259,9 @@ "dev": true }, "split-string": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-2.1.1.tgz", - "integrity": "sha1-r0sG2CFWBCZEbDzZMc2mGJQNN9A=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.0.2.tgz", + "integrity": "sha512-d6myUSfwmBz1izkY4r7r7I0PL41rh21qUDYK1OgclmGHeoqQoujduGxMbzw6BlF3HKmJR4sMpbWVo7/Xzg4YBQ==", "dev": true, "requires": { "extend-shallow": "2.0.1" @@ -13428,13 +13330,13 @@ "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", - "kind-of": "5.0.2" + "kind-of": "5.1.0" } }, "kind-of": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.0.2.tgz", - "integrity": "sha512-ru8+TQHbN8956c7ZlkgK5Imjx0GMat3jN45GNIthpPeb+SzLrqSg/NG7llQtIqUTbrdu5Oi0lSnIoJmDTwwSzw==", + "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 } } @@ -13826,47 +13728,84 @@ "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" }, "table": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", - "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.11.1", - "slice-ansi": "0.0.4", + "ajv": "5.3.0", + "ajv-keywords": "2.1.0", + "chalk": "2.3.0", + "lodash": "4.17.4", + "slice-ansi": "1.0.0", "string-width": "2.1.1" }, "dependencies": { "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", "dev": true, "requires": { "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -13885,6 +13824,15 @@ "requires": { "ansi-regex": "3.0.0" } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } } } }, @@ -14157,13 +14105,13 @@ "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", - "kind-of": "5.0.2" + "kind-of": "5.1.0" } }, "kind-of": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.0.2.tgz", - "integrity": "sha512-ru8+TQHbN8956c7ZlkgK5Imjx0GMat3jN45GNIthpPeb+SzLrqSg/NG7llQtIqUTbrdu5Oi0lSnIoJmDTwwSzw==", + "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 } } @@ -14342,13 +14290,13 @@ "integrity": "sha1-zZ3S+GSTs/RNvu7zeA/adMXuFL4=" }, "uglify-js": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.1.tgz", - "integrity": "sha512-f7DpmEgt/RYAKzQzcfahn3JYZHobDwTZCa8oixC7pweVGEIizTX2kTYdNWcdk00xsMJqUhI8RDAa9HXHXGhNxA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.5.tgz", + "integrity": "sha512-tSqlO7/GZHAVSw6mbtJt2kz0ZcUrKUH7Xg92o52aE+gL0r6cXiASZY4dpHqQ7RVGXmoQuPA2qAkG4TkP59f8XA==", "dev": true, "requires": { "commander": "2.11.0", - "source-map": "0.5.6" + "source-map": "0.6.1" }, "dependencies": { "commander": { @@ -14356,6 +14304,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -14687,7 +14641,7 @@ "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", - "kind-of": "5.0.2" + "kind-of": "5.1.0" } }, "isobject": { @@ -14697,9 +14651,9 @@ "dev": true }, "kind-of": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.0.2.tgz", - "integrity": "sha512-ru8+TQHbN8956c7ZlkgK5Imjx0GMat3jN45GNIthpPeb+SzLrqSg/NG7llQtIqUTbrdu5Oi0lSnIoJmDTwwSzw==", + "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 }, "lazy-cache": { @@ -14842,7 +14796,7 @@ "requires": { "repeat-string": "1.6.1", "string-width": "1.0.2", - "supports-color": "4.4.0", + "supports-color": "4.5.0", "unist-util-stringify-position": "1.1.1", "vfile-statistics": "1.1.0" }, @@ -14854,9 +14808,9 @@ "dev": true }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { "has-flag": "2.0.0" @@ -15022,9 +14976,9 @@ } }, "webpack": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.7.1.tgz", - "integrity": "sha512-8MR+gVfxsvtx4J1UlbRGkUJEpDQUBFmisRmpPO5cVLgF21R8UMChX39OOjDz63a+m/iswGoqATszdZB2VCsYuA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", + "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", "dev": true, "requires": { "acorn": "5.1.1", @@ -15043,7 +14997,7 @@ "mkdirp": "0.5.1", "node-libs-browser": "2.0.0", "source-map": "0.5.6", - "supports-color": "4.4.0", + "supports-color": "4.5.0", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", "watchpack": "1.4.0", @@ -15051,6 +15005,12 @@ "yargs": "8.0.2" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "async": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", @@ -15060,26 +15020,152 @@ "lodash": "4.17.4" } }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, "lodash": { "version": "4.17.4", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { "has-flag": "2.0.0" } + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + } } } }, @@ -15135,7 +15221,7 @@ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "http-parser-js": "0.4.8", + "http-parser-js": "0.4.9", "websocket-extensions": "0.1.2" } }, @@ -15173,9 +15259,9 @@ } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "window-size": { @@ -15299,9 +15385,9 @@ "dev": true }, "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", "dev": true, "requires": { "camelcase": "4.1.0", @@ -15367,17 +15453,6 @@ "strip-bom": "3.0.0" } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", @@ -15440,12 +15515,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true } } }, diff --git a/package.json b/package.json index 1fdab21b..0da831cd 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "react": "^16.0.0", "react-copy-to-clipboard": "^5.0.0", "react-dom": "^16.0.0", - "react-modal": "^3.0.0", + "react-modal": "^3.1.0", "react-redux": "^5.0.6", "redux": "^3.7.2", "redux-thunk": "^2.2.0" @@ -77,33 +77,33 @@ "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-plugin-transform-runtime": "^6.23.0", "babel-polyfill": "^6.23.0", - "babel-preset-env": "^1.6.0", + "babel-preset-env": "^1.6.1", "babel-preset-react": "^6.24.1", "babel-register": "^6.26.0", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "chai-enzyme": "^1.0.0-beta.0", - "codecov": "^2.3.0", - "copy-webpack-plugin": "^4.1.1", - "cross-env": "^5.0.5", + "codecov": "^3.0.0", + "copy-webpack-plugin": "^4.2.0", + "cross-env": "^5.1.0", "css-loader": "^0.28.7", - "documentation": "^5.3.2", + "documentation": "^5.3.3", "enzyme": "^3.1.0", - "enzyme-adapter-react-16": "^1.0.1", - "eslint": "^4.7.1", + "enzyme-adapter-react-16": "^1.0.2", + "eslint": "^4.9.0", "eslint-config-standard": "^10.2.1", - "eslint-plugin-import": "^2.7.0", - "eslint-plugin-mozilla": "^0.4.4", + "eslint-plugin-import": "^2.8.0", + "eslint-plugin-mozilla": "^0.4.5", "eslint-plugin-no-unsanitized": "^2.0.1", - "eslint-plugin-node": "^5.1.1", + "eslint-plugin-node": "^5.2.1", "eslint-plugin-only-warn": "^1.0.1", - "eslint-plugin-promise": "^3.5.0", + "eslint-plugin-promise": "^3.6.0", "eslint-plugin-react": "^7.3.0", "eslint-plugin-standard": "^3.0.1", "events": "^1.1.1", - "extract-text-webpack-plugin": "^3.0.1", + "extract-text-webpack-plugin": "^3.0.2", "fetch-mock": "^5.13.1", - "html-minifier": "^3.5.5", + "html-minifier": "^3.5.6", "html-webpack-plugin": "^2.30.1", "istanbul-instrumenter-loader": "^3.0.0", "jpm": "^1.3.1", @@ -112,7 +112,7 @@ "karma-coverage": "^1.1.1", "karma-firefox-launcher": "^1.0.1", "karma-mocha": "^1.3.0", - "karma-mocha-reporter": "^2.2.4", + "karma-mocha-reporter": "^2.2.5", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^2.0.5", "mocha": "^4.0.1", @@ -121,11 +121,11 @@ "react-document-title": "^2.0.3", "react-test-renderer": "^16.0.0", "redux-mock-store": "^1.3.0", - "sinon": "^4.0.1", + "sinon": "^4.0.2", "sinon-chai": "^2.14.0", "source-map-support": "^0.5.0", "style-loader": "^0.19.0", - "webpack": "^3.7.1", + "webpack": "^3.8.1", "webpack-combine-loaders": "^2.0.3", "webpack-node-externals": "^1.6.0" } From 47049b14475eb4c52598165f37bb57eddc1b9456 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Wed, 25 Oct 2017 14:34:37 -0500 Subject: [PATCH 08/27] Remove usage of withLocalization()/getString() from a few places --- src/webextension/locales/en-US/manage.ftl | 14 ++++++-- .../manage/components/item-list.js | 4 +-- .../manage/components/item-summary.js | 28 ++++++++------- .../manage/containers/all-items.js | 36 ++++++++----------- test/manage/components/item-summary-test.js | 29 +++++++++------ test/manage/containers/all-items-test.js | 10 ++++-- 6 files changed, 71 insertions(+), 50 deletions(-) diff --git a/src/webextension/locales/en-US/manage.ftl b/src/webextension/locales/en-US/manage.ftl index 566e0756..5c385527 100644 --- a/src/webextension/locales/en-US/manage.ftl +++ b/src/webextension/locales/en-US/manage.ftl @@ -20,9 +20,17 @@ all-items-empty = Create a new entry so Lockie has something to protect. all-items-filtered = No results -item-summary-new-item = New Entry -item-summary-no-title = (No Entry Name) -item-summary-no-username = (No Username) +item-summary-new-title = New Entry +item-summary-title = + { $length -> + [0] (No Entry Name) + *[other] { $title } + } +item-summary-username = + { $length -> + [0] (No Username) + *[other] { username } + } homepage-no-passwords = Welcome to Lockbox! I'm Lockie, and I'm here to help you lock diff --git a/src/webextension/manage/components/item-list.js b/src/webextension/manage/components/item-list.js index a2e79072..6a277c1d 100644 --- a/src/webextension/manage/components/item-list.js +++ b/src/webextension/manage/components/item-list.js @@ -14,9 +14,9 @@ export default function ItemList({items, selected, onItemSelected}) { return ( - {({title, username}) => { + {({id, title, username}) => { return ( - + ); }} diff --git a/src/webextension/manage/components/item-summary.js b/src/webextension/manage/components/item-summary.js index 0031ccd1..4ded2352 100644 --- a/src/webextension/manage/components/item-summary.js +++ b/src/webextension/manage/components/item-summary.js @@ -2,35 +2,39 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { withLocalization } from "fluent-react"; +import { Localized } from "fluent-react"; import PropTypes from "prop-types"; import React from "react"; +import { NEW_ITEM_ID } from "../common"; import styles from "./item-summary.css"; -function ItemSummary({title, username, getString}) { +export default function ItemSummary({id, title, username}) { + title = title.trim(); + username = username.trim(); + + const titleId = `item-summary-${id === NEW_ITEM_ID ? "new-title" : "title"}`; return (

-
- {title.trim() || getString("item-summary-no-title")} -
-
- {username.trim() || getString("item-summary-no-username")} -
+ +
no tITLe
+
+ +
no uSERNAMe
+
); } ItemSummary.propTypes = { + id: PropTypes.string, title: PropTypes.string, username: PropTypes.string, - getString: PropTypes.func.isRequired, }; ItemSummary.defaultProps = { + id: null, title: "", username: "", - selected: false, }; - -export default withLocalization(ItemSummary); diff --git a/src/webextension/manage/containers/all-items.js b/src/webextension/manage/containers/all-items.js index 2843addf..b6bc05a1 100644 --- a/src/webextension/manage/containers/all-items.js +++ b/src/webextension/manage/containers/all-items.js @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { Localized, withLocalization } from "fluent-react"; +import { Localized } from "fluent-react"; import PropTypes from "prop-types"; import React from "react"; import { connect } from "react-redux"; @@ -14,17 +14,8 @@ import ItemList, { ItemListPlaceholder } from "../components/item-list"; const collator = new Intl.Collator(); -function AllItems({totalItemCount, items, selected, getString, ...props}) { - if (selected === NEW_ITEM_ID) { - items = [ - { title: getString("item-summary-new-item"), - id: NEW_ITEM_ID, - username: "" }, - ...items, - ]; - } - - if (items.length === 0) { +function AllItems({totalItemCount, ...props}) { + if (props.items.length === 0) { return ( @@ -33,7 +24,7 @@ function AllItems({totalItemCount, items, selected, getString, ...props}) { ); } - return ; + return ; } AllItems.propTypes = { @@ -43,16 +34,19 @@ AllItems.propTypes = { export default connect( (state, ownProps) => { + const totalItemCount = state.cache.items.length; const filter = parseFilterString(state.filter); - return { - totalItemCount: state.cache.items.length, - items: state.cache.items - .filter((i) => filterItem(filter, i)) - .sort((a, b) => collator.compare(a.title, b.title)), - selected: state.ui.selectedItemId, - }; + const selected = state.ui.selectedItemId; + const items = state.cache.items + .filter((i) => filterItem(filter, i)) + .sort((a, b) => collator.compare(a.title, b.title)); + + if (selected === NEW_ITEM_ID) { + items.unshift({id: NEW_ITEM_ID, title: "", username: ""}); + } + return {totalItemCount, items, selected}; }, (dispatch) => ({ onItemSelected: (id) => dispatch(requestSelectItem(id)), }), -)(withLocalization(AllItems)); +)(AllItems); diff --git a/test/manage/components/item-summary-test.js b/test/manage/components/item-summary-test.js index 35fa6d31..5797b9e2 100644 --- a/test/manage/components/item-summary-test.js +++ b/test/manage/components/item-summary-test.js @@ -2,30 +2,39 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { expect } from "chai"; +import chai, { expect } from "chai"; +import chaiEnzyme from "chai-enzyme"; +import { Localized } from "fluent-react"; import React from "react"; import mountWithL10n from "test/mocks/l10n"; +import { NEW_ITEM_ID } from "src/webextension/manage/common"; import ItemSummary from "src/webextension/manage/components/item-summary"; +chai.use(chaiEnzyme()); + describe("manage > components > ", () => { - it("render title and username", () => { + it("render existing item", () => { const wrapper = mountWithL10n( ); - expect(wrapper.find("div > div").at(0).text()).to.equal("title"); - expect(wrapper.find("div > div").at(1).text()).to.equal("username"); + expect(wrapper.find(Localized).at(0)).to.have.prop( + "id", "item-summary-title" + ); + expect(wrapper.find(Localized).at(1)).to.have.prop( + "id", "item-summary-username" + ); }); - it("render blank", () => { + it("render new item", () => { const wrapper = mountWithL10n( - + ); - expect(wrapper.find("div > div").at(0).text()).to.equal( - "item-summary-no-title" + expect(wrapper.find(Localized).at(0)).to.have.prop( + "id", "item-summary-new-title" ); - expect(wrapper.find("div > div").at(1).text()).to.equal( - "item-summary-no-username" + expect(wrapper.find(Localized).at(1)).to.have.prop( + "id", "item-summary-username" ); }); }); diff --git a/test/manage/containers/all-items-test.js b/test/manage/containers/all-items-test.js index 0c870994..bf5c6bb8 100644 --- a/test/manage/containers/all-items-test.js +++ b/test/manage/containers/all-items-test.js @@ -2,7 +2,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { expect } from "chai"; +import chai, { expect } from "chai"; +import chaiEnzyme from "chai-enzyme"; +import { Localized } from "fluent-react"; import React from "react"; import configureStore from "redux-mock-store"; import { Provider } from "react-redux"; @@ -15,6 +17,8 @@ import AllItems from "src/webextension/manage/containers/all-items"; import { SELECT_ITEM_STARTING } from "src/webextension/manage/actions"; import { NEW_ITEM_ID } from "src/webextension/manage/common"; +chai.use(chaiEnzyme()); + const middlewares = [thunk]; const mockStore = configureStore(middlewares); @@ -114,7 +118,9 @@ describe("manage > containers > ", () => { it("render items", () => { const item = wrapper.find(ItemSummary); expect(item).to.have.length(1); - expect(item.prop("title")).to.equal("item-summary-new-item"); + expect(item.find(Localized).at(0)).to.have.prop( + "id", "item-summary-new-title" + ); }); }); }); From 6aa034a9207f2772862a6f65b5fb76f9d515b353 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 26 Oct 2017 16:15:39 -0500 Subject: [PATCH 09/27] Restore focus after closing modals This partially resolves #133 --- src/webextension/widgets/modal-root.js | 11 ++++++----- test/manage/components/app-test.js | 24 ++++++++++++++++++++++++ test/settings/components/app-test.js | 24 ++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/webextension/widgets/modal-root.js b/src/webextension/widgets/modal-root.js index 621d0aad..4f8e1b3b 100644 --- a/src/webextension/widgets/modal-root.js +++ b/src/webextension/widgets/modal-root.js @@ -10,16 +10,17 @@ import Modal from "react-modal"; import styles from "./modal-root.css"; export default function ModalRoot({modals, modalId, modalProps, onClose}) { - if (!modalId) { - return null; + let modal = null; + if (modalId) { + const CurrentModal = modals[modalId]; + modal = ; } - const CurrentModal = modals[modalId]; return ( - - + {modal} ); diff --git a/test/manage/components/app-test.js b/test/manage/components/app-test.js index 6f5d0425..ab68d18c 100644 --- a/test/manage/components/app-test.js +++ b/test/manage/components/app-test.js @@ -4,6 +4,7 @@ import chai, { expect } from "chai"; import chaiEnzyme from "chai-enzyme"; +import PropTypes from "prop-types"; import React from "react"; import configureStore from "redux-mock-store"; import { Provider } from "react-redux"; @@ -15,6 +16,7 @@ import AddItem from "src/webextension/manage/containers/add-item"; import AllItems from "src/webextension/manage/containers/all-items"; import CurrentSelection from "src/webextension/manage/containers/current-selection"; +import ModalRootWidget from "src/webextension/widgets/modal-root"; chai.use(chaiEnzyme()); @@ -22,6 +24,28 @@ const middlewares = []; const mockStore = configureStore(middlewares); describe("manage > components > ", () => { + beforeEach(() => { + // Enzyme doesn't support React Portals yet; see + // . + ModalRootWidget.__Rewire__( + "Modal", class FakeModal extends React.Component { + static get propTypes() { + return { + children: PropTypes.node, + }; + } + + render() { + return
{this.props.children}
; + } + } + ); + }); + + afterEach(() => { + ModalRootWidget.__ResetDependency__("Modal"); + }); + it("render app", () => { const store = mockStore(initialState); const wrapper = mountWithL10n( diff --git a/test/settings/components/app-test.js b/test/settings/components/app-test.js index 7703067c..dc428ecf 100644 --- a/test/settings/components/app-test.js +++ b/test/settings/components/app-test.js @@ -6,6 +6,7 @@ require("babel-polyfill"); import chai, { expect } from "chai"; import chaiEnzyme from "chai-enzyme"; +import PropTypes from "prop-types"; import React from "react"; import configureStore from "redux-mock-store"; import { Provider } from "react-redux"; @@ -16,11 +17,34 @@ import { initialState } from "../mock-redux-state"; import mountWithL10n from "test/mocks/l10n"; import App from "src/webextension/settings/components/app"; import LocalReset from "src/webextension/settings/components/local-reset"; +import ModalRootWidget from "src/webextension/widgets/modal-root"; const middlewares = []; const mockStore = configureStore(middlewares); describe("settings > components > ", () => { + beforeEach(() => { + // Enzyme doesn't support React Portals yet; see + // . + ModalRootWidget.__Rewire__( + "Modal", class FakeModal extends React.Component { + static get propTypes() { + return { + children: PropTypes.node, + }; + } + + render() { + return
{this.props.children}
; + } + } + ); + }); + + afterEach(() => { + ModalRootWidget.__ResetDependency__("Modal"); + }); + it("render ", () => { const store = mockStore(initialState); const wrapper = mountWithL10n( From dc81684462619d7fa79b4db97d72bd1708c38532 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Fri, 3 Nov 2017 14:07:26 -0500 Subject: [PATCH 10/27] Fix unset classNames in and ; resolves #288 --- src/webextension/widgets/toolbar.js | 7 +++++++ test/widgets/toolbar-test.js | 28 +++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/webextension/widgets/toolbar.js b/src/webextension/widgets/toolbar.js index 81403df5..432c5d14 100644 --- a/src/webextension/widgets/toolbar.js +++ b/src/webextension/widgets/toolbar.js @@ -21,6 +21,10 @@ Toolbar.propTypes = { children: PropTypes.node, }; +Toolbar.defaultProps = { + className: "", +}; + export function ToolbarSpace({className}) { const finalClassName = `${styles.toolbarSpace} ${className}`.trimRight(); return ( @@ -32,3 +36,6 @@ ToolbarSpace.propTypes = { className: PropTypes.string, }; +ToolbarSpace.defaultProps = { + className: "", +}; diff --git a/test/widgets/toolbar-test.js b/test/widgets/toolbar-test.js index beed46d7..b54148d0 100644 --- a/test/widgets/toolbar-test.js +++ b/test/widgets/toolbar-test.js @@ -20,15 +20,37 @@ describe("widgets > toolbar", () => { ); expect(wrapper.find("span")).to.have.text("hello"); + expect(wrapper.find("menu").prop("className")).to.match( + /^\S+toolbar\S+$/ + ); + }); + + it("merge classNames", () => { + const wrapper = mount( + + hello + + ); + expect(wrapper.find("menu").prop("className")).to.match( + /^\S+toolbar\S+ foo$/ + ); }); }); describe("", () => { it("render space", () => { - const wrapper = mount( - - ); + const wrapper = mount(); expect(wrapper.find("span")).to.have.length(1); + expect(wrapper.find("span").prop("className")).to.match( + /^\S+toolbar-space\S+$/ + ); + }); + + it("merge classNames", () => { + const wrapper = mount(); + expect(wrapper.find("span").prop("className")).to.match( + /^\S+toolbar-space\S+ foo$/ + ); }); }); }); From c64645f278b6b393a4000e970fcc05baf44432d0 Mon Sep 17 00:00:00 2001 From: Devin Reams Date: Wed, 8 Nov 2017 12:15:41 -0700 Subject: [PATCH 11/27] Replace PNG of Lockie with transparent SVG --- src/webextension/firstrun/components/app.js | 2 +- src/webextension/images/lockie_v1.png | Bin 18066 -> 0 bytes src/webextension/images/lockie_v2.svg | 165 ++++++++++++++++++++ 3 files changed, 166 insertions(+), 1 deletion(-) delete mode 100644 src/webextension/images/lockie_v1.png create mode 100644 src/webextension/images/lockie_v2.svg diff --git a/src/webextension/firstrun/components/app.js b/src/webextension/firstrun/components/app.js index 3ffd627b..ac39e69c 100644 --- a/src/webextension/firstrun/components/app.js +++ b/src/webextension/firstrun/components/app.js @@ -14,7 +14,7 @@ import styles from "./app.css"; export default function App() { // Eventually, we'll have a feedback button up top here, and maybe some other // stuff. - const imgSrc = browser.extension.getURL("/images/lockie_v1.png"); + const imgSrc = browser.extension.getURL("/images/lockie_v2.svg"); return ( diff --git a/src/webextension/images/lockie_v1.png b/src/webextension/images/lockie_v1.png deleted file mode 100644 index 70fed43dad33929524a69f68fde222af3325a0d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18066 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 diff --git a/src/webextension/images/lockie_v2.svg b/src/webextension/images/lockie_v2.svg new file mode 100644 index 00000000..4a65c157 --- /dev/null +++ b/src/webextension/images/lockie_v2.svg @@ -0,0 +1,165 @@ + + + + Artboard + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From f396b421399903118abb55e35e8fc9ececee5edd Mon Sep 17 00:00:00 2001 From: "Matthew A. Miller" Date: Wed, 8 Nov 2017 20:45:00 -0700 Subject: [PATCH 12/27] Update editor tab URL when toolbar clicked (#278) Fixes #262 This fix changes the URL for the tab assigned to the Editor (or First-Time) is to be displayed. This change does not: * mess with the tab's history (`back`/`forward` buttons) * keep whatever the user was originally navigated to * open a new tab instead of resetting the current one * remove extraneous newline --- src/webextension/background/views.js | 9 ++++++--- src/webextension/manifest.json.tpl | 3 ++- test/background/views-test.js | 11 +++++++++++ test/mocks/browser.js | 8 +++++++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/webextension/background/views.js b/src/webextension/background/views.js index dfc74e59..14c52503 100644 --- a/src/webextension/background/views.js +++ b/src/webextension/background/views.js @@ -9,19 +9,22 @@ export class SingletonView { } async open() { - let windowId; + let windowId, + offPath = false, + url = browser.extension.getURL(this.path); if (this.id !== undefined) { // verify tab still exists try { let tabInfo = await browser.tabs.get(this.id); windowId = tabInfo.windowId; + offPath = !tabInfo.url.startsWith(url); } catch (err) { // does not exist, forget existing info this.id = undefined; } } - if (this.id !== undefined) { + if (!offPath && this.id !== undefined) { // focus owning window and activate tab await browser.windows.update(windowId, { focused: true, @@ -32,7 +35,7 @@ export class SingletonView { } else { // create a tab in the current window let tabInfo = await browser.tabs.create({ - url: browser.extension.getURL(this.path), + url, }); this.id = tabInfo.id; } diff --git a/src/webextension/manifest.json.tpl b/src/webextension/manifest.json.tpl index 8d6b9604..98da7650 100644 --- a/src/webextension/manifest.json.tpl +++ b/src/webextension/manifest.json.tpl @@ -33,7 +33,8 @@ "permissions": [ "identity", - "storage" + "storage", + "tabs" ], "options_ui": { diff --git a/test/background/views-test.js b/test/background/views-test.js index 819be67d..261253d9 100644 --- a/test/background/views-test.js +++ b/test/background/views-test.js @@ -33,6 +33,17 @@ describe("background > views", () => { ]); }); + it("open tab (navigated away)", async() => { + await view.open(); + let tab = await browser.tabs.get(view.id); + tab.url = "https://example.com"; + await view.open(); + expect(browser.tabs.mockAllTabs.map((i) => i.url)).to.deep.equal([ + "https://example.com", + "singleton.html", + ]); + }); + it("open tab (closed manually)", async() => { await view.open(); browser.tabs.remove(view.id); diff --git a/test/mocks/browser.js b/test/mocks/browser.js index 2edb15bd..d16b084b 100644 --- a/test/mocks/browser.js +++ b/test/mocks/browser.js @@ -168,7 +168,13 @@ window.browser = { return tab; }, - update() {}, + update(id, props) { + const tab = this.get(id); + if ("url" in props) { + tab.url = props.url; + } + return tab; + }, get mockAllTabs() { return this._openedTabs; From 082a41be5acd048966c7ed4b4f187afc22c05f14 Mon Sep 17 00:00:00 2001 From: Devin Reams Date: Thu, 9 Nov 2017 14:07:30 -0700 Subject: [PATCH 13/27] Remove ASCII Lockie from welcome screen and replace with latest UI (#300) * Replace PNG of Lockie with transparent SVG * remove Lockie ASCII art ...at least, from the public's view :smirk: * remove speech bubble and add SVG monster * remove Lockie from copy that's fun to say * quick copy changes to match comps, not perfect still placeholder * remove Lockie ASCII art ...at least, from the public's view :smirk: * remove speech bubble and add SVG monster * remove Lockie from copy that's fun to say * quick copy changes to match comps, not perfect still placeholder * remove raw-loader * re-work home page to have a title with entry counts * address lint and test issues * combine reused styles * update background colors while I'm in here * add alt tag for decorative images https://www.w3.org/WAI/tutorials/images/decorative/ * combine titles and remove withLocalization * tidy up CSS --- package-lock.json | 931 +++++++++++++++++- package.json | 1 - src/webextension/firstrun/components/app.css | 2 +- src/webextension/firstrun/components/app.js | 2 +- src/webextension/locales/en-US/manage.ftl | 37 +- src/webextension/manage/components/app.css | 10 +- .../manage/components/homepage.css | 28 +- .../manage/components/homepage.js | 51 +- .../manage/components/item-list.css | 2 +- src/webextension/manage/components/lockie.txt | 10 - .../manage/containers/all-items.js | 2 +- test/manage/components/homepage-test.js | 20 +- test/manage/containers/all-items-test.js | 2 +- .../containers/current-selection-test.js | 2 +- webpack.config.babel.js | 3 - webpack.config.test.js | 3 - 16 files changed, 983 insertions(+), 123 deletions(-) delete mode 100644 src/webextension/manage/components/lockie.txt diff --git a/package-lock.json b/package-lock.json index 7688883e..b3100daa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -307,7 +307,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-union": { @@ -3188,6 +3188,7 @@ "requires": { "anymatch": "1.3.0", "async-each": "1.0.1", + "fsevents": "1.1.2", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -6568,6 +6569,905 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "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.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, "function-bind": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", @@ -6848,7 +7748,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, "globals-docs": { @@ -7214,7 +8114,7 @@ "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, "html": { @@ -9742,6 +10642,13 @@ } } }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.5.tgz", @@ -9995,7 +10902,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { "hosted-git-info": "2.5.0", @@ -11601,7 +12508,7 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "2.0.6" } @@ -11751,7 +12658,7 @@ "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { "is-number": "3.0.0", @@ -11814,12 +12721,6 @@ "string_decoder": "0.10.31" } }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, "react": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/react/-/react-16.0.0.tgz", @@ -12708,7 +13609,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "safe-json-parse": { @@ -13173,7 +14074,7 @@ "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", "dev": true }, "source-map": { @@ -15208,7 +16109,7 @@ "webpack-sources": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha1-xzVkNqTRMSO+LiQmoF0drZy+Zc8=", + "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", "dev": true, "requires": { "source-list-map": "2.0.0", diff --git a/package.json b/package.json index 0da831cd..6ae2ae34 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,6 @@ "karma-webpack": "^2.0.5", "mocha": "^4.0.1", "nsp": "^2.8.1", - "raw-loader": "^0.5.1", "react-document-title": "^2.0.3", "react-test-renderer": "^16.0.0", "redux-mock-store": "^1.3.0", diff --git a/src/webextension/firstrun/components/app.css b/src/webextension/firstrun/components/app.css index 7035c6f2..e8625bd7 100644 --- a/src/webextension/firstrun/components/app.css +++ b/src/webextension/firstrun/components/app.css @@ -5,7 +5,7 @@ body { padding: 0; margin: 0; - background-color: #F9F9FA; + background-color: #f9f9fa; } .firstrun { diff --git a/src/webextension/firstrun/components/app.js b/src/webextension/firstrun/components/app.js index ac39e69c..69ff8bb1 100644 --- a/src/webextension/firstrun/components/app.js +++ b/src/webextension/firstrun/components/app.js @@ -20,7 +20,7 @@ export default function App() {
- +
diff --git a/src/webextension/locales/en-US/manage.ftl b/src/webextension/locales/en-US/manage.ftl index 5c385527..d7415f30 100644 --- a/src/webextension/locales/en-US/manage.ftl +++ b/src/webextension/locales/en-US/manage.ftl @@ -15,9 +15,8 @@ item-filter .placeholder = Search for an entry all-items-empty = - Looks like you don't have any entries saved yet… - - Create a new entry so Lockie has something to protect. + When you create an entry, it will be saved in this sidebar.
 + all-items-filtered = No results item-summary-new-title = New Entry @@ -32,31 +31,21 @@ item-summary-username = *[other] { username } } -homepage-no-passwords = - Welcome to Lockbox! I'm Lockie, and I'm here to help you lock - up your passwords! - - To get started, click { toolbar-add-item } above. - -homepage-under-10-passwords = +homepage-title = { $count -> - [1] Hi there! It's your friend, Lockie! - - You've added { $count } entry. That's a great start! - *[other] Hi there! It's your friend, Lockie! - - You've added { $count } entries. That's a great start! + [0] Welcome to Lockbox + [1] You have { $count } entry in your Lockbox + *[other] You have { $count } entries in your Lockbox } -homepage-under-50-passwords = - Hey again! Just your pal Lockie checking in! - - You've added { $count } entries. Great job, keep it up! - -homepage-over-50-passwords = - Welcome back! I hope you're having a great day! +homepage-greeting = + You’ve successfully installed the Lockbox browser extension! This Alpha + prototype gives you the ability to create new entries, and then view, search, + edit, and delete those entries. - You've added { $count } entries. Wow, I'm really impressed! + Please be sure to let us know your thoughts using our feedback button above, + including any issues you may find, things you like, and the things you’re + looking forward to in the future. item-details-heading-view = Entry Details item-details-heading-new = Create a New Entry diff --git a/src/webextension/manage/components/app.css b/src/webextension/manage/components/app.css index 78aabd5f..f6604d46 100644 --- a/src/webextension/manage/components/app.css +++ b/src/webextension/manage/components/app.css @@ -18,8 +18,8 @@ body > main, .side-toolbar, .main-toolbar { - background-color: #f9f9f9; - border-bottom: 1px solid #d6d6d6; + background-color: #ededf0; + border-bottom: 1px solid #c8c8c8; } .side-toolbar { @@ -34,13 +34,13 @@ body > main, grid-column: 1; min-width: 0; min-height: 0; - background-color: #e6e6e6; - border-right: 1px solid #e1e1e1; + background-color: #dfdfe3; + border-right: 1px solid #b1b1b3; display: grid; grid-template-rows: auto 1fr auto; } .app-main > article { grid-column: 2; - background-color: #f9f9f9; + background-color: #f9f9fa; } diff --git a/src/webextension/manage/components/homepage.css b/src/webextension/manage/components/homepage.css index 07178537..34c5ab4d 100644 --- a/src/webextension/manage/components/homepage.css +++ b/src/webextension/manage/components/homepage.css @@ -3,6 +3,30 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ .homepage { - margin: 2em; - font-size: 1.25em; + align-items: center; + display: flex; + flex-flow: column nowrap; + justify-content: center; + margin: 3em auto; + width: 701px; +} + +.homepage > h1, +.homepage > p { + color: #0c0c0d; + letter-spacing: 0.2px; + line-height: 1.5; +} + +.homepage h1 { + font-size: 33px; + font-weight: 300; + margin: auto; + text-align: center; +} + +.homepage p { + font-size: 15px; + text-align: left; + white-space: pre-line; } diff --git a/src/webextension/manage/components/homepage.js b/src/webextension/manage/components/homepage.js index 08ae3dd4..8bff34b3 100644 --- a/src/webextension/manage/components/homepage.js +++ b/src/webextension/manage/components/homepage.js @@ -2,56 +2,35 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { withLocalization } from "fluent-react"; +import { Localized } from "fluent-react"; import PropTypes from "prop-types"; import React from "react"; import styles from "./homepage.css"; -import lockie from "./lockie.txt"; -function printableLength(s) { - return s.replace(/(\u2068|\u2069)/g, "").length; -} - -function speechBubble(text) { - const lines = text.split("\n"); - const innerWidth = Math.max(...lines.map(printableLength), 1); +export default function Homepage({count}) { + const imgSrc = browser.extension.getURL("/images/lockie_v2.svg"); - const result = [ - " " + "_".repeat(innerWidth + 4), - "/" + " ".repeat(innerWidth + 4) + "\\", - ...lines.map((i) => { - return "| " + i + " ".repeat(innerWidth - printableLength(i)) + " |"; - }), - "\\__ " + "_".repeat(innerWidth - 1) + "/", - " \\ /", - " v", - ]; - return result.join("\n"); -} - -function Homepage({count, getString}) { - let key; + let title; if (count === 0) { - key = "homepage-no-passwords"; - } else if (count < 10) { - key = "homepage-under-10-passwords"; - } else if (count < 50) { - key = "homepage-under-50-passwords"; + title = "welcOMe to lOcKboX"; } else { - key = "homepage-over-50-passwords"; + title = "YoU have X enTrieS in YoUr lOcKboX"; } return ( -
{
-      speechBubble(getString(key, {count})) + "\n" + lockie
-    }
+
+ + +

{title}

+
+ +

{"yOu'Ve suCCessfuLLY iNSTalled..."}

+
+
); } Homepage.propTypes = { count: PropTypes.number.isRequired, - getString: PropTypes.func.isRequired, }; - -export default withLocalization(Homepage); diff --git a/src/webextension/manage/components/item-list.css b/src/webextension/manage/components/item-list.css index 7eb5c358..f08bb288 100644 --- a/src/webextension/manage/components/item-list.css +++ b/src/webextension/manage/components/item-list.css @@ -15,5 +15,5 @@ } .item:nth-child(2n) { - background-color: #f9f9f9; + background-color: #f9f9fa; } diff --git a/src/webextension/manage/components/lockie.txt b/src/webextension/manage/components/lockie.txt deleted file mode 100644 index c8484e26..00000000 --- a/src/webextension/manage/components/lockie.txt +++ /dev/null @@ -1,10 +0,0 @@ - ___.---. - / o o \ - '=== \ ___ - `-----' \ ,-' --. - \ \ ,' __--__\ - \ \ / ,' - \ \ ________ ,/ / - | \ __.-' '-.__ / / - | \ .-' '-. / / - _-'-__-'-.__.-'-./_.-'-.__.-'-.__.-'-.__.-\-._/.-'-/__ diff --git a/src/webextension/manage/containers/all-items.js b/src/webextension/manage/containers/all-items.js index b6bc05a1..558b3e18 100644 --- a/src/webextension/manage/containers/all-items.js +++ b/src/webextension/manage/containers/all-items.js @@ -19,7 +19,7 @@ function AllItems({totalItemCount, ...props}) { return ( - lOOKs lIKe yOu dON't hAVe aNy eNTRIEs sAVEd yEt... + WhEn YOu cReAtE An enTRy... ); diff --git a/test/manage/components/homepage-test.js b/test/manage/components/homepage-test.js index 80e33c8d..7f290412 100644 --- a/test/manage/components/homepage-test.js +++ b/test/manage/components/homepage-test.js @@ -17,7 +17,7 @@ describe("manage > components > ", () => { ); - expect(wrapper).to.contain.text("homepage-no-passwords"); + expect(wrapper.find("h1")).to.contain.text("welcOMe to lOcKboX"); }); it("render with 5 items", () => { @@ -25,22 +25,6 @@ describe("manage > components > ", () => { ); - expect(wrapper).to.contain.text("homepage-under-10-passwords"); - }); - - it("render with 15 items", () => { - const wrapper = mountWithL10n( - - ); - - expect(wrapper).to.contain.text("homepage-under-50-passwords"); - }); - - it("render with 75 items", () => { - const wrapper = mountWithL10n( - - ); - - expect(wrapper).to.contain.text("homepage-over-50-passwords"); + expect(wrapper.find("h1")).to.contain.text("YoU have X enTrieS in YoUr lOcKboX"); }); }); diff --git a/test/manage/containers/all-items-test.js b/test/manage/containers/all-items-test.js index bf5c6bb8..16ed1efa 100644 --- a/test/manage/containers/all-items-test.js +++ b/test/manage/containers/all-items-test.js @@ -46,7 +46,7 @@ describe("manage > containers > ", () => { it("render items", () => { expect(wrapper.find(ItemSummary)).to.have.length(0); expect(wrapper.find("div")).to.have.text( - "lOOKs lIKe yOu dON't hAVe aNy eNTRIEs sAVEd yEt..." + "WhEn YOu cReAtE An enTRy..." ); }); }); diff --git a/test/manage/containers/current-selection-test.js b/test/manage/containers/current-selection-test.js index 512710ab..e439f1b9 100644 --- a/test/manage/containers/current-selection-test.js +++ b/test/manage/containers/current-selection-test.js @@ -47,7 +47,7 @@ describe("manage > containers > ", () => { }); it("render item", () => { - expect(wrapper.text()).to.include("homepage-no-passwords"); + expect(wrapper.find("h1")).to.contain.text("welcOMe to lOcKboX"); }); }); diff --git a/webpack.config.babel.js b/webpack.config.babel.js index cedf3a3b..dd5af827 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -111,9 +111,6 @@ export default { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader", - }, { - test: /\.txt$/, - use: "raw-loader", }, ...extraLoaders], }, diff --git a/webpack.config.test.js b/webpack.config.test.js index 8e4df2c1..5f84cf5c 100644 --- a/webpack.config.test.js +++ b/webpack.config.test.js @@ -14,9 +14,6 @@ export default { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader", - }, { - test: /\.txt$/, - use: "raw-loader", }, { test: /\.css$/, exclude: /node_modules/, From 82952ab6aaa184a1cead10d66a14add1e92268cd Mon Sep 17 00:00:00 2001 From: Peter deHaan Date: Fri, 10 Nov 2017 07:49:44 -0800 Subject: [PATCH 14/27] Add locked favicon to firstrun page --- webpack.config.babel.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webpack.config.babel.js b/webpack.config.babel.js index dd5af827..112146d5 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -142,6 +142,7 @@ export default { chunks: ["webextension/firstrun/index"], inject: false, minify: htmlMinifyOptions, + icon: "../icons/lb_locked.svg", }), new HTMLWebpackPlugin({ template: "template.ejs", From 16495743afbb65318d50c39a5b786e8a4a9d3b23 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Tue, 31 Oct 2017 15:41:09 -0500 Subject: [PATCH 15/27] Use Photon styling for buttons; resolves #265 --- .../manage/components/edit-item-details.js | 2 +- .../manage/components/item-details.js | 2 +- .../manage/components/send-feedback.js | 2 +- src/webextension/manage/containers/go-home.js | 2 +- src/webextension/widgets/button.css | 60 +++++++++++++++++-- src/webextension/widgets/button.js | 22 +++++-- test/widgets/button-test.js | 4 +- 7 files changed, 76 insertions(+), 18 deletions(-) diff --git a/src/webextension/manage/components/edit-item-details.js b/src/webextension/manage/components/edit-item-details.js index d1ea258a..43fc8043 100644 --- a/src/webextension/manage/components/edit-item-details.js +++ b/src/webextension/manage/components/edit-item-details.js @@ -115,7 +115,7 @@ export default class EditItemDetails extends React.Component {
- diff --git a/src/webextension/manage/components/item-details.js b/src/webextension/manage/components/item-details.js index a9b729c7..bb4bf0ea 100644 --- a/src/webextension/manage/components/item-details.js +++ b/src/webextension/manage/components/item-details.js @@ -98,7 +98,7 @@ export default function ItemDetails({fields, onEdit, onDelete}) { - + diff --git a/src/webextension/manage/components/send-feedback.js b/src/webextension/manage/components/send-feedback.js index 4c709ce6..086def93 100644 --- a/src/webextension/manage/components/send-feedback.js +++ b/src/webextension/manage/components/send-feedback.js @@ -18,7 +18,7 @@ export default function SendFeedback() { return ( - diff --git a/src/webextension/manage/containers/go-home.js b/src/webextension/manage/containers/go-home.js index d7ed05db..a1ece7c8 100644 --- a/src/webextension/manage/containers/go-home.js +++ b/src/webextension/manage/containers/go-home.js @@ -13,7 +13,7 @@ import { requestSelectItem } from "../actions"; function GoHome({onClick}) { return ( - diff --git a/src/webextension/widgets/button.css b/src/webextension/widgets/button.css index 6caa4ce7..f4274a3a 100644 --- a/src/webextension/widgets/button.css +++ b/src/webextension/widgets/button.css @@ -2,14 +2,62 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -button.button { +.button { white-space: nowrap; - /* Override the margin-bottom from browser-style. */ - margin-bottom: 0; text-align: center; + border: 0; } -button.minimal { - /* Override the browser-style borders. */ - border: 0 !important; +.primary-theme { + color: #ffffff; + background-color: #0060df; +} + +.normal-theme { + color: #0c0c0d; + background-color: rgba(12, 12, 13, 0.1); +} + +.ghost-theme { + color: #0c0c0d; + background-color: transparent; +} + +.primary-theme:hover { + background-color: #003eaa; +} + +.normal-theme:hover, +.ghost-theme:hover { + background-color: rgba(12, 12, 13, 0.2); +} + +.primary-theme:active { + background-color: #002275; +} + +.normal-theme:hover, +.ghost-theme:hover { + background-color: rgba(12, 12, 13, 0.3); +} + +.puffy-size { + height: 48px; + padding: 0 16px; + font-size: 11px; + border-radius: 4px; +} + +.normal-size { + height: 32px; + padding: 0 8px; + font-size: 13px; + border-radius: 2px; +} + +.micro-size { + height: 24px; + padding: 0 8px; + font-size: 15px; + border-radius: 2px; } diff --git a/src/webextension/widgets/button.js b/src/webextension/widgets/button.js index 7ddf40fe..335691e5 100644 --- a/src/webextension/widgets/button.js +++ b/src/webextension/widgets/button.js @@ -8,15 +8,22 @@ import React from "react"; import styles from "./button.css"; const THEME_CLASS_NAME = { - primary: "browser-style default", - normal: "browser-style", - minimal: `browser-style ${styles.minimal}`, + primary: `${styles.primaryTheme}`, + normal: `${styles.normalTheme}`, + ghost: `${styles.ghostTheme}`, +}; + +const SIZE_CLASS_NAME = { + puffy: `${styles.puffySize}`, + normal: `${styles.normalSize}`, + micro: `${styles.microSize}`, }; export default class Button extends React.Component { static get propTypes() { return { - theme: PropTypes.oneOf(["primary", "normal", "minimal"]), + theme: PropTypes.oneOf(Object.keys(THEME_CLASS_NAME)), + size: PropTypes.oneOf(Object.keys(SIZE_CLASS_NAME)), className: PropTypes.string, }; } @@ -24,6 +31,7 @@ export default class Button extends React.Component { static get defaultProps() { return { theme: "normal", + size: "normal", className: "", }; } @@ -33,9 +41,11 @@ export default class Button extends React.Component { } render() { - const {className, theme, ...props} = this.props; + const {className, theme, size, ...props} = this.props; + const themeClass = THEME_CLASS_NAME[theme]; + const sizeClass = SIZE_CLASS_NAME[size]; const finalClassName = ( - `${THEME_CLASS_NAME[theme]} ${styles.button} ${className}` + `${styles.button} ${themeClass} ${sizeClass} ${className}` ).trimRight(); return ( diff --git a/test/widgets/button-test.js b/test/widgets/button-test.js index fb2c8716..e0446125 100644 --- a/test/widgets/button-test.js +++ b/test/widgets/button-test.js @@ -21,14 +21,14 @@ describe("widgets > ); expect(wrapper.find("button")).to.have.text("click me"); expect(wrapper.find("button").prop("className")).to.match( - /^browser-style \S+$/ + /^\S*button\S* \S*normal-theme\S* \S*normal-size\S*$/ ); }); it("merge classNames", () => { const wrapper = mount(); expect(wrapper.find("button").prop("className")).to.match( - /^browser-style \S+ foo$/ + /^\S*button\S* \S*normal-theme\S* \S*normal-size\S* foo$/ ); }); From d11a3f8cc607c14094ae8621428f892385e34c55 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Wed, 1 Nov 2017 14:43:59 -0500 Subject: [PATCH 16/27] Use photon styling for inputs; resolves #256 --- src/webextension/widgets/filter-input.css | 21 -------- src/webextension/widgets/filter-input.js | 17 +++---- src/webextension/widgets/input.css | 56 +++++++++++++++++++-- src/webextension/widgets/input.js | 7 ++- src/webextension/widgets/password-input.css | 55 -------------------- src/webextension/widgets/password-input.js | 15 +++--- src/webextension/widgets/text-area.css | 21 ++++++-- src/webextension/widgets/text-area.js | 3 +- test/widgets/input-test.js | 6 ++- test/widgets/text-area-test.js | 2 +- 10 files changed, 91 insertions(+), 112 deletions(-) delete mode 100644 src/webextension/widgets/filter-input.css delete mode 100644 src/webextension/widgets/password-input.css diff --git a/src/webextension/widgets/filter-input.css b/src/webextension/widgets/filter-input.css deleted file mode 100644 index 7e71448c..00000000 --- a/src/webextension/widgets/filter-input.css +++ /dev/null @@ -1,21 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -.filter-input { - display: flex; -} - -.filter-input > span { - flex: 1; - margin-bottom: 0; -} - -.filter-input > span > input { - width: 100%; -} - -.filter-input > button { - margin-inline-start: -1px; - margin-bottom: 0; -} diff --git a/src/webextension/widgets/filter-input.js b/src/webextension/widgets/filter-input.js index bb491264..7da753b0 100644 --- a/src/webextension/widgets/filter-input.js +++ b/src/webextension/widgets/filter-input.js @@ -6,7 +6,7 @@ import { Localized } from "fluent-react"; import PropTypes from "prop-types"; import React from "react"; -import styles from "./filter-input.css"; +import styles from "./input.css"; export default class FilterInput extends React.Component { static get propTypes() { @@ -37,17 +37,14 @@ export default class FilterInput extends React.Component { // eslint-disable-next-line no-unused-vars const {onChange, value, ...props} = this.props; - // Our input should probably be `type="search"`, but there's no browser- - // style for that. return ( -
- - this.updateValue(e.target.value)}/> - +
+ this.updateValue(e.target.value)}/> - +
); diff --git a/src/webextension/widgets/input.css b/src/webextension/widgets/input.css index e4159166..82099d27 100644 --- a/src/webextension/widgets/input.css +++ b/src/webextension/widgets/input.css @@ -2,11 +2,57 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -span.input { - /* Override the margin-bottom from browser-style. */ - margin-bottom: 0; +.input, +.input-wrapper { + height: 30px; + width: -moz-available; + font-size: 13px; + color: #0c0c0d; + background-color: #f9f9fa; + border: 1px solid rgba(12, 12, 13, 0.3); + border-radius: 2px; } -.input > input { - width: -moz-available; +.input { + padding: 0 8px; +} + +.input:hover, +.input-wrapper:hover { + border-color: rgba(12, 12, 13, 0.5); +} + +.input:focus, +.input-wrapper:focus-within { + /* Note: This is reverse-engineered by looking at the mockups. */ + border-color: #7cddee; + box-shadow: 0 0 3px rgba(124, 221, 238, 0.5); +} + +.input-wrapper { + display: flex; +} + +.input-wrapper > input { + flex: 1; + padding: 0 8px; + width: 0; + min-width: 0; + border: 0; + background-color: transparent; +} + +.input-wrapper button { + white-space: nowrap; + text-align: center; + height: 28px; + font-size: 13px; + border: 0; + color: #0060df; + background-color: transparent; + padding: 4px 8px; +} + +.input-wrapper button:active { + color: #003eaa; } diff --git a/src/webextension/widgets/input.js b/src/webextension/widgets/input.js index 6a830fbc..22dd62f7 100644 --- a/src/webextension/widgets/input.js +++ b/src/webextension/widgets/input.js @@ -26,11 +26,10 @@ export default class Input extends React.Component { render() { const {className, ...props} = this.props; + const finalClassName = `${styles.input} ${className}`.trimRight(); return ( - - this.inputElement = element}/> - + this.inputElement = element}/> ); } } diff --git a/src/webextension/widgets/password-input.css b/src/webextension/widgets/password-input.css deleted file mode 100644 index 850f6480..00000000 --- a/src/webextension/widgets/password-input.css +++ /dev/null @@ -1,55 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -.password-input { - display: flex; -} - -.password-input > span { - flex: 1; - /* Override the margin-bottom from browser-style. */ - margin-bottom: 0; -} - -.password-input > span > input { - width: 100%; -} - -.password-input button { - text-align: center; - margin-inline-start: -1px; - /* Override the margin-bottom from browser-style. */ - margin-bottom: 0; -} - -/* The following rules are adapted from Firefox's browser styles. */ - -.password-input input[type="password"] { - background-color: #fff; - border: 1px solid #b1b1b1; - box-shadow: 0 0 0 0 rgba(97, 181, 255, 0); - font: caption; - padding: 0 6px 0; - transition-duration: 250ms; - transition-property: box-shadow; -} - -.password-input input[type="password"] { - height: 24px; -} - -.password-input input[type="password"].disabled { - color: #999; - opacity: .5; -} - -.password-input input[type="password"]:not(disabled):hover { - border: 1px solid #858585; -} - -.password-input input[type="password"]:focus, -.password-input input[type="password"]:focus:hover { - border-color: #0996f8; - box-shadow: 0 0 0 2px rgba(97, 181, 255, 0.75); -} diff --git a/src/webextension/widgets/password-input.js b/src/webextension/widgets/password-input.js index 9db3b7dd..ef195bc7 100644 --- a/src/webextension/widgets/password-input.js +++ b/src/webextension/widgets/password-input.js @@ -8,7 +8,7 @@ import React from "react"; import ButtonStack from "./button-stack.js"; -import styles from "./password-input.css"; +import styles from "./input.css"; export default class PasswordInput extends React.Component { static get propTypes() { @@ -42,19 +42,16 @@ export default class PasswordInput extends React.Component { render() { return ( -
- - this.inputElement = element}/> - +
+ this.inputElement = element} {...this.props}/> this.stackElement = element}> - - diff --git a/src/webextension/widgets/text-area.css b/src/webextension/widgets/text-area.css index f16c3e92..64a3738b 100644 --- a/src/webextension/widgets/text-area.css +++ b/src/webextension/widgets/text-area.css @@ -2,7 +2,22 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -textarea.text-area { - /* Override the margin-bottom from browser-style. */ - margin-bottom: 0; +.text-area { + padding: 8px; + font: caption; + font-size: 13px; + color: #0c0c0d; + background-color: #f9f9fa; + border: 1px solid rgba(12, 12, 13, 0.3); + border-radius: 2px; +} + +.text-area:hover { + border-color: rgba(12, 12, 13, 0.5); +} + +.text-area:focus { + /* Note: This is reverse-engineered by looking at the mockups. */ + border-color: #7cddee; + box-shadow: 0 0 3px rgba(124, 221, 238, 0.5); } diff --git a/src/webextension/widgets/text-area.js b/src/webextension/widgets/text-area.js index e4b51aaf..0e80dece 100644 --- a/src/webextension/widgets/text-area.js +++ b/src/webextension/widgets/text-area.js @@ -26,8 +26,7 @@ export default class TextArea extends React.Component { render() { const {className, ...props} = this.props; - const finalClassName = `browser-style ${styles.textArea} ${className || ""}` - .trimRight(); + const finalClassName = `${styles.textArea} ${className}`.trimRight(); return (