From e9fd65d59b136dc5b166d53c7c68ff175f458d76 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 11:56:27 -0800 Subject: [PATCH 0001/5422] "Borrow" the RFC template from atom/teletype with minor changes --- docs/rfcs/000-template.md | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 docs/rfcs/000-template.md diff --git a/docs/rfcs/000-template.md b/docs/rfcs/000-template.md new file mode 100644 index 0000000000..bfc1ec53be --- /dev/null +++ b/docs/rfcs/000-template.md @@ -0,0 +1,43 @@ +# Feature title + +## Status + +Proposed + +## Summary + +One paragraph explanation of the feature. + +## Motivation + +Why are we doing this? What use cases does it support? What is the expected outcome? + +## Explanation + +Explain the proposal as if it was already implemented in the Teletype package and you were describing it to an Atom user. That generally means: + +- Introducing new named concepts. +- Explaining the feature largely in terms of examples. +- Explaining any changes to existing workflows. +- Design mock-ups or diagrams depicting any new UI that will be introduced. + +## Drawbacks + +Why should we *not* do this? + +## Rationale and alternatives + +- Why is this approach the best in the space of possible approaches? +- What other approaches have been considered and what is the rationale for not choosing them? +- What is the impact of not doing this? + +## Unresolved questions + +- What unresolved questions do you expect to resolve through the RFC process before this gets merged? +- What unresolved questions do you expect to resolve through the implementation of this feature before it is released in a new version of the package? +- What related issues do you consider out of scope for this RFC that could be addressed in the future independently of the solution that comes out of this RFC? + +## Implementation phases + +- Can this functionality be introduced in multiple, distinct, self-contained pull requests? +- A specification for when the feature is considered "done." From 429ac5965e73df3a0cdf4633ccd706ec31af5a18 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 11:56:53 -0800 Subject: [PATCH 0002/5422] Work so far --- docs/rfcs/001-recent-commits.md | 72 +++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 docs/rfcs/001-recent-commits.md diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md new file mode 100644 index 0000000000..f72ce128fa --- /dev/null +++ b/docs/rfcs/001-recent-commits.md @@ -0,0 +1,72 @@ +# Recent commit view + +## Status + +Proposed + +## Summary + +Display the most recent few commits in a chronologically-ordered list beneath the mini commit editor. Show commit author and committer usernames and avatars, the commit message, and relative timestamp of each. + +## Motivation + +Provide useful context about recent work and where you left off. +Allow user to easily revert and reset to recent commits. +Make it easy to undo most recent commit action, supersede amend check box. +Reinforce the visual "flow" of changes through being unstaged, staged, and now committed. +Provide a discoverable launch point for an eventual log feature to explore the full history. + +## Explanation + +If the active repository has no commits yet, display a short panel with a background message: "Make your first commit". + +Otherwise, display a **recent commits** section containing a sequence of horizontal bars for each of the top three commits reachable from the current `HEAD`, with the most recently created commit on top. The user can resize the recent commits section. As it is expanded or shrunk, the number of visible commits is changed responsively. + +Each **recent commit** within the recent commits section summarizes that commit's metadata, to include: + +* GitHub avatar for both the committer and (if applicable) author. If either do not exist, show a placeholder. +* The commit message (first line of the commit body) elided if it would be too wide. +* A relative timestamp indicating how long ago the commit was created. + +On hover, reveal a tool-tip containing: + +* Additional user information consistently with the GitHub integration's user mention item. +* The full commit message and body. +* The absolute timestamp of the commit. + +On the most recent commit, display an "undo" button. Clicking "undo" performs a `git reset` and re-populates the commit message editor with the existing message. + +Right-clicking a recent commit reveals a context menu offering interactions with the chosen commit. The context menu contains: + +* For the most recent commit only, an "Amend" option. "Amend" is enabled if changes have been staged or the commit message mini-editor contains text. Choosing this applies the staged changes and modified commit message to the most recent commit, in a direct analogue to using `git commit --amend` from the command line. +* A "Revert" option. Choosing this performs a `git revert` on the chosen commit. +* A "Hard reset" option. Choosing this performs a `git reset --hard` which moves `HEAD` and the working copy to the chosen commit. When chosen, display a modal explaining that this action will discard commits and unstaged working directory context. If there are unstaged working directory contents, artificially perform a dangling commit, disabling GPG if configured, before enacting the reset. This will record the dangling commit in the reflog for `HEAD` but not the branch itself. +* A "Soft reset" option. Choosing this performs a `git reset --soft` which moves `HEAD` to the chosen commit and populates the staged changes list with all of the cumulative changes from all commits between the chosen one and the previous `HEAD`. + +If any of the recent commits have been pushed to a remote, display a divider after the most recently pushed commit that shows an octocat icon. On hover, show the name of the remote tracking branch. + +## Drawbacks + +Consumes vertical real estate in Git panel. + +The "undo" button is not a native git concept. This can be mitigated by adding a tooltip to the "undo" button that defines its action: a `git reset` and commit message edit. + +The "soft reset" and "hard reset" context menu options are useful for expert git users, but likely to be confusing. It would be beneficial to provide additional information about the actions that both will take. + +The modal dialog on "hard reset" is disruptive considering that the lost changes are recoverable from `git reflog`. We may wish to remove it once we visit a reflog view within the package. + +## Rationale and alternatives + +- + +## Unresolved questions + +- Allow users to view the changes introduced by recent commits. For example, interacting with one of the recent commits could launch a pane item that showed the full commit body and diff, with additional controls for reverting, discarding, and commit-anchored interactions. +- Providing a bridge to navigate to an expanded log view that allows more flexible and powerful history exploration. +- Show an info icon and provide introductory information when no commits exist yet. +- Add a "view diff from this commit" option to the recent commit context menu. + +## Implementation phases + +- Can this functionality be introduced in multiple, distinct, self-contained pull requests? +- A specification for when the feature is considered "done." From 56bebda4bc715749a572b6dd4c54bc3c3f3d1b52 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 12:04:32 -0800 Subject: [PATCH 0003/5422] HI @kuychaco!!! --- docs/rfcs/001-recent-commits.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index f72ce128fa..81ba49fcd0 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -53,11 +53,11 @@ The "undo" button is not a native git concept. This can be mitigated by adding a The "soft reset" and "hard reset" context menu options are useful for expert git users, but likely to be confusing. It would be beneficial to provide additional information about the actions that both will take. -The modal dialog on "hard reset" is disruptive considering that the lost changes are recoverable from `git reflog`. We may wish to remove it once we visit a reflog view within the package. +The modal dialog on "hard reset" is disruptive considering that the lost changes are recoverable from `git reflog`. We may wish to remove it once we visit a reflog view within the package. Optionally add "Don't show" checkbox to disable modal. ## Rationale and alternatives -- +- Display tracking branch in separator that indicates which commits have been pushed. This could make the purpose of the divider more clear. Drawback is that this takes up space. ## Unresolved questions From 8032a5ca8cbdd1101c163a6cab488d444063caba Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 12:05:33 -0800 Subject: [PATCH 0004/5422] HI AGAIN @kuychaco!!!! --- docs/rfcs/001-recent-commits.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index 81ba49fcd0..e3fa96dd7d 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -40,7 +40,7 @@ Right-clicking a recent commit reveals a context menu offering interactions with * For the most recent commit only, an "Amend" option. "Amend" is enabled if changes have been staged or the commit message mini-editor contains text. Choosing this applies the staged changes and modified commit message to the most recent commit, in a direct analogue to using `git commit --amend` from the command line. * A "Revert" option. Choosing this performs a `git revert` on the chosen commit. -* A "Hard reset" option. Choosing this performs a `git reset --hard` which moves `HEAD` and the working copy to the chosen commit. When chosen, display a modal explaining that this action will discard commits and unstaged working directory context. If there are unstaged working directory contents, artificially perform a dangling commit, disabling GPG if configured, before enacting the reset. This will record the dangling commit in the reflog for `HEAD` but not the branch itself. +* A "Hard reset" option. Choosing this performs a `git reset --hard` which moves `HEAD` and the working copy to the chosen commit. When chosen, display a modal explaining that this action will discard commits and unstaged working directory context. Extra security: If there are unstaged working directory contents, artificially perform a dangling commit, disabling GPG if configured, before enacting the reset. This will record the dangling commit in the reflog for `HEAD` but not the branch itself. * A "Soft reset" option. Choosing this performs a `git reset --soft` which moves `HEAD` to the chosen commit and populates the staged changes list with all of the cumulative changes from all commits between the chosen one and the previous `HEAD`. If any of the recent commits have been pushed to a remote, display a divider after the most recently pushed commit that shows an octocat icon. On hover, show the name of the remote tracking branch. From 60b454b3f75278aee43e1bff5df6fe1893b64fd2 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 15:10:47 -0800 Subject: [PATCH 0005/5422] Note behavior within the bottom dock --- docs/rfcs/001-recent-commits.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index e3fa96dd7d..77887b381b 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -45,6 +45,8 @@ Right-clicking a recent commit reveals a context menu offering interactions with If any of the recent commits have been pushed to a remote, display a divider after the most recently pushed commit that shows an octocat icon. On hover, show the name of the remote tracking branch. +If the Git dock item is dragged to the bottom dock, the recent commit section will remain a vertical list but appear just to the right of the mini commit editor. + ## Drawbacks Consumes vertical real estate in Git panel. From 527e6e6fe009d42fb19b9a573ded9e6a4d2ef611 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 15:19:38 -0800 Subject: [PATCH 0006/5422] Hover -> click --- docs/rfcs/001-recent-commits.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index 77887b381b..73b1014ba1 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -28,7 +28,7 @@ Each **recent commit** within the recent commits section summarizes that commit' * The commit message (first line of the commit body) elided if it would be too wide. * A relative timestamp indicating how long ago the commit was created. -On hover, reveal a tool-tip containing: +On click, reveal a tool-tip containing: * Additional user information consistently with the GitHub integration's user mention item. * The full commit message and body. From 809aa7faddd76fcb442abd3c5cdb6a72c7fc030f Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 15:39:38 -0800 Subject: [PATCH 0007/5422] (shhhhhh) --- docs/rfcs/000-template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rfcs/000-template.md b/docs/rfcs/000-template.md index bfc1ec53be..3e332c5b5f 100644 --- a/docs/rfcs/000-template.md +++ b/docs/rfcs/000-template.md @@ -14,7 +14,7 @@ Why are we doing this? What use cases does it support? What is the expected outc ## Explanation -Explain the proposal as if it was already implemented in the Teletype package and you were describing it to an Atom user. That generally means: +Explain the proposal as if it was already implemented in the GitHub package and you were describing it to an Atom user. That generally means: - Introducing new named concepts. - Explaining the feature largely in terms of examples. From ba8dd34b9047bb4e6d2c85c318a1cb1a6de4a97f Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 15:52:23 -0800 Subject: [PATCH 0008/5422] Pictures! :camera_flash: --- docs/rfcs/001-recent-commits.md | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index 73b1014ba1..27cf4b2605 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -10,11 +10,14 @@ Display the most recent few commits in a chronologically-ordered list beneath th ## Motivation -Provide useful context about recent work and where you left off. -Allow user to easily revert and reset to recent commits. -Make it easy to undo most recent commit action, supersede amend check box. -Reinforce the visual "flow" of changes through being unstaged, staged, and now committed. -Provide a discoverable launch point for an eventual log feature to explore the full history. +* Provide useful context about recent work and where you left off. +* Allow user to easily revert and reset to recent commits. +* Make it easy to undo most recent commit action, supersede amend check box. +* Reinforce the visual "flow" of changes through being unstaged, staged, and now committed. +* Provide a discoverable launch point for an eventual log feature to explore the full history. +* Achieve greater consistency with GitHub desktop: + +![desktop](https://user-images.githubusercontent.com/7910250/36570484-1754fb3c-17e7-11e8-8da3-b658d404fd2c.png) ## Explanation @@ -28,14 +31,10 @@ Each **recent commit** within the recent commits section summarizes that commit' * The commit message (first line of the commit body) elided if it would be too wide. * A relative timestamp indicating how long ago the commit was created. -On click, reveal a tool-tip containing: - -* Additional user information consistently with the GitHub integration's user mention item. -* The full commit message and body. -* The absolute timestamp of the commit. - On the most recent commit, display an "undo" button. Clicking "undo" performs a `git reset` and re-populates the commit message editor with the existing message. +If any of the recent commits have been pushed to a remote, display a divider after the most recently pushed commit that shows an octocat icon. On hover, show the name of the remote tracking branch. + Right-clicking a recent commit reveals a context menu offering interactions with the chosen commit. The context menu contains: * For the most recent commit only, an "Amend" option. "Amend" is enabled if changes have been staged or the commit message mini-editor contains text. Choosing this applies the staged changes and modified commit message to the most recent commit, in a direct analogue to using `git commit --amend` from the command line. @@ -43,10 +42,20 @@ Right-clicking a recent commit reveals a context menu offering interactions with * A "Hard reset" option. Choosing this performs a `git reset --hard` which moves `HEAD` and the working copy to the chosen commit. When chosen, display a modal explaining that this action will discard commits and unstaged working directory context. Extra security: If there are unstaged working directory contents, artificially perform a dangling commit, disabling GPG if configured, before enacting the reset. This will record the dangling commit in the reflog for `HEAD` but not the branch itself. * A "Soft reset" option. Choosing this performs a `git reset --soft` which moves `HEAD` to the chosen commit and populates the staged changes list with all of the cumulative changes from all commits between the chosen one and the previous `HEAD`. -If any of the recent commits have been pushed to a remote, display a divider after the most recently pushed commit that shows an octocat icon. On hover, show the name of the remote tracking branch. +On click, reveal a tool-tip containing: + +* Additional user information consistently with the GitHub integration's user mention item. +* The full commit message and body. +* The absolute timestamp of the commit. +* Navigation button ("open" to a git show-ish pane item) +* Action buttons ("amend" on the most recent commit, "revert", and "reset" with "hard", "mixed", and "soft" suboptions) + +![commit-popout](https://user-images.githubusercontent.com/17565/36570682-11545cae-17e8-11e8-80a8-ffcf7328e214.JPG) If the Git dock item is dragged to the bottom dock, the recent commit section will remain a vertical list but appear just to the right of the mini commit editor. +![bottom-dock](https://user-images.githubusercontent.com/17565/36570687-14738ca2-17e8-11e8-91f7-5cf1472d871b.JPG) + ## Drawbacks Consumes vertical real estate in Git panel. From fee911461e29beceb537d5b60deadc4e6f01d4d9 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 15:59:49 -0800 Subject: [PATCH 0009/5422] Implementation phases. --- docs/rfcs/001-recent-commits.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index 27cf4b2605..461b16c9f7 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -76,8 +76,11 @@ The modal dialog on "hard reset" is disruptive considering that the lost changes - Providing a bridge to navigate to an expanded log view that allows more flexible and powerful history exploration. - Show an info icon and provide introductory information when no commits exist yet. - Add a "view diff from this commit" option to the recent commit context menu. +- Integration with and navigation to "git log" or "git show" pane items when they exist. ## Implementation phases -- Can this functionality be introduced in multiple, distinct, self-contained pull requests? -- A specification for when the feature is considered "done." +1. List read-only commit information. +2. Replace the amend checkbox with the "undo" control. +3. Context menu with actions. +4. Tooltip with action buttons and additional information. From 486ff300d5df6cfac107cf023ea223f206d51dab Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Feb 2018 16:05:12 -0800 Subject: [PATCH 0010/5422] Add the React conversion --- docs/rfcs/001-recent-commits.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index 461b16c9f7..12379cccac 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -80,7 +80,8 @@ The modal dialog on "hard reset" is disruptive considering that the lost changes ## Implementation phases -1. List read-only commit information. -2. Replace the amend checkbox with the "undo" control. -3. Context menu with actions. -4. Tooltip with action buttons and additional information. +1. Convert `GitTabController` and `GitTabView` to React. +2. List read-only commit information. +3. Replace the amend checkbox with the "undo" control. +4. Context menu with actions. +5. Tooltip with action buttons and additional information. From 99971cc77ade59af12ffe44b8c2a192a937c910f Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Wed, 28 Feb 2018 11:46:36 -0500 Subject: [PATCH 0011/5422] Update to account for review comments --- docs/rfcs/001-recent-commits.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index 12379cccac..af97b93096 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -23,26 +23,34 @@ Display the most recent few commits in a chronologically-ordered list beneath th If the active repository has no commits yet, display a short panel with a background message: "Make your first commit". -Otherwise, display a **recent commits** section containing a sequence of horizontal bars for each of the top three commits reachable from the current `HEAD`, with the most recently created commit on top. The user can resize the recent commits section. As it is expanded or shrunk, the number of visible commits is changed responsively. +Otherwise, display a **recent commits** section containing a sequence of horizontal bars for ten **relevant** commits with the most recently created commit on top. The commits that are considered **relevant** include: + +* Commits reachable by the remote tracking branch that is the current upstream of `HEAD`. If more than three of these commits are not reachable by `HEAD`, they will be hidden behind an expandable accordion divider. +* Commits reachable by `HEAD` that are not reachable by any local ref in the git repository. +* The single commit at the tip of the branch that was branched from. + +The most recent three commits are visible by default and the user can scroll to see up to the most recent ten commits. The user can also drag a handle to resize the recent commits section and show more of the available ten. Each **recent commit** within the recent commits section summarizes that commit's metadata, to include: * GitHub avatar for both the committer and (if applicable) author. If either do not exist, show a placeholder. * The commit message (first line of the commit body) elided if it would be too wide. * A relative timestamp indicating how long ago the commit was created. +* A greyed-out state if the commit is reachable from the remote tracking branch but _not_ from HEAD (meaning, if it has been fetched but not pulled). On the most recent commit, display an "undo" button. Clicking "undo" performs a `git reset` and re-populates the commit message editor with the existing message. -If any of the recent commits have been pushed to a remote, display a divider after the most recently pushed commit that shows an octocat icon. On hover, show the name of the remote tracking branch. +Annotate visible commits that correspond to refs in the git repository (branches and tags). If the commit list has been truncated down to ten commits from the full set of relevant commits, display a message below the last commit indicating that additional commits are present but hidden. Right-clicking a recent commit reveals a context menu offering interactions with the chosen commit. The context menu contains: * For the most recent commit only, an "Amend" option. "Amend" is enabled if changes have been staged or the commit message mini-editor contains text. Choosing this applies the staged changes and modified commit message to the most recent commit, in a direct analogue to using `git commit --amend` from the command line. * A "Revert" option. Choosing this performs a `git revert` on the chosen commit. * A "Hard reset" option. Choosing this performs a `git reset --hard` which moves `HEAD` and the working copy to the chosen commit. When chosen, display a modal explaining that this action will discard commits and unstaged working directory context. Extra security: If there are unstaged working directory contents, artificially perform a dangling commit, disabling GPG if configured, before enacting the reset. This will record the dangling commit in the reflog for `HEAD` but not the branch itself. +* A "Mixed reset" option. Choosing this performs a `git reset` on the chosen commit. * A "Soft reset" option. Choosing this performs a `git reset --soft` which moves `HEAD` to the chosen commit and populates the staged changes list with all of the cumulative changes from all commits between the chosen one and the previous `HEAD`. -On click, reveal a tool-tip containing: +On click, select the commit and reveal a balloon containing: * Additional user information consistently with the GitHub integration's user mention item. * The full commit message and body. @@ -77,11 +85,14 @@ The modal dialog on "hard reset" is disruptive considering that the lost changes - Show an info icon and provide introductory information when no commits exist yet. - Add a "view diff from this commit" option to the recent commit context menu. - Integration with and navigation to "git log" or "git show" pane items when they exist. +- Can we surface the commit that we make on your behalf before performing a `git reset --hard` with unstaged changes? Add an "Undo reset" option to the context menu on the recent commit history until the next commit is made? Show a notification with the commit SHA after the reset is complete? ## Implementation phases -1. Convert `GitTabController` and `GitTabView` to React. -2. List read-only commit information. +1. Convert `GitTabController` and `GitTabView` to React. [#1319](https://github.com/atom/github/pull/1319) +2. List read-only commit information. [#1322](https://github.com/atom/github/pull/1322) 3. Replace the amend checkbox with the "undo" control. 4. Context menu with actions. -5. Tooltip with action buttons and additional information. +5. Balloon with action buttons and additional information. +6. Show which commits have been pushed. +7. Show information about other refs. From f696da2959a24cc3b1e168f0be5d4bd3818c9d24 Mon Sep 17 00:00:00 2001 From: simurai Date: Thu, 1 Mar 2018 21:50:12 +0900 Subject: [PATCH 0012/5422] Add titles to Explanation --- docs/rfcs/001-recent-commits.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index af97b93096..4b58a4328e 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -21,8 +21,12 @@ Display the most recent few commits in a chronologically-ordered list beneath th ## Explanation +#### Blank slate + If the active repository has no commits yet, display a short panel with a background message: "Make your first commit". +#### Recent commits + Otherwise, display a **recent commits** section containing a sequence of horizontal bars for ten **relevant** commits with the most recently created commit on top. The commits that are considered **relevant** include: * Commits reachable by the remote tracking branch that is the current upstream of `HEAD`. If more than three of these commits are not reachable by `HEAD`, they will be hidden behind an expandable accordion divider. @@ -31,6 +35,8 @@ Otherwise, display a **recent commits** section containing a sequence of horizon The most recent three commits are visible by default and the user can scroll to see up to the most recent ten commits. The user can also drag a handle to resize the recent commits section and show more of the available ten. +#### Commit metadata + Each **recent commit** within the recent commits section summarizes that commit's metadata, to include: * GitHub avatar for both the committer and (if applicable) author. If either do not exist, show a placeholder. @@ -38,10 +44,16 @@ Each **recent commit** within the recent commits section summarizes that commit' * A relative timestamp indicating how long ago the commit was created. * A greyed-out state if the commit is reachable from the remote tracking branch but _not_ from HEAD (meaning, if it has been fetched but not pulled). +#### Undo + On the most recent commit, display an "undo" button. Clicking "undo" performs a `git reset` and re-populates the commit message editor with the existing message. +#### Refs + Annotate visible commits that correspond to refs in the git repository (branches and tags). If the commit list has been truncated down to ten commits from the full set of relevant commits, display a message below the last commit indicating that additional commits are present but hidden. +#### Context menu + Right-clicking a recent commit reveals a context menu offering interactions with the chosen commit. The context menu contains: * For the most recent commit only, an "Amend" option. "Amend" is enabled if changes have been staged or the commit message mini-editor contains text. Choosing this applies the staged changes and modified commit message to the most recent commit, in a direct analogue to using `git commit --amend` from the command line. @@ -50,6 +62,8 @@ Right-clicking a recent commit reveals a context menu offering interactions with * A "Mixed reset" option. Choosing this performs a `git reset` on the chosen commit. * A "Soft reset" option. Choosing this performs a `git reset --soft` which moves `HEAD` to the chosen commit and populates the staged changes list with all of the cumulative changes from all commits between the chosen one and the previous `HEAD`. +#### Balloon + On click, select the commit and reveal a balloon containing: * Additional user information consistently with the GitHub integration's user mention item. @@ -60,6 +74,8 @@ On click, select the commit and reveal a balloon containing: ![commit-popout](https://user-images.githubusercontent.com/17565/36570682-11545cae-17e8-11e8-80a8-ffcf7328e214.JPG) +#### Bottom Dock + If the Git dock item is dragged to the bottom dock, the recent commit section will remain a vertical list but appear just to the right of the mini commit editor. ![bottom-dock](https://user-images.githubusercontent.com/17565/36570687-14738ca2-17e8-11e8-91f7-5cf1472d871b.JPG) From 8f83aa4e2418d71112579ce6d797b907ebefc158 Mon Sep 17 00:00:00 2001 From: simurai Date: Thu, 1 Mar 2018 21:51:37 +0900 Subject: [PATCH 0013/5422] Make Explanation titles stronger --- docs/rfcs/001-recent-commits.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/rfcs/001-recent-commits.md b/docs/rfcs/001-recent-commits.md index 4b58a4328e..3380e92906 100644 --- a/docs/rfcs/001-recent-commits.md +++ b/docs/rfcs/001-recent-commits.md @@ -21,11 +21,11 @@ Display the most recent few commits in a chronologically-ordered list beneath th ## Explanation -#### Blank slate +### Blank slate If the active repository has no commits yet, display a short panel with a background message: "Make your first commit". -#### Recent commits +### Recent commits Otherwise, display a **recent commits** section containing a sequence of horizontal bars for ten **relevant** commits with the most recently created commit on top. The commits that are considered **relevant** include: @@ -35,7 +35,7 @@ Otherwise, display a **recent commits** section containing a sequence of horizon The most recent three commits are visible by default and the user can scroll to see up to the most recent ten commits. The user can also drag a handle to resize the recent commits section and show more of the available ten. -#### Commit metadata +### Commit metadata Each **recent commit** within the recent commits section summarizes that commit's metadata, to include: @@ -44,15 +44,15 @@ Each **recent commit** within the recent commits section summarizes that commit' * A relative timestamp indicating how long ago the commit was created. * A greyed-out state if the commit is reachable from the remote tracking branch but _not_ from HEAD (meaning, if it has been fetched but not pulled). -#### Undo +### Undo On the most recent commit, display an "undo" button. Clicking "undo" performs a `git reset` and re-populates the commit message editor with the existing message. -#### Refs +### Refs Annotate visible commits that correspond to refs in the git repository (branches and tags). If the commit list has been truncated down to ten commits from the full set of relevant commits, display a message below the last commit indicating that additional commits are present but hidden. -#### Context menu +### Context menu Right-clicking a recent commit reveals a context menu offering interactions with the chosen commit. The context menu contains: @@ -62,7 +62,7 @@ Right-clicking a recent commit reveals a context menu offering interactions with * A "Mixed reset" option. Choosing this performs a `git reset` on the chosen commit. * A "Soft reset" option. Choosing this performs a `git reset --soft` which moves `HEAD` to the chosen commit and populates the staged changes list with all of the cumulative changes from all commits between the chosen one and the previous `HEAD`. -#### Balloon +### Balloon On click, select the commit and reveal a balloon containing: @@ -74,7 +74,7 @@ On click, select the commit and reveal a balloon containing: ![commit-popout](https://user-images.githubusercontent.com/17565/36570682-11545cae-17e8-11e8-80a8-ffcf7328e214.JPG) -#### Bottom Dock +### Bottom Dock If the Git dock item is dragged to the bottom dock, the recent commit section will remain a vertical list but appear just to the right of the mini commit editor. From 8634ea3700551aabbdad4f47e2d936b3ea3c0ec9 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 13 Mar 2018 07:51:10 -0400 Subject: [PATCH 0014/5422] :arrow_up: fs-extra --- package-lock.json | 204 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 105 insertions(+), 103 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3690620345..184ae3467c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "github", - "version": "0.11.0", + "version": "0.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -55,7 +55,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" }, "arr-union": { "version": "3.1.0", @@ -544,7 +544,7 @@ "babel-plugin-relay": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-relay/-/babel-plugin-relay-1.4.1.tgz", - "integrity": "sha512-ER7HmXOz60zyLnh4yGvfP2UhsHyOPIIGmu+rE27IKzVdXhua+RXeS6462WuRod86u4EASJsfmbHRlqWy2GegwA==", + "integrity": "sha1-isVivLH9KzVl0nGqztMr5CyCc1M=", "requires": { "babel-runtime": "6.25.0", "babel-types": "6.25.0", @@ -554,7 +554,7 @@ "graphql": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==", + "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=", "requires": { "iterall": "1.1.3" } @@ -1094,7 +1094,7 @@ "babel-preset-fbjs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-2.1.4.tgz", - "integrity": "sha512-6XVQwlO26V5/0P9s2Eje8Epqkv/ihaMJ798+W98ktOA8fCn2IFM6wEi7CDW3fTbKFZ/8fDGvGZH01B6GSuNiWA==", + "integrity": "sha1-IvNY5mVAc6z2HkegUqd317zPA68=", "requires": { "babel-plugin-check-es2015-constants": "6.22.0", "babel-plugin-syntax-class-properties": "6.13.0", @@ -1350,7 +1350,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "requires": { "cache-base": "1.0.1", "class-utils": "0.3.6", @@ -1374,7 +1374,7 @@ "bash-glob": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bash-glob/-/bash-glob-1.0.2.tgz", - "integrity": "sha512-E0TTxH9T/tklSXt5R5X0zwxjW56su2VIE+sAruXbd8AtMjYZxtvioybVdptbRk0/0Nvdz0TVVShKhN9sH5dMpg==", + "integrity": "sha1-laxWMf3XqPxWnyZxZ6hOuDGXmhs=", "requires": { "async-each": "1.0.1", "bash-path": "1.0.3", @@ -1388,7 +1388,7 @@ "bash-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bash-path/-/bash-path-1.0.3.tgz", - "integrity": "sha512-mGrYvOa6yTY/qNCiZkPFJqWmODK68y6kmVRAJ1NNbWlNoJrUrsFxu7FU2EKg7gbrer6ttrKkF2s/E/lhRy7/OA==", + "integrity": "sha1-28nvvfGLHBFBPctZuWDmqlbIQlg=", "requires": { "arr-union": "3.1.0", "is-windows": "1.0.2" @@ -1429,7 +1429,7 @@ "braces": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", "requires": { "arr-flatten": "1.1.0", "array-unique": "0.3.2", @@ -1481,7 +1481,7 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "requires": { "collection-visit": "1.0.0", "component-emitter": "1.2.1", @@ -1615,7 +1615,7 @@ "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "requires": { "arr-union": "3.1.0", "define-property": "0.2.5", @@ -1670,7 +1670,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -1680,7 +1680,7 @@ "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==" + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, @@ -1730,13 +1730,6 @@ "object-visit": "1.0.1" } }, - "combined-stream": { - "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha512-JgSRe4l4UzPwpJuxfcPWEK1SCrL4dxNjp1uqrQLMop3QZUVo+hDU8w9BJKA4JPbulTWI+UzrI2UA3tK12yQ6bg==", - "requires": { - "delayed-stream": "1.0.0" - } - }, "commander": { "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", @@ -1903,7 +1896,7 @@ "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "requires": { "is-descriptor": "1.0.2", "isobject": "3.0.1" @@ -1912,7 +1905,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "detect-indent": { "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -2055,7 +2049,6 @@ "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "requires": { "asynckit": "0.4.0", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "mime-types": "2.1.17" } }, @@ -2130,7 +2123,6 @@ "aws-sign2": "0.7.0", "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "caseless": "0.12.0", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "form-data": "2.3.1", @@ -2312,7 +2304,7 @@ "es6-promise": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" + "integrity": "sha1-3EIhwrFlGHYL2MOaUtjzVvwA7Sk=" }, "es6-symbol": { "version": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", @@ -3478,7 +3470,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -3488,7 +3480,7 @@ "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==" + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, @@ -3507,7 +3499,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "requires": { "array-unique": "0.3.2", "define-property": "1.0.0", @@ -3542,7 +3534,7 @@ "fast-glob": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-1.0.1.tgz", - "integrity": "sha512-C2VHbdBwSkaQDyavjQZDflZzmZKrsUK3fTdJtsOnED0L0vtHCw+NL0h8pRcydbpRHlNJLZ4/LbOfEdJKspK91A==", + "integrity": "sha1-MPmxEg/Ven8XI2SmRY+9vZgYezw=", "requires": { "bash-glob": "1.0.2", "glob-parent": "3.1.0", @@ -3664,27 +3656,13 @@ } }, "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "4.1.11" - } - } + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jsonfile": "4.0.0", + "universalify": "0.1.1" } }, "fs.realpath": { @@ -4036,7 +4014,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { "kind-of": "6.0.2" } @@ -4048,7 +4026,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" }, "is-builtin-module": { "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", @@ -4066,7 +4044,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { "kind-of": "6.0.2" } @@ -4080,7 +4058,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { "is-accessor-descriptor": "1.0.0", "is-data-descriptor": "1.0.0", @@ -4153,7 +4131,7 @@ "is-odd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", "requires": { "is-number": "4.0.0" }, @@ -4161,14 +4139,14 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=" } } }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "requires": { "isobject": "3.0.1" } @@ -4205,7 +4183,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=" }, "isarray": { "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -4236,7 +4214,7 @@ "iterall": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", - "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==" + "integrity": "sha1-HLv/liBAVt3mZW4u0uIibQ5tcsk=" }, "jade": { "version": "0.26.3", @@ -4320,6 +4298,14 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, "jsonify": { "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", @@ -4361,7 +4347,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" }, "lazy-cache": { "version": "2.0.2", @@ -4562,6 +4548,26 @@ "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", "tunnel-agent": "0.6.0", "uuid": "3.1.0" + }, + "dependencies": { + "combined-stream": { + "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha512-JgSRe4l4UzPwpJuxfcPWEK1SCrL4dxNjp1uqrQLMop3QZUVo+hDU8w9BJKA4JPbulTWI+UzrI2UA3tK12yQ6bg==", + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "tough-cookie": { + "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha512-42UXjmzk88F7URyg9wDV/dlQ7hXtl/SDV6xIMVdDq82cnDGQDyg8mI8xGBPOwpEfbhvrja6cJ8H1wr0xxykBKA==", + "dev": true, + "optional": true, + "requires": { + "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + } + } } }, "sntp": { @@ -4802,7 +4808,7 @@ "micromatch": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", - "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "integrity": "sha1-FdyTF1rjnlLpMIeEcJbv/HPvz4k=", "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -4831,7 +4837,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "2.0.4" } @@ -4856,7 +4862,7 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=" }, "min-document": { "version": "2.19.0", @@ -4877,7 +4883,7 @@ "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", "requires": { "for-in": "1.0.2", "is-extendable": "1.0.1" @@ -4886,7 +4892,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "2.0.4" } @@ -5131,7 +5137,7 @@ "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -5159,7 +5165,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "2.0.4" } @@ -5272,7 +5278,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -5282,7 +5288,7 @@ "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==" + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, @@ -5405,7 +5411,7 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", "requires": { "execa": "0.7.0", "lcid": "1.0.0", @@ -5424,7 +5430,7 @@ "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", "requires": { "p-try": "1.0.0" } @@ -5680,7 +5686,7 @@ "react-relay": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/react-relay/-/react-relay-1.4.1.tgz", - "integrity": "sha512-B91ufjAk+GVNAhBl+J0GcCquWdef1YxJYczjaUUF8GK9dAWmDs5JxkYnLqqDIAoeKNFINsDy7Jz2FUzBGQygEA==", + "integrity": "sha1-Yfe1gC1wRG4VRJD50PzuyRUOvaU=", "requires": { "babel-runtime": "6.25.0", "fbjs": "0.8.14", @@ -5764,7 +5770,7 @@ "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", "requires": { "extend-shallow": "3.0.2", "safe-regex": "1.1.0" @@ -5782,7 +5788,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "2.0.4" } @@ -5792,7 +5798,7 @@ "relay-compiler": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-1.4.1.tgz", - "integrity": "sha512-8O9dVIOOTp1TlbQhdNp2EBO/WUaSEPaYhQ8HFgMVjpvLTCaCfHEpptNQPJf5uDG/AH1p2qhPtLaCyQ2pBYh7Cw==", + "integrity": "sha1-EOg/D13o2z0ACFGkwOQ1590d65U=", "requires": { "babel-generator": "6.26.0", "babel-polyfill": "6.26.0", @@ -5868,7 +5874,7 @@ "graphql": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==", + "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=", "requires": { "iterall": "1.1.3" } @@ -5896,7 +5902,7 @@ "relay-runtime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-1.4.1.tgz", - "integrity": "sha512-hsEVCPik0Wo+8xvVqaMK96d45fqYAcHz/UCAw2qy1dxY+2kHUhnDUh6CGilFKB1H3f+DLzvqIHUyNYKWS/jZ/g==", + "integrity": "sha1-+I3NCkInAKBFY/KR9XDkzjaONtA=", "requires": { "babel-runtime": "6.25.0", "fbjs": "0.8.14", @@ -6151,7 +6157,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=" }, "rimraf": { "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", @@ -6200,7 +6206,7 @@ "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", "requires": { "extend-shallow": "2.0.1", "is-extendable": "0.1.1", @@ -6349,7 +6355,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -6359,14 +6365,14 @@ "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==" + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "requires": { "define-property": "1.0.0", "isobject": "3.0.1", @@ -6386,7 +6392,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "requires": { "kind-of": "3.2.2" }, @@ -6408,7 +6414,7 @@ "source-map-resolve": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=", "requires": { "atob": "2.0.3", "decode-uri-component": "0.2.0", @@ -6459,7 +6465,7 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "requires": { "extend-shallow": "3.0.2" }, @@ -6476,7 +6482,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "2.0.4" } @@ -6566,7 +6572,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -6576,7 +6582,7 @@ "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==" + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, @@ -6739,7 +6745,7 @@ "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", "requires": { "define-property": "2.0.2", "extend-shallow": "3.0.2", @@ -6759,7 +6765,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "2.0.4" } @@ -6775,15 +6781,6 @@ "repeat-string": "1.6.1" } }, - "tough-cookie": { - "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha512-42UXjmzk88F7URyg9wDV/dlQ7hXtl/SDV6xIMVdDq82cnDGQDyg8mI8xGBPOwpEfbhvrja6cJ8H1wr0xxykBKA==", - "dev": true, - "optional": true, - "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - } - }, "tree-kill": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", @@ -6836,6 +6833,11 @@ } } }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6934,7 +6936,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -6944,7 +6946,7 @@ "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==" + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, @@ -7019,7 +7021,7 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", "requires": { "isexe": "2.0.0" } diff --git a/package.json b/package.json index ed74bc2755..1023b18001 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ } ], "dependencies": { - "relay-compiler": "1.4.1", "atom-babel6-transpiler": "1.1.3", "babel-generator": "^6.25.0", "babel-plugin-chai-assert-async": "^0.1.0", @@ -51,7 +50,7 @@ "dugite": "1.49.0", "etch": "^0.12.4", "event-kit": "^2.3.0", - "fs-extra": "^2.1.2", + "fs-extra": "^5.0.0", "graphql": "^0.10.3", "hoist-non-react-statics": "^1.2.0", "keytar": "^4.0.3", @@ -64,6 +63,7 @@ "react": "^15.6.1", "react-dom": "^15.6.1", "react-relay": "1.4.1", + "relay-compiler": "1.4.1", "relay-runtime": "1.4.1", "temp": "^0.8.3", "tinycolor2": "^1.4.1", From 805995c2415516440333e365a621ff5938756fb8 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 13 Mar 2018 08:01:58 -0400 Subject: [PATCH 0015/5422] Mark helper functions we won't need any more --- lib/helpers.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/helpers.js b/lib/helpers.js index f2cb84b678..45b4eb1f70 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -154,6 +154,7 @@ export function isValidWorkdir(dir) { return dir !== os.homedir() && !isRoot(dir); } +// FIXME deprecate export function readFile(absoluteFilePath, encoding = 'utf8') { return new Promise((resolve, reject) => { fs.readFile(absoluteFilePath, encoding, (err, contents) => { @@ -178,6 +179,7 @@ export function fileExists(absoluteFilePath) { }); } +// FIXME deprecate export function writeFile(absoluteFilePath, contents) { return new Promise((resolve, reject) => { fs.writeFile(absoluteFilePath, contents, err => { @@ -186,6 +188,7 @@ export function writeFile(absoluteFilePath, contents) { }); } +// FIXME deprecate export function deleteFileOrFolder(fileOrFolder) { return new Promise((resolve, reject) => { fs.remove(fileOrFolder, err => { @@ -194,6 +197,7 @@ export function deleteFileOrFolder(fileOrFolder) { }); } +// FIXME deprecate export function copyFile(source, target) { return new Promise((resolve, reject) => { ncp(source, target, err => { @@ -202,6 +206,7 @@ export function copyFile(source, target) { }); } +// FIXME deprecate export function chmodFile(source, mode) { return new Promise((resolve, reject) => { fs.chmod(source, mode, err => (err ? reject(err) : resolve())); @@ -227,12 +232,14 @@ export function getTempDir(options = {}) { }); } +// FIXME deprecate export function realPath(folder) { return new Promise((resolve, reject) => { fs.realpath(folder, (err, rpath) => (err ? reject(err) : resolve(rpath))); }); } +// FIXME deprecate export function fsStat(absoluteFilePath) { return new Promise((resolve, reject) => { fs.stat(absoluteFilePath, (err, stats) => { @@ -241,6 +248,7 @@ export function fsStat(absoluteFilePath) { }); } +// FIXME deprecate export function fsLStat(absoluteFilePath) { return new Promise((resolve, reject) => { fs.lstat(absoluteFilePath, (err, stats) => { @@ -259,6 +267,7 @@ export async function isFileSymlink(absoluteFilePath) { return stat.isSymbolicLink(); } +// FIXME deprecate export function getRealPath(absoluteFilePath) { return new Promise((resolve, reject) => { fs.realpath(absoluteFilePath, (err, resolvedPath) => { @@ -267,6 +276,7 @@ export function getRealPath(absoluteFilePath) { }); } +// FIXME deprecate export function mkdirs(directory) { return new Promise((resolve, reject) => { fs.mkdirs(directory, err => (err ? reject(err) : resolve())); From c551b05e6e63aae2f1177b4cef54876e13e6f2e5 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 13 Mar 2018 08:02:12 -0400 Subject: [PATCH 0016/5422] Rewrite helpers to use fs-extra promises --- lib/helpers.js | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/lib/helpers.js b/lib/helpers.js index 45b4eb1f70..de3f90acbf 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -163,20 +163,17 @@ export function readFile(absoluteFilePath, encoding = 'utf8') { }); } -export function fileExists(absoluteFilePath) { - return new Promise((resolve, reject) => { - fs.access(absoluteFilePath, err => { - if (err) { - if (err.code === 'ENOENT') { - resolve(false); - } else { - reject(err); - } - } else { - resolve(true); - } - }); - }); +export async function fileExists(absoluteFilePath) { + try { + await fs.access(absoluteFilePath); + return true; + } catch (e) { + if (e.code === 'ENOENT') { + return false; + } + + throw e; + } } // FIXME deprecate @@ -258,12 +255,12 @@ export function fsLStat(absoluteFilePath) { } export async function isFileExecutable(absoluteFilePath) { - const stat = await fsStat(absoluteFilePath); + const stat = await fs.stat(absoluteFilePath); return stat.mode & fs.constants.S_IXUSR; // eslint-disable-line no-bitwise } export async function isFileSymlink(absoluteFilePath) { - const stat = await fsLStat(absoluteFilePath); + const stat = await fs.lstat(absoluteFilePath); return stat.isSymbolicLink(); } From be7f9c9cc07c7b9af9d152f6dc947c7e4ae56607 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 13 Mar 2018 08:55:45 -0400 Subject: [PATCH 0017/5422] Use fs-extra instead of our helpers --- lib/controllers/commit-controller.js | 8 +- lib/controllers/root-controller.js | 11 ++- lib/get-repo-pipeline-manager.js | 5 +- lib/git-shell-out-strategy.js | 22 ++--- lib/git-temp-dir.js | 9 +- lib/github-package.js | 7 +- lib/helpers.js | 85 ------------------- lib/models/discard-history.js | 9 +- lib/models/repository-states/cloning.js | 4 +- lib/models/repository-states/present.js | 4 +- lib/models/repository.js | 6 +- lib/models/workdir-cache.js | 5 +- lib/views/git-timings-view.js | 4 +- lib/yardstick.js | 3 +- test/controllers/commit-controller.test.js | 5 +- test/git-prompt-server.test.js | 25 +++--- test/git-strategies.test.js | 16 ++-- test/github-package.test.js | 16 ++-- test/helpers.js | 11 ++- test/models/repository.test.js | 63 +++++++------- test/models/workdir-cache.test.js | 5 +- test/models/workspace-change-observer.test.js | 4 +- 22 files changed, 124 insertions(+), 203 deletions(-) diff --git a/lib/controllers/commit-controller.js b/lib/controllers/commit-controller.js index 63fa6109ee..120822d2ff 100644 --- a/lib/controllers/commit-controller.js +++ b/lib/controllers/commit-controller.js @@ -5,9 +5,9 @@ import ReactDom from 'react-dom'; import PropTypes from 'prop-types'; import {autobind} from 'core-decorators'; import {CompositeDisposable} from 'event-kit'; +import fs from 'fs-extra'; import CommitView from '../views/commit-view'; -import {writeFile, readFile} from '../helpers'; export const COMMIT_GRAMMAR_SCOPE = 'text.git-commit'; @@ -60,9 +60,9 @@ export default class CommitController extends React.Component { // we closed the last editor pointing to the commit message file try { if (this.props.isAmending && this.props.lastCommit.isPresent()) { - this.setAmendingCommitMessage(await readFile(this.getCommitMessagePath())); + this.setAmendingCommitMessage(await fs.readFile(this.getCommitMessagePath(), {encoding: 'utf8'})); } else { - this.setRegularCommitMessage(await readFile(this.getCommitMessagePath())); + this.setRegularCommitMessage(await fs.readFile(this.getCommitMessagePath(), {encoding: 'utf8'})); } } catch (e) { if (e.code !== 'ENOENT') { @@ -245,7 +245,7 @@ export default class CommitController extends React.Component { } async openCommitMessageEditor(messageFromBox) { - await writeFile(this.getCommitMessagePath(), messageFromBox, 'utf8'); + await fs.writeFile(this.getCommitMessagePath(), messageFromBox, 'utf8'); const commitEditor = await this.props.workspace.open(this.getCommitMessagePath()); const grammar = this.props.grammars.grammarForScopeName(COMMIT_GRAMMAR_SCOPE); diff --git a/lib/controllers/root-controller.js b/lib/controllers/root-controller.js index 49a5b924d5..a9128980ec 100644 --- a/lib/controllers/root-controller.js +++ b/lib/controllers/root-controller.js @@ -1,4 +1,4 @@ -import fs from 'fs'; +import fs from 'fs-extra'; import path from 'path'; import url from 'url'; @@ -24,8 +24,7 @@ import RepositoryConflictController from './repository-conflict-controller'; import GithubLoginModel from '../models/github-login-model'; import Conflict from '../models/conflicts/conflict'; import Switchboard from '../switchboard'; -import {copyFile, deleteFileOrFolder, realPath, toNativePathSep, - destroyFilePatchPaneItems, destroyEmptyFilePatchPaneItems} from '../helpers'; +import {toNativePathSep, destroyFilePatchPaneItems, destroyEmptyFilePatchPaneItems} from '../helpers'; import {GitError} from '../git-shell-out-strategy'; const DOMPurify = createDOMPurify(); @@ -477,7 +476,7 @@ export default class RootController extends React.Component { async viewChangesForCurrentFile(stagingStatus) { const editor = this.props.workspace.getActiveTextEditor(); - const absFilePath = await realPath(editor.getPath()); + const absFilePath = await fs.realpath(editor.getPath()); const repoPath = this.props.repository.getWorkingDirectoryPath(); if (repoPath === null) { const [projectPath] = this.props.project.relativizePath(editor.getPath()); @@ -671,9 +670,9 @@ export default class RootController extends React.Component { const {filePath, resultPath, deleted, conflict, theirsSha, commonBaseSha, currentSha} = result; const absFilePath = path.join(this.props.repository.getWorkingDirectoryPath(), filePath); if (deleted && resultPath === null) { - await deleteFileOrFolder(absFilePath); + await fs.remove(absFilePath); } else { - await copyFile(resultPath, absFilePath); + await fs.copy(resultPath, absFilePath); } if (conflict) { await this.props.repository.writeMergeConflictToIndex(filePath, commonBaseSha, currentSha, theirsSha); diff --git a/lib/get-repo-pipeline-manager.js b/lib/get-repo-pipeline-manager.js index 9c4b566f82..8158295ada 100644 --- a/lib/get-repo-pipeline-manager.js +++ b/lib/get-repo-pipeline-manager.js @@ -1,8 +1,9 @@ +import fs from 'fs-extra'; import createDOMPurify from 'dompurify'; import ActionPipelineManager from './action-pipeline'; import {GitError} from './git-shell-out-strategy'; -import {deleteFileOrFolder, getCommitMessagePath, getCommitMessageEditors, destroyFilePatchPaneItems} from './helpers'; +import {getCommitMessagePath, getCommitMessageEditors, destroyFilePatchPaneItems} from './helpers'; const DOMPurify = createDOMPurify(); @@ -191,7 +192,7 @@ export default function({confirm, notificationManager, workspace}) { commitPipeline.addMiddleware('clean-up-disk-commit-msg', async (next, repository) => { await next(); try { - await deleteFileOrFolder(getCommitMessagePath(repository)); + await fs.remove(getCommitMessagePath(repository)); } catch (error) { // do nothing } diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 02e49d1af3..f00153814c 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -1,6 +1,7 @@ import path from 'path'; import os from 'os'; import childProcess from 'child_process'; +import fs from 'fs-extra'; import {remote} from 'electron'; import {CompositeDisposable} from 'event-kit'; @@ -13,7 +14,7 @@ import GitTempDir from './git-temp-dir'; import AsyncQueue from './async-queue'; import { getDugitePath, getSharedModulePath, getAtomHelperPath, - readFile, fileExists, fsStat, writeFile, isFileExecutable, isFileSymlink, isBinary, getRealPath, + fileExists, isFileExecutable, isFileSymlink, isBinary, normalizeGitHelperPath, toNativePathSep, toGitPathSep, } from './helpers'; import GitTimingsView from './views/git-timings-view'; @@ -341,7 +342,7 @@ export default class GitShellOutStrategy { async resolveDotGitDir() { try { - await fsStat(this.workingDir); // fails if folder doesn't exist + await fs.stat(this.workingDir); // fails if folder doesn't exist const output = await this.exec(['rev-parse', '--resolve-git-dir', path.join(this.workingDir, '.git')]); const dotGitDir = output.trim(); if (path.isAbsolute(dotGitDir)) { @@ -507,7 +508,7 @@ export default class GitShellOutStrategy { const absPath = path.join(this.workingDir, filePath); const executable = await isFileExecutable(absPath); const symlink = await isFileSymlink(absPath); - const contents = await readFile(absPath); + const contents = await fs.readFile(absPath, {encoding: 'utf8'}); const binary = isBinary(contents); let mode; let realpath; @@ -515,7 +516,7 @@ export default class GitShellOutStrategy { mode = '100755'; } else if (symlink) { mode = '120000'; - realpath = await getRealPath(absPath); + realpath = await fs.realpath(absPath); } else { mode = '100644'; } @@ -608,13 +609,8 @@ export default class GitShellOutStrategy { return this.gpgExec(['merge', branchName], {writeOperation: true}); } - async isMerging(dotGitDir) { - try { - await readFile(path.join(dotGitDir, 'MERGE_HEAD')); - return true; - } catch (e) { - return false; - } + isMerging(dotGitDir) { + return fileExists(path.join(dotGitDir, 'MERGE_HEAD')).catch(() => false); } abortMerge() { @@ -763,7 +759,7 @@ export default class GitShellOutStrategy { async expandBlobToFile(absFilePath, sha) { const output = await this.exec(['cat-file', '-p', sha]); - await writeFile(absFilePath, output); + await fs.writeFile(absFilePath, output, {encoding: 'utf8'}); return absFilePath; } @@ -792,7 +788,7 @@ export default class GitShellOutStrategy { // Interpret a relative resultPath as relative to the repository working directory for consistency with the // other arguments. const resolvedResultPath = path.resolve(this.workingDir, resultPath); - await writeFile(resolvedResultPath, output); + await fs.writeFile(resolvedResultPath, output, {encoding: 'utf8'}); return {filePath: oursPath, resultPath, conflict}; } diff --git a/lib/git-temp-dir.js b/lib/git-temp-dir.js index 881a6cf0c1..48d2e5ad35 100644 --- a/lib/git-temp-dir.js +++ b/lib/git-temp-dir.js @@ -1,6 +1,7 @@ import os from 'os'; import path from 'path'; -import {getPackageRoot, deleteFileOrFolder, getTempDir, copyFile, chmodFile} from './helpers'; +import fs from 'fs-extra'; +import {getPackageRoot, getTempDir} from './helpers'; export const BIN_SCRIPTS = { getCredentialHelperJs: 'git-credential-atom.js', @@ -29,13 +30,13 @@ export default class GitTempDir { await Promise.all( Object.values(BIN_SCRIPTS).map(async filename => { - await copyFile( + await fs.copy( path.resolve(getPackageRoot(), 'bin', filename), path.join(this.root, filename), ); if (path.extname(filename) === '.sh') { - await chmodFile(path.join(this.root, filename), 0o700); + await fs.chmod(path.join(this.root, filename), 0o700); } }), ); @@ -71,7 +72,7 @@ export default class GitTempDir { } dispose() { - return deleteFileOrFolder(this.root); + return fs.remove(this.root); } } diff --git a/lib/github-package.js b/lib/github-package.js index f60bf51618..7e413e31d3 100644 --- a/lib/github-package.js +++ b/lib/github-package.js @@ -1,12 +1,13 @@ import {CompositeDisposable, Disposable} from 'event-kit'; import path from 'path'; +import fs from 'fs-extra'; import React from 'react'; import ReactDom from 'react-dom'; import {autobind} from 'core-decorators'; -import {mkdirs, fileExists, writeFile} from './helpers'; +import {fileExists} from './helpers'; import WorkdirCache from './models/workdir-cache'; import WorkdirContext from './models/workdir-context'; import WorkdirContextPool from './models/workdir-context-pool'; @@ -145,7 +146,7 @@ export default class GithubPackage { const firstRun = !await fileExists(this.configPath); this.startOpen = firstRun && !this.config.get('welcome.showOnStartup'); if (firstRun) { - await writeFile(this.configPath, '# Store non-visible GitHub package state.\n'); + await fs.writeFile(this.configPath, '# Store non-visible GitHub package state.\n', {encoding: 'utf8'}); } const hasSelectedFiles = event => { @@ -415,7 +416,7 @@ export default class GithubPackage { @autobind async createRepositoryForProjectPath(projectPath) { - await mkdirs(projectPath); + await fs.mkdirs(projectPath); const repository = this.contextPool.add(projectPath).getRepository(); await repository.init(); diff --git a/lib/helpers.js b/lib/helpers.js index de3f90acbf..65ba5a3f7f 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -2,7 +2,6 @@ import path from 'path'; import fs from 'fs-extra'; import os from 'os'; import temp from 'temp'; -import {ncp} from 'ncp'; import FilePatchController from './controllers/file-patch-controller'; @@ -154,15 +153,6 @@ export function isValidWorkdir(dir) { return dir !== os.homedir() && !isRoot(dir); } -// FIXME deprecate -export function readFile(absoluteFilePath, encoding = 'utf8') { - return new Promise((resolve, reject) => { - fs.readFile(absoluteFilePath, encoding, (err, contents) => { - if (err) { reject(err); } else { resolve(contents); } - }); - }); -} - export async function fileExists(absoluteFilePath) { try { await fs.access(absoluteFilePath); @@ -176,40 +166,6 @@ export async function fileExists(absoluteFilePath) { } } -// FIXME deprecate -export function writeFile(absoluteFilePath, contents) { - return new Promise((resolve, reject) => { - fs.writeFile(absoluteFilePath, contents, err => { - if (err) { return reject(err); } else { return resolve(); } - }); - }); -} - -// FIXME deprecate -export function deleteFileOrFolder(fileOrFolder) { - return new Promise((resolve, reject) => { - fs.remove(fileOrFolder, err => { - if (err) { return reject(err); } else { return resolve(); } - }); - }); -} - -// FIXME deprecate -export function copyFile(source, target) { - return new Promise((resolve, reject) => { - ncp(source, target, err => { - if (err) { return reject(err); } else { return resolve(target); } - }); - }); -} - -// FIXME deprecate -export function chmodFile(source, mode) { - return new Promise((resolve, reject) => { - fs.chmod(source, mode, err => (err ? reject(err) : resolve())); - }); -} - export function getTempDir(options = {}) { temp.track(); @@ -229,31 +185,6 @@ export function getTempDir(options = {}) { }); } -// FIXME deprecate -export function realPath(folder) { - return new Promise((resolve, reject) => { - fs.realpath(folder, (err, rpath) => (err ? reject(err) : resolve(rpath))); - }); -} - -// FIXME deprecate -export function fsStat(absoluteFilePath) { - return new Promise((resolve, reject) => { - fs.stat(absoluteFilePath, (err, stats) => { - if (err) { reject(err); } else { resolve(stats); } - }); - }); -} - -// FIXME deprecate -export function fsLStat(absoluteFilePath) { - return new Promise((resolve, reject) => { - fs.lstat(absoluteFilePath, (err, stats) => { - if (err) { reject(err); } else { resolve(stats); } - }); - }); -} - export async function isFileExecutable(absoluteFilePath) { const stat = await fs.stat(absoluteFilePath); return stat.mode & fs.constants.S_IXUSR; // eslint-disable-line no-bitwise @@ -264,22 +195,6 @@ export async function isFileSymlink(absoluteFilePath) { return stat.isSymbolicLink(); } -// FIXME deprecate -export function getRealPath(absoluteFilePath) { - return new Promise((resolve, reject) => { - fs.realpath(absoluteFilePath, (err, resolvedPath) => { - if (err) { reject(err); } else { resolve(resolvedPath); } - }); - }); -} - -// FIXME deprecate -export function mkdirs(directory) { - return new Promise((resolve, reject) => { - fs.mkdirs(directory, err => (err ? reject(err) : resolve())); - }); -} - export function shortenSha(sha) { return sha.slice(0, 8); } diff --git a/lib/models/discard-history.js b/lib/models/discard-history.js index e60801590a..3521ae3b81 100644 --- a/lib/models/discard-history.js +++ b/lib/models/discard-history.js @@ -1,14 +1,15 @@ import path from 'path'; import os from 'os'; +import fs from 'fs-extra'; import mkdirp from 'mkdirp'; import {PartialFileDiscardHistory, WholeFileDiscardHistory} from './discard-history-stores'; -import {getTempDir, copyFile, fileExists, writeFile} from '../helpers'; +import {getTempDir, fileExists} from '../helpers'; const emptyFilePath = path.join(os.tmpdir(), 'empty-file.txt'); -const emptyFilePromise = writeFile(emptyFilePath, ''); +const emptyFilePromise = fs.writeFile(emptyFilePath, ''); export default class DiscardHistory { constructor(createBlob, expandBlobToFile, mergeFile, workdirPath, {maxHistoryLength} = {}) { @@ -144,13 +145,13 @@ export default class DiscardHistory { if (oursSha === commonBaseSha) { // no changes since discard, mark file to be deleted mergeResult = {filePath, resultPath: null, deleted: true, conflict: false}; } else { // changes since discard result in conflict - await copyFile(path.join(this.workdirPath, filePath), resultPath); + await fs.copy(path.join(this.workdirPath, filePath), resultPath); mergeResult = {filePath, resultPath, conflict: true}; } } else if (theirsPath && !commonBasePath) { // added file const fileDoesExist = await fileExists(path.join(this.workdirPath, filePath)); if (!fileDoesExist) { - await copyFile(theirsPath, resultPath); + await fs.copy(theirsPath, resultPath); mergeResult = {filePath, resultPath, conflict: false}; } else { await emptyFilePromise; diff --git a/lib/models/repository-states/cloning.js b/lib/models/repository-states/cloning.js index 368af07f45..44afb487dd 100644 --- a/lib/models/repository-states/cloning.js +++ b/lib/models/repository-states/cloning.js @@ -1,4 +1,4 @@ -import {mkdirs} from '../../helpers'; +import fs from 'fs-extra'; import State from './state'; @@ -12,7 +12,7 @@ export default class Cloning extends State { } async start() { - await mkdirs(this.workdir()); + await fs.mkdirs(this.workdir()); await this.doClone(this.remoteUrl, {recursive: true}); await this.transitionTo('Loading'); diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index 2d3782b68c..fe2ba5426b 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -1,9 +1,9 @@ import path from 'path'; +import fs from 'fs'; import State from './state'; import {LargeRepoError} from '../../git-shell-out-strategy'; -import {deleteFileOrFolder} from '../../helpers'; import {FOCUS} from '../workspace-change-observer'; import FilePatch from '../file-patch'; import Hunk from '../hunk'; @@ -455,7 +455,7 @@ export default class Present extends State { await this.git().checkoutFiles(filesToCheckout); await Promise.all(filesToRemove.map(filePath => { const absPath = path.join(this.workdir(), filePath); - return deleteFileOrFolder(absPath); + return fs.remove(absPath); })); } diff --git a/lib/models/repository.js b/lib/models/repository.js index d0f578d448..6aa356c799 100644 --- a/lib/models/repository.js +++ b/lib/models/repository.js @@ -1,10 +1,10 @@ import path from 'path'; import {Emitter} from 'event-kit'; +import fs from 'fs-extra'; import {getNullActionPipelineManager} from '../action-pipeline'; import CompositeGitStrategy from '../composite-git-strategy'; -import {readFile} from '../helpers'; import Remote, {nullRemote} from './remote'; import {Loading, Absent, LoadingGuess, AbsentGuess} from './repository-states'; @@ -119,7 +119,7 @@ export default class Repository { async pathHasMergeMarkers(relativePath) { try { - const contents = await readFile(path.join(this.getWorkingDirectoryPath(), relativePath), 'utf8'); + const contents = await fs.readFile(path.join(this.getWorkingDirectoryPath(), relativePath), {encoding: 'utf8'}); return MERGE_MARKER_REGEX.test(contents); } catch (e) { // EISDIR implies this is a submodule @@ -129,7 +129,7 @@ export default class Repository { async getMergeMessage() { try { - const contents = await readFile(path.join(this.getGitDirectoryPath(), 'MERGE_MSG'), 'utf8'); + const contents = await fs.readFile(path.join(this.getGitDirectoryPath(), 'MERGE_MSG'), {encoding: 'utf8'}); return contents; } catch (e) { return null; diff --git a/lib/models/workdir-cache.js b/lib/models/workdir-cache.js index 7686d02104..60606b1368 100644 --- a/lib/models/workdir-cache.js +++ b/lib/models/workdir-cache.js @@ -1,7 +1,8 @@ import path from 'path'; +import fs from 'fs-extra'; import CompositeGitStrategy from '../composite-git-strategy'; -import {fsStat, toNativePathSep} from '../helpers'; +import {toNativePathSep} from '../helpers'; /** * Locate the nearest git working directory above a given starting point, caching results. @@ -34,7 +35,7 @@ export default class WorkdirCache { async revParse(startPath) { try { - const startDir = (await fsStat(startPath)).isDirectory() ? startPath : path.dirname(startPath); + const startDir = (await fs.stat(startPath)).isDirectory() ? startPath : path.dirname(startPath); // Within a git worktree, return a non-empty string containing the path to the worktree root. // Within a gitdir or outside of a worktree, return an empty string. diff --git a/lib/views/git-timings-view.js b/lib/views/git-timings-view.js index 3def6953e0..77f3dd20d2 100644 --- a/lib/views/git-timings-view.js +++ b/lib/views/git-timings-view.js @@ -8,8 +8,8 @@ import ReactDom from 'react-dom'; import PropTypes from 'prop-types'; import {autobind} from 'core-decorators'; import memoize from 'lodash.memoize'; +import fs from 'fs-extra'; -import {readFile} from '../helpers'; import Octicon from './octicon'; const genArray = memoize(function genArray(interval, count) { @@ -447,7 +447,7 @@ export default class GitTimingsView extends React.Component { if (!filenames) { return; } const filename = filenames[0]; try { - const contents = await readFile(filename); + const contents = await fs.readFile(filename, {encoding: 'utf8'}); const data = JSON.parse(contents); const restoredMarkers = data.map(item => Marker.deserialize(item)); GitTimingsView.restoreGroup(restoredMarkers); diff --git a/lib/yardstick.js b/lib/yardstick.js index dd84fee039..1dc163502c 100644 --- a/lib/yardstick.js +++ b/lib/yardstick.js @@ -2,7 +2,6 @@ import fs from 'fs-extra'; import path from 'path'; -import {writeFile} from './helpers'; // The maximum number of marks within a single DurationSet. A DurationSet will be automatically finished if this many // marks are recorded. @@ -108,7 +107,7 @@ const yardstick = { }); const payload = JSON.stringify(durationSets.map(set => set.serialize())); - await writeFile(fileName, payload); + await fs.writeFile(fileName, payload, {encoding: 'utf8'}); if (atom.config.get('github.performanceToConsole')) { // eslint-disable-next-line no-console diff --git a/test/controllers/commit-controller.test.js b/test/controllers/commit-controller.test.js index 79b5fe20de..ec0c2f3489 100644 --- a/test/controllers/commit-controller.test.js +++ b/test/controllers/commit-controller.test.js @@ -1,11 +1,10 @@ import path from 'path'; -import fs from 'fs'; +import fs from 'fs-extra'; import React from 'react'; import {shallow} from 'enzyme'; import Commit from '../../lib/models/commit'; import {nullBranch} from '../../lib/models/branch'; -import {writeFile} from '../../lib/helpers'; import CommitController, {COMMIT_GRAMMAR_SCOPE} from '../../lib/controllers/commit-controller'; import {cloneRepository, buildRepository, buildRepositoryWithPipeline} from '../helpers'; @@ -140,7 +139,7 @@ describe('CommitController', function() { repository.setRegularCommitMessage('regular'); repository.setAmendingCommitMessage('amending'); - await writeFile(path.join(workdirPath, 'a.txt'), 'some changes'); + await fs.writeFile(path.join(workdirPath, 'a.txt'), 'some changes', {encoding: 'utf8'}); await repository.git.exec(['add', '.']); const wrapper = shallow(app); diff --git a/test/git-prompt-server.test.js b/test/git-prompt-server.test.js index 4dec623a8a..9ea09462a0 100644 --- a/test/git-prompt-server.test.js +++ b/test/git-prompt-server.test.js @@ -1,9 +1,10 @@ import {execFile} from 'child_process'; import path from 'path'; +import fs from 'fs-extra'; import GitPromptServer from '../lib/git-prompt-server'; import GitTempDir from '../lib/git-temp-dir'; -import {fileExists, writeFile, readFile, getAtomHelperPath} from '../lib/helpers'; +import {fileExists, getAtomHelperPath} from '../lib/helpers'; describe('GitPromptServer', function() { const electronEnv = { @@ -206,7 +207,7 @@ describe('GitPromptServer', function() { child.stdin.end('\n'); } - await writeFile(tempDir.getScriptPath('fake-keytar'), ` + await fs.writeFile(tempDir.getScriptPath('fake-keytar'), ` { "atom-github-git @ https://what-is-your-favorite-color.com": { "old-man-from-scene-24": "swordfish", @@ -216,7 +217,7 @@ describe('GitPromptServer', function() { "old-man-from-scene-24": "nope" } } - `); + `, {encoding: 'utf8'}); const {err, stdout} = await runCredentialScript('get', queryHandler, processHandler); assert.ifError(err); assert.isFalse(called); @@ -243,7 +244,7 @@ describe('GitPromptServer', function() { child.stdin.end('\n'); } - await writeFile(tempDir.getScriptPath('fake-keytar'), ` + await fs.writeFile(tempDir.getScriptPath('fake-keytar'), ` { "atom-github-git-meta @ https://what-is-your-favorite-color.com": { "username": "old-man-from-scene-24" @@ -259,7 +260,7 @@ describe('GitPromptServer', function() { "old-man-from-scene-24": "nope" } } - `); + `, {encoding: 'utf8'}); const {err, stdout} = await runCredentialScript('get', queryHandler, processHandler); assert.ifError(err); assert.isFalse(called); @@ -287,13 +288,13 @@ describe('GitPromptServer', function() { child.stdin.end('\n'); } - await writeFile(tempDir.getScriptPath('fake-keytar'), ` + await fs.writeFile(tempDir.getScriptPath('fake-keytar'), ` { "atom-github": { "https://what-is-your-favorite-color.com": "swordfish" } } - `); + `, {encoding: 'utf8'}); const {err, stdout} = await runCredentialScript('get', queryHandler, processHandler); assert.ifError(err); assert.isFalse(called); @@ -322,12 +323,12 @@ describe('GitPromptServer', function() { child.stdin.end('\n'); } - await writeFile(tempDir.getScriptPath('remember'), ''); + await fs.writeFile(tempDir.getScriptPath('remember'), '', {encoding: 'utf8'}); const {err} = await runCredentialScript('store', queryHandler, processHandler); assert.ifError(err); assert.isFalse(called); - const stored = await readFile(tempDir.getScriptPath('fake-keytar')); + const stored = await fs.readFile(tempDir.getScriptPath('fake-keytar'), {encoding: 'utf8'}); assert.deepEqual(JSON.parse(stored), { 'atom-github-git-meta @ https://what-is-your-favorite-color.com': { username: 'old-man-from-scene-24', @@ -354,7 +355,7 @@ describe('GitPromptServer', function() { child.stdin.end('\n'); } - await writeFile(tempDir.getScriptPath('fake-keytar'), JSON.stringify({ + await fs.writeFile(tempDir.getScriptPath('fake-keytar'), JSON.stringify({ 'atom-github-git @ https://what-is-your-favorite-color.com': { 'old-man-from-scene-24': 'shhhh', 'someone-else': 'untouched', @@ -362,12 +363,12 @@ describe('GitPromptServer', function() { 'atom-github-git @ https://github.com': { 'old-man-from-scene-24': 'untouched', }, - })); + }), {encoding: 'utf8'}); const {err} = await runCredentialScript('erase', queryHandler, processHandler); assert.ifError(err); - const stored = await readFile(tempDir.getScriptPath('fake-keytar')); + const stored = await fs.readFile(tempDir.getScriptPath('fake-keytar'), {encoding: 'utf8'}); assert.deepEqual(JSON.parse(stored), { 'atom-github-git @ https://what-is-your-favorite-color.com': { 'someone-else': 'untouched', diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index aa44a99e86..7cccac6744 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -12,7 +12,7 @@ import GitShellOutStrategy from '../lib/git-shell-out-strategy'; import WorkerManager from '../lib/worker-manager'; import {cloneRepository, initRepository, assertDeepPropertyVals} from './helpers'; -import {fsStat, normalizeGitHelperPath, writeFile, getTempDir} from '../lib/helpers'; +import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; /** * KU Thoughts: The GitShellOutStrategy methods are tested in Repository tests for the most part @@ -48,7 +48,7 @@ import {fsStat, normalizeGitHelperPath, writeFile, getTempDir} from '../lib/help `; const hookPath = path.join(workingDirPath, '.git', 'hooks', 'pre-commit'); - await writeFile(hookPath, hookContent); + await fs.writeFile(hookPath, hookContent, {encoding: 'utf8'}); fs.chmodSync(hookPath, 0o755); delete process.env.ALLOWCOMMIT; @@ -72,7 +72,11 @@ import {fsStat, normalizeGitHelperPath, writeFile, getTempDir} from '../lib/help it('supports gitdir files', async function() { const workingDirPath = await cloneRepository('three-files'); const workingDirPathWithDotGitFile = await getTempDir(); - await writeFile(path.join(workingDirPathWithDotGitFile, '.git'), `gitdir: ${path.join(workingDirPath, '.git')}`); + await fs.writeFile( + path.join(workingDirPathWithDotGitFile, '.git'), + `gitdir: ${path.join(workingDirPath, '.git')}`, + {encoding: 'utf8'}, + ); const git = createTestStrategy(workingDirPathWithDotGitFile); const dotGitFolder = await git.resolveDotGitDir(workingDirPathWithDotGitFile); @@ -88,8 +92,8 @@ import {fsStat, normalizeGitHelperPath, writeFile, getTempDir} from '../lib/help const [relPathA, relPathB] = ['a.txt', 'b.txt'].map(fileName => path.join('subdir-1', fileName)); const [absPathA, absPathB] = [relPathA, relPathB].map(relPath => path.join(workingDir, relPath)); - await writeFile(absPathA, 'some changes here\n'); - await writeFile(absPathB, 'more changes here\n'); + await fs.writeFile(absPathA, 'some changes here\n', {encoding: 'utf8'}); + await fs.writeFile(absPathB, 'more changes here\n', {encoding: 'utf8'}); await git.stageFiles([relPathB]); const {changedEntries} = await git.getStatusBundle(); @@ -911,7 +915,7 @@ import {fsStat, normalizeGitHelperPath, writeFile, getTempDir} from '../lib/help const git = createTestStrategy(workingDirPath); const absFilePath = path.join(workingDirPath, 'new-file.txt'); fs.writeFileSync(absFilePath, 'qux\nfoo\nbar\n', 'utf8'); - const regularMode = await fsStat(absFilePath).mode; + const regularMode = (await fs.stat(absFilePath)).mode; const executableMode = regularMode | fs.constants.S_IXUSR; // eslint-disable-line no-bitwise assert.equal(await git.getFileMode('new-file.txt'), '100644'); diff --git a/test/github-package.test.js b/test/github-package.test.js index d8ffd4a5e8..44b1f57e64 100644 --- a/test/github-package.test.js +++ b/test/github-package.test.js @@ -1,10 +1,10 @@ -import fs from 'fs'; +import fs from 'fs-extra'; import path from 'path'; import temp from 'temp'; import until from 'test-until'; import {cloneRepository, disableFilesystemWatchers} from './helpers'; -import {writeFile, deleteFileOrFolder, fileExists, getTempDir, realPath} from '../lib/helpers'; +import {fileExists, getTempDir} from '../lib/helpers'; import GithubPackage from '../lib/github-package'; describe('GithubPackage', function() { @@ -243,7 +243,7 @@ describe('GithubPackage', function() { // Repository with a merge conflict, repository without a merge conflict, path without a repository const workdirMergeConflict = await cloneRepository('merge-conflict'); const workdirNoConflict = await cloneRepository('three-files'); - const nonRepositoryPath = await realPath(temp.mkdirSync()); + const nonRepositoryPath = await fs.realpath(temp.mkdirSync()); fs.writeFileSync(path.join(nonRepositoryPath, 'c.txt')); project.setPaths([workdirMergeConflict, workdirNoConflict, nonRepositoryPath]); @@ -287,7 +287,7 @@ describe('GithubPackage', function() { beforeEach(async function() { confFile = path.join(configDirPath, 'github.cson'); - await deleteFileOrFolder(confFile); + await fs.remove(confFile); }); it('renders with startOpen on the first run', async function() { @@ -299,7 +299,7 @@ describe('GithubPackage', function() { }); it('renders without startOpen on non-first runs', async function() { - await writeFile(confFile, ''); + await fs.writeFile(confFile, '', {encoding: 'utf8'}); await githubPackage.activate(); assert.isFalse(githubPackage.startOpen); @@ -461,10 +461,10 @@ describe('GithubPackage', function() { }); it('uses an absent context when the active item is not in a git repository', async function() { - const nonRepositoryPath = await realPath(temp.mkdirSync()); + const nonRepositoryPath = await fs.realpath(temp.mkdirSync()); const workdir = await cloneRepository('three-files'); project.setPaths([nonRepositoryPath, workdir]); - await writeFile(path.join(nonRepositoryPath, 'a.txt'), 'stuff'); + await fs.writeFile(path.join(nonRepositoryPath, 'a.txt'), 'stuff', {encoding: 'utf8'}); await workspace.open(path.join(nonRepositoryPath, 'a.txt')); @@ -576,7 +576,7 @@ describe('GithubPackage', function() { if (process.platform !== 'win32') { it('handles symlinked project paths', async function() { const workdirPath = await cloneRepository('three-files'); - const symlinkPath = await realPath(temp.mkdirSync()) + '-symlink'; + const symlinkPath = (await fs.realpath(temp.mkdirSync())) + '-symlink'; fs.symlinkSync(workdirPath, symlinkPath); project.setPaths([symlinkPath]); await workspace.open(path.join(symlinkPath, 'a.txt')); diff --git a/test/helpers.js b/test/helpers.js index da8845c4f2..5e39d5b0cd 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -14,7 +14,6 @@ import WorkerManager from '../lib/worker-manager'; import ContextMenuInterceptor from '../lib/context-menu-interceptor'; import getRepoPipelineManager from '../lib/get-repo-pipeline-manager'; import {Directory} from 'atom'; -import {realPath, readFile, writeFile, mkdirs} from '../lib/helpers'; assert.autocrlfEqual = (actual, expected, ...args) => { const newActual = actual.replace(/\r\n/g, '\n'); @@ -29,7 +28,7 @@ const cachedClonedRepos = {}; function copyCachedRepo(repoName) { const workingDirPath = temp.mkdirSync('git-fixture-'); fs.copySync(cachedClonedRepos[repoName], workingDirPath); - return realPath(workingDirPath); + return fs.realpath(workingDirPath); } export async function cloneRepository(repoName = 'three-files') { @@ -64,7 +63,7 @@ export async function initRepository() { await git.exec(['config', '--local', 'user.name', 'Someone']); await git.exec(['config', '--local', 'core.autocrlf', 'false']); await git.exec(['config', '--local', 'commit.gpgsign', 'false']); - return realPath(workingDirPath); + return fs.realpath(workingDirPath); } export async function setUpLocalAndRemoteRepositories(repoName = 'multiple-commits', options = {}) { @@ -221,11 +220,11 @@ export function transpile(...relPaths) { const untranspiledPath = require.resolve(relPath); const transpiledPath = path.join(transpiledRoot, path.relative(packageRoot, untranspiledPath)); - const untranspiledSource = await readFile(untranspiledPath); + const untranspiledSource = await fs.readFile(untranspiledPath, {encoding: 'utf8'}); const transpiledSource = transpiler.transpile(untranspiledSource, untranspiledPath, {}, {}).code; - await mkdirs(path.dirname(transpiledPath)); - await writeFile(transpiledPath, transpiledSource); + await fs.mkdirs(path.dirname(transpiledPath)); + await fs.writeFile(transpiledPath, transpiledSource, {encoding: 'utf8'}); return transpiledPath; }), ); diff --git a/test/models/repository.test.js b/test/models/repository.test.js index 61be37332b..5d1e8fc7f5 100644 --- a/test/models/repository.test.js +++ b/test/models/repository.test.js @@ -15,7 +15,7 @@ import { cloneRepository, setUpLocalAndRemoteRepositories, getHeadCommitOnRemote, assertDeepPropertyVals, assertEqualSortedArraysByKey, } from '../helpers'; -import {getPackageRoot, writeFile, copyFile, fsStat, getTempDir, realPath} from '../../lib/helpers'; +import {getPackageRoot, getTempDir} from '../../lib/helpers'; describe('Repository', function() { it('delegates all state methods', function() { @@ -72,7 +72,11 @@ describe('Repository', function() { it('returns the correct git directory path', async function() { const workingDirPath = await cloneRepository('three-files'); const workingDirPathWithGitFile = await getTempDir(); - await writeFile(path.join(workingDirPathWithGitFile, '.git'), `gitdir: ${path.join(workingDirPath, '.git')}`); + await fs.writeFile( + path.join(workingDirPathWithGitFile, '.git'), + `gitdir: ${path.join(workingDirPath, '.git')}`, + {encoding: 'utf8'}, + ); const repository = new Repository(workingDirPath); assert.equal(repository.getGitDirectoryPath(), path.join(workingDirPath, '.git')); @@ -89,7 +93,7 @@ describe('Repository', function() { describe('init', function() { it('creates a repository in the given dir and returns the repository', async function() { - const soonToBeRepositoryPath = await realPath(temp.mkdirSync()); + const soonToBeRepositoryPath = await fs.realpath(temp.mkdirSync()); const repo = new Repository(soonToBeRepositoryPath); assert.isTrue(repo.isLoading()); @@ -106,7 +110,7 @@ describe('Repository', function() { describe('clone', function() { it('clones a repository from a URL to a directory and returns the repository', async function() { const upstreamPath = await cloneRepository('three-files'); - const destDir = await realPath(temp.mkdirSync()); + const destDir = await fs.realpath(temp.mkdirSync()); const repo = new Repository(destDir); const clonePromise = repo.clone(upstreamPath); @@ -118,7 +122,7 @@ describe('Repository', function() { it('clones a repository when the directory does not exist yet', async function() { const upstreamPath = await cloneRepository('three-files'); - const parentDir = await realPath(temp.mkdirSync()); + const parentDir = await fs.realpath(temp.mkdirSync()); const destDir = path.join(parentDir, 'subdir'); const repo = new Repository(destDir); @@ -540,7 +544,7 @@ describe('Repository', function() { it('executes hook scripts with a sane environment', async function() { const workingDirPath = await cloneRepository('three-files'); const scriptDirPath = path.join(getPackageRoot(), 'test', 'scripts'); - await copyFile( + await fs.copy( path.join(scriptDirPath, 'hook.sh'), path.join(workingDirPath, '.git', 'hooks', 'pre-commit'), ); @@ -1004,9 +1008,10 @@ describe('Repository', function() { }); const stats = await Promise.all( - files - .map(file => fsStat(path.join(currentDirectory, file)) - .then(stat => ({file, stat}))), + files.map(async file => { + const stat = await fs.stat(path.join(currentDirectory, file)); + return {file, stat}; + }), ); const subdirs = []; @@ -1204,7 +1209,7 @@ describe('Repository', function() { const repository = new Repository(workdir); await repository.getLoadPromise(); - await writeFile(path.join(workdir, 'a.txt'), 'bar\nbar-1\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'bar\nbar-1\n', {encoding: 'utf8'}); await assertCorrectInvalidation({repository}, async () => { await repository.stageFiles(['a.txt']); @@ -1216,7 +1221,7 @@ describe('Repository', function() { const repository = new Repository(workdir); await repository.getLoadPromise(); - await writeFile(path.join(workdir, 'a.txt'), 'bar\nbaz\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'bar\nbaz\n', {encoding: 'utf8'}); await repository.stageFiles(['a.txt']); await assertCorrectInvalidation({repository}, async () => { @@ -1229,7 +1234,7 @@ describe('Repository', function() { const repository = new Repository(workdir); await repository.getLoadPromise(); - await writeFile(path.join(workdir, 'a.txt'), 'bar\nbaz\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'bar\nbaz\n', {encoding: 'utf8'}); await repository.stageFiles(['a.txt']); await assertCorrectInvalidation({repository}, async () => { @@ -1242,9 +1247,9 @@ describe('Repository', function() { const repository = new Repository(workdir); await repository.getLoadPromise(); - await writeFile(path.join(workdir, 'a.txt'), 'foo\nfoo-1\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'foo\nfoo-1\n', {encoding: 'utf8'}); const patch = await repository.getFilePatchForPath('a.txt'); - await writeFile(path.join(workdir, 'a.txt'), 'foo\nfoo-1\nfoo-2\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'foo\nfoo-1\nfoo-2\n', {encoding: 'utf8'}); await assertCorrectInvalidation({repository}, async () => { await repository.applyPatchToIndex(patch); @@ -1256,7 +1261,7 @@ describe('Repository', function() { const repository = new Repository(workdir); await repository.getLoadPromise(); - await writeFile(path.join(workdir, 'a.txt'), 'foo\nfoo-1\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'foo\nfoo-1\n', {encoding: 'utf8'}); const patch = (await repository.getFilePatchForPath('a.txt')).getUnstagePatch(); await assertCorrectInvalidation({repository}, async () => { @@ -1269,7 +1274,7 @@ describe('Repository', function() { const repository = new Repository(workdir); await repository.getLoadPromise(); - await writeFile(path.join(workdir, 'b.txt'), 'foo\nfoo-1\nfoo-2\n'); + await fs.writeFile(path.join(workdir, 'b.txt'), 'foo\nfoo-1\nfoo-2\n', {encoding: 'utf8'}); await repository.stageFiles(['b.txt']); await assertCorrectInvalidation({repository}, async () => { @@ -1306,7 +1311,7 @@ describe('Repository', function() { await repository.getLoadPromise(); const fullPath = path.join(workdir, 'a.txt'); - await writeFile(fullPath, 'qux\nfoo\nbar\n'); + await fs.writeFile(fullPath, 'qux\nfoo\nbar\n', {encoding: 'utf8'}); await repository.git.exec(['update-index', '--chmod=+x', 'a.txt']); const commonBaseSha = '7f95a814cbd9b366c5dedb6d812536dfef2fffb7'; @@ -1356,7 +1361,7 @@ describe('Repository', function() { const repository = new Repository(localRepoPath); await repository.getLoadPromise(); - await writeFile(path.join(localRepoPath, 'new-file.txt'), 'one\n'); + await fs.writeFile(path.join(localRepoPath, 'new-file.txt'), 'one\n', {encoding: 'utf8'}); await repository.stageFiles(['new-file.txt']); await repository.commit('wat'); @@ -1370,7 +1375,7 @@ describe('Repository', function() { const repository = new Repository(localRepoPath); await repository.getLoadPromise(); - await writeFile(path.join(localRepoPath, 'new-file.txt'), 'one\n'); + await fs.writeFile(path.join(localRepoPath, 'new-file.txt'), 'one\n', {encoding: 'utf8'}); await repository.stageFiles(['new-file.txt']); await repository.commit('wat'); @@ -1396,8 +1401,8 @@ describe('Repository', function() { await repository.getLoadPromise(); await Promise.all([ - writeFile(path.join(workdir, 'a.txt'), 'aaa\n'), - writeFile(path.join(workdir, 'c.txt'), 'baz\n'), + fs.writeFile(path.join(workdir, 'a.txt'), 'aaa\n', {encoding: 'utf8'}), + fs.writeFile(path.join(workdir, 'c.txt'), 'baz\n', {encoding: 'utf8'}), ]); await assertCorrectInvalidation({repository}, async () => { @@ -1473,7 +1478,7 @@ describe('Repository', function() { it('when staging files', async function() { const {repository, observer} = await wireUpObserver(); - await writeFile(path.join(workdir, 'a.txt'), 'boop\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'boop\n', {encoding: 'utf8'}); await assertCorrectInvalidation({repository}, async () => { await observer.start(); @@ -1485,7 +1490,7 @@ describe('Repository', function() { it('when unstaging files', async function() { const {repository, observer} = await wireUpObserver(); - await writeFile(path.join(workdir, 'a.txt'), 'boop\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'boop\n', {encoding: 'utf8'}); await repository.git.stageFiles(['a.txt']); await assertCorrectInvalidation({repository}, async () => { @@ -1508,7 +1513,7 @@ describe('Repository', function() { it('when applying a patch to the index', async function() { const {repository, observer} = await wireUpObserver(); - await writeFile(path.join(workdir, 'a.txt'), 'boop\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'boop\n', {encoding: 'utf8'}); const patch = await repository.getFilePatchForPath('a.txt'); await assertCorrectInvalidation({repository}, async () => { @@ -1524,7 +1529,7 @@ describe('Repository', function() { it('when applying a patch to the working directory', async function() { const {repository, observer} = await wireUpObserver(); - await writeFile(path.join(workdir, 'a.txt'), 'boop\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'boop\n', {encoding: 'utf8'}); const patch = (await repository.getFilePatchForPath('a.txt')).getUnstagePatch(); await assertCorrectInvalidation({repository}, async () => { @@ -1540,7 +1545,7 @@ describe('Repository', function() { it('when committing', async function() { const {repository, observer} = await wireUpObserver(); - await writeFile(path.join(workdir, 'a.txt'), 'boop\n'); + await fs.writeFile(path.join(workdir, 'a.txt'), 'boop\n', {encoding: 'utf8'}); await repository.stageFiles(['a.txt']); await assertCorrectInvalidation({repository}, async () => { @@ -1636,7 +1641,7 @@ describe('Repository', function() { const {localRepoPath} = await setUpLocalAndRemoteRepositories({remoteAhead: true}); const {repository, observer} = await wireUpObserver(null, localRepoPath); - await writeFile(path.join(localRepoPath, 'file.txt'), 'one\n'); + await fs.writeFile(path.join(localRepoPath, 'file.txt'), 'one\n', {encoding: 'utf8'}); await repository.stageFiles(['file.txt']); await repository.commit('wat'); @@ -1657,7 +1662,7 @@ describe('Repository', function() { const {localRepoPath} = await setUpLocalAndRemoteRepositories(); const {repository, observer} = await wireUpObserver(null, localRepoPath); - await writeFile(path.join(localRepoPath, 'new-file.txt'), 'one\n'); + await fs.writeFile(path.join(localRepoPath, 'new-file.txt'), 'one\n', {encoding: 'utf8'}); await repository.stageFiles(['new-file.txt']); await repository.commit('wat'); @@ -1690,7 +1695,7 @@ describe('Repository', function() { await assertCorrectInvalidation({repository}, async () => { await observer.start(); - await writeFile(path.join(workdir, 'b.txt'), 'new contents\n'); + await fs.writeFile(path.join(workdir, 'b.txt'), 'new contents\n', {encoding: 'utf8'}); await expectEvents( repository, 'b.txt', diff --git a/test/models/workdir-cache.test.js b/test/models/workdir-cache.test.js index 61746eaaa5..d681f9828c 100644 --- a/test/models/workdir-cache.test.js +++ b/test/models/workdir-cache.test.js @@ -1,11 +1,10 @@ import path from 'path'; import temp from 'temp'; -import fs from 'fs'; +import fs from 'fs-extra'; import {cloneRepository} from '../helpers'; import WorkdirCache from '../../lib/models/workdir-cache'; -import {realPath} from '../../lib/helpers'; describe('WorkdirCache', function() { let cache; @@ -30,7 +29,7 @@ describe('WorkdirCache', function() { it('finds a workdir from a gitdir file', async function() { const repoDir = await cloneRepository('three-files'); - const expectedDir = await realPath(temp.mkdirSync()); + const expectedDir = await fs.realpath(temp.mkdirSync()); fs.writeFileSync(path.join(expectedDir, '.git'), `gitdir: ${path.join(repoDir, '.git')}`, 'utf8'); const actualDir = await cache.find(expectedDir); diff --git a/test/models/workspace-change-observer.test.js b/test/models/workspace-change-observer.test.js index 516ace163c..50e6a5cc24 100644 --- a/test/models/workspace-change-observer.test.js +++ b/test/models/workspace-change-observer.test.js @@ -1,9 +1,9 @@ import path from 'path'; +import fs from 'fs-extra'; import until from 'test-until'; import {cloneRepository, buildRepository} from '../helpers'; -import {writeFile} from '../../lib/helpers'; import WorkspaceChangeObserver from '../../lib/models/workspace-change-observer'; @@ -49,7 +49,7 @@ describe('WorkspaceChangeObserver', function() { createObserver(repository); await observer.start(); - await writeFile(path.join(workdirPath, 'a.txt'), 'change'); + await fs.writeFile(path.join(workdirPath, 'a.txt'), 'change', {encoding: 'utf8'}); await repository.stageFiles(['a.txt']); await assert.async.isTrue(changeSpy.called); From 685314e492889256a1f7c2931707a8a46c190420 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 13 Mar 2018 09:24:52 -0400 Subject: [PATCH 0018/5422] Actually import fs-extra instead of fs --- lib/models/repository-states/present.js | 2 +- test/controllers/root-controller.test.js | 2 +- test/models/repository.test.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index fe2ba5426b..28b07bfeb6 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -1,5 +1,5 @@ import path from 'path'; -import fs from 'fs'; +import fs from 'fs-extra'; import State from './state'; diff --git a/test/controllers/root-controller.test.js b/test/controllers/root-controller.test.js index 8ed002e6ec..b8ac62c1c2 100644 --- a/test/controllers/root-controller.test.js +++ b/test/controllers/root-controller.test.js @@ -1,5 +1,5 @@ import path from 'path'; -import fs from 'fs'; +import fs from 'fs-extra'; import React from 'react'; import {shallow, mount} from 'enzyme'; diff --git a/test/models/repository.test.js b/test/models/repository.test.js index 5d1e8fc7f5..781a9a4f19 100644 --- a/test/models/repository.test.js +++ b/test/models/repository.test.js @@ -1,4 +1,4 @@ -import fs from 'fs'; +import fs from 'fs-extra'; import path from 'path'; import dedent from 'dedent-js'; import temp from 'temp'; From ff0a346f9f0c33a18806c15068facac3c996b69e Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 13 Mar 2018 09:25:06 -0400 Subject: [PATCH 0019/5422] File under "how did this ever work" --- test/controllers/git-tab-controller.test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index 7e3f5fcaf1..7d5b0f1d6f 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -511,26 +511,26 @@ describe('GitTabController', function() { assert.equal(stagingView.props.stagedChanges.length, 0); const conflict1 = stagingView.props.mergeConflicts.filter(c => c.filePath === 'modified-on-both-ours.txt')[0]; - const contentsWithMarkers = fs.readFileSync(path.join(workdirPath, conflict1.filePath), 'utf8'); + const contentsWithMarkers = fs.readFileSync(path.join(workdirPath, conflict1.filePath), {encoding: 'utf8'}); assert.include(contentsWithMarkers, '>>>>>>>'); assert.include(contentsWithMarkers, '<<<<<<<'); // click Cancel confirm.returns(1); - await stagingView.dblclickOnItem({}, conflict1).selectionUpdatePromise; + stagingView.dblclickOnItem({}, conflict1); - await assert.async.lengthOf(stagingView.props.mergeConflicts, 5); + await assert.async.isTrue(confirm.calledOnce); + assert.lengthOf(stagingView.props.mergeConflicts, 5); assert.lengthOf(stagingView.props.stagedChanges, 0); - assert.isTrue(confirm.calledOnce); // click Stage confirm.reset(); confirm.returns(0); await stagingView.dblclickOnItem({}, conflict1).selectionUpdatePromise; + await assert.async.isTrue(confirm.calledOnce); await assert.async.lengthOf(stagingView.props.mergeConflicts, 4); assert.lengthOf(stagingView.props.stagedChanges, 1); - assert.isTrue(confirm.calledOnce); // clear merge markers const conflict2 = stagingView.props.mergeConflicts.filter(c => c.filePath === 'modified-on-both-theirs.txt')[0]; From 189318f54549a85bc9e1176491cced964e2acdb4 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 13 Mar 2018 09:25:16 -0400 Subject: [PATCH 0020/5422] :fire: ncp dependency --- package-lock.json | 39 ++++++++++++++++++++++----------------- package.json | 1 - 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 184ae3467c..374e5076ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,10 +41,10 @@ }, "argparse": { "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "integrity": "sha512-iK7YPKV+GsvihPUTKcM3hh2gq47zSFCpVDv/Ay2O9mzuD7dfvLV4vhms4XcjZvv4VRgXuGLMEts51IlTjS11/A==", "dev": true, "requires": { - "sprintf-js": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + "sprintf-js": "1.0.3" } }, "arr-diff": { @@ -144,7 +144,7 @@ }, "babel-code-frame": { "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "integrity": "sha512-Dmx3yJCO/UHWgFTKUlBPHUm7h5hCjI5Lfc07gmSv7H4AbUwxS7NHyorp8HN1YEd4xSDCf7P4zqnS63I3aaJTwg==", "requires": { "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -1730,6 +1730,14 @@ "object-visit": "1.0.1" } }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "1.0.0" + } + }, "commander": { "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", @@ -1905,8 +1913,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "detect-indent": { "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -1922,7 +1929,7 @@ }, "doctrine": { "version": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "integrity": "sha512-i5aQLQvEyAhw7XI4mbKxyrVdkqIc4OsCh9Z0XQof9X/ANftd0ZN1M4qz+TSU2VSokVwl23kXDvhnC4F4W+ip/g==", "dev": true, "requires": { "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -2049,6 +2056,7 @@ "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "requires": { "asynckit": "0.4.0", + "combined-stream": "1.0.6", "mime-types": "2.1.17" } }, @@ -2123,6 +2131,7 @@ "aws-sign2": "0.7.0", "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "caseless": "0.12.0", + "combined-stream": "1.0.6", "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "form-data": "2.3.1", @@ -2293,7 +2302,7 @@ }, "es6-iterator": { "version": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "integrity": "sha512-6QdxKjEfkAutL86ORbUgbZjfmssn3hfrFZDz5utw2BH9EJWYCVVqn9dN/WvsWSzsZ7Ox/fMrHXexX96fF5vEsw==", "dev": true, "requires": { "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -4001,7 +4010,7 @@ }, "invariant": { "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "integrity": "sha512-FUiAFCOgp7bBzHfa/fK+Uc/vqywvdN9Wg3CiTprLcE630mrhxjDS5MlBkHzeI6+bC/6bq9VX/hxBt05fPAT5WA==", "requires": { "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" } @@ -4663,7 +4672,7 @@ }, "lodash.cond": { "version": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "integrity": "sha512-RWjUhzGbzG/KfDwk+onqdXvrsNv47G9UCMJgSKalPTSqJQyxZhQophG9jgqLf+15TIbZ5a/yG2YKOWsH3dVy9A==", "dev": true }, "lodash.create": { @@ -5177,11 +5186,6 @@ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", "dev": true }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" - }, "next-tick": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", @@ -5559,7 +5563,7 @@ }, "process-nextick-args": { "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==", "dev": true }, "progress": { @@ -5765,7 +5769,7 @@ }, "regenerator-runtime": { "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" }, "regex-not": { "version": "1.0.2", @@ -6490,7 +6494,8 @@ } }, "sprintf-js": { - "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, diff --git a/package.json b/package.json index 1023b18001..8e60635c6c 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "lodash.memoize": "^4.1.2", "moment": "^2.17.1", "multi-list-selection": "^0.1.1", - "ncp": "^2.0.0", "prop-types": "^15.5.8", "react": "^15.6.1", "react-dom": "^15.6.1", From 84d8ee77c470307960fdd5ec0fecffbe60d6a798 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 14 Mar 2018 15:05:07 +0100 Subject: [PATCH 0021/5422] WIP --- lib/git-shell-out-strategy.js | 7 ++ lib/models/repository-states/present.js | 4 + lib/models/user-store.js | 30 +++++++ test/git-strategies.test.js | 20 ++++- test/models/user-store.test.js | 108 ++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 lib/models/user-store.js create mode 100644 test/models/user-store.test.js diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index f00153814c..5de426d0da 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -598,6 +598,13 @@ export default class GitShellOutStrategy { return commits; } + getRepoAuthors() { + return { + 'kuychaco@github.com': 'Katrina Uychaco', + 'smashwilson@github.com': 'Ash Wilson' + } + } + readFileFromIndex(filePath) { return this.exec(['show', `:${toGitPathSep(filePath)}`]); } diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index 28b07bfeb6..147f240685 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -59,6 +59,10 @@ export default class Present extends State { this.operationStates = new OperationStates({didUpdate: this.didUpdate.bind(this)}); + // this.userStore = new UserStore() + // const authors = this.getRepoAuthors() + // userStore.getUsers() + this.amending = false; this.amendingCommitMessage = ''; this.regularCommitMessage = ''; diff --git a/lib/models/user-store.js b/lib/models/user-store.js new file mode 100644 index 0000000000..97aa749aba --- /dev/null +++ b/lib/models/user-store.js @@ -0,0 +1,30 @@ +export default class UserStore { + constructor({repository}) { + this.repository = repository + } + + populate() { + const users = this.repository.getAuthors() + // if repo present, get info + // else, add listener to do so when repo is present + this.repository.onDidChangeState(({oldState, newState}) => { + if (!oldState.isLoading() && newState.isPresent()) { + + } + }); + } + + addUsers(users) { + + } + + getUsers() { + + } +} + +/* + + + +*/ diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index 7cccac6744..891b093400 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -181,9 +181,12 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; assert.strictEqual(commits[9].message, 'Commit 1'); }); - it('includes co-authors based on commit body trailers', async function() { + it.only('includes co-authors based on commit body trailers', async function() { const workingDirPath = await cloneRepository('multiple-commits'); const git = createTestStrategy(workingDirPath); + console.log(workingDirPath); + + debugger await git.commit(dedent` Implemented feature collaboratively @@ -200,6 +203,21 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; }); + describe('getRepoAuthors', function() { + it.only('returns list of all ', async function() { + const workingDirPath = await cloneRepository('multiple-commits'); + const git = createTestStrategy(workingDirPath); + + console.log(workingDirPath); + debugger + }) + + // commit with author and committer + + // commit with co-author trailers + + }) + describe('diffFileStatus', function() { it('returns an object with working directory file diff status between relative to specified target commit', async function() { const workingDirPath = await cloneRepository('three-files'); diff --git a/test/models/user-store.test.js b/test/models/user-store.test.js new file mode 100644 index 0000000000..7b5588c19c --- /dev/null +++ b/test/models/user-store.test.js @@ -0,0 +1,108 @@ +import UserStore from '../../lib/models/user-store'; + +describe('UserStore', function() { + describe('populate', function() { + it('loads store with users in repo', async function() { + const repo = await buildRepository('three-files'); + const store = new UserStore({repository: repo}); + await store.populate(); + }) + }) + + describe('addUsers', function() { + it('adds specified user', function() { + + }) + }) + it('', async function() { + const rawUsers = { + 'kuychaco@github.com': 'Katrina Uychaco', + 'smashwilson@github.com': 'Ash Wilson' + } + + + const store = new UserStore() + store.addUsers(rawUsers) + const users = store.getUsers() + assert.deepEqual(users, { + 'kuychaco@github.com': { + name: 'Katrina Uychaco', + emails: ['kuychaco@github.com'], // for mailmap support + github: { + handle: '@kuychaco', + avatarUrl: 'githubusercontent...' + } + } + }) + }) +}) + +/* + +const repo = await buildRepository('three-files'); +const store = new UserStore({repository: repo}); +await store.populate(); + +// User: + +class User { + constructor ({email, fullname, githubLogin}) { + // + } + + isGitHubUser() { + return !!this.githubLogin; + } + + displayName() { + if (this.githubLogin) { + return `@${this.githubLogin}` + } else { + return `${this.name} <${this.email}>` + } + } + + coAuthorTrailer() { + return `Co-authored-by: ${this.email}` + } +} + +// UserStore: + +class UserStore { + constructor ({repository}) { + this.repository = repository + } + + populate () { + this.repository.onDidChangeState(({oldState, newState}) => { + if (!oldState.isLoading() && newState.isPresent()) { + this.kickOffLocalShit(); + } + } + }) + } + + addUsersFromGraphQL(response) { + // gets called in query renderer callback + this.addMentionable(); + } + + async kickOffGraphQLShit() { + // Find GitHub repo(s) from remotes + // Hit GraphQL API + this.addMentionable(username); + } + + async kickOffLocalShit() { + // Run git commands to get authors/committers + this.addMentionable(username); + } + + mentionableUsers() { + // returns [User] + } +} +} + +*/ From 25a969fd915d599a5e2d25cffe7acf43077c70f6 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 14 Mar 2018 20:26:26 +0100 Subject: [PATCH 0022/5422] Implement Repository#getAuthors and tests --- lib/git-shell-out-strategy.js | 33 +++++++++++++--- test/git-strategies.test.js | 71 +++++++++++++++++++++++++++++------ 2 files changed, 87 insertions(+), 17 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 5de426d0da..13d0f0b901 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -598,11 +598,34 @@ export default class GitShellOutStrategy { return commits; } - getRepoAuthors() { - return { - 'kuychaco@github.com': 'Katrina Uychaco', - 'smashwilson@github.com': 'Ash Wilson' - } + async getAuthors(options = {}) { + const {max, ref} = {max: 1, ref: 'HEAD', ...options}; + + // https://git-scm.com/docs/git-log#_pretty_formats + // %x00 - null byte + // %an - author name + // %ae - author email + // %cn - committer name + // %ce - committer email + // %(trailers) - display the trailers of the body + // TODO figure out why %(trailers:only,unfold) doesn't work + + const output = await this.exec([ + 'log', '--pretty=format:%an %ae%x00%cn %ce%x00%(trailers)', '-z', '-n', max, ref, '--', + ]); + return output.split('\0').reduce((acc, line) => { + if (line.match(/^co-authored-by: /i)) { + const coAuthorLines = line.trim().split(LINE_ENDING_REGEX); + coAuthorLines.forEach(coAuthor => { + const [_, name, email] = coAuthor.match(/co-authored-by: (.*) <(.*)>/i); // eslint-disable-line no-unused-vars + acc[email] = name; + }); + } else if (line !== '') { + const [_, name, email] = line.match(/(.*) (.*@.*)/); // eslint-disable-line no-unused-vars + acc[email] = name; + } + return acc; + }, {}); } readFileFromIndex(filePath) { diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index 891b093400..bdd1478471 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -181,12 +181,9 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; assert.strictEqual(commits[9].message, 'Commit 1'); }); - it.only('includes co-authors based on commit body trailers', async function() { + it('includes co-authors based on commit body trailers', async function() { const workingDirPath = await cloneRepository('multiple-commits'); const git = createTestStrategy(workingDirPath); - console.log(workingDirPath); - - debugger await git.commit(dedent` Implemented feature collaboratively @@ -203,20 +200,70 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; }); - describe('getRepoAuthors', function() { - it.only('returns list of all ', async function() { + describe('getAuthors', function() { + it('returns list of all authors in the last commits', async function() { + const workingDirPath = await cloneRepository('multiple-commits'); + const git = createTestStrategy(workingDirPath); + + await git.exec(['config', 'user.name', 'Mona Lisa']); + await git.exec(['config', 'user.email', 'mona@lisa.com']); + await git.commit('Commit from Mona', {allowEmpty: true}); + + await git.exec(['config', 'user.name', 'Hubot']); + await git.exec(['config', 'user.email', 'hubot@github.com']); + await git.commit('Commit from Hubot', {allowEmpty: true}); + + await git.exec(['config', 'user.name', 'Me']); + await git.exec(['config', 'user.email', 'me@github.com']); + await git.commit('Commit from me', {allowEmpty: true}); + + const authors = await git.getAuthors({max: 3}); + assert.deepEqual(authors, { + 'mona@lisa.com': 'Mona Lisa', + 'hubot@github.com': 'Hubot', + 'me@github.com': 'Me', + }); + }); + + it('includes commit authors', async function() { + const workingDirPath = await cloneRepository('multiple-commits'); + const git = createTestStrategy(workingDirPath); + + await git.exec(['config', 'user.name', 'Com Mitter']); + await git.exec(['config', 'user.email', 'comitter@place.com']); + await git.exec(['commit', '--allow-empty', '--author="A U Thor "', '-m', 'Commit together!']); + + const authors = await git.getAuthors({max: 1}); + assert.deepEqual(authors, { + 'comitter@place.com': 'Com Mitter', + 'author@site.org': 'A U Thor', + }); + }); + + it('includes co-authors from trailers', async function() { const workingDirPath = await cloneRepository('multiple-commits'); const git = createTestStrategy(workingDirPath); - console.log(workingDirPath); - debugger - }) + await git.exec(['config', 'user.name', 'Com Mitter']); + await git.exec(['config', 'user.email', 'comitter@place.com']); - // commit with author and committer + await git.commit(dedent` + Implemented feature collaboratively - // commit with co-author trailers + Co-authored-by: name + Co-authored-by: another name " + Co-authored-by: yet another name " + `, {allowEmpty: true}); - }) + const authors = await git.getAuthors({max: 1}); + assert.deepEqual(authors, { + 'comitter@place.com': 'Com Mitter', + 'name@example.com': 'name', + 'another-name@example.com': 'another name', + 'yet-another@example.com': 'yet another name', + }); + }); + }); describe('diffFileStatus', function() { it('returns an object with working directory file diff status between relative to specified target commit', async function() { From 9cb7861f75de716b91dd58ce36e81dca5c326cb7 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 14 Mar 2018 23:01:31 +0100 Subject: [PATCH 0023/5422] Add getAuthors method to repository --- lib/models/repository-states/present.js | 7 +++++++ lib/models/repository-states/state.js | 7 +++++++ lib/models/repository.js | 2 ++ 3 files changed, 16 insertions(+) diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index 147f240685..5554ea63e9 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -615,6 +615,13 @@ export default class Present extends State { }); } + // Author information + + getAuthors(options) { + // TODO: caching + return this.git().getAuthors(options); + } + // Branches getBranches() { diff --git a/lib/models/repository-states/state.js b/lib/models/repository-states/state.js index db17bb9ffa..b886c49d69 100644 --- a/lib/models/repository-states/state.js +++ b/lib/models/repository-states/state.js @@ -352,6 +352,13 @@ export default class State { return Promise.resolve([]); } + // Author information + + @shouldDelegate + getAuthors() { + return Promise.resolve({}); + } + // Branches @shouldDelegate diff --git a/lib/models/repository.js b/lib/models/repository.js index 6aa356c799..90ea027227 100644 --- a/lib/models/repository.js +++ b/lib/models/repository.js @@ -292,6 +292,8 @@ const delegates = [ 'getLastCommit', 'getRecentCommits', + 'getAuthors', + 'getBranches', 'getCurrentBranch', 'getHeadDescription', From 59ed70709d9f6318b36a8217d8b76dd073afab43 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 14 Mar 2018 23:11:02 +0100 Subject: [PATCH 0024/5422] Add basic UserStore --- lib/models/user-store.js | 76 ++++++++++++++---- test/models/user-store.test.js | 143 ++++++++++----------------------- 2 files changed, 105 insertions(+), 114 deletions(-) diff --git a/lib/models/user-store.js b/lib/models/user-store.js index 97aa749aba..14096d9919 100644 --- a/lib/models/user-store.js +++ b/lib/models/user-store.js @@ -1,30 +1,76 @@ +// TODO: create proper User class + export default class UserStore { constructor({repository}) { - this.repository = repository + this.repository = repository; + this.users = {}; + this.usersLoadedPromise = new Promise(res => { + this.resolveUsersLoadedPromise = res; + }); } populate() { - const users = this.repository.getAuthors() + // TODO: check conditional branches // if repo present, get info - // else, add listener to do so when repo is present - this.repository.onDidChangeState(({oldState, newState}) => { - if (!oldState.isLoading() && newState.isPresent()) { - - } - }); - } - - addUsers(users) { + if (this.repository.isPresent()) { + this.loadUsers(); + // else, add listener to do so when repo is present + } else { + this.repository.onDidChangeState(({from, to}) => { + if (!from.isPresent() && to.isPresent()) { + this.loadUsers(); + } + }); + } + return this.usersLoadedPromise; } - getUsers() { + loadUsers() { + // TODO: also get users from GraphQL API if available. Will need to reshape the data for this to store additional info + // look into using Dexie + this.loadUsersFromLocalRepo(); + } + async loadUsersFromLocalRepo() { + const users = await this.repository.getAuthors(); + this.addUsers(users); + this.resolveUsersLoadedPromise(); } -} -/* + addUsersFromGraphQL(response) { + // this gets called in query renderer callback + // this.addUsers(users); + } + addUsers(users) { + this.users = {...this.users, ...users}; + } + getUsers() { + // don't actually do this. will change when we settle on best way to actually store data + return Object.keys(this.users).sort().map(email => ({email, name: this.users[email]})); + } +} -*/ +// class User { +// constructor({email, name, githubLogin}) { +// +// } +// +// isGitHubUser() { +// return !!this.githubLogin; +// } +// +// displayName() { +// if (this.githubLogin) { +// return `@${this.githubLogin}`; +// } else { +// return `${this.name}`; +// } +// } +// +// coAuthorTrailer() { +// return `Co-authored-by: ${this.email}`; +// } +// } diff --git a/test/models/user-store.test.js b/test/models/user-store.test.js index 7b5588c19c..ace0f1e09b 100644 --- a/test/models/user-store.test.js +++ b/test/models/user-store.test.js @@ -1,108 +1,53 @@ import UserStore from '../../lib/models/user-store'; +import {cloneRepository, buildRepository} from '../helpers'; + describe('UserStore', function() { describe('populate', function() { it('loads store with users in repo', async function() { - const repo = await buildRepository('three-files'); - const store = new UserStore({repository: repo}); - await store.populate(); - }) - }) - - describe('addUsers', function() { - it('adds specified user', function() { - - }) - }) - it('', async function() { - const rawUsers = { - 'kuychaco@github.com': 'Katrina Uychaco', - 'smashwilson@github.com': 'Ash Wilson' - } - - - const store = new UserStore() - store.addUsers(rawUsers) - const users = store.getUsers() - assert.deepEqual(users, { - 'kuychaco@github.com': { - name: 'Katrina Uychaco', - emails: ['kuychaco@github.com'], // for mailmap support - github: { - handle: '@kuychaco', - avatarUrl: 'githubusercontent...' - } - } - }) - }) -}) - -/* - -const repo = await buildRepository('three-files'); -const store = new UserStore({repository: repo}); -await store.populate(); - -// User: - -class User { - constructor ({email, fullname, githubLogin}) { - // - } + const workdirPath = await cloneRepository('multiple-commits'); + const repository = await buildRepository(workdirPath); + const store = new UserStore({repository}); - isGitHubUser() { - return !!this.githubLogin; - } + assert.deepEqual(store.getUsers(), []); - displayName() { - if (this.githubLogin) { - return `@${this.githubLogin}` - } else { - return `${this.name} <${this.email}>` - } - } - - coAuthorTrailer() { - return `Co-authored-by: ${this.email}` - } -} - -// UserStore: - -class UserStore { - constructor ({repository}) { - this.repository = repository - } - - populate () { - this.repository.onDidChangeState(({oldState, newState}) => { - if (!oldState.isLoading() && newState.isPresent()) { - this.kickOffLocalShit(); - } - } - }) - } - - addUsersFromGraphQL(response) { - // gets called in query renderer callback - this.addMentionable(); - } - - async kickOffGraphQLShit() { - // Find GitHub repo(s) from remotes - // Hit GraphQL API - this.addMentionable(username); - } - - async kickOffLocalShit() { - // Run git commands to get authors/committers - this.addMentionable(username); - } + await store.populate(); + const users = store.getUsers(); + assert.deepEqual(users, [ + { + email: 'kuychaco@github.com', + name: 'Katrina Uychaco', + }, + ]); + }); + }); - mentionableUsers() { - // returns [User] - } -} -} + describe('addUsers', function() { + it('adds specified user', async function() { + const workdirPath = await cloneRepository('multiple-commits'); + const repository = await buildRepository(workdirPath); + const store = new UserStore({repository}); -*/ + await store.populate(); + store.addUsers({ + 'mona@lisa.com': 'Mona Lisa', + 'hubot@github.com': 'Hubot Robot', + }); + + assert.deepEqual(store.getUsers(), [ + { + name: 'Hubot Robot', + email: 'hubot@github.com', + }, + { + name: 'Katrina Uychaco', + email: 'kuychaco@github.com', + }, + { + name: 'Mona Lisa', + email: 'mona@lisa.com', + }, + ]); + }); + }); +}); From 5461d62cc969b4f1a8f43f39d63d282a250ce3b3 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 15 Mar 2018 00:23:29 +0100 Subject: [PATCH 0025/5422] Add Repository#formatCommitMessage and tests Courtesy of GitHub Desktop :) --- lib/models/repository-states/present.js | 9 +++ lib/models/repository-states/state.js | 5 ++ lib/models/repository.js | 1 + test/models/repository.test.js | 82 +++++++++++++++++++++++++ 4 files changed, 97 insertions(+) diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index 5554ea63e9..826d9e6e37 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -266,6 +266,15 @@ export default class Present extends State { }, message, options); } + async formatCommitMessage(rawMessage, trailers) { + // Ensure that message ends with newline for git-interpret trailers to work + const message = `${rawMessage}\n`.replace(/\s+$/, '\n'); + + return trailers !== undefined && trailers.length > 0 + ? await this.git().mergeTrailers(message, trailers) + : message; + } + // Merging @invalidate(() => [ diff --git a/lib/models/repository-states/state.js b/lib/models/repository-states/state.js index b886c49d69..b1584ae28d 100644 --- a/lib/models/repository-states/state.js +++ b/lib/models/repository-states/state.js @@ -178,6 +178,11 @@ export default class State { return unsupportedOperationPromise(this, 'commit'); } + @shouldDelegate + formatCommitMessage(message, trailers) { + return unsupportedOperationPromise(this, 'formatCommitMessage'); + } + // Merging @shouldDelegate diff --git a/lib/models/repository.js b/lib/models/repository.js index 90ea027227..431ff6ffcc 100644 --- a/lib/models/repository.js +++ b/lib/models/repository.js @@ -256,6 +256,7 @@ const delegates = [ 'applyPatchToWorkdir', 'commit', + 'formatCommitMessage', 'merge', 'abortMerge', diff --git a/test/models/repository.test.js b/test/models/repository.test.js index 781a9a4f19..1f1049c878 100644 --- a/test/models/repository.test.js +++ b/test/models/repository.test.js @@ -557,6 +557,88 @@ describe('Repository', function() { }); }); + describe('formatCommitMessage', function() { + it('always adds trailing newline', async () => { + const workingDirPath = await cloneRepository('three-files'); + const repo = new Repository(workingDirPath); + await repo.getLoadPromise(); + + assert.equal(await repo.formatCommitMessage('test'), 'test\n'); + }); + + it('appends trailers to a summary-only message', async () => { + const workingDirPath = await cloneRepository('three-files'); + const repo = new Repository(workingDirPath); + await repo.getLoadPromise(); + + const trailers = [ + {token: 'Co-Authored-By', value: 'Markus Olsson '}, + {token: 'Signed-Off-By', value: 'nerdneha '}, + ]; + + assert.equal(await repo.formatCommitMessage('foo', trailers), + dedent` + foo + + Co-Authored-By: Markus Olsson + Signed-Off-By: nerdneha + + `, + ); + }); + + // note, this relies on the default git config + it('merges duplicate trailers', async () => { + const workingDirPath = await cloneRepository('three-files'); + const repo = new Repository(workingDirPath); + await repo.getLoadPromise(); + + const trailers = [ + {token: 'Co-Authored-By', value: 'Markus Olsson '}, + {token: 'Signed-Off-By', value: 'nerdneha '}, + ]; + assert.equal( + await repo.formatCommitMessage( + 'foo\n\nCo-Authored-By: Markus Olsson ', + trailers, + ), + dedent` + foo + + Co-Authored-By: Markus Olsson + Signed-Off-By: nerdneha + + `, + ); + }); + + // note, this relies on the default git config + it('fixes up malformed trailers when trailers are given', async () => { + const workingDirPath = await cloneRepository('three-files'); + const repo = new Repository(workingDirPath); + await repo.getLoadPromise(); + + const trailers = [ + {token: 'Signed-Off-By', value: 'nerdneha '}, + ]; + + assert.equal( + await repo.formatCommitMessage( + // note the lack of space after : + 'foo\n\nCo-Authored-By:Markus Olsson ', + trailers, + ), + dedent` + foo + + Co-Authored-By: Markus Olsson + Signed-Off-By: nerdneha + + `, + ); + }); + }); + describe('fetch(branchName)', function() { it('brings commits from the remote and updates remote branch, and does not update branch', async function() { const {localRepoPath} = await setUpLocalAndRemoteRepositories({remoteAhead: true}); From 90ab5f4695276d1dc7c637faf96002cf9d776cb2 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 15 Mar 2018 01:50:45 +0100 Subject: [PATCH 0026/5422] WIP --- lib/controllers/commit-controller.js | 6 + lib/controllers/git-tab-controller.js | 10 + lib/git-shell-out-strategy.js | 14 + lib/views/git-tab-view.js | 1 + package-lock.json | 2415 +++---------------------- package.json | 1 + 6 files changed, 278 insertions(+), 2169 deletions(-) diff --git a/lib/controllers/commit-controller.js b/lib/controllers/commit-controller.js index 120822d2ff..9e0c441687 100644 --- a/lib/controllers/commit-controller.js +++ b/lib/controllers/commit-controller.js @@ -110,6 +110,7 @@ export default class CommitController extends React.Component { onChangeMessage={this.handleMessageChange} toggleExpandedCommitMessageEditor={this.toggleExpandedCommitMessageEditor} deactivateCommitBox={!!this.getCommitMessageEditors().length > 0} + userStore={this.props.userStore} /> ); } @@ -138,6 +139,11 @@ export default class CommitController extends React.Component { @autobind async commit(message) { + const trailers = [ + {token: 'Co-Authored-By', value: 'Markus Olsson '}, + {token: 'Signed-Off-By', value: 'nerdneha '}, + ]; + if (this.getCommitMessageEditors().length > 0) { await this.props.commit({filePath: this.getCommitMessagePath()}); } else { diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index 51eee44bf0..385e7513d1 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -9,6 +9,7 @@ import yubikiri from 'yubikiri'; import GitTabView from '../views/git-tab-view'; import ObserveModelDecorator from '../decorators/observe-model'; +import UserStore from '../models/user-store'; import {nullBranch} from '../models/branch'; import {nullCommit} from '../models/commit'; @@ -103,6 +104,8 @@ export default class GitTabController extends React.Component { this.lastFocus = GitTabView.focus.STAGING; this.refView = null; + + /* this.userStore = UserStore.empty() */ } serialize() { @@ -132,6 +135,7 @@ export default class GitTabController extends React.Component { mergeConflicts={this.props.mergeConflicts} workingDirectoryPath={this.props.workingDirectoryPath} mergeMessage={this.props.mergeMessage} + userStore={this.userStore} resolutionProgress={this.props.resolutionProgress} workspace={this.props.workspace} @@ -171,6 +175,12 @@ export default class GitTabController extends React.Component { componentWillReceiveProps(newProps) { this.refreshResolutionProgress(false, false); + + + if (this.props.repository !== newProps.repository) { + this.userStore = new UserStore(newProps.repository); + } + } componentWillUnmount() { diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 13d0f0b901..41023237cd 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -628,6 +628,20 @@ export default class GitShellOutStrategy { }, {}); } + mergeTrailers(commitMessage, trailers, unfold) { + const args = ['interpret-trailers']; + + if (unfold) { + args.push('--unfold'); + } + + for (const trailer of trailers) { + args.push('--trailer', `${trailer.token}=${trailer.value}`); + } + + return this.exec(args, {stdin: commitMessage}); + } + readFileFromIndex(filePath) { return this.exec(['show', `:${toGitPathSep(filePath)}`]); } diff --git a/lib/views/git-tab-view.js b/lib/views/git-tab-view.js index 92e9c4ab32..799e8bd22a 100644 --- a/lib/views/git-tab-view.js +++ b/lib/views/git-tab-view.js @@ -183,6 +183,7 @@ export default class GitTabView extends React.Component { isLoading={this.props.isLoading} lastCommit={this.props.lastCommit} repository={this.props.repository} + userStore={this.props.userStore} /> { this.refRecentCommitController = c; }} diff --git a/package-lock.json b/package-lock.json index 374e5076ed..da4ac9c9b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,7 +2,6 @@ "name": "github", "version": "0.12.0", "lockfileVersion": 1, - "requires": true, "dependencies": { "7zip": { "version": "0.0.6", @@ -13,16 +12,13 @@ "acorn": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha1-U/4WERH5EquZnuiHqQoLxSgi/XU=", + "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", "dev": true }, "acorn-jsx": { "version": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, - "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" - }, "dependencies": { "acorn": { "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", @@ -41,11 +37,8 @@ }, "argparse": { "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha512-iK7YPKV+GsvihPUTKcM3hh2gq47zSFCpVDv/Ay2O9mzuD7dfvLV4vhms4XcjZvv4VRgXuGLMEts51IlTjS11/A==", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true }, "arr-diff": { "version": "4.0.0", @@ -100,32 +93,19 @@ "atom-babel6-transpiler": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/atom-babel6-transpiler/-/atom-babel6-transpiler-1.1.3.tgz", - "integrity": "sha1-1wKxDpDrzx+R4apcSnm5zqmKm6Y=", - "requires": { - "babel-core": "6.26.0" - } + "integrity": "sha1-1wKxDpDrzx+R4apcSnm5zqmKm6Y=" }, "atom-mocha-test-runner": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/atom-mocha-test-runner/-/atom-mocha-test-runner-1.2.0.tgz", "integrity": "sha1-qPZQm40pqAn8tv9H8FiEthLNxqk=", "dev": true, - "requires": { - "etch": "0.8.0", - "grim": "2.0.2", - "less": "2.7.3", - "mocha": "3.4.2", - "tmp": "0.0.31" - }, "dependencies": { "etch": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/etch/-/etch-0.8.0.tgz", "integrity": "sha1-VPYZV0NG+KPueXP1T7vQG1YnItY=", - "dev": true, - "requires": { - "virtual-dom": "2.1.1" - } + "dev": true }, "grim": { "version": "2.0.2", @@ -144,38 +124,12 @@ }, "babel-code-frame": { "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha512-Dmx3yJCO/UHWgFTKUlBPHUm7h5hCjI5Lfc07gmSv7H4AbUwxS7NHyorp8HN1YEd4xSDCf7P4zqnS63I3aaJTwg==", - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "3.0.2" - } + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=" }, "babel-core": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" - }, "dependencies": { "babel-code-frame": { "version": "6.26.0", @@ -256,12 +210,6 @@ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4" - }, "dependencies": { "ansi-regex": { "version": "2.1.1", @@ -341,16 +289,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "requires": { - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -388,11 +326,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -425,12 +358,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -461,72 +388,35 @@ }, "babel-helper-function-name": { "version": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=" }, "babel-helper-get-function-arity": { "version": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=" }, "babel-helper-optimise-call-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=" }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=" }, "babel-helper-replace-supers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=" }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=" }, "babel-messages": { "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=" }, "babel-plugin-chai-assert-async": { "version": "0.1.0", @@ -536,28 +426,17 @@ "babel-plugin-check-es2015-constants": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=" }, "babel-plugin-relay": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-relay/-/babel-plugin-relay-1.4.1.tgz", "integrity": "sha1-isVivLH9KzVl0nGqztMr5CyCc1M=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "graphql": "0.11.7" - }, "dependencies": { "graphql": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=", - "requires": { - "iterall": "1.1.3" - } + "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=" } } }, @@ -594,23 +473,12 @@ "babel-plugin-transform-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=" }, "babel-plugin-transform-class-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - }, "dependencies": { "babel-helper-function-name": { "version": "6.24.1", @@ -644,11 +512,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz", "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", - "requires": { - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - }, "dependencies": { "babel-plugin-syntax-decorators": { "version": "6.13.0", @@ -660,30 +523,17 @@ "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=" }, "babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=" }, "babel-plugin-transform-es2015-block-scoping": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - }, "dependencies": { "babel-code-frame": { "version": "6.26.0", @@ -766,72 +616,37 @@ "babel-plugin-transform-es2015-classes": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=" }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=" }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=" }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=" }, "babel-plugin-transform-es2015-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=" }, "babel-plugin-transform-es2015-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=" }, "babel-plugin-transform-es2015-modules-commonjs": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - }, "dependencies": { "babel-code-frame": { "version": "6.26.0", @@ -906,24 +721,12 @@ "babel-plugin-transform-es2015-object-super": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=" }, "babel-plugin-transform-es2015-parameters": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - }, "dependencies": { "babel-helper-call-delegate": { "version": "6.24.1", @@ -959,61 +762,37 @@ "babel-plugin-transform-es2015-shorthand-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=" }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=" }, "babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=" }, "babel-plugin-transform-es3-member-expression-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz", - "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=" }, "babel-plugin-transform-es3-property-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz", - "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=" }, "babel-plugin-transform-flow-strip-types": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=" }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -1034,39 +813,22 @@ "babel-plugin-transform-react-display-name": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=" }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=" }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=" }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -1094,50 +856,12 @@ "babel-preset-fbjs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-2.1.4.tgz", - "integrity": "sha1-IvNY5mVAc6z2HkegUqd317zPA68=", - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-plugin-syntax-flow": "6.18.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-class-properties": "6.24.1", - "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-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-commonjs": "6.26.0", - "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-template-literals": "6.22.0", - "babel-plugin-transform-es3-member-expression-literals": "6.22.0", - "babel-plugin-transform-es3-property-literals": "6.22.0", - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-plugin-transform-object-rest-spread": "6.26.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1" - } + "integrity": "sha1-IvNY5mVAc6z2HkegUqd317zPA68=" }, "babel-preset-react": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" - }, "dependencies": { "babel-helper-builder-react-jsx": { "version": "6.26.0", @@ -1263,15 +987,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.0", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -1292,50 +1007,22 @@ "babel-runtime": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" - } + "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=" }, "babel-template": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.5" - } + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=" }, "babel-traverse": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "4.17.5" - } + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=" }, "babel-types": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "requires": { - "babel-runtime": "6.25.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "4.17.5", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" }, "babylon": { "version": "6.17.4", @@ -1351,65 +1038,34 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" } } }, "bash-glob": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bash-glob/-/bash-glob-1.0.2.tgz", - "integrity": "sha1-laxWMf3XqPxWnyZxZ6hOuDGXmhs=", - "requires": { - "async-each": "1.0.1", - "bash-path": "1.0.3", - "component-emitter": "1.2.1", - "cross-spawn": "5.1.0", - "extend-shallow": "2.0.1", - "is-extglob": "2.1.1", - "is-glob": "4.0.0" - } + "integrity": "sha1-laxWMf3XqPxWnyZxZ6hOuDGXmhs=" }, "bash-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bash-path/-/bash-path-1.0.3.tgz", - "integrity": "sha1-28nvvfGLHBFBPctZuWDmqlbIQlg=", - "requires": { - "arr-union": "3.1.0", - "is-windows": "1.0.2" - } + "integrity": "sha1-28nvvfGLHBFBPctZuWDmqlbIQlg=" }, "bcrypt-pbkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } + "optional": true }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=" }, "boolbase": { "version": "1.0.0", @@ -1420,38 +1076,17 @@ "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=" }, "braces": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.1", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" } } }, @@ -1469,10 +1104,7 @@ "bser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "requires": { - "node-int64": "0.4.0" - } + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=" }, "builtin-modules": { "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1481,18 +1113,7 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - } + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=" }, "call-me-maybe": { "version": "1.0.1", @@ -1520,11 +1141,6 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", "dev": true, - "requires": { - "assertion-error": "1.1.0", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" - }, "dependencies": { "assertion-error": { "version": "1.1.0", @@ -1565,87 +1181,38 @@ }, "chalk": { "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - } + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" }, "checksum": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/checksum/-/checksum-0.1.1.tgz", - "integrity": "sha1-3GUn1MkL6FYNvR7Uzs8yl9Uo6ek=", - "requires": { - "optimist": "0.3.7" - } + "integrity": "sha1-3GUn1MkL6FYNvR7Uzs8yl9Uo6ek=" }, "cheerio": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "dev": true, - "requires": { - "css-select": "1.2.0", - "dom-serializer": "0.1.0", - "entities": "1.1.1", - "htmlparser2": "3.9.2", - "lodash.assignin": "4.2.0", - "lodash.bind": "4.2.1", - "lodash.defaults": "4.2.0", - "lodash.filter": "4.6.0", - "lodash.flatten": "4.4.0", - "lodash.foreach": "4.5.0", - "lodash.map": "4.6.0", - "lodash.merge": "4.6.0", - "lodash.pick": "4.4.0", - "lodash.reduce": "4.6.0", - "lodash.reject": "4.6.0", - "lodash.some": "4.6.0" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", "dev": true }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -1653,29 +1220,18 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" }, "kind-of": { "version": "5.1.0", @@ -1693,11 +1249,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "wrap-ansi": "2.1.0" - }, "dependencies": { "string-width": { "version": "1.0.2", @@ -1716,35 +1267,15 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "1.0.0" - } + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=" }, "commander": { "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" - } + "dev": true }, "compare-sets": { "version": "1.0.1", @@ -1792,22 +1323,12 @@ "create-react-class": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", - "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", - "requires": { - "fbjs": "0.8.14", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } + "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=" }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, "dependencies": { "lru-cache": { "version": "4.1.2", @@ -1830,13 +1351,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", - "domutils": "1.5.1", - "nth-check": "1.0.1" - } + "dev": true }, "css-what": { "version": "2.1.0", @@ -1844,21 +1359,10 @@ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", "dev": true }, - "d": { - "version": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.26" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -1870,10 +1374,7 @@ "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" }, "decamelize": { "version": "1.2.0", @@ -1895,32 +1396,16 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } + "dev": true }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=" }, "detect-indent": { "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" - } + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=" }, "diff": { "version": "3.2.0", @@ -1929,22 +1414,14 @@ }, "doctrine": { "version": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha512-i5aQLQvEyAhw7XI4mbKxyrVdkqIc4OsCh9Z0XQof9X/ANftd0ZN1M4qz+TSU2VSokVwl23kXDvhnC4F4W+ip/g==", - "dev": true, - "requires": { - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, "dependencies": { "domelementtype": { "version": "1.1.3", @@ -1970,10 +1447,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } + "dev": true }, "dompurify": { "version": "1.0.3", @@ -1984,24 +1458,12 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } + "dev": true }, "dugite": { "version": "1.49.0", "resolved": "https://registry.npmjs.org/dugite/-/dugite-1.49.0.tgz", "integrity": "sha1-b1zkraF0jwyL+bCOYj9foZKYA0w=", - "requires": { - "checksum": "0.1.1", - "mkdirp": "0.5.1", - "progress": "2.0.0", - "request": "2.83.0", - "rimraf": "2.6.2", - "tar": "2.2.1" - }, "dependencies": { "ajv": { "version": "5.3.0", @@ -2182,29 +1644,17 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } + "optional": true }, "electron-devtools-installer": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-2.2.3.tgz", "integrity": "sha1-WLmk7FBzd7xG4JHNQ3FBiODDab4=", - "dev": true, - "requires": { - "7zip": "0.0.6", - "cross-unzip": "0.0.2", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "semver": "5.4.1" - } + "dev": true }, "encoding": { "version": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "0.4.18" - } + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=" }, "entities": { "version": "1.1.1", @@ -2216,60 +1666,30 @@ "version": "2.9.1", "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-2.9.1.tgz", "integrity": "sha1-B9XOaRJBJA+4F78sSxjW5TAkDfY=", - "dev": true, - "requires": { - "cheerio": "0.22.0", - "function.prototype.name": "1.0.3", - "is-subset": "0.1.1", - "lodash": "4.17.5", - "object-is": "1.0.1", - "object.assign": "4.0.4", - "object.entries": "1.0.4", - "object.values": "1.0.4", - "prop-types": "15.6.1", - "uuid": "3.1.0" - } + "dev": true }, "errno": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", "dev": true, - "optional": true, - "requires": { - "prr": "0.0.0" - } + "optional": true }, "error": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/error/-/error-4.4.0.tgz", "integrity": "sha1-v2n/JR+0onnBmtzNqmth6Q2b8So=", - "dev": true, - "requires": { - "camelize": "1.0.0", - "string-template": "0.2.1", - "xtend": "4.0.1" - } + "dev": true }, "error-ex": { "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "requires": { - "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - } + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" }, "es-abstract": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", - "integrity": "sha1-aQgpoHyuNrIi5/2bdcDQVz6yUic=", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "is-callable": "1.1.3", - "is-regex": "1.0.4" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -2283,47 +1703,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "es5-ext": { - "version": "0.10.26", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.26.tgz", - "integrity": "sha1-UbISilMbcMT2dkCTpzy+u4IYY3I=", - "dev": true, - "requires": { - "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" - } - }, - "es6-iterator": { - "version": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha512-6QdxKjEfkAutL86ORbUgbZjfmssn3hfrFZDz5utw2BH9EJWYCVVqn9dN/WvsWSzsZ7Ox/fMrHXexX96fF5vEsw==", - "dev": true, - "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "0.10.26", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" - } + "dev": true }, "es6-promise": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", "integrity": "sha1-3EIhwrFlGHYL2MOaUtjzVvwA7Sk=" }, - "es6-symbol": { - "version": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "0.10.26" - } - }, "escape-string-regexp": { "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" @@ -2333,43 +1719,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.1", - "debug": "2.6.8", - "doctrine": "2.1.0", - "escope": "3.6.0", - "espree": "3.5.0", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.17.2", - "is-resolvable": "1.1.0", - "js-yaml": "3.9.1", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - }, "dependencies": { "ajv": { "version": "4.11.8", @@ -3204,11 +2553,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", "integrity": "sha1-q67IJBd2E7ipWymWOeG2+s9HNEk=", - "dev": true, - "requires": { - "debug": "2.6.8", - "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" - } + "dev": true }, "eslint-plugin-babel": { "version": "4.1.2", @@ -3220,28 +2565,13 @@ "version": "2.34.1", "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.1.tgz", "integrity": "sha512-xwXpTW7Xv+wfuQdfPILmFl9HWBdWbDjE1aZWWQ4EgCpQtMzymEkDQfyD1ME0VA8C0HTXV7cufypQRvLi+Hk/og==", - "dev": true, - "requires": { - "lodash": "4.17.5" - } + "dev": true }, "eslint-plugin-import": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.6.1.tgz", "integrity": "sha512-aAMb32eHCQaQmgdb1MOG1hfu/rPiNgGur2IF71VJeDfTXdLpPiKALKWlzxMdcxQOZZ2CmYVKabAxCvjACxH1uQ==", "dev": true, - "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "contains-path": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "debug": "2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.1", - "eslint-module-utils": "2.1.1", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "lodash.cond": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz" - }, "dependencies": { "debug": { "version": "2.6.8", @@ -3291,12 +2621,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", "integrity": "sha1-gN8yU8TXkBBF7If6ZgooTjK9yik=", "dev": true, - "requires": { - "ignore": "3.3.7", - "minimatch": "3.0.4", - "resolve": "1.4.0", - "semver": "5.3.0" - }, "dependencies": { "ignore": { "version": "3.3.7", @@ -3337,12 +2661,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", "integrity": "sha1-J3cKzzn1/UnNCvQIPOWBBOs5DUw=", - "dev": true, - "requires": { - "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "jsx-ast-utils": "1.4.1" - } + "dev": true }, "eslint-plugin-standard": { "version": "3.0.1", @@ -3354,11 +2673,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", - "dev": true, - "requires": { - "acorn": "5.1.1", - "acorn-jsx": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" - } + "dev": true }, "esprima": { "version": "4.0.0", @@ -3366,21 +2681,6 @@ "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", "dev": true }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } - }, - "estraverse": { - "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, "esutils": { "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" @@ -3394,10 +2694,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/ev-store/-/ev-store-7.0.0.tgz", "integrity": "sha1-GrDH+CE2UF3XSzHRdwHLK+bSZVg=", - "dev": true, - "requires": { - "individual": "3.0.0" - } + "dev": true }, "event-kit": { "version": "2.4.0", @@ -3407,54 +2704,27 @@ "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=" }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -3462,29 +2732,18 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" }, "kind-of": { "version": "5.1.0", @@ -3500,33 +2759,17 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=" }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" } } }, @@ -3535,48 +2778,20 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, "fast-glob": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-1.0.1.tgz", - "integrity": "sha1-MPmxEg/Ven8XI2SmRY+9vZgYezw=", - "requires": { - "bash-glob": "1.0.2", - "glob-parent": "3.1.0", - "micromatch": "3.1.9", - "readdir-enhanced": "1.5.2" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-MPmxEg/Ven8XI2SmRY+9vZgYezw=" }, "fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "requires": { - "bser": "2.0.0" - } + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=" }, "fbjs": { "version": "0.8.14", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.14.tgz", "integrity": "sha1-0dviviVMNakeCfMfnNUKQLKg7Rw=", - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "promise": "7.3.1", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.14" - }, "dependencies": { "core-js": { "version": "1.2.7", @@ -3588,22 +2803,12 @@ "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - } + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=" }, "find-up": { "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true }, "for-in": { "version": "1.0.2", @@ -3620,59 +2825,20 @@ "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.16" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - } - } - }, "formatio": { "version": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz" - } + "dev": true }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "0.2.2" - } + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=" }, "fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jsonfile": "4.0.0", - "universalify": "0.1.1" - } + "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=" }, "fs.realpath": { "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3682,12 +2848,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - }, "dependencies": { "rimraf": { "version": "2.6.2", @@ -3701,19 +2861,14 @@ }, "function-bind": { "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha512-rdjNZR1BePD6g5bTgalqkSN9eMuHgB2KHOBupLM8f5TblXwiV8nSY31dygkdwLNFn1m2KAkjFsREUuLNcU1rdg==", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", "dev": true }, "function.prototype.name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.0.3.tgz", - "integrity": "sha1-AJmuVXLp3W8DyX0CP9krzF5jnqw=", + "integrity": "sha512-5EblxZUdioXi2JiMZ9FUbwYj40eQ9MFHyzFLBSPdlRl3SO8l7SLWuAnQ/at/1Wi4hjJwME/C5WpF2ZfAc8nGNw==", "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "is-callable": "1.1.3" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -3742,9 +2897,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -3756,32 +2908,17 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=" }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, "dependencies": { "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "2.1.1" - } + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=" } } }, @@ -3794,11 +2931,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, - "requires": { - "min-document": "2.19.0", - "process": "0.5.2" - } + "dev": true }, "globals": { "version": "9.18.0", @@ -3818,9 +2951,6 @@ "version": "0.10.3", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.10.3.tgz", "integrity": "sha1-wxOv1VGOZzNRvuGPtj4qDkh0B6s=", - "requires": { - "iterall": "1.1.1" - }, "dependencies": { "iterall": { "version": "1.1.1", @@ -3834,82 +2964,29 @@ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - } - } - }, "has": { "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz" - } + "dev": true }, "has-ansi": { "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } - }, - "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=" }, "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, "dependencies": { "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=" } } }, @@ -3918,9 +2995,6 @@ "resolved": "https://registry.npmjs.org/hock/-/hock-1.3.2.tgz", "integrity": "sha1-btPovkK0ZnmBGNEhUKqA6NbvIhk=", "dev": true, - "requires": { - "deep-equal": "0.2.1" - }, "dependencies": { "deep-equal": { "version": "0.2.1", @@ -3938,34 +3012,22 @@ "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - } + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=" }, "hosted-git-info": { "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=" }, "htmlparser2": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.1", - "domutils": "1.5.1", - "entities": "1.1.1", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "2.3.3" - } + "dev": true }, "iconv-lite": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha1-I9hlaxaq5nQqwpcy6o8DNqR4nPI=" + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" }, "ignore": { "version": "3.3.3", @@ -3993,11 +3055,7 @@ }, "inflight": { "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" }, "inherits": { "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -4005,15 +3063,12 @@ }, "interpret": { "version": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha512-QZeLkTbMF2lgHs0JhQF8cCiJO8RSgBJ7b5ey6LIzAeiKWBZTD1LpsAXfqlONI3uw8VQS9YkQP647Fy0HRO54bA==", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", "dev": true }, "invariant": { "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha512-FUiAFCOgp7bBzHfa/fK+Uc/vqywvdN9Wg3CiTprLcE630mrhxjDS5MlBkHzeI6+bC/6bq9VX/hxBt05fPAT5WA==", - "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" - } + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=" }, "invert-kv": { "version": "1.0.0", @@ -4023,10 +3078,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "requires": { - "kind-of": "6.0.2" - } + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=" }, "is-arrayish": { "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4039,10 +3091,7 @@ }, "is-builtin-module": { "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" - } + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" }, "is-callable": { "version": "1.1.3", @@ -4053,10 +3102,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "requires": { - "kind-of": "6.0.2" - } + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=" }, "is-date-object": { "version": "1.0.1", @@ -4067,12 +3113,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=" }, "is-extendable": { "version": "0.1.1", @@ -4086,48 +3127,22 @@ }, "is-finite": { "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - } + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ=", - "dev": true + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=" }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -4141,9 +3156,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", - "requires": { - "is-number": "4.0.0" - }, "dependencies": { "is-number": { "version": "4.0.0", @@ -4155,19 +3167,13 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "requires": { - "isobject": "3.0.1" - } + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=" }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" - } + "dev": true }, "is-stream": { "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -4210,11 +3216,7 @@ }, "isomorphic-fetch": { "version": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "1.7.1", - "whatwg-fetch": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz" - } + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=" }, "isstream": { "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -4230,10 +3232,6 @@ "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", "dev": true, - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, "dependencies": { "commander": { "version": "0.6.1", @@ -4257,12 +3255,8 @@ "js-yaml": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", - "integrity": "sha1-CHdc69/dNZIJ8NKs04PI+GppBKA=", - "dev": true, - "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "esprima": "4.0.0" - } + "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", + "dev": true }, "jsbn": { "version": "0.1.1", @@ -4279,19 +3273,11 @@ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, "json-stable-stringify": { "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, - "optional": true, - "requires": { - "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" - } + "optional": true }, "json-stringify-safe": { "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -4310,10 +3296,7 @@ "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" - } + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=" }, "jsonify": { "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -4325,12 +3308,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -4348,10 +3325,7 @@ "keytar": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-4.1.0.tgz", - "integrity": "sha1-njkz5InWVt4aho4Sk3CTEwRJidc=", - "requires": { - "nan": "2.5.1" - } + "integrity": "sha512-L3KqiSMtpVitlug4uuI+K5XLne9SAVEFWE8SCQIhQiH0IA/CTbon5v5prVLKK0Ken54o2O8V9HceKagpwJum+Q==" }, "kind-of": { "version": "6.0.2", @@ -4361,45 +3335,25 @@ "lazy-cache": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "0.1.0" - } + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=" }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" - } + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" }, "less": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", "dev": true, - "requires": { - "errno": "0.1.4", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "image-size": "0.5.5", - "mime": "1.4.1", - "mkdirp": "0.5.1", - "promise": "7.3.1", - "request": "2.81.0", - "source-map": "0.5.7" - }, "dependencies": { "ajv": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - } + "optional": true }, "assert-plus": { "version": "0.2.0", @@ -4419,20 +3373,14 @@ "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" - } + "dev": true }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } + "optional": true }, "form-data": { "version": "2.1.4", @@ -4440,11 +3388,6 @@ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.16" - }, "dependencies": { "combined-stream": { "version": "1.0.6", @@ -4470,24 +3413,14 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } + "optional": true }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } + "optional": true }, "hoek": { "version": "2.16.3", @@ -4500,12 +3433,7 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } + "optional": true }, "mime": { "version": "1.4.1", @@ -4534,30 +3462,6 @@ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dev": true, "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "caseless": "0.12.0", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "2.1.16", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - }, "dependencies": { "combined-stream": { "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", @@ -4584,10 +3488,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } + "optional": true }, "source-map": { "version": "0.5.7", @@ -4600,29 +3501,7 @@ }, "load-json-file": { "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=" }, "lodash": { "version": "4.17.5", @@ -4632,11 +3511,7 @@ "lodash._baseassign": { "version": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" - } + "dev": true }, "lodash._basecopy": { "version": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", @@ -4672,18 +3547,13 @@ }, "lodash.cond": { "version": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha512-RWjUhzGbzG/KfDwk+onqdXvrsNv47G9UCMJgSKalPTSqJQyxZhQophG9jgqLf+15TIbZ5a/yG2YKOWsH3dVy9A==", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, "lodash.create": { "version": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "lodash._basecreate": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "lodash._isiterateecall": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" - } + "dev": true }, "lodash.defaults": { "version": "4.2.0", @@ -4727,12 +3597,7 @@ "lodash.keys": { "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "lodash.isarguments": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" - } + "dev": true }, "lodash.map": { "version": "4.6.0", @@ -4782,10 +3647,7 @@ }, "loose-envify": { "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "3.0.2" - } + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=" }, "lru-cache": { "version": "2.7.3", @@ -4801,55 +3663,27 @@ "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "1.0.1" - } + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=" }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "1.2.0" - } + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=" }, "micromatch": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", "integrity": "sha1-FdyTF1rjnlLpMIeEcJbv/HPvz4k=", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, @@ -4863,10 +3697,7 @@ "version": "2.1.16", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", - "dev": true, - "requires": { - "mime-db": "1.29.0" - } + "dev": true }, "mimic-fn": { "version": "1.2.0", @@ -4877,34 +3708,21 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "0.1.1" - } + "dev": true }, "minimatch": { "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "1.1.8" - } + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=" }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, @@ -4912,9 +3730,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, "dependencies": { "minimist": { "version": "0.0.8", @@ -4928,19 +3743,6 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", "dev": true, - "requires": { - "browser-stdout": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "commander": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "debug": "2.6.0", - "diff": "3.2.0", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "glob": "7.1.1", - "growl": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "lodash.create": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, "dependencies": { "debug": { "version": "2.6.0", @@ -4987,9 +3789,6 @@ "resolved": "https://registry.npmjs.org/mocha-appveyor-reporter/-/mocha-appveyor-reporter-0.4.0.tgz", "integrity": "sha1-gpOC/8Bla2Z+e+ZQoJSgba69Uk8=", "dev": true, - "requires": { - "request-json": "0.6.3" - }, "dependencies": { "depd": { "version": "1.1.2", @@ -5014,12 +3813,6 @@ "resolved": "https://registry.npmjs.org/mocha-junit-and-console-reporter/-/mocha-junit-and-console-reporter-1.6.0.tgz", "integrity": "sha1-kBmEuev51g9xXvDo4EwG5KsSJFc=", "dev": true, - "requires": { - "debug": "2.6.8", - "mkdirp": "0.5.1", - "mocha": "2.5.3", - "xml": "1.0.1" - }, "dependencies": { "commander": { "version": "2.3.0", @@ -5052,48 +3845,25 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "0.3.0" - } + "dev": true }, "minimatch": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } + "dev": true }, "mocha": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", "dev": true, - "requires": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "jade": "0.26.3", - "mkdirp": "0.5.1", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" - }, "dependencies": { "debug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } + "dev": true }, "ms": { "version": "0.7.1", @@ -5147,37 +3917,16 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, @@ -5195,11 +3944,7 @@ "node-fetch": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", - "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", - "requires": { - "encoding": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - } + "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==" }, "node-int64": { "version": "0.4.0", @@ -5208,30 +3953,18 @@ }, "normalize-package-data": { "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", - "requires": { - "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "semver": "5.4.1", - "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" - } + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=" }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "2.0.1" - } + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=" }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "1.0.0" - } + "dev": true }, "number-is-nan": { "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -5249,45 +3982,26 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - } + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=" }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - } + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=" }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, "dependencies": { "kind-of": { "version": "5.1.0", @@ -5299,10 +4013,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -5321,21 +4032,13 @@ "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "3.0.1" - } + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=" }, "object.assign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "object-keys": "1.0.11" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -5350,12 +4053,6 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0", - "function-bind": "1.1.1", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -5368,22 +4065,13 @@ "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "3.0.1" - } + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=" }, "object.values": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0", - "function-bind": "1.1.1", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -5395,18 +4083,12 @@ }, "once": { "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" }, "optimist": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "requires": { - "wordwrap": "0.0.3" - } + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=" }, "os-homedir": { "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -5415,12 +4097,7 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=" }, "os-tmpdir": { "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -5431,33 +4108,9 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "1.2.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "parse-json": { "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" - } + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" }, "pascalcase": { "version": "0.1.1", @@ -5473,10 +4126,7 @@ "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": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } + "dev": true }, "path-is-absolute": { "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -5496,9 +4146,6 @@ "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "dev": true, - "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "dependencies": { "isarray": { "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -5509,16 +4156,7 @@ }, "path-type": { "version": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" }, "pify": { "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -5532,18 +4170,12 @@ "pinkie-promise": { "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - } + "dev": true }, "pkg-dir": { "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" - } + "dev": true }, "posix-character-classes": { "version": "0.1.1", @@ -5563,7 +4195,7 @@ }, "process-nextick-args": { "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "progress": { @@ -5574,20 +4206,12 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", - "requires": { - "asap": "2.0.6" - } + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=" }, "prop-types": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", "integrity": "sha1-NmREU1ZCVd3aORGR+zoSXL32VMo=", - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - }, "dependencies": { "core-js": { "version": "1.2.7", @@ -5649,81 +4273,44 @@ "dev": true, "optional": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", - "dev": true - }, "react": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", - "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", - "requires": { - "create-react-class": "15.6.2", - "fbjs": "0.8.14", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "prop-types": "15.6.1" - } + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=" }, "react-dom": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", - "requires": { - "fbjs": "0.8.14", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "prop-types": "15.6.1" - } + "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=" + }, + "react-input-autosize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz", + "integrity": "sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==" }, "react-relay": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/react-relay/-/react-relay-1.4.1.tgz", - "integrity": "sha1-Yfe1gC1wRG4VRJD50PzuyRUOvaU=", - "requires": { - "babel-runtime": "6.25.0", - "fbjs": "0.8.14", - "prop-types": "15.6.1", - "relay-runtime": "1.4.1" - } + "integrity": "sha1-Yfe1gC1wRG4VRJD50PzuyRUOvaU=" + }, + "react-select": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-1.2.1.tgz", + "integrity": "sha512-vaCgT2bEl+uTyE/uKOEgzE5Dc/wLtzhnBvoHCeuLoJWc4WuadN6WQDhoL42DW+TziniZK2Gaqe/wUXydI3NSaQ==" }, "react-test-renderer": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-15.6.2.tgz", "integrity": "sha1-0DM0NPwsQ4CSaWyncNpe1IA376g=", - "dev": true, - "requires": { - "fbjs": "0.8.14", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } + "dev": true }, "read-pkg": { "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "path-type": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" - } + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" }, "read-pkg-up": { "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz" - }, "dependencies": { "find-up": { "version": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -5737,65 +4324,37 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true }, "readdir-enhanced": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz", - "integrity": "sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=", - "requires": { - "call-me-maybe": "1.0.1", - "es6-promise": "4.2.4", - "glob-to-regexp": "0.3.0" - } + "integrity": "sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=" }, "rechoir": { "version": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.4.0" - } + "dev": true }, "regenerator-runtime": { "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, @@ -5803,24 +4362,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-1.4.1.tgz", "integrity": "sha1-EOg/D13o2z0ACFGkwOQ1590d65U=", - "requires": { - "babel-generator": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-preset-fbjs": "2.1.4", - "babel-runtime": "6.25.0", - "babel-traverse": "6.26.0", - "babel-types": "6.25.0", - "babylon": "6.18.0", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "fast-glob": "1.0.1", - "fb-watchman": "2.0.0", - "fbjs": "0.8.14", - "graphql": "0.11.7", - "immutable": "3.7.6", - "relay-runtime": "1.4.1", - "signedsource": "1.0.0", - "yargs": "9.0.1" - }, "dependencies": { "babel-code-frame": { "version": "6.26.0", @@ -5878,10 +4419,7 @@ "graphql": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=", - "requires": { - "iterall": "1.1.3" - } + "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=" }, "invariant": { "version": "2.2.3", @@ -5906,12 +4444,7 @@ "relay-runtime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-1.4.1.tgz", - "integrity": "sha1-+I3NCkInAKBFY/KR9XDkzjaONtA=", - "requires": { - "babel-runtime": "6.25.0", - "fbjs": "0.8.14", - "relay-debugger-react-native-runtime": "0.0.10" - } + "integrity": "sha1-+I3NCkInAKBFY/KR9XDkzjaONtA=" }, "repeat-element": { "version": "1.1.2", @@ -5925,214 +4458,7 @@ }, "repeating": { "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" - } - }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - } - } + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" }, "require-directory": { "version": "2.1.1", @@ -6147,11 +4473,8 @@ "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", - "dev": true, - "requires": { - "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" - } + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true }, "resolve-url": { "version": "0.2.1", @@ -6165,11 +4488,8 @@ }, "rimraf": { "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha512-5QIcndZ8am2WyseL6lln/utl51SwRBQs/at+zi1UnhsnPyZcAID+g0PZrKdb+kJn2fo/CwgyJweR8sP36Jer5g==", - "dev": true, - "requires": { - "glob": "7.1.2" - } + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true }, "safe-buffer": { "version": "5.1.1", @@ -6179,20 +4499,17 @@ "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "0.1.15" - } + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=" }, "samsam": { "version": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", - "integrity": "sha512-LYfDHJWc/TF9xgJXZC+10mqbb85wSyFAVRF5LLHQTYd7DCe7WpVpwmnVa5TQO2gMQ0s8D2VQVOdp5P36Km4uzw==", + "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=", "dev": true }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" }, "set-blocking": { "version": "2.0.0", @@ -6202,21 +4519,12 @@ "set-getter": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "requires": { - "to-object-path": "0.3.0" - } + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=" }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - } + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=" }, "setimmediate": { "version": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -6225,10 +4533,7 @@ "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "1.0.0" - } + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=" }, "shebang-regex": { "version": "1.0.0", @@ -6239,12 +4544,7 @@ "version": "0.7.8", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "rechoir": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - } + "dev": true }, "sigmund": { "version": "1.0.1", @@ -6273,16 +4573,6 @@ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.3.6.tgz", "integrity": "sha1-lTeOfg+XapcS6bRZH/WznnPcPd4=", "dev": true, - "requires": { - "diff": "3.2.0", - "formatio": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "lolex": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "native-promise-only": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "samsam": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", - "text-encoding": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "type-detect": "4.0.3" - }, "dependencies": { "type-detect": { "version": "4.0.3", @@ -6301,16 +4591,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", - "requires": { - "base": "0.11.2", - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "source-map-resolve": "0.5.1", - "use": "2.0.2" - }, "dependencies": { "define-property": { "version": "0.2.5", @@ -6377,19 +4657,11 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" } } }, @@ -6397,43 +4669,27 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, "source-map": { "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==" + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" }, "source-map-resolve": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=", - "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" - } + "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=" }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", - "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" - } + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=" }, "source-map-url": { "version": "0.4.0", @@ -6443,10 +4699,7 @@ "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "requires": { - "spdx-license-ids": "1.2.2" - } + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=" }, "spdx-expression-parse": { "version": "1.0.4", @@ -6461,35 +4714,22 @@ "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=", - "requires": { - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - } + "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=" }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "requires": { - "extend-shallow": "3.0.2" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, @@ -6503,16 +4743,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "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", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -6525,34 +4755,21 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -6560,29 +4777,18 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" }, "kind-of": { "version": "5.1.0", @@ -6591,6 +4797,12 @@ } } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true + }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -6601,10 +4813,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, "dependencies": { "ansi-regex": { "version": "3.0.0", @@ -6626,25 +4834,13 @@ } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, "stringstream": { "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "strip-ansi": { "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" }, "strip-bom": { "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -6662,21 +4858,12 @@ "tar": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=" }, "temp": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" - }, "dependencies": { "os-tmpdir": { "version": "1.0.2", @@ -6714,10 +4901,7 @@ "version": "0.0.31", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - } + "dev": true }, "to-fast-properties": { "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -6733,17 +4917,11 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -6751,40 +4929,23 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - } + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=" }, "tree-kill": { "version": "1.2.0", @@ -6798,10 +4959,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" }, "tweetnacl": { "version": "0.14.5", @@ -6818,23 +4976,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, "dependencies": { "set-value": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=" } } }, @@ -6847,28 +4993,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=" } } }, @@ -6888,11 +5022,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", - "requires": { - "define-property": "0.2.5", - "isobject": "3.0.1", - "lazy-cache": "2.0.2" - }, "dependencies": { "define-property": { "version": "0.2.5", @@ -6963,25 +5092,16 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, "validate-npm-package-license": { "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha512-VD0zBfAttoSxzPa+I+rF6ckOEEPSbifYNTSgRW5BsyfaD7gSE/uge00r2Xqa0d/yhF1MyHnMPHqLUdQRNimR2A==", - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=" }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "extsprintf": "1.3.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -6994,17 +5114,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/virtual-dom/-/virtual-dom-2.1.1.tgz", "integrity": "sha1-gO2i1IG57eDASRGM78tKBfIdE3U=", - "dev": true, - "requires": { - "browser-split": "0.0.1", - "error": "4.4.0", - "ev-store": "7.0.0", - "global": "4.3.2", - "is-object": "1.0.1", - "next-tick": "0.2.2", - "x-is-array": "0.1.0", - "x-is-string": "0.1.0" - } + "dev": true }, "what-the-diff": { "version": "0.4.0", @@ -7014,10 +5124,7 @@ "what-the-status": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/what-the-status/-/what-the-status-1.0.3.tgz", - "integrity": "sha1-lP3NAR/7U6Ijnnb6+NrL78mHdRA=", - "requires": { - "split": "1.0.1" - } + "integrity": "sha1-lP3NAR/7U6Ijnnb6+NrL78mHdRA=" }, "whatwg-fetch": { "version": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", @@ -7026,10 +5133,7 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", - "requires": { - "isexe": "2.0.0" - } + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=" }, "which-module": { "version": "2.0.0", @@ -7045,10 +5149,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - }, "dependencies": { "string-width": { "version": "1.0.2", @@ -7095,38 +5195,15 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, "yargs": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "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": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "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" - } + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=" }, "yargs-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "requires": { - "camelcase": "4.1.0" - } + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=" }, "yubikiri": { "version": "1.0.0", diff --git a/package.json b/package.json index 8e60635c6c..6a09540c6f 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "react": "^15.6.1", "react-dom": "^15.6.1", "react-relay": "1.4.1", + "react-select": "^1.2.1", "relay-compiler": "1.4.1", "relay-runtime": "1.4.1", "temp": "^0.8.3", From ca62c09bce432de83132c25594aa84a5c6df8a1b Mon Sep 17 00:00:00 2001 From: simurai Date: Mon, 5 Mar 2018 13:22:43 +0900 Subject: [PATCH 0027/5422] Add co-author toggle button --- lib/views/commit-view.js | 18 ++++++++++++++++++ styles/commit-view.less | 24 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index 1d60ab0aca..0d6780c968 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -98,6 +98,16 @@ export default class CommitView extends React.Component { didChange={this.didChangeCommitMessage} didChangeCursorPosition={this.didMoveCursor} /> + + this.refCoAuthorToggle} + title="Toggle co-authors" + /> - { this.refCoAuthorSelect = c; }} + className="github-CommitView-coAuthorEditor input-textarea native-key-bindings" + placeholder="Co-Authors" + arrowRenderer={null} + options={this.props.mentionableUsers} + labelKey="name" + valueKey="email" + filterOptions={this.matchAuthors} + optionRenderer={this.renderCoAuthorListItem} + valueRenderer={this.renderCoAuthorValue} + onChange={this.onSelectedCoAuthorsChanged} + value={this.state.selectedCoAuthors} + multi={true} + /> + ); + } + renderHardWrapIcon() { const singleLineMessage = this.editor && this.editor.getText().split(LINE_ENDING_REGEX).length === 1; const hardWrap = this.props.config.get('github.automaticCommitMessageWrapping'); @@ -298,6 +311,13 @@ export default class CommitView extends React.Component { this.props.config.set('github.automaticCommitMessageWrapping', !currentSetting); } + @autobind + toggleCoAuthorInput() { + this.setState({ + showCoAuthorInput: !this.state.showCoAuthorInput + }) + } + @autobind abortMerge() { this.props.abortMerge(); From c9f50ce94429997a2f88b28803c201008677302e Mon Sep 17 00:00:00 2001 From: Markus Olsson Date: Fri, 16 Mar 2018 17:45:32 +0100 Subject: [PATCH 0061/5422] Conditionally render author fields Co-Authored-By: Katrina Uychaco --- lib/views/commit-view.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index 008e7182c8..d9c916a975 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -407,12 +407,23 @@ export default class CommitView extends React.Component { .filter(x => `${x.name}${x.login}${x.email}`.toLowerCase().indexOf(filterText.toLowerCase()) !== -1); } + renderCoAuthorListItemField(fieldName, value) { + if (!value || value.length === 0) { + return null + } + + return ( + {value} + ) + } + + @autobind renderCoAuthorListItem(author) { return (
- {author.login} - {author.name} - {author.email} + {this.renderCoAuthorListItemField('username', author.login)} + {this.renderCoAuthorListItemField('name', author.name)} + {this.renderCoAuthorListItemField('email', author.email)}
); } From 0f4a5000575e12614d155f0edaa10e9f0545feba Mon Sep 17 00:00:00 2001 From: Markus Olsson Date: Fri, 16 Mar 2018 17:45:45 +0100 Subject: [PATCH 0062/5422] Style select list items based on position Co-Authored-By: Katrina Uychaco --- styles/commit-view.less | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/styles/commit-view.less b/styles/commit-view.less index 200cffc8d4..efb2bd059c 100644 --- a/styles/commit-view.less +++ b/styles/commit-view.less @@ -158,19 +158,24 @@ color: white; background-color: @background-color-info; - .github-CommitView-coAuthorEditor-username, - .github-CommitView-coAuthorEditor-name { + .github-CommitView-coAuthorEditor-selectListItem > span { color: inherit; } } } - &-username { - font-weight: 600; - margin-right: .75em; - color: @text-color-highlight; - } - &-name { - color: @text-color-subtle; + + &-selectListItem { + &> span:first-child { + font-weight: 600; + color: @text-color-highlight; + } + &> span { + color: @text-color-subtle; + margin-right: .75em; + } + &> span:last-child { + margin-right: 0; + } } } From bcd360df4694289d61a18260f500f6f9b3604fe1 Mon Sep 17 00:00:00 2001 From: Markus Olsson Date: Fri, 16 Mar 2018 17:46:28 +0100 Subject: [PATCH 0063/5422] Truncate autocomplete items Co-Authored-By: Katrina Uychaco --- styles/commit-view.less | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/styles/commit-view.less b/styles/commit-view.less index efb2bd059c..d81fafdd39 100644 --- a/styles/commit-view.less +++ b/styles/commit-view.less @@ -165,6 +165,10 @@ } &-selectListItem { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + &> span:first-child { font-weight: 600; color: @text-color-highlight; From 3510fbd231c92bc5b0d0a03d6a650a1be9580b91 Mon Sep 17 00:00:00 2001 From: Markus Olsson Date: Fri, 16 Mar 2018 17:50:36 +0100 Subject: [PATCH 0064/5422] :fire: whitespace Co-Authored-By: Katrina Uychaco --- styles/commit-view.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/styles/commit-view.less b/styles/commit-view.less index d81fafdd39..615199ad43 100644 --- a/styles/commit-view.less +++ b/styles/commit-view.less @@ -168,7 +168,7 @@ text-overflow: ellipsis; white-space: nowrap; overflow: hidden; - + &> span:first-child { font-weight: 600; color: @text-color-highlight; From f68d63a5bf28d7c4c0786df95b8aa2e6c0223c33 Mon Sep 17 00:00:00 2001 From: Markus Olsson Date: Fri, 16 Mar 2018 18:33:38 +0100 Subject: [PATCH 0065/5422] Bump dugite for --trailers unfold,only support Co-Authored-By: Katrina Uychaco --- package-lock.json | 2395 ++++++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 1926 insertions(+), 471 deletions(-) diff --git a/package-lock.json b/package-lock.json index c3c62441dd..bd4eee7132 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,6 +2,7 @@ "name": "github", "version": "0.12.0", "lockfileVersion": 1, + "requires": true, "dependencies": { "7zip": { "version": "0.0.6", @@ -12,13 +13,16 @@ "acorn": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", + "integrity": "sha1-U/4WERH5EquZnuiHqQoLxSgi/XU=", "dev": true }, "acorn-jsx": { "version": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, + "requires": { + "acorn": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" + }, "dependencies": { "acorn": { "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", @@ -27,6 +31,17 @@ } } }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, "ansi-regex": { "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" @@ -70,6 +85,11 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -93,19 +113,32 @@ "atom-babel6-transpiler": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/atom-babel6-transpiler/-/atom-babel6-transpiler-1.1.3.tgz", - "integrity": "sha1-1wKxDpDrzx+R4apcSnm5zqmKm6Y=" + "integrity": "sha1-1wKxDpDrzx+R4apcSnm5zqmKm6Y=", + "requires": { + "babel-core": "6.26.0" + } }, "atom-mocha-test-runner": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/atom-mocha-test-runner/-/atom-mocha-test-runner-1.2.0.tgz", "integrity": "sha1-qPZQm40pqAn8tv9H8FiEthLNxqk=", "dev": true, + "requires": { + "etch": "0.8.0", + "grim": "2.0.2", + "less": "2.7.3", + "mocha": "3.4.2", + "tmp": "0.0.31" + }, "dependencies": { "etch": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/etch/-/etch-0.8.0.tgz", "integrity": "sha1-VPYZV0NG+KPueXP1T7vQG1YnItY=", - "dev": true + "dev": true, + "requires": { + "virtual-dom": "2.1.1" + } }, "grim": { "version": "2.0.2", @@ -118,6 +151,11 @@ } } }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, "aws4": { "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" @@ -130,6 +168,27 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.8", + "json5": "0.5.1", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + }, "dependencies": { "babel-code-frame": { "version": "6.26.0", @@ -210,6 +269,12 @@ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4" + }, "dependencies": { "ansi-regex": { "version": "2.1.1", @@ -289,6 +354,16 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" + }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -326,6 +401,11 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" + }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -358,6 +438,12 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -382,41 +468,78 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" } } }, "babel-helper-function-name": { "version": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=" + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "babel-runtime": "6.25.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } }, "babel-helper-get-function-arity": { "version": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=" + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "6.25.0", + "babel-types": "6.25.0" + } }, "babel-helper-optimise-call-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=" + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "6.25.0", + "babel-types": "6.25.0" + } }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=" + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-runtime": "6.25.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } }, "babel-helper-replace-supers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=" + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "6.25.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=" + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "6.25.0", + "babel-template": "6.25.0" + } }, "babel-messages": { "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=" + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-chai-assert-async": { "version": "0.1.0", @@ -426,17 +549,28 @@ "babel-plugin-check-es2015-constants": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=" + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-relay": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-relay/-/babel-plugin-relay-1.4.1.tgz", "integrity": "sha1-isVivLH9KzVl0nGqztMr5CyCc1M=", + "requires": { + "babel-runtime": "6.25.0", + "babel-types": "6.25.0", + "graphql": "0.11.7" + }, "dependencies": { "graphql": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=" + "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=", + "requires": { + "iterall": "1.1.3" + } } } }, @@ -473,12 +607,23 @@ "babel-plugin-transform-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=" + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-class-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.25.0", + "babel-template": "6.25.0" + }, "dependencies": { "babel-helper-function-name": { "version": "6.24.1", @@ -512,6 +657,11 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz", "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", + "requires": { + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.25.0", + "babel-template": "6.25.0" + }, "dependencies": { "babel-plugin-syntax-decorators": { "version": "6.13.0", @@ -523,17 +673,30 @@ "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=" + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=" + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-es2015-block-scoping": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + }, "dependencies": { "babel-code-frame": { "version": "6.26.0", @@ -596,7 +759,7 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" }, "invariant": { "version": "2.2.3", @@ -609,44 +772,79 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" } } }, "babel-plugin-transform-es2015-classes": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=" + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "6.25.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=" + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "6.25.0", + "babel-template": "6.25.0" + } }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=" + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=" + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-es2015-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=" + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "babel-runtime": "6.25.0", + "babel-types": "6.25.0" + } }, "babel-plugin-transform-es2015-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=" + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-es2015-modules-commonjs": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + }, "dependencies": { "babel-code-frame": { "version": "6.26.0", @@ -721,12 +919,24 @@ "babel-plugin-transform-es2015-object-super": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=" + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-es2015-parameters": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.25.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + }, "dependencies": { "babel-helper-call-delegate": { "version": "6.24.1", @@ -762,37 +972,61 @@ "babel-plugin-transform-es2015-shorthand-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=" + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "6.25.0", + "babel-types": "6.25.0" + } }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=" + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=" + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-es3-member-expression-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz", - "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=" + "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-es3-property-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz", - "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=" + "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-flow-strip-types": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=" + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -813,22 +1047,39 @@ "babel-plugin-transform-react-display-name": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=" + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "requires": { + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=" + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "requires": { + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.25.0" + } }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=" + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "6.25.0", + "babel-types": "6.25.0" + } }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.5.0", + "regenerator-runtime": "0.10.5" + }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -856,12 +1107,50 @@ "babel-preset-fbjs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-2.1.4.tgz", - "integrity": "sha1-IvNY5mVAc6z2HkegUqd317zPA68=" + "integrity": "sha1-IvNY5mVAc6z2HkegUqd317zPA68=", + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-plugin-syntax-flow": "6.18.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-class-properties": "6.24.1", + "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-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-commonjs": "6.26.0", + "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-template-literals": "6.22.0", + "babel-plugin-transform-es3-member-expression-literals": "6.22.0", + "babel-plugin-transform-es3-property-literals": "6.22.0", + "babel-plugin-transform-flow-strip-types": "6.22.0", + "babel-plugin-transform-object-rest-spread": "6.26.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1" + } }, "babel-preset-react": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" + }, "dependencies": { "babel-helper-builder-react-jsx": { "version": "6.26.0", @@ -987,6 +1276,15 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.0", + "home-or-tmp": "2.0.0", + "lodash": "4.17.5", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + }, "dependencies": { "babel-runtime": { "version": "6.26.0", @@ -1007,22 +1305,50 @@ "babel-runtime": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=" + "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", + "requires": { + "core-js": "2.5.0", + "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" + } }, "babel-template": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=" + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "requires": { + "babel-runtime": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "lodash": "4.17.5" + } }, "babel-traverse": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=" + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", + "requires": { + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "debug": "2.6.8", + "globals": "9.18.0", + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "lodash": "4.17.5" + } }, "babel-types": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "requires": { + "babel-runtime": "6.25.0", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "lodash": "4.17.5", + "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" + } }, "babylon": { "version": "6.17.4", @@ -1038,34 +1364,57 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } } } }, "bash-glob": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bash-glob/-/bash-glob-1.0.2.tgz", - "integrity": "sha1-laxWMf3XqPxWnyZxZ6hOuDGXmhs=" + "integrity": "sha1-laxWMf3XqPxWnyZxZ6hOuDGXmhs=", + "requires": { + "async-each": "1.0.1", + "bash-path": "1.0.3", + "component-emitter": "1.2.1", + "cross-spawn": "5.1.0", + "extend-shallow": "2.0.1", + "is-extglob": "2.1.1", + "is-glob": "4.0.0" + } }, "bash-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bash-path/-/bash-path-1.0.3.tgz", - "integrity": "sha1-28nvvfGLHBFBPctZuWDmqlbIQlg=" + "integrity": "sha1-28nvvfGLHBFBPctZuWDmqlbIQlg=", + "requires": { + "arr-union": "3.1.0", + "is-windows": "1.0.2" + } }, "bcrypt-pbkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=" + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } }, "boolbase": { "version": "1.0.0", @@ -1073,20 +1422,49 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.1" + } + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=" + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } }, "braces": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.1", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } } } }, @@ -1104,7 +1482,10 @@ "bser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=" + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "requires": { + "node-int64": "0.4.0" + } }, "builtin-modules": { "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1113,7 +1494,18 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=" + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } }, "call-me-maybe": { "version": "1.0.1", @@ -1141,6 +1533,11 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", "dev": true, + "requires": { + "assertion-error": "1.1.0", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + }, "dependencies": { "assertion-error": { "version": "1.1.0", @@ -1181,23 +1578,62 @@ }, "chalk": { "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + } }, "checksum": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/checksum/-/checksum-0.1.1.tgz", - "integrity": "sha1-3GUn1MkL6FYNvR7Uzs8yl9Uo6ek=" + "integrity": "sha1-3GUn1MkL6FYNvR7Uzs8yl9Uo6ek=", + "requires": { + "optimist": "0.3.7" + } }, "cheerio": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "dev": true + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash.assignin": "4.2.0", + "lodash.bind": "4.2.1", + "lodash.defaults": "4.2.0", + "lodash.filter": "4.6.0", + "lodash.flatten": "4.4.0", + "lodash.foreach": "4.5.0", + "lodash.map": "4.6.0", + "lodash.merge": "4.6.0", + "lodash.pick": "4.4.0", + "lodash.reduce": "4.6.0", + "lodash.reject": "4.6.0", + "lodash.some": "4.6.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, "dependencies": { "define-property": { "version": "0.2.5", @@ -1208,11 +1644,17 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, @@ -1220,11 +1662,17 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, @@ -1249,14 +1697,17 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "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=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" } } @@ -1270,12 +1721,27 @@ "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=" + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "1.0.0" + } }, "commander": { "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true + "dev": true, + "requires": { + "graceful-readlink": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + } }, "compare-sets": { "version": "1.0.1", @@ -1323,21 +1789,27 @@ "create-react-class": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", - "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=" + "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", + "requires": { + "fbjs": "0.8.14", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + }, "dependencies": { "lru-cache": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==" } } }, @@ -1347,11 +1819,35 @@ "integrity": "sha1-UYO8R6CVWb78+YzEZXlkmZNZNy8=", "dev": true }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.1" + } + } + } + }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } }, "css-what": { "version": "2.1.0", @@ -1363,6 +1859,9 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -1374,7 +1873,10 @@ "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } }, "decamelize": { "version": "1.2.0", @@ -1396,16 +1898,32 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=" + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "detect-indent": { "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=" + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + } }, "diff": { "version": "3.2.0", @@ -1422,6 +1940,10 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, "dependencies": { "domelementtype": { "version": "1.1.3", @@ -1447,7 +1969,10 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", - "dev": true + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } }, "dompurify": { "version": "1.0.3", @@ -1458,203 +1983,52 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } }, "dugite": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/dugite/-/dugite-1.49.0.tgz", - "integrity": "sha1-b1zkraF0jwyL+bCOYj9foZKYA0w=", - "dependencies": { - "ajv": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", - "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=", - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.17" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.3.0", - "har-schema": "2.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha1-ctnQdU9/4lyi0BrY+PmpRJqJUm0=" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=" - }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "2.1.17", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - } - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=", - "requires": { - "hoek": "4.2.0" - } - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - } - } + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/dugite/-/dugite-1.60.0.tgz", + "integrity": "sha512-HP5Qfx867ESOkrrEhXtxi72UQoNWaCSEcahGCmnBM/v+ldgbFu94s9CvG3tDcBtz1HJkvYEtkBd8V8Vb63nfUw==", + "requires": { + "checksum": "0.1.1", + "mkdirp": "0.5.1", + "progress": "2.0.0", + "request": "2.85.0", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "tar": "4.4.0" } }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true + "optional": true, + "requires": { + "jsbn": "0.1.1" + } }, "electron-devtools-installer": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-2.2.3.tgz", "integrity": "sha1-WLmk7FBzd7xG4JHNQ3FBiODDab4=", - "dev": true + "dev": true, + "requires": { + "7zip": "0.0.6", + "cross-unzip": "0.0.2", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "semver": "5.4.1" + } }, "encoding": { "version": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=" + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.18" + } }, "entities": { "version": "1.1.1", @@ -1666,30 +2040,60 @@ "version": "2.9.1", "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-2.9.1.tgz", "integrity": "sha1-B9XOaRJBJA+4F78sSxjW5TAkDfY=", - "dev": true + "dev": true, + "requires": { + "cheerio": "0.22.0", + "function.prototype.name": "1.0.3", + "is-subset": "0.1.1", + "lodash": "4.17.5", + "object-is": "1.0.1", + "object.assign": "4.0.4", + "object.entries": "1.0.4", + "object.values": "1.0.4", + "prop-types": "15.6.1", + "uuid": "3.1.0" + } }, "errno": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", "dev": true, - "optional": true + "optional": true, + "requires": { + "prr": "0.0.0" + } }, "error": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/error/-/error-4.4.0.tgz", "integrity": "sha1-v2n/JR+0onnBmtzNqmth6Q2b8So=", - "dev": true + "dev": true, + "requires": { + "camelize": "1.0.0", + "string-template": "0.2.1", + "xtend": "4.0.1" + } }, "error-ex": { "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + } }, "es-abstract": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", - "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", + "integrity": "sha1-aQgpoHyuNrIi5/2bdcDQVz6yUic=", "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -1703,7 +2107,12 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } }, "es6-promise": { "version": "4.2.4", @@ -1719,6 +2128,43 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.1", + "debug": "2.6.8", + "doctrine": "2.1.0", + "escope": "3.6.0", + "espree": "3.5.0", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.3", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.17.2", + "is-resolvable": "1.1.0", + "js-yaml": "3.9.1", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.5", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, "dependencies": { "ajv": { "version": "4.11.8", @@ -1850,10 +2296,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.26" - } + "dev": true }, "deep-is": { "version": "0.1.3", @@ -1915,7 +2358,6 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.26", "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", @@ -1929,7 +2371,6 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.26", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -1941,8 +2382,7 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.26" + "d": "1.0.0" } }, "es6-weak-map": { @@ -1952,7 +2392,6 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.26", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } @@ -1971,7 +2410,6 @@ "requires": { "es6-map": "0.1.5", "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", "estraverse": "4.2.0" } }, @@ -2002,8 +2440,7 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.26" + "d": "1.0.0" } }, "exit-hook": { @@ -2044,7 +2481,6 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", "del": "2.2.2", "graceful-fs": "4.1.11", "write": "0.2.1" @@ -2144,7 +2580,6 @@ "requires": { "generate-function": "2.0.0", "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", "jsonpointer": "4.0.1", "xtend": "4.0.1" } @@ -2553,7 +2988,11 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", "integrity": "sha1-q67IJBd2E7ipWymWOeG2+s9HNEk=", - "dev": true + "dev": true, + "requires": { + "debug": "2.6.8", + "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + } }, "eslint-plugin-babel": { "version": "4.1.2", @@ -2565,13 +3004,28 @@ "version": "2.34.1", "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.1.tgz", "integrity": "sha512-xwXpTW7Xv+wfuQdfPILmFl9HWBdWbDjE1aZWWQ4EgCpQtMzymEkDQfyD1ME0VA8C0HTXV7cufypQRvLi+Hk/og==", - "dev": true + "dev": true, + "requires": { + "lodash": "4.17.5" + } }, "eslint-plugin-import": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.6.1.tgz", "integrity": "sha512-aAMb32eHCQaQmgdb1MOG1hfu/rPiNgGur2IF71VJeDfTXdLpPiKALKWlzxMdcxQOZZ2CmYVKabAxCvjACxH1uQ==", "dev": true, + "requires": { + "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "contains-path": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "debug": "2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.1", + "eslint-module-utils": "2.1.1", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "lodash.cond": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz" + }, "dependencies": { "debug": { "version": "2.6.8", @@ -2621,11 +3075,17 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", "integrity": "sha1-gN8yU8TXkBBF7If6ZgooTjK9yik=", "dev": true, + "requires": { + "ignore": "3.3.7", + "minimatch": "3.0.4", + "resolve": "1.4.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==", + "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", "dev": true }, "minimatch": { @@ -2661,7 +3121,12 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", "integrity": "sha1-J3cKzzn1/UnNCvQIPOWBBOs5DUw=", - "dev": true + "dev": true, + "requires": { + "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "jsx-ast-utils": "1.4.1" + } }, "eslint-plugin-standard": { "version": "3.0.1", @@ -2673,7 +3138,11 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", - "dev": true + "dev": true, + "requires": { + "acorn": "5.1.1", + "acorn-jsx": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" + } }, "esprima": { "version": "4.0.0", @@ -2694,7 +3163,10 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/ev-store/-/ev-store-7.0.0.tgz", "integrity": "sha1-GrDH+CE2UF3XSzHRdwHLK+bSZVg=", - "dev": true + "dev": true, + "requires": { + "individual": "3.0.0" + } }, "event-kit": { "version": "2.4.0", @@ -2704,27 +3176,54 @@ "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=" + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "2.6.8", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, @@ -2732,18 +3231,29 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } }, "kind-of": { "version": "5.1.0", @@ -2759,17 +3269,33 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=" + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } } } }, @@ -2778,20 +3304,48 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, "fast-glob": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-1.0.1.tgz", - "integrity": "sha1-MPmxEg/Ven8XI2SmRY+9vZgYezw=" + "integrity": "sha1-MPmxEg/Ven8XI2SmRY+9vZgYezw=", + "requires": { + "bash-glob": "1.0.2", + "glob-parent": "3.1.0", + "micromatch": "3.1.9", + "readdir-enhanced": "1.5.2" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=" + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "requires": { + "bser": "2.0.0" + } }, "fbjs": { "version": "0.8.14", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.14.tgz", "integrity": "sha1-0dviviVMNakeCfMfnNUKQLKg7Rw=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "promise": "7.3.1", + "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "ua-parser-js": "0.7.14" + }, "dependencies": { "core-js": { "version": "1.2.7", @@ -2803,7 +3357,13 @@ "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=" + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + } }, "find-up": { "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -2825,39 +3385,54 @@ "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.16" + } + }, "formatio": { "version": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true + "dev": true, + "requires": { + "samsam": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz" + } }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=" + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "0.2.2" + } }, "fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=" + "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "2.2.1" + } }, "fs.realpath": { "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dependencies": { - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - } - } - } + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "function-bind": { "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", @@ -2867,8 +3442,13 @@ "function.prototype.name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.0.3.tgz", - "integrity": "sha512-5EblxZUdioXi2JiMZ9FUbwYj40eQ9MFHyzFLBSPdlRl3SO8l7SLWuAnQ/at/1Wi4hjJwME/C5WpF2ZfAc8nGNw==", + "integrity": "sha1-AJmuVXLp3W8DyX0CP9krzF5jnqw=", "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "is-callable": "1.1.3" + }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -2897,6 +3477,9 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -2908,17 +3491,33 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=" + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, "dependencies": { "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=" + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "2.1.1" + } } } }, @@ -2931,7 +3530,11 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true + "dev": true, + "requires": { + "min-document": "2.19.0", + "process": "0.5.2" + } }, "globals": { "version": "9.18.0", @@ -2951,6 +3554,9 @@ "version": "0.10.3", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.10.3.tgz", "integrity": "sha1-wxOv1VGOZzNRvuGPtj4qDkh0B6s=", + "requires": { + "iterall": "1.1.1" + }, "dependencies": { "iterall": { "version": "1.1.1", @@ -2964,37 +3570,83 @@ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, "has": { "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true + "dev": true, + "requires": { + "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz" + } }, "has-ansi": { "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=" + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } }, "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, "dependencies": { "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=" + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } } } }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, "hock": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/hock/-/hock-1.3.2.tgz", "integrity": "sha1-btPovkK0ZnmBGNEhUKqA6NbvIhk=", "dev": true, + "requires": { + "deep-equal": "0.2.1" + }, "dependencies": { "deep-equal": { "version": "0.2.1", @@ -3004,6 +3656,11 @@ } } }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + }, "hoist-non-react-statics": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", @@ -3012,7 +3669,11 @@ "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=" + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + } }, "hosted-git-info": { "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", @@ -3022,12 +3683,30 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readable-stream": "2.3.3" + } }, - "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "iconv-lite": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha1-I9hlaxaq5nQqwpcy6o8DNqR4nPI=" }, "ignore": { "version": "3.3.3", @@ -3055,11 +3734,17 @@ }, "inflight": { "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } }, "inherits": { "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "interpret": { "version": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", @@ -3078,7 +3763,10 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=" + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "6.0.2" + } }, "is-arrayish": { "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3091,7 +3779,10 @@ }, "is-builtin-module": { "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + } }, "is-callable": { "version": "1.1.3", @@ -3102,7 +3793,10 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=" + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "6.0.2" + } }, "is-date-object": { "version": "1.0.1", @@ -3113,7 +3807,12 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=" + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } }, "is-extendable": { "version": "0.1.1", @@ -3127,22 +3826,34 @@ }, "is-finite": { "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=" + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "2.1.1" + } }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, @@ -3156,6 +3867,9 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", + "requires": { + "is-number": "4.0.0" + }, "dependencies": { "is-number": { "version": "4.0.0", @@ -3167,13 +3881,19 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=" + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "requires": { + "isobject": "3.0.1" + } }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true + "dev": true, + "requires": { + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + } }, "is-stream": { "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3216,7 +3936,11 @@ }, "isomorphic-fetch": { "version": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=" + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.1", + "whatwg-fetch": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz" + } }, "isstream": { "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -3232,6 +3956,10 @@ "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, "dependencies": { "commander": { "version": "0.6.1", @@ -3255,8 +3983,12 @@ "js-yaml": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", - "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", - "dev": true + "integrity": "sha1-CHdc69/dNZIJ8NKs04PI+GppBKA=", + "dev": true, + "requires": { + "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "esprima": "4.0.0" + } }, "jsbn": { "version": "0.1.1", @@ -3273,11 +4005,19 @@ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, "json-stable-stringify": { "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, - "optional": true + "optional": true, + "requires": { + "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + } }, "json-stringify-safe": { "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -3296,7 +4036,10 @@ "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=" + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } }, "jsonify": { "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -3308,6 +4051,12 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -3325,7 +4074,10 @@ "keytar": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-4.1.0.tgz", - "integrity": "sha512-L3KqiSMtpVitlug4uuI+K5XLne9SAVEFWE8SCQIhQiH0IA/CTbon5v5prVLKK0Ken54o2O8V9HceKagpwJum+Q==" + "integrity": "sha1-njkz5InWVt4aho4Sk3CTEwRJidc=", + "requires": { + "nan": "2.5.1" + } }, "kind-of": { "version": "6.0.2", @@ -3335,25 +4087,45 @@ "lazy-cache": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=" + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "0.1.0" + } }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } }, "less": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", "dev": true, + "requires": { + "errno": "0.1.4", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "image-size": "0.5.5", + "mime": "1.4.1", + "mkdirp": "0.5.1", + "promise": "7.3.1", + "request": "2.81.0", + "source-map": "0.5.7" + }, "dependencies": { "ajv": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, - "optional": true + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + } }, "assert-plus": { "version": "0.2.0", @@ -3373,14 +4145,20 @@ "version": "2.10.1", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true + "dev": true, + "requires": { + "hoek": "2.16.3" + } }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, - "optional": true + "optional": true, + "requires": { + "boom": "2.10.1" + } }, "form-data": { "version": "2.1.4", @@ -3388,6 +4166,11 @@ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.16" + }, "dependencies": { "combined-stream": { "version": "1.0.6", @@ -3413,14 +4196,24 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true, - "optional": true + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, - "optional": 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", @@ -3433,7 +4226,12 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, - "optional": true + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } }, "mime": { "version": "1.4.1", @@ -3462,6 +4260,30 @@ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dev": true, "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "caseless": "0.12.0", + "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "mime-types": "2.1.16", + "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + }, "dependencies": { "combined-stream": { "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", @@ -3478,7 +4300,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "punycode": "1.4.1" } } } @@ -3488,7 +4310,10 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, - "optional": true + "optional": true, + "requires": { + "hoek": "2.16.3" + } }, "source-map": { "version": "0.5.7", @@ -3501,7 +4326,13 @@ }, "load-json-file": { "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=" + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + } }, "lodash": { "version": "4.17.5", @@ -3511,7 +4342,11 @@ "lodash._baseassign": { "version": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true + "dev": true, + "requires": { + "lodash._basecopy": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" + } }, "lodash._basecopy": { "version": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", @@ -3553,7 +4388,12 @@ "lodash.create": { "version": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true + "dev": true, + "requires": { + "lodash._baseassign": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "lodash._basecreate": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "lodash._isiterateecall": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" + } }, "lodash.defaults": { "version": "4.2.0", @@ -3597,7 +4437,12 @@ "lodash.keys": { "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true + "dev": true, + "requires": { + "lodash._getnative": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "lodash.isarguments": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" + } }, "lodash.map": { "version": "4.6.0", @@ -3647,7 +4492,10 @@ }, "loose-envify": { "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=" + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } }, "lru-cache": { "version": "2.7.3", @@ -3663,41 +4511,70 @@ "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=" + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "1.0.1" + } }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=" + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "1.2.0" + } }, "micromatch": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", "integrity": "sha1-FdyTF1rjnlLpMIeEcJbv/HPvz4k=", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "2.0.4" + } } } }, "mime-db": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", - "dev": true + "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" }, "mime-types": { "version": "2.1.16", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", - "dev": true + "requires": { + "mime-db": "1.29.0" + } }, "mimic-fn": { "version": "1.2.0", @@ -3708,21 +4585,50 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true + "dev": true, + "requires": { + "dom-walk": "0.1.1" + } }, "minimatch": { "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=" + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minipass": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.1.tgz", + "integrity": "sha512-u1aUllxPJUI07cOqzR7reGmQxmCqlH88uIIsf6XZFEWgw7gXKpJdR+5R9Y3KEDmWYkdIz9wXZs3C0jOPxejk/Q==", + "requires": { + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "requires": { + "minipass": "2.2.1" + } }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "2.0.4" + } } } }, @@ -3730,6 +4636,9 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, "dependencies": { "minimist": { "version": "0.0.8", @@ -3743,6 +4652,19 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", "dev": true, + "requires": { + "browser-stdout": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "commander": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "debug": "2.6.0", + "diff": "3.2.0", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "glob": "7.1.1", + "growl": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "lodash.create": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, "dependencies": { "debug": { "version": "2.6.0", @@ -3779,7 +4701,15 @@ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "dev": true, "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "1.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + } } } } @@ -3789,6 +4719,9 @@ "resolved": "https://registry.npmjs.org/mocha-appveyor-reporter/-/mocha-appveyor-reporter-0.4.0.tgz", "integrity": "sha1-gpOC/8Bla2Z+e+ZQoJSgba69Uk8=", "dev": true, + "requires": { + "request-json": "0.6.3" + }, "dependencies": { "depd": { "version": "1.1.2", @@ -3802,8 +4735,7 @@ "integrity": "sha512-5TVnMD3LaeK0GRCyFlsNgJf5Fjg8J8j7VEfsoJESSWZlWRgPIf7IojsBLbTHcg2798JrrRkJ6L3k1+wj4sglgw==", "dev": true, "requires": { - "depd": "1.1.2", - "request": "2.83.0" + "depd": "1.1.2" } } } @@ -3813,6 +4745,12 @@ "resolved": "https://registry.npmjs.org/mocha-junit-and-console-reporter/-/mocha-junit-and-console-reporter-1.6.0.tgz", "integrity": "sha1-kBmEuev51g9xXvDo4EwG5KsSJFc=", "dev": true, + "requires": { + "debug": "2.6.8", + "mkdirp": "0.5.1", + "mocha": "2.5.3", + "xml": "1.0.1" + }, "dependencies": { "commander": { "version": "2.3.0", @@ -3845,25 +4783,48 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "0.3.0" + } }, "minimatch": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } }, "mocha": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, "dependencies": { "debug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true + "dev": true, + "requires": { + "ms": "0.7.1" + } }, "ms": { "version": "0.7.1", @@ -3917,16 +4878,37 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "2.0.4" + } } } }, @@ -3944,7 +4926,11 @@ "node-fetch": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", - "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==" + "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", + "requires": { + "encoding": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + } }, "node-int64": { "version": "0.4.0", @@ -3953,18 +4939,30 @@ }, "normalize-package-data": { "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=" + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "requires": { + "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "semver": "5.4.1", + "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" + } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=" + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true + "dev": true, + "requires": { + "boolbase": "1.0.0" + } }, "number-is-nan": { "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -3982,26 +4980,45 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=" + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + } }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=" + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, "dependencies": { "kind-of": { "version": "5.1.0", @@ -4013,7 +5030,10 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, @@ -4032,13 +5052,21 @@ "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=" + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "3.0.1" + } }, "object.assign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "object-keys": "1.0.11" + }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -4053,6 +5081,12 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0", + "function-bind": "1.1.1", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -4065,13 +5099,22 @@ "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=" + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "3.0.1" + } }, "object.values": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0", + "function-bind": "1.1.1", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -4083,12 +5126,19 @@ }, "once": { "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } }, "optimist": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=" + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "requires": { + "wordwrap": "0.0.3" + } }, "os-homedir": { "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -4097,7 +5147,12 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=" + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } }, "os-tmpdir": { "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -4110,7 +5165,10 @@ }, "parse-json": { "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" + } }, "pascalcase": { "version": "0.1.1", @@ -4146,6 +5204,9 @@ "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "dev": true, + "requires": { + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "dependencies": { "isarray": { "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -4156,7 +5217,15 @@ }, "path-type": { "version": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -4164,18 +5233,22 @@ }, "pinkie": { "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true + "requires": { + "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + } }, "pkg-dir": { "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true + "dev": true, + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + } }, "posix-character-classes": { "version": "0.1.1", @@ -4206,12 +5279,20 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=" + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "requires": { + "asap": "2.0.6" + } }, "prop-types": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", "integrity": "sha1-NmREU1ZCVd3aORGR+zoSXL32VMo=", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + }, "dependencies": { "core-js": { "version": "1.2.7", @@ -4273,20 +5354,38 @@ "dev": true, "optional": true }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, "react": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", - "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=" + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", + "requires": { + "create-react-class": "15.6.2", + "fbjs": "0.8.14", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "prop-types": "15.6.1" + } }, "react-dom": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=" - }, - "react-input-autosize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz", - "integrity": "sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==" + "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", + "requires": { + "fbjs": "0.8.14", + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "prop-types": "15.6.1" + } }, "react-input-autosize": { "version": "2.2.1", @@ -4330,14 +5429,20 @@ "react-relay": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/react-relay/-/react-relay-1.4.1.tgz", - "integrity": "sha1-Yfe1gC1wRG4VRJD50PzuyRUOvaU=" + "integrity": "sha1-Yfe1gC1wRG4VRJD50PzuyRUOvaU=", + "requires": { + "babel-runtime": "6.25.0", + "fbjs": "0.8.14", + "prop-types": "15.6.1", + "relay-runtime": "1.4.1" + } }, "react-select": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/react-select/-/react-select-1.2.1.tgz", "integrity": "sha512-vaCgT2bEl+uTyE/uKOEgzE5Dc/wLtzhnBvoHCeuLoJWc4WuadN6WQDhoL42DW+TziniZK2Gaqe/wUXydI3NSaQ==", "requires": { - "classnames": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "classnames": "2.2.5", "prop-types": "15.6.1", "react-input-autosize": "2.2.1" }, @@ -4382,40 +5487,67 @@ "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-15.6.2.tgz", "integrity": "sha1-0DM0NPwsQ4CSaWyncNpe1IA376g=", - "dev": true + "dev": true, + "requires": { + "fbjs": "0.8.14", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } }, "read-pkg": { "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "path-type": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" + } }, "read-pkg-up": { "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz" + }, "dependencies": { "find-up": { "version": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "requires": { - "locate-path": "2.0.0" - } + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==" } } }, "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } }, "readdir-enhanced": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz", - "integrity": "sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=" + "integrity": "sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=", + "requires": { + "call-me-maybe": "1.0.1", + "es6-promise": "4.2.4", + "glob-to-regexp": "0.3.0" + } }, "rechoir": { "version": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true + "dev": true, + "requires": { + "resolve": "1.4.0" + } }, "regenerator-runtime": { "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", @@ -4425,16 +5557,27 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "2.0.4" + } } } }, @@ -4442,6 +5585,24 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-1.4.1.tgz", "integrity": "sha1-EOg/D13o2z0ACFGkwOQ1590d65U=", + "requires": { + "babel-generator": "6.26.0", + "babel-polyfill": "6.26.0", + "babel-preset-fbjs": "2.1.4", + "babel-runtime": "6.25.0", + "babel-traverse": "6.26.0", + "babel-types": "6.25.0", + "babylon": "6.18.0", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "fast-glob": "1.0.1", + "fb-watchman": "2.0.0", + "fbjs": "0.8.14", + "graphql": "0.11.7", + "immutable": "3.7.6", + "relay-runtime": "1.4.1", + "signedsource": "1.0.0", + "yargs": "9.0.1" + }, "dependencies": { "babel-code-frame": { "version": "6.26.0", @@ -4494,12 +5655,15 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" }, "graphql": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=" + "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=", + "requires": { + "iterall": "1.1.3" + } }, "invariant": { "version": "2.2.3", @@ -4512,7 +5676,7 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" } } }, @@ -4524,7 +5688,12 @@ "relay-runtime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-1.4.1.tgz", - "integrity": "sha1-+I3NCkInAKBFY/KR9XDkzjaONtA=" + "integrity": "sha1-+I3NCkInAKBFY/KR9XDkzjaONtA=", + "requires": { + "babel-runtime": "6.25.0", + "fbjs": "0.8.14", + "relay-debugger-react-native-runtime": "0.0.10" + } }, "repeat-element": { "version": "1.1.2", @@ -4538,7 +5707,39 @@ }, "repeating": { "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + } + }, + "request": { + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "mime-types": "2.1.16", + "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } }, "require-directory": { "version": "2.1.1", @@ -4553,8 +5754,11 @@ "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true + "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", + "dev": true, + "requires": { + "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" + } }, "resolve-url": { "version": "0.2.1", @@ -4579,7 +5783,10 @@ "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=" + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "0.1.15" + } }, "samsam": { "version": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", @@ -4589,7 +5796,7 @@ "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" }, "set-blocking": { "version": "2.0.0", @@ -4599,12 +5806,21 @@ "set-getter": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=" + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "requires": { + "to-object-path": "0.3.0" + } }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=" + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + } }, "setimmediate": { "version": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -4613,7 +5829,10 @@ "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=" + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } }, "shebang-regex": { "version": "1.0.0", @@ -4624,7 +5843,12 @@ "version": "0.7.8", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "rechoir": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + } }, "sigmund": { "version": "1.0.1", @@ -4653,6 +5877,16 @@ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.3.6.tgz", "integrity": "sha1-lTeOfg+XapcS6bRZH/WznnPcPd4=", "dev": true, + "requires": { + "diff": "3.2.0", + "formatio": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "lolex": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "native-promise-only": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "samsam": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", + "text-encoding": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "type-detect": "4.0.3" + }, "dependencies": { "type-detect": { "version": "4.0.3", @@ -4671,6 +5905,16 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "requires": { + "base": "0.11.2", + "debug": "2.6.8", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "source-map-resolve": "0.5.1", + "use": "2.0.2" + }, "dependencies": { "define-property": { "version": "0.2.5", @@ -4737,11 +5981,19 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } } } }, @@ -4749,14 +6001,28 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.1" + } + }, "source-map": { "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" @@ -4764,12 +6030,22 @@ "source-map-resolve": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=" + "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=", + "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" + } }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=" + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } }, "source-map-url": { "version": "0.4.0", @@ -4794,35 +6070,57 @@ "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=" + "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=", + "requires": { + "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + } }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "requires": { + "extend-shallow": "3.0.2" + }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "2.0.4" + } } } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "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", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -4835,21 +6133,34 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, @@ -4857,18 +6168,29 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } }, "kind-of": { "version": "5.1.0", @@ -4877,12 +6199,6 @@ } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true - }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -4893,6 +6209,10 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "strip-ansi": "4.0.0" + }, "dependencies": { "ansi-regex": { "version": "3.0.0", @@ -4901,14 +6221,12 @@ }, "is-fullwidth-code-point": { "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, "requires": { "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "strip-ansi": "4.0.0" @@ -4924,13 +6242,25 @@ } } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringstream": { "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "strip-ansi": { "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } }, "strip-bom": { "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -4946,14 +6276,26 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.0.tgz", + "integrity": "sha512-gJlTiiErwo96K904FnoYWl+5+FBgS+FimU6GMh66XLdLa55al8+d4jeDfPoGwSNHdtWI5FJP6xurmVqhBuGJpQ==", + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.1", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "yallist": "3.0.2" + } }, "temp": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "requires": { + "os-tmpdir": "1.0.2", + "rimraf": "2.2.8" + }, "dependencies": { "os-tmpdir": { "version": "1.0.2", @@ -4991,7 +6333,10 @@ "version": "0.0.31", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true + "dev": true, + "requires": { + "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + } }, "to-fast-properties": { "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -5007,11 +6352,17 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } } } }, @@ -5019,23 +6370,48 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "2.0.4" + } } } }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=" + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "1.4.1" + } }, "tree-kill": { "version": "1.2.0", @@ -5049,7 +6425,10 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } }, "tweetnacl": { "version": "0.14.5", @@ -5066,11 +6445,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, "dependencies": { "set-value": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=" + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } } } }, @@ -5083,16 +6474,28 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=" + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } } } }, @@ -5112,6 +6515,11 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "requires": { + "define-property": "0.2.5", + "isobject": "3.0.1", + "lazy-cache": "2.0.2" + }, "dependencies": { "define-property": { "version": "0.2.5", @@ -5182,7 +6590,7 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" }, "validate-npm-package-license": { "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", @@ -5192,6 +6600,11 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "extsprintf": "1.3.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -5204,7 +6617,17 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/virtual-dom/-/virtual-dom-2.1.1.tgz", "integrity": "sha1-gO2i1IG57eDASRGM78tKBfIdE3U=", - "dev": true + "dev": true, + "requires": { + "browser-split": "0.0.1", + "error": "4.4.0", + "ev-store": "7.0.0", + "global": "4.3.2", + "is-object": "1.0.1", + "next-tick": "0.2.2", + "x-is-array": "0.1.0", + "x-is-string": "0.1.0" + } }, "what-the-diff": { "version": "0.4.0", @@ -5214,7 +6637,10 @@ "what-the-status": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/what-the-status/-/what-the-status-1.0.3.tgz", - "integrity": "sha1-lP3NAR/7U6Ijnnb6+NrL78mHdRA=" + "integrity": "sha1-lP3NAR/7U6Ijnnb6+NrL78mHdRA=", + "requires": { + "split": "1.0.1" + } }, "whatwg-fetch": { "version": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", @@ -5223,7 +6649,10 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=" + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "requires": { + "isexe": "2.0.0" + } }, "which-module": { "version": "2.0.0", @@ -5239,14 +6668,16 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + }, "dependencies": { "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" } } @@ -5254,7 +6685,8 @@ }, "wrappy": { "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "x-is-array": { "version": "0.1.0", @@ -5285,15 +6717,38 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + }, "yargs": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=" + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "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": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "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" + } }, "yargs-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=" + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "4.1.0" + } }, "yubikiri": { "version": "1.0.0", diff --git a/package.json b/package.json index 6a09540c6f..cd9deac118 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "core-decorators": "^0.19.0", "diff": "3.2.0", "dompurify": "^1.0.3", - "dugite": "1.49.0", + "dugite": "^1.60.0", "etch": "^0.12.4", "event-kit": "^2.3.0", "fs-extra": "^5.0.0", From 2e5237bf80d9b039c82fef13b5b0819c20576c3e Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Fri, 16 Mar 2018 19:47:56 +0100 Subject: [PATCH 0066/5422] Actually sort alphabetically --- lib/models/user-store.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/models/user-store.js b/lib/models/user-store.js index 0020ca522b..e04caeecdb 100644 --- a/lib/models/user-store.js +++ b/lib/models/user-store.js @@ -51,7 +51,11 @@ export default class UserStore { // don't actually do this. will change when we settle on best way to actually store data return Object.keys(this.users) .map(email => ({email, name: this.users[email]})) - .sort((a, b) => a.name > b.name); + .sort((a, b) => { + if(a.name < b.name) return -1; + if(a.name > b.name) return 1; + return 0; + }); } } From ccc0e5db6768720ac2d6ac493fa613eecad9afa5 Mon Sep 17 00:00:00 2001 From: Markus Olsson Date: Fri, 16 Mar 2018 20:31:45 +0100 Subject: [PATCH 0067/5422] Only parse co-author trailers (not signed-off by and friends) in getAuthors Co-Authored-By: Katrina Uychaco --- lib/git-shell-out-strategy.js | 43 ++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 1e78ba6614..ce49181a7f 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -602,31 +602,38 @@ export default class GitShellOutStrategy { const {max, ref} = {max: 1, ref: 'HEAD', ...options}; // https://git-scm.com/docs/git-log#_pretty_formats - // %x00 - null byte + // %x1F - field separator byte // %an - author name // %ae - author email // %cn - committer name // %ce - committer email - // %(trailers) - display the trailers of the body - // TODO figure out why %(trailers:only,unfold) doesn't work + // %(trailers:unfold,only) - the commit message trailers, separated + // by newlines and unfolded (i.e. properly + // formatted and one trailer per line). + + const delimiter = '1F' + const delimiterString = String.fromCharCode(parseInt(delimiter, 16)) + const fields = [ "%an", "%ae", "%cn", "%ce", "%(trailers:unfold,only)" ] + const format = fields.join(`%x${delimiter}`); const output = await this.exec([ - 'log', '--pretty=format:%an %ae%x00%cn %ce%x00%(trailers)', '-z', '-n', max, ref, '--', + 'log', `--format=${format}`, '-z', '-n', max, ref, '--', ]); - return output.split('\0').reduce((acc, line) => { - if (line.match(/^co-authored-by: /i)) { - const coAuthorLines = line.trim().split(LINE_ENDING_REGEX); - coAuthorLines.forEach(coAuthor => { - const [_, name, email] = coAuthor.match(/co-authored-by: (.*) <(.*)>/i); // eslint-disable-line no-unused-vars - acc[email] = name; - }); - } else if (line !== '') { - const matches = line.match(/(.*) (.*@.*)/); // eslint-disable-line no-unused-vars - if (matches) { - acc[matches[2]] = matches[1]; - } - } - return acc; + + return output.split('\0') + .filter(l => l.length > 0) + .map(line => line.split(delimiterString)) + .reduce((acc, [ an, ae, cn, ce, trailers ]) => { + trailers + .split('\n') + .map(trailer => trailer.match(/^co-authored-by. (.+?) <(.+?)>$/i)) + .filter(match => match !== null) + .forEach(([ _, name, email ]) => acc[email] = name) + + acc[ae] = an + acc[ce] = cn + + return acc; }, {}); } From 3fbb45da4c3417f7b62b03bd419f01386bf91017 Mon Sep 17 00:00:00 2001 From: iPherian Date: Mon, 19 Mar 2018 12:05:11 -0700 Subject: [PATCH 0068/5422] :bug: Use unambiguous branch name when pushing --- lib/git-shell-out-strategy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index f00153814c..859606fad1 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -658,7 +658,7 @@ export default class GitShellOutStrategy { } push(remoteName, branchName, options = {}) { - const args = ['push', remoteName || 'origin', branchName]; + const args = ['push', remoteName || 'origin', `refs/heads/${branchName}`]; if (options.setUpstream) { args.push('--set-upstream'); } if (options.force) { args.push('--force'); } return this.exec(args, {useGitPromptServer: true, writeOperation: true}); From 79c45b4ef4e846cd12741f5f561ffd2e4de31b00 Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 24 Feb 2018 14:17:21 -0800 Subject: [PATCH 0069/5422] Tell eslint to only use 2 spaces --- .eslintrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index 850db65d1e..8538ab389d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -14,7 +14,8 @@ }, "extends": ["fbjs/opensource"], "rules": { - "linebreak-style": 0 + "linebreak-style": 0, + "indent": ["error", 2] }, "globals": { "atom": true, From 311a87deb76bb8022afa769a821a5cdb214cab02 Mon Sep 17 00:00:00 2001 From: Matt Date: Sun, 11 Feb 2018 13:23:07 -0800 Subject: [PATCH 0070/5422] WIP Push and pull straight from status bar --- lib/controllers/status-bar-tile-controller.js | 33 +++++--------- lib/views/pull-view.js | 43 ++++++++++++++++++ lib/views/push-view.js | 44 +++++++++++++++++++ styles/push-pull-view.less | 12 ++++- 4 files changed, 110 insertions(+), 22 deletions(-) create mode 100644 lib/views/pull-view.js create mode 100644 lib/views/push-view.js diff --git a/lib/controllers/status-bar-tile-controller.js b/lib/controllers/status-bar-tile-controller.js index 5f86e934f7..40ed64bbbc 100644 --- a/lib/controllers/status-bar-tile-controller.js +++ b/lib/controllers/status-bar-tile-controller.js @@ -5,8 +5,8 @@ import ObserveModelDecorator from '../decorators/observe-model'; import {BranchPropType, RemotePropType} from '../prop-types'; import BranchView from '../views/branch-view'; import BranchMenuView from '../views/branch-menu-view'; -import PushPullView from '../views/push-pull-view'; -import PushPullMenuView from '../views/push-pull-menu-view'; +import PullView from '../views/pull-view'; +import PushView from '../views/push-view'; import ChangedFilesCountView from '../views/changed-files-count-view'; import Tooltip from '../views/tooltip'; import Commands, {Command} from '../views/commands'; @@ -147,28 +147,19 @@ export default class StatusBarTileController extends React.Component { {...repoProps} />
- { this.pushPullView = e; }} - pushInProgress={pushInProgress} + { this.pullView = e; }} fetchInProgress={fetchInProgress || pullInProgress} + pull={this.pull} + fetch={this.fetch} + {...repoProps} + /> + { this.pushView = e; }} + pushInProgress={pushInProgress} + push={this.push} {...repoProps} /> - this.pushPullView} - trigger="click" - className="github-StatusBarTileController-tooltipMenu"> - - ); } diff --git a/lib/views/pull-view.js b/lib/views/pull-view.js new file mode 100644 index 0000000000..b1fdf1248c --- /dev/null +++ b/lib/views/pull-view.js @@ -0,0 +1,43 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; + +export default class PushPullView extends React.Component { + static propTypes = { + pull: PropTypes.func.isRequired, + fetch: PropTypes.func.isRequired, + fetchInProgress: PropTypes.bool, + behindCount: PropTypes.number, + } + + static defaultProps = { + fetchInProgress: false, + behindCount: 0, + } + + onClick = clickEvent => { + if (clickEvent.ctrlKey || clickEvent.shiftKey || clickEvent.altKey || clickEvent.metaKey) { + this.props.fetch(); + } else { + this.props.pull(); + } + } + + render() { + const pulling = this.props.fetchInProgress; + const pullClasses = cx('github-PushPull-icon', 'icon', {'icon-arrow-down': !pulling, 'icon-sync': pulling}); + return ( +
{ this.element = e; }} + onClick={this.onClick} + // TODO: This should be a blue Atom tooltip + title="Click to pull, Cmd + Click to fetch"> + + {this.props.behindCount > 0 && + `${this.props.behindCount}` + } +
+ ); + } +} diff --git a/lib/views/push-view.js b/lib/views/push-view.js new file mode 100644 index 0000000000..a00b0a7ffe --- /dev/null +++ b/lib/views/push-view.js @@ -0,0 +1,44 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; + +import {RemotePropType} from '../prop-types'; + +export default class PushView extends React.Component { + static propTypes = { + currentRemote: RemotePropType.isRequired, + push: PropTypes.func.isRequired, + pushInProgress: PropTypes.bool, + aheadCount: PropTypes.number, + } + + static defaultProps = { + pushInProgress: false, + aheadCount: 0, + } + + onClick = clickEvent => { + this.props.push({ + force: clickEvent.metaKey || clickEvent.ctrlKey, + setUpstream: !this.props.currentRemote.isPresent(), + }); + } + + render() { + const pushing = this.props.pushInProgress; + const pushClasses = cx('github-PushPull-icon', 'icon', {'icon-arrow-up': !pushing, 'icon-sync': pushing}); + return ( +
{ this.element = e; }} + onClick={this.onClick} + // TODO: This should be a blue Atom tooltip + title="Click to push, Cmd + Click to force push"> + + + {this.props.aheadCount ? `${this.props.aheadCount}` : ''} + +
+ ); + } +} diff --git a/styles/push-pull-view.less b/styles/push-pull-view.less index 4b42e688d5..1c0bf60a60 100644 --- a/styles/push-pull-view.less +++ b/styles/push-pull-view.less @@ -3,7 +3,6 @@ // Used in the status-bar .github-PushPull { - &-icon.icon.icon.icon { margin-right: 0; text-align: center; @@ -13,4 +12,15 @@ margin-right: .4em; } + status-bar.status-bar &-icon::before { + margin-right: 0px; + } +} + +status-bar .github-Push.inline-block { + padding-left: 0.375em; +} + +status-bar .github-Pull.inline-block { + padding-right: 0.375em; } From e6199e2e8b9849f68cc5f51c1780ffc6889b92a9 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 20 Feb 2018 01:07:45 -0800 Subject: [PATCH 0071/5422] Implement designs from #311 Also covers the remaining 2.6% edge case of not being on a branch. --- lib/controllers/status-bar-tile-controller.js | 15 +-- lib/get-repo-pipeline-manager.js | 2 +- lib/views/pull-view.js | 43 ------ lib/views/push-pull-view.js | 127 +++++++++++++++--- lib/views/push-view.js | 44 ------ menus/git.cson | 21 +++ styles/push-pull-view.less | 15 +-- styles/status-bar-tile-controller.less | 4 +- 8 files changed, 139 insertions(+), 132 deletions(-) delete mode 100644 lib/views/pull-view.js delete mode 100644 lib/views/push-view.js diff --git a/lib/controllers/status-bar-tile-controller.js b/lib/controllers/status-bar-tile-controller.js index 40ed64bbbc..5b78cee018 100644 --- a/lib/controllers/status-bar-tile-controller.js +++ b/lib/controllers/status-bar-tile-controller.js @@ -5,8 +5,7 @@ import ObserveModelDecorator from '../decorators/observe-model'; import {BranchPropType, RemotePropType} from '../prop-types'; import BranchView from '../views/branch-view'; import BranchMenuView from '../views/branch-menu-view'; -import PullView from '../views/pull-view'; -import PushView from '../views/push-view'; +import PushPullView from '../views/push-pull-view'; import ChangedFilesCountView from '../views/changed-files-count-view'; import Tooltip from '../views/tooltip'; import Commands, {Command} from '../views/commands'; @@ -147,19 +146,13 @@ export default class StatusBarTileController extends React.Component { {...repoProps} />
- { this.pullView = e; }} - fetchInProgress={fetchInProgress || pullInProgress} + - { this.pushView = e; }} - pushInProgress={pushInProgress} - push={this.push} - {...repoProps} - /> ); } diff --git a/lib/get-repo-pipeline-manager.js b/lib/get-repo-pipeline-manager.js index 8158295ada..366cf49c30 100644 --- a/lib/get-repo-pipeline-manager.js +++ b/lib/get-repo-pipeline-manager.js @@ -46,7 +46,7 @@ export default function({confirm, notificationManager, workspace}) { if (/rejected[\s\S]*failed to push/.test(error.stdErr)) { notificationManager.addError('Push rejected', { description: 'The tip of your current branch is behind its remote counterpart.' + - ' Try pulling before pushing again. Or, to force push, hold `cmd` or `ctrl` while clicking.', + ' Try pulling before pushing.
To force push, hold `cmd` or `ctrl` while clicking.', dismissable: true, }); } else { diff --git a/lib/views/pull-view.js b/lib/views/pull-view.js deleted file mode 100644 index b1fdf1248c..0000000000 --- a/lib/views/pull-view.js +++ /dev/null @@ -1,43 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import cx from 'classnames'; - -export default class PushPullView extends React.Component { - static propTypes = { - pull: PropTypes.func.isRequired, - fetch: PropTypes.func.isRequired, - fetchInProgress: PropTypes.bool, - behindCount: PropTypes.number, - } - - static defaultProps = { - fetchInProgress: false, - behindCount: 0, - } - - onClick = clickEvent => { - if (clickEvent.ctrlKey || clickEvent.shiftKey || clickEvent.altKey || clickEvent.metaKey) { - this.props.fetch(); - } else { - this.props.pull(); - } - } - - render() { - const pulling = this.props.fetchInProgress; - const pullClasses = cx('github-PushPull-icon', 'icon', {'icon-arrow-down': !pulling, 'icon-sync': pulling}); - return ( -
{ this.element = e; }} - onClick={this.onClick} - // TODO: This should be a blue Atom tooltip - title="Click to pull, Cmd + Click to fetch"> - - {this.props.behindCount > 0 && - `${this.props.behindCount}` - } -
- ); - } -} diff --git a/lib/views/push-pull-view.js b/lib/views/push-pull-view.js index 6e30bdeebd..1639c8eea6 100644 --- a/lib/views/push-pull-view.js +++ b/lib/views/push-pull-view.js @@ -2,37 +2,128 @@ import React from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; +import {RemotePropType, BranchPropType} from '../prop-types'; + + +function getIconClass(icon, isSyncing = false) { + return cx( + 'github-PushPull-icon', + 'icon', + isSyncing ? 'icon-sync' : `icon-${icon}`, + {'animate-rotate': isSyncing}, + ); +} + export default class PushPullView extends React.Component { static propTypes = { - pushInProgress: PropTypes.bool, - fetchInProgress: PropTypes.bool, + currentBranch: BranchPropType.isRequired, + currentRemote: RemotePropType.isRequired, + isSyncing: PropTypes.bool, behindCount: PropTypes.number, aheadCount: PropTypes.number, + push: PropTypes.func.isRequired, + pull: PropTypes.func.isRequired, + fetch: PropTypes.func.isRequired, } static defaultProps = { - pushInProgress: false, - fetchInProgress: false, + isSyncing: false, behindCount: 0, aheadCount: 0, } + onClickPush = clickEvent => { + this.props.push({ + force: clickEvent.metaKey || clickEvent.ctrlKey, + setUpstream: !this.props.currentRemote.isPresent(), + }); + } + + onClickPull = clickEvent => { + this.props.pull(); + } + + onClickPushPull = clickEvent => { + if (clickEvent.metaKey || clickEvent.ctrlKey) { + this.props.push({ + force: true, + }); + } else { + this.props.pull(); + } + } + + onClickPublish = clickEvent => { + this.props.push({ + setUpstream: !this.props.currentRemote.isPresent(), + }); + } + + onClickFetch = clickEvent => { + this.props.fetch(); + } + render() { - const pushing = this.props.pushInProgress; - const pulling = this.props.fetchInProgress; - const pushClasses = cx('github-PushPull-icon', 'icon', {'icon-arrow-up': !pushing, 'icon-sync': pushing}); - const pullClasses = cx('github-PushPull-icon', 'icon', {'icon-arrow-down': !pulling, 'icon-sync': pulling}); - return ( -
{ this.element = e; }}> - - - {this.props.behindCount ? `${this.props.behindCount}` : ''} + const isAhead = this.props.aheadCount > 0; + const isBehind = this.props.behindCount > 0; + const isUnpublished = !this.props.currentRemote.isPresent(); + const isDetached = !!this.props.currentBranch.detached; + const isSyncing = this.props.isSyncing; + + return (
+ {isAhead && !isBehind && !isUnpublished && ( + + + Push {this.props.aheadCount} + + )} + + {isBehind && !isAhead && !isUnpublished && ( + + + Pull {this.props.behindCount} - - - {this.props.aheadCount ? `${this.props.aheadCount}` : ''} + )} + + {isBehind && isAhead && !isUnpublished && !isSyncing && ( + + + + {this.props.aheadCount}{' '} + + + Pull {this.props.behindCount} + + )} + + {isBehind && isAhead && !isUnpublished && isSyncing && ( + + + Pull {this.props.behindCount} + + )} + + {!isBehind && !isAhead && !isUnpublished && !isDetached && ( + + + Fetch + + )} + + {isUnpublished && !isDetached && ( + + + Publish + + )} + + {isDetached && ( + + + Not on branch -
- ); + )} +
); } } diff --git a/lib/views/push-view.js b/lib/views/push-view.js deleted file mode 100644 index a00b0a7ffe..0000000000 --- a/lib/views/push-view.js +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import cx from 'classnames'; - -import {RemotePropType} from '../prop-types'; - -export default class PushView extends React.Component { - static propTypes = { - currentRemote: RemotePropType.isRequired, - push: PropTypes.func.isRequired, - pushInProgress: PropTypes.bool, - aheadCount: PropTypes.number, - } - - static defaultProps = { - pushInProgress: false, - aheadCount: 0, - } - - onClick = clickEvent => { - this.props.push({ - force: clickEvent.metaKey || clickEvent.ctrlKey, - setUpstream: !this.props.currentRemote.isPresent(), - }); - } - - render() { - const pushing = this.props.pushInProgress; - const pushClasses = cx('github-PushPull-icon', 'icon', {'icon-arrow-up': !pushing, 'icon-sync': pushing}); - return ( -
{ this.element = e; }} - onClick={this.onClick} - // TODO: This should be a blue Atom tooltip - title="Click to push, Cmd + Click to force push"> - - - {this.props.aheadCount ? `${this.props.aheadCount}` : ''} - -
- ); - } -} diff --git a/menus/git.cson b/menus/git.cson index 63be16c747..a8ce5c3a97 100644 --- a/menus/git.cson +++ b/menus/git.cson @@ -115,3 +115,24 @@ 'command': 'github:view-staged-changes-for-current-file' } ] + '.github-PushPull': [ + { + 'label': 'Fetch', + 'command': 'github:fetch' + } + { + 'label': 'Pull', + 'command': 'github:pull' + } + { + 'type': 'separator' + } + { + 'label': 'Push', + 'command': 'github:push' + } + { + 'label': 'Force Push', + 'command': 'github:force-push' + } + ] diff --git a/styles/push-pull-view.less b/styles/push-pull-view.less index 1c0bf60a60..47687925d2 100644 --- a/styles/push-pull-view.less +++ b/styles/push-pull-view.less @@ -8,19 +8,8 @@ text-align: center; } - &-label.is-pull { - margin-right: .4em; + .secondary { + color: @text-color-subtle; } - status-bar.status-bar &-icon::before { - margin-right: 0px; - } -} - -status-bar .github-Push.inline-block { - padding-left: 0.375em; -} - -status-bar .github-Pull.inline-block { - padding-right: 0.375em; } diff --git a/styles/status-bar-tile-controller.less b/styles/status-bar-tile-controller.less index bd6b14cfc2..abf24ec2be 100644 --- a/styles/status-bar-tile-controller.less +++ b/styles/status-bar-tile-controller.less @@ -34,11 +34,11 @@ } // Sync animation - .icon-sync::before { + .animate-rotate.icon-sync::before { @keyframes github-StatusBarSync-animation { 100% { transform: rotate(360deg); } } - animation: github-StatusBarSync-animation 2s linear 30; // limit to 1min in case something gets stuck + animation: github-StatusBarSync-animation 1s linear infinite; } // Merge conflict icon From cf8b0af12d5deb58b7c345a07051f206a9dc829f Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 19 Mar 2018 16:55:49 +0100 Subject: [PATCH 0072/5422] Add tooltips to push-pull-view in status-bar --- CONTRIBUTING.md | 5 ++ lib/views/push-pull-view.js | 95 +++++++++++++++++++++++++++++-------- 2 files changed, 81 insertions(+), 19 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2dd522fb8d..f904256ccc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,6 +26,11 @@ Please check in the generated `graphql/schema.graphql`. In addition, if you make any changes to any of the GraphQL queries or fragments (inside the `graphql` tagged template literals), you will need to run `npm run relay` to regenerate the statically-generated query files. +## Testing +To run tests, open the command palette and select "Run Package Specs". This will open a new window running "GitHub Package Tests". If the window stays blank for more than a few seconds, open DevTools and check for error messages. + +To re-run tests, you can refresh that window by pressing `Cmd + R` in DevTools. + ### Async Tests Sometimes it's necessary to test async operations. For example, imagine the following test: diff --git a/lib/views/push-pull-view.js b/lib/views/push-pull-view.js index 1639c8eea6..39fa5ae679 100644 --- a/lib/views/push-pull-view.js +++ b/lib/views/push-pull-view.js @@ -32,7 +32,28 @@ export default class PushPullView extends React.Component { aheadCount: 0, } + + componentDidMount() { + this.setTooltip(); + } + + componentDidUpdate() { + this.tooltip.dispose(); + this.setTooltip(); + } + + setTooltip = () => { + this.tooltip = atom.tooltips.add(this.node, { + title: `
${this.clickNode.dataset.tooltip}
`, + delay: {show: 200, hide: 100}, + html: true, + }); + } + onClickPush = clickEvent => { + if (this.props.isSyncing) { + return; + } this.props.push({ force: clickEvent.metaKey || clickEvent.ctrlKey, setUpstream: !this.props.currentRemote.isPresent(), @@ -40,10 +61,16 @@ export default class PushPullView extends React.Component { } onClickPull = clickEvent => { + if (this.props.isSyncing) { + return; + } this.props.pull(); } onClickPushPull = clickEvent => { + if (this.props.isSyncing) { + return; + } if (clickEvent.metaKey || clickEvent.ctrlKey) { this.props.push({ force: true, @@ -54,12 +81,18 @@ export default class PushPullView extends React.Component { } onClickPublish = clickEvent => { + if (this.props.isSyncing) { + return; + } this.props.push({ setUpstream: !this.props.currentRemote.isPresent(), }); } onClickFetch = clickEvent => { + if (this.props.isSyncing) { + return; + } this.props.fetch(); } @@ -71,55 +104,79 @@ export default class PushPullView extends React.Component { const isSyncing = this.props.isSyncing; return (
(this.node = node)} className={cx('github-PushPull', 'inline-block', {'github-branch-detached': isDetached})}> + {isAhead && !isBehind && !isUnpublished && ( - + (this.clickNode = node)} + onClick={this.onClickPush} + className="push-pull-target" + data-tooltip="Click to push
Cmd-click to force push
Right-click for more"> Push {this.props.aheadCount} - - )} +
+ )} {isBehind && !isAhead && !isUnpublished && ( - - + (this.clickNode = node)} + onClick={this.onClickPull} + className="push-pull-target" + data-tooltip="Click to pull
Right-click for more"> + Pull {this.props.behindCount} - +
)} {isBehind && isAhead && !isUnpublished && !isSyncing && ( - + (this.clickNode = node)} + onClick={this.onClickPushPull} + className="push-pull-target" + data-tooltip="Click to push
Cmd-click to force push
Right-click for more"> {this.props.aheadCount}{' '} Pull {this.props.behindCount} - - )} +
+ )} {isBehind && isAhead && !isUnpublished && isSyncing && ( - - + + Pull {this.props.behindCount} - - )} + + )} {!isBehind && !isAhead && !isUnpublished && !isDetached && ( - - + (this.clickNode = node)} + onClick={this.onClickFetch} + className="push-pull-target" + data-tooltip="Click to fetch
Right-click for more"> + Fetch - +
)} {isUnpublished && !isDetached && ( - + (this.clickNode = node)} + onClick={this.onClickPublish} + className="push-pull-target" + data-tooltip="Click to publish
Right-click for more"> Publish - +
)} {isDetached && ( - + (this.clickNode = node)} + className="push-pull-target" + data-tooltip={'Create a branch if you wish to push your work anywhere'}> Not on branch From 8ba4e8a87e19cb7f134e39f5a5dc3666ba154da7 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 19 Mar 2018 16:56:17 +0100 Subject: [PATCH 0073/5422] Write basic tests for push-pull-view --- .../status-bar-tile-controller.test.js | 396 +++++++++++++----- 1 file changed, 282 insertions(+), 114 deletions(-) diff --git a/test/controllers/status-bar-tile-controller.test.js b/test/controllers/status-bar-tile-controller.test.js index c32f7628c0..9212c5f863 100644 --- a/test/controllers/status-bar-tile-controller.test.js +++ b/test/controllers/status-bar-tile-controller.test.js @@ -267,176 +267,344 @@ describe('StatusBarTileController', function() { }); }); - describe('pushing and pulling', function() { - it('shows and hides the PushPullView', async function() { - const {localRepoPath} = await setUpLocalAndRemoteRepositories(); - const repository = await buildRepository(localRepoPath); + describe.only('pushing and pulling', function() { - const wrapper = mount(React.cloneElement(component, {repository})); - await wrapper.instance().refreshModelData(); - - assert.lengthOf(document.querySelectorAll('.github-PushPullMenuView'), 0); - wrapper.find(PushPullView).node.element.click(); - assert.lengthOf(document.querySelectorAll('.github-PushPullMenuView'), 1); - wrapper.find(PushPullView).node.element.click(); - assert.lengthOf(document.querySelectorAll('.github-PushPullMenuView'), 0); - }); + describe('status bar tile state', function() { - it('indicates the ahead and behind counts', async function() { - const {localRepoPath} = await setUpLocalAndRemoteRepositories(); - const repository = await buildRepository(localRepoPath); + describe('when there is no remote tracking branch', function() { + let repository; + let statusBarTile; - const wrapper = mount(React.cloneElement(component, {repository})); - await wrapper.instance().refreshModelData(); + beforeEach(async function() { + const {localRepoPath} = await setUpLocalAndRemoteRepositories(); + repository = await buildRepository(localRepoPath); + await repository.git.exec(['checkout', '-b', 'new-branch']); - const tip = getTooltipNode(wrapper, PushPullView); + statusBarTile = mount(React.cloneElement(component, {repository})); + await statusBarTile.instance().refreshModelData(); - assert.equal(tip.querySelector('.github-PushPullMenuView-pull').textContent.trim(), 'Pull'); - assert.equal(tip.querySelector('.github-PushPullMenuView-push').textContent.trim(), 'Push'); + sinon.spy(repository, 'fetch'); + sinon.spy(repository, 'push'); + sinon.spy(repository, 'pull'); + }); - await repository.git.exec(['reset', '--hard', 'HEAD~2']); - repository.refresh(); - await wrapper.instance().refreshModelData(); + it('gives the option to publish the current branch', function() { + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Publish'); + }); - assert.equal(tip.querySelector('.github-PushPullMenuView-pull').textContent.trim(), 'Pull (2)'); - assert.equal(tip.querySelector('.github-PushPullMenuView-push').textContent.trim(), 'Push'); + it('pushes the current branch when clicked', function() { + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isTrue(repository.push.called); + }); - await repository.git.commit('new local commit', {allowEmpty: true}); - repository.refresh(); - await wrapper.instance().refreshModelData(); + it('does nothing when clicked and currently pushing', function() { + repository.getOperationStates().setPushInProgress(true); + statusBarTile = mount(React.cloneElement(component, {repository})); - assert.equal(tip.querySelector('.github-PushPullMenuView-pull').textContent.trim(), 'Pull (2)'); - assert.equal(tip.querySelector('.github-PushPullMenuView-push').textContent.trim(), 'Push (1)'); - }); + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isFalse(repository.fetch.called); + assert.isFalse(repository.push.called); + assert.isFalse(repository.pull.called); + }); + }); - describe('the push/pull menu', function() { - describe('when there is no remote tracking branch', function() { + describe('when there is a remote with nothing to pull or push', function() { let repository; + let statusBarTile; beforeEach(async function() { const {localRepoPath} = await setUpLocalAndRemoteRepositories(); repository = await buildRepository(localRepoPath); - await repository.git.exec(['checkout', '-b', 'new-branch']); + + statusBarTile = mount(React.cloneElement(component, {repository})); + await statusBarTile.instance().refreshModelData(); + + sinon.spy(repository, 'fetch'); + sinon.spy(repository, 'push'); + sinon.spy(repository, 'pull'); }); - it('disables the fetch and pull buttons and displays an informative message', async function() { - const wrapper = mount(React.cloneElement(component, {repository})); - await wrapper.instance().refreshModelData(); + it('gives the option to fetch from remote', function() { + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Fetch'); + }); - const tip = getTooltipNode(wrapper, PushPullView); + it('fetches from remote when clicked', function() { + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isTrue(repository.fetch.called); + }); - const pullButton = tip.querySelector('button.github-PushPullMenuView-pull'); - const pushButton = tip.querySelector('button.github-PushPullMenuView-push'); - const message = tip.querySelector('.github-PushPullMenuView-message'); + it('does nothing when clicked and currently fetching', function() { + repository.getOperationStates().setFetchInProgress(true); + statusBarTile = mount(React.cloneElement(component, {repository})); - assert.isTrue(pullButton.disabled); - assert.isFalse(pushButton.disabled); - assert.match(message.innerHTML, /No remote detected.*Pushing will set up a remote tracking branch/); - - pushButton.click(); - await until(async fail => { - try { - repository.refresh(); - await wrapper.instance().refreshModelData(); - - assert.isFalse(pullButton.disabled); - assert.isFalse(pushButton.disabled); - assert.equal(message.textContent, ''); - return true; - } catch (err) { - return fail(err); - } - }); + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isFalse(repository.fetch.called); + assert.isFalse(repository.push.called); + assert.isFalse(repository.pull.called); }); + }); - describe('when there is no remote named "origin"', function() { - beforeEach(async function() { - await repository.git.exec(['remote', 'remove', 'origin']); - }); + describe('when there is a remote and we are ahead', function() { + let repository; + let statusBarTile; - it('additionally disables the push button and displays an informative message', async function() { - const wrapper = mount(React.cloneElement(component, {repository})); - await wrapper.instance().refreshModelData(); + beforeEach(async function() { + const {localRepoPath} = await setUpLocalAndRemoteRepositories(); + repository = await buildRepository(localRepoPath); + await repository.git.commit('new local commit', {allowEmpty: true}); - const tip = getTooltipNode(wrapper, PushPullView); + statusBarTile = mount(React.cloneElement(component, {repository})); + await statusBarTile.instance().refreshModelData(); - const pullButton = tip.querySelector('button.github-PushPullMenuView-pull'); - const pushButton = tip.querySelector('button.github-PushPullMenuView-push'); - const message = tip.querySelector('.github-PushPullMenuView-message'); + sinon.spy(repository, 'fetch'); + sinon.spy(repository, 'push'); + sinon.spy(repository, 'pull'); + }); - assert.isTrue(pullButton.disabled); - assert.isTrue(pushButton.disabled); - assert.match(message.innerHTML, /No remote detected.*no remote named "origin"/); - }); + it('gives the option to push with ahead count', function() { + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Push 1'); + }); + + it('pushes when clicked', function() { + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isTrue(repository.push.called); + }); + + it('does nothing when clicked and is currently pushing', function() { + repository.getOperationStates().setPushInProgress(true); + statusBarTile = mount(React.cloneElement(component, {repository})); + + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isFalse(repository.fetch.called); + assert.isFalse(repository.push.called); + assert.isFalse(repository.pull.called); }); }); - it('displays an error message if push fails', async function() { - const {localRepoPath} = await setUpLocalAndRemoteRepositories(); - const repository = await buildRepositoryWithPipeline(localRepoPath, {confirm, notificationManager, workspace}); - await repository.git.exec(['reset', '--hard', 'HEAD~2']); - await repository.git.commit('another commit', {allowEmpty: true}); + describe('when there is a remote and we are behind', function() { + let repository; + let statusBarTile; - const wrapper = mount(React.cloneElement(component, {repository})); - await wrapper.instance().refreshModelData(); + beforeEach(async function() { + const {localRepoPath} = await setUpLocalAndRemoteRepositories(); + repository = await buildRepository(localRepoPath); + await repository.git.exec(['reset', '--hard', 'HEAD~2']); - const tip = getTooltipNode(wrapper, PushPullView); + statusBarTile = mount(React.cloneElement(component, {repository})); + await statusBarTile.instance().refreshModelData(); - const pullButton = tip.querySelector('button.github-PushPullMenuView-pull'); - const pushButton = tip.querySelector('button.github-PushPullMenuView-push'); + sinon.spy(repository, 'fetch'); + sinon.spy(repository, 'push'); + sinon.spy(repository, 'pull'); + }); - sinon.stub(notificationManager, 'addError'); + it('gives the option to push with behind count', function() { + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Pull 2'); + }); - assert.equal(pushButton.textContent.trim(), 'Push (1)'); - assert.equal(pullButton.textContent.trim(), 'Pull (2)'); + it('pulls when clicked', function() { + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isTrue(repository.pull.called); + }); - try { - await wrapper.instance().getWrappedComponentInstance().push(); - } catch (e) { - assert(e, 'is error'); - } - await wrapper.instance().refreshModelData(); + it('does nothing when clicked and is currently pulling', function() { + repository.getOperationStates().setPullInProgress(true); + statusBarTile = mount(React.cloneElement(component, {repository})); - await assert.async.isTrue(notificationManager.addError.called); - const notificationArgs = notificationManager.addError.args[0]; - assert.equal(notificationArgs[0], 'Push rejected'); - assert.match(notificationArgs[1].description, /Try pulling before pushing again/); + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isFalse(repository.fetch.called); + assert.isFalse(repository.push.called); + assert.isFalse(repository.pull.called); + }); + }); - await wrapper.instance().refreshModelData(); + describe('when there is a remote and we are ahead and behind', function() { + let repository; + let statusBarTile; + + beforeEach(async function() { + const {localRepoPath} = await setUpLocalAndRemoteRepositories(); + repository = await buildRepository(localRepoPath); + await repository.git.exec(['reset', '--hard', 'HEAD~2']); + await repository.git.commit('new local commit', {allowEmpty: true}); - await assert.async.equal(pushButton.textContent.trim(), 'Push (1)'); - await assert.async.equal(pullButton.textContent.trim(), 'Pull (2)'); - wrapper.unmount(); + statusBarTile = mount(React.cloneElement(component, {repository})); + await statusBarTile.instance().refreshModelData(); + + sinon.spy(repository, 'fetch'); + sinon.spy(repository, 'push'); + sinon.spy(repository, 'pull'); + }); + + it('gives the option to push with ahead and behind count', function() { + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), '1 Pull 2'); + }); + + it('pulls when clicked', function() { + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isTrue(repository.pull.called); + assert.isFalse(repository.fetch.called); + assert.isFalse(repository.push.called); + }); + + it('does nothing when clicked and is currently pulling', function() { + repository.getOperationStates().setPullInProgress(true); + statusBarTile = mount(React.cloneElement(component, {repository})); + + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isFalse(repository.fetch.called); + assert.isFalse(repository.push.called); + assert.isFalse(repository.pull.called); + }); }); - describe('with a detached HEAD', function() { - let wrapper; + describe('when there is a remote and we are detached HEAD', function() { + let repository; + let statusBarTile; beforeEach(async function() { - const workdirPath = await cloneRepository('multiple-commits'); - const repository = await buildRepository(workdirPath); + const {localRepoPath} = await setUpLocalAndRemoteRepositories(); + repository = await buildRepository(localRepoPath); await repository.checkout('HEAD~2'); - wrapper = mount(React.cloneElement(component, {repository})); - await wrapper.instance().refreshModelData(); + statusBarTile = mount(React.cloneElement(component, {repository})); + await statusBarTile.instance().refreshModelData(); + + sinon.spy(repository, 'fetch'); + sinon.spy(repository, 'push'); + sinon.spy(repository, 'pull'); }); - it('disables the fetch, pull, and push buttons', function() { - const tip = getTooltipNode(wrapper, PushPullView); + it('gives the option to push with ahead and behind count', function() { + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Not on branch'); + }); + + it('does nothing when clicked', function() { + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isFalse(repository.fetch.called); + assert.isFalse(repository.push.called); + assert.isFalse(repository.pull.called); + }); + }); + + }); + + describe('when there is no remote tracking branch', function() { + let repository; + + beforeEach(async function() { + const {localRepoPath} = await setUpLocalAndRemoteRepositories(); + repository = await buildRepository(localRepoPath); + await repository.git.exec(['checkout', '-b', 'new-branch']); + }); + + it('disables the fetch and pull buttons and displays an informative message', async function() { + const wrapper = mount(React.cloneElement(component, {repository})); + await wrapper.instance().refreshModelData(); + + const tip = getTooltipNode(wrapper, PushPullView); + + const pullButton = tip.querySelector('button.github-PushPullMenuView-pull'); + const pushButton = tip.querySelector('button.github-PushPullMenuView-push'); + const message = tip.querySelector('.github-PushPullMenuView-message'); + + assert.isTrue(pullButton.disabled); + assert.isFalse(pushButton.disabled); + assert.match(message.innerHTML, /No remote detected.*Pushing will set up a remote tracking branch/); - assert.isTrue(tip.querySelector('button.github-PushPullMenuView-pull').disabled); - assert.isTrue(tip.querySelector('button.github-PushPullMenuView-push').disabled); + pushButton.click(); + await until(async fail => { + try { + repository.refresh(); + await wrapper.instance().refreshModelData(); + + assert.isFalse(pullButton.disabled); + assert.isFalse(pushButton.disabled); + assert.equal(message.textContent, ''); + return true; + } catch (err) { + return fail(err); + } }); + }); + + describe('when there is no remote named "origin"', function() { + beforeEach(async function() { + await repository.git.exec(['remote', 'remove', 'origin']); + }); + + it('additionally disables the push button and displays an informative message', async function() { + const wrapper = mount(React.cloneElement(component, {repository})); + await wrapper.instance().refreshModelData(); - it('displays an appropriate explanation', function() { const tip = getTooltipNode(wrapper, PushPullView); + const pullButton = tip.querySelector('button.github-PushPullMenuView-pull'); + const pushButton = tip.querySelector('button.github-PushPullMenuView-push'); const message = tip.querySelector('.github-PushPullMenuView-message'); - assert.match(message.textContent, /not on a branch/); + + assert.isTrue(pullButton.disabled); + assert.isTrue(pushButton.disabled); + assert.match(message.innerHTML, /No remote detected.*no remote named "origin"/); }); }); }); + it('displays an error message if push fails', async function() { + const {localRepoPath} = await setUpLocalAndRemoteRepositories(); + const repository = await buildRepositoryWithPipeline(localRepoPath, {confirm, notificationManager, workspace}); + await repository.git.exec(['reset', '--hard', 'HEAD~2']); + await repository.git.commit('another commit', {allowEmpty: true}); + + const wrapper = mount(React.cloneElement(component, {repository})); + await wrapper.instance().refreshModelData(); + + sinon.stub(notificationManager, 'addError'); + + try { + await wrapper.instance().getWrappedComponentInstance().push(); + } catch (e) { + assert(e, 'is error'); + } + await wrapper.instance().refreshModelData(); + + await assert.async.isTrue(notificationManager.addError.called); + const notificationArgs = notificationManager.addError.args[0]; + assert.equal(notificationArgs[0], 'Push rejected'); + assert.match(notificationArgs[1].description, /Try pulling before pushing/); + + await wrapper.instance().refreshModelData(); + + wrapper.unmount(); + }); + + describe('with a detached HEAD', function() { + let wrapper; + + beforeEach(async function() { + const workdirPath = await cloneRepository('multiple-commits'); + const repository = await buildRepository(workdirPath); + await repository.checkout('HEAD~2'); + + wrapper = mount(React.cloneElement(component, {repository})); + await wrapper.instance().refreshModelData(); + }); + + it('disables the fetch, pull, and push buttons', function() { + const tip = getTooltipNode(wrapper, PushPullView); + + assert.isTrue(tip.querySelector('button.github-PushPullMenuView-pull').disabled); + assert.isTrue(tip.querySelector('button.github-PushPullMenuView-push').disabled); + }); + + it('displays an appropriate explanation', function() { + const tip = getTooltipNode(wrapper, PushPullView); + + const message = tip.querySelector('.github-PushPullMenuView-message'); + assert.match(message.textContent, /not on a branch/); + }); + }); + describe('fetch and pull commands', function() { it('fetches when github:fetch is triggered', async function() { const {localRepoPath} = await setUpLocalAndRemoteRepositories('multiple-commits', {remoteAhead: true}); From f9b975f02f3e02e13aca129fb39b8493d805d798 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 20 Mar 2018 00:50:24 +0100 Subject: [PATCH 0074/5422] Handle and test case of no "origin" remote --- lib/controllers/status-bar-tile-controller.js | 1 + lib/views/push-pull-view.js | 73 +++++++------ .../status-bar-tile-controller.test.js | 102 ++++-------------- 3 files changed, 64 insertions(+), 112 deletions(-) diff --git a/lib/controllers/status-bar-tile-controller.js b/lib/controllers/status-bar-tile-controller.js index 5b78cee018..0e17a02957 100644 --- a/lib/controllers/status-bar-tile-controller.js +++ b/lib/controllers/status-bar-tile-controller.js @@ -88,6 +88,7 @@ export default class StatusBarTileController extends React.Component { currentRemote: this.props.currentRemote, aheadCount: this.props.aheadCount, behindCount: this.props.behindCount, + originExists: this.props.originExists, changedFilesCount, mergeConflictsPresent, }; diff --git a/lib/views/push-pull-view.js b/lib/views/push-pull-view.js index 39fa5ae679..4a398a256d 100644 --- a/lib/views/push-pull-view.js +++ b/lib/views/push-pull-view.js @@ -24,6 +24,7 @@ export default class PushPullView extends React.Component { push: PropTypes.func.isRequired, pull: PropTypes.func.isRequired, fetch: PropTypes.func.isRequired, + originExists: PropTypes.bool, } static defaultProps = { @@ -43,8 +44,8 @@ export default class PushPullView extends React.Component { } setTooltip = () => { - this.tooltip = atom.tooltips.add(this.node, { - title: `
${this.clickNode.dataset.tooltip}
`, + this.tooltip = atom.tooltips.add(this.tileNode, { + title: `
${this.tooltipTarget.dataset.tooltip}
`, delay: {show: 200, hide: 100}, html: true, }); @@ -102,36 +103,37 @@ export default class PushPullView extends React.Component { const isUnpublished = !this.props.currentRemote.isPresent(); const isDetached = !!this.props.currentBranch.detached; const isSyncing = this.props.isSyncing; + const hasOrigin = !!this.props.originExists; return (
(this.node = node)} + ref={node => (this.tileNode = node)} className={cx('github-PushPull', 'inline-block', {'github-branch-detached': isDetached})}> {isAhead && !isBehind && !isUnpublished && ( (this.clickNode = node)} + ref={node => (this.tooltipTarget = node)} onClick={this.onClickPush} className="push-pull-target" data-tooltip="Click to push
Cmd-click to force push
Right-click for more"> Push {this.props.aheadCount} -
- )} + + )} {isBehind && !isAhead && !isUnpublished && ( - (this.clickNode = node)} - onClick={this.onClickPull} - className="push-pull-target" - data-tooltip="Click to pull
Right-click for more"> - +
(this.tooltipTarget = node)} + onClick={this.onClickPull} + className="push-pull-target" + data-tooltip="Click to pull
Right-click for more"> + Pull {this.props.behindCount} -
+ )} {isBehind && isAhead && !isUnpublished && !isSyncing && ( (this.clickNode = node)} + ref={node => (this.tooltipTarget = node)} onClick={this.onClickPushPull} className="push-pull-target" data-tooltip="Click to push
Cmd-click to force push
Right-click for more"> @@ -141,43 +143,52 @@ export default class PushPullView extends React.Component { Pull {this.props.behindCount} -
- )} + + )} {isBehind && isAhead && !isUnpublished && isSyncing && ( - - + + Pull {this.props.behindCount} - - )} + + )} {!isBehind && !isAhead && !isUnpublished && !isDetached && ( - (this.clickNode = node)} - onClick={this.onClickFetch} - className="push-pull-target" - data-tooltip="Click to fetch
Right-click for more"> - +
(this.tooltipTarget = node)} + onClick={this.onClickFetch} + className="push-pull-target" + data-tooltip="Click to fetch
Right-click for more"> + Fetch
)} - {isUnpublished && !isDetached && ( + {isUnpublished && !isDetached && hasOrigin && ( (this.clickNode = node)} + ref={node => (this.tooltipTarget = node)} onClick={this.onClickPublish} className="push-pull-target" - data-tooltip="Click to publish
Right-click for more"> + data-tooltip="Click to set up a remote tracking branch
Right-click for more"> Publish
)} + {isUnpublished && !isDetached && !hasOrigin && ( + (this.tooltipTarget = node)} + className="push-pull-target" + data-tooltip={'There is no remote named "origin"'}> + + No remote + + )} + {isDetached && ( - (this.clickNode = node)} + (this.tooltipTarget = node)} className="push-pull-target" data-tooltip={'Create a branch if you wish to push your work anywhere'}> - + Not on branch )} diff --git a/test/controllers/status-bar-tile-controller.test.js b/test/controllers/status-bar-tile-controller.test.js index 9212c5f863..55d6013469 100644 --- a/test/controllers/status-bar-tile-controller.test.js +++ b/test/controllers/status-bar-tile-controller.test.js @@ -10,7 +10,6 @@ import {getTempDir} from '../../lib/helpers'; import Repository from '../../lib/models/repository'; import StatusBarTileController from '../../lib/controllers/status-bar-tile-controller'; import BranchView from '../../lib/views/branch-view'; -import PushPullView from '../../lib/views/push-pull-view'; import ChangedFilesCountView from '../../lib/views/changed-files-count-view'; describe('StatusBarTileController', function() { @@ -267,7 +266,7 @@ describe('StatusBarTileController', function() { }); }); - describe.only('pushing and pulling', function() { + describe('pushing and pulling', function() { describe('status bar tile state', function() { @@ -487,67 +486,35 @@ describe('StatusBarTileController', function() { }); }); - }); - - describe('when there is no remote tracking branch', function() { - let repository; - - beforeEach(async function() { - const {localRepoPath} = await setUpLocalAndRemoteRepositories(); - repository = await buildRepository(localRepoPath); - await repository.git.exec(['checkout', '-b', 'new-branch']); - }); - - it('disables the fetch and pull buttons and displays an informative message', async function() { - const wrapper = mount(React.cloneElement(component, {repository})); - await wrapper.instance().refreshModelData(); - - const tip = getTooltipNode(wrapper, PushPullView); - - const pullButton = tip.querySelector('button.github-PushPullMenuView-pull'); - const pushButton = tip.querySelector('button.github-PushPullMenuView-push'); - const message = tip.querySelector('.github-PushPullMenuView-message'); - - assert.isTrue(pullButton.disabled); - assert.isFalse(pushButton.disabled); - assert.match(message.innerHTML, /No remote detected.*Pushing will set up a remote tracking branch/); - - pushButton.click(); - await until(async fail => { - try { - repository.refresh(); - await wrapper.instance().refreshModelData(); - - assert.isFalse(pullButton.disabled); - assert.isFalse(pushButton.disabled); - assert.equal(message.textContent, ''); - return true; - } catch (err) { - return fail(err); - } - }); - }); - describe('when there is no remote named "origin"', function() { + let repository; + let statusBarTile; + beforeEach(async function() { + const {localRepoPath} = await setUpLocalAndRemoteRepositories(); + repository = await buildRepository(localRepoPath); await repository.git.exec(['remote', 'remove', 'origin']); - }); - it('additionally disables the push button and displays an informative message', async function() { - const wrapper = mount(React.cloneElement(component, {repository})); - await wrapper.instance().refreshModelData(); + statusBarTile = mount(React.cloneElement(component, {repository})); + await statusBarTile.instance().refreshModelData(); - const tip = getTooltipNode(wrapper, PushPullView); + sinon.spy(repository, 'fetch'); + sinon.spy(repository, 'push'); + sinon.spy(repository, 'pull'); + }); - const pullButton = tip.querySelector('button.github-PushPullMenuView-pull'); - const pushButton = tip.querySelector('button.github-PushPullMenuView-push'); - const message = tip.querySelector('.github-PushPullMenuView-message'); + it('gives the option to push with ahead and behind count', function() { + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'No remote'); + }); - assert.isTrue(pullButton.disabled); - assert.isTrue(pushButton.disabled); - assert.match(message.innerHTML, /No remote detected.*no remote named "origin"/); + it('does nothing when clicked', function() { + statusBarTile.find('.push-pull-target').simulate('click'); + assert.isFalse(repository.fetch.called); + assert.isFalse(repository.push.called); + assert.isFalse(repository.pull.called); }); }); + }); it('displays an error message if push fails', async function() { @@ -578,33 +545,6 @@ describe('StatusBarTileController', function() { wrapper.unmount(); }); - describe('with a detached HEAD', function() { - let wrapper; - - beforeEach(async function() { - const workdirPath = await cloneRepository('multiple-commits'); - const repository = await buildRepository(workdirPath); - await repository.checkout('HEAD~2'); - - wrapper = mount(React.cloneElement(component, {repository})); - await wrapper.instance().refreshModelData(); - }); - - it('disables the fetch, pull, and push buttons', function() { - const tip = getTooltipNode(wrapper, PushPullView); - - assert.isTrue(tip.querySelector('button.github-PushPullMenuView-pull').disabled); - assert.isTrue(tip.querySelector('button.github-PushPullMenuView-push').disabled); - }); - - it('displays an appropriate explanation', function() { - const tip = getTooltipNode(wrapper, PushPullView); - - const message = tip.querySelector('.github-PushPullMenuView-message'); - assert.match(message.textContent, /not on a branch/); - }); - }); - describe('fetch and pull commands', function() { it('fetches when github:fetch is triggered', async function() { const {localRepoPath} = await setUpLocalAndRemoteRepositories('multiple-commits', {remoteAhead: true}); From d98120c2e891c6e5b38fa9538b01f11bc5ee9d3d Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 20 Mar 2018 00:51:37 +0100 Subject: [PATCH 0075/5422] Remove now-unused push-pull-menu-view --- lib/views/push-pull-menu-view.js | 148 ------------------ .../status-bar-tile-controller.test.js | 1 - 2 files changed, 149 deletions(-) delete mode 100644 lib/views/push-pull-menu-view.js diff --git a/lib/views/push-pull-menu-view.js b/lib/views/push-pull-menu-view.js deleted file mode 100644 index 7ec3971229..0000000000 --- a/lib/views/push-pull-menu-view.js +++ /dev/null @@ -1,148 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import {autobind} from 'core-decorators'; - -import {BranchPropType, RemotePropType} from '../prop-types'; -import {GitError} from '../git-shell-out-strategy'; - -export default class PushPullMenuView extends React.Component { - static propTypes = { - currentBranch: BranchPropType.isRequired, - currentRemote: RemotePropType.isRequired, - inProgress: PropTypes.bool, - aheadCount: PropTypes.number, - behindCount: PropTypes.number, - onMarkSpecialClick: PropTypes.func.isRequired, - fetch: PropTypes.func.isRequired, - push: PropTypes.func.isRequired, - pull: PropTypes.func.isRequired, - originExists: PropTypes.bool.isRequired, - } - - static defaultProps = { - inProgress: false, - onMarkSpecialClick: () => {}, - } - - constructor(props, context) { - super(props, context); - - this.state = { - errorMessage: '', - }; - } - - render() { - const errorMessage = this.getErrorMessage(); - const fetchDisabled = !this.props.currentRemote.isPresent() - || this.props.inProgress; - const pullDisabled = !this.props.currentRemote.isPresent() - || this.props.currentBranch.isDetached() - || this.props.inProgress; - const pushDisabled = this.props.currentBranch.isDetached() - || (!this.props.currentRemote.isPresent() && !this.props.originExists) - || this.props.inProgress; - - return ( -
-
- - - -
- - -
-
-
- {errorMessage} -
-
- ); - } - - getErrorMessage() { - if (this.state.errorMessage !== '') { - return this.state.errorMessage; - } - - if (this.props.currentBranch.isDetached()) { - return 'Note: you are not on a branch. Please create one if you wish to push your work anywhere.'; - } - - if (!this.props.currentRemote.isPresent()) { - if (this.props.originExists) { - return `Note: No remote detected for branch ${this.props.currentBranch.getName()}. ` + - 'Pushing will set up a remote tracking branch on remote repo "origin"'; - } else { - return `Note: No remote detected for branch ${this.props.currentBranch.getName()}. ` + - 'Cannot push because there is no remote named "origin" for which to create a remote tracking branch.'; - } - } - - return ''; - } - - @autobind - handleIconClick(evt) { - if (evt.shiftKey) { - this.props.onMarkSpecialClick(); - } - } - - @autobind - fetch() { - try { - return this.props.fetch(); - } catch (error) { - if (error instanceof GitError) { - // eslint-disable-next-line no-console - console.warn('Non-fatal', error); - } else { - throw error; - } - return null; - } - } - - @autobind - pull() { - try { - return this.props.pull(); - } catch (error) { - if (error instanceof GitError) { - // eslint-disable-next-line no-console - console.warn('Non-fatal', error); - } else { - throw error; - } - return null; - } - } - - @autobind - async push(evt) { - try { - await this.props.push({force: evt.metaKey || evt.ctrlKey, setUpstream: !this.props.currentRemote.isPresent()}); - } catch (error) { - if (error instanceof GitError) { - // eslint-disable-next-line no-console - console.warn('Non-fatal', error); - } else { - throw error; - } - } - } -} diff --git a/test/controllers/status-bar-tile-controller.test.js b/test/controllers/status-bar-tile-controller.test.js index 55d6013469..19329b4815 100644 --- a/test/controllers/status-bar-tile-controller.test.js +++ b/test/controllers/status-bar-tile-controller.test.js @@ -679,7 +679,6 @@ describe('StatusBarTileController', function() { assert.isFalse(wrapper.find('BranchView').exists()); assert.isFalse(wrapper.find('BranchMenuView').exists()); assert.isFalse(wrapper.find('PushPullView').exists()); - assert.isFalse(wrapper.find('PushPullMenuView').exists()); assert.isTrue(wrapper.find('ChangedFilesCountView').exists()); }); }); From 659709d406f53ea46d9dfffb4510a13b66b93c31 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 20 Mar 2018 20:33:55 -0700 Subject: [PATCH 0076/5422] Correct test case descriptions for push-pull-view --- test/controllers/status-bar-tile-controller.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/controllers/status-bar-tile-controller.test.js b/test/controllers/status-bar-tile-controller.test.js index 19329b4815..2b5ee8b441 100644 --- a/test/controllers/status-bar-tile-controller.test.js +++ b/test/controllers/status-bar-tile-controller.test.js @@ -397,7 +397,7 @@ describe('StatusBarTileController', function() { sinon.spy(repository, 'pull'); }); - it('gives the option to push with behind count', function() { + it('gives the option to pull with behind count', function() { assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Pull 2'); }); @@ -435,7 +435,7 @@ describe('StatusBarTileController', function() { sinon.spy(repository, 'pull'); }); - it('gives the option to push with ahead and behind count', function() { + it('gives the option to pull with ahead and behind count', function() { assert.equal(statusBarTile.find('.github-PushPull').text().trim(), '1 Pull 2'); }); @@ -474,7 +474,7 @@ describe('StatusBarTileController', function() { sinon.spy(repository, 'pull'); }); - it('gives the option to push with ahead and behind count', function() { + it('gives a hint that we are not on a branch', function() { assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Not on branch'); }); @@ -503,7 +503,7 @@ describe('StatusBarTileController', function() { sinon.spy(repository, 'pull'); }); - it('gives the option to push with ahead and behind count', function() { + it('gives that there is no remote', function() { assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'No remote'); }); From 95d92a48eaee0b4e5074641a9255c03bfb0fe4ae Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 20 Mar 2018 20:35:20 -0700 Subject: [PATCH 0077/5422] Fix unrelated indentations to make tests pass --- .../cross-referenced-events-container.js | 16 +++---- lib/github-package.js | 20 ++++----- lib/models/file-patch.js | 20 ++++----- lib/models/hunk-line.js | 44 +++++++++---------- 4 files changed, 50 insertions(+), 50 deletions(-) diff --git a/lib/containers/timeline-items/cross-referenced-events-container.js b/lib/containers/timeline-items/cross-referenced-events-container.js index 339244a395..fa26266fbe 100644 --- a/lib/containers/timeline-items/cross-referenced-events-container.js +++ b/lib/containers/timeline-items/cross-referenced-events-container.js @@ -51,14 +51,14 @@ export class CrossReferencedEvents extends React.Component { } else { let type = null; switch (first.source.__typename) { - case 'PullRequest': - type = 'pull request'; - break; - case 'Issue': - type = 'issue'; - break; - default: - throw new Error(`Invalid type: ${first.source.__typename}`); + case 'PullRequest': + type = 'pull request'; + break; + case 'Issue': + type = 'issue'; + break; + default: + throw new Error(`Invalid type: ${first.source.__typename}`); } let xrefClause = ''; if (first.isCrossRepository) { diff --git a/lib/github-package.js b/lib/github-package.js index 7e413e31d3..59f56ee447 100644 --- a/lib/github-package.js +++ b/lib/github-package.js @@ -342,16 +342,16 @@ export default class GithubPackage { // always return an empty stub // but only set it as the active item for a tab type // if it doesn't already exist - case 'atom-github://dock-item/git': - item = this.createGitTabControllerStub(uri); - this.gitTabStubItem = this.gitTabStubItem || item; - break; - case 'atom-github://dock-item/github': - item = this.createGithubTabControllerStub(uri); - this.githubTabStubItem = this.githubTabStubItem || item; - break; - default: - throw new Error(`Invalid DockItem stub URI: ${uri}`); + case 'atom-github://dock-item/git': + item = this.createGitTabControllerStub(uri); + this.gitTabStubItem = this.gitTabStubItem || item; + break; + case 'atom-github://dock-item/github': + item = this.createGithubTabControllerStub(uri); + this.githubTabStubItem = this.githubTabStubItem || item; + break; + default: + throw new Error(`Invalid DockItem stub URI: ${uri}`); } if (this.controller) { diff --git a/lib/models/file-patch.js b/lib/models/file-patch.js index 909289bdc1..beb1e76b88 100644 --- a/lib/models/file-patch.js +++ b/lib/models/file-patch.js @@ -226,16 +226,16 @@ export default class FilePatch { getUnstagePatch() { let invertedStatus; switch (this.getStatus()) { - case 'modified': - invertedStatus = 'modified'; - break; - case 'added': - invertedStatus = 'deleted'; - break; - case 'deleted': - invertedStatus = 'added'; - break; - default: + case 'modified': + invertedStatus = 'modified'; + break; + case 'added': + invertedStatus = 'deleted'; + break; + case 'deleted': + invertedStatus = 'added'; + break; + default: // throw new Error(`Unknown Status: ${this.getStatus()}`); } const invertedHunks = this.getHunks().map(h => h.invert()); diff --git a/lib/models/hunk-line.js b/lib/models/hunk-line.js index f75ce7f4b8..439ac90e8e 100644 --- a/lib/models/hunk-line.js +++ b/lib/models/hunk-line.js @@ -45,34 +45,34 @@ export default class HunkLine { getOrigin() { switch (this.getStatus()) { - case 'added': - return '+'; - case 'deleted': - return '-'; - case 'unchanged': - return ' '; - case 'nonewline': - return '\\'; - default: - return ''; + case 'added': + return '+'; + case 'deleted': + return '-'; + case 'unchanged': + return ' '; + case 'nonewline': + return '\\'; + default: + return ''; } } invert() { let invertedStatus; switch (this.getStatus()) { - case 'added': - invertedStatus = 'deleted'; - break; - case 'deleted': - invertedStatus = 'added'; - break; - case 'unchanged': - invertedStatus = 'unchanged'; - break; - case 'nonewline': - invertedStatus = 'nonewline'; - break; + case 'added': + invertedStatus = 'deleted'; + break; + case 'deleted': + invertedStatus = 'added'; + break; + case 'unchanged': + invertedStatus = 'unchanged'; + break; + case 'nonewline': + invertedStatus = 'nonewline'; + break; } return new HunkLine( From 27f66e057611d75e0742d8d0fc26da02e85fd99c Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 15:08:29 -0700 Subject: [PATCH 0078/5422] Populate user store in constructor Co-authored-by: Tilde Ann Thurium --- lib/controllers/git-tab-controller.js | 1 - lib/models/user-store.js | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index 4c4fd26583..5394ffe97d 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -190,7 +190,6 @@ export default class GitTabController extends React.Component { this.setState({mentionableUsers: users}); }, }); - this.userStore.populate(); } } diff --git a/lib/models/user-store.js b/lib/models/user-store.js index e04caeecdb..653a0251bc 100644 --- a/lib/models/user-store.js +++ b/lib/models/user-store.js @@ -5,6 +5,7 @@ export default class UserStore { this.repository = repository; this.onDidUpdate = onDidUpdate || (() => {}); this.users = {}; + this.populate(); } populate() { From 9cb3597d9ceed7d3a007737760af385cb677d05a Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 15:26:20 -0700 Subject: [PATCH 0079/5422] Handle edge case for getAuthors where repo has no commits Co-Authored-By: Tilde Ann Thurium --- lib/git-shell-out-strategy.js | 46 ++++++++++++++++++++--------------- lib/models/user-store.js | 34 ++++---------------------- test/git-strategies.test.js | 8 ++++++ 3 files changed, 40 insertions(+), 48 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index ce49181a7f..7e9904c6cc 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -616,25 +616,33 @@ export default class GitShellOutStrategy { const fields = [ "%an", "%ae", "%cn", "%ce", "%(trailers:unfold,only)" ] const format = fields.join(`%x${delimiter}`); - const output = await this.exec([ - 'log', `--format=${format}`, '-z', '-n', max, ref, '--', - ]); - - return output.split('\0') - .filter(l => l.length > 0) - .map(line => line.split(delimiterString)) - .reduce((acc, [ an, ae, cn, ce, trailers ]) => { - trailers - .split('\n') - .map(trailer => trailer.match(/^co-authored-by. (.+?) <(.+?)>$/i)) - .filter(match => match !== null) - .forEach(([ _, name, email ]) => acc[email] = name) - - acc[ae] = an - acc[ce] = cn - - return acc; - }, {}); + try { + const output = await this.exec([ + 'log', `--format=${format}`, '-z', '-n', max, ref, '--', + ]); + + return output.split('\0') + .filter(l => l.length > 0) + .map(line => line.split(delimiterString)) + .reduce((acc, [ an, ae, cn, ce, trailers ]) => { + trailers + .split('\n') + .map(trailer => trailer.match(/^co-authored-by. (.+?) <(.+?)>$/i)) + .filter(match => match !== null) + .forEach(([ _, name, email ]) => acc[email] = name) + + acc[ae] = an + acc[ce] = cn + + return acc; + }, {}); + } catch (err) { + if (/unknown revision/.test(err.stdErr) || /bad revision 'HEAD'/.test(err.stdErr)) { + return []; + } else { + throw err; + } + } } mergeTrailers(commitMessage, trailers, unfold) { diff --git a/lib/models/user-store.js b/lib/models/user-store.js index 653a0251bc..1cf8d9e29f 100644 --- a/lib/models/user-store.js +++ b/lib/models/user-store.js @@ -1,4 +1,5 @@ -// TODO: create proper User class +// This is a guess about what a reasonable value is. Can adjust if performance is poor. +const MAX_COMMITS = 5000; export default class UserStore { constructor({repository, onDidUpdate}) { @@ -9,11 +10,8 @@ export default class UserStore { } populate() { - // TODO: check conditional branches - // if repo present, get info if (this.repository.isPresent()) { this.loadUsers(); - // else, add listener to do so when repo is present } else { this.repository.onDidChangeState(({from, to}) => { if (!from.isPresent() && to.isPresent()) { @@ -24,13 +22,13 @@ export default class UserStore { } loadUsers() { - // TODO: also get users from GraphQL API if available. Will need to reshape the data accordingly - // look into using Dexie + // TODO: [ku 3/2018] also get users from GraphQL API if available. Will need to reshape the data accordingly + // Consider using Dexie (indexDB wrapper) like Desktop this.loadUsersFromLocalRepo(); } async loadUsersFromLocalRepo() { - const users = await this.repository.getAuthors({max: 5000}); + const users = await this.repository.getAuthors({max: MAX_COMMITS}); this.addUsers(users); } @@ -59,25 +57,3 @@ export default class UserStore { }); } } - -// class User { -// constructor({email, name, githubLogin}) { -// -// } -// -// isGitHubUser() { -// return !!this.githubLogin; -// } -// -// displayName() { -// if (this.githubLogin) { -// return `@${this.githubLogin}`; -// } else { -// return `${this.name}`; -// } -// } -// -// coAuthorTrailer() { -// return `Co-authored-by: ${this.email}`; -// } -// } diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index bdd1478471..ec3ec8c23a 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -263,6 +263,14 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; 'yet-another@example.com': 'yet another name', }); }); + + it('returns an empty array when there are no commits', async function() { + const workingDirPath = await initRepository(); + const git = createTestStrategy(workingDirPath); + + const authors = await git.getAuthors({max: 1}); + assert.deepEqual(authors, []) + }); }); describe('diffFileStatus', function() { From 0629af0a55943e5e027bd43019a0637a824edc7f Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 15:44:53 -0700 Subject: [PATCH 0080/5422] :memo: User Store Co-Authored-By: Tilde Ann Thurium --- lib/models/user-store.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/models/user-store.js b/lib/models/user-store.js index 1cf8d9e29f..dc0b77860c 100644 --- a/lib/models/user-store.js +++ b/lib/models/user-store.js @@ -5,6 +5,7 @@ export default class UserStore { constructor({repository, onDidUpdate}) { this.repository = repository; this.onDidUpdate = onDidUpdate || (() => {}); + // TODO: [ku 3/2018] Consider using Dexie (indexDB wrapper) like Desktop and persist users across sessions this.users = {}; this.populate(); } @@ -22,8 +23,6 @@ export default class UserStore { } loadUsers() { - // TODO: [ku 3/2018] also get users from GraphQL API if available. Will need to reshape the data accordingly - // Consider using Dexie (indexDB wrapper) like Desktop this.loadUsersFromLocalRepo(); } @@ -33,7 +32,8 @@ export default class UserStore { } addUsersFromGraphQL(response) { - // this gets called in query renderer callback + // TODO: [ku 3/2018] also get users from GraphQL API if available. Will need to reshape the data accordingly + // This will get called in relay query renderer callback // this.addUsers(users); } @@ -47,7 +47,8 @@ export default class UserStore { } getUsers() { - // don't actually do this. will change when we settle on best way to actually store data + // TODO: [ku 3/2018] consider sorting based on most recent authors or commit frequency + // This is obviously not the most performant. Test out on repo with many users to see if we need to optimize return Object.keys(this.users) .map(email => ({email, name: this.users[email]})) .sort((a, b) => { From 20e54f49a45c4f7cafd3e2bcf81cf29d9809a482 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 16:06:39 -0700 Subject: [PATCH 0081/5422] Add authors cache key Co-Authored-By: Tilde Ann Thurium --- lib/models/repository-states/present.js | 11 +++++++++-- lib/models/user-store.js | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index 7fda147c97..9bc86b9380 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -151,6 +151,7 @@ export default class Present extends State { keys.add(Keys.recentCommits); keys.add(Keys.statusBundle); keys.add(Keys.headDescription); + keys.add(Keys.authors); continue; } @@ -159,6 +160,7 @@ export default class Present extends State { keys.add(Keys.lastCommit); keys.add(Keys.recentCommits); keys.add(Keys.headDescription); + keys.add(Keys.authors); continue; } @@ -316,6 +318,7 @@ export default class Present extends State { Keys.stagedChangesSinceParentCommit, Keys.lastCommit, Keys.recentCommits, + Keys.authors, Keys.statusBundle, Keys.index.all, ...Keys.filePatch.eachWithOpts({staged: true, amending: true}), @@ -623,8 +626,9 @@ export default class Present extends State { // Author information getAuthors(options) { - // TODO: caching - return this.git().getAuthors(options); + return this.cache.getOrSet(Keys.authors, async () => { + return this.git().getAuthors(options); + }); } // Branches @@ -981,6 +985,8 @@ const Keys = { recentCommits: new CacheKey('recent-commits'), + authors: new CacheKey('authors'), + branches: new CacheKey('branches'), headDescription: new CacheKey('head-description'), @@ -1026,6 +1032,7 @@ const Keys = { Keys.stagedChangesSinceParentCommit, Keys.lastCommit, Keys.recentCommits, + Keys.authors, Keys.statusBundle, ], }; diff --git a/lib/models/user-store.js b/lib/models/user-store.js index dc0b77860c..55d8a94587 100644 --- a/lib/models/user-store.js +++ b/lib/models/user-store.js @@ -4,6 +4,9 @@ const MAX_COMMITS = 5000; export default class UserStore { constructor({repository, onDidUpdate}) { this.repository = repository; + this.repository.onDidUpdate(() => { + this.loadUsers(); + }) this.onDidUpdate = onDidUpdate || (() => {}); // TODO: [ku 3/2018] Consider using Dexie (indexDB wrapper) like Desktop and persist users across sessions this.users = {}; From a9d4a9b5674c7721a51edc5340df22c7e6fc2ad9 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 16:30:24 -0700 Subject: [PATCH 0082/5422] Add title to toggle co-authors icon for accessibility Co-Authored-By: Tilde Ann Thurium --- lib/views/commit-view.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index d9c916a975..e0851289c4 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -214,6 +214,7 @@ export default class CommitView extends React.Component { const svgPath = 'M9.875 2.125H12v1.75H9.875V6h-1.75V3.875H6v-1.75h2.125V0h1.75v2.125zM6 6.5a.5.5 0 0 1-.5.5h-5a.5.5 0 0 1-.5-.5V6c0-1.316 2-2 2-2s.114-.204 0-.5c-.42-.31-.472-.795-.5-2C1.587.293 2.434 0 3 0s1.413.293 1.5 1.5c-.028 1.205-.08 1.69-.5 2-.114.295 0 .5 0 .5s2 .684 2 2v.5z'; return ( + Toggle co-authors ); From e6d23f486b2eed393aa0a960305b474a7e009df2 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 16:33:27 -0700 Subject: [PATCH 0083/5422] :fire: login until we add github user info Co-Authored-By: Tilde Ann Thurium --- lib/views/commit-view.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index e0851289c4..e4f509b432 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -405,7 +405,7 @@ export default class CommitView extends React.Component { matchAuthors(authors, filterText, currentValues) { return authors .filter(x => !currentValues || currentValues.indexOf(x) === -1) - .filter(x => `${x.name}${x.login}${x.email}`.toLowerCase().indexOf(filterText.toLowerCase()) !== -1); + .filter(x => `${x.name}${x.email}`.toLowerCase().indexOf(filterText.toLowerCase()) !== -1); } renderCoAuthorListItemField(fieldName, value) { @@ -422,7 +422,6 @@ export default class CommitView extends React.Component { renderCoAuthorListItem(author) { return (
- {this.renderCoAuthorListItemField('username', author.login)} {this.renderCoAuthorListItemField('name', author.name)} {this.renderCoAuthorListItemField('email', author.email)}
@@ -430,9 +429,8 @@ export default class CommitView extends React.Component { } renderCoAuthorValue(author) { - const user = author.login ? `@${author.login}` : author.name; return ( - {user} + {author.name} ); } From 46ef9cd9722312b87537e7762d92c592ac9d9a0d Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 16:41:17 -0700 Subject: [PATCH 0084/5422] Don't call UserStore#populate in tests since it happens upon construction Co-Authored-By: Tilde Ann Thurium --- test/models/user-store.test.js | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/test/models/user-store.test.js b/test/models/user-store.test.js index ace0f1e09b..859a113e6d 100644 --- a/test/models/user-store.test.js +++ b/test/models/user-store.test.js @@ -3,23 +3,20 @@ import UserStore from '../../lib/models/user-store'; import {cloneRepository, buildRepository} from '../helpers'; describe('UserStore', function() { - describe('populate', function() { - it('loads store with users in repo', async function() { - const workdirPath = await cloneRepository('multiple-commits'); - const repository = await buildRepository(workdirPath); - const store = new UserStore({repository}); + it('loads store with users in repo upon construction', async function() { + const workdirPath = await cloneRepository('multiple-commits'); + const repository = await buildRepository(workdirPath); + const store = new UserStore({repository}); - assert.deepEqual(store.getUsers(), []); + assert.deepEqual(store.getUsers(), []); - await store.populate(); - const users = store.getUsers(); - assert.deepEqual(users, [ - { - email: 'kuychaco@github.com', - name: 'Katrina Uychaco', - }, - ]); - }); + // Store is populated asynchronously + await assert.async.deepEqual(store.getUsers(), [ + { + email: 'kuychaco@github.com', + name: 'Katrina Uychaco', + }, + ]); }); describe('addUsers', function() { @@ -28,13 +25,14 @@ describe('UserStore', function() { const repository = await buildRepository(workdirPath); const store = new UserStore({repository}); - await store.populate(); + await assert.async.lengthOf(store.getUsers(), 1); + store.addUsers({ 'mona@lisa.com': 'Mona Lisa', 'hubot@github.com': 'Hubot Robot', }); - assert.deepEqual(store.getUsers(), [ + await assert.async.deepEqual(store.getUsers(), [ { name: 'Hubot Robot', email: 'hubot@github.com', From 8a6ca824d02812efb771f631d4f0c63c16942e99 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 17:34:30 -0700 Subject: [PATCH 0085/5422] Add User Store test for refetching data when HEAD changes Co-Authored-By: Tilde Ann Thurium --- test/models/user-store.test.js | 39 +++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/test/models/user-store.test.js b/test/models/user-store.test.js index 859a113e6d..4d8be260ff 100644 --- a/test/models/user-store.test.js +++ b/test/models/user-store.test.js @@ -1,3 +1,5 @@ +import dedent from 'dedent-js' + import UserStore from '../../lib/models/user-store'; import {cloneRepository, buildRepository} from '../helpers'; @@ -20,7 +22,7 @@ describe('UserStore', function() { }); describe('addUsers', function() { - it('adds specified user', async function() { + it('adds specified users and does not overwrite existing users', async function() { const workdirPath = await cloneRepository('multiple-commits'); const repository = await buildRepository(workdirPath); const store = new UserStore({repository}); @@ -48,4 +50,39 @@ describe('UserStore', function() { ]); }); }); + + it('refetches users when HEAD changes', async function() { + const workdirPath = await cloneRepository('multiple-commits'); + const repository = await buildRepository(workdirPath); + await repository.checkout('new-branch', {createNew: true}); + await repository.commit('commit 1', {allowEmpty: true}); + await repository.commit('commit 2', {allowEmpty: true}); + await repository.checkout('master'); + + const store = new UserStore({repository}); + await assert.async.deepEqual(store.getUsers(), [ + { + email: 'kuychaco@github.com', + name: 'Katrina Uychaco', + }, + ]); + + sinon.spy(store, 'addUsers') + + // Head changes due to new commit + await repository.commit(dedent` + New commit + + Co-authored-by: New Author + `, {allowEmpty: true}); + + await assert.async.equal(store.addUsers.callCount, 1) + assert.isOk(store.getUsers().find(user => { + return user.name === 'New Author' && user.email === 'new-author@email.com'; + })); + + // Change head due to branch checkout + await repository.checkout('new-branch') + await assert.async.equal(store.addUsers.callCount, 2) + }); }); From c93f83a25636034553730624f2e248ef21ca9bc0 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 18:10:01 -0700 Subject: [PATCH 0086/5422] Fix test Co-Authored-By: Tilde Ann Thurium --- test/git-strategies.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index ec3ec8c23a..428f0f4c77 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -251,8 +251,8 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; Implemented feature collaboratively Co-authored-by: name - Co-authored-by: another name " - Co-authored-by: yet another name " + Co-authored-by: another name + Co-authored-by: yet another name `, {allowEmpty: true}); const authors = await git.getAuthors({max: 1}); From 5cdee60dcd4778902e48065c640d4e96ccc9c903 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 18:26:02 -0700 Subject: [PATCH 0087/5422] Trim message before committing and default coAuthors to empty array (to fix tests) Co-Authored-By: Tilde Ann Thurium --- lib/controllers/commit-controller.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/controllers/commit-controller.js b/lib/controllers/commit-controller.js index 952c066a73..176d9a89c8 100644 --- a/lib/controllers/commit-controller.js +++ b/lib/controllers/commit-controller.js @@ -139,7 +139,7 @@ export default class CommitController extends React.Component { } @autobind - async commit(message, coAuthors) { + async commit(message, coAuthors = []) { let msg; if (this.getCommitMessageEditors().length > 0) { @@ -149,15 +149,17 @@ export default class CommitController extends React.Component { msg = wrapMessage ? wrapCommitMessage(message) : message; } - // TODO: ensure that expanded editor commit functionality still works - const trailers = coAuthors.map(author => { - return { - token: 'Co-Authored-By', - value: `${author.name} <${author.email}>`, - }; - }); - const msgWithTrailers = await this.props.repository.addTrailersToCommitMessage(msg, trailers); - await this.props.commit(msgWithTrailers); + if (coAuthors.length) { + // TODO: ensure that expanded editor commit functionality still works + const trailers = coAuthors.map(author => { + return { + token: 'Co-Authored-By', + value: `${author.name} <${author.email}>`, + }; + }); + msg = await this.props.repository.addTrailersToCommitMessage(msg, trailers); + } + return this.props.commit(msg.trim()); } getCommitMessage() { From 7cb00e98e6d066fb03165c39205694a8a0e03b1e Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 18:37:59 -0700 Subject: [PATCH 0088/5422] Add comment about caching Co-Authored-By: Tilde Ann Thurium --- lib/models/repository-states/present.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index 9bc86b9380..cf6ede5e2f 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -626,6 +626,9 @@ export default class Present extends State { // Author information getAuthors(options) { + // For now we'll do the naive thing and invalidate anytime HEAD moves. This ensures that we get new authors + // introduced by newly created commits or pulled commits. + // This means that we are constantly re-fetching data. If performance becomes a concern we can optimize return this.cache.getOrSet(Keys.authors, async () => { return this.git().getAuthors(options); }); From 5329c861ebf7c3cfcbf573aab537452c1d786980 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 23:04:23 -0700 Subject: [PATCH 0089/5422] :shirt: --- lib/git-shell-out-strategy.js | 16 +- lib/models/repository-states/present.js | 2 +- lib/models/user-store.js | 6 +- lib/views/commit-view.js | 8 +- package-lock.json | 3815 +++++------------------ package.json | 5 +- test/git-strategies.test.js | 2 +- test/models/user-store.test.js | 10 +- 8 files changed, 781 insertions(+), 3083 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 7e9904c6cc..9c6770c1a6 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -611,9 +611,9 @@ export default class GitShellOutStrategy { // by newlines and unfolded (i.e. properly // formatted and one trailer per line). - const delimiter = '1F' - const delimiterString = String.fromCharCode(parseInt(delimiter, 16)) - const fields = [ "%an", "%ae", "%cn", "%ce", "%(trailers:unfold,only)" ] + const delimiter = '1F'; + const delimiterString = String.fromCharCode(parseInt(delimiter, 16)); + const fields = ['%an', '%ae', '%cn', '%ce', '%(trailers:unfold,only)']; const format = fields.join(`%x${delimiter}`); try { @@ -624,18 +624,18 @@ export default class GitShellOutStrategy { return output.split('\0') .filter(l => l.length > 0) .map(line => line.split(delimiterString)) - .reduce((acc, [ an, ae, cn, ce, trailers ]) => { + .reduce((acc, [an, ae, cn, ce, trailers]) => { trailers .split('\n') .map(trailer => trailer.match(/^co-authored-by. (.+?) <(.+?)>$/i)) .filter(match => match !== null) - .forEach(([ _, name, email ]) => acc[email] = name) + .forEach(([_, name, email]) => { acc[email] = name; }); - acc[ae] = an - acc[ce] = cn + acc[ae] = an; + acc[ce] = cn; return acc; - }, {}); + }, {}); } catch (err) { if (/unknown revision/.test(err.stdErr) || /bad revision 'HEAD'/.test(err.stdErr)) { return []; diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index cf6ede5e2f..d1f871d31c 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -629,7 +629,7 @@ export default class Present extends State { // For now we'll do the naive thing and invalidate anytime HEAD moves. This ensures that we get new authors // introduced by newly created commits or pulled commits. // This means that we are constantly re-fetching data. If performance becomes a concern we can optimize - return this.cache.getOrSet(Keys.authors, async () => { + return this.cache.getOrSet(Keys.authors, () => { return this.git().getAuthors(options); }); } diff --git a/lib/models/user-store.js b/lib/models/user-store.js index 55d8a94587..532edb5926 100644 --- a/lib/models/user-store.js +++ b/lib/models/user-store.js @@ -6,7 +6,7 @@ export default class UserStore { this.repository = repository; this.repository.onDidUpdate(() => { this.loadUsers(); - }) + }); this.onDidUpdate = onDidUpdate || (() => {}); // TODO: [ku 3/2018] Consider using Dexie (indexDB wrapper) like Desktop and persist users across sessions this.users = {}; @@ -55,8 +55,8 @@ export default class UserStore { return Object.keys(this.users) .map(email => ({email, name: this.users[email]})) .sort((a, b) => { - if(a.name < b.name) return -1; - if(a.name > b.name) return 1; + if (a.name < b.name) { return -1; } + if (a.name > b.name) { return 1; } return 0; }); } diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index e4f509b432..8fd762ebec 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -315,8 +315,8 @@ export default class CommitView extends React.Component { @autobind toggleCoAuthorInput() { this.setState({ - showCoAuthorInput: !this.state.showCoAuthorInput - }) + showCoAuthorInput: !this.state.showCoAuthorInput, + }); } @autobind @@ -410,12 +410,12 @@ export default class CommitView extends React.Component { renderCoAuthorListItemField(fieldName, value) { if (!value || value.length === 0) { - return null + return null; } return ( {value} - ) + ); } @autobind diff --git a/package-lock.json b/package-lock.json index bd4eee7132..ee6363dbfd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,7 +2,6 @@ "name": "github", "version": "0.12.0", "lockfileVersion": 1, - "requires": true, "dependencies": { "7zip": { "version": "0.0.6", @@ -13,16 +12,13 @@ "acorn": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha1-U/4WERH5EquZnuiHqQoLxSgi/XU=", + "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", "dev": true }, "acorn-jsx": { "version": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, - "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" - }, "dependencies": { "acorn": { "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", @@ -34,13 +30,19 @@ "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=" + }, + "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-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true }, "ansi-regex": { "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -70,11 +72,29 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "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=" }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -113,41 +133,25 @@ "atom-babel6-transpiler": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/atom-babel6-transpiler/-/atom-babel6-transpiler-1.1.3.tgz", - "integrity": "sha1-1wKxDpDrzx+R4apcSnm5zqmKm6Y=", - "requires": { - "babel-core": "6.26.0" - } + "integrity": "sha1-1wKxDpDrzx+R4apcSnm5zqmKm6Y=" }, "atom-mocha-test-runner": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/atom-mocha-test-runner/-/atom-mocha-test-runner-1.2.0.tgz", "integrity": "sha1-qPZQm40pqAn8tv9H8FiEthLNxqk=", "dev": true, - "requires": { - "etch": "0.8.0", - "grim": "2.0.2", - "less": "2.7.3", - "mocha": "3.4.2", - "tmp": "0.0.31" - }, "dependencies": { "etch": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/etch/-/etch-0.8.0.tgz", "integrity": "sha1-VPYZV0NG+KPueXP1T7vQG1YnItY=", - "dev": true, - "requires": { - "virtual-dom": "2.1.1" - } + "dev": true }, "grim": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/grim/-/grim-2.0.2.tgz", "integrity": "sha512-Qj7hTJRfd87E/gUgfvM0YIH/g2UA2SV6niv6BYXk1o6w4mhgv+QyYM1EjOJQljvzgEj4SqSsRWldXIeKHz3e3Q==", - "dev": true, - "requires": { - "event-kit": "2.4.0" - } + "dev": true } } }, @@ -168,85 +172,31 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" - }, "dependencies": { "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "3.0.2" - } + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=" }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.1" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" }, "babel-template": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" - } + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=" }, "babel-traverse": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" - } + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" }, "babylon": { "version": "6.18.0", @@ -269,12 +219,6 @@ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4" - }, "dependencies": { "ansi-regex": { "version": "2.1.1", @@ -292,25 +236,13 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } + "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } + "dev": true }, "escape-string-regexp": { "version": "1.0.5", @@ -328,19 +260,13 @@ "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" - } + "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" - } + "dev": true }, "supports-color": { "version": "2.0.0", @@ -354,36 +280,16 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "requires": { - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.0" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "4.17.5", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" }, "regenerator-runtime": { "version": "0.11.0", @@ -401,31 +307,16 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.1" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "4.17.5", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" }, "regenerator-runtime": { "version": "0.11.1", @@ -438,108 +329,55 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.1" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "4.17.5", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" } } }, "babel-helper-function-name": { "version": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=" }, "babel-helper-get-function-arity": { "version": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=" }, "babel-helper-optimise-call-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=" }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=" }, "babel-helper-replace-supers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=" }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=" }, "babel-messages": { "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=" }, "babel-plugin-chai-assert-async": { "version": "0.1.0", @@ -549,28 +387,17 @@ "babel-plugin-check-es2015-constants": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=" }, "babel-plugin-relay": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-relay/-/babel-plugin-relay-1.4.1.tgz", "integrity": "sha1-isVivLH9KzVl0nGqztMr5CyCc1M=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "graphql": "0.11.7" - }, "dependencies": { "graphql": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=", - "requires": { - "iterall": "1.1.3" - } + "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=" } } }, @@ -607,44 +434,22 @@ "babel-plugin-transform-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=" }, "babel-plugin-transform-class-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - }, "dependencies": { "babel-helper-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=" }, "babel-helper-get-function-arity": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=" }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", @@ -657,11 +462,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz", "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", - "requires": { - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - }, "dependencies": { "babel-plugin-syntax-decorators": { "version": "6.13.0", @@ -673,236 +473,119 @@ "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=" }, "babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=" }, "babel-plugin-transform-es2015-block-scoping": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - }, "dependencies": { "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "3.0.2" - } + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=" }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.1" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" }, "babel-template": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" - } + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=" }, "babel-traverse": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.3", - "lodash": "4.17.5" - } + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "4.17.5", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "invariant": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", - "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", - "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" - } + "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==" }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" } } }, "babel-plugin-transform-es2015-classes": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=" }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=" }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=" }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=" }, "babel-plugin-transform-es2015-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=" }, "babel-plugin-transform-es2015-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=" }, "babel-plugin-transform-es2015-modules-commonjs": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - }, "dependencies": { "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "3.0.2" - } + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=" }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.0" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" }, "babel-template": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" - } + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=" }, "babel-traverse": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "4.17.5" - } + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "4.17.5", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" }, "babylon": { "version": "6.18.0", @@ -919,123 +602,69 @@ "babel-plugin-transform-es2015-object-super": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=" }, "babel-plugin-transform-es2015-parameters": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - }, "dependencies": { "babel-helper-call-delegate": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=" }, "babel-helper-get-function-arity": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=" }, "babel-helper-hoist-variables": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=" } } }, "babel-plugin-transform-es2015-shorthand-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=" }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=" }, "babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=" }, "babel-plugin-transform-es3-member-expression-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz", - "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=" }, "babel-plugin-transform-es3-property-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz", - "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=" }, "babel-plugin-transform-flow-strip-types": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=" }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.0" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" }, "regenerator-runtime": { "version": "0.11.0", @@ -1047,48 +676,27 @@ "babel-plugin-transform-react-display-name": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "requires": { - "babel-runtime": "6.25.0" - } + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=" }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=" }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=" }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.1" - }, "dependencies": { "regenerator-runtime": { "version": "0.11.1", @@ -1107,69 +715,22 @@ "babel-preset-fbjs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-2.1.4.tgz", - "integrity": "sha1-IvNY5mVAc6z2HkegUqd317zPA68=", - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-plugin-syntax-flow": "6.18.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-class-properties": "6.24.1", - "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-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-commonjs": "6.26.0", - "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-template-literals": "6.22.0", - "babel-plugin-transform-es3-member-expression-literals": "6.22.0", - "babel-plugin-transform-es3-property-literals": "6.22.0", - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-plugin-transform-object-rest-spread": "6.26.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1" - } + "integrity": "sha1-IvNY5mVAc6z2HkegUqd317zPA68=" }, "babel-preset-react": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" - }, "dependencies": { "babel-helper-builder-react-jsx": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.1" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" } } }, @@ -1186,67 +747,37 @@ "babel-plugin-transform-flow-strip-types": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=" }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=" }, "babel-plugin-transform-react-jsx-self": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=" }, "babel-plugin-transform-react-jsx-source": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.25.0" - } + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=" }, "babel-preset-flow": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" - } + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.1" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" } } }, @@ -1276,24 +807,11 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.0", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.1" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" }, "regenerator-runtime": { "version": "0.11.1", @@ -1305,50 +823,22 @@ "babel-runtime": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" - } + "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=" }, "babel-template": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.5" - } + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=" }, "babel-traverse": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "4.17.5" - } + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=" }, "babel-types": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "requires": { - "babel-runtime": "6.25.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "4.17.5", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" }, "babylon": { "version": "6.17.4", @@ -1364,57 +854,29 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" } } }, "bash-glob": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bash-glob/-/bash-glob-1.0.2.tgz", - "integrity": "sha1-laxWMf3XqPxWnyZxZ6hOuDGXmhs=", - "requires": { - "async-each": "1.0.1", - "bash-path": "1.0.3", - "component-emitter": "1.2.1", - "cross-spawn": "5.1.0", - "extend-shallow": "2.0.1", - "is-extglob": "2.1.1", - "is-glob": "4.0.0" - } + "integrity": "sha1-laxWMf3XqPxWnyZxZ6hOuDGXmhs=" }, "bash-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bash-path/-/bash-path-1.0.3.tgz", - "integrity": "sha1-28nvvfGLHBFBPctZuWDmqlbIQlg=", - "requires": { - "arr-union": "3.1.0", - "is-windows": "1.0.2" - } + "integrity": "sha1-28nvvfGLHBFBPctZuWDmqlbIQlg=" }, "bcrypt-pbkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } + "optional": true }, "boolbase": { "version": "1.0.0", @@ -1425,46 +887,22 @@ "boom": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.1" - } + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=" }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=" }, "braces": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.1", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" } } }, @@ -1482,10 +920,13 @@ "bser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "requires": { - "node-int64": "0.4.0" - } + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=" + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true }, "builtin-modules": { "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1494,24 +935,25 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - } + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=" }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -1533,11 +975,6 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", "dev": true, - "requires": { - "assertion-error": "1.1.0", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" - }, "dependencies": { "assertion-error": { "version": "1.1.0", @@ -1550,9 +987,6 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", "dev": true, - "requires": { - "type-detect": "0.1.1" - }, "dependencies": { "type-detect": { "version": "0.1.1", @@ -1578,62 +1012,34 @@ }, "chalk": { "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - } + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" }, "checksum": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/checksum/-/checksum-0.1.1.tgz", - "integrity": "sha1-3GUn1MkL6FYNvR7Uzs8yl9Uo6ek=", - "requires": { - "optimist": "0.3.7" - } + "integrity": "sha1-3GUn1MkL6FYNvR7Uzs8yl9Uo6ek=" }, "cheerio": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "dev": true, - "requires": { - "css-select": "1.2.0", - "dom-serializer": "0.1.0", - "entities": "1.1.1", - "htmlparser2": "3.9.2", - "lodash.assignin": "4.2.0", - "lodash.bind": "4.2.1", - "lodash.defaults": "4.2.0", - "lodash.filter": "4.6.0", - "lodash.flatten": "4.4.0", - "lodash.foreach": "4.5.0", - "lodash.map": "4.6.0", - "lodash.merge": "4.6.0", - "lodash.pick": "4.4.0", - "lodash.reduce": "4.6.0", - "lodash.reject": "4.6.0", - "lodash.some": "4.6.0" - } + "dev": true }, "chownr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, "dependencies": { "define-property": { "version": "0.2.5", @@ -1644,17 +1050,11 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -1662,17 +1062,11 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -1693,23 +1087,27 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "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=", - "requires": { - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - } + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" } } }, @@ -1718,30 +1116,25 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=" }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "1.0.0" - } + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=" }, "commander": { "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" - } + "dev": true }, "compare-sets": { "version": "1.0.1", @@ -1757,6 +1150,12 @@ "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true + }, "contains-path": { "version": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", @@ -1789,22 +1188,12 @@ "create-react-class": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", - "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", - "requires": { - "fbjs": "0.8.14", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } + "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=" }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, "dependencies": { "lru-cache": { "version": "4.1.2", @@ -1823,17 +1212,11 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, "dependencies": { "boom": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.2.1" - } + "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=" } } }, @@ -1841,13 +1224,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", - "domutils": "1.5.1", - "nth-check": "1.0.1" - } + "dev": true }, "css-what": { "version": "2.1.0", @@ -1855,13 +1232,16 @@ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", "dev": true }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -1873,10 +1253,7 @@ "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" }, "decamelize": { "version": "1.2.0", @@ -1894,24 +1271,28 @@ "integrity": "sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU=", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } + "dev": true }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - } + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=" + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true }, "delayed-stream": { "version": "1.0.0", @@ -1920,10 +1301,7 @@ }, "detect-indent": { "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" - } + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=" }, "diff": { "version": "3.2.0", @@ -1940,10 +1318,6 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, "dependencies": { "domelementtype": { "version": "1.1.3", @@ -1969,10 +1343,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } + "dev": true }, "dompurify": { "version": "1.0.3", @@ -1983,52 +1354,28 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } + "dev": true }, "dugite": { "version": "1.60.0", "resolved": "https://registry.npmjs.org/dugite/-/dugite-1.60.0.tgz", - "integrity": "sha512-HP5Qfx867ESOkrrEhXtxi72UQoNWaCSEcahGCmnBM/v+ldgbFu94s9CvG3tDcBtz1HJkvYEtkBd8V8Vb63nfUw==", - "requires": { - "checksum": "0.1.1", - "mkdirp": "0.5.1", - "progress": "2.0.0", - "request": "2.85.0", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "tar": "4.4.0" - } + "integrity": "sha512-HP5Qfx867ESOkrrEhXtxi72UQoNWaCSEcahGCmnBM/v+ldgbFu94s9CvG3tDcBtz1HJkvYEtkBd8V8Vb63nfUw==" }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } + "optional": true }, "electron-devtools-installer": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-2.2.3.tgz", "integrity": "sha1-WLmk7FBzd7xG4JHNQ3FBiODDab4=", - "dev": true, - "requires": { - "7zip": "0.0.6", - "cross-unzip": "0.0.2", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "semver": "5.4.1" - } + "dev": true }, "encoding": { "version": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "0.4.18" - } + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=" }, "entities": { "version": "1.1.1", @@ -2040,60 +1387,30 @@ "version": "2.9.1", "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-2.9.1.tgz", "integrity": "sha1-B9XOaRJBJA+4F78sSxjW5TAkDfY=", - "dev": true, - "requires": { - "cheerio": "0.22.0", - "function.prototype.name": "1.0.3", - "is-subset": "0.1.1", - "lodash": "4.17.5", - "object-is": "1.0.1", - "object.assign": "4.0.4", - "object.entries": "1.0.4", - "object.values": "1.0.4", - "prop-types": "15.6.1", - "uuid": "3.1.0" - } + "dev": true }, "errno": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", "dev": true, - "optional": true, - "requires": { - "prr": "0.0.0" - } + "optional": true }, "error": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/error/-/error-4.4.0.tgz", "integrity": "sha1-v2n/JR+0onnBmtzNqmth6Q2b8So=", - "dev": true, - "requires": { - "camelize": "1.0.0", - "string-template": "0.2.1", - "xtend": "4.0.1" - } + "dev": true }, "error-ex": { "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "requires": { - "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - } + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" }, "es-abstract": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", - "integrity": "sha1-aQgpoHyuNrIi5/2bdcDQVz6yUic=", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "is-callable": "1.1.3", - "is-regex": "1.0.4" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -2107,868 +1424,78 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true + }, + "es5-ext": { + "version": "0.10.41", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.41.tgz", + "integrity": "sha512-MYK02wXfwTMie5TEJWPolgOsXEmz7wKCQaGzgmRjZOoV6VLG8I5dSv2bn6AOClXhK64gnSQTQ9W9MKvx87J4gw==", "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "dependencies": { + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + } } }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true + }, "es6-promise": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", "integrity": "sha1-3EIhwrFlGHYL2MOaUtjzVvwA7Sk=" }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true + }, "escape-string-regexp": { "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true + }, "eslint": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.1", - "debug": "2.6.8", - "doctrine": "2.1.0", - "escope": "3.6.0", - "espree": "3.5.0", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.17.2", - "is-resolvable": "1.1.0", - "js-yaml": "3.9.1", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - }, "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.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-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "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 - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "2.0.2" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40", - "es6-symbol": "3.1.1" - }, - "dependencies": { - "es5-ext": { - "version": "0.10.40", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.40.tgz", - "integrity": "sha512-S9Fh3oya5OOvYSNGvPZJ+vyrs6VYpe1IXPowVe3N1OhaiwVaGlwfn3Zf5P5klYcWOA0toIwYQW8XEv/QqhdHvQ==", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - } - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "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 - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "estraverse": "4.2.0" - } - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "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" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.5", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.1" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - } - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "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" - } - }, - "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-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "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 - }, - "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 - }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.5", - "slice-ansi": "0.0.4", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "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 - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } } } }, @@ -2988,11 +1515,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", "integrity": "sha1-q67IJBd2E7ipWymWOeG2+s9HNEk=", - "dev": true, - "requires": { - "debug": "2.6.8", - "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" - } + "dev": true }, "eslint-plugin-babel": { "version": "4.1.2", @@ -3004,57 +1527,31 @@ "version": "2.34.1", "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.34.1.tgz", "integrity": "sha512-xwXpTW7Xv+wfuQdfPILmFl9HWBdWbDjE1aZWWQ4EgCpQtMzymEkDQfyD1ME0VA8C0HTXV7cufypQRvLi+Hk/og==", - "dev": true, - "requires": { - "lodash": "4.17.5" - } + "dev": true }, "eslint-plugin-import": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.6.1.tgz", "integrity": "sha512-aAMb32eHCQaQmgdb1MOG1hfu/rPiNgGur2IF71VJeDfTXdLpPiKALKWlzxMdcxQOZZ2CmYVKabAxCvjACxH1uQ==", "dev": true, - "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "contains-path": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "debug": "2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.1", - "eslint-module-utils": "2.1.1", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "lodash.cond": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz" - }, "dependencies": { "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "dev": true }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", - "dev": true, - "requires": { - "debug": "2.6.8", - "resolve": "1.4.0" - } + "dev": true }, "ms": { "version": "2.0.0", @@ -3075,27 +1572,18 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", "integrity": "sha1-gN8yU8TXkBBF7If6ZgooTjK9yik=", "dev": true, - "requires": { - "ignore": "3.3.7", - "minimatch": "3.0.4", - "resolve": "1.4.0", - "semver": "5.3.0" - }, "dependencies": { "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } + "dev": true }, "semver": { "version": "5.3.0", @@ -3121,12 +1609,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", "integrity": "sha1-J3cKzzn1/UnNCvQIPOWBBOs5DUw=", - "dev": true, - "requires": { - "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "jsx-ast-utils": "1.4.1" - } + "dev": true }, "eslint-plugin-standard": { "version": "3.0.1", @@ -3138,11 +1621,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", - "dev": true, - "requires": { - "acorn": "5.1.1", - "acorn-jsx": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" - } + "dev": true }, "esprima": { "version": "4.0.0", @@ -3150,6 +1629,24 @@ "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", "dev": true }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, "esutils": { "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" @@ -3163,10 +1660,13 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/ev-store/-/ev-store-7.0.0.tgz", "integrity": "sha1-GrDH+CE2UF3XSzHRdwHLK+bSZVg=", - "dev": true, - "requires": { - "individual": "3.0.0" - } + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true }, "event-kit": { "version": "2.4.0", @@ -3176,54 +1676,33 @@ "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=" + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -3231,29 +1710,18 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" }, "kind-of": { "version": "5.1.0", @@ -3269,33 +1737,17 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=" }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" } } }, @@ -3312,40 +1764,28 @@ "fast-glob": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-1.0.1.tgz", - "integrity": "sha1-MPmxEg/Ven8XI2SmRY+9vZgYezw=", - "requires": { - "bash-glob": "1.0.2", - "glob-parent": "3.1.0", - "micromatch": "3.1.9", - "readdir-enhanced": "1.5.2" - } + "integrity": "sha1-MPmxEg/Ven8XI2SmRY+9vZgYezw=" }, "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=" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "requires": { - "bser": "2.0.0" - } + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=" }, "fbjs": { "version": "0.8.14", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.14.tgz", "integrity": "sha1-0dviviVMNakeCfMfnNUKQLKg7Rw=", - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "promise": "7.3.1", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.14" - }, "dependencies": { "core-js": { "version": "1.2.7", @@ -3354,22 +1794,34 @@ } } }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - } + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=" }, "find-up": { "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -3388,51 +1840,31 @@ "form-data": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.16" - } + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=" }, "formatio": { "version": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz" - } + "dev": true }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "0.2.2" - } + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=" }, "fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jsonfile": "4.0.0", - "universalify": "0.1.1" - } + "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=" }, "fs-minipass": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "requires": { - "minipass": "2.2.1" - } + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==" }, "fs.realpath": { "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "function-bind": { "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", @@ -3442,13 +1874,8 @@ "function.prototype.name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.0.3.tgz", - "integrity": "sha1-AJmuVXLp3W8DyX0CP9krzF5jnqw=", + "integrity": "sha512-5EblxZUdioXi2JiMZ9FUbwYj40eQ9MFHyzFLBSPdlRl3SO8l7SLWuAnQ/at/1Wi4hjJwME/C5WpF2ZfAc8nGNw==", "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "is-callable": "1.1.3" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -3458,6 +1885,18 @@ } } }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true + }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", @@ -3477,9 +1916,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -3491,33 +1927,17 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "dev": true, - "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=" }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, "dependencies": { "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "2.1.1" - } + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=" } } }, @@ -3530,17 +1950,19 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, - "requires": { - "min-document": "2.19.0", - "process": "0.5.2" - } + "dev": true }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true + }, "graceful-fs": { "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" @@ -3554,9 +1976,6 @@ "version": "0.10.3", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.10.3.tgz", "integrity": "sha1-wxOv1VGOZzNRvuGPtj4qDkh0B6s=", - "requires": { - "iterall": "1.1.1" - }, "dependencies": { "iterall": { "version": "1.1.1", @@ -3578,75 +1997,44 @@ "har-validator": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=" }, "has": { "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz" - } + "dev": true }, "has-ansi": { "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=" }, "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, "dependencies": { "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=" } } }, "hawk": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" - } + "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=" }, "hock": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/hock/-/hock-1.3.2.tgz", "integrity": "sha1-btPovkK0ZnmBGNEhUKqA6NbvIhk=", "dev": true, - "requires": { - "deep-equal": "0.2.1" - }, "dependencies": { "deep-equal": { "version": "0.2.1", @@ -3659,7 +2047,7 @@ "hoek": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + "integrity": "sha1-ljRQKqEsRF3Vp8VzS1cruHOKrLs=" }, "hoist-non-react-statics": { "version": "1.2.0", @@ -3669,11 +2057,7 @@ "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - } + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=" }, "hosted-git-info": { "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", @@ -3683,30 +2067,17 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.1", - "domutils": "1.5.1", - "entities": "1.1.1", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "2.3.3" - } + "dev": true }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=" }, "iconv-lite": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha1-I9hlaxaq5nQqwpcy6o8DNqR4nPI=" + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" }, "ignore": { "version": "3.3.3", @@ -3726,6 +2097,12 @@ "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "individual": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/individual/-/individual-3.0.0.tgz", @@ -3734,17 +2111,25 @@ }, "inflight": { "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" }, "inherits": { "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "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 + } + } }, "interpret": { "version": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", @@ -3763,10 +2148,7 @@ "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "requires": { - "kind-of": "6.0.2" - } + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=" }, "is-arrayish": { "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3779,10 +2161,7 @@ }, "is-builtin-module": { "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" - } + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" }, "is-callable": { "version": "1.1.3", @@ -3793,10 +2172,7 @@ "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "requires": { - "kind-of": "6.0.2" - } + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=" }, "is-date-object": { "version": "1.0.1", @@ -3807,12 +2183,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=" }, "is-extendable": { "version": "0.1.1", @@ -3826,34 +2197,39 @@ }, "is-finite": { "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - } + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "2.1.1" - } + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=" + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -3867,9 +2243,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", - "requires": { - "is-number": "4.0.0" - }, "dependencies": { "is-number": { "version": "4.0.0", @@ -3878,22 +2251,46 @@ } } }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "requires": { - "isobject": "3.0.1" - } + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" - } + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true }, "is-stream": { "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3936,11 +2333,7 @@ }, "isomorphic-fetch": { "version": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "1.7.1", - "whatwg-fetch": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz" - } + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=" }, "isstream": { "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -3956,10 +2349,6 @@ "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", "dev": true, - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, "dependencies": { "commander": { "version": "0.6.1", @@ -3983,12 +2372,8 @@ "js-yaml": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", - "integrity": "sha1-CHdc69/dNZIJ8NKs04PI+GppBKA=", - "dev": true, - "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "esprima": "4.0.0" - } + "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", + "dev": true }, "jsbn": { "version": "0.1.1", @@ -4013,11 +2398,7 @@ "json-stable-stringify": { "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" - } + "dev": true }, "json-stringify-safe": { "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -4036,27 +2417,23 @@ "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" - } + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=" }, "jsonify": { "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -4074,10 +2451,7 @@ "keytar": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-4.1.0.tgz", - "integrity": "sha1-njkz5InWVt4aho4Sk3CTEwRJidc=", - "requires": { - "nan": "2.5.1" - } + "integrity": "sha512-L3KqiSMtpVitlug4uuI+K5XLne9SAVEFWE8SCQIhQiH0IA/CTbon5v5prVLKK0Ken54o2O8V9HceKagpwJum+Q==" }, "kind-of": { "version": "6.0.2", @@ -4087,45 +2461,25 @@ "lazy-cache": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "0.1.0" - } + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=" }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" - } + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" }, "less": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", "dev": true, - "requires": { - "errno": "0.1.4", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "image-size": "0.5.5", - "mime": "1.4.1", - "mkdirp": "0.5.1", - "promise": "7.3.1", - "request": "2.81.0", - "source-map": "0.5.7" - }, "dependencies": { "ajv": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - } + "optional": true }, "assert-plus": { "version": "0.2.0", @@ -4145,20 +2499,14 @@ "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" - } + "dev": true }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } + "optional": true }, "form-data": { "version": "2.1.4", @@ -4166,21 +2514,13 @@ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.16" - }, "dependencies": { "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, - "optional": true, - "requires": { - "delayed-stream": "1.0.0" - } + "optional": true } } }, @@ -4196,24 +2536,14 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } + "optional": true }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } + "optional": true }, "hoek": { "version": "2.16.3", @@ -4226,12 +2556,7 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } + "optional": true }, "mime": { "version": "1.4.1", @@ -4260,30 +2585,6 @@ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dev": true, "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "caseless": "0.12.0", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "2.1.16", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - }, "dependencies": { "combined-stream": { "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", @@ -4310,10 +2611,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } + "optional": true }, "source-map": { "version": "0.5.7", @@ -4324,15 +2622,15 @@ } } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true + }, "load-json-file": { "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - } + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=" }, "lodash": { "version": "4.17.5", @@ -4342,11 +2640,7 @@ "lodash._baseassign": { "version": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" - } + "dev": true }, "lodash._basecopy": { "version": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", @@ -4388,12 +2682,7 @@ "lodash.create": { "version": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "lodash._basecreate": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "lodash._isiterateecall": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" - } + "dev": true }, "lodash.defaults": { "version": "4.2.0", @@ -4437,12 +2726,7 @@ "lodash.keys": { "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "lodash.isarguments": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" - } + "dev": true }, "lodash.map": { "version": "4.6.0", @@ -4492,10 +2776,7 @@ }, "loose-envify": { "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "3.0.2" - } + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=" }, "lru-cache": { "version": "2.7.3", @@ -4511,55 +2792,27 @@ "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "1.0.1" - } + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=" }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "1.2.0" - } + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=" }, "micromatch": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", "integrity": "sha1-FdyTF1rjnlLpMIeEcJbv/HPvz4k=", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, @@ -4571,10 +2824,7 @@ "mime-types": { "version": "2.1.16", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", - "requires": { - "mime-db": "1.29.0" - } + "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=" }, "mimic-fn": { "version": "1.2.0", @@ -4585,50 +2835,31 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "0.1.1" - } + "dev": true }, "minimatch": { "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "1.1.8" - } + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=" }, "minipass": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.1.tgz", - "integrity": "sha512-u1aUllxPJUI07cOqzR7reGmQxmCqlH88uIIsf6XZFEWgw7gXKpJdR+5R9Y3KEDmWYkdIz9wXZs3C0jOPxejk/Q==", - "requires": { - "yallist": "3.0.2" - } + "integrity": "sha512-u1aUllxPJUI07cOqzR7reGmQxmCqlH88uIIsf6XZFEWgw7gXKpJdR+5R9Y3KEDmWYkdIz9wXZs3C0jOPxejk/Q==" }, "minizlib": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", - "requires": { - "minipass": "2.2.1" - } + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==" }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, @@ -4636,9 +2867,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, "dependencies": { "minimist": { "version": "0.0.8", @@ -4652,42 +2880,18 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", "dev": true, - "requires": { - "browser-stdout": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "commander": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "debug": "2.6.0", - "diff": "3.2.0", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "glob": "7.1.1", - "growl": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "lodash.create": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, "dependencies": { "debug": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", - "dev": true, - "requires": { - "ms": "0.7.2" - } + "dev": true }, "glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } + "dev": true }, "ms": { "version": "0.7.2", @@ -4700,9 +2904,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "dev": true, - "requires": { - "has-flag": "1.0.0" - }, "dependencies": { "has-flag": { "version": "1.0.0", @@ -4719,9 +2920,6 @@ "resolved": "https://registry.npmjs.org/mocha-appveyor-reporter/-/mocha-appveyor-reporter-0.4.0.tgz", "integrity": "sha1-gpOC/8Bla2Z+e+ZQoJSgba69Uk8=", "dev": true, - "requires": { - "request-json": "0.6.3" - }, "dependencies": { "depd": { "version": "1.1.2", @@ -4733,10 +2931,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/request-json/-/request-json-0.6.3.tgz", "integrity": "sha512-5TVnMD3LaeK0GRCyFlsNgJf5Fjg8J8j7VEfsoJESSWZlWRgPIf7IojsBLbTHcg2798JrrRkJ6L3k1+wj4sglgw==", - "dev": true, - "requires": { - "depd": "1.1.2" - } + "dev": true } } }, @@ -4745,12 +2940,6 @@ "resolved": "https://registry.npmjs.org/mocha-junit-and-console-reporter/-/mocha-junit-and-console-reporter-1.6.0.tgz", "integrity": "sha1-kBmEuev51g9xXvDo4EwG5KsSJFc=", "dev": true, - "requires": { - "debug": "2.6.8", - "mkdirp": "0.5.1", - "mocha": "2.5.3", - "xml": "1.0.1" - }, "dependencies": { "commander": { "version": "2.3.0", @@ -4762,10 +2951,7 @@ "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "dev": true }, "diff": { "version": "1.4.0", @@ -4783,48 +2969,25 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "0.3.0" - } + "dev": true }, "minimatch": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } + "dev": true }, "mocha": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", "dev": true, - "requires": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "jade": "0.26.3", - "mkdirp": "0.5.1", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" - }, "dependencies": { "debug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } + "dev": true }, "ms": { "version": "0.7.1", @@ -4869,6 +3032,12 @@ "resolved": "https://registry.npmjs.org/multi-list-selection/-/multi-list-selection-0.1.1.tgz", "integrity": "sha1-E8R3DJSkBd+ty8YCMvHAIixZ3EQ=" }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, "nan": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.5.1.tgz", @@ -4878,37 +3047,16 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, @@ -4917,6 +3065,12 @@ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", "dev": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "next-tick": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", @@ -4926,11 +3080,7 @@ "node-fetch": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", - "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", - "requires": { - "encoding": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - } + "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==" }, "node-int64": { "version": "0.4.0", @@ -4939,30 +3089,18 @@ }, "normalize-package-data": { "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", - "requires": { - "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "semver": "5.4.1", - "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" - } + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=" }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "2.0.1" - } + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=" }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "1.0.0" - } + "dev": true }, "number-is-nan": { "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -4980,45 +3118,26 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - } + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=" }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - } + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=" }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, "dependencies": { "kind-of": { "version": "5.1.0", @@ -5030,10 +3149,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -5052,21 +3168,13 @@ "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "3.0.1" - } + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=" }, "object.assign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "object-keys": "1.0.11" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -5081,12 +3189,6 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0", - "function-bind": "1.1.1", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -5099,22 +3201,13 @@ "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "3.0.1" - } + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=" }, "object.values": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0", - "function-bind": "1.1.1", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" - }, "dependencies": { "function-bind": { "version": "1.1.1", @@ -5126,18 +3219,31 @@ }, "once": { "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true }, "optimist": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "requires": { - "wordwrap": "0.0.3" + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=" + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } } }, "os-homedir": { @@ -5147,12 +3253,7 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=" }, "os-tmpdir": { "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -5165,10 +3266,7 @@ }, "parse-json": { "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" - } + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" }, "pascalcase": { "version": "0.1.1", @@ -5190,6 +3288,12 @@ "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -5204,9 +3308,6 @@ "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "dev": true, - "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "dependencies": { "isarray": { "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -5217,10 +3318,7 @@ }, "path-type": { "version": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - } + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" }, "performance-now": { "version": "2.1.0", @@ -5233,28 +3331,36 @@ }, "pinkie": { "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true }, "pinkie-promise": { "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - } + "dev": true }, "pkg-dir": { "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" - } + "dev": true + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -5279,20 +3385,12 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", - "requires": { - "asap": "2.0.6" - } + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=" }, "prop-types": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", "integrity": "sha1-NmREU1ZCVd3aORGR+zoSXL32VMo=", - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - }, "dependencies": { "core-js": { "version": "1.2.7", @@ -5302,33 +3400,17 @@ "fbjs": { "version": "0.8.16", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.14" - } + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=" }, "isomorphic-fetch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "1.7.1", - "whatwg-fetch": "2.0.3" - } + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=" }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "3.0.2" - } + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=" }, "object-assign": { "version": "4.1.1", @@ -5362,38 +3444,22 @@ "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=" }, "react": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", - "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", - "requires": { - "create-react-class": "15.6.2", - "fbjs": "0.8.14", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "prop-types": "15.6.1" - } + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=" }, "react-dom": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", - "requires": { - "fbjs": "0.8.14", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "prop-types": "15.6.1" - } + "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=" }, "react-input-autosize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz", "integrity": "sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==", - "requires": { - "prop-types": "15.6.1" - }, "dependencies": { "core-js": { "version": "1.2.7", @@ -5403,49 +3469,24 @@ "fbjs": { "version": "0.8.16", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "promise": "7.3.1", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.14" - } + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=" }, "prop-types": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", - "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==" } } }, "react-relay": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/react-relay/-/react-relay-1.4.1.tgz", - "integrity": "sha1-Yfe1gC1wRG4VRJD50PzuyRUOvaU=", - "requires": { - "babel-runtime": "6.25.0", - "fbjs": "0.8.14", - "prop-types": "15.6.1", - "relay-runtime": "1.4.1" - } + "integrity": "sha1-Yfe1gC1wRG4VRJD50PzuyRUOvaU=" }, "react-select": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/react-select/-/react-select-1.2.1.tgz", "integrity": "sha512-vaCgT2bEl+uTyE/uKOEgzE5Dc/wLtzhnBvoHCeuLoJWc4WuadN6WQDhoL42DW+TziniZK2Gaqe/wUXydI3NSaQ==", - "requires": { - "classnames": "2.2.5", - "prop-types": "15.6.1", - "react-input-autosize": "2.2.1" - }, "dependencies": { "core-js": { "version": "1.2.7", @@ -5455,99 +3496,56 @@ "fbjs": { "version": "0.8.16", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "promise": "7.3.1", - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "ua-parser-js": "0.7.14" - } + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=" }, "prop-types": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", - "requires": { - "fbjs": "0.8.16", - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==" } } }, - "react-static-container": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-static-container/-/react-static-container-1.0.1.tgz", - "integrity": "sha1-aUwN1oqJa4eVGa+1SDmcwZicmrA=" - }, "react-test-renderer": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-15.6.2.tgz", "integrity": "sha1-0DM0NPwsQ4CSaWyncNpe1IA376g=", - "dev": true, - "requires": { - "fbjs": "0.8.14", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } + "dev": true }, "read-pkg": { "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "path-type": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" - } + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" }, "read-pkg-up": { "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz" - }, "dependencies": { "find-up": { "version": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==" + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" } } }, "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true }, "readdir-enhanced": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz", - "integrity": "sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=", - "requires": { - "call-me-maybe": "1.0.1", - "es6-promise": "4.2.4", - "glob-to-regexp": "0.3.0" - } + "integrity": "sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=" + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true }, "rechoir": { "version": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.4.0" - } + "dev": true }, "regenerator-runtime": { "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", @@ -5557,27 +3555,16 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, @@ -5585,98 +3572,48 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-1.4.1.tgz", "integrity": "sha1-EOg/D13o2z0ACFGkwOQ1590d65U=", - "requires": { - "babel-generator": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-preset-fbjs": "2.1.4", - "babel-runtime": "6.25.0", - "babel-traverse": "6.26.0", - "babel-types": "6.25.0", - "babylon": "6.18.0", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "fast-glob": "1.0.1", - "fb-watchman": "2.0.0", - "fbjs": "0.8.14", - "graphql": "0.11.7", - "immutable": "3.7.6", - "relay-runtime": "1.4.1", - "signedsource": "1.0.0", - "yargs": "9.0.1" - }, "dependencies": { "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "3.0.2" - } + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=" }, "babel-traverse": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.3", - "lodash": "4.17.5" - }, "dependencies": { "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.1" - } + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "4.17.5", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=" } } }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "graphql": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=", - "requires": { - "iterall": "1.1.3" - } + "integrity": "sha1-5auqnLe3zMuE6fCDa/Q3DSaHUMY=" }, "invariant": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", - "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", - "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" - } + "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==" }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" } } }, @@ -5688,12 +3625,7 @@ "relay-runtime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-1.4.1.tgz", - "integrity": "sha1-+I3NCkInAKBFY/KR9XDkzjaONtA=", - "requires": { - "babel-runtime": "6.25.0", - "fbjs": "0.8.14", - "relay-debugger-react-native-runtime": "0.0.10" - } + "integrity": "sha1-+I3NCkInAKBFY/KR9XDkzjaONtA=" }, "repeat-element": { "version": "1.1.2", @@ -5707,39 +3639,12 @@ }, "repeating": { "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" - } + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" }, "request": { "version": "2.85.0", "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "2.1.16", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } + "integrity": "sha1-WgNhWkfGFCCz65m326IE+DYD4fo=" }, "require-directory": { "version": "2.1.1", @@ -5751,20 +3656,35 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true + }, "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", - "dev": true, - "requires": { - "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" - } + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -5772,7 +3692,18 @@ }, "rimraf": { "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=" + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, "safe-buffer": { @@ -5783,10 +3714,7 @@ "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "0.1.15" - } + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=" }, "samsam": { "version": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", @@ -5796,7 +3724,7 @@ "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" }, "set-blocking": { "version": "2.0.0", @@ -5806,21 +3734,12 @@ "set-getter": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "requires": { - "to-object-path": "0.3.0" - } + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=" }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - } + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=" }, "setimmediate": { "version": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -5829,10 +3748,7 @@ "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "1.0.0" - } + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=" }, "shebang-regex": { "version": "1.0.0", @@ -5843,12 +3759,7 @@ "version": "0.7.8", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "rechoir": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - } + "dev": true }, "sigmund": { "version": "1.0.1", @@ -5877,16 +3788,6 @@ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.3.6.tgz", "integrity": "sha1-lTeOfg+XapcS6bRZH/WznnPcPd4=", "dev": true, - "requires": { - "diff": "3.2.0", - "formatio": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "lolex": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "native-promise-only": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "path-to-regexp": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "samsam": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", - "text-encoding": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "type-detect": "4.0.3" - }, "dependencies": { "type-detect": { "version": "4.0.3", @@ -5901,44 +3802,31 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, "snapdragon": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", - "requires": { - "base": "0.11.2", - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "source-map-resolve": "0.5.1", - "use": "2.0.2" - }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -5946,29 +3834,18 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" }, "kind-of": { "version": "5.1.0", @@ -5981,19 +3858,11 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" } } }, @@ -6001,27 +3870,18 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, "sntp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "requires": { - "hoek": "4.2.1" - } + "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=" }, "source-map": { "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", @@ -6030,22 +3890,12 @@ "source-map-resolve": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=", - "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" - } + "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=" }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", - "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" - } + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=" }, "source-map-url": { "version": "0.4.0", @@ -6070,57 +3920,35 @@ "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=", - "requires": { - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - } + "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=" }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "requires": { - "extend-shallow": "3.0.2" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sshpk": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "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", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -6133,34 +3961,21 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -6168,29 +3983,18 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" }, "kind-of": { "version": "5.1.0", @@ -6199,6 +4003,12 @@ } } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true + }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -6209,10 +4019,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "strip-ansi": "4.0.0" - }, "dependencies": { "ansi-regex": { "version": "3.0.0", @@ -6226,41 +4032,22 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "requires": { - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "strip-ansi": "4.0.0" - } + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=" }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=" } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, "stringstream": { "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "strip-ansi": { "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" }, "strip-bom": { "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -6271,31 +4058,39 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "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 + }, "supports-color": { "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true + } + } + }, "tar": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.0.tgz", - "integrity": "sha512-gJlTiiErwo96K904FnoYWl+5+FBgS+FimU6GMh66XLdLa55al8+d4jeDfPoGwSNHdtWI5FJP6xurmVqhBuGJpQ==", - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.1", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "yallist": "3.0.2" - } + "integrity": "sha512-gJlTiiErwo96K904FnoYWl+5+FBgS+FimU6GMh66XLdLa55al8+d4jeDfPoGwSNHdtWI5FJP6xurmVqhBuGJpQ==" }, "temp": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" - }, "dependencies": { "os-tmpdir": { "version": "1.0.2", @@ -6320,6 +4115,12 @@ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", "dev": true }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "through": { "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" @@ -6333,10 +4134,7 @@ "version": "0.0.31", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - } + "dev": true }, "to-fast-properties": { "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -6352,17 +4150,11 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -6370,48 +4162,28 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - }, "dependencies": { "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "requires": { - "is-plain-object": "2.0.4" - } + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" } } }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - } + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=" }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "requires": { - "punycode": "1.4.1" - } + "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=" }, "tree-kill": { "version": "1.2.0", @@ -6425,10 +4197,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" }, "tweetnacl": { "version": "0.14.5", @@ -6436,6 +4205,18 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "ua-parser-js": { "version": "0.7.14", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.14.tgz", @@ -6445,23 +4226,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, "dependencies": { "set-value": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=" } } }, @@ -6474,28 +4243,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=" } } }, @@ -6515,35 +4272,21 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", - "requires": { - "define-property": "0.2.5", - "isobject": "3.0.1", - "lazy-cache": "2.0.2" - }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, @@ -6551,29 +4294,18 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" }, "kind-of": { "version": "5.1.0", @@ -6582,6 +4314,12 @@ } } }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true + }, "util-deprecate": { "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", @@ -6590,7 +4328,7 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, "validate-npm-package-license": { "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", @@ -6600,11 +4338,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "extsprintf": "1.3.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -6617,17 +4350,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/virtual-dom/-/virtual-dom-2.1.1.tgz", "integrity": "sha1-gO2i1IG57eDASRGM78tKBfIdE3U=", - "dev": true, - "requires": { - "browser-split": "0.0.1", - "error": "4.4.0", - "ev-store": "7.0.0", - "global": "4.3.2", - "is-object": "1.0.1", - "next-tick": "0.2.2", - "x-is-array": "0.1.0", - "x-is-string": "0.1.0" - } + "dev": true }, "what-the-diff": { "version": "0.4.0", @@ -6637,10 +4360,7 @@ "what-the-status": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/what-the-status/-/what-the-status-1.0.3.tgz", - "integrity": "sha1-lP3NAR/7U6Ijnnb6+NrL78mHdRA=", - "requires": { - "split": "1.0.1" - } + "integrity": "sha1-lP3NAR/7U6Ijnnb6+NrL78mHdRA=" }, "whatwg-fetch": { "version": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", @@ -6649,10 +4369,7 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", - "requires": { - "isexe": "2.0.0" - } + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=" }, "which-module": { "version": "2.0.0", @@ -6668,24 +4385,22 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - }, "dependencies": { "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - } + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" } } }, "wrappy": { "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true }, "x-is-array": { @@ -6725,30 +4440,12 @@ "yargs": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "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": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "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" - } + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=" }, "yargs-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "requires": { - "camelcase": "4.1.0" - } + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=" }, "yubikiri": { "version": "1.0.0", diff --git a/package.json b/package.json index cd9deac118..cf7857a8af 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "dedent-js": "^1.0.1", "electron-devtools-installer": "^2.2.3", "enzyme": "^2.9.1", - "eslint": "^3.0.0", + "eslint": "^3.19.0", "eslint-config-fbjs": "2.0.0-alpha.1", "eslint-config-standard": "^10.2.0", "eslint-plugin-babel": "^4.0.0", @@ -180,5 +180,6 @@ "GitDockItem": "createDockItemStub", "GithubDockItem": "createDockItemStub", "FilePatchControllerStub": "createFilePatchControllerStub" - } + }, + "false": {} } diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index 428f0f4c77..d1236dbe96 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -269,7 +269,7 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; const git = createTestStrategy(workingDirPath); const authors = await git.getAuthors({max: 1}); - assert.deepEqual(authors, []) + assert.deepEqual(authors, []); }); }); diff --git a/test/models/user-store.test.js b/test/models/user-store.test.js index 4d8be260ff..73159f7ad9 100644 --- a/test/models/user-store.test.js +++ b/test/models/user-store.test.js @@ -1,4 +1,4 @@ -import dedent from 'dedent-js' +import dedent from 'dedent-js'; import UserStore from '../../lib/models/user-store'; @@ -67,7 +67,7 @@ describe('UserStore', function() { }, ]); - sinon.spy(store, 'addUsers') + sinon.spy(store, 'addUsers'); // Head changes due to new commit await repository.commit(dedent` @@ -76,13 +76,13 @@ describe('UserStore', function() { Co-authored-by: New Author `, {allowEmpty: true}); - await assert.async.equal(store.addUsers.callCount, 1) + await assert.async.equal(store.addUsers.callCount, 1); assert.isOk(store.getUsers().find(user => { return user.name === 'New Author' && user.email === 'new-author@email.com'; })); // Change head due to branch checkout - await repository.checkout('new-branch') - await assert.async.equal(store.addUsers.callCount, 2) + await repository.checkout('new-branch'); + await assert.async.equal(store.addUsers.callCount, 2); }); }); From b9161a6487294d6af49ab12ce7b2a37dd5f27e72 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 23:08:42 -0700 Subject: [PATCH 0090/5422] Iterate less --- lib/git-shell-out-strategy.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 9c6770c1a6..0fd02553a1 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -622,9 +622,10 @@ export default class GitShellOutStrategy { ]); return output.split('\0') - .filter(l => l.length > 0) - .map(line => line.split(delimiterString)) - .reduce((acc, [an, ae, cn, ce, trailers]) => { + .reduce((acc, line) => { + if (line.length === 0) { return acc; } + + const [an, ae, cn, ce, trailers] = line.split(delimiterString); trailers .split('\n') .map(trailer => trailer.match(/^co-authored-by. (.+?) <(.+?)>$/i)) From d51cbbe3f8e65534e0de0553791ef004ca4e2987 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Wed, 21 Mar 2018 23:24:34 -0700 Subject: [PATCH 0091/5422] Describe shape of user in PropTypes --- lib/controllers/commit-controller.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/controllers/commit-controller.js b/lib/controllers/commit-controller.js index 176d9a89c8..78254d1c41 100644 --- a/lib/controllers/commit-controller.js +++ b/lib/controllers/commit-controller.js @@ -31,7 +31,10 @@ export default class CommitController extends React.Component { stagedChangesExist: PropTypes.bool.isRequired, lastCommit: PropTypes.object.isRequired, currentBranch: PropTypes.object.isRequired, - mentionableUsers: PropTypes.arrayOf(PropTypes.object).isRequired, + mentionableUsers: PropTypes.arrayOf(PropTypes.shape({ + email: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + })).isRequired, prepareToCommit: PropTypes.func.isRequired, commit: PropTypes.func.isRequired, From 6bf127c7f1717bf7a00c002b1adddde480683cbe Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 22 Mar 2018 13:21:55 -0700 Subject: [PATCH 0092/5422] :fire: package.json entry that eslint added --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index cf7857a8af..06c1a480c9 100644 --- a/package.json +++ b/package.json @@ -180,6 +180,5 @@ "GitDockItem": "createDockItemStub", "GithubDockItem": "createDockItemStub", "FilePatchControllerStub": "createFilePatchControllerStub" - }, - "false": {} + } } From f019b05da23560e4ed7f53c52e3cabc53767e5d3 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 22 Mar 2018 13:50:15 -0700 Subject: [PATCH 0093/5422] Remove `body` from keymap selector --- keymaps/git.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keymaps/git.cson b/keymaps/git.cson index ef078bcc60..17c774719d 100644 --- a/keymaps/git.cson +++ b/keymaps/git.cson @@ -55,7 +55,7 @@ '.github-Dialog input': 'enter': 'core:confirm' -'body .github-CommitView-coAuthorEditor': +'.github-CommitView-coAuthorEditor': 'enter': 'github:co-author:enter' 'down': 'github:co-author:down' 'up': 'github:co-author:up' From 3c8d2fd3e9384ba4a81ab5dbca1bf4b451226b1a Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 22 Mar 2018 15:35:03 -0700 Subject: [PATCH 0094/5422] Fix flakey GitTabController test - await operation promises Co-authored-by: Tilde Ann Thurium --- test/controllers/git-tab-controller.test.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index 7d5b0f1d6f..f700406c6c 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -517,7 +517,9 @@ describe('GitTabController', function() { // click Cancel confirm.returns(1); - stagingView.dblclickOnItem({}, conflict1); + let result = stagingView.dblclickOnItem({}, conflict1); + await result.stageOperationPromise; + await result.selectionUpdatePromise; await assert.async.isTrue(confirm.calledOnce); assert.lengthOf(stagingView.props.mergeConflicts, 5); @@ -526,7 +528,9 @@ describe('GitTabController', function() { // click Stage confirm.reset(); confirm.returns(0); - await stagingView.dblclickOnItem({}, conflict1).selectionUpdatePromise; + result = stagingView.dblclickOnItem({}, conflict1); + await result.stageOperationPromise; + await result.selectionUpdatePromise; await assert.async.isTrue(confirm.calledOnce); await assert.async.lengthOf(stagingView.props.mergeConflicts, 4); From 328573407db7a00c383c440a1b13016ea031af16 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Mar 2018 22:08:20 -0400 Subject: [PATCH 0095/5422] Set GIT_SSH_VARIANT to prevent git from doing a "dry run". See https://git-scm.com/docs/git-config#git-config-sshvariant for details. --- test/git-strategies.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index d1236dbe96..b5ac05dac6 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -1340,6 +1340,7 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; // Append ' #' to ensure the script is run with sh on Windows. // https://github.com/git/git/blob/027a3b943b444a3e3a76f9a89803fc10245b858f/run-command.c#L196-L221 process.env.GIT_SSH_COMMAND = normalizeGitHelperPath(path.join(__dirname, 'scripts', 'ssh-remote.sh')) + ' #'; + process.env.GIT_SSH_VARIANT = 'simple'; return git; } From 6be2b051ae48af6e16f56ef3106f4e33ed1d10c0 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 22 Mar 2018 22:08:41 -0400 Subject: [PATCH 0096/5422] "git fetch" _does_ reject now. But only sometimes! --- test/git-strategies.test.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index b5ac05dac6..5837a475df 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -1384,8 +1384,7 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; }, }); - // The git operation Promise does *not* reject if the git process is killed by a signal. - await git.fetch('mock', 'master'); + await git.fetch('mock', 'master').catch(() => {}); assert.equal(query.prompt, 'Speak friend and enter'); assert.isFalse(query.includeUsername); From 5d5c8fabba208c9d3fb5ae846c8260551913e984 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Mon, 26 Mar 2018 14:54:52 -0700 Subject: [PATCH 0097/5422] Revert "Remove `body` from keymap selector" This reverts commit f019b05da23560e4ed7f53c52e3cabc53767e5d3. --- keymaps/git.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keymaps/git.cson b/keymaps/git.cson index 17c774719d..ef078bcc60 100644 --- a/keymaps/git.cson +++ b/keymaps/git.cson @@ -55,7 +55,7 @@ '.github-Dialog input': 'enter': 'core:confirm' -'.github-CommitView-coAuthorEditor': +'body .github-CommitView-coAuthorEditor': 'enter': 'github:co-author:enter' 'down': 'github:co-author:down' 'up': 'github:co-author:up' From 2223e0a121d8a04ec3439e665eb0fb6ba7ec9b4a Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 22 Mar 2018 16:46:09 -0700 Subject: [PATCH 0098/5422] Add 'Undo' button on most recent commit and 'amend' context menu item Co-authored-by: Tilde Ann Thurium --- lib/views/recent-commits-view.js | 18 +++++++++++++++--- menus/git.cson | 6 ++++++ styles/recent-commits.less | 8 ++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/views/recent-commits-view.js b/lib/views/recent-commits-view.js index 6c5681496d..21caf93702 100644 --- a/lib/views/recent-commits-view.js +++ b/lib/views/recent-commits-view.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import moment from 'moment'; +import cx from 'classnames'; import Timeago from './timeago'; @@ -13,13 +14,20 @@ class RecentCommitView extends React.Component { const authorMoment = moment(this.props.commit.getAuthorDate() * 1000); return ( -
  • +
  • {this.renderAuthors()} {this.props.commit.getMessage()} + {this.props.isMostRecent && ( + + )} - {this.props.commits.map(commit => { + {this.props.commits.map((commit, i) => { return ( - + ); })} diff --git a/menus/git.cson b/menus/git.cson index 63be16c747..a584f6a706 100644 --- a/menus/git.cson +++ b/menus/git.cson @@ -115,3 +115,9 @@ 'command': 'github:view-staged-changes-for-current-file' } ] + '.most-recent': [ + { + 'label': 'Amend' + 'command': 'github:amend-last-commit' + } + ] diff --git a/styles/recent-commits.less b/styles/recent-commits.less index 74bb7535f1..0d4b7d4017 100644 --- a/styles/recent-commits.less +++ b/styles/recent-commits.less @@ -74,6 +74,14 @@ overflow: hidden; } + &-undoButton.btn { + padding: 0 @component-padding/1.5; + margin-right: @component-padding/2; + height: @size + @component-padding/2; + line-height: 0; + font-size: .9em; + } + &-time { color: @text-color-subtle; } From f6613bb7c8fb0e523683c63bf87ff088f70e06cc Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Fri, 23 Mar 2018 15:40:35 -0700 Subject: [PATCH 0099/5422] Add GSOS#reset method which does a soft reset to the parent of head Co-Authored-By: Tilde Ann Thurium --- lib/git-shell-out-strategy.js | 21 ++++++++++++++++----- test/git-strategies.test.js | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 09c8414dae..86713a045b 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -723,6 +723,17 @@ export default class GitShellOutStrategy { return this.exec(args, {useGitPromptServer: true, writeOperation: true}); } + /** + * Undo Operations + */ + reset() { + // for now we'll just start with what we need and build out more options in the future + return this.exec(['reset', '--soft', 'HEAD~']); + } + + softResetToParentOfHead() { + + } /** * Branches @@ -733,6 +744,11 @@ export default class GitShellOutStrategy { return this.exec(args.concat(branchName), {writeOperation: true}); } + async getBranches() { + const output = await this.exec(['for-each-ref', '--format=%(refname:short)', 'refs/heads/**']); + return output.trim().split(LINE_ENDING_REGEX); + } + checkoutFiles(paths, revision) { if (paths.length === 0) { return null; } const args = ['checkout']; @@ -740,11 +756,6 @@ export default class GitShellOutStrategy { return this.exec(args.concat('--', paths.map(toGitPathSep)), {writeOperation: true}); } - async getBranches() { - const output = await this.exec(['for-each-ref', '--format=%(refname:short)', 'refs/heads/**']); - return output.trim().split(LINE_ENDING_REGEX); - } - async describeHead() { return (await this.exec(['describe', '--contains', '--all', '--always', 'HEAD'])).trim(); } diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index 5837a475df..eecf5344f4 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -619,6 +619,30 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; }); }); + describe('reset()', function() { + it('performs a soft reset to the parent of head', async function() { + const workingDirPath = await cloneRepository('three-files'); + const git = createTestStrategy(workingDirPath); + + fs.appendFileSync(path.join(workingDirPath, 'a.txt'), 'bar\n', 'utf8'); + await git.exec(['add', '.']); + await git.commit('add stuff') + + const parentCommit = await git.getCommit('HEAD~') + + await git.reset(); + + const commitAfterReset = await git.getCommit('HEAD') + assert.strictEqual(commitAfterReset.sha, parentCommit.sha) + + const stagedChanges = await git.getDiffsForFilePath('a.txt', {staged: true}); + assert.lengthOf(stagedChanges, 1); + const stagedChange = stagedChanges[0] + assert.strictEqual(stagedChange.newPath, 'a.txt'); + assert.deepEqual(stagedChange.hunks[0].lines, [' foo', '+bar']); + }); + }); + describe('getBranches()', function() { it('returns an array of all branches', async function() { const workingDirPath = await cloneRepository('three-files'); From 4a426e7498cc087b283e750570b96d083839d77a Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Fri, 23 Mar 2018 16:10:42 -0700 Subject: [PATCH 0100/5422] Add repository method `undoLastCommit` --- lib/git-shell-out-strategy.js | 13 +++++----- lib/models/repository-states/present.js | 16 ++++++++++++ lib/models/repository-states/state.js | 7 +++++ lib/models/repository.js | 2 ++ test/git-strategies.test.js | 34 +++++++++++++------------ 5 files changed, 49 insertions(+), 23 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 86713a045b..8d2d817dbe 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -726,13 +726,12 @@ export default class GitShellOutStrategy { /** * Undo Operations */ - reset() { - // for now we'll just start with what we need and build out more options in the future - return this.exec(['reset', '--soft', 'HEAD~']); - } - - softResetToParentOfHead() { - + reset(type, revision = 'HEAD') { + const validTypes = ['soft'] + if (!validTypes.includes(type)) { + throw new Error(`Invalid type ${type}. Must be one of: ${validTypes.join(', ')}`) + } + return this.exec(['reset', `--${type}`, revision]); } /** diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index d1f871d31c..f7af981cdc 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -341,6 +341,22 @@ export default class Present extends State { return this.git().checkoutFiles(paths, revision); } + // Reset + + @invalidate(() => [ + Keys.stagedChangesSinceParentCommit, + Keys.lastCommit, + Keys.recentCommits, + Keys.authors, + Keys.statusBundle, + Keys.index.all, + ...Keys.filePatch.eachWithOpts({staged: true, amending: true}), + Keys.headDescription, + ]) + undoLastCommit() { + return this.git().reset('soft', 'HEAD~'); + } + // Remote interactions @invalidate(branchName => [ diff --git a/lib/models/repository-states/state.js b/lib/models/repository-states/state.js index 196dc0790e..1e48a2697a 100644 --- a/lib/models/repository-states/state.js +++ b/lib/models/repository-states/state.js @@ -222,6 +222,13 @@ export default class State { return unsupportedOperationPromise(this, 'checkoutPathsAtRevision'); } + // Reset + + @shouldDelegate + undoLastCommit() { + return unsupportedOperationPromise(this, 'undoLastCommit'); + } + // Remote interactions @shouldDelegate diff --git a/lib/models/repository.js b/lib/models/repository.js index 0e3f0dcc9a..c9779a682e 100644 --- a/lib/models/repository.js +++ b/lib/models/repository.js @@ -267,6 +267,8 @@ const delegates = [ 'checkout', 'checkoutPathsAtRevision', + 'undoLastCommit', + 'fetch', 'pull', 'push', diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index eecf5344f4..bc4c3426c2 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -620,27 +620,29 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; }); describe('reset()', function() { - it('performs a soft reset to the parent of head', async function() { - const workingDirPath = await cloneRepository('three-files'); - const git = createTestStrategy(workingDirPath); + describe('when soft and HEAD~ are passed as arguments', function() { + it('performs a soft reset to the parent of head', async function() { + const workingDirPath = await cloneRepository('three-files'); + const git = createTestStrategy(workingDirPath); - fs.appendFileSync(path.join(workingDirPath, 'a.txt'), 'bar\n', 'utf8'); - await git.exec(['add', '.']); - await git.commit('add stuff') + fs.appendFileSync(path.join(workingDirPath, 'a.txt'), 'bar\n', 'utf8'); + await git.exec(['add', '.']); + await git.commit('add stuff') - const parentCommit = await git.getCommit('HEAD~') + const parentCommit = await git.getCommit('HEAD~') - await git.reset(); + await git.reset('soft', 'HEAD~'); - const commitAfterReset = await git.getCommit('HEAD') - assert.strictEqual(commitAfterReset.sha, parentCommit.sha) + const commitAfterReset = await git.getCommit('HEAD') + assert.strictEqual(commitAfterReset.sha, parentCommit.sha) - const stagedChanges = await git.getDiffsForFilePath('a.txt', {staged: true}); - assert.lengthOf(stagedChanges, 1); - const stagedChange = stagedChanges[0] - assert.strictEqual(stagedChange.newPath, 'a.txt'); - assert.deepEqual(stagedChange.hunks[0].lines, [' foo', '+bar']); - }); + const stagedChanges = await git.getDiffsForFilePath('a.txt', {staged: true}); + assert.lengthOf(stagedChanges, 1); + const stagedChange = stagedChanges[0] + assert.strictEqual(stagedChange.newPath, 'a.txt'); + assert.deepEqual(stagedChange.hunks[0].lines, [' foo', '+bar']); + }); + }) }); describe('getBranches()', function() { From 70b8554cdf4e2bb0fe9b5c9d4f91c108bafe7525 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Fri, 23 Mar 2018 17:29:28 -0700 Subject: [PATCH 0101/5422] Implement undo last commit functionality. Restore message in commit box Co-authored-by: Tilde Ann Thurium --- lib/controllers/git-tab-controller.js | 11 +++++++ lib/controllers/recent-commits-controller.js | 1 + lib/views/git-tab-view.js | 1 + lib/views/recent-commits-view.js | 3 ++ test/controllers/git-tab-controller.test.js | 32 ++++++++++++++++++++ 5 files changed, 48 insertions(+) diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index 5394ffe97d..dc4835a710 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -165,6 +165,7 @@ export default class GitTabController extends React.Component { attemptStageAllOperation={this.attemptStageAllOperation} prepareToCommit={this.prepareToCommit} commit={this.commit} + undoLastCommit={this.undoLastCommit} push={this.push} pull={this.pull} fetch={this.fetch} @@ -332,6 +333,16 @@ export default class GitTabController extends React.Component { return this.props.repository.commit(message); } + @autobind + async undoLastCommit() { + const repo = this.props.repository; + const lastCommit = await repo.getLastCommit(); + if (lastCommit) { + repo.setRegularCommitMessage(lastCommit.message); + return repo.undoLastCommit(); + } + } + @autobind async abortMerge() { const choice = this.props.confirm({ diff --git a/lib/controllers/recent-commits-controller.js b/lib/controllers/recent-commits-controller.js index 1a375ad711..37930e2178 100644 --- a/lib/controllers/recent-commits-controller.js +++ b/lib/controllers/recent-commits-controller.js @@ -14,6 +14,7 @@ export default class RecentCommitsController extends React.Component { ); } diff --git a/lib/views/git-tab-view.js b/lib/views/git-tab-view.js index 864160e0c8..3eed26334c 100644 --- a/lib/views/git-tab-view.js +++ b/lib/views/git-tab-view.js @@ -190,6 +190,7 @@ export default class GitTabView extends React.Component { ref={c => { this.refRecentCommitController = c; }} commits={this.props.recentCommits} isLoading={this.props.isLoading} + undoLastCommit={this.props.undoLastCommit} />
  • ); diff --git a/lib/views/recent-commits-view.js b/lib/views/recent-commits-view.js index 21caf93702..b5e12c176d 100644 --- a/lib/views/recent-commits-view.js +++ b/lib/views/recent-commits-view.js @@ -8,6 +8,7 @@ import Timeago from './timeago'; class RecentCommitView extends React.Component { static propTypes = { commit: PropTypes.object.isRequired, + undoLastCommit: PropTypes.func.isRequired, }; render() { @@ -62,6 +63,7 @@ export default class RecentCommitsView extends React.Component { static propTypes = { commits: PropTypes.arrayOf(PropTypes.object).isRequired, isLoading: PropTypes.bool.isRequired, + undoLastCommit: PropTypes.func.isRequired, }; render() { @@ -96,6 +98,7 @@ export default class RecentCommitsView extends React.Component { key={commit.getSha()} isMostRecent={i === 0} commit={commit} + undoLastCommit={this.props.undoLastCommit} /> ); })} diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index f700406c6c..a19a590973 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -611,5 +611,37 @@ describe('GitTabController', function() { return modifiedFilePatch.status === 'modified' && modifiedFilePatch.filePath === 'new-file.txt'; }); }); + + describe('undoLastCommit()', function() { + it('restores to the state prior to committing', async function() { + const workdirPath = await cloneRepository('three-files'); + const repository = await buildRepository(workdirPath); + fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'foo\nbar\nbaz\n'); + + await repository.stageFiles(['new-file.txt']); + const commitMessage = 'Commit some stuff'; + await repository.commit(commitMessage); + + app = React.cloneElement(app, {repository}); + const wrapper = mount(app); + + await assert.async.lengthOf(wrapper.find('.github-RecentCommit-undoButton'), 1); + wrapper.find('.github-RecentCommit-undoButton').simulate('click'); + + let commitMessages = wrapper.find('.github-RecentCommit-message').map(node => node.text()); + assert.deepEqual(commitMessages, [commitMessage, 'Initial commit']); + + await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 1); + assert.deepEqual(wrapper.find('GitTabView').prop('stagedChanges'), [{ + filePath: 'new-file.txt', + status: 'added', + }]); + + commitMessages = wrapper.find('.github-RecentCommit-message').map(node => node.text()); + assert.deepEqual(commitMessages, ['Initial commit']); + + assert.strictEqual(wrapper.find('CommitView').prop('message'), commitMessage); + }); + }); }); }); From 52797452015942fa83623baf271ac2b72ae2756b Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Fri, 23 Mar 2018 17:52:09 -0700 Subject: [PATCH 0102/5422] Test undo last commit when the repository has no commits --- lib/controllers/git-tab-controller.js | 7 +++---- test/controllers/git-tab-controller.test.js | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index dc4835a710..c71ed3446e 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -337,10 +337,9 @@ export default class GitTabController extends React.Component { async undoLastCommit() { const repo = this.props.repository; const lastCommit = await repo.getLastCommit(); - if (lastCommit) { - repo.setRegularCommitMessage(lastCommit.message); - return repo.undoLastCommit(); - } + if (lastCommit.isUnbornRef()) { return null; } + repo.setRegularCommitMessage(lastCommit.message); + return repo.undoLastCommit(); } @autobind diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index a19a590973..78a44d1a59 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -9,7 +9,7 @@ import until from 'test-until'; import GitTabController from '../../lib/controllers/git-tab-controller'; -import {cloneRepository, buildRepository, buildRepositoryWithPipeline} from '../helpers'; +import {cloneRepository, buildRepository, buildRepositoryWithPipeline, initRepository} from '../helpers'; import Repository from '../../lib/models/repository'; import {GitError} from '../../lib/git-shell-out-strategy'; @@ -613,6 +613,22 @@ describe('GitTabController', function() { }); describe('undoLastCommit()', function() { + it('does nothing when there are no commits', async function() { + const workdirPath = await initRepository(); + const repository = await buildRepository(workdirPath); + + app = React.cloneElement(app, {repository}); + const wrapper = mount(app); + + try { + await wrapper.instance().getWrappedComponentInstance().undoLastCommit(); + } catch (e) { + throw e; + } + + assert.doesNotThrow(async () => await wrapper.instance().getWrappedComponentInstance().undoLastCommit()); + }); + it('restores to the state prior to committing', async function() { const workdirPath = await cloneRepository('three-files'); const repository = await buildRepository(workdirPath); From b6b2e981c72ca716438ff6e1dab98f71ca70cf11 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Fri, 23 Mar 2018 17:56:45 -0700 Subject: [PATCH 0103/5422] :shirt: --- lib/controllers/recent-commits-controller.js | 1 + lib/git-shell-out-strategy.js | 4 ++-- lib/views/git-tab-view.js | 1 + lib/views/recent-commits-view.js | 1 + test/git-strategies.test.js | 12 ++++++------ 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/controllers/recent-commits-controller.js b/lib/controllers/recent-commits-controller.js index 37930e2178..60ba927619 100644 --- a/lib/controllers/recent-commits-controller.js +++ b/lib/controllers/recent-commits-controller.js @@ -7,6 +7,7 @@ export default class RecentCommitsController extends React.Component { static propTypes = { commits: PropTypes.arrayOf(PropTypes.object).isRequired, isLoading: PropTypes.bool.isRequired, + undoLastCommit: PropTypes.func.isRequired, } render() { diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 8d2d817dbe..dd3c452f66 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -727,9 +727,9 @@ export default class GitShellOutStrategy { * Undo Operations */ reset(type, revision = 'HEAD') { - const validTypes = ['soft'] + const validTypes = ['soft']; if (!validTypes.includes(type)) { - throw new Error(`Invalid type ${type}. Must be one of: ${validTypes.join(', ')}`) + throw new Error(`Invalid type ${type}. Must be one of: ${validTypes.join(', ')}`); } return this.exec(['reset', `--${type}`, revision]); } diff --git a/lib/views/git-tab-view.js b/lib/views/git-tab-view.js index 3eed26334c..20d7a32c96 100644 --- a/lib/views/git-tab-view.js +++ b/lib/views/git-tab-view.js @@ -48,6 +48,7 @@ export default class GitTabView extends React.Component { initializeRepo: PropTypes.func.isRequired, abortMerge: PropTypes.func.isRequired, commit: PropTypes.func.isRequired, + undoLastCommit: PropTypes.func.isRequired, prepareToCommit: PropTypes.func.isRequired, resolveAsOurs: PropTypes.func.isRequired, resolveAsTheirs: PropTypes.func.isRequired, diff --git a/lib/views/recent-commits-view.js b/lib/views/recent-commits-view.js index b5e12c176d..56e989e290 100644 --- a/lib/views/recent-commits-view.js +++ b/lib/views/recent-commits-view.js @@ -9,6 +9,7 @@ class RecentCommitView extends React.Component { static propTypes = { commit: PropTypes.object.isRequired, undoLastCommit: PropTypes.func.isRequired, + isMostRecent: PropTypes.bool.isRequired, }; render() { diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index bc4c3426c2..ea77b807a0 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -627,22 +627,22 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; fs.appendFileSync(path.join(workingDirPath, 'a.txt'), 'bar\n', 'utf8'); await git.exec(['add', '.']); - await git.commit('add stuff') + await git.commit('add stuff'); - const parentCommit = await git.getCommit('HEAD~') + const parentCommit = await git.getCommit('HEAD~'); await git.reset('soft', 'HEAD~'); - const commitAfterReset = await git.getCommit('HEAD') - assert.strictEqual(commitAfterReset.sha, parentCommit.sha) + const commitAfterReset = await git.getCommit('HEAD'); + assert.strictEqual(commitAfterReset.sha, parentCommit.sha); const stagedChanges = await git.getDiffsForFilePath('a.txt', {staged: true}); assert.lengthOf(stagedChanges, 1); - const stagedChange = stagedChanges[0] + const stagedChange = stagedChanges[0]; assert.strictEqual(stagedChange.newPath, 'a.txt'); assert.deepEqual(stagedChange.hunks[0].lines, [' foo', '+bar']); }); - }) + }); }); describe('getBranches()', function() { From c89a4bf82c2743491cc6125583131face5ad3f61 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Mon, 26 Mar 2018 15:45:19 -0700 Subject: [PATCH 0104/5422] Extract `extractCoAuthorsAndRawCommitMessage` method & LINE_ENDING_REGEX Co-authored-by: Tilde Ann Thurium --- lib/git-shell-out-strategy.js | 14 ++++---------- lib/helpers.js | 17 +++++++++++++++++ lib/views/commit-view.js | 4 +--- lib/views/recent-commits-view.js | 3 ++- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index dd3c452f66..1a2dda0908 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -14,13 +14,12 @@ import GitTempDir from './git-temp-dir'; import AsyncQueue from './async-queue'; import { getDugitePath, getSharedModulePath, getAtomHelperPath, - fileExists, isFileExecutable, isFileSymlink, isBinary, - normalizeGitHelperPath, toNativePathSep, toGitPathSep, + extractCoAuthorsAndRawCommitMessage, fileExists, isFileExecutable, isFileSymlink, isBinary, + normalizeGitHelperPath, toNativePathSep, toGitPathSep, LINE_ENDING_REGEX, } from './helpers'; import GitTimingsView from './views/git-timings-view'; import WorkerManager from './worker-manager'; -const LINE_ENDING_REGEX = /\r?\n/; const MAX_STATUS_OUTPUT_LENGTH = 1024 * 1024 * 10; let headless = null; @@ -579,19 +578,14 @@ export default class GitShellOutStrategy { for (let i = 0; i < fields.length; i += 5) { const body = fields[i + 4]; - // There's probably a better way. I tried finding a regex to do it in one fell swoop but had no luck - const coAuthors = body.split(LINE_ENDING_REGEX).reduce((emails, line) => { - const match = line.match(/^co-authored-by: .*<(.*)>\s*/i); - if (match && match[1]) { emails.push(match[1]); } - return emails; - }, []); + const {message, coAuthors} = extractCoAuthorsAndRawCommitMessage(body); commits.push({ sha: fields[i] && fields[i].trim(), authorEmail: fields[i + 1] && fields[i + 1].trim(), authorDate: parseInt(fields[i + 2], 10), message: fields[i + 3], - body: fields[i + 4], + body: message, coAuthors, }); } diff --git a/lib/helpers.js b/lib/helpers.js index 65ba5a3f7f..ce12b849eb 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -5,6 +5,8 @@ import temp from 'temp'; import FilePatchController from './controllers/file-patch-controller'; +export const LINE_ENDING_REGEX = /\r?\n/; + export function getPackageRoot() { const {resourcePath} = atom.getLoadSettings(); const currentFileWasRequiredFromSnapshot = !path.isAbsolute(__dirname); @@ -312,3 +314,18 @@ export function destroyEmptyFilePatchPaneItems(workspace) { const itemsToDestroy = getFilePatchPaneItems({empty: true}, workspace); itemsToDestroy.forEach(item => item.destroy()); } + +export function extractCoAuthorsAndRawCommitMessage(commitMessage) { + // There's probably a better way. I tried finding a regex to do it in one fell swoop but had no luck + let rawMessage = ''; + const coAuthors = commitMessage.split(LINE_ENDING_REGEX).reduce((emails, line) => { + const match = line.match(/^co-authored-by: .*<(.*)>\s*/i); + if (match && match[1]) { + emails.push(match[1]); + } else { + rawMessage += line; + } + return emails; + }, []); + return {message: rawMessage, coAuthors}; +} diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index 8fd762ebec..b3bd582c00 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -7,9 +7,7 @@ import Select from 'react-select'; import Tooltip from './tooltip'; import AtomTextEditor from './atom-text-editor'; -import {shortenSha} from '../helpers'; - -const LINE_ENDING_REGEX = /\r?\n/; +import {shortenSha, LINE_ENDING_REGEX} from '../helpers'; class FakeKeyDownEvent extends CustomEvent { constructor(keyCode) { diff --git a/lib/views/recent-commits-view.js b/lib/views/recent-commits-view.js index 56e989e290..690fb0668f 100644 --- a/lib/views/recent-commits-view.js +++ b/lib/views/recent-commits-view.js @@ -14,13 +14,14 @@ class RecentCommitView extends React.Component { render() { const authorMoment = moment(this.props.commit.getAuthorDate() * 1000); + const fullMessage = (this.props.commit.getMessage() + '\n\n' + this.props.commit.getBody()).trim(); return (
  • {this.renderAuthors()} + title={fullMessage}> {this.props.commit.getMessage()} {this.props.isMostRecent && ( From 62ea66ef0c065ff9c7e0de0ad3946bbca076090b Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Mon, 26 Mar 2018 16:38:58 -0700 Subject: [PATCH 0105/5422] Pull up selectedCoAuthors state to GitTabController Co-authored-by: Tilde Ann Thurium --- lib/controllers/commit-controller.js | 5 ++++- lib/controllers/git-tab-controller.js | 17 +++++++++++++++-- lib/views/commit-view.js | 18 ++++++++++-------- lib/views/git-tab-view.js | 4 ++++ 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/lib/controllers/commit-controller.js b/lib/controllers/commit-controller.js index 78254d1c41..6c003097f0 100644 --- a/lib/controllers/commit-controller.js +++ b/lib/controllers/commit-controller.js @@ -35,7 +35,8 @@ export default class CommitController extends React.Component { email: PropTypes.string.isRequired, name: PropTypes.string.isRequired, })).isRequired, - + selectedCoAuthors: PropTypes.arrayOf(PropTypes.string).isRequired, + updateSelectedCoAuthors: PropTypes.func.isRequired, prepareToCommit: PropTypes.func.isRequired, commit: PropTypes.func.isRequired, abortMerge: PropTypes.func.isRequired, @@ -115,6 +116,8 @@ export default class CommitController extends React.Component { toggleExpandedCommitMessageEditor={this.toggleExpandedCommitMessageEditor} deactivateCommitBox={!!this.getCommitMessageEditors().length > 0} mentionableUsers={this.props.mentionableUsers} + selectedCoAuthors={this.props.selectedCoAuthors} + updateSelectedCoAuthors={this.props.updateSelectedCoAuthors} /> ); } diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index c71ed3446e..799deb84c1 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -12,6 +12,7 @@ import ObserveModelDecorator from '../decorators/observe-model'; import UserStore from '../models/user-store'; import {nullBranch} from '../models/branch'; import {nullCommit} from '../models/commit'; +import {extractCoAuthorsAndRawCommitMessage} from '../helpers'; const DOMPurify = createDOMPurify(); @@ -105,7 +106,10 @@ export default class GitTabController extends React.Component { this.refView = null; - this.state = {mentionableUsers: []}; + this.state = { + mentionableUsers: [], + selectedCoAuthors: null, + }; this.userStore = new UserStore({ repository: this.props.repository, @@ -143,6 +147,8 @@ export default class GitTabController extends React.Component { workingDirectoryPath={this.props.workingDirectoryPath} mergeMessage={this.props.mergeMessage} mentionableUsers={this.state.mentionableUsers} + selectedCoAuthors={this.state.selectedCoAuthors} + updateSelectedCoAuthors={this.updateSelectedCoAuthors} resolutionProgress={this.props.resolutionProgress} workspace={this.props.workspace} @@ -333,12 +339,19 @@ export default class GitTabController extends React.Component { return this.props.repository.commit(message); } + @autobind + updateSelectedCoAuthors(selectedCoAuthors) { + this.setState({selectedCoAuthors}); + } + @autobind async undoLastCommit() { const repo = this.props.repository; const lastCommit = await repo.getLastCommit(); if (lastCommit.isUnbornRef()) { return null; } - repo.setRegularCommitMessage(lastCommit.message); + const {message, coAuthors} = extractCoAuthorsAndRawCommitMessage(lastCommit.message); + repo.setRegularCommitMessage(message); + this.updateSelectedCoAuthors(coAuthors); return repo.undoLastCommit(); } diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index b3bd582c00..df31ffacbe 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -40,7 +40,8 @@ export default class CommitView extends React.Component { maximumCharacterLimit: PropTypes.number.isRequired, message: PropTypes.string.isRequired, mentionableUsers: PropTypes.arrayOf(PropTypes.object).isRequired, - + selectedCoAuthors: PropTypes.arrayOf(PropTypes.string).isRequired, + updateSelectedCoAuthors: PropTypes.func.isRequired, commit: PropTypes.func.isRequired, abortMerge: PropTypes.func.isRequired, setAmending: PropTypes.func.isRequired, @@ -54,7 +55,6 @@ export default class CommitView extends React.Component { this.state = { showWorking: false, - selectedCoAuthors: [], showCoAuthorInput: false, }; @@ -237,7 +237,7 @@ export default class CommitView extends React.Component { optionRenderer={this.renderCoAuthorListItem} valueRenderer={this.renderCoAuthorValue} onChange={this.onSelectedCoAuthorsChanged} - value={this.state.selectedCoAuthors} + value={this.props.selectedCoAuthors} multi={true} /> ); @@ -286,9 +286,10 @@ export default class CommitView extends React.Component { } } - componentWillReceiveProps(nextProps) { - this.scheduleShowWorking(nextProps); - } + // componentWillReceiveProps(nextProps) { + // this.scheduleShowWorking(nextProps); + // this.state.selectedCoAuthors = nextProps.selectedCoAuthors; + // } componentWillUnmount() { this.subscriptions.dispose(); @@ -331,7 +332,7 @@ export default class CommitView extends React.Component { async commit() { if (await this.props.prepareToCommit() && this.isCommitButtonEnabled()) { try { - await this.props.commit(this.editor.getText(), this.state.selectedCoAuthors); + await this.props.commit(this.editor.getText(), this.props.selectedCoAuthors); } catch (e) { // do nothing } @@ -434,7 +435,8 @@ export default class CommitView extends React.Component { @autobind onSelectedCoAuthorsChanged(selectedCoAuthors) { - this.setState({selectedCoAuthors}); + this.props.updateSelectedCoAuthors(selectedCoAuthors); + // this.setState({selectedCoAuthors}); } rememberFocus(event) { diff --git a/lib/views/git-tab-view.js b/lib/views/git-tab-view.js index 20d7a32c96..f456847082 100644 --- a/lib/views/git-tab-view.js +++ b/lib/views/git-tab-view.js @@ -35,6 +35,8 @@ export default class GitTabView extends React.Component { workingDirectoryPath: PropTypes.string, mergeMessage: PropTypes.string, mentionableUsers: PropTypes.arrayOf(PropTypes.object).isRequired, + selectedCoAuthors: PropTypes.arrayOf(PropTypes.string).isRequired, + updateSelectedCoAuthors: PropTypes.func.isRequired, workspace: PropTypes.object.isRequired, commandRegistry: PropTypes.object.isRequired, @@ -186,6 +188,8 @@ export default class GitTabView extends React.Component { lastCommit={this.props.lastCommit} repository={this.props.repository} mentionableUsers={this.props.mentionableUsers} + selectedCoAuthors={this.props.selectedCoAuthors} + updateSelectedCoAuthors={this.props.updateSelectedCoAuthors} /> { this.refRecentCommitController = c; }} From dd872d0e84303298da32c98fbb5be6e7a5b17700 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Mon, 26 Mar 2018 17:03:31 -0700 Subject: [PATCH 0106/5422] Test that co author state populates after undoing last commit Co-authored-by: Tilde Ann Thurium --- test/controllers/git-tab-controller.test.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index 78a44d1a59..c66e0158c9 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -635,17 +635,25 @@ describe('GitTabController', function() { fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'foo\nbar\nbaz\n'); await repository.stageFiles(['new-file.txt']); - const commitMessage = 'Commit some stuff'; + const commitSubject = 'Commit some stuff'; + const commitMessage = dedent` + ${commitSubject} + + Co-authored-by: Foo Bar + `; await repository.commit(commitMessage); app = React.cloneElement(app, {repository}); const wrapper = mount(app); + assert.deepEqual(wrapper.find('CommitView').prop('selectedCoAuthors'), []); + await assert.async.lengthOf(wrapper.find('.github-RecentCommit-undoButton'), 1); wrapper.find('.github-RecentCommit-undoButton').simulate('click'); let commitMessages = wrapper.find('.github-RecentCommit-message').map(node => node.text()); - assert.deepEqual(commitMessages, [commitMessage, 'Initial commit']); + // ensure that the co author trailer is stripped from commit message + assert.deepEqual(commitMessages, [commitSubject, 'Initial commit']); await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 1); assert.deepEqual(wrapper.find('GitTabView').prop('stagedChanges'), [{ @@ -656,7 +664,9 @@ describe('GitTabController', function() { commitMessages = wrapper.find('.github-RecentCommit-message').map(node => node.text()); assert.deepEqual(commitMessages, ['Initial commit']); - assert.strictEqual(wrapper.find('CommitView').prop('message'), commitMessage); + assert.strictEqual(wrapper.find('CommitView').prop('message'), commitSubject); + + assert.deepEqual(wrapper.find('CommitView').prop('selectedCoAuthors'), ['foo@bar.com']); }); }); }); From 072bc28aa0944f18834ed503b942b885c732a389 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Mon, 26 Mar 2018 17:04:29 -0700 Subject: [PATCH 0107/5422] Initialize state of co authors to empty array Co-authored-by: Tilde Ann Thurium --- lib/controllers/git-tab-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index 799deb84c1..e067c5ece0 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -108,7 +108,7 @@ export default class GitTabController extends React.Component { this.state = { mentionableUsers: [], - selectedCoAuthors: null, + selectedCoAuthors: [], }; this.userStore = new UserStore({ From 3d03b671d8644e6ff207ba0ef80fed038c0d56e4 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Mon, 26 Mar 2018 18:49:19 -0700 Subject: [PATCH 0108/5422] Implement `github:amend-last-commit` command Co-authored-by: Tilde Ann Thurium --- lib/controllers/commit-controller.js | 5 +++-- lib/controllers/git-tab-controller.js | 4 ++-- lib/git-shell-out-strategy.js | 9 ++++++++- lib/models/repository-states/present.js | 2 +- lib/views/commit-view.js | 19 +++++++++++++------ 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/lib/controllers/commit-controller.js b/lib/controllers/commit-controller.js index 6c003097f0..6f6db99eea 100644 --- a/lib/controllers/commit-controller.js +++ b/lib/controllers/commit-controller.js @@ -145,7 +145,7 @@ export default class CommitController extends React.Component { } @autobind - async commit(message, coAuthors = []) { + async commit(message, coAuthors = [], amend) { let msg; if (this.getCommitMessageEditors().length > 0) { @@ -165,7 +165,8 @@ export default class CommitController extends React.Component { }); msg = await this.props.repository.addTrailersToCommitMessage(msg, trailers); } - return this.props.commit(msg.trim()); + + return this.props.commit(msg.trim(), {amend}); } getCommitMessage() { diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index e067c5ece0..0858f34a97 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -335,8 +335,8 @@ export default class GitTabController extends React.Component { } @autobind - commit(message) { - return this.props.repository.commit(message); + commit(message, options) { + return this.props.repository.commit(message, options); } @autobind diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 1a2dda0908..e5cc6195c8 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -400,13 +400,20 @@ export default class GitShellOutStrategy { commit(message, {allowEmpty, amend} = {}) { let args = ['commit', '--cleanup=strip']; + + // determine correct message arguments if (typeof message === 'object') { args = args.concat(['-F', message.filePath]); } else if (typeof message === 'string') { - args = args.concat(['-m', message]); + if (message.length === 0 && amend) { + args = args.concat(['--reuse-message=HEAD']); + } else { + args = args.concat(['-m', message]); + } } else { throw new Error(`Invalid message type ${typeof message}. Must be string or object with filePath property`); } + if (amend) { args.push('--amend'); } if (allowEmpty) { args.push('--allow-empty'); } return this.gpgExec(args, {writeOperation: true}); diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index f7af981cdc..9b735aaf40 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -259,7 +259,7 @@ export default class Present extends State { commit(message, options) { // eslint-disable-next-line no-shadow return this.executePipelineAction('COMMIT', (message, options) => { - const opts = {...options, amend: this.isAmending()}; + const opts = {amend: this.isAmending(), ...options}; return this.git().commit(message, opts); }, message, options); } diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index df31ffacbe..b996ed0e45 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -90,6 +90,7 @@ export default class CommitView extends React.Component { this.subscriptions = new CompositeDisposable( this.props.commandRegistry.add('atom-workspace', { 'github:commit': this.commit, + 'github:amend-last-commit': this.amendLastCommit, 'github:toggle-expanded-commit-message-editor': this.toggleExpandedCommitMessageEditor, 'github:co-author:down': this.proxyKeyCode(40), @@ -329,18 +330,23 @@ export default class CommitView extends React.Component { } @autobind - async commit() { - if (await this.props.prepareToCommit() && this.isCommitButtonEnabled()) { + async commit(amend) { + if (await this.props.prepareToCommit() && this.isCommitButtonEnabled(amend)) { try { - await this.props.commit(this.editor.getText(), this.props.selectedCoAuthors); + await this.props.commit(this.editor.getText(), this.props.selectedCoAuthors, amend); } catch (e) { - // do nothing + // do nothing - error was taken care of in pipeline manager } } else { this.setFocus(CommitView.focus.EDITOR); } } + @autobind + amendLastCommit() { + this.commit(true); + } + getRemainingCharacters() { if (this.editor != null) { if (this.editor.getCursorBufferPosition().row === 0) { @@ -374,12 +380,13 @@ export default class CommitView extends React.Component { } } - isCommitButtonEnabled() { + isCommitButtonEnabled(amend) { + const messageExists = this.editor && this.editor.getText().length !== 0; return !this.props.isCommitting && this.props.stagedChangesExist && !this.props.mergeConflictsExist && this.props.lastCommit.isPresent() && - (this.props.deactivateCommitBox || (this.editor && this.editor.getText().length !== 0)); + (this.props.deactivateCommitBox || (amend || messageExists)); } commitButtonText() { From e14583762230db34ee7f431ef789b76ebbe60b7b Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Tue, 27 Mar 2018 11:57:50 -0700 Subject: [PATCH 0109/5422] Fix broken CommitView editor focus test Co-Authored-By: Katrina Uychaco --- lib/views/commit-view.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index b996ed0e45..3a5d440ef7 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -330,7 +330,7 @@ export default class CommitView extends React.Component { } @autobind - async commit(amend) { + async commit(event, amend) { if (await this.props.prepareToCommit() && this.isCommitButtonEnabled(amend)) { try { await this.props.commit(this.editor.getText(), this.props.selectedCoAuthors, amend); @@ -344,7 +344,7 @@ export default class CommitView extends React.Component { @autobind amendLastCommit() { - this.commit(true); + this.commit(null, true); } getRemainingCharacters() { From f4081acff520dd90a9e2ef4c0828848aee496660 Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Tue, 27 Mar 2018 17:06:38 -0700 Subject: [PATCH 0110/5422] Add tests for amending with and without a new commit message Co-authored-by: Katrina Uychaco --- test/controllers/git-tab-controller.test.js | 55 +++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index c66e0158c9..1728231329 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -612,6 +612,61 @@ describe('GitTabController', function() { }); }); + describe('amend', function() { + it('if commit message is not provided, default to using previous commit message', async function() { + const workdirPath = await cloneRepository('three-files'); + const repository = await buildRepository(workdirPath); + + app = React.cloneElement(app, {repository}); + const wrapper = mount(app); + + const commitMessage = 'most recent commit woohoo'; + await repository.commit(commitMessage, {allowEmpty: true}); + + // we have an empty commit editor with staged changes + fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'oh\nem\ngee\n'); + await repository.stageFiles(['new-file.txt']); + await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 1); + + assert.strictEqual(wrapper.find('CommitView').getNode().editor.getText(), ''); + + sinon.spy(repository, 'commit'); + commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + + // amending should commit all unstaged changes + await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); + const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + assert.equal(lastCommit.message, commitMessage); + assert.deepEqual(repository.commit.args[0][1], {amend: true}); + }); + + it('amend should use commit message if one is supplied', async function() { + const workdirPath = await cloneRepository('three-files'); + const repository = await buildRepository(workdirPath); + app = React.cloneElement(app, {repository}); + const wrapper = mount(app); + + const commitMessage = 'most recent commit woohoo'; + await repository.commit(commitMessage, {allowEmpty: true}); + + // st-st-staging changes with a shiny new commit message + fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'oh\nem\ngee\n'); + await repository.stageFiles(['new-file.txt']); + await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 1); + const newMessage = 'such new very message'; + + const commitView = wrapper.find('CommitView'); + commitView.getNode().editor.setText(newMessage); + + sinon.spy(repository, 'commit'); + commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); + const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + assert.equal(lastCommit.message, newMessage); + assert.deepEqual(repository.commit.args[0][1], {amend: true}); + }); + }); + describe('undoLastCommit()', function() { it('does nothing when there are no commits', async function() { const workdirPath = await initRepository(); From c8c999dc04d3fbe5bb14a44d1929e30545c8779a Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Tue, 27 Mar 2018 17:16:05 -0700 Subject: [PATCH 0111/5422] Remove "amend" checkbox. Co-authored-by: Katrina Uychaco --- lib/views/commit-view.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index 3a5d440ef7..416c810ad8 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -183,18 +183,6 @@ export default class CommitView extends React.Component { className="btn github-CommitView-button github-CommitView-abortMerge is-secondary" onClick={this.abortMerge}>Abort Merge } - {showAmendBox && - - } } + + disabled={!this.commitIsEnabled()}>{this.commitButtonText()}
    {this.getRemainingCharacters()}
    @@ -310,7 +310,7 @@ export default class CommitView extends React.Component { @autobind async commit(event, amend) { - if (await this.props.prepareToCommit() && this.isCommitButtonEnabled(amend)) { + if (await this.props.prepareToCommit() && this.commitIsEnabled(amend)) { try { await this.props.commit(this.editor.getText(), this.props.selectedCoAuthors, amend); } catch (e) { @@ -362,7 +362,7 @@ export default class CommitView extends React.Component { } } - isCommitButtonEnabled(amend) { + commitIsEnabled(amend) { const messageExists = this.editor && this.editor.getText().length !== 0; return !this.props.isCommitting && (amend || this.props.stagedChangesExist) && From dee8f79e2780fadef2c1a0c8d363c385901ce653 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 29 Mar 2018 11:19:32 -0700 Subject: [PATCH 0130/5422] PR feedback: fix whitespace, formatting --- lib/views/push-pull-view.js | 67 +++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/lib/views/push-pull-view.js b/lib/views/push-pull-view.js index 4a398a256d..3be04dc863 100644 --- a/lib/views/push-pull-view.js +++ b/lib/views/push-pull-view.js @@ -4,7 +4,6 @@ import cx from 'classnames'; import {RemotePropType, BranchPropType} from '../prop-types'; - function getIconClass(icon, isSyncing = false) { return cx( 'github-PushPull-icon', @@ -105,33 +104,34 @@ export default class PushPullView extends React.Component { const isSyncing = this.props.isSyncing; const hasOrigin = !!this.props.originExists; - return (
    (this.tileNode = node)} - className={cx('github-PushPull', 'inline-block', {'github-branch-detached': isDetached})}> + return ( +
    (this.tileNode = node)} + className={cx('github-PushPull', 'inline-block', {'github-branch-detached': isDetached})}> - {isAhead && !isBehind && !isUnpublished && ( + {isAhead && !isBehind && !isUnpublished && ( (this.tooltipTarget = node)} onClick={this.onClickPush} className="push-pull-target" data-tooltip="Click to push
    Cmd-click to force push
    Right-click for more"> - Push {this.props.aheadCount} + Push {this.props.aheadCount}
    - )} + )} - {isBehind && !isAhead && !isUnpublished && ( + {isBehind && !isAhead && !isUnpublished && ( (this.tooltipTarget = node)} onClick={this.onClickPull} className="push-pull-target" data-tooltip="Click to pull
    Right-click for more"> - Pull {this.props.behindCount} + Pull {this.props.behindCount}
    - )} + )} - {isBehind && isAhead && !isUnpublished && !isSyncing && ( + {isBehind && isAhead && !isUnpublished && !isSyncing && ( (this.tooltipTarget = node)} onClick={this.onClickPushPull} @@ -142,56 +142,57 @@ export default class PushPullView extends React.Component { {this.props.aheadCount}{' '} - Pull {this.props.behindCount} + Pull {this.props.behindCount} - )} + )} - {isBehind && isAhead && !isUnpublished && isSyncing && ( + {isBehind && isAhead && !isUnpublished && isSyncing && ( - Pull {this.props.behindCount} + Pull {this.props.behindCount} - )} + )} - {!isBehind && !isAhead && !isUnpublished && !isDetached && ( + {!isBehind && !isAhead && !isUnpublished && !isDetached && ( (this.tooltipTarget = node)} onClick={this.onClickFetch} className="push-pull-target" data-tooltip="Click to fetch
    Right-click for more"> - Fetch -
    - )} + Fetch + + )} - {isUnpublished && !isDetached && hasOrigin && ( + {isUnpublished && !isDetached && hasOrigin && ( (this.tooltipTarget = node)} onClick={this.onClickPublish} className="push-pull-target" data-tooltip="Click to set up a remote tracking branch
    Right-click for more"> - Publish -
    - )} + Publish + + )} - {isUnpublished && !isDetached && !hasOrigin && ( + {isUnpublished && !isDetached && !hasOrigin && ( (this.tooltipTarget = node)} className="push-pull-target" data-tooltip={'There is no remote named "origin"'}> - No remote - - )} + No remote + + )} - {isDetached && ( + {isDetached && ( (this.tooltipTarget = node)} className="push-pull-target" data-tooltip={'Create a branch if you wish to push your work anywhere'}> - Not on branch - - )} -
    ); + Not on branch + + )} +
    + ); } } From d51a5a1cacb1448b57f8a88a5ada444d180d3f51 Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 30 Mar 2018 10:03:59 +0900 Subject: [PATCH 0131/5422] Align Undo button --- styles/recent-commits.less | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/styles/recent-commits.less b/styles/recent-commits.less index 0d4b7d4017..06a3bda3b5 100644 --- a/styles/recent-commits.less +++ b/styles/recent-commits.less @@ -29,8 +29,9 @@ .github-RecentCommit { position: relative; display: flex; - padding: @component-padding/2 @component-padding; - line-height: @size; + align-items: center; + padding: 0 @component-padding; + line-height: @size + @component-padding; &-authors { position: absolute; @@ -77,8 +78,8 @@ &-undoButton.btn { padding: 0 @component-padding/1.5; margin-right: @component-padding/2; - height: @size + @component-padding/2; - line-height: 0; + height: @size * 1.25; + line-height: 1; font-size: .9em; } From 28e1a10e68cf61a457094e9e715240e32f073013 Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Thu, 29 Mar 2018 16:30:09 -0700 Subject: [PATCH 0132/5422] refactor git-tab-controller tests to add beforeEach for amend methods. Co-authored-by: Katrina Uychaco --- test/controllers/git-tab-controller.test.js | 30 ++++++++++----------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index 2fabfe6a5a..fe762a6861 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -573,16 +573,20 @@ describe('GitTabController', function() { }); describe('amend', function() { - it('if commit message is not provided, default to using previous commit message', async function() { - const workdirPath = await cloneRepository('three-files'); - const repository = await buildRepository(workdirPath); + let repository, commitMessage, workdirPath, wrapper; + beforeEach(async function() { + workdirPath = await cloneRepository('three-files'); + repository = await buildRepository(workdirPath); app = React.cloneElement(app, {repository}); - const wrapper = mount(app); + wrapper = mount(app); - const commitMessage = 'most recent commit woohoo'; + commitMessage = 'most recent commit woohoo'; await repository.commit(commitMessage, {allowEmpty: true}); + }); + + it('amends when there are staged changes and uses the last commit\'s message when there is no new message', async function() { // we have an empty commit editor with staged changes fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'oh\nem\ngee\n'); await repository.stageFiles(['new-file.txt']); @@ -596,19 +600,12 @@ describe('GitTabController', function() { // amending should commit all unstaged changes await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + // commit message from previous commit should be used assert.equal(lastCommit.message, commitMessage); - assert.deepEqual(repository.commit.args[0][1], {amend: true}); + assert.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); }); - it('amend should use commit message if one is supplied', async function() { - const workdirPath = await cloneRepository('three-files'); - const repository = await buildRepository(workdirPath); - app = React.cloneElement(app, {repository}); - const wrapper = mount(app); - - const commitMessage = 'most recent commit woohoo'; - await repository.commit(commitMessage, {allowEmpty: true}); - + it('amends when there are staged changes and a new commit message', async function() { // st-st-staging changes with a shiny new commit message fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'oh\nem\ngee\n'); await repository.stageFiles(['new-file.txt']); @@ -622,8 +619,9 @@ describe('GitTabController', function() { commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + // new commit message should be used for last commit assert.equal(lastCommit.message, newMessage); - assert.deepEqual(repository.commit.args[0][1], {amend: true}); + assert.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); }); }); From 217b834d0ea77c1abbc03689d9fb1919b4226d2f Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Thu, 29 Mar 2018 18:25:54 -0700 Subject: [PATCH 0133/5422] Refactor gsos#getHeadCommit to use gsos#getRecentCommits This reduces redundancy and prevents us from parsing the co author trailer twice. It also provides more information when you're asking for the last commit (such as co authors.) Co-authored-by: Katrina Uychaco --- lib/controllers/git-tab-controller.js | 2 +- lib/git-shell-out-strategy.js | 16 ++++------------ lib/models/repository-states/present.js | 4 ++-- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index bd0401795e..4d2eee2ab0 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -338,7 +338,7 @@ export default class GitTabController extends React.Component { const repo = this.props.repository; const lastCommit = await repo.getLastCommit(); if (lastCommit.isUnbornRef()) { return null; } - const {message, coAuthors} = extractCoAuthorsAndRawCommitMessage(lastCommit.message); + const {message, coAuthors} = lastCommit; repo.setCommitMessage(message); this.updateSelectedCoAuthors(coAuthors); return repo.undoLastCommit(); diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 4ca602c981..c4a5cada91 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -566,17 +566,8 @@ export default class GitShellOutStrategy { } async getHeadCommit() { - try { - const commit = await this.getCommit('HEAD'); - commit.unbornRef = false; - return commit; - } catch (e) { - if (/unknown revision/.test(e.stdErr) || /bad revision 'HEAD'/.test(e.stdErr)) { - return {sha: '', message: '', unbornRef: true}; - } else { - throw e; - } - } + const [headCommit] = await this.getRecentCommits({max: 1, ref: 'HEAD'}); + return headCommit; } async getRecentCommits(options = {}) { @@ -599,7 +590,7 @@ export default class GitShellOutStrategy { } }); - if (output === '') { return []; } + if (output === '') { return [{sha: '', message: '', unbornRef: true}]; } const fields = output.trim().split('\0'); const commits = []; @@ -615,6 +606,7 @@ export default class GitShellOutStrategy { message: fields[i + 3], body: message, coAuthors, + unbornRef: false }); } return commits; diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index 2a002582cb..fa752c188b 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -571,8 +571,8 @@ export default class Present extends State { getLastCommit() { return this.cache.getOrSet(Keys.lastCommit, async () => { - const {sha, message, unbornRef} = await this.git().getHeadCommit(); - return unbornRef ? Commit.createUnborn() : new Commit({sha, message}); + const headCommit = await this.git().getHeadCommit(); + return headCommit.unbornRef ? Commit.createUnborn() : new Commit(headCommit); }); } From b82b01b907502b69fbd021db2af86f8cd9e4b743 Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Thu, 29 Mar 2018 18:26:42 -0700 Subject: [PATCH 0134/5422] WIP - tests for git-tab-controller Co-authored-by: Katrina Uychaco --- test/controllers/git-tab-controller.test.js | 118 +++++++++++++++----- 1 file changed, 87 insertions(+), 31 deletions(-) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index fe762a6861..29280c265e 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -572,7 +572,7 @@ describe('GitTabController', function() { }); }); - describe('amend', function() { + describe.only('amend', function() { let repository, commitMessage, workdirPath, wrapper; beforeEach(async function() { workdirPath = await cloneRepository('three-files'); @@ -585,43 +585,99 @@ describe('GitTabController', function() { await repository.commit(commitMessage, {allowEmpty: true}); }); + describe('when there are staged changes only', function() { + it('uses the last commit\'s message since there is no new message', async function() { + // stage some changes + fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'oh\nem\ngee\n'); + await repository.stageFiles(['new-file.txt']); + await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 1); - it('amends when there are staged changes and uses the last commit\'s message when there is no new message', async function() { - // we have an empty commit editor with staged changes - fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'oh\nem\ngee\n'); - await repository.stageFiles(['new-file.txt']); - await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 1); + // ensure that the commit editor is empty + assert.strictEqual(wrapper.find('CommitView').getNode().editor.getText(), ''); - assert.strictEqual(wrapper.find('CommitView').getNode().editor.getText(), ''); + sinon.spy(repository, 'commit'); + commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + assert.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); - sinon.spy(repository, 'commit'); - commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); - - // amending should commit all unstaged changes - await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); - const lastCommit = wrapper.find('CommitView').prop('lastCommit'); - // commit message from previous commit should be used - assert.equal(lastCommit.message, commitMessage); - assert.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); + // amending should commit all unstaged changes + await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); + + // commit message from previous commit should be used + const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + assert.equal(lastCommit.message, commitMessage); + }) }); - it('amends when there are staged changes and a new commit message', async function() { - // st-st-staging changes with a shiny new commit message - fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'oh\nem\ngee\n'); - await repository.stageFiles(['new-file.txt']); - await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 1); - const newMessage = 'such new very message'; + describe('when there is a new commit message provided (and no staged changes)', function() { + it('discards the last commit\'s message and uses the new one', async function() { + // new commit message + const newMessage = 'such new very message'; + const commitView = wrapper.find('CommitView'); + commitView.getNode().editor.setText(newMessage); - const commitView = wrapper.find('CommitView'); - commitView.getNode().editor.setText(newMessage); + // no staged changes + await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); - sinon.spy(repository, 'commit'); - commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); - await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); - const lastCommit = wrapper.find('CommitView').prop('lastCommit'); - // new commit message should be used for last commit - assert.equal(lastCommit.message, newMessage); - assert.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); + sinon.spy(repository, 'commit'); + commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + assert.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); + + // new commit message is used + const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + assert.equal(lastCommit.message, newMessage); + }); + }); + + describe.only('when co-authors are changed', function() { + it('amends the last commit re-using the commit message and adding the co-author', async function() { + // stage some changes + fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'oh\nem\ngee\n'); + await repository.stageFiles(['new-file.txt']); + + // verify that last commit has no co-author + let commitBeforeAmend = wrapper.find('CommitView').prop('lastCommit'); + console.log(commitBeforeAmend); + assert.deepEqual(commitBeforeAmend.coAuthors, []); + + // add co author + const author = {email: 'foo@bar.com', name: "foo bar"}; + const commitView = wrapper.find('CommitView').getNode(); + commitView.setState({showCoAuthorInput: true}); + commitView.onSelectedCoAuthorsChanged([author]); + + sinon.spy(repository, 'commit'); + commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + // verify that coAuthor was passed + await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: [author]}); + + await new Promise(res => setTimeout(res, 1000)) + + // verify that commit message has coauthor (use helper) + const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + assert.strictEqual(lastCommit.message, commitBeforeAmend.message); + assert.deepEqual(lastCommit.coAuthors, [author]); + }); + + it('uses a new commit message if provided', async function() { + + }); + + it('successfully removes a co-author', async function() { + const commitMessageWithCoAuthors = dedent` + We did this together! + + Co-authored-by: Mona Lisa + ` + await repository.commit(commitMessageWithCoAuthors, {allowEmpty: true}); + + // assert that last commit has co-author + const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + + // commit with no co-authors set + commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + + + }); }); }); From 3283234dcbf5c2ebb82d199076e609e76884fbf0 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 29 Mar 2018 18:41:48 -0700 Subject: [PATCH 0135/5422] :fire: unnecessary test Rather than reading the file at ATOM_COMMIT_MSG_EDIT, we pull the text from the expanded commit message editor --- test/git-strategies.test.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index d7695467e9..a79ab3e25e 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -742,19 +742,6 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; const lastCommit = await git.getHeadCommit(); assert.deepEqual(lastCommit.message, 'Make a commit\n\nother stuff'); }); - - it('strips out comments and whitespace from message at specified file path', async function() { - const workingDirPath = await cloneRepository('multiple-commits'); - const git = createTestStrategy(workingDirPath); - - const commitMessagePath = path.join(workingDirPath, 'commit-message.txt'); - fs.writeFileSync(commitMessagePath, message); - - await git.commit({filePath: commitMessagePath}, {allowEmpty: true}); - - const lastCommit = await git.getHeadCommit(); - assert.deepEqual(lastCommit.message, 'Make a commit\n\nother stuff'); - }); }); describe('when amend option is true', function() { From f9fc18611104354ab46273b347064c6cac6894a5 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 29 Mar 2018 18:48:00 -0700 Subject: [PATCH 0136/5422] Fix GSOS tests after refactoring `getHeadCommit` to use `getRecentCommits` --- lib/git-shell-out-strategy.js | 4 ++-- test/git-strategies.test.js | 22 +++++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index c4a5cada91..ea097711bf 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -420,7 +420,7 @@ export default class GitShellOutStrategy { msg = await this.addCoAuthorsToMessage(msg, coAuthors); } - args.push('-m', msg); + args.push('-m', msg.trim()); if (amend) { args.push('--amend'); } if (allowEmpty) { args.push('--allow-empty'); } @@ -606,7 +606,7 @@ export default class GitShellOutStrategy { message: fields[i + 3], body: message, coAuthors, - unbornRef: false + unbornRef: false, }); } return commits; diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index a79ab3e25e..331b293014 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -124,12 +124,15 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; }); describe('getRecentCommits()', function() { - it('returns an empty array if no commits exist yet', async function() { - const workingDirPath = await initRepository(); - const git = createTestStrategy(workingDirPath); + describe('when no commits exist in the repository', function() { + it('returns an array with an unborn ref commit', async function() { + const workingDirPath = await initRepository(); + const git = createTestStrategy(workingDirPath); - const commits = await git.getRecentCommits(); - assert.lengthOf(commits, 0); + const commits = await git.getRecentCommits(); + assert.lengthOf(commits, 1); + assert.isTrue(commits[0].unbornRef); + }); }); it('returns all commits if fewer than max commits exist', async function() { @@ -146,6 +149,7 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; message: 'third commit', body: '', coAuthors: [], + unbornRef: false, }); assert.deepEqual(commits[1], { sha: '18920c900bfa6e4844853e7e246607a31c3e2e8c', @@ -154,6 +158,7 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; message: 'second commit', body: '', coAuthors: [], + unbornRef: false, }); assert.deepEqual(commits[2], { sha: '46c0d7179fc4e348c3340ff5e7957b9c7d89c07f', @@ -162,6 +167,7 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; message: 'first commit', body: '', coAuthors: [], + unbornRef: false, }); }); @@ -181,12 +187,13 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; assert.strictEqual(commits[9].message, 'Commit 1'); }); - it.only('includes co-authors based on commit body trailers', async function() { + it('includes co-authors based on commit body trailers', async function() { const workingDirPath = await cloneRepository('multiple-commits'); const git = createTestStrategy(workingDirPath); await git.commit(dedent` Implemented feature collaboratively + Co-authored-by: name Co-authored-by: another-name Co-authored-by: yet-another @@ -740,7 +747,8 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; await git.commit(message, {allowEmpty: true}); const lastCommit = await git.getHeadCommit(); - assert.deepEqual(lastCommit.message, 'Make a commit\n\nother stuff'); + assert.deepEqual(lastCommit.message, 'Make a commit'); + assert.deepEqual(lastCommit.body, 'other stuff'); }); }); From 6b5ef1a9434a5c22a240a81ab05839643c483b5b Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 29 Mar 2018 18:49:24 -0700 Subject: [PATCH 0137/5422] Refactor GSOS#getCommit to use GSOS#getRecentCommits --- lib/git-shell-out-strategy.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index ea097711bf..cafc2b935b 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -560,9 +560,8 @@ export default class GitShellOutStrategy { * Miscellaneous getters */ async getCommit(ref) { - const output = await this.exec(['log', '--pretty=%H%x00%B%x00', '--no-abbrev-commit', '-1', ref, '--']); - const [sha, message] = (output).split('\0'); - return {sha, message: message.trim(), unbornRef: false}; + const [commit] = await this.getRecentCommits({max: 1, ref}); + return commit; } async getHeadCommit() { From 123a5fbe6a8fd909f779b106a03724705bb025b7 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 29 Mar 2018 18:53:52 -0700 Subject: [PATCH 0138/5422] Rename GSOS#getRecentCommits to GSOS#getCommits --- lib/git-shell-out-strategy.js | 6 +++--- lib/models/repository-states/present.js | 2 +- test/git-strategies.test.js | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index cafc2b935b..36c8c0491d 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -560,16 +560,16 @@ export default class GitShellOutStrategy { * Miscellaneous getters */ async getCommit(ref) { - const [commit] = await this.getRecentCommits({max: 1, ref}); + const [commit] = await this.getCommits({max: 1, ref}); return commit; } async getHeadCommit() { - const [headCommit] = await this.getRecentCommits({max: 1, ref: 'HEAD'}); + const [headCommit] = await this.getCommits({max: 1, ref: 'HEAD'}); return headCommit; } - async getRecentCommits(options = {}) { + async getCommits(options = {}) { const {max, ref} = {max: 1, ref: 'HEAD', ...options}; // https://git-scm.com/docs/git-log#_pretty_formats diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index fa752c188b..5cb03644a5 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -578,7 +578,7 @@ export default class Present extends State { getRecentCommits(options) { return this.cache.getOrSet(Keys.recentCommits, async () => { - const commits = await this.git().getRecentCommits(options); + const commits = await this.git().getCommits({ref: 'HEAD', ...options}); return commits.map(commit => new Commit(commit)); }); } diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index 331b293014..c209a0cd37 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -123,13 +123,13 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; }); }); - describe('getRecentCommits()', function() { + describe('getCommits()', function() { describe('when no commits exist in the repository', function() { it('returns an array with an unborn ref commit', async function() { const workingDirPath = await initRepository(); const git = createTestStrategy(workingDirPath); - const commits = await git.getRecentCommits(); + const commits = await git.getCommits(); assert.lengthOf(commits, 1); assert.isTrue(commits[0].unbornRef); }); @@ -139,7 +139,7 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; const workingDirPath = await cloneRepository('multiple-commits'); const git = createTestStrategy(workingDirPath); - const commits = await git.getRecentCommits({max: 10}); + const commits = await git.getCommits({max: 10}); assert.lengthOf(commits, 3); assert.deepEqual(commits[0], { @@ -180,7 +180,7 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; await git.commit(`Commit ${i}`, {allowEmpty: true}); } - const commits = await git.getRecentCommits({max: 10}); + const commits = await git.getCommits({max: 10}); assert.lengthOf(commits, 10); assert.strictEqual(commits[0].message, 'Commit 10'); @@ -199,7 +199,7 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; Co-authored-by: yet-another `, {allowEmpty: true}); - const commits = await git.getRecentCommits({max: 1}); + const commits = await git.getCommits({max: 1}); assert.lengthOf(commits, 1); assert.deepEqual(commits[0].coAuthors, [ { From 7cc3b48567db732f04ac0e862d594ef08c948f4a Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 29 Mar 2018 19:22:34 -0700 Subject: [PATCH 0139/5422] Oops, we need a `this` when we call `isCommitMessageEditorExpanded` Co-authored-by: Tilde Ann Thurium --- lib/controllers/commit-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/controllers/commit-controller.js b/lib/controllers/commit-controller.js index bd1a008a98..2996c89e20 100644 --- a/lib/controllers/commit-controller.js +++ b/lib/controllers/commit-controller.js @@ -167,7 +167,7 @@ export default class CommitController extends React.Component { @autobind async toggleExpandedCommitMessageEditor(messageFromBox) { - if (isCommitMessageEditorExpanded()) { + if (this.isCommitMessageEditorExpanded()) { if (this.commitMessageEditorIsInForeground()) { this.closeAllOpenCommitMessageEditors(); } else { From 3085646e897840e736e2d2000832215c4f0ba525 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 29 Mar 2018 19:25:33 -0700 Subject: [PATCH 0140/5422] :shirt: --- test/controllers/git-tab-controller.test.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index 29280c265e..4c2b923cc8 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -605,7 +605,7 @@ describe('GitTabController', function() { // commit message from previous commit should be used const lastCommit = wrapper.find('CommitView').prop('lastCommit'); assert.equal(lastCommit.message, commitMessage); - }) + }); }); describe('when there is a new commit message provided (and no staged changes)', function() { @@ -635,12 +635,11 @@ describe('GitTabController', function() { await repository.stageFiles(['new-file.txt']); // verify that last commit has no co-author - let commitBeforeAmend = wrapper.find('CommitView').prop('lastCommit'); - console.log(commitBeforeAmend); + const commitBeforeAmend = wrapper.find('CommitView').prop('lastCommit'); assert.deepEqual(commitBeforeAmend.coAuthors, []); // add co author - const author = {email: 'foo@bar.com', name: "foo bar"}; + const author = {email: 'foo@bar.com', name: 'foo bar'}; const commitView = wrapper.find('CommitView').getNode(); commitView.setState({showCoAuthorInput: true}); commitView.onSelectedCoAuthorsChanged([author]); @@ -667,7 +666,7 @@ describe('GitTabController', function() { We did this together! Co-authored-by: Mona Lisa - ` + `; await repository.commit(commitMessageWithCoAuthors, {allowEmpty: true}); // assert that last commit has co-author From b3546379006a711ef9050bd7a58003275505145f Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Thu, 29 Mar 2018 20:00:27 -0700 Subject: [PATCH 0141/5422] WIP fix tests Co-authored-by: Tilde Ann Thurium --- test/controllers/git-tab-controller.test.js | 71 +++++++++++++-------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index 4c2b923cc8..b02378028e 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -573,7 +573,7 @@ describe('GitTabController', function() { }); describe.only('amend', function() { - let repository, commitMessage, workdirPath, wrapper; + let repository, commitMessage, workdirPath, wrapper, getLastCommit; beforeEach(async function() { workdirPath = await cloneRepository('three-files'); repository = await buildRepository(workdirPath); @@ -582,7 +582,17 @@ describe('GitTabController', function() { wrapper = mount(app); commitMessage = 'most recent commit woohoo'; - await repository.commit(commitMessage, {allowEmpty: true}); + fs.writeFileSync(path.join(workdirPath, 'foo.txt'), 'oh\nem\ngee\n'); + await repository.stageFiles(['foo.txt']); + await repository.commit(commitMessage); + + getLastCommit = () => { + return wrapper.find('RecentCommitView').getNodes()[0].props.commit; + }; + + await assert.async.strictEqual(getLastCommit().message, commitMessage); + + sinon.spy(repository, 'commit'); }); describe('when there are staged changes only', function() { @@ -595,15 +605,14 @@ describe('GitTabController', function() { // ensure that the commit editor is empty assert.strictEqual(wrapper.find('CommitView').getNode().editor.getText(), ''); - sinon.spy(repository, 'commit'); commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); - assert.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); + await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); // amending should commit all unstaged changes await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); // commit message from previous commit should be used - const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + const lastCommit = getLastCommit(); assert.equal(lastCommit.message, commitMessage); }); }); @@ -618,24 +627,18 @@ describe('GitTabController', function() { // no staged changes await assert.async.lengthOf(wrapper.find('GitTabView').prop('stagedChanges'), 0); - sinon.spy(repository, 'commit'); commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); - assert.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); + await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); // new commit message is used - const lastCommit = wrapper.find('CommitView').prop('lastCommit'); - assert.equal(lastCommit.message, newMessage); + await assert.async.equal(getLastCommit().message, newMessage); }); }); - describe.only('when co-authors are changed', function() { + describe('when co-authors are changed', function() { it('amends the last commit re-using the commit message and adding the co-author', async function() { - // stage some changes - fs.writeFileSync(path.join(workdirPath, 'new-file.txt'), 'oh\nem\ngee\n'); - await repository.stageFiles(['new-file.txt']); - // verify that last commit has no co-author - const commitBeforeAmend = wrapper.find('CommitView').prop('lastCommit'); + const commitBeforeAmend = getLastCommit(); assert.deepEqual(commitBeforeAmend.coAuthors, []); // add co author @@ -644,38 +647,54 @@ describe('GitTabController', function() { commitView.setState({showCoAuthorInput: true}); commitView.onSelectedCoAuthorsChanged([author]); - sinon.spy(repository, 'commit'); commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); // verify that coAuthor was passed await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: [author]}); - await new Promise(res => setTimeout(res, 1000)) - - // verify that commit message has coauthor (use helper) - const lastCommit = wrapper.find('CommitView').prop('lastCommit'); - assert.strictEqual(lastCommit.message, commitBeforeAmend.message); - assert.deepEqual(lastCommit.coAuthors, [author]); + await assert.async.deepEqual(getLastCommit().coAuthors, [author]); + assert.strictEqual(getLastCommit().message, commitBeforeAmend.message); }); it('uses a new commit message if provided', async function() { + // verify that last commit has no co-author + const commitBeforeAmend = getLastCommit(); + assert.deepEqual(commitBeforeAmend.coAuthors, []); + // add co author + const author = {email: 'foo@bar.com', name: 'foo bar'}; + const commitView = wrapper.find('CommitView').getNode(); + commitView.setState({showCoAuthorInput: true}); + commitView.onSelectedCoAuthorsChanged([author]); + const newMessage = 'Star Wars: A New Message'; + commitView.editor.setText(newMessage); + commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + + // verify that coAuthor was passed + await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: [author]}); + + // verify that commit message has coauthor + await assert.async.deepEqual(getLastCommit().coAuthors, [author]); + assert.strictEqual(getLastCommit().message, newMessage); }); it('successfully removes a co-author', async function() { + // make commit with co-author const commitMessageWithCoAuthors = dedent` We did this together! Co-authored-by: Mona Lisa `; - await repository.commit(commitMessageWithCoAuthors, {allowEmpty: true}); + await repository.git.exec(['commit', '--amend', '-m', commitMessageWithCoAuthors]); // assert that last commit has co-author - const lastCommit = wrapper.find('CommitView').prop('lastCommit'); + await assert.async.deepEqual(getLastCommit().coAuthors, [{name: 'Mona Lisa', email: 'mona@lisa.com'}]); - // commit with no co-authors set commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + // verify that NO coAuthor was passed + await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); - + // assert that no co-authors are in last commit + await assert.async.deepEqual(getLastCommit().coAuthors, []); }); }); }); From 4e8b6adf1d6e9a50edbc77a11e6eee124270467a Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 30 Mar 2018 01:07:04 -0700 Subject: [PATCH 0142/5422] Ensure Tooltip component does not use undefined targets --- lib/views/tooltip.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/views/tooltip.js b/lib/views/tooltip.js index c4c3e85a19..ef4760b582 100644 --- a/lib/views/tooltip.js +++ b/lib/views/tooltip.js @@ -92,12 +92,14 @@ export default class Tooltip extends React.Component { } const target = this.getCurrentTarget(props); - this.disposable = props.manager.add(target, options); + if (target) { + this.disposable = props.manager.add(target, options); + } } getCurrentTarget(props) { const target = props.target(); - if (target !== null && target.element !== undefined) { + if (target && target.element !== undefined) { return target.element; } else { return target; From be08c40838a44992dead87fbc46eb185c2e69100 Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 30 Mar 2018 01:34:44 -0700 Subject: [PATCH 0143/5422] PR feedback: Use Tooltip, name action (push-/pull-/fetching), animations This commit refactors the component to not use atom.tooltips but the internal component instead. It displays "Pushing"/"Pulling"/"Fetching" in the status bar tile when such an action is in progress. It refactors the component to extract all possible tile states into a tileState object. It adds animations to the "Pushing" and "Pulling" status bar icons. --- lib/controllers/status-bar-tile-controller.js | 4 + lib/views/push-pull-view.js | 244 ++++++++++-------- styles/status-bar-tile-controller.less | 35 ++- 3 files changed, 179 insertions(+), 104 deletions(-) diff --git a/lib/controllers/status-bar-tile-controller.js b/lib/controllers/status-bar-tile-controller.js index 0e17a02957..2d44dda22e 100644 --- a/lib/controllers/status-bar-tile-controller.js +++ b/lib/controllers/status-bar-tile-controller.js @@ -149,9 +149,13 @@ export default class StatusBarTileController extends React.Component { diff --git a/lib/views/push-pull-view.js b/lib/views/push-pull-view.js index 3be04dc863..05358db086 100644 --- a/lib/views/push-pull-view.js +++ b/lib/views/push-pull-view.js @@ -4,12 +4,14 @@ import cx from 'classnames'; import {RemotePropType, BranchPropType} from '../prop-types'; -function getIconClass(icon, isSyncing = false) { +import Tooltip from './tooltip'; + +function getIconClass(icon, animation) { return cx( 'github-PushPull-icon', 'icon', - isSyncing ? 'icon-sync' : `icon-${icon}`, - {'animate-rotate': isSyncing}, + `icon-${icon}`, + {[`animate-${animation}`]: !!animation}, ); } @@ -18,36 +20,31 @@ export default class PushPullView extends React.Component { currentBranch: BranchPropType.isRequired, currentRemote: RemotePropType.isRequired, isSyncing: PropTypes.bool, + isFetching: PropTypes.bool, + isPulling: PropTypes.bool, + isPushing: PropTypes.bool, behindCount: PropTypes.number, aheadCount: PropTypes.number, push: PropTypes.func.isRequired, pull: PropTypes.func.isRequired, fetch: PropTypes.func.isRequired, originExists: PropTypes.bool, + tooltipManager: PropTypes.object.isRequired, } static defaultProps = { isSyncing: false, + isFetching: false, + isPulling: false, + isPushing: false, behindCount: 0, aheadCount: 0, } - componentDidMount() { - this.setTooltip(); - } - - componentDidUpdate() { - this.tooltip.dispose(); - this.setTooltip(); - } - - setTooltip = () => { - this.tooltip = atom.tooltips.add(this.tileNode, { - title: `
    ${this.tooltipTarget.dataset.tooltip}
    `, - delay: {show: 200, hide: 100}, - html: true, - }); + // unfortunately we need a forceUpdate here to ensure that the + // component has a valid ref to target + this.forceUpdate(); } onClickPush = clickEvent => { @@ -96,102 +93,147 @@ export default class PushPullView extends React.Component { this.props.fetch(); } + getTooltip(message) { + // cache the tileNode for when calls the "target" getter function + const target = this.tileNode; + // only set up a if we have a target ref to point it to + return target && ( + target} + title={`
    ${message}
    `} + showDelay={200} + hideDelay={100} + /> + ); + } + + getTileStates() { + return { + fetching: { + tooltip: 'Fetching from remote', + icon: 'sync', + text: 'Fetching', + iconAnimation: 'rotate', + }, + pulling: { + tooltip: 'Pulling from remote', + icon: 'arrow-down', + text: 'Pulling', + iconAnimation: 'down', + }, + pushing: { + tooltip: 'Pushing to remote', + icon: 'arrow-up', + text: 'Pushing', + iconAnimation: 'up', + }, + ahead: { + onClick: this.onClickPush, + tooltip: 'Click to push
    Cmd-click to force push
    Right-click for more', + icon: 'arrow-up', + text: `Push ${this.props.aheadCount}`, + }, + behind: { + onClick: this.onClickPull, + tooltip: 'Click to pull
    Right-click for more', + icon: 'arrow-down', + text: `Pull ${this.props.behindCount}`, + }, + aheadBehind: { + onClick: this.onClickPushPull, + tooltip: 'Click to pull
    Cmd-click to force push
    Right-click for more', + icon: 'arrow-down', + text: `Pull ${this.props.behindCount}`, + secondaryIcon: 'arrow-up', + secondaryText: `${this.props.aheadCount} `, + }, + published: { + onClick: this.onClickFetch, + tooltip: 'Click to fetch
    Right-click for more', + icon: 'sync', + text: 'Fetch', + }, + unpublished: { + onClick: this.onClickPublish, + tooltip: 'Click to set up a remote tracking branch
    Right-click for more', + icon: 'cloud-upload', + text: 'Publish', + }, + noRemote: { + tooltip: 'There is no remote named "origin"', + icon: 'stop', + text: 'No remote', + }, + detached: { + tooltip: 'Create a branch if you wish to push your work anywhere', + icon: 'stop', + text: 'Not on branch', + }, + }; + } + render() { const isAhead = this.props.aheadCount > 0; const isBehind = this.props.behindCount > 0; const isUnpublished = !this.props.currentRemote.isPresent(); const isDetached = !!this.props.currentBranch.detached; - const isSyncing = this.props.isSyncing; + const isFetching = this.props.isFetching; + const isPulling = this.props.isPulling; + const isPushing = this.props.isPushing; const hasOrigin = !!this.props.originExists; + const tileStates = this.getTileStates(); + + let tileState; + + if (isFetching) { + tileState = tileStates.fetching; + } else if (isPulling) { + tileState = tileStates.pulling; + } else if (isPushing) { + tileState = tileStates.pushing; + } else if (isAhead && !isBehind && !isUnpublished) { + tileState = tileStates.ahead; + } else if (isBehind && !isAhead && !isUnpublished) { + tileState = tileStates.behind; + } else if (isBehind && isAhead && !isUnpublished) { + tileState = tileStates.aheadBehind; + } else if (!isBehind && !isAhead && !isUnpublished && !isDetached) { + tileState = tileStates.published; + } else if (isUnpublished && !isDetached && hasOrigin) { + tileState = tileStates.unpublished; + } else if (isUnpublished && !isDetached && !hasOrigin) { + tileState = tileStates.noRemote; + } else if (isDetached) { + tileState = tileStates.detached; + } + + const Tag = tileState.onClick ? 'a' : 'span'; + return (
    (this.tileNode = node)} className={cx('github-PushPull', 'inline-block', {'github-branch-detached': isDetached})}> - - {isAhead && !isBehind && !isUnpublished && ( - (this.tooltipTarget = node)} - onClick={this.onClickPush} - className="push-pull-target" - data-tooltip="Click to push
    Cmd-click to force push
    Right-click for more"> - - Push {this.props.aheadCount} -
    - )} - - {isBehind && !isAhead && !isUnpublished && ( - (this.tooltipTarget = node)} - onClick={this.onClickPull} - className="push-pull-target" - data-tooltip="Click to pull
    Right-click for more"> - - Pull {this.props.behindCount} -
    - )} - - {isBehind && isAhead && !isUnpublished && !isSyncing && ( - (this.tooltipTarget = node)} - onClick={this.onClickPushPull} - className="push-pull-target" - data-tooltip="Click to push
    Cmd-click to force push
    Right-click for more"> - - - {this.props.aheadCount}{' '} - - - Pull {this.props.behindCount} -
    - )} - - {isBehind && isAhead && !isUnpublished && isSyncing && ( - - - Pull {this.props.behindCount} - - )} - - {!isBehind && !isAhead && !isUnpublished && !isDetached && ( - (this.tooltipTarget = node)} - onClick={this.onClickFetch} - className="push-pull-target" - data-tooltip="Click to fetch
    Right-click for more"> - - Fetch -
    - )} - - {isUnpublished && !isDetached && hasOrigin && ( - (this.tooltipTarget = node)} - onClick={this.onClickPublish} - className="push-pull-target" - data-tooltip="Click to set up a remote tracking branch
    Right-click for more"> - - Publish -
    - )} - - {isUnpublished && !isDetached && !hasOrigin && ( - (this.tooltipTarget = node)} - className="push-pull-target" - data-tooltip={'There is no remote named "origin"'}> - - No remote - - )} - - {isDetached && ( - (this.tooltipTarget = node)} - className="push-pull-target" - data-tooltip={'Create a branch if you wish to push your work anywhere'}> - - Not on branch + {tileState && ( + [ + + {tileState.secondaryText && ( + + + {tileState.secondaryText} )} + + {tileState.text} + , + this.getTooltip(tileState.tooltip), + ] + )}
    ); } diff --git a/styles/status-bar-tile-controller.less b/styles/status-bar-tile-controller.less index abf24ec2be..2cc0e640d4 100644 --- a/styles/status-bar-tile-controller.less +++ b/styles/status-bar-tile-controller.less @@ -33,12 +33,41 @@ cursor: default; } + @keyframes github-StatusBarAnimation-fade { + 0% { opacity: 0; } + 25% { opacity: 1; } + 85% { opacity: 1; } + 100% { opacity: 0; } + } + // Sync animation - .animate-rotate.icon-sync::before { - @keyframes github-StatusBarSync-animation { + .animate-rotate.github-PushPull-icon::before { + @keyframes github-StatusBarAnimation-rotate { 100% { transform: rotate(360deg); } } - animation: github-StatusBarSync-animation 1s linear infinite; + animation: github-StatusBarAnimation-rotate 1s linear infinite; + } + + // Push animation + .animate-up.github-PushPull-icon::before { + @keyframes github-StatusBarAnimation-up { + 0% { transform: translateY(40%); } + 100% { transform: translateY(-20%); } + } + animation: + github-StatusBarAnimation-up 800ms ease-out infinite, + github-StatusBarAnimation-fade 800ms ease-out infinite; + } + + // Pull animation + .animate-down.github-PushPull-icon::before { + @keyframes github-StatusBarAnimation-down { + 0% { transform: translateY(-20%); } + 100% { transform: translateY(40%); } + } + animation: + github-StatusBarAnimation-down 800ms ease-out infinite, + github-StatusBarAnimation-fade 800ms ease-out infinite; } // Merge conflict icon From 9a7d4040ad2b3eba1bdf7a55c220bc7b42197c09 Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 30 Mar 2018 01:35:36 -0700 Subject: [PATCH 0144/5422] Extend tests to ensure status bar tile is showing the right text --- test/controllers/status-bar-tile-controller.test.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/controllers/status-bar-tile-controller.test.js b/test/controllers/status-bar-tile-controller.test.js index 2b5ee8b441..37883e2c72 100644 --- a/test/controllers/status-bar-tile-controller.test.js +++ b/test/controllers/status-bar-tile-controller.test.js @@ -301,6 +301,7 @@ describe('StatusBarTileController', function() { statusBarTile = mount(React.cloneElement(component, {repository})); statusBarTile.find('.push-pull-target').simulate('click'); + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Pushing'); assert.isFalse(repository.fetch.called); assert.isFalse(repository.push.called); assert.isFalse(repository.pull.called); @@ -337,6 +338,7 @@ describe('StatusBarTileController', function() { statusBarTile = mount(React.cloneElement(component, {repository})); statusBarTile.find('.push-pull-target').simulate('click'); + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Fetching'); assert.isFalse(repository.fetch.called); assert.isFalse(repository.push.called); assert.isFalse(repository.pull.called); @@ -374,6 +376,7 @@ describe('StatusBarTileController', function() { statusBarTile = mount(React.cloneElement(component, {repository})); statusBarTile.find('.push-pull-target').simulate('click'); + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Pushing'); assert.isFalse(repository.fetch.called); assert.isFalse(repository.push.called); assert.isFalse(repository.pull.called); @@ -411,6 +414,7 @@ describe('StatusBarTileController', function() { statusBarTile = mount(React.cloneElement(component, {repository})); statusBarTile.find('.push-pull-target').simulate('click'); + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Pulling'); assert.isFalse(repository.fetch.called); assert.isFalse(repository.push.called); assert.isFalse(repository.pull.called); @@ -451,6 +455,7 @@ describe('StatusBarTileController', function() { statusBarTile = mount(React.cloneElement(component, {repository})); statusBarTile.find('.push-pull-target').simulate('click'); + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Pulling'); assert.isFalse(repository.fetch.called); assert.isFalse(repository.push.called); assert.isFalse(repository.pull.called); @@ -480,6 +485,7 @@ describe('StatusBarTileController', function() { it('does nothing when clicked', function() { statusBarTile.find('.push-pull-target').simulate('click'); + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'Not on branch'); assert.isFalse(repository.fetch.called); assert.isFalse(repository.push.called); assert.isFalse(repository.pull.called); @@ -509,6 +515,7 @@ describe('StatusBarTileController', function() { it('does nothing when clicked', function() { statusBarTile.find('.push-pull-target').simulate('click'); + assert.equal(statusBarTile.find('.github-PushPull').text().trim(), 'No remote'); assert.isFalse(repository.fetch.called); assert.isFalse(repository.push.called); assert.isFalse(repository.pull.called); From 5380235c950b3a2fd2400c9e4caa81083d24b706 Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 30 Mar 2018 01:44:46 -0700 Subject: [PATCH 0145/5422] PR feedback: Show correct modifier key dependin on user platform --- lib/views/push-pull-view.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/views/push-pull-view.js b/lib/views/push-pull-view.js index 05358db086..c2399c3902 100644 --- a/lib/views/push-pull-view.js +++ b/lib/views/push-pull-view.js @@ -110,6 +110,7 @@ export default class PushPullView extends React.Component { } getTileStates() { + const modKey = process.platform === 'darwin' ? 'Cmd' : 'Ctrl'; return { fetching: { tooltip: 'Fetching from remote', @@ -131,7 +132,7 @@ export default class PushPullView extends React.Component { }, ahead: { onClick: this.onClickPush, - tooltip: 'Click to push
    Cmd-click to force push
    Right-click for more', + tooltip: `Click to push
    ${modKey}-click to force push
    Right-click for more`, icon: 'arrow-up', text: `Push ${this.props.aheadCount}`, }, @@ -143,7 +144,7 @@ export default class PushPullView extends React.Component { }, aheadBehind: { onClick: this.onClickPushPull, - tooltip: 'Click to pull
    Cmd-click to force push
    Right-click for more', + tooltip: `Click to pull
    ${modKey}-click to force push
    Right-click for more`, icon: 'arrow-down', text: `Pull ${this.props.behindCount}`, secondaryIcon: 'arrow-up', From cdb1227b359dfd9a1a58430fd37d6f1502d409e5 Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Fri, 30 Mar 2018 14:15:37 -0700 Subject: [PATCH 0146/5422] Finish test for adding a co author --- test/controllers/git-tab-controller.test.js | 36 +++++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index b02378028e..75b6afc2e2 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -677,21 +677,37 @@ describe('GitTabController', function() { assert.strictEqual(getLastCommit().message, newMessage); }); - it('successfully removes a co-author', async function() { - // make commit with co-author - const commitMessageWithCoAuthors = dedent` - We did this together! + it.only('successfully removes a co-author', async function() { + // verify that last commit has no co-author + const commitBeforeAmend = getLastCommit(); + assert.deepEqual(commitBeforeAmend.coAuthors, []); + + // add co author + const author = {email: 'foo@bar.com', name: 'foo bar'}; + const commitView = wrapper.find('CommitView').getNode(); + commitView.setState({showCoAuthorInput: true}); + commitView.onSelectedCoAuthorsChanged([author]); + const newMessage = 'Star Wars: A New Message'; + commitView.editor.setText(newMessage); + commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + + // verify that coAuthor was passed + await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: [author]}); - Co-authored-by: Mona Lisa - `; - await repository.git.exec(['commit', '--amend', '-m', commitMessageWithCoAuthors]); + // verify that commit message has coauthor + await assert.async.deepEqual(getLastCommit().coAuthors, [author]); + assert.strictEqual(getLastCommit().message, newMessage); - // assert that last commit has co-author - await assert.async.deepEqual(getLastCommit().coAuthors, [{name: 'Mona Lisa', email: 'mona@lisa.com'}]); + // buh bye co author and commit message + wrapper.find('CommitView').getNode().editor.setText(''); + assert.strictEqual(wrapper.find('CommitView').getNode().editor.getText(), ''); + commitView.onSelectedCoAuthorsChanged([]); + commitView.setState({showCoAuthorInput: false}); + // amend again commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); // verify that NO coAuthor was passed - await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); + await assert.async.deepEqual(repository.commit.args[1][1], {amend: true, coAuthors: []}); // assert that no co-authors are in last commit await assert.async.deepEqual(getLastCommit().coAuthors, []); From d81d6546c6392986a5411f9672f3a02037f85396 Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Fri, 30 Mar 2018 15:13:24 -0700 Subject: [PATCH 0147/5422] Simplify test setup for successfully removing a co-author via amend Co-authored-by: Katrina Uychaco --- test/controllers/git-tab-controller.test.js | 33 +++++++++------------ 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index 75b6afc2e2..e6b27a4b5b 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -678,39 +678,34 @@ describe('GitTabController', function() { }); it.only('successfully removes a co-author', async function() { - // verify that last commit has no co-author - const commitBeforeAmend = getLastCommit(); - assert.deepEqual(commitBeforeAmend.coAuthors, []); + const message = 'We did this together!'; + const author = {email: 'mona@lisa.com', name: 'Mona Lisa'}; + const commitMessageWithCoAuthors = dedent` + ${message} - // add co author - const author = {email: 'foo@bar.com', name: 'foo bar'}; - const commitView = wrapper.find('CommitView').getNode(); - commitView.setState({showCoAuthorInput: true}); - commitView.onSelectedCoAuthorsChanged([author]); - const newMessage = 'Star Wars: A New Message'; - commitView.editor.setText(newMessage); - commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); + Co-authored-by: ${author.name} <${author.email}> + `; - // verify that coAuthor was passed - await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: [author]}); + await repository.git.exec(['commit', '--amend', '-m', commitMessageWithCoAuthors]); + repository.refresh(); // clear the repository cache // verify that commit message has coauthor await assert.async.deepEqual(getLastCommit().coAuthors, [author]); - assert.strictEqual(getLastCommit().message, newMessage); + assert.strictEqual(getLastCommit().message, message); - // buh bye co author and commit message - wrapper.find('CommitView').getNode().editor.setText(''); - assert.strictEqual(wrapper.find('CommitView').getNode().editor.getText(), ''); + // buh bye co author + const commitView = wrapper.find('CommitView').getNode(); + assert.strictEqual(commitView.editor.getText(), ''); commitView.onSelectedCoAuthorsChanged([]); - commitView.setState({showCoAuthorInput: false}); // amend again commandRegistry.dispatch(workspaceElement, 'github:amend-last-commit'); // verify that NO coAuthor was passed - await assert.async.deepEqual(repository.commit.args[1][1], {amend: true, coAuthors: []}); + await assert.async.deepEqual(repository.commit.args[0][1], {amend: true, coAuthors: []}); // assert that no co-authors are in last commit await assert.async.deepEqual(getLastCommit().coAuthors, []); + assert.strictEqual(getLastCommit().message, message); }); }); }); From 5cfac03356ccde0e6142104bb4d1ed312963bd8f Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Fri, 30 Mar 2018 15:16:44 -0700 Subject: [PATCH 0148/5422] Add `includeUnborn` option to GSOS#getCommits This is to fix an issue where we were rending an unborn commit in the RecentCommitsView Co-authored-by: Katrina Uychaco --- lib/git-shell-out-strategy.js | 10 ++++++---- test/git-strategies.test.js | 11 +++++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 36c8c0491d..53a9f23e35 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -560,17 +560,17 @@ export default class GitShellOutStrategy { * Miscellaneous getters */ async getCommit(ref) { - const [commit] = await this.getCommits({max: 1, ref}); + const [commit] = await this.getCommits({max: 1, ref, includeUnborn: true}); return commit; } async getHeadCommit() { - const [headCommit] = await this.getCommits({max: 1, ref: 'HEAD'}); + const [headCommit] = await this.getCommits({max: 1, ref: 'HEAD', includeUnborn: true}); return headCommit; } async getCommits(options = {}) { - const {max, ref} = {max: 1, ref: 'HEAD', ...options}; + const {max, ref, includeUnborn} = {max: 1, ref: 'HEAD', includeUnborn: false, ...options}; // https://git-scm.com/docs/git-log#_pretty_formats // %x00 - null byte @@ -589,7 +589,9 @@ export default class GitShellOutStrategy { } }); - if (output === '') { return [{sha: '', message: '', unbornRef: true}]; } + if (output === '') { + return includeUnborn ? [{sha: '', message: '', unbornRef: true}] : []; + } const fields = output.trim().split('\0'); const commits = []; diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index c209a0cd37..b89f07d14b 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -125,14 +125,21 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; describe('getCommits()', function() { describe('when no commits exist in the repository', function() { - it('returns an array with an unborn ref commit', async function() { + it('returns an array with an unborn ref commit when the include unborn option is passed', async function() { const workingDirPath = await initRepository(); const git = createTestStrategy(workingDirPath); - const commits = await git.getCommits(); + const commits = await git.getCommits({includeUnborn: true}); assert.lengthOf(commits, 1); assert.isTrue(commits[0].unbornRef); }); + it('returns an empty array when the include unborn option is not passed', async function() { + const workingDirPath = await initRepository(); + const git = createTestStrategy(workingDirPath); + + const commits = await git.getCommits(); + assert.lengthOf(commits, 0); + }); }); it('returns all commits if fewer than max commits exist', async function() { From 35702ca80b7594ef46009a0f8d0622fcca062522 Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Fri, 30 Mar 2018 15:49:55 -0700 Subject: [PATCH 0149/5422] Move merge co author trailer tests into git-strategies. Co-authored-by: Katrina Uychaco --- lib/git-shell-out-strategy.js | 7 +- test/controllers/git-tab-controller.test.js | 4 +- test/git-strategies.test.js | 94 +++++++++++++++++++++ test/models/repository.test.js | 82 ------------------ 4 files changed, 100 insertions(+), 87 deletions(-) diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 53a9f23e35..d67b153361 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -427,7 +427,7 @@ export default class GitShellOutStrategy { return this.gpgExec(args, {writeOperation: true}); } - addCoAuthorsToMessage(message, coAuthors) { + async addCoAuthorsToMessage(message, coAuthors = []) { const trailers = coAuthors.map(author => { return { token: 'Co-Authored-By', @@ -436,8 +436,9 @@ export default class GitShellOutStrategy { }); // Ensure that message ends with newline for git-interpret trailers to work - const msg = `${message}\n`.replace(/\s+$/, '\n'); - return this.mergeTrailers(msg, trailers); + const msg = `${message.trim()}\n`; + + return trailers.length ? this.mergeTrailers(msg, trailers) : msg; } /** diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index e6b27a4b5b..446a3c41bd 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -572,7 +572,7 @@ describe('GitTabController', function() { }); }); - describe.only('amend', function() { + describe('amend', function() { let repository, commitMessage, workdirPath, wrapper, getLastCommit; beforeEach(async function() { workdirPath = await cloneRepository('three-files'); @@ -677,7 +677,7 @@ describe('GitTabController', function() { assert.strictEqual(getLastCommit().message, newMessage); }); - it.only('successfully removes a co-author', async function() { + it('successfully removes a co-author', async function() { const message = 'We did this together!'; const author = {email: 'mona@lisa.com', name: 'Mona Lisa'}; const commitMessageWithCoAuthors = dedent` diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index b89f07d14b..85ccb940f4 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -774,6 +774,100 @@ import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; }); }); + describe('addCoAuthorsToMessage', function() { + it('always adds trailing newline', async () => { + const workingDirPath = await cloneRepository('multiple-commits'); + const git = createTestStrategy(workingDirPath); + + assert.equal(await git.addCoAuthorsToMessage('test'), 'test\n'); + }); + + it('appends trailers to a summary-only message', async () => { + const workingDirPath = await cloneRepository('three-files'); + const git = createTestStrategy(workingDirPath); + + const coAuthors = [ + { + name: 'Markus Olsson', + email: 'niik@github.com', + }, + { + name: 'Neha Batra', + email: 'nerdneha@github.com', + }, + ]; + + assert.equal(await git.addCoAuthorsToMessage('foo', coAuthors), + dedent` + foo + + Co-Authored-By: Markus Olsson + Co-Authored-By: Neha Batra + + `, + ); + }); + + // note, this relies on the default git config + it('merges duplicate trailers', async () => { + const workingDirPath = await cloneRepository('three-files'); + const git = createTestStrategy(workingDirPath); + + const coAuthors = [ + { + name: 'Markus Olsson', + email: 'niik@github.com', + }, + { + name: 'Neha Batra', + email: 'nerdneha@github.com', + }, + ]; + + assert.equal( + await git.addCoAuthorsToMessage( + 'foo\n\nCo-Authored-By: Markus Olsson ', + coAuthors, + ), + dedent` + foo + + Co-Authored-By: Markus Olsson + Co-Authored-By: Neha Batra + + `, + ); + }); + + // note, this relies on the default git config + it('fixes up malformed trailers when trailers are given', async () => { + const workingDirPath = await cloneRepository('three-files'); + const git = createTestStrategy(workingDirPath); + + const coAuthors = [ + { + name: 'Neha Batra', + email: 'nerdneha@github.com', + }, + ]; + + assert.equal( + await git.addCoAuthorsToMessage( + // note the lack of space after : + 'foo\n\nCo-Authored-By:Markus Olsson ', + coAuthors, + ), + dedent` + foo + + Co-Authored-By: Markus Olsson + Co-Authored-By: Neha Batra + + `, + ); + }); + }); + // Only needs to be tested on strategies that actually implement gpgExec describe('GPG signing', function() { let git; diff --git a/test/models/repository.test.js b/test/models/repository.test.js index d2d8a57bae..906851063e 100644 --- a/test/models/repository.test.js +++ b/test/models/repository.test.js @@ -508,88 +508,6 @@ describe('Repository', function() { }); }); - describe('addTrailersToCommitMessage', function() { - it('always adds trailing newline', async () => { - const workingDirPath = await cloneRepository('three-files'); - const repo = new Repository(workingDirPath); - await repo.getLoadPromise(); - - assert.equal(await repo.addTrailersToCommitMessage('test'), 'test\n'); - }); - - it('appends trailers to a summary-only message', async () => { - const workingDirPath = await cloneRepository('three-files'); - const repo = new Repository(workingDirPath); - await repo.getLoadPromise(); - - const trailers = [ - {token: 'Co-Authored-By', value: 'Markus Olsson '}, - {token: 'Signed-Off-By', value: 'nerdneha '}, - ]; - - assert.equal(await repo.addTrailersToCommitMessage('foo', trailers), - dedent` - foo - - Co-Authored-By: Markus Olsson - Signed-Off-By: nerdneha - - `, - ); - }); - - // note, this relies on the default git config - it('merges duplicate trailers', async () => { - const workingDirPath = await cloneRepository('three-files'); - const repo = new Repository(workingDirPath); - await repo.getLoadPromise(); - - const trailers = [ - {token: 'Co-Authored-By', value: 'Markus Olsson '}, - {token: 'Signed-Off-By', value: 'nerdneha '}, - ]; - assert.equal( - await repo.addTrailersToCommitMessage( - 'foo\n\nCo-Authored-By: Markus Olsson ', - trailers, - ), - dedent` - foo - - Co-Authored-By: Markus Olsson - Signed-Off-By: nerdneha - - `, - ); - }); - - // note, this relies on the default git config - it('fixes up malformed trailers when trailers are given', async () => { - const workingDirPath = await cloneRepository('three-files'); - const repo = new Repository(workingDirPath); - await repo.getLoadPromise(); - - const trailers = [ - {token: 'Signed-Off-By', value: 'nerdneha '}, - ]; - - assert.equal( - await repo.addTrailersToCommitMessage( - // note the lack of space after : - 'foo\n\nCo-Authored-By:Markus Olsson ', - trailers, - ), - dedent` - foo - - Co-Authored-By: Markus Olsson - Signed-Off-By: nerdneha - - `, - ); - }); - }); - describe('fetch(branchName)', function() { it('brings commits from the remote and updates remote branch, and does not update branch', async function() { const {localRepoPath} = await setUpLocalAndRemoteRepositories({remoteAhead: true}); From 970706d5c21ae0b2fcd7ef1b7b8629500e98850a Mon Sep 17 00:00:00 2001 From: Tilde Ann Thurium Date: Fri, 30 Mar 2018 16:13:02 -0700 Subject: [PATCH 0150/5422] :shirt: --- lib/controllers/git-tab-controller.js | 1 - lib/helpers.js | 1 + lib/views/recent-commits-view.js | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index 4d2eee2ab0..da09db5e26 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -12,7 +12,6 @@ import ObserveModelDecorator from '../decorators/observe-model'; import UserStore from '../models/user-store'; import {nullBranch} from '../models/branch'; import {nullCommit} from '../models/commit'; -import {extractCoAuthorsAndRawCommitMessage} from '../helpers'; const DOMPurify = createDOMPurify(); diff --git a/lib/helpers.js b/lib/helpers.js index 559a90eb35..a4a4aa43cc 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -321,6 +321,7 @@ export function extractCoAuthorsAndRawCommitMessage(commitMessage) { const coAuthors = commitMessage.split(LINE_ENDING_REGEX).reduce((authors, line) => { const match = line.match(CO_AUTHOR_REGEX); if (match) { + // eslint-disable-next-line no-unused-vars const [_, name, email] = match; authors.push({name, email}); } else { diff --git a/lib/views/recent-commits-view.js b/lib/views/recent-commits-view.js index a1f7b3ff06..edc373349a 100644 --- a/lib/views/recent-commits-view.js +++ b/lib/views/recent-commits-view.js @@ -43,7 +43,7 @@ class RecentCommitView extends React.Component { } renderAuthors() { - const coAuthorEmails = this.props.commit.getCoAuthors().map(author => author.email) + const coAuthorEmails = this.props.commit.getCoAuthors().map(author => author.email); const authorEmails = [this.props.commit.getAuthorEmail(), ...coAuthorEmails]; return ( From c0e30fda5dbca121662240c4b0394f7dc9761377 Mon Sep 17 00:00:00 2001 From: Katrina Uychaco Date: Fri, 30 Mar 2018 22:49:02 -0700 Subject: [PATCH 0151/5422] Clarify commit message components - subject and body --- lib/controllers/commit-controller.js | 1 - lib/controllers/git-tab-controller.js | 5 ++-- lib/git-shell-out-strategy.js | 10 ++++---- lib/models/commit.js | 20 +++++++++------- lib/prop-types.js | 2 +- lib/views/recent-commits-view.js | 4 ++-- test/controllers/commit-controller.test.js | 2 +- test/controllers/git-tab-controller.test.js | 16 ++++++------- test/git-strategies.test.js | 22 ++++++++--------- test/models/repository.test.js | 26 ++++++++++----------- test/views/recent-commits-view.test.js | 4 ++-- 11 files changed, 57 insertions(+), 55 deletions(-) diff --git a/lib/controllers/commit-controller.js b/lib/controllers/commit-controller.js index 2996c89e20..6828e3fb94 100644 --- a/lib/controllers/commit-controller.js +++ b/lib/controllers/commit-controller.js @@ -123,7 +123,6 @@ export default class CommitController extends React.Component { @autobind commit(message, coAuthors = [], amend) { - let msg; if (this.isCommitMessageEditorExpanded()) { msg = this.getCommitMessageEditors()[0].getText(); diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index da09db5e26..e0be164267 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -337,9 +337,8 @@ export default class GitTabController extends React.Component { const repo = this.props.repository; const lastCommit = await repo.getLastCommit(); if (lastCommit.isUnbornRef()) { return null; } - const {message, coAuthors} = lastCommit; - repo.setCommitMessage(message); - this.updateSelectedCoAuthors(coAuthors); + repo.setCommitMessage(lastCommit.getFullMessage()); + this.updateSelectedCoAuthors(lastCommit.getCoAuthors()); return repo.undoLastCommit(); } diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index d67b153361..a12522fc99 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -409,8 +409,8 @@ export default class GitShellOutStrategy { // if amending and no new message is passed, use last commit's message if (amend && rawMessage.length === 0) { - const {unbornRef, message} = await this.getHeadCommit(); - msg = unbornRef ? rawMessage : message; + const {unbornRef, messageBody, messageSubject} = await this.getHeadCommit(); + msg = unbornRef ? rawMessage : `${messageSubject}\n\n${messageBody}`.trim(); } else { msg = rawMessage; } @@ -599,14 +599,14 @@ export default class GitShellOutStrategy { for (let i = 0; i < fields.length; i += 5) { const body = fields[i + 4]; - const {message, coAuthors} = extractCoAuthorsAndRawCommitMessage(body); + const {message: messageBody, coAuthors} = extractCoAuthorsAndRawCommitMessage(body); commits.push({ sha: fields[i] && fields[i].trim(), authorEmail: fields[i + 1] && fields[i + 1].trim(), authorDate: parseInt(fields[i + 2], 10), - message: fields[i + 3], - body: message, + messageSubject: fields[i + 3], + messageBody, coAuthors, unbornRef: false, }); diff --git a/lib/models/commit.js b/lib/models/commit.js index 08e5511ca3..6bfa738b8d 100644 --- a/lib/models/commit.js +++ b/lib/models/commit.js @@ -5,13 +5,13 @@ export default class Commit { return new Commit({unbornRef: UNBORN}); } - constructor({sha, authorEmail, coAuthors, authorDate, message, body, unbornRef}) { + constructor({sha, authorEmail, coAuthors, authorDate, messageSubject, messageBody, unbornRef}) { this.sha = sha; this.authorEmail = authorEmail; this.coAuthors = coAuthors || []; this.authorDate = authorDate; - this.message = message; - this.body = body; + this.messageSubject = messageSubject; + this.messageBody = messageBody; this.unbornRef = unbornRef === UNBORN; } @@ -31,12 +31,16 @@ export default class Commit { return this.coAuthors; } - getMessage() { - return this.message; + getMessageSubject() { + return this.messageSubject; } - getBody() { - return this.body; + getMessageBody() { + return this.messageBody; + } + + getFullMessage() { + return `${this.getMessageSubject()}\n\n${this.getMessageBody()}`.trim(); } isUnbornRef() { @@ -53,7 +57,7 @@ export const nullCommit = { return ''; }, - getMessage() { + getMessageSubject() { return ''; }, diff --git a/lib/prop-types.js b/lib/prop-types.js index 0e47a3bd48..56eb105de9 100644 --- a/lib/prop-types.js +++ b/lib/prop-types.js @@ -26,7 +26,7 @@ export const BranchPropType = PropTypes.shape({ export const CommitPropType = PropTypes.shape({ getSha: PropTypes.func.isRequired, - getMessage: PropTypes.func.isRequired, + getMessageSubject: PropTypes.func.isRequired, isUnbornRef: PropTypes.func.isRequired, isPresent: PropTypes.func.isRequired, }); diff --git a/lib/views/recent-commits-view.js b/lib/views/recent-commits-view.js index edc373349a..0458b6fb4a 100644 --- a/lib/views/recent-commits-view.js +++ b/lib/views/recent-commits-view.js @@ -14,7 +14,7 @@ class RecentCommitView extends React.Component { render() { const authorMoment = moment(this.props.commit.getAuthorDate() * 1000); - const fullMessage = (this.props.commit.getMessage() + '\n\n' + this.props.commit.getBody()).trim(); + const fullMessage = this.props.commit.getFullMessage(); return (
  • @@ -22,7 +22,7 @@ class RecentCommitView extends React.Component { - {this.props.commit.getMessage()} + {this.props.commit.getMessageSubject()} {this.props.isMostRecent && ( + + +
  • + ); + } + + @autobind + confirm() { + this.props.onSubmit({name: this.state.name, email: this.state.email}); + } + + @autobind + cancel() { + this.props.onCancel(); + } + + @autobind + onNameChange(e) { + this.setState({name: e.target.value}); + } + + @autobind + onEmailChange(e) { + this.setState({email: e.target.value}); + } + + @autobind + focusFirstInput() { + this.nameInput.focus(); + } +} diff --git a/lib/views/commit-view.js b/lib/views/commit-view.js index 9943a729cf..b327d137d6 100644 --- a/lib/views/commit-view.js +++ b/lib/views/commit-view.js @@ -4,6 +4,7 @@ import {CompositeDisposable} from 'event-kit'; import {autobind} from 'core-decorators'; import cx from 'classnames'; import Select from 'react-select'; +import CoAuthorDialog from './co-author-dialog'; import Tooltip from './tooltip'; import AtomTextEditor from './atom-text-editor'; @@ -56,6 +57,7 @@ export default class CommitView extends React.Component { this.state = { showWorking: false, showCoAuthorInput: false, + showCoAuthorDialog: false, }; this.timeoutHandle = null; @@ -171,6 +173,7 @@ export default class CommitView extends React.Component { /> + {this.renderCoAuthorDialog()} {this.renderCoAuthorInput()}