diff --git a/.gitignore b/.gitignore
index 19e9fe2f3b9d..c77b58876e84 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,3 +41,4 @@ latest.dump
# Ignore storybook static site generation
storybook-static/
+yarn-error.log
diff --git a/app/assets/javascripts/initializers/initEditorResize.js b/app/assets/javascripts/initializers/initEditorResize.js
index 404b2011eb13..395c81ea8df1 100644
--- a/app/assets/javascripts/initializers/initEditorResize.js
+++ b/app/assets/javascripts/initializers/initEditorResize.js
@@ -39,24 +39,13 @@ function initEditorResize() {
function resize() {
textarea.style.height = 'auto';
- textarea.style.height = textarea.scrollHeight - 24 + 'px';
- resizeHighlightArea(textarea.scrollHeight - 24);
- window.scrollTo(scrollLeft, scrollTop);
- }
-
- function resizeHighlightArea(height) {
- function getbyClass(name) {
- return document.getElementsByClassName(name);
- }
- if (
- getbyClass('highlightTextarea-container')[0] &&
- getbyClass('highlightTextarea')[0]
- ) {
- getbyClass('highlightTextarea-container')[0].style.height =
- height - 4 + 'px';
- getbyClass('highlightTextarea-highlighter')[0].style.height =
- height + 'px';
- getbyClass('highlightTextarea')[0].style.height = height + 132 + 'px';
+ textarea.style.height = textarea.scrollHeight - 29 + 'px';
+ var len = textarea.value.length;
+ // If character entered is at the end of the textarea (therefore cursor)
+ if((textarea.selectionEnd > (len - 10)) && len > 50 && document.activeElement === textarea ) {
+ window.scrollTo(scrollLeft, 10000);
+ } else {
+ window.scrollTo(scrollLeft, scrollTop);
}
}
@@ -78,6 +67,6 @@ function initEditorResize() {
observe(textarea, 'paste', delayedResize);
observe(textarea, 'drop', delayedResize);
observe(textarea, 'keydown', delayedResize);
- textarea.focus();
+ // textarea.focus();
resize();
}
diff --git a/app/assets/stylesheets/article_form.scss b/app/assets/stylesheets/article_form.scss
index e1d51ee44059..dd4122b71983 100644
--- a/app/assets/stylesheets/article_form.scss
+++ b/app/assets/stylesheets/article_form.scss
@@ -284,6 +284,9 @@
padding:12px 15px 18px;
font-family: "Lucida Console", Monaco, monospace, sans-serif;
font-size:17px;
+ &::placeholder{
+ color:#8f949c;
+ }
&::after
{
position: absolute;
diff --git a/app/assets/stylesheets/minimal.scss b/app/assets/stylesheets/minimal.scss
index 648fbc8e0485..24c63a9ed44c 100644
--- a/app/assets/stylesheets/minimal.scss
+++ b/app/assets/stylesheets/minimal.scss
@@ -25,6 +25,7 @@
@import 'delete-confirm';
@import 'preact/onboarding-modal';
@import 'preact/sidebar-widget';
+@import 'preact/article-form';
@import 'tag-edit';
@import 'sticky-nav';
@import 'sidebar-data';
diff --git a/app/assets/stylesheets/preact/article-form.scss b/app/assets/stylesheets/preact/article-form.scss
new file mode 100644
index 000000000000..80cc95011dc1
--- /dev/null
+++ b/app/assets/stylesheets/preact/article-form.scss
@@ -0,0 +1,286 @@
+@import 'variables';
+
+.articleformcontainer {
+ padding-top: calc(98px + 0.2vw);
+ padding-bottom: calc(94px + 2vw);
+ background: white;
+ background: $light-gray;
+}
+
+.articleform {
+ margin: 0 auto;
+ width: calc(95% - 40px);
+ max-width: 880px;
+ padding: 0px 20px;
+ box-shadow: $bold-shadow;
+ border: 1px solid $dark-gray;
+ border-radius: 3px;
+ background: white;
+ position:relative;
+ .container{
+ border: 1px solid $light-medium-gray;
+ }
+ .help-guide-title{
+ padding-top: 20px;
+ h1{
+ background: $yellow;
+ }
+ }
+}
+
+.articleform__form {
+ display: flex;
+ flex-direction: column;
+}
+
+.articleform__errors{
+ background: $red;
+ color: white;
+ font-weight: bold;
+ margin-top: 12px;
+ border-radius: 3px;
+ padding: 15px;
+}
+
+.articleform__orgsettings{
+ background: $black;
+ color: white;
+ text-align: center;
+ padding: 15px;
+ border-radius: 3px;
+ margin-top: 12px;
+ margin-bottom: 3px;
+ box-shadow: $bold-shadow;
+ font-size:24px;
+ font-weight: bold;
+ cursor: pointer;
+ user-select: none;
+ button {
+ background: $purple;
+ border-radius: 3px;
+ border: 0px;
+ font-size: 1em;
+ font-family: $helvetica-condensed;
+ width: 80px;
+ margin-left: 10px;
+ }
+}
+
+.articleform__mainimage{
+ padding: 10px 0px;
+ text-align: center;
+ width: 100%;
+ img {
+ width:100%;
+ height: auto;
+ display: block;
+ cursor: pointer;
+ &:hover{
+ opacity:0.8;
+ }
+ }
+}
+
+.articleform__title {
+ height: 50px;
+ font-size: 40px;
+ word-break: break-word;
+ border: 0;
+ padding: 20px 0px 15px;
+ font-weight: bold;
+}
+.articleform__detailfields{
+ display: flex;
+ flex-direction: row;
+ position: relative;
+}
+.articleform__tagswrapper{
+ display: inline-block;
+ flex-grow: 1;
+ float: left;
+}
+
+.articleform__tags {
+ height: 19px;
+ width: 96%;
+ resize: none;
+ border: 0;
+ font-size: 16px;
+ font-family: $monospace;
+ font-weight: bold;
+ border-radius: 3px;
+ padding: 8px 8px 7px;
+ border: 2px solid $black;
+}
+
+.articleform__tagsoptions{
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 30px;
+ background: white;
+ border: 1px solid $medium-gray;
+ box-shadow: $bold-shadow;
+ font-family: $monospace;
+ z-index:20;
+}
+.articleform__tagoptionrow{
+ padding: 10px;
+ cursor:pointer;
+ &:hover{
+ background: lighten($green, 20%);
+ }
+}
+.articleform__tagoptionrow--active{
+ background: $green;
+}
+
+.articleform__imageButton{
+ width: 96px;
+ color: $black;
+ background: white;
+ border-radius: 3px;
+ border: 2px solid $black;
+ padding: 3px;
+ font-family: $helvetica-condensed;
+ font-size: 16px;
+ height: 38px;
+ &:hover{
+ background: lighten($green, 24%);
+ }
+ img{
+ width: 21px;
+ height: 21px;
+ vertical-align: -4px;
+ display: inline;
+ }
+}
+
+.articleform__description {
+ height: 30px;
+}
+
+.articleform__body {
+ min-height: calc(90vh - 280px);
+ // height: calc(90vh - 240px);
+ border: 0;
+ font-size: 18px;
+ resize: none;
+ padding: 20px 8px;
+ font-family: $monospace;
+}
+
+.articleform__buttons{
+ padding: 20px 0px 20px;
+ text-align: center;
+ position:fixed;
+ bottom: 0px;
+ left: 0;
+ right: 0;
+ background: white;
+ z-index: 20;
+ border-top: 1px solid $dark-gray;
+ button, a{
+ cursor:pointer;
+ background: white;
+ border: 3px solid $black;
+ font-family: $helvetica-condensed;
+ font-size:16px;
+ border-radius: 3px;
+ padding: 6px 0px;
+ display: inline-block;
+ width: 40%;
+ text-align: center;
+ color: $black;
+ margin: 5px calc(6px + 1vw);
+ &:hover{
+ background: lighten($green, 24%);
+ }
+ &.active{
+ background: $green;
+ }
+ @media screen and ( min-width: 600px ){
+ width: 130px;
+ }
+ }
+}
+
+.articleform__imagemanagement{
+ position: absolute;
+ top: 0px;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: $dark-gray;
+ color: white;
+ padding: 5%;
+ box-shadow: $bold-shadow;
+ text-align: center;
+ border-radius: 3px;
+ h2{
+ color: $green;
+ font-size: 3em;
+ font-family: $helvetica-condensed;
+ }
+ input[type="file"]{
+ width: 90%;
+ background: $black;
+ padding: 20px;
+ border-radius: 3px;
+ margin: 20px auto;
+ display: block;
+ cursor:pointer;
+ }
+ input[type="text"]{
+ width: 90%;
+ padding: 10px 20px;
+ border-radius: 3px;
+ margin: 20px auto;
+ display: block;
+ border: 0px;
+ font-size: 20px;
+ }
+ .articleform__exitbutton{
+ position:absolute;
+ color: white;
+ font-size: 37px;
+ font-weight: bold;
+ left: 1%;
+ top: 0%;
+ background: transparent;
+ border: 0px;
+ cursor:pointer;
+ }
+ button{
+ background: $red;
+ color: white;
+ border: 0px;
+ padding: 4px 10px;
+ font-size: 14px;
+ border-radius: 3px;
+ font-weight: bold;
+ }
+ img{
+ display: block;
+ margin: 10px auto;
+ max-width: 80%;
+ }
+}
+
+.articleform__notice{
+ position: fixed;
+ bottom:0;
+ left:0;
+ right:0;
+ padding: 25px 0px;
+ color: white;
+ background: $green;
+ text-align: center;
+ font-size:2em;
+ font-weight: bold;
+ z-index:50;
+ &.articleform__notice--draft{
+ background: $yellow;
+ color: $black;
+ }
+}
\ No newline at end of file
diff --git a/app/controllers/api/v0/articles_controller.rb b/app/controllers/api/v0/articles_controller.rb
index 56fc6aa2a630..273bd20c43e0 100644
--- a/app/controllers/api/v0/articles_controller.rb
+++ b/app/controllers/api/v0/articles_controller.rb
@@ -3,8 +3,8 @@ module V0
class ArticlesController < ApiController
before_action :set_cache_control_headers, only: [:index]
caches_action :show,
- :cache_path => Proc.new { |c| c.params.permit! },
- :expires_in => 5.minutes
+ cache_path: Proc.new { |c| c.params.permit! },
+ expires_in: 5.minutes
respond_to :json
before_action :cors_preflight_check
@@ -16,19 +16,19 @@ def index
end
def show
- if params[:id] == "by_path"
- @article = Article.includes(:user).find_by_path(params[:url])&.decorate
- else
- @article = Article.includes(:user).find(params[:id])&.decorate
- end
+ @article = if params[:id] == "by_path"
+ Article.includes(:user).find_by_path(params[:url])&.decorate
+ else
+ Article.includes(:user).find(params[:id])&.decorate
+ end
not_found unless @article&.published
end
def onboarding
tag_list = if params[:tag_list].present?
- params[:tag_list].split(",")
- else
- ["career", "discuss", "productivity"]
+ params[:tag_list].split(",")
+ else
+ ["career", "discuss", "productivity"]
end
@articles = []
4.times do
@@ -42,6 +42,32 @@ def onboarding
end
@articles = @articles.uniq.sample(6)
end
+
+ def create
+ @article = ArticleCreationService.new(current_user, article_params, {}).create!
+ render json: if @article.persisted?
+ @article.to_json(only: [:id], methods: [:current_state_path])
+ else
+ @article.errors.to_json
+ end
+ end
+
+ def update
+ @article = Article.find(params[:id])
+ render json: if @article.update(article_params)
+ @article.to_json(only: [:id], methods: [:current_state_path])
+ else
+ @article.errors.to_json
+ end
+ end
+
+ def article_params
+ params["article"].transform_keys!(&:underscore)
+ params.require(:article).permit(
+ :title, :body_markdown, :user_id, :main_image, :published, :description,
+ :tag_list
+ )
+ end
end
end
end
diff --git a/app/controllers/articles_controller.rb b/app/controllers/articles_controller.rb
index 630f3b27214c..f2336df80e42 100644
--- a/app/controllers/articles_controller.rb
+++ b/app/controllers/articles_controller.rb
@@ -47,10 +47,7 @@ def new
processed_html: "")
else
skip_authorization
- Article.new(
- body_markdown: "---\ntitle: \npublished: false\ndescription: \ntags: \n---\n\n",
- processed_html: "",
- )
+ Article.new
end
end
diff --git a/app/controllers/image_uploads_controller.rb b/app/controllers/image_uploads_controller.rb
index 874c398c5345..b8c69035cda7 100644
--- a/app/controllers/image_uploads_controller.rb
+++ b/app/controllers/image_uploads_controller.rb
@@ -6,7 +6,11 @@ def create
authorize :image_upload
uploader = ArticleImageUploader.new
uploader.store!(params[:image])
- link = uploader.url
+ link = if params[:wrap_cloudinary]
+ ApplicationController.helpers.cloud_cover_url(uploader.url)
+ else
+ uploader.url
+ end
respond_to do |format|
format.json { render json: { link: link }, status: 200 }
end
diff --git a/app/javascript/article-form/actions.js b/app/javascript/article-form/actions.js
new file mode 100644
index 000000000000..788638506af3
--- /dev/null
+++ b/app/javascript/article-form/actions.js
@@ -0,0 +1,70 @@
+export function previewArticle(payload, successCb, failureCb) {
+ fetch('/articles/preview', {
+ method: 'POST',
+ headers: {
+ Accept: 'application/json',
+ 'X-CSRF-Token': window.csrfToken,
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ article_body: payload,
+ }),
+ credentials: 'same-origin',
+ })
+ .then(response => response.json())
+ .then(successCb)
+ .catch(failureCb);
+}
+
+export function getArticle() {}
+
+export function submitArticle(payload, errorCb, failureCb) {
+ const method = payload.id ? 'PUT' : 'POST'
+ const url = payload.id ? '/api/articles/'+ payload.id : '/api/articles'
+ fetch(url, {
+ method: method,
+ headers: {
+ Accept: 'application/json',
+ 'X-CSRF-Token': window.csrfToken,
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ article: payload,
+ }),
+ credentials: 'same-origin',
+ })
+ .then(response => response.json())
+ .then(response => {
+ if (response.current_state_path) {
+ window.location.replace(response.current_state_path);
+ } else {
+ errorCb(response)
+ }
+ })
+ .catch(failureCb);
+}
+
+export function generateMainImage(payload, successCb, failureCb) {
+ fetch('/image_uploads', {
+ method: 'POST',
+ headers: {
+ 'X-CSRF-Token': csrfToken,
+ },
+ body: generateUploadFormdata(payload),
+ credentials: 'same-origin',
+ })
+ .then(response => response.json())
+ .then(successCb)
+ .catch(failureCb);
+}
+
+function generateUploadFormdata(payload) {
+ var token = window.csrfToken;
+ var formData = new FormData();
+ formData.append('authenticity_token', token);
+ formData.append('image', payload['image'][0]);
+ if (payload['wrap_cloudinary']) {
+ formData.append('wrap_cloudinary', 'true');
+ }
+ return formData;
+}
\ No newline at end of file
diff --git a/app/javascript/article-form/articleForm.jsx b/app/javascript/article-form/articleForm.jsx
new file mode 100644
index 000000000000..0ab5fcd75a62
--- /dev/null
+++ b/app/javascript/article-form/articleForm.jsx
@@ -0,0 +1,343 @@
+import 'preact/devtools';
+import { h, Component } from 'preact';
+import linkState from 'linkstate';
+import { submitArticle, previewArticle } from './actions';
+import BodyMarkdown from './elements/bodyMarkdown';
+import BodyPreview from './elements/bodyPreview';
+import Description from './elements/description';
+import PublishToggle from './elements/publishToggle';
+import Notice from './elements/notice';
+import Tags from './elements/tags';
+import Title from './elements/title';
+import MainImage from './elements/mainImage';
+import ImageManagement from './elements/imageManagement';
+import OrgSettings from './elements/orgSettings';
+import Errors from './elements/errors';
+import ImageUploadIcon from 'images/image-upload.svg';
+import CodeMirror from 'codemirror';
+import 'codemirror/mode/markdown/markdown';
+
+
+
+const algoliaId = document.querySelector("meta[name='algolia-public-id']").content
+const algoliaKey = document.querySelector("meta[name='algolia-public-key']").content
+const env = document.querySelector("meta[name='environment']").content
+const client = algoliasearch(algoliaId, algoliaKey);
+const index = client.initIndex('Tag_'+env);
+
+export default class ArticleForm extends Component {
+ constructor(props) {
+ super(props);
+ const article = JSON.parse(this.props.article);
+ const organization = this.props.organization ? JSON.parse(this.props.organization) : null;
+ this.state = {
+ id: article.id || null,
+ title: article.title || '',
+ tagList: article.cached_tag_list || '',
+ description: '',
+ bodyMarkdown: article.body_markdown || '',
+ published: article.published || false,
+ tagOptions: [],
+ selectedTags: [],
+ tagInputListIndex: -1,
+ previewShowing: false,
+ helpShowing: false,
+ previewHTML: '',
+ helpHTML: document.getElementById('editor-help-guide').innerHTML,
+ submitting: false,
+ editing: article.id != null,
+ imageManagementShowing: false,
+ mainImageUrl: article.main_image || null,
+ organization: organization,
+ postUnderOrg: false,
+ errors: null,
+ };
+ }
+
+ componentDidMount() {
+ initEditorResize();
+ console.log('codemirror-ify')
+ const editor = document.getElementById("article_body_markdown");
+ const myCodeMirror = CodeMirror(editor, {
+ mode: "markdown",
+ theme: "material",
+ highlightFormatting: true,
+ });
+ myCodeMirror.setSize("100%", "100%");
+ }
+
+ handleTagKeyUp = e => {
+ const component = this;
+ const inputArray = e.target.value.split(',')
+ component.setState({
+ tagList: e.target.value,
+ })
+ const query = inputArray[inputArray.length -1].replace(/ /g,'')
+ if (query === '' && e.target.value != '') {
+ component.setState({
+ tagOptions: [],
+ })
+ return
+ } else if (e.target.value === '') {
+ component.setState({
+ tagOptions: [],
+ tagList: '',
+ selectedTags: []
+ })
+ return
+ }
+ index.search(query, {
+ hitsPerPage: 10,
+ filters: 'supported:true',
+ })
+ .then(function(content) {
+ component.setState({
+ tagOptions: content.hits.filter(hit => !component.state.selectedTags.includes(hit.name)),
+ })
+ });
+ }
+
+ handleTagKeyDown = e => {
+ const component = this;
+ let keyCode = e.keyCode;
+ if (component.state.selectedTags.length === 4 && e.keyCode === 188) {
+ e.preventDefault()
+ return
+ }
+ if((e.keyCode === 40 || e.keyCode === 9) &&
+ (component.state.tagInputListIndex < component.state.tagOptions.length -1) &&
+ (component.state.tagList != '')) {
+ // down key or tab key
+ e.preventDefault()
+ this.setState({tagInputListIndex: component.state.tagInputListIndex + 1})
+ } else if (e.keyCode === 38 && component.state.tagInputListIndex > -1) {
+ // up key
+ e.preventDefault()
+ this.setState({tagInputListIndex: component.state.tagInputListIndex - 1})
+ } else if (e.keyCode === 13 && component.state.tagInputListIndex > -1 ) {
+ // return key
+ e.preventDefault();
+ const newInput = component.state.selectedTags + component.state.tagOptions[component.state.tagInputListIndex].name + ',';
+ document.getElementById('tag-input').value = newInput;
+ component.setState({
+ tagOptions: [],
+ tagList: newInput,
+ tagInputListIndex: -1,
+ selectedTags: newInput.split(',')
+ })
+ setTimeout(function(){
+ document.getElementById('tag-input').focus();
+ }, 10)
+ } else if (e.keyCode === 188 && component.state.tagInputListIndex === -1){
+ // comma key
+ e.preventDefault();
+ const newInput = component.state.tagList + ',';
+ document.getElementById('tag-input').value = newInput;
+ component.setState({
+ tagOptions: [],
+ tagList: newInput,
+ tagInputListIndex: -1,
+ selectedTags: newInput.split(',')
+ })
+ } else if (e.keyCode === 8 ) {
+ // Delete key
+ if (component.state.tagList[component.state.tagList.length -1] === ',') {
+ let selectedTags = component.state.selectedTags
+ component.setState({
+ tagInputListIndex: -1,
+ selectedTags: selectedTags.slice(0, selectedTags.length -2)
+ })
+ }
+ } else if ((e.keyCode < 65 || e.keyCode > 90) &&
+ e.keyCode != 188 && e.keyCode != 8 &&
+ e.keyCode != 37 && e.keyCode != 39 &&
+ e.keyCode != 9) {
+ // not letter or comma or delete
+ e.preventDefault()
+ }
+ }
+
+ handleTagClick = e => {
+ document.getElementById('tag-input').focus();
+ const newInput = this.state.selectedTags + e.target.dataset.content + ',';
+ document.getElementById('tag-input').value = newInput;
+ console.log('CLICK')
+ this.setState({
+ tagOptions: [],
+ tagList: newInput,
+ tagInputListIndex: -1,
+ selectedTags: newInput.split(',')
+ })
+ }
+
+ handleFocusChange = e => {
+ const component = this;
+ setTimeout(function(){
+ if (document.activeElement.id === 'tag-input'){ return }
+ component.forceUpdate();
+ }, 100)
+ }
+
+ toggleHelp = e => {
+ e.preventDefault();
+ window.scrollTo(0, 0);
+ this.setState({
+ helpShowing: !this.state.helpShowing,
+ previewShowing: false,
+ })
+ }
+
+ fetchPreview = e => {
+ e.preventDefault();
+ if (this.state.previewShowing) {
+ this.setState({
+ previewShowing: false,
+ helpShowing: false,
+ })
+ } else {
+ previewArticle(this.state.bodyMarkdown, this.showPreview, this.failedPreview)
+ }
+ }
+
+ toggleImageManagement = e => {
+ e.preventDefault();
+ this.setState({imageManagementShowing: !this.state.imageManagementShowing})
+ }
+
+ showPreview = response => {
+ this.setState({
+ previewShowing: true,
+ helpShowing: false,
+ previewHTML: response.processed_html
+ })
+ }
+
+ toggleOrgPosting = e => {
+ e.preventDefault();
+ this.setState({postUnderOrg: !this.state.postUnderOrg})
+ }
+
+ failedPreview = response => {
+ console.log(response)
+ }
+
+ handleMainImageUrlChange = payload => {
+ this.setState({mainImageUrl: payload.link, imageManagementShowing: false})
+ }
+
+ onPublish = e => {
+ e.preventDefault();
+ this.setState({submitting: true, published: true})
+ let state = this.state;
+ state['published'] = true;
+ submitArticle(state, this.handleArticleError);
+ };
+
+ onSaveDraft = e => {
+ e.preventDefault();
+ this.setState({submitting: true, published: false})
+ let state = this.state;
+ state['published'] = false;
+ submitArticle(state, this.handleArticleError);
+ }
+
+ handleArticleError = response => {
+ window.scrollTo(0, 0);
+ this.setState({
+ errors: response,
+ submitting: false,
+ })
+ }
+
+ render() {
+ // cover image url should asking for url OR providing option to upload an image
+ const { title,
+ tagList,
+ description,
+ bodyMarkdown,
+ published,
+ tagOptions,
+ tagInputListIndex,
+ previewShowing,
+ helpShowing,
+ previewHTML,
+ helpHTML,
+ submitting,
+ imageManagementShowing,
+ organization,
+ postUnderOrg,
+ mainImageUrl,
+ errors,
+ } = this.state;
+ //
+ let tagOptionsHTML = ''
+ const component = this;
+ const tagOptionRows = tagOptions.map((tag, index) => {
+ return
+ {tag.name}
+
+ })
+ if (tagOptions.length > 0 && document.activeElement.id === 'tag-input') {
+ tagOptionsHTML =
+ {tagOptionRows}
+
+ }
+
+ let bodyArea = ''
+ if (previewShowing) {
+ bodyArea =
+ } else if (helpShowing) {
+ bodyArea =
+ } else {
+ bodyArea = ;
+ }
+
+ const notice = submitting ? : '';
+ const imageArea = mainImageUrl ? : ''
+ const imageManagement = imageManagementShowing ? : '';
+ const orgArea = organization ? : '';
+ const errorsArea = errors ? : '';
+ return (
+
+ );
+ }
+}
diff --git a/app/javascript/article-form/elements/bodyMarkdown.jsx b/app/javascript/article-form/elements/bodyMarkdown.jsx
new file mode 100644
index 000000000000..d0b0c8128653
--- /dev/null
+++ b/app/javascript/article-form/elements/bodyMarkdown.jsx
@@ -0,0 +1,21 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+import Textarea from 'preact-textarea-autosize';
+
+const BodyMarkdown = ({ onChange, onKeyUp, defaultValue }) => (
+
+);
+
+BodyMarkdown.propTypes = {
+ onChange: PropTypes.func.isRequired,
+ defaultValue: PropTypes.string.isRequired,
+};
+
+export default BodyMarkdown;
diff --git a/app/javascript/article-form/elements/bodyPreview.jsx b/app/javascript/article-form/elements/bodyPreview.jsx
new file mode 100644
index 000000000000..9f0c9b7ec058
--- /dev/null
+++ b/app/javascript/article-form/elements/bodyPreview.jsx
@@ -0,0 +1,20 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+
+const BodyPreview = ({ previewHTML }) => (
+
+);
+
+BodyPreview.propTypes = {
+ previewHTML: PropTypes.string.isRequired,
+};
+
+export default BodyPreview;
+
+
+
+
+
diff --git a/app/javascript/article-form/elements/description.jsx b/app/javascript/article-form/elements/description.jsx
new file mode 100644
index 000000000000..087375c1088e
--- /dev/null
+++ b/app/javascript/article-form/elements/description.jsx
@@ -0,0 +1,20 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+
+const Description = ({ onChange, defaultValue }) => (
+
+);
+
+Description.propTypes = {
+ onChange: PropTypes.func.isRequired,
+ defaultValue: PropTypes.string.isRequired,
+};
+
+export default Description;
diff --git a/app/javascript/article-form/elements/errors.jsx b/app/javascript/article-form/elements/errors.jsx
new file mode 100644
index 000000000000..746631760a20
--- /dev/null
+++ b/app/javascript/article-form/elements/errors.jsx
@@ -0,0 +1,18 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+
+const Errors = ({ errorsList }) => (
+
+
😱 Heads up:
+
{Object.keys(errorsList).map((key) => {
+ return - {key}: {errorsList[key]}
+ })}
+
+);
+
+Errors.propTypes = {
+ onChange: PropTypes.func.isRequired,
+ defaultValue: PropTypes.string.isRequired,
+};
+
+export default Errors;
diff --git a/app/javascript/article-form/elements/imageManagement.jsx b/app/javascript/article-form/elements/imageManagement.jsx
new file mode 100644
index 000000000000..e5c0bda640f6
--- /dev/null
+++ b/app/javascript/article-form/elements/imageManagement.jsx
@@ -0,0 +1,84 @@
+import { h, Component } from 'preact';
+import PropTypes from 'prop-types';
+import { generateMainImage } from '../actions'
+
+
+
+// const ImageManagement = ({ onExit }) => (
+export default class ImageManagement extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {insertionImageUrl: null}
+ }
+ handleMainImageUpload = e => {
+ e.preventDefault();
+ const payload = {image: e.target.files, wrap_cloudinary: true,}
+ generateMainImage(payload, this.props.onMainImageUrlChange, null)
+ // this.props.onMainImageUrlChange(e.target.value)
+ }
+
+ handleInsertionImageUpload = e => {
+ const payload = {image: e.target.files,}
+ generateMainImage(payload, this.handleInertImageUploadSuccess, null)
+ }
+
+ handleInertImageUploadSuccess = response => {
+ this.setState({
+ insertionImageUrl: response.link,
+ })
+ }
+
+ triggerMainImageRemoval = e => {
+ e.preventDefault();
+ this.props.onMainImageUrlChange({link: null})
+ }
+ render() {
+ const { onExit, mainImageUrl } = this.props;
+ const { insertionImageUrl } = this.state;
+ // mainImageUrl
+ let mainImageArea;
+ if (mainImageUrl) {
+ mainImageArea =
+
+
+
+ } else {
+ mainImageArea =
+
+
+ }
+ let inertionImageArea;
+ if (insertionImageUrl) {
+ inertionImageArea =
+
Markdown Image:
+
+ Direct URL:
+
+
+ } else {
+ inertionImageArea =
+
+
+ }
+ return
+
+
Cover Image
+ {mainImageArea}
+ Body Images
+ {inertionImageArea}
+
+
+ }
+};
+
+ImageManagement.propTypes = {
+ onExit: PropTypes.func.isRequired,
+};
+
+// export default ImageManagement;
diff --git a/app/javascript/article-form/elements/mainImage.jsx b/app/javascript/article-form/elements/mainImage.jsx
new file mode 100644
index 000000000000..8d2125c577f6
--- /dev/null
+++ b/app/javascript/article-form/elements/mainImage.jsx
@@ -0,0 +1,14 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+
+const MainImage = ({ mainImage, onEdit }) => (
+
+
+
+);
+
+MainImage.propTypes = {
+ mainImage: PropTypes.string.isRequired,
+};
+
+export default MainImage;
diff --git a/app/javascript/article-form/elements/notice.jsx b/app/javascript/article-form/elements/notice.jsx
new file mode 100644
index 000000000000..8036b310dca9
--- /dev/null
+++ b/app/javascript/article-form/elements/notice.jsx
@@ -0,0 +1,12 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+
+const Notice = ({ published }) => (
+ {published ? "Publishing..." : "Saving Draft..."}
+);
+
+Notice.propTypes = {
+ published: PropTypes.bool.isRequired,
+};
+
+export default Notice;
diff --git a/app/javascript/article-form/elements/orgSettings.jsx b/app/javascript/article-form/elements/orgSettings.jsx
new file mode 100644
index 000000000000..cf279cb272f2
--- /dev/null
+++ b/app/javascript/article-form/elements/orgSettings.jsx
@@ -0,0 +1,19 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+
+const OrgSettings = ({ organization, postUnderOrg, onToggle }) => (
+
+ Post From {organization.name}
+
+);
+
+OrgSettings.propTypes = {
+ onChange: PropTypes.func.isRequired,
+ defaultValue: PropTypes.string.isRequired,
+};
+
+export default OrgSettings;
diff --git a/app/javascript/article-form/elements/publishToggle.jsx b/app/javascript/article-form/elements/publishToggle.jsx
new file mode 100644
index 000000000000..46fbc13a94a2
--- /dev/null
+++ b/app/javascript/article-form/elements/publishToggle.jsx
@@ -0,0 +1,26 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+
+const PublishToggle = ({ previewShowing, onPreview, onSaveDraft, onPublish, onHelp, published, helpShowing }) => (
+
+
+
+
+
+
+
+);
+
+PublishToggle.propTypes = {
+ defaultValue: PropTypes.string.isRequired,
+};
+
+export default PublishToggle;
diff --git a/app/javascript/article-form/elements/tags.jsx b/app/javascript/article-form/elements/tags.jsx
new file mode 100644
index 000000000000..af7bb7bc4ef0
--- /dev/null
+++ b/app/javascript/article-form/elements/tags.jsx
@@ -0,0 +1,27 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+
+const Tags = ({ onKeyUp, onKeyDown, defaultValue, options, onFocusChange }) => (
+
+
+ {options}
+
+);
+
+Tags.propTypes = {
+ onChange: PropTypes.func.isRequired,
+ defaultValue: PropTypes.string.isRequired,
+ options: PropTypes.array.isRequired
+};
+
+export default Tags;
diff --git a/app/javascript/article-form/elements/title.jsx b/app/javascript/article-form/elements/title.jsx
new file mode 100644
index 000000000000..07cb9a2d29a2
--- /dev/null
+++ b/app/javascript/article-form/elements/title.jsx
@@ -0,0 +1,21 @@
+import { h } from 'preact';
+import PropTypes from 'prop-types';
+
+const Title = ({ onChange, defaultValue }) => (
+
+);
+
+Title.propTypes = {
+ onChange: PropTypes.func.isRequired,
+ defaultValue: PropTypes.string.isRequired,
+};
+
+export default Title;
diff --git a/app/javascript/packs/articleForm.jsx b/app/javascript/packs/articleForm.jsx
new file mode 100644
index 000000000000..c3c3fd06eaaf
--- /dev/null
+++ b/app/javascript/packs/articleForm.jsx
@@ -0,0 +1,29 @@
+import { h, render } from 'preact';
+import { getUserDataAndCsrfToken } from '../chat/util';
+import ArticleForm from '../article-form/articleForm';
+
+HTMLDocument.prototype.ready = new Promise(resolve => {
+ if (document.readyState !== 'loading') {
+ return resolve();
+ }
+ document.addEventListener('DOMContentLoaded', () => resolve());
+ return null;
+});
+
+document.ready.then(
+ getUserDataAndCsrfToken().then(currentUser => {
+ window.currentUser = currentUser;
+ const root = document.getElementById('article-form');
+ window.csrfToken = document.querySelector(
+ "meta[name='csrf-token']",
+ ).content;
+ render(
+ ,
+ root,
+ root.firstElementChild
+ );
+ }),
+);
diff --git a/app/javascript/packs/pack.js b/app/javascript/packs/pack.js
index 81f94d68746f..08cd5e284342 100644
--- a/app/javascript/packs/pack.js
+++ b/app/javascript/packs/pack.js
@@ -8,6 +8,7 @@ HTMLDocument.prototype.ready = new Promise(resolve => {
return resolve();
}
document.addEventListener('DOMContentLoaded', () => resolve());
+ return null;
});
function shouldShowOnboarding() {
diff --git a/app/models/article.rb b/app/models/article.rb
index 5080b2a9c7db..bb7ad04476d8 100644
--- a/app/models/article.rb
+++ b/app/models/article.rb
@@ -306,6 +306,12 @@ def evaluate_markdown
end
end
+ def has_frontmatter?
+ fixed_body_markdown = MarkdownFixer.fix_all(body_markdown)
+ parsed = FrontMatterParser::Parser.new(:md).call(fixed_body_markdown)
+ parsed.front_matter["title"]
+ end
+
def class_name
self.class.name
end
diff --git a/app/models/tag.rb b/app/models/tag.rb
index cecc449c05c4..3a71cdfaf48d 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -1,4 +1,5 @@
class Tag < ActsAsTaggableOn::Tag
+ include AlgoliaSearch
acts_as_followable
resourcify
@@ -16,6 +17,12 @@ class Tag < ActsAsTaggableOn::Tag
before_save :calculate_hotness_score
after_save :bust_cache
+ algoliasearch per_environment: true do
+ attribute :name, :bg_color_hex, :text_color_hex, :hotness_score, :supported
+ attributesForFaceting [:supported]
+ customRanking ["desc(hotness_score)"]
+ end
+
def submission_template_customized(param_0 = nil)
submission_template.gsub("PARAM_0", param_0)
end
diff --git a/app/views/articles/_v2_form.html.erb b/app/views/articles/_v2_form.html.erb
new file mode 100644
index 000000000000..89349d756f0c
--- /dev/null
+++ b/app/views/articles/_v2_form.html.erb
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+ <% else %>
+
+ <% end %>
+
+ <%= render "pages/editor_guide_text" %>
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/articles/edit.html.erb b/app/views/articles/edit.html.erb
index 7b3ab322cf3c..ac3004246f1f 100644
--- a/app/views/articles/edit.html.erb
+++ b/app/views/articles/edit.html.erb
@@ -30,12 +30,9 @@
<% end %>
-<% if params[:beta_form] %>
- <%= render 'react_form' %>
-<% else %>
- <% if @article.body_html && @article.body_html.size > 10 %>
- <%= render 'inline_form' %>
+ <% unless @article.has_frontmatter? %>
+ <%= javascript_pack_tag 'articleForm', defer: true %>
+ <%= render 'articles/v2_form' %>
<% else %>
<%= render 'articles/markdown_form' %>
<% end %>
-<% end %>
\ No newline at end of file
diff --git a/app/views/articles/new.html.erb b/app/views/articles/new.html.erb
index d45e2dfa48c3..94151564a052 100644
--- a/app/views/articles/new.html.erb
+++ b/app/views/articles/new.html.erb
@@ -1,7 +1,12 @@
<% title "New Article - DEV" %>
<% if user_signed_in? %>
- <%= render 'articles/markdown_form' %>
+ <% if params[:state] == "v2" || Rails.env.development? %>
+ <%= javascript_pack_tag 'articleForm', defer: true %>
+ <%= render 'articles/v2_form' %>
+ <% else %>
+ <%= render 'articles/markdown_form' %>
+ <% end %>
<% else %>
<%= render "devise/registrations/registration_form" %>
<% end %>
diff --git a/app/views/pages/_editor_guide_text.html.erb b/app/views/pages/_editor_guide_text.html.erb
index 131913db7bc6..cc9f4c18cc10 100644
--- a/app/views/pages/_editor_guide_text.html.erb
+++ b/app/views/pages/_editor_guide_text.html.erb
@@ -1,5 +1,5 @@
-
-
+
+
Editor Guide 🤓
diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb
index dd44ecfc66eb..2f25d0a6ef5e 100644
--- a/app/views/users/edit.html.erb
+++ b/app/views/users/edit.html.erb
@@ -45,7 +45,7 @@
<% if @user.errors.any? %>
-
<%= pluralize(@user.errors.count, "error") %> prohibited this article from being saved:
+
<%= pluralize(@user.errors.count, "error") %> prohibited your profile from being saved:
<% @user.errors.full_messages.each do |message| %>
@@ -57,7 +57,7 @@
<% if @organization && @organization.errors.any? %>
-
<%= pluralize(@organization.errors.count, "error") %> prohibited this article from being saved:
+
<%= pluralize(@organization.errors.count, "error") %> prohibited your org profile from being saved:
<% @organization.errors.full_messages.each do |message| %>
diff --git a/config/initializers/algoliasearch.rb b/config/initializers/algoliasearch.rb
index ebf26f862745..56d5bf9502f5 100644
--- a/config/initializers/algoliasearch.rb
+++ b/config/initializers/algoliasearch.rb
@@ -6,7 +6,7 @@
if !Rails.env.test?
# Restrtict Access to private indices
params = {
- restrictIndices: "searchables_#{Rails.env},ordered_articles_#{Rails.env},ordered_articles_by_published_at_#{Rails.env},ordered_articles_by_positive_reactions_count_#{Rails.env},ordered_comments_#{Rails.env}",
+ restrictIndices: "searchables_#{Rails.env},Tag_#{Rails.env},ordered_articles_#{Rails.env},ordered_articles_by_published_at_#{Rails.env},ordered_articles_by_positive_reactions_count_#{Rails.env},ordered_comments_#{Rails.env}",
}
secured_algolia_key = Algolia.generate_secured_api_key(
ApplicationConfig["ALGOLIASEARCH_SEARCH_ONLY_KEY"], params,
diff --git a/config/routes.rb b/config/routes.rb
index 62c7ed8252de..519c456ac47b 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -40,7 +40,7 @@
namespace :api, defaults: {format: "json"} do
scope module: :v0, constraints: ApiConstraints.new(version: 0, default: true) do
- resources :articles, only: [:index, :show] do
+ resources :articles, only: [:index, :show, :create, :update] do
collection do
get "/onboarding", to: "articles#onboarding"
end
diff --git a/package-lock.json b/package-lock.json
index 579748a855d4..49d97659ce2d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8741,6 +8741,11 @@
"type-check": "~0.3.2"
}
},
+ "linkstate": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/linkstate/-/linkstate-1.1.1.tgz",
+ "integrity": "sha512-5SICdxQG9FpWk44wSEoM2WOCUNuYfClp10t51XAIV5E7vUILF/dTYxf0vJw6bW2dUd2wcQon+LkNtRijpNLrig=="
+ },
"lint-staged": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-7.2.0.tgz",
@@ -10447,6 +10452,3861 @@
"sort-keys": "^1.0.0"
}
},
+ "npm": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-5.8.0.tgz",
+ "integrity": "sha512-DowXzQwtSWDtbAjuWecuEiismR0VdNEYaL3VxNTYTdW6AGkYxfGk9LUZ/rt6etEyiH4IEk95HkJeGfXE5Rz9xQ==",
+ "requires": {
+ "JSONStream": "1.3.2",
+ "abbrev": "1.1.1",
+ "ansi-regex": "3.0.0",
+ "ansicolors": "0.3.2",
+ "ansistyles": "0.1.3",
+ "aproba": "1.2.0",
+ "archy": "1.0.0",
+ "bin-links": "1.1.0",
+ "bluebird": "3.5.1",
+ "cacache": "10.0.4",
+ "call-limit": "1.1.0",
+ "chownr": "1.0.1",
+ "cli-table2": "0.2.0",
+ "cmd-shim": "2.0.2",
+ "columnify": "1.5.4",
+ "config-chain": "1.1.11",
+ "debuglog": "1.0.1",
+ "detect-indent": "5.0.0",
+ "detect-newline": "2.1.0",
+ "dezalgo": "1.0.3",
+ "editor": "1.0.0",
+ "find-npm-prefix": "1.0.2",
+ "fs-vacuum": "1.2.10",
+ "fs-write-stream-atomic": "1.0.10",
+ "gentle-fs": "2.0.1",
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "has-unicode": "2.0.1",
+ "hosted-git-info": "2.6.0",
+ "iferr": "0.1.5",
+ "imurmurhash": "0.1.4",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "ini": "1.3.5",
+ "init-package-json": "1.10.3",
+ "is-cidr": "1.0.0",
+ "json-parse-better-errors": "1.0.1",
+ "lazy-property": "1.0.0",
+ "libcipm": "1.6.0",
+ "libnpx": "10.0.1",
+ "lockfile": "1.0.3",
+ "lodash._baseindexof": "3.1.0",
+ "lodash._baseuniq": "4.6.0",
+ "lodash._bindcallback": "3.0.1",
+ "lodash._cacheindexof": "3.0.2",
+ "lodash._createcache": "3.1.2",
+ "lodash._getnative": "3.9.1",
+ "lodash.clonedeep": "4.5.0",
+ "lodash.restparam": "3.6.1",
+ "lodash.union": "4.6.0",
+ "lodash.uniq": "4.5.0",
+ "lodash.without": "4.4.0",
+ "lru-cache": "4.1.1",
+ "meant": "1.0.1",
+ "mississippi": "3.0.0",
+ "mkdirp": "0.5.1",
+ "move-concurrently": "1.0.1",
+ "nopt": "4.0.1",
+ "normalize-package-data": "2.4.0",
+ "npm-cache-filename": "1.0.2",
+ "npm-install-checks": "3.0.0",
+ "npm-lifecycle": "2.0.1",
+ "npm-package-arg": "6.0.0",
+ "npm-packlist": "1.1.10",
+ "npm-profile": "3.0.1",
+ "npm-registry-client": "8.5.1",
+ "npm-user-validate": "1.0.0",
+ "npmlog": "4.1.2",
+ "once": "1.4.0",
+ "opener": "1.4.3",
+ "osenv": "0.1.5",
+ "pacote": "7.6.1",
+ "path-is-inside": "1.0.2",
+ "promise-inflight": "1.0.1",
+ "qrcode-terminal": "0.11.0",
+ "query-string": "5.1.0",
+ "qw": "1.0.1",
+ "read": "1.0.7",
+ "read-cmd-shim": "1.0.1",
+ "read-installed": "4.0.3",
+ "read-package-json": "2.0.13",
+ "read-package-tree": "5.1.6",
+ "readable-stream": "2.3.5",
+ "readdir-scoped-modules": "1.0.2",
+ "request": "2.83.0",
+ "retry": "0.10.1",
+ "rimraf": "2.6.2",
+ "safe-buffer": "5.1.1",
+ "semver": "5.5.0",
+ "sha": "2.0.1",
+ "slide": "1.1.6",
+ "sorted-object": "2.0.1",
+ "sorted-union-stream": "2.1.3",
+ "ssri": "5.2.4",
+ "strip-ansi": "4.0.0",
+ "tar": "4.4.0",
+ "text-table": "0.2.0",
+ "uid-number": "0.0.6",
+ "umask": "1.1.0",
+ "unique-filename": "1.1.0",
+ "unpipe": "1.0.0",
+ "update-notifier": "2.3.0",
+ "uuid": "3.2.1",
+ "validate-npm-package-license": "3.0.1",
+ "validate-npm-package-name": "3.0.0",
+ "which": "1.3.0",
+ "worker-farm": "1.5.4",
+ "wrappy": "1.0.2",
+ "write-file-atomic": "2.3.0"
+ },
+ "dependencies": {
+ "JSONStream": {
+ "version": "1.3.2",
+ "bundled": true,
+ "requires": {
+ "jsonparse": "1.3.1",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "jsonparse": {
+ "version": "1.3.1",
+ "bundled": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "bundled": true
+ }
+ }
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "bundled": true
+ },
+ "ansicolors": {
+ "version": "0.3.2",
+ "bundled": true
+ },
+ "ansistyles": {
+ "version": "0.1.3",
+ "bundled": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true
+ },
+ "archy": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "bin-links": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "bluebird": "3.5.1",
+ "cmd-shim": "2.0.2",
+ "fs-write-stream-atomic": "1.0.10",
+ "gentle-fs": "2.0.1",
+ "graceful-fs": "4.1.11",
+ "slide": "1.1.6"
+ }
+ },
+ "bluebird": {
+ "version": "3.5.1",
+ "bundled": true
+ },
+ "cacache": {
+ "version": "10.0.4",
+ "bundled": true,
+ "requires": {
+ "bluebird": "3.5.1",
+ "chownr": "1.0.1",
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "lru-cache": "4.1.1",
+ "mississippi": "2.0.0",
+ "mkdirp": "0.5.1",
+ "move-concurrently": "1.0.1",
+ "promise-inflight": "1.0.1",
+ "rimraf": "2.6.2",
+ "ssri": "5.2.4",
+ "unique-filename": "1.1.0",
+ "y18n": "4.0.0"
+ },
+ "dependencies": {
+ "mississippi": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "concat-stream": "1.6.1",
+ "duplexify": "3.5.4",
+ "end-of-stream": "1.4.1",
+ "flush-write-stream": "1.0.2",
+ "from2": "2.3.0",
+ "parallel-transform": "1.1.0",
+ "pump": "2.0.1",
+ "pumpify": "1.4.0",
+ "stream-each": "1.2.2",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.1",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "typedarray": "0.0.6"
+ },
+ "dependencies": {
+ "typedarray": {
+ "version": "0.0.6",
+ "bundled": true
+ }
+ }
+ },
+ "duplexify": {
+ "version": "3.5.4",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "stream-shift": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "bundled": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "flush-write-stream": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "from2": {
+ "version": "2.3.0",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "parallel-transform": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "cyclist": "0.2.2",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ },
+ "dependencies": {
+ "cyclist": {
+ "version": "0.2.2",
+ "bundled": true
+ }
+ }
+ },
+ "pump": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "duplexify": "3.5.4",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ }
+ },
+ "stream-each": {
+ "version": "1.2.2",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "stream-shift": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "through2": {
+ "version": "2.0.3",
+ "bundled": true,
+ "requires": {
+ "readable-stream": "2.3.5",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "xtend": {
+ "version": "4.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "y18n": {
+ "version": "4.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "call-limit": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "cli-table2": {
+ "version": "0.2.0",
+ "bundled": true,
+ "requires": {
+ "colors": "1.1.2",
+ "lodash": "3.10.1",
+ "string-width": "1.0.2"
+ },
+ "dependencies": {
+ "colors": {
+ "version": "1.1.2",
+ "bundled": true,
+ "optional": true
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "bundled": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ },
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "cmd-shim": {
+ "version": "2.0.2",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "mkdirp": "0.5.1"
+ }
+ },
+ "columnify": {
+ "version": "1.5.4",
+ "bundled": true,
+ "requires": {
+ "strip-ansi": "3.0.1",
+ "wcwidth": "1.0.1"
+ },
+ "dependencies": {
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ }
+ }
+ },
+ "wcwidth": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "defaults": "1.0.3"
+ },
+ "dependencies": {
+ "defaults": {
+ "version": "1.0.3",
+ "bundled": true,
+ "requires": {
+ "clone": "1.0.2"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.2",
+ "bundled": true
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "config-chain": {
+ "version": "1.1.11",
+ "bundled": true,
+ "requires": {
+ "ini": "1.3.5",
+ "proto-list": "1.2.4"
+ },
+ "dependencies": {
+ "proto-list": {
+ "version": "1.2.4",
+ "bundled": true
+ }
+ }
+ },
+ "debuglog": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "detect-indent": {
+ "version": "5.0.0",
+ "bundled": true
+ },
+ "detect-newline": {
+ "version": "2.1.0",
+ "bundled": true
+ },
+ "dezalgo": {
+ "version": "1.0.3",
+ "bundled": true,
+ "requires": {
+ "asap": "2.0.5",
+ "wrappy": "1.0.2"
+ },
+ "dependencies": {
+ "asap": {
+ "version": "2.0.5",
+ "bundled": true
+ }
+ }
+ },
+ "editor": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "find-npm-prefix": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "fs-vacuum": {
+ "version": "1.2.10",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "path-is-inside": "1.0.2",
+ "rimraf": "2.6.2"
+ }
+ },
+ "fs-write-stream-atomic": {
+ "version": "1.0.10",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "iferr": "0.1.5",
+ "imurmurhash": "0.1.4",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "gentle-fs": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "fs-vacuum": "1.2.10",
+ "graceful-fs": "4.1.11",
+ "iferr": "0.1.5",
+ "mkdirp": "0.5.1",
+ "path-is-inside": "1.0.2",
+ "read-cmd-shim": "1.0.1",
+ "slide": "1.1.6"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ },
+ "dependencies": {
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.8",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "bundled": true
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true
+ },
+ "hosted-git-info": {
+ "version": "2.6.0",
+ "bundled": true
+ },
+ "iferr": {
+ "version": "0.1.5",
+ "bundled": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "bundled": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true
+ },
+ "init-package-json": {
+ "version": "1.10.3",
+ "bundled": true,
+ "requires": {
+ "glob": "7.1.2",
+ "npm-package-arg": "6.0.0",
+ "promzard": "0.3.0",
+ "read": "1.0.7",
+ "read-package-json": "2.0.13",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.1",
+ "validate-npm-package-name": "3.0.0"
+ },
+ "dependencies": {
+ "promzard": {
+ "version": "0.3.0",
+ "bundled": true,
+ "requires": {
+ "read": "1.0.7"
+ }
+ }
+ }
+ },
+ "is-cidr": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "cidr-regex": "1.0.6"
+ },
+ "dependencies": {
+ "cidr-regex": {
+ "version": "1.0.6",
+ "bundled": true
+ }
+ }
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "lazy-property": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "libcipm": {
+ "version": "1.6.0",
+ "bundled": true,
+ "requires": {
+ "bin-links": "1.1.0",
+ "bluebird": "3.5.1",
+ "find-npm-prefix": "1.0.2",
+ "graceful-fs": "4.1.11",
+ "lock-verify": "2.0.0",
+ "npm-lifecycle": "2.0.1",
+ "npm-logical-tree": "1.2.1",
+ "npm-package-arg": "6.0.0",
+ "pacote": "7.6.1",
+ "protoduck": "5.0.0",
+ "read-package-json": "2.0.13",
+ "rimraf": "2.6.2",
+ "worker-farm": "1.5.4"
+ },
+ "dependencies": {
+ "lock-verify": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "npm-package-arg": "5.1.2",
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "npm-package-arg": {
+ "version": "5.1.2",
+ "bundled": true,
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "osenv": "0.1.5",
+ "semver": "5.5.0",
+ "validate-npm-package-name": "3.0.0"
+ }
+ }
+ }
+ },
+ "npm-logical-tree": {
+ "version": "1.2.1",
+ "bundled": true
+ },
+ "protoduck": {
+ "version": "5.0.0",
+ "bundled": true,
+ "requires": {
+ "genfun": "4.0.1"
+ },
+ "dependencies": {
+ "genfun": {
+ "version": "4.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "worker-farm": {
+ "version": "1.5.4",
+ "bundled": true,
+ "requires": {
+ "errno": "0.1.7",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "errno": {
+ "version": "0.1.7",
+ "bundled": true,
+ "requires": {
+ "prr": "1.0.1"
+ },
+ "dependencies": {
+ "prr": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "libnpx": {
+ "version": "10.0.1",
+ "bundled": true,
+ "requires": {
+ "dotenv": "5.0.1",
+ "npm-package-arg": "6.0.0",
+ "rimraf": "2.6.2",
+ "safe-buffer": "5.1.1",
+ "update-notifier": "2.3.0",
+ "which": "1.3.0",
+ "y18n": "4.0.0",
+ "yargs": "11.0.0"
+ },
+ "dependencies": {
+ "dotenv": {
+ "version": "5.0.1",
+ "bundled": true
+ },
+ "y18n": {
+ "version": "4.0.0",
+ "bundled": true
+ },
+ "yargs": {
+ "version": "11.0.0",
+ "bundled": true,
+ "requires": {
+ "cliui": "4.0.0",
+ "decamelize": "1.2.0",
+ "find-up": "2.1.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "2.1.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "9.0.2"
+ },
+ "dependencies": {
+ "cliui": {
+ "version": "4.0.0",
+ "bundled": true,
+ "requires": {
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ },
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "bundled": true
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "locate-path": "2.0.0"
+ },
+ "dependencies": {
+ "locate-path": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
+ },
+ "dependencies": {
+ "p-locate": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "p-limit": "1.2.0"
+ },
+ "dependencies": {
+ "p-limit": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "p-try": "1.0.0"
+ },
+ "dependencies": {
+ "p-try": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0",
+ "mem": "1.1.0"
+ },
+ "dependencies": {
+ "execa": {
+ "version": "0.7.0",
+ "bundled": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "5.1.0",
+ "bundled": true,
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "shebang-command": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ },
+ "dependencies": {
+ "shebang-regex": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "bundled": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "bundled": true,
+ "requires": {
+ "path-key": "2.0.1"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "2.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "invert-kv": "1.0.0"
+ },
+ "dependencies": {
+ "invert-kv": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "mem": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "mimic-fn": "1.2.0"
+ },
+ "dependencies": {
+ "mimic-fn": {
+ "version": "1.2.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "bundled": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "bundled": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "bundled": true
+ },
+ "yargs-parser": {
+ "version": "9.0.2",
+ "bundled": true,
+ "requires": {
+ "camelcase": "4.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "lockfile": {
+ "version": "1.0.3",
+ "bundled": true
+ },
+ "lodash._baseindexof": {
+ "version": "3.1.0",
+ "bundled": true
+ },
+ "lodash._baseuniq": {
+ "version": "4.6.0",
+ "bundled": true,
+ "requires": {
+ "lodash._createset": "4.0.3",
+ "lodash._root": "3.0.1"
+ },
+ "dependencies": {
+ "lodash._createset": {
+ "version": "4.0.3",
+ "bundled": true
+ },
+ "lodash._root": {
+ "version": "3.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "lodash._bindcallback": {
+ "version": "3.0.1",
+ "bundled": true
+ },
+ "lodash._cacheindexof": {
+ "version": "3.0.2",
+ "bundled": true
+ },
+ "lodash._createcache": {
+ "version": "3.1.2",
+ "bundled": true,
+ "requires": {
+ "lodash._getnative": "3.9.1"
+ }
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "bundled": true
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "bundled": true
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "bundled": true
+ },
+ "lodash.union": {
+ "version": "4.6.0",
+ "bundled": true
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "bundled": true
+ },
+ "lodash.without": {
+ "version": "4.4.0",
+ "bundled": true
+ },
+ "lru-cache": {
+ "version": "4.1.1",
+ "bundled": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ },
+ "dependencies": {
+ "pseudomap": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "bundled": true
+ }
+ }
+ },
+ "meant": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "mississippi": {
+ "version": "3.0.0",
+ "bundled": true,
+ "requires": {
+ "concat-stream": "1.6.1",
+ "duplexify": "3.5.4",
+ "end-of-stream": "1.4.1",
+ "flush-write-stream": "1.0.2",
+ "from2": "2.3.0",
+ "parallel-transform": "1.1.0",
+ "pump": "3.0.0",
+ "pumpify": "1.4.0",
+ "stream-each": "1.2.2",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.1",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "typedarray": "0.0.6"
+ },
+ "dependencies": {
+ "typedarray": {
+ "version": "0.0.6",
+ "bundled": true
+ }
+ }
+ },
+ "duplexify": {
+ "version": "3.5.4",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "stream-shift": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "bundled": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "flush-write-stream": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "from2": {
+ "version": "2.3.0",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "parallel-transform": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "cyclist": "0.2.2",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ },
+ "dependencies": {
+ "cyclist": {
+ "version": "0.2.2",
+ "bundled": true
+ }
+ }
+ },
+ "pump": {
+ "version": "3.0.0",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "duplexify": "3.5.4",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ },
+ "dependencies": {
+ "pump": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "stream-each": {
+ "version": "1.2.2",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "stream-shift": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "through2": {
+ "version": "2.0.3",
+ "bundled": true,
+ "requires": {
+ "readable-stream": "2.3.5",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "xtend": {
+ "version": "4.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true
+ }
+ }
+ },
+ "move-concurrently": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "copy-concurrently": "1.0.5",
+ "fs-write-stream-atomic": "1.0.10",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.2",
+ "run-queue": "1.0.3"
+ },
+ "dependencies": {
+ "copy-concurrently": {
+ "version": "1.0.5",
+ "bundled": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "fs-write-stream-atomic": "1.0.10",
+ "iferr": "0.1.5",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.2",
+ "run-queue": "1.0.3"
+ }
+ },
+ "run-queue": {
+ "version": "1.0.3",
+ "bundled": true,
+ "requires": {
+ "aproba": "1.2.0"
+ }
+ }
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "requires": {
+ "abbrev": "1.1.1",
+ "osenv": "0.1.5"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "bundled": true,
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.1"
+ },
+ "dependencies": {
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "builtin-modules": "1.1.1"
+ },
+ "dependencies": {
+ "builtin-modules": {
+ "version": "1.1.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "npm-cache-filename": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "npm-install-checks": {
+ "version": "3.0.0",
+ "bundled": true,
+ "requires": {
+ "semver": "5.5.0"
+ }
+ },
+ "npm-lifecycle": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "byline": "5.0.0",
+ "graceful-fs": "4.1.11",
+ "node-gyp": "3.6.2",
+ "resolve-from": "4.0.0",
+ "slide": "1.1.6",
+ "uid-number": "0.0.6",
+ "umask": "1.1.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "byline": {
+ "version": "5.0.0",
+ "bundled": true
+ },
+ "node-gyp": {
+ "version": "3.6.2",
+ "bundled": true,
+ "requires": {
+ "fstream": "1.0.11",
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "nopt": "3.0.6",
+ "npmlog": "4.1.2",
+ "osenv": "0.1.5",
+ "request": "2.83.0",
+ "rimraf": "2.6.2",
+ "semver": "5.3.0",
+ "tar": "2.2.1",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "fstream": {
+ "version": "1.0.11",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "bundled": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "semver": {
+ "version": "5.3.0",
+ "bundled": true
+ },
+ "tar": {
+ "version": "2.2.1",
+ "bundled": true,
+ "requires": {
+ "block-stream": "0.0.9",
+ "fstream": "1.0.11",
+ "inherits": "2.0.3"
+ },
+ "dependencies": {
+ "block-stream": {
+ "version": "0.0.9",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ }
+ }
+ }
+ }
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "npm-package-arg": {
+ "version": "6.0.0",
+ "bundled": true,
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "osenv": "0.1.5",
+ "semver": "5.5.0",
+ "validate-npm-package-name": "3.0.0"
+ }
+ },
+ "npm-packlist": {
+ "version": "1.1.10",
+ "bundled": true,
+ "requires": {
+ "ignore-walk": "3.0.1",
+ "npm-bundled": "1.0.3"
+ },
+ "dependencies": {
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ },
+ "dependencies": {
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.8",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.3",
+ "bundled": true
+ }
+ }
+ },
+ "npm-profile": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "make-fetch-happen": "2.6.0"
+ },
+ "dependencies": {
+ "make-fetch-happen": {
+ "version": "2.6.0",
+ "bundled": true,
+ "requires": {
+ "agentkeepalive": "3.3.0",
+ "cacache": "10.0.4",
+ "http-cache-semantics": "3.8.1",
+ "http-proxy-agent": "2.0.0",
+ "https-proxy-agent": "2.1.1",
+ "lru-cache": "4.1.1",
+ "mississippi": "1.3.1",
+ "node-fetch-npm": "2.0.2",
+ "promise-retry": "1.1.1",
+ "socks-proxy-agent": "3.0.1",
+ "ssri": "5.2.4"
+ },
+ "dependencies": {
+ "agentkeepalive": {
+ "version": "3.3.0",
+ "bundled": true,
+ "requires": {
+ "humanize-ms": "1.2.1"
+ },
+ "dependencies": {
+ "humanize-ms": {
+ "version": "1.2.1",
+ "bundled": true,
+ "requires": {
+ "ms": "2.1.1"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "http-cache-semantics": {
+ "version": "3.8.1",
+ "bundled": true
+ },
+ "http-proxy-agent": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "agent-base": "4.2.0",
+ "debug": "2.6.9"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "bundled": true,
+ "requires": {
+ "es6-promisify": "5.0.0"
+ },
+ "dependencies": {
+ "es6-promisify": {
+ "version": "5.0.0",
+ "bundled": true,
+ "requires": {
+ "es6-promise": "4.2.4"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "https-proxy-agent": {
+ "version": "2.1.1",
+ "bundled": true,
+ "requires": {
+ "agent-base": "4.2.0",
+ "debug": "3.1.0"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "bundled": true,
+ "requires": {
+ "es6-promisify": "5.0.0"
+ },
+ "dependencies": {
+ "es6-promisify": {
+ "version": "5.0.0",
+ "bundled": true,
+ "requires": {
+ "es6-promise": "4.2.4"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "bundled": true,
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "mississippi": {
+ "version": "1.3.1",
+ "bundled": true,
+ "requires": {
+ "concat-stream": "1.6.0",
+ "duplexify": "3.5.3",
+ "end-of-stream": "1.4.1",
+ "flush-write-stream": "1.0.2",
+ "from2": "2.3.0",
+ "parallel-transform": "1.1.0",
+ "pump": "1.0.3",
+ "pumpify": "1.4.0",
+ "stream-each": "1.2.2",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.0",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "typedarray": "0.0.6"
+ },
+ "dependencies": {
+ "typedarray": {
+ "version": "0.0.6",
+ "bundled": true
+ }
+ }
+ },
+ "duplexify": {
+ "version": "3.5.3",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "stream-shift": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "bundled": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "flush-write-stream": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "from2": {
+ "version": "2.3.0",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "parallel-transform": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "cyclist": "0.2.2",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ },
+ "dependencies": {
+ "cyclist": {
+ "version": "0.2.2",
+ "bundled": true
+ }
+ }
+ },
+ "pump": {
+ "version": "1.0.3",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "duplexify": "3.5.3",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ },
+ "dependencies": {
+ "pump": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "stream-each": {
+ "version": "1.2.2",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "stream-shift": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "through2": {
+ "version": "2.0.3",
+ "bundled": true,
+ "requires": {
+ "readable-stream": "2.3.5",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "xtend": {
+ "version": "4.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "node-fetch-npm": {
+ "version": "2.0.2",
+ "bundled": true,
+ "requires": {
+ "encoding": "0.1.12",
+ "json-parse-better-errors": "1.0.1",
+ "safe-buffer": "5.1.1"
+ },
+ "dependencies": {
+ "encoding": {
+ "version": "0.1.12",
+ "bundled": true,
+ "requires": {
+ "iconv-lite": "0.4.19"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.19",
+ "bundled": true
+ }
+ }
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "promise-retry": {
+ "version": "1.1.1",
+ "bundled": true,
+ "requires": {
+ "err-code": "1.1.2",
+ "retry": "0.10.1"
+ },
+ "dependencies": {
+ "err-code": {
+ "version": "1.1.2",
+ "bundled": true
+ }
+ }
+ },
+ "socks-proxy-agent": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "agent-base": "4.2.0",
+ "socks": "1.1.10"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "bundled": true,
+ "requires": {
+ "es6-promisify": "5.0.0"
+ },
+ "dependencies": {
+ "es6-promisify": {
+ "version": "5.0.0",
+ "bundled": true,
+ "requires": {
+ "es6-promise": "4.2.4"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "socks": {
+ "version": "1.1.10",
+ "bundled": true,
+ "requires": {
+ "ip": "1.1.5",
+ "smart-buffer": "1.1.15"
+ },
+ "dependencies": {
+ "ip": {
+ "version": "1.1.5",
+ "bundled": true
+ },
+ "smart-buffer": {
+ "version": "1.1.15",
+ "bundled": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "npm-registry-client": {
+ "version": "8.5.1",
+ "bundled": true,
+ "requires": {
+ "concat-stream": "1.6.1",
+ "graceful-fs": "4.1.11",
+ "normalize-package-data": "2.4.0",
+ "npm-package-arg": "6.0.0",
+ "npmlog": "4.1.2",
+ "once": "1.4.0",
+ "request": "2.83.0",
+ "retry": "0.10.1",
+ "safe-buffer": "5.1.1",
+ "semver": "5.5.0",
+ "slide": "1.1.6",
+ "ssri": "5.2.4"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.1",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "typedarray": "0.0.6"
+ },
+ "dependencies": {
+ "typedarray": {
+ "version": "0.0.6",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "npm-user-validate": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ },
+ "dependencies": {
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.5"
+ },
+ "dependencies": {
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ },
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ }
+ }
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ }
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "opener": {
+ "version": "1.4.3",
+ "bundled": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ },
+ "dependencies": {
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true
+ }
+ }
+ },
+ "pacote": {
+ "version": "7.6.1",
+ "bundled": true,
+ "requires": {
+ "bluebird": "3.5.1",
+ "cacache": "10.0.4",
+ "get-stream": "3.0.0",
+ "glob": "7.1.2",
+ "lru-cache": "4.1.1",
+ "make-fetch-happen": "2.6.0",
+ "minimatch": "3.0.4",
+ "mississippi": "3.0.0",
+ "mkdirp": "0.5.1",
+ "normalize-package-data": "2.4.0",
+ "npm-package-arg": "6.0.0",
+ "npm-packlist": "1.1.10",
+ "npm-pick-manifest": "2.1.0",
+ "osenv": "0.1.5",
+ "promise-inflight": "1.0.1",
+ "promise-retry": "1.1.1",
+ "protoduck": "5.0.0",
+ "rimraf": "2.6.2",
+ "safe-buffer": "5.1.1",
+ "semver": "5.5.0",
+ "ssri": "5.2.4",
+ "tar": "4.4.0",
+ "unique-filename": "1.1.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "get-stream": {
+ "version": "3.0.0",
+ "bundled": true
+ },
+ "make-fetch-happen": {
+ "version": "2.6.0",
+ "bundled": true,
+ "requires": {
+ "agentkeepalive": "3.4.0",
+ "cacache": "10.0.4",
+ "http-cache-semantics": "3.8.1",
+ "http-proxy-agent": "2.1.0",
+ "https-proxy-agent": "2.2.0",
+ "lru-cache": "4.1.1",
+ "mississippi": "1.3.1",
+ "node-fetch-npm": "2.0.2",
+ "promise-retry": "1.1.1",
+ "socks-proxy-agent": "3.0.1",
+ "ssri": "5.2.4"
+ },
+ "dependencies": {
+ "agentkeepalive": {
+ "version": "3.4.0",
+ "bundled": true,
+ "requires": {
+ "humanize-ms": "1.2.1"
+ },
+ "dependencies": {
+ "humanize-ms": {
+ "version": "1.2.1",
+ "bundled": true,
+ "requires": {
+ "ms": "2.1.1"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "http-cache-semantics": {
+ "version": "3.8.1",
+ "bundled": true
+ },
+ "http-proxy-agent": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "agent-base": "4.2.0",
+ "debug": "3.1.0"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "bundled": true,
+ "requires": {
+ "es6-promisify": "5.0.0"
+ },
+ "dependencies": {
+ "es6-promisify": {
+ "version": "5.0.0",
+ "bundled": true,
+ "requires": {
+ "es6-promise": "4.2.4"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "bundled": true,
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "https-proxy-agent": {
+ "version": "2.2.0",
+ "bundled": true,
+ "requires": {
+ "agent-base": "4.2.0",
+ "debug": "3.1.0"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "bundled": true,
+ "requires": {
+ "es6-promisify": "5.0.0"
+ },
+ "dependencies": {
+ "es6-promisify": {
+ "version": "5.0.0",
+ "bundled": true,
+ "requires": {
+ "es6-promise": "4.2.4"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "bundled": true,
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "mississippi": {
+ "version": "1.3.1",
+ "bundled": true,
+ "requires": {
+ "concat-stream": "1.6.1",
+ "duplexify": "3.5.4",
+ "end-of-stream": "1.4.1",
+ "flush-write-stream": "1.0.2",
+ "from2": "2.3.0",
+ "parallel-transform": "1.1.0",
+ "pump": "1.0.3",
+ "pumpify": "1.4.0",
+ "stream-each": "1.2.2",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.1",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "typedarray": "0.0.6"
+ },
+ "dependencies": {
+ "typedarray": {
+ "version": "0.0.6",
+ "bundled": true
+ }
+ }
+ },
+ "duplexify": {
+ "version": "3.5.4",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "stream-shift": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "bundled": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "flush-write-stream": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "from2": {
+ "version": "2.3.0",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "parallel-transform": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "cyclist": "0.2.2",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.5"
+ },
+ "dependencies": {
+ "cyclist": {
+ "version": "0.2.2",
+ "bundled": true
+ }
+ }
+ },
+ "pump": {
+ "version": "1.0.3",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "duplexify": "3.5.4",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ },
+ "dependencies": {
+ "pump": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "stream-each": {
+ "version": "1.2.2",
+ "bundled": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "stream-shift": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "through2": {
+ "version": "2.0.3",
+ "bundled": true,
+ "requires": {
+ "readable-stream": "2.3.5",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "xtend": {
+ "version": "4.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "node-fetch-npm": {
+ "version": "2.0.2",
+ "bundled": true,
+ "requires": {
+ "encoding": "0.1.12",
+ "json-parse-better-errors": "1.0.1",
+ "safe-buffer": "5.1.1"
+ },
+ "dependencies": {
+ "encoding": {
+ "version": "0.1.12",
+ "bundled": true,
+ "requires": {
+ "iconv-lite": "0.4.19"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.19",
+ "bundled": true
+ }
+ }
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "socks-proxy-agent": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "agent-base": "4.2.0",
+ "socks": "1.1.10"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "bundled": true,
+ "requires": {
+ "es6-promisify": "5.0.0"
+ },
+ "dependencies": {
+ "es6-promisify": {
+ "version": "5.0.0",
+ "bundled": true,
+ "requires": {
+ "es6-promise": "4.2.4"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "socks": {
+ "version": "1.1.10",
+ "bundled": true,
+ "requires": {
+ "ip": "1.1.5",
+ "smart-buffer": "1.1.15"
+ },
+ "dependencies": {
+ "ip": {
+ "version": "1.1.5",
+ "bundled": true
+ },
+ "smart-buffer": {
+ "version": "1.1.15",
+ "bundled": true
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "npm-pick-manifest": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "npm-package-arg": "6.0.0",
+ "semver": "5.5.0"
+ }
+ },
+ "promise-retry": {
+ "version": "1.1.1",
+ "bundled": true,
+ "requires": {
+ "err-code": "1.1.2",
+ "retry": "0.10.1"
+ },
+ "dependencies": {
+ "err-code": {
+ "version": "1.1.2",
+ "bundled": true
+ }
+ }
+ },
+ "protoduck": {
+ "version": "5.0.0",
+ "bundled": true,
+ "requires": {
+ "genfun": "4.0.1"
+ },
+ "dependencies": {
+ "genfun": {
+ "version": "4.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "promise-inflight": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "qrcode-terminal": {
+ "version": "0.11.0",
+ "bundled": true
+ },
+ "query-string": {
+ "version": "5.1.0",
+ "bundled": true,
+ "requires": {
+ "decode-uri-component": "0.2.0",
+ "object-assign": "4.1.1",
+ "strict-uri-encode": "1.1.0"
+ },
+ "dependencies": {
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "bundled": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true
+ },
+ "strict-uri-encode": {
+ "version": "1.1.0",
+ "bundled": true
+ }
+ }
+ },
+ "qw": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "read": {
+ "version": "1.0.7",
+ "bundled": true,
+ "requires": {
+ "mute-stream": "0.0.7"
+ },
+ "dependencies": {
+ "mute-stream": {
+ "version": "0.0.7",
+ "bundled": true
+ }
+ }
+ },
+ "read-cmd-shim": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "read-installed": {
+ "version": "4.0.3",
+ "bundled": true,
+ "requires": {
+ "debuglog": "1.0.1",
+ "graceful-fs": "4.1.11",
+ "read-package-json": "2.0.13",
+ "readdir-scoped-modules": "1.0.2",
+ "semver": "5.5.0",
+ "slide": "1.1.6",
+ "util-extend": "1.0.3"
+ },
+ "dependencies": {
+ "util-extend": {
+ "version": "1.0.3",
+ "bundled": true
+ }
+ }
+ },
+ "read-package-json": {
+ "version": "2.0.13",
+ "bundled": true,
+ "requires": {
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "json-parse-better-errors": "1.0.1",
+ "normalize-package-data": "2.4.0",
+ "slash": "1.0.0"
+ },
+ "dependencies": {
+ "json-parse-better-errors": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "read-package-tree": {
+ "version": "5.1.6",
+ "bundled": true,
+ "requires": {
+ "debuglog": "1.0.1",
+ "dezalgo": "1.0.3",
+ "once": "1.4.0",
+ "read-package-json": "2.0.13",
+ "readdir-scoped-modules": "1.0.2"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.5",
+ "bundled": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ },
+ "dependencies": {
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "bundled": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true
+ }
+ }
+ },
+ "readdir-scoped-modules": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "debuglog": "1.0.1",
+ "dezalgo": "1.0.3",
+ "graceful-fs": "4.1.11",
+ "once": "1.4.0"
+ }
+ },
+ "request": {
+ "version": "2.83.0",
+ "bundled": true,
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.1",
+ "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.17",
+ "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.3",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.2.1"
+ },
+ "dependencies": {
+ "aws-sign2": {
+ "version": "0.7.0",
+ "bundled": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "bundled": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "bundled": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "bundled": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ },
+ "dependencies": {
+ "delayed-stream": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "bundled": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "bundled": true
+ },
+ "form-data": {
+ "version": "2.3.1",
+ "bundled": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.17"
+ },
+ "dependencies": {
+ "asynckit": {
+ "version": "0.4.0",
+ "bundled": true
+ }
+ }
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "bundled": true,
+ "requires": {
+ "ajv": "5.2.3",
+ "har-schema": "2.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "5.2.3",
+ "bundled": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.0.0",
+ "json-schema-traverse": "0.3.1",
+ "json-stable-stringify": "1.0.1"
+ },
+ "dependencies": {
+ "co": {
+ "version": "4.6.0",
+ "bundled": true
+ },
+ "fast-deep-equal": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "bundled": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ },
+ "dependencies": {
+ "jsonify": {
+ "version": "0.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "hawk": {
+ "version": "6.0.2",
+ "bundled": true,
+ "requires": {
+ "boom": "4.3.1",
+ "cryptiles": "3.1.2",
+ "hoek": "4.2.0",
+ "sntp": "2.0.2"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "4.3.1",
+ "bundled": true,
+ "requires": {
+ "hoek": "4.2.0"
+ }
+ },
+ "cryptiles": {
+ "version": "3.1.2",
+ "bundled": true,
+ "requires": {
+ "boom": "5.2.0"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "bundled": true,
+ "requires": {
+ "hoek": "4.2.0"
+ }
+ }
+ }
+ },
+ "hoek": {
+ "version": "4.2.0",
+ "bundled": true
+ },
+ "sntp": {
+ "version": "2.0.2",
+ "bundled": true,
+ "requires": {
+ "hoek": "4.2.0"
+ }
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.13.1"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "bundled": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ },
+ "dependencies": {
+ "extsprintf": {
+ "version": "1.3.0",
+ "bundled": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "bundled": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "bundled": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ },
+ "dependencies": {
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "sshpk": {
+ "version": "1.13.1",
+ "bundled": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "asn1": {
+ "version": "0.2.3",
+ "bundled": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "bundled": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "bundled": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ }
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "bundled": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "bundled": true
+ },
+ "mime-types": {
+ "version": "2.1.17",
+ "bundled": true,
+ "requires": {
+ "mime-db": "1.30.0"
+ },
+ "dependencies": {
+ "mime-db": {
+ "version": "1.30.0",
+ "bundled": true
+ }
+ }
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "bundled": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "bundled": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "bundled": true
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "bundled": true
+ },
+ "tough-cookie": {
+ "version": "2.3.3",
+ "bundled": true,
+ "requires": {
+ "punycode": "1.4.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "bundled": true
+ }
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "bundled": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "retry": {
+ "version": "0.10.1",
+ "bundled": true
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true
+ },
+ "sha": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "slide": {
+ "version": "1.1.6",
+ "bundled": true
+ },
+ "sorted-object": {
+ "version": "2.0.1",
+ "bundled": true
+ },
+ "sorted-union-stream": {
+ "version": "2.1.3",
+ "bundled": true,
+ "requires": {
+ "from2": "1.3.0",
+ "stream-iterate": "1.2.0"
+ },
+ "dependencies": {
+ "from2": {
+ "version": "1.3.0",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.1.14",
+ "bundled": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ },
+ "dependencies": {
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "stream-iterate": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "readable-stream": "2.3.5",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "stream-shift": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "ssri": {
+ "version": "5.2.4",
+ "bundled": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "tar": {
+ "version": "4.4.0",
+ "bundled": true,
+ "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"
+ },
+ "dependencies": {
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "requires": {
+ "minipass": "2.2.1"
+ }
+ },
+ "minipass": {
+ "version": "2.2.1",
+ "bundled": true,
+ "requires": {
+ "yallist": "3.0.2"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "minipass": "2.2.1"
+ }
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "bundled": true
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "bundled": true
+ },
+ "uid-number": {
+ "version": "0.0.6",
+ "bundled": true
+ },
+ "umask": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "unique-filename": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "unique-slug": "2.0.0"
+ },
+ "dependencies": {
+ "unique-slug": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "imurmurhash": "0.1.4"
+ }
+ }
+ }
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "update-notifier": {
+ "version": "2.3.0",
+ "bundled": true,
+ "requires": {
+ "boxen": "1.2.1",
+ "chalk": "2.1.0",
+ "configstore": "3.1.1",
+ "import-lazy": "2.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ },
+ "dependencies": {
+ "boxen": {
+ "version": "1.2.1",
+ "bundled": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.1.0",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "1.0.0"
+ },
+ "dependencies": {
+ "ansi-align": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "bundled": true
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "bundled": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "execa": "0.7.0"
+ },
+ "dependencies": {
+ "execa": {
+ "version": "0.7.0",
+ "bundled": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "5.1.0",
+ "bundled": true,
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "shebang-command": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ },
+ "dependencies": {
+ "shebang-regex": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "bundled": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "bundled": true,
+ "requires": {
+ "path-key": "2.0.1"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "2.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "widest-line": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "string-width": "1.0.2"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ },
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.4.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "bundled": true,
+ "requires": {
+ "color-convert": "1.9.0"
+ },
+ "dependencies": {
+ "color-convert": {
+ "version": "1.9.0",
+ "bundled": true,
+ "requires": {
+ "color-name": "1.1.3"
+ },
+ "dependencies": {
+ "color-name": {
+ "version": "1.1.3",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "bundled": true
+ },
+ "supports-color": {
+ "version": "4.4.0",
+ "bundled": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "configstore": {
+ "version": "3.1.1",
+ "bundled": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.0.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ },
+ "dependencies": {
+ "dot-prop": {
+ "version": "4.2.0",
+ "bundled": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ },
+ "dependencies": {
+ "is-obj": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "make-dir": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "pify": "2.3.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "bundled": true
+ }
+ }
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "crypto-random-string": "1.0.0"
+ },
+ "dependencies": {
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "bundled": true
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "bundled": true,
+ "requires": {
+ "global-dirs": "0.1.0",
+ "is-path-inside": "1.0.0"
+ },
+ "dependencies": {
+ "global-dirs": {
+ "version": "0.1.0",
+ "bundled": true,
+ "requires": {
+ "ini": "1.3.5"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ }
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "bundled": true,
+ "requires": {
+ "package-json": "4.0.1"
+ },
+ "dependencies": {
+ "package-json": {
+ "version": "4.0.1",
+ "bundled": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.1",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "got": {
+ "version": "6.7.1",
+ "bundled": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ },
+ "dependencies": {
+ "create-error-class": {
+ "version": "3.0.2",
+ "bundled": true,
+ "requires": {
+ "capture-stack-trace": "1.0.0"
+ },
+ "dependencies": {
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "bundled": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "bundled": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "lowercase-keys": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "bundled": true
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "bundled": true
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "prepend-http": "1.0.4"
+ },
+ "dependencies": {
+ "prepend-http": {
+ "version": "1.0.4",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.1",
+ "bundled": true,
+ "requires": {
+ "rc": "1.2.1",
+ "safe-buffer": "5.1.1"
+ },
+ "dependencies": {
+ "rc": {
+ "version": "1.2.1",
+ "bundled": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "deep-extend": {
+ "version": "0.4.2",
+ "bundled": true
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "bundled": true,
+ "requires": {
+ "rc": "1.2.1"
+ },
+ "dependencies": {
+ "rc": {
+ "version": "1.2.1",
+ "bundled": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "deep-extend": {
+ "version": "0.4.2",
+ "bundled": true
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "semver": "5.5.0"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "bundled": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "spdx-correct": "1.0.2",
+ "spdx-expression-parse": "1.0.4"
+ },
+ "dependencies": {
+ "spdx-correct": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "spdx-license-ids": "1.2.2"
+ },
+ "dependencies": {
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "bundled": true
+ }
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "bundled": true
+ }
+ }
+ },
+ "validate-npm-package-name": {
+ "version": "3.0.0",
+ "bundled": true,
+ "requires": {
+ "builtins": "1.0.3"
+ },
+ "dependencies": {
+ "builtins": {
+ "version": "1.0.3",
+ "bundled": true
+ }
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "bundled": true,
+ "requires": {
+ "isexe": "2.0.0"
+ },
+ "dependencies": {
+ "isexe": {
+ "version": "2.0.0",
+ "bundled": true
+ }
+ }
+ },
+ "worker-farm": {
+ "version": "1.5.4",
+ "bundled": true,
+ "requires": {
+ "errno": "0.1.7",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "errno": {
+ "version": "0.1.7",
+ "bundled": true,
+ "requires": {
+ "prr": "1.0.1"
+ },
+ "dependencies": {
+ "prr": {
+ "version": "1.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "bundled": true
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ },
+ "dependencies": {
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true
+ }
+ }
+ }
+ }
+ },
"npm-path": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz",
diff --git a/package.json b/package.json
index 1ca25da9b214..977effcdeea5 100644
--- a/package.json
+++ b/package.json
@@ -86,8 +86,10 @@
"@webscopeio/react-textarea-autocomplete": "^2.2.0",
"codemirror": "^5.38.0",
"intersection-observer": "^0.5.0",
+ "linkstate": "^1.1.1",
"marked": "^0.4.0",
"preact": "^8.2.5",
+ "preact-textarea-autosize": "^4.0.7",
"prop-types": "^15.6.0",
"pusher-js": "^4.2.2",
"twilio-video": "^1.10.0"
diff --git a/yarn.lock b/yarn.lock
index 7c151d735623..9cc75d7a59d8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5667,6 +5667,10 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
+linkstate@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/linkstate/-/linkstate-1.1.1.tgz#cb9c29189baa7552295898f78f82b4055d6be108"
+
lint-staged@^7.0.5:
version "7.2.0"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-7.2.0.tgz#bdf4bb7f2f37fe689acfaec9999db288a5b26888"
@@ -7535,6 +7539,10 @@ preact-render-to-string@^3.6.0, preact-render-to-string@^3.6.3:
dependencies:
pretty-format "^3.5.1"
+preact-textarea-autosize@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/preact-textarea-autosize/-/preact-textarea-autosize-4.0.7.tgz#aa654ce1a0ed57027dca21e4710a78cb6f007457"
+
preact-transition-group@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/preact-transition-group/-/preact-transition-group-1.1.1.tgz#f0a49327ea515ece34ea2be864c4a7d29e5d6e10"