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.
+
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
zcmeEuDNuweWA^`vZR9P7bH2?s}_RsG^fctlSMy6Q(cLTbqNs9q$
zr#>D703rZc2~iDi;F&*SriEnM--_{?rP|8c%B^FkufU(HorS74t(g4>kROzhLC8*f
zEIdCb<3rflo=83;P38l
zN=wV)rgzr*Ue|P9(>Wygg0sP3e1Nd9;){rP-KF-+wlURer~E9_~R2{Lkb;aAOLR
zELbd97hPbKM4ui6MYvdS>_0b)&xFc^YR3l=pX}NXGaCgT@t={gd;ISq*H|nfhmRB-
z1pgsfM6CVA<^6x4;cxtFHkYK4XE~2J0kjy@SS~#;akY+|=!q)Tz^6K*_0dSxIWRy{1+gg0Y
zc3NOjQU|U6bg=?s^-sRejNl-tna1ZCoA?p4FUVaFLj6iPg)J>|o$Q3!)|J6!1e}Cf
zWifRwhlnEB!T7ymj?nXanDW%SVM@{J!on#Kn~-=S5eZ4-ivtV{CV8f+IJ*VaPAgb}
zF-K&;Gcf5|wbOIA>nN?)zvnbNQ;_r~Ox2e%Qj+3JMO9U>F{4c&*hI=igK%rdWB~+$
z_)$``UPmN}#Q!(-F+K#x^!~B)n1CHau&EH1{(*Btdmw5|*uqE~$(qxpT#t>o+hKQd
zjx^o_k;{_n1FYKgW3;<+Ho5ECCC*Fx8)oTnG=;1C$#qRz=aSh58kMR3#>|IAeeXKD
z!a9(^fZo-D*daVJCP&i`v#v=$eQ0vPrQJ>WadV23qV{$SV6GR3IAeZj6OInkJLKU(q1GR0gKmx?r43SIw^9SeDgERv`
zH6<5SUD#eDKN}VNUZksZD2j-iJ)(wuOt0SIH$OH!;kR7KJO`%tYM6N5j&hsGSb#s<
z(Smz;#3F(@(>bP!SmDRTHUq3?L2)C5WbmSf+(^kKfw&YXOwMG@)&h*n#gy%JY(pz@
z68vh~f!Ay8TQr9$NvW_S+o{*T6mkFh&;sk~{sJ}juVMS@&??Om{tF%C>A
zX!l?t51?u(=V}q2{i6G{3L(MqKD@*2PZ8#Z5VZaRGk4lR;9GS5g-c25YX-4pCxRQ?
zZ`yh?Urem?H(H!U?jnK>0GV($`t*N78jGix9Z~RyTX@!VwEbl6q$9!#+VJ%B(We+a
zP!XRCb87(QxkBtz&dyb7Df(h_vG!DU-qZI(2ftu2eNIg@jQ+;RW7uxhH|h#~l?lB?
zc`r)m;MiX<8*#E0B#-nF+z;-{_ypj#Kb)Mjr4P0RS~zUD3tj&%)`s78-D@T3@V^g|
zFhhKZ_Pg?8w?Fv7d+VwvAIDI8ss1P@ubS!NTiD=8^fCG9tNE3L_7I;F0RV$0$lLo;
zC1_2zhO<$ai$VEb!tx#fi2j4G($GCZ3lDITKY_U#SmT`&xkZtP`=+NWG$epkJ#WF8
zzhAmfTn5KYt&o}URStxMZsD+Syqk$;CU(=-dN=0fbt8u!R8F$COzn1ZfQ@W5R!LCN
zpqlb&mZVr-@r2yQ5ZxVR9C@ZsYR9-J{3z6_6_=2(rKRP87!BaNK2O}(z)Y@Oo$HuY
z`lKJ0oxw-!#(|ZIh9%=MrJ)kvWNUig_kKIP+-U*BK@|eEL?$};Gpy*UA^rv^m0bQN
z3JAdoTxQB8pB7ht9t2uSy?qIkz!gRIJ>THttzjKnGehkf5D<32xIZHXt_w5rEGZ@VqRTg2Gs!Bvb64w^pFF1OBgp=WSYD5Z
zBURMSnydIpZg^fKovAMkX`CAq&-1J_6ib|L2-b~opI^FpTmTS?7x~5Z{rOht@hu%l
z5E9pcyS6$h%?aPQt@tvRlU{JKB8$X7XfMOMp;9LzcZ0h#gC(mIP}{jmPs~
z8{L&&19)cZzSgKat2<~}qjpdNl|clGvSoX|(p2Q6
z0k=T{8?0oEE(L+_kz5@%p56Rv^s1H5EVsvhv^x*1*9VsH>b_<99Eb4zilwv5i_1iG
z=@M6GpZAqh=KUzYP1`=fGdn!EyG%$b8s9k41`B`)k
z5w>3@-2#>6(L(aKmhbg5HLSZa&rad|l|l!HRDfyduM_HLIgA3mownz2M6e3qNE6}t
z*wROjuaNzsx7SE-#KBsTW=SEGbKqIJJmC=m7J#u}aLIQTh!pg5Q4y-Ig>l2jcGc6*
zg*E$5s%v|LUt9zAH`(X#4PPOPmfw7iq%u9udNRbbl)|>TL*4d~dGw`T39HM7
z_@X>`0#e1ryb75CFAf0-nTVzgt7#|#=w&r^`&l11Zg{W3i47seIXAELnMtJn9=$gM
zqHkM1aaVgdjsu^>(&QXK4)6wHMKE^a;
z4bnzK+xiO!%7hOo|nC<1c
zm=ooWmY-|gbGj~kZ^E#~+TFb!9Tim{vK@rR4;~vA#}-n*tKOPx=!Mdqp0v6{j*R(j
z3?G+FYv!?rGJQz(LFe?u?DQ}G{xt{Y$Ptvd<(6_qb9EWiiK<02VI{~rw7yRkx9a={P-k~t_1K=!
zi|AF4?u>zZaO`@jd7`H^s{ZErPxSwsG4FRfAgqMu;&WqnulcE?hCh&m~O
zi1Z88Ks#Hv#nMQv=?A)khs4JcW#fP@WdK!ysPUjr3#?Ta7qKCdC8r&PWK`FM`}{OX
z*;#;WfwR_NgC_sGHZ%Rl9FKNYTd1I7xUmB&I>Zz;zz4BvChyg|%pC;{8aK)b(S)kO
z1aH~}9WWJ{T`zA7)5XPk6z!;0@?1U
zPBl+&a&x<{rit$Lm0p#J*FGDM{J~+YNLV4wUpnet;ibzE*mP8634CbQ(w$F6S>O&S3Je>w;V5S%v
z2+}#U^PdgTdyFXYm`ljb6?#=m;LNVbFHMIUZK;@I6^Q2vF}Bei&nP=0cLXT66dmhM
zJ<2j@Lk=U!fNxz4uRv+9T$H7Y-7bvp>Bzmg`!T2qlY;&z~pN)jFh7TEiX4K0tdq
zbtk76)MRL_{ii=dr9lfrH0El2yvk)Cc=9WTddohHH4n})tsJpBUxn8FO#u##8FUp$
z*6J-#T<=V~*O4{{Zmu6~2wy)H5i-v2=hWRop@J3q;|n)caqDq%
zm)lg2h1#5w6zR3|Y<kYEcNg$w-+wD;
z1It;DY8sz&E^SYnABaB2TA{Qu@{e3w*o?D?1?x0E|FUW$4K)w+SC)vktw>>Ja?A(=
zg8gYoA?z{p=Pf5%9CFs~5+tj5Y0eHG6YmECxqjX|%Z;)UQ;D1G+7xsTPNX~Au^+!g
z`Q@98#rGlWF+N%v;hT@VprfGZu_Jirh6>x=qUBp;bM_rkB(>kxrsG{t@)qi?&o4uN
z@lcDDYHVvv?$GOZ?sGpsSt=Q-)ancAIIh-q&jkQ0?52We4E4
zy3%X&VTm^88yYbuoW{vvPfT7NEchcfl3#1n9b-a&{v=ce5M0am74jGM^jNvqma;V<
zj(}N88Z6Ue2{%;KD{j;ekanrz*%%EN@kyMA5e}At7C?ko%k(hYlCZ%nk|X7OimmbVGez4M-)&_0{o_#9j>~dfpZBg)`qsnOLW(Z$X(uO(
zkY9eSeYOh2PTnX<7imB5846y?IWCT<6)aR|>
ztQ<$?I2&|$mwunsqh&7?Td?RaH8$6#l4^CU8?W_7=K4u&ta9i4;lz)~&kOx5LGFY7
z@ph+ky+g1AeEOg_##$!2+e2%g_DF@i#>I~31@sPz`Zo*o!hWpP(TDLQ838HSDPPDhYIqnJ-3hPDhNwQ5@fpSfS_
zcm9Lz^B4$bTtH@;cq8)co8ToTK=%{1Ce!wAG}gR6rAHanxN<2q3>!tqrmPHm+|;Wf
zplRNkb6i-QsL0zDv8CW{L}pbdivE)@v_kZybvTs2rFchUI+tjm+*yXnyHS3ZQv8$a
z4=Je^=7!%$Q|dy9GbkTPlu$(>w8Ym+kMadnBBcuB8k{FjXNFgF3WJiUZmhvsl)P55*1NDplz}9+gqLWVE>=7YXE7(;5rGfnivD4`6`W>z
zPr1ba01$oCy5BtOZuDZwJ8Su|v5u)U7U+DELZ+w}^q0@!hwpN2z^~I#SE|3w;PjgM
z7$l?D&X1DL-q|3;_F64EM~0{jm*p|M?cb@QJQLf!^^!_Cy7r8V8`08#k`v;vhqW>b
zNDn-n;iX^%Y)M5=+5?q!0=lY{1HR2d=UG&C;5OU18MM3RsQK%$s??kw9Q&tsLa+XI
zgkFg|6s&8dSVfMaTDdAT;pJd^iI1QHUeZneRRfnE*O^H{WmG$SiM%ZhzIW(jl)0u^
z+N7xoeI3fi*g3lTxJvk)x1tXBcfW%p8G?0v4nm}OdsylCSwx?n`JeZrLNPlo4q&bx
z5SuIs6c)|qVgyw?9)?5N04hAzo;7|CiF{e1s&llR=C0REz(>x$*qazl1ejpbdIKBu
z?=Suhn7VVPDR4P*R^PV|)WpIQ%;d{TdHwEk;9LhFbX;BQlnCN
zNq0_(Wq-KJAbw>-*`Cy`K}9gDNk@2580v6X%T%i6%*Wrf{Dd2eCO1rx>X7a0UP}1Bwm0&l-j?JnUIs_xs5#5y
zW?ugfelUanhrkZR3FMd4(M0NuUMC6faaKhLnn*A{tn-*mK_gXS^+D}Ey{)!uRNf>)
zip}WnEi46;vXp$qXj2nU(s+6Yg(iuLxU;b9%l*4VhHCkd<{4ovIZ}dPH@58}qJfHG
z<)$C(tCQ-WT3}XXs%-5YXbjFoiwQRJi?mA(o(i?QCZj?li{liJr0fm_f01A&TUzCU
z74>reF4dkvWYDPQXSwT+M=TfAvDAC|Pko`8$`Haea2XFL3rabGt0)LF
z_U{|oNus9s*wKV6sw9Ew!WYCSd+h@`FteRG+>mQprq2`;5HEP*jeriJy71wMgYt{5
z0>8Zf;7eKpI8Ok7bT<`|_hV1P;v{5O(~6|TkdJ~zm3=x5CGz0&r|a+PAV~J#F7=D;
zin!9OOYQPSK^A64Y2i6*;v-&nPI1ZPKH~L;e)`=trc7M4q
zFhLS%>O(nG&W;`J-D!L~n2L12q1`85@!Pl2Ux965%}x(k*C+`Q=8{BISk5gdmD$L9
ztgaFn87cBr0-0;rDr@jB45D;AUrHTXdCc{700-Mh8o{_RsP|tDiE4<*
z+rUU?JsteraR?R;l>kwr5o`e0xBz$K#W;hsQ|wdet74;M_amX2`&QK-`q3>>g!}t5
zx5+y9oHcq?3Skc4$nD~zTk@Uh8b8qy`;+r?6L#*2*Tk$$K`NHZVzUOS%!v_&eU4o*
z4tA&US&$&?Cs(`E)z~Qe*3J*`2LU^|SS75`gdZE89+t}@U9+nHv7@b;3meF_w
zeSZ(E-YT=#?f9Thii2b*h^;cLTZIrV$i_;13!*s`=a1Ndxt2-V`kbN7C4=htpgNb0
z51bIvgIw*r#b)zle@FBdD=Yxh&h}f#%Lh(>i~~nA0<{(8*-mbz4Y=C+vw7Zj-U5y#
zynC&J8Z3Ml$JvLc%!f;*mzVL3fHGNqP!$Qu
z3t-A9BH5_WDa?sYD*-3BtW)3dFpm6<@Ig**75XYA(|Rj;kN^)S;k=?K^)tw7b8nNE
z>C54(1+SbBI>_Y6e6pdAWHB+BoY*zVb@pFVN2L&p4w(4qS`AuI3W`_EX`g-{R`{HK}9dDwNJmdgAYU{z-xC*pf?dh*Kh7`IMrsBnM(k|-
zjNj#9BM*OvZ?EEYD~dwBCpDj7mbQ9NkDXSLF$C=c;$CisXdHYqQi+6>0PJLkcC4wI
zyC^(b!kQVnzPX}DmcuSlnV&kOO0Okr6qF6;mjAAkrYF>$q;>-meKLD)8YC56m3+H7
zK!xoiy+(J^!pZ;&UFlc&H@NsXN~1jv;sHQ#JlRr2R31OeN_{Oi&Gg6EaVP@(DiNGF
zs|AU@7cr28DO;N!Z?|o(VfL&Y{lnwHrpxa@aQrI?+2b=>O$up^Q?k^0blrc%*Sjf|52xbGC_o0&n&uYwm~!N`ak
z*b4ZayG&GRBsK`PC4gQb^ej@Ri1RZS`;ROqCon^veo)v6xKFgJZ*vUMAm?c}vz;U(
z&YyLalZQ&xhSM(+8J)=38wRH#kM9Wex`$3{(O@AR}|~uANMhY
z!?~XP4S2j;64Kp9Ru*297o6x!izDZS>+|H{D1mJO+Us}d@j%P~g*-@@G1Exf2d-;|
zm*lGn$i9WMr+s4azApRQ-705NHu~{Dj5t4!vup)ItN9)uk_j3SI-{2dg-VWjNtHV8
zu!y$X91x+xJu~!QY+~LUe~9)3^RUvU{zNtF;3BbHQp*hANEE3(*m-GPza4z+c75<2
z4~`X+fw$^X68YI{uJU(Ur=(zgLbC)lSl|6nbRbAag^#f0st)sF
zzK0MXk7&;w!&zAZEf~JGjDs|P-{6?iik#{`)aM1W=N%rQWqu=O!SM|ez)g&cb+Q^*
zQlc{BYnN)nnn&3YcJgM!-dQHOfzY!sK41PVoayUnt2AsM!dRA~yzEn*#W8@N`?>oT
z=yi&picW539J~MdblxiuWgPgE!yJL<#(eq39^3?+rEnKTha(mI8~jb^N9j`GZ7Uy%e%&L1`m6x6
z?Ss56?fK_OP~q1a`H-1IC!tzHt$w_4n;6zzTOtLy=GEjG!A?q70x<^sjzD6LhQJ&O
zjH2{$IE%7(Z(fG?H;R|E=9by7hZE)LqNo=TA0(LG1V6kgq2RJkiRyUmh|u1EYJd@6a^CT{^&M!w`m5S!t5
z2Nec|w`fHo%yE}L#&`Y3Tnxr~yy{E_D#EzCg}stw`hfS9u8sA|0FSv*Y4oA}mtJ>S
zyoUxqGwHIYp_PZ#rrkvDhEOugxma&w+o6i9w}aO5uJc);3Q^jNjA?F2VTGu>Zw7cigR7;TBgjEe0Adkc`YaTvSWCpieoROpCA8x0`daMN`K-c
zWuV87W#mUf?VqLh7s52JPTWH0tk$i=EtOcR+~v*!pj2&@$>^fudw&`~a;p29;f@=9
zh&v)RK2CmRk)PI&4Cm?HA|#W^U{X|Tv-NitV+x~L3VUctFm=B=`S+R4X9N#5dqRtd
z$5N$=gCsog?JVZ9mb-V3ubEL0(o<6ENVJ*rbydwfXpj1Az31s!Li2xToSDW`4Ss-~
zXUCwJj~zZ(Gu>(i{KjWXiP8wAuGi8xkrJ5~Ios#Pez1~Tk6F$-QlLyBLW>{c&L>XB
z;9Hu`Ef7J0IX8E=uut>5jt%nro767Q>L~H{3;jz6aW;VfH7={;Pvp=3x@C=EHbc4U
zA@`Aaf&zM;am!}Y#$Xy``QDT>@9U+2$Gsj=-Pp%mZ6?RY@1|KFaut@FN`$j~7ZA1+
zOqPjfT&D*A)V}*T6mj+y%+rB~*iiGzErPVt~?qBNTh3}6KYLc-$
zeRw?l^R-Kjn!5%Ws;O)~h+SECAvqU+WJmLnB@4b@e?x_Fbn*t0!*c2iI=zAQs8}QE
zts)`_R=nQZmt73r4+3phQJDqswkJpRTsnxM-JwH$q#qc|dWeS}&?cwC;${|>;P%zg
zM-Tqq4mLJ&lD~g(WmEiVuVMYmvt}w4`Mxfr#Flr}q3SMkjV`x`iwVbl+?cNzUOb1p
zpV?E&S5e9_)-k0J@A|swJB>v?Wf30C(BCb>^u;EztMwMfxzddB;dP`T9-!Y94s&i(
zfLOQ`X+gr@%hxX*&ejS6FJFfU$$a)tX?P1cSLq(;KInIl=&fcHG%)7;%Ftwgb!8dn
z={7wc`eKaV3300g^OKj`*LVo&!m#k)CkAy9hZuqra~K-PU8!p4=r$29-}*6E5#E>c
zz0jb`CR%EH-3Ojl-CO-g)7rz9|Q5g`=`UQyiH7+jZs;8;`0b&
z$Qc^G%3NRXTsfpUFQ+((d~3oGru7%-%E(vJ1a-MWEDs3%J;ZxkqK832eeWh~stqEs
zr9a$;E&&|989%X?aKF%J`{Da2j7wU(@N?n5uBJ!6_}ObL{nAC-)-qMu|G9TE5{$oH
zXyrLM+roxyweO!f8MwX%r}V8JPz!%f5_G|3()xa#D}LoIJ-{c_&Pjvr6eUY9a+>QR
zV$>r*RW=Rje)>e3ha^1f=leR=*l1q>&r0aS_+ofZ-UYI!8)J!>B|p8dxq)2aj>ub0
zv0B|i2qH9~@GK#ZMMn|)>{j0&{8?O*qwJ^1t`Z7imCJ+igXP3G=>l+QD=
z$a^=w?lNS-!-sGp9Ql2@aR!k}H~!jYS}S&ct$@FiI@nZp*X^nARCY@8nvx|ZWVA?y
z@LIgD3$k|Xt_rPAP)j7{OJ;rvd<#kRv(SzE7#DSv(@;6$WgIi+2xvgdY>(CCZ5?KQ
zw-1n+%EC)*X##x`;?ISDWTT6AO
zF12*4CUor)-!Wo4X}Y*%_TQ@%
zAt?6P@RhB(=x=)$4!y45n+xA$ibX=AveD%0gwv0Un(cE~6%&mc#+h0Yo}$$`hJ1ef
z4ATDl+bUuNmoQI_FrznrKplP1iapS?q<}KV|EguN<*EXQyyKuH^92wy`D#Y_Ly(+I
zIOt@-CxDkIpxN-E>D9zg!|6d^V=Bx_YCf&l0B&LVa}1n`l&jUaUnXc2I7G6}$uOz1
zl;99nv<0WJ=X%yIeSO`ot9g|-=yx@r5x&3u&PLVilVH5_sXmg1uLyW`*&F}tNnlt`
zM`q4E8Z!4GoXc|_mxrjbeoByoH5_&(BN3Su=QI5Cr622|{#Ja{j+YZ@Di=>rum35E
zeR}X=C^=>rS_1pI=U22fy#8Or2;s6
zN5mt0I3?dg22;1VSmC)N=nH=!$q?_Yqb{?>SH)G;#9^51z{k&Gotv4+{3Yw}(O2pH
zZ0#o&Uc-I8Q@9>1r2xh1iLj7NC1^mgl=$ch)~M@>-=Rx+mN9>i5s8m|N>_(sR_>jb
zyw4O%9FcNm8qw0ic#hR4jJBcZyc{^-a(qV;&ikxhcI*}xvb#L6#(dGB8nR!w~uF^NZ
z8r2@zHM8Li@!OW|sC8d1I~7b3sWCjI1&^gC7S@VTD;Lo&Fn&1dkO>>mQnek
zEAnagzw3dXC&7=ph-BiaQKunVcbDb`apdc|q5@FG>`Z6eiQyE0{aX;zlxLw@{6(ymlr;1ip1$!4-)
z$B-Ut*Uz!W%*NpR9f&i)tx4le+dvj1=k|6`2wbcaE!HT-ZE2&lgtb)<6iWJSG$tN8#LITT0>7#mD4
zo9RUf(c#(-W_Ec7)xu?7le`vI-s(a_qGW-MQyG42=Eu
zQy`VYQ_XkYqdV}`$7~c0Tv7VC{n!cg@%F0ppYFn@8qX>ZJNWT9bNb99MPPjXF^L^l
z3rZciTPBv9=KA|RbEG1YQ6I79bhw++_1?ZBN-aE13?~Wu&PijN^GwWd7={>sThB=5>
z9e`mCi@e)e#1GE{lvgvYram7ilNb7aqwl2_O_LGkD?L(25>)JybOr7O0z^H;tyC
zbor(I*%Z7>()R{)Btpb*TPoO9Sf55Z_ZZbmZgeV`a6j(0QooPjchZ_-J!YpseD#?)
zt=yTL3Ev$!rCki
zC0PxyATY7e)^(4EgD{;kzuh-0H@9v2_=khtRW8{${->aXPywS+Pdn3a;Z)Sc<6S#;
z@JbZEiuX<|jdCbH@^8IwR^OZYoFT`^qs!yItR)phyIrTsp;t$O6+-MGSxsoE#fj{G
z-)I`T-8Q$lDe^^{1rw@{w4jJ?l{Nik{+Vv?93L;Mi;Q_bkyX_TOn)Ow|CKWZ{rO&^
zwG>V8*_t#OQzf%r*oPPAB3G}7ow)8L_jIjmpdnOwv+6h0fcK8sP_<%^qnLXV#WFX#
zcpKuq&_cckbL{LgGBwikt!oW?bQ~;%!u0{l%@xprH&xR0fLIcRITYY;mty^Drev#@
zV?qZEHLVk>U1HmQXKu}V2XHh+Y^gFwm=mH$^@+0V{d7DKmD`)`66mnTXQvCdJQK^`
z@Rk~LWu0MO3hPMY;Lbu0(dWRsyDm>@mf8BJ5_x#HPH3U@=V|zzCPfTg3QHWTQAU4KY>P
z5zOpPvVIK>+D3nEQO=Y2@ZNBi25SapQKF`lQLQRKzPbL#dNzcN+~t{eyiA8`6;v}(
zaE-ZMW~@RZUmW3j-79M)QiUpuCGiz9BqMQru{oNtfo8+iWm9Xz&3NXjBa3d8EM;2z
z!ISMKMRGIa$&3@}tjxJ$1Du=H()8&
z-W!zgNJov&*y>sFb_KyZkj944jMwj{-N0V_#abVPH)=BWk(gRo5X$r!nzz2^NPgqY
zHI-+rvmpwNOP9U4E3Y?=b)B{kjqpL856ReR8Vv~WOwUnhm%8>RJ-eahS^kqHm%xaS
z<4E!v=RaDVb3ON^x-X?JZlZ`C;YK{%quO)+%lreKm**OMrwx}@=bqY3HiFqBAgk$%&}LTRbnl9D
zmLa!EG!uh?F0tyAvXO-x5MD63+y%jt6!92nLX?j+QK;f0q_tIWnz1YDN8+P
z&ZFGqL`N#tApIShO9f>TKQ~Q%n!Xs5PAMGgcOU4J7h6n9Aj;@jO)Lj2wia3xWrGDVY6A%eLWjDbZjeCe?`92L2OkNCrDK1u&Jwxr$t!5A%4Z_Xox+V;E#|0AnKvOlv0l2m?VOtkD$S^F
zV0EIseQYl~bK^mQ3hVlw88(I>@6Fi?d7xtYrmJ5bsvr8s_dB$42rYm4S9c6jLxO>Y
zy3da!3KM6Uz=EjTADN|C^R9eDq-#P{8SmsY=g*EB0bNX{aYBF2PxhvlC|l3pGH=L)
zN82bx2*^e>nWAyb3VVwZZ0$47DEwW)v$!@^v4$ri4-usfS4-2W*R%5?ht<_5^~X%U
zL~#9wMXw)<3J?sw*H8V8f40IE1GDwl
zApuFlo0z*cn_{7C#V(pJo4q#r&$v73=2xa!vI89}4&47JoGjfU`W$tu4p|Jd67Z9g
z2GV`D42W~S11?pCHabR<>&V)UoAS6-p*#d
ze0IY7ibcPcT~ld&_J#S;bhp-vItF0-D&%R%hgwwFIWw;u7L{zBPUBYt^G{(jHedcg
z_5-4Kr9YMscA=cOQ?ikxzgq-p
z5uVbPXdnk>V=e20gdIf|eI1|^+r;M-M;9^cG!?tfrsf>Y%#mi$`c!u;4ohG!J2@U`
zg#$APDfg!ZJZtH5r=$3l)H2J9o6sXw`dWo3^4E2W-md75LUbqM0kd%Ni?FycNM`lx
zbQP!()L@R{p8FYD6e>o#%4B0S=jua(4LQ4=hyFW95j8
zt^~)Jlive9#T}A!TpJ@x)pjS|^lIPs&6Xsh!o
zG`MREsTWWGeI57NbgfEud;b}~n%eUtM=pBx1@r{)6Z^0pEtUyGR?4ur8B*3=&fzU}
z%WWzgeVco6B!+z0rJS4*T+Q>;mMp&Xz8dM~IHrqD*ezSQKEIxjG(dOCz_f~8ze>ZP
z{G3qNv}>w1qBGd=cTbq)nqobs`qTiyg=v84&eS%xCUc@j_EMmygU?djaf+n$%gJG6
z7a0CMIX$TBBr*GgFtYkO8pcW}lC8OT;9Ob}66GfW+xY$N@D}D{JR)Ws=_djqHLMV#M^
zGdEE{{XF_*zi=h!Yem#$k5&G8Y?W{8Gmm0&z$c%Q9d?i}fBHfmtnsSnP@Cgf3vGp~
z#WD#kJ-@GAiGY_RrTNWQp4cTzoP5y7I|q&o9Z~P%pi>Y%$Gl;+Y`F~M%GdB7>^F!R
zq8WYGjEY#uAmZg-7a{2)j;toj&6){~(LoA+`gpw7^OxESL!6U+9`o!CM_*nkCF4;m
zQj{6PFia^$2Py{}zITHZh4VZK_DHtbd+!^V1+-gK$Uo*=N`l{yaYh8g$23aodX%yi
zTrY+j45$Rf0@0seE*T$8Z7WgP<^
z7fz+ex?}rlbhC{&7;*|M+?KtT$fv%?Jj@6!Pvi{wsU4PE*+-9;=eg8PZV;7Fu=NY^
z)F7ygR{Q?O>&(xJ|LA)E{vykU{*63}e1<=kFNE2Q+{->Wur)I80E3?96
zw*@l&?!E46i%KTL`%*DDl!U%K{dH2CWvX>xg>k8ruK=I1V@5@R5Q`Ogs1j&mzVDaB
zE%iv5F<3r%_s4_oui|RljuW6
zTl~P6e?>AF%vR<%f;Axfv8!fSpo6{sS;dcv29u$RRfjn7?N6cvu!rhu^v^aTdrH;9
zRA>cYg2)le&&*X~CR*ahj_PHGLuvI+#hlC46p}H_wa^D7-5t|+wwT|5z8EEcJ7xtt
zHnLLa4<{;eRGYgN$}jtv$Sf4s&VvGCTM57we5(QogfuukTZ;w1UPPW-D*NUy(?tMdf;)3kPE;E>{Y9w9~BFFKWpJe1u93MeH
zrx>wTT}n?d|xK4fPR9Q)`k*PjU|vh+eLw6Km`0fWNIgnbh3;K=j%#AAaH9Q&99`qxPT?4^^+(
zbv%K4KW_a<-|ROJD!{Z&&74S#EQx9WBgP8}FKtN+(k2knWd=4*BaQPFuERY#;K$4P
zD!x3-$;&>uD|`B#Wv~QVCA-?i!AN
z4xjVNrq%2wG`5Z7UJ(W3h>CNdOjg6g*;#y;dFV;cH0-ytqqu?bsZ%Qnx39h_D|U1OVhmLK3%??q=pl;
z76sybg2cUA|;vEa0+>4(@
z*p8m>BsELKi!V~@7+I^d5~DzUkDm4uF$j6{tPjw_LU0l6d5aY-LSm|KP6<}&DsmG^
zv%fFQl^0$*Hn=ev8G+Id3g&>oAYANJMUu6K4
zVKjH@KHC79daN$f{}QFY}@4XJ^j!Ro0*-#IY=+O=tC_^B$BcSaUf&G$o$n
zTin0iQo2H`C>z}t5PLA}^SWW_=X(4bl+*i%Xq^#12qo9ui)@{8IER-A`B#Q`h3)gr6b6n9-T{=-^8UFR|GyF^wgB}o7qL#{{fV?lq+T6KC*piEF}I)4FEOzSuf}0KX#YD
z6oim%A|iFc$R%+FcLcJ?0&`rA&_p{8Bo|K4$&qP~>1Hqjt92xNeov)lGg)$DNH6#n
z%eCIjBPJvwO&mE41CaR1mtgI9a07XgjiXz~wOSuR4nGANoT^&;ML0C4e|a?Rj{-qx
zA29Z1Uh>~~L()kDcs;>#jV!&={~a}9mDSfGoEd|?uIpDwOMB{E+4ejvVhB=TA08=}
zf@n~hOF|`(PU)yP^`vMmSm~2qJ8kT>sFx_cwMwK*tOh4!yrceb(PJXdI>A}{l?4%1
z&e2Na)kNn<2`+t&5gu3ir&WaG!aS+I8RzChDo8bydg~*5FkfvnXbBgZ<-Y2u8^_g4
z*S!C&Q~=EthJEKC)m<=`SS{@T{GL1~@gZ=vYH;P*=R1Z7BJO_DONFPY^?1^6n@#i8
zWbU>T68?GCHwM_y7plj-`;(Iso#I+mU0~J}HF9*Av~VyVO_&%!ovf6D>$c4|P3C%t
z5_!Nb5I0bED>tBZ<6gD$HTDN17yC71TZPx6vbRKf^81=U-1-Vv`h$4
zB*@n3$Sxn=iR+rtI8e1!tq@av`I2dn#kx@HS|awaXI;*@`basWF6EAo7mD9NjLIMPK7R&XQwK@S8&r>i0!CUoKx(dlhC%<}*y`!HH%taJidF
z2EVv
zNA1)8ZZUXex}2^=5UQ=M8D~1%zrkloN_Lz9qGmAgU22EyO!5V5mGZ>@YtYraXnrPs
z(>yVi5->nkfb{8up&6=)W*AK}HUermG}G94dCd-T`uSoWsZH_6hR7*5)L3{IZ&UT6C35I6*%Nt2=mOj+_-%2o5E!P)6MER?5o@AI4C@F2dO3}Zl7Froa?
zrDd*_Rsxx8cWL?Xg_J=rwjhtRLYIaPxO6idVFT8Xd?cm
zimyug?zGm(^a6*fqO19R^wFr`)Y8>_`eWz}SH2l)0m`pM=Xkb-|E8)Ul25K*M$=0*
zQsoe*+$cY{M;7h*W@ttND_QbLjZSG(T9Z=zX@492bjp0Sr{LZ>`AL?m^0}!pEzZmc
z_c-@n%G26M#s;Y>zXA^at*^22bHO;S9^e+SQE_CG;S&l#2?EJgYzYYDquhuxqnt=Q
zClK>*9!YGhjQ4VrcLEl{l;2ItPAwE@F=72j-c(E*pHnjq+#f+Es4^UeAV#29;I39@
zp-lLi^HPxo{TkY%U=
ztb967j17|&lT&UCO)LS*j^>`8?nJre8h$Zx>cxM8oe3#llUM^7L7e$iE9^3kulT&0
z6w^z<09ksuj9t}$#>$#WD^or0s7mLUFUj{v)76}qDF1e!l?D{bi|2e-X*624yi%1j=y@*0ryC`w`jFTV
zS;^T;>uY&`qyk@58ZVdJQ9wliA&{_R;N)=bm%v#H97J%Fs5$BBPy{ADGlKk4t7Hd8
zzA_Qt(Pf|M8FSrT31luEcfVV4sk1Q<%T??rlkZ7
zkWI^CH<>mPs4NK>AgiqMG`TSnn3fVSKsGIl-DKKGpt2sFnZ#
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 {
sAVe
- onCancel()}>
cANCEl
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}) {
onEdit()}>eDIt
- onDelete()}>dELETe
+ onDelete()}>dELETe
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 (
-
+
fEEDBACk
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 (
-
+
hOMe
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 > ", () => {
const wrapper = mount(click me );
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(click me );
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)}/>
- this.updateValue("")}>cLEAr
+ this.updateValue("")}>
+ cLEAr
+
);
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}>
- this.showPassword(true)}>sHOw
- this.showPassword(false)}>hIDe
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 (