From fd0eb4ca7da707eff86d124ee270c72ed5f1a365 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 4 Nov 2021 10:42:27 +1300 Subject: [PATCH 01/86] Add & implement ListPage --- .../basePages/listPage/brewItem/brewItem.jsx | 144 +++++++++++++ .../basePages/listPage/brewItem/brewItem.less | 75 +++++++ .../pages/basePages/listPage/listPage.jsx | 189 ++++++++++++++++++ .../pages/basePages/listPage/listPage.less | 77 +++++++ client/homebrew/pages/userPage/userPage.jsx | 162 ++------------- 5 files changed, 504 insertions(+), 143 deletions(-) create mode 100644 client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx create mode 100644 client/homebrew/pages/basePages/listPage/brewItem/brewItem.less create mode 100644 client/homebrew/pages/basePages/listPage/listPage.jsx create mode 100644 client/homebrew/pages/basePages/listPage/listPage.less diff --git a/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx new file mode 100644 index 000000000..c7c4d6f94 --- /dev/null +++ b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx @@ -0,0 +1,144 @@ +require('./brewItem.less'); +const React = require('react'); +const createClass = require('create-react-class'); +const _ = require('lodash'); +const cx = require('classnames'); +const moment = require('moment'); +const request = require('superagent'); + +const googleDriveIcon = require('../../../../googleDrive.png'); +const dedent = require('dedent-tabs').default; + +const BrewItem = createClass({ + getDefaultProps : function() { + return { + brew : { + title : '', + description : '', + + authors : [] + } + }; + }, + + deleteBrew : function(){ + if(this.props.brew.authors.length <= 1){ + if(!confirm('Are you sure you want to delete this brew? Because you are the only owner of this brew, the document will be deleted permanently.')) return; + if(!confirm('Are you REALLY sure? You will not be able to recover the document.')) return; + } else { + if(!confirm('Are you sure you want to remove this brew from your collection? This will remove you as an editor, but other owners will still be able to access the document.')) return; + if(!confirm('Are you REALLY sure? You will lose editor access to this document.')) return; + } + + if(this.props.brew.googleId) { + request.get(`/api/removeGoogle/${this.props.brew.googleId}${this.props.brew.editId}`) + .send() + .end(function(err, res){ + location.reload(); + }); + } else { + request.delete(`/api/${this.props.brew.editId}`) + .send() + .end(function(err, res){ + location.reload(); + }); + } + }, + + renderDeleteBrewLink : function(){ + if(!this.props.brew.editId) return; + + return + + ; + }, + + renderEditLink : function(){ + if(!this.props.brew.editId) return; + + let editLink = this.props.brew.editId; + if(this.props.brew.googleId) { + editLink = this.props.brew.googleId + editLink; + } + + return + + ; + }, + + renderShareLink : function(){ + if(!this.props.brew.shareId) return; + + let shareLink = this.props.brew.shareId; + if(this.props.brew.googleId) { + shareLink = this.props.brew.googleId + shareLink; + } + + return + + ; + }, + + renderDownloadLink : function(){ + if(!this.props.brew.shareId) return; + + let shareLink = this.props.brew.shareId; + if(this.props.brew.googleId) { + shareLink = this.props.brew.googleId + shareLink; + } + + return + + ; + }, + + renderGoogleDriveIcon : function(){ + if(!this.props.brew.gDrive) return; + + return + googleDriveIcon + ; + }, + + render : function(){ + const brew = this.props.brew; + const dateFormatString = 'YYYY-MM-DD HH:mm:ss'; + + return
+
+

{brew.title}

+

{brew.description}

+
+
+
+ + {brew.authors.join(', ')} + +
+ + {brew.views} + + {brew.pageCount && + + {brew.pageCount} + + } + + {moment(brew.updatedAt).fromNow()} + + {this.renderGoogleDriveIcon()} +
+ +
+ {this.renderShareLink()} + {this.renderEditLink()} + {this.renderDownloadLink()} + {this.renderDeleteBrewLink()} +
+
; + } +}); + +module.exports = BrewItem; diff --git a/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less new file mode 100644 index 000000000..d323874f5 --- /dev/null +++ b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less @@ -0,0 +1,75 @@ + +.brewItem{ + position : relative; + display : inline-block; + vertical-align : top; + box-sizing : border-box; + box-sizing : border-box; + overflow : hidden; + width : 48%; + min-height : 105px; + margin-right : 15px; + margin-bottom : 15px; + padding : 5px 15px 2px 8px; + padding-right : 15px; + border : 1px solid #c9ad6a; + border-radius : 5px; + -webkit-column-break-inside : avoid; + page-break-inside : avoid; + break-inside : avoid; + .text { + min-height : 54px; + h4{ + margin-bottom : 5px; + font-size : 2.2em; + } + } + .info{ + position: initial; + bottom: 2px; + font-family : ScalySans; + font-size : 1.2em; + &>span{ + margin-right : 12px; + line-height : 1.5em; + } + } + &:hover{ + .links{ + opacity : 1; + } + } + &:nth-child(2n + 1){ + margin-right : 0px; + } + .links{ + .animate(opacity); + position : absolute; + top : 0px; + right : 0px; + height : 100%; + width : 2em; + opacity : 0; + background-color : fade(black, 60%); + text-align : center; + a{ + .animate(opacity); + display : block; + margin : 8px 0px; + opacity : 0.6; + font-size : 1.3em; + color : white; + &:hover{ + opacity : 1; + } + i{ + cursor : pointer; + } + } + } + .googleDriveIcon { + height : 20px; + padding : 0px; + margin : -5px; + } +} diff --git a/client/homebrew/pages/basePages/listPage/listPage.jsx b/client/homebrew/pages/basePages/listPage/listPage.jsx new file mode 100644 index 000000000..e4beb4a94 --- /dev/null +++ b/client/homebrew/pages/basePages/listPage/listPage.jsx @@ -0,0 +1,189 @@ +require('./listPage.less'); +const React = require('react'); +const createClass = require('create-react-class'); +const _ = require('lodash'); +const cx = require('classnames'); + +const moment = require('moment'); + +const Nav = require('naturalcrit/nav/nav.jsx'); +const Navbar = require('../../../navbar/navbar.jsx'); + +const RecentNavItem = require('../../../navbar/recent.navitem.jsx').both; +const Account = require('../../../navbar/account.navitem.jsx'); +const NewBrew = require('../../../navbar/newbrew.navitem.jsx'); +const BrewItem = require('./brewItem/brewItem.jsx'); +const ReportIssue = require('../../../navbar/issue.navitem.jsx'); + +// const brew = { +// title : 'SUPER Long title woah now', +// authors : [] +// }; + +//const BREWS = _.times(25, ()=>{ return brew;}); + + +const ListPage = createClass({ + getDefaultProps : function() { + return { + brewCollection : [ + { + title : '', + class : '', + brews : [] + } + ] + }; + }, + getInitialState : function() { + return { + sortType : 'alpha', + sortDir : 'asc', + filterString : '' + }; + }, + + renderBrews : function(brews){ + if(!brews || !brews.length) return
No Brews.
; + + const sortedBrews = this.sortBrews(brews); + + return _.map(sortedBrews, (brew, idx)=>{ + return ; + }); + }, + + sortBrewOrder : function(brew){ + if(!brew.title){brew.title = 'No Title';} + const mapping = { + 'alpha' : _.deburr(brew.title.toLowerCase()), + 'created' : moment(brew.createdAt).format(), + 'updated' : moment(brew.updatedAt).format(), + 'views' : brew.views, + 'latest' : moment(brew.lastViewed).format() + }; + return mapping[this.state.sortType]; + }, + + sortBrews : function(brews){ + return _.orderBy(brews, (brew)=>{ return this.sortBrewOrder(brew); }, this.state.sortDir); + }, + + handleSortOptionChange : function(event){ + this.setState({ + sortType : event.target.value + }); + }, + + handleSortDirChange : function(event){ + this.setState({ + sortDir : `${(this.state.sortDir == 'asc' ? 'desc' : 'asc')}` + }); + }, + + renderSortOption : function(sortTitle, sortValue){ + return + + ; + }, + + handleFilterTextChange : function(e){ + this.setState({ + filterString : e.target.value + }); + return; + }, + + renderFilterOption : function(){ + return + + ; + }, + + renderSortOptions : function(){ + return
+ + + + + {this.renderSortOption('Title', 'alpha')} + {this.renderSortOption('Created Date', 'created')} + {this.renderSortOption('Updated Date', 'updated')} + {this.renderSortOption('Views', 'views')} + {/* {this.renderSortOption('Latest', 'latest')} */} + + + {this.renderFilterOption()} + + +
+
Sort by :
+
+
Direction :
+
+ +
+
; + }, + + getSortedBrews : function(brewCollection){ + const testString = _.deburr(this.state.filterString).toLowerCase(); + const brews = this.state.filterString ? _.filter(brewCollection.brews, (brew)=>{ + return (_.deburr(brew.title).toLowerCase().includes(testString)) || + (_.deburr(brew.description).toLowerCase().includes(testString)); + }) : this.props.brewCollection.brews; + return _.groupBy(brews, (brew)=>{ + return (brew.published ? 'published' : 'private'); + }); + }, + + renderBrewCollection : function(brewCollection){ + return _.map(brewCollection, (brewItem, idx)=>{ + return
+

{brewItem.title || 'No Title'}

+ {this.renderBrews(brewItem.brews)} +
; + }); + }, + + render : function(){ + return
+ + + + + + + + + + +
+
+ {this.renderSortOptions()} + {this.renderBrewCollection(this.props.brewCollection)} +
+
+
; + } +}); + +module.exports = ListPage; diff --git a/client/homebrew/pages/basePages/listPage/listPage.less b/client/homebrew/pages/basePages/listPage/listPage.less new file mode 100644 index 000000000..6be946404 --- /dev/null +++ b/client/homebrew/pages/basePages/listPage/listPage.less @@ -0,0 +1,77 @@ + +.noColumns(){ + column-count : auto; + column-fill : auto; + column-gap : auto; + column-width : auto; + -webkit-column-count : auto; + -moz-column-count : auto; + -webkit-column-width : auto; + -moz-column-width : auto; + -webkit-column-gap : auto; + -moz-column-gap : auto; +} +.listPage{ + .content{ + overflow-y : scroll; + .phb{ + .noColumns(); + height : auto; + min-height : 279.4mm; + margin : 20px auto; + &::after{ + display : none; + } + .noBrews{ + margin : 10px 0px; + font-size : 1.3em; + font-style : italic; + } + + } + } + .sort-container{ + font-family : 'Open Sans', sans-serif; + position : fixed; + top : 35px; + left : calc(50vw - 408px); + border : 2px solid #58180D; + width : 800px; + background-color : #EEE5CE; + padding : 2px; + text-align : center; + z-index : 15; + h6{ + text-transform : uppercase; + font-family : 'Open Sans', sans-serif; + font-size : 11px; + font-weight : bold; + color : #58180D; + } + table{ + margin : 0px; + vertical-align : middle; + tbody tr{ + background-color: transparent !important; + i{ + padding-right : 5px + } + button{ + background-color : transparent; + color : #58180D; + font-family : 'Open Sans', sans-serif; + font-size : 11px; + text-transform : uppercase; + font-weight : normal; + &.active{ + font-weight : bold; + border : 2px solid #58180D; + } + &.sortDir{ + width : 75px; + } + } + } + } + } +} diff --git a/client/homebrew/pages/userPage/userPage.jsx b/client/homebrew/pages/userPage/userPage.jsx index bd84ce6b5..db069a7ac 100644 --- a/client/homebrew/pages/userPage/userPage.jsx +++ b/client/homebrew/pages/userPage/userPage.jsx @@ -4,16 +4,7 @@ const createClass = require('create-react-class'); const _ = require('lodash'); const cx = require('classnames'); -const moment = require('moment'); - -const Nav = require('naturalcrit/nav/nav.jsx'); -const Navbar = require('../../navbar/navbar.jsx'); - -const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; -const Account = require('../../navbar/account.navitem.jsx'); -const NewBrew = require('../../navbar/newbrew.navitem.jsx'); -const BrewItem = require('./brewItem/brewItem.jsx'); -const ReportIssue = require('../../navbar/issue.navitem.jsx'); +const ListPage = require('../basePages/listPage/listPage.jsx'); // const brew = { // title : 'SUPER Long title woah now', @@ -43,114 +34,8 @@ const UserPage = createClass({ return `${this.props.username}'s`; }, - renderBrews : function(brews){ - if(!brews || !brews.length) return
No Brews.
; - - const sortedBrews = this.sortBrews(brews); - - return _.map(sortedBrews, (brew, idx)=>{ - return ; - }); - }, - - sortBrewOrder : function(brew){ - if(!brew.title){brew.title = 'No Title';} - const mapping = { - 'alpha' : _.deburr(brew.title.toLowerCase()), - 'created' : moment(brew.createdAt).format(), - 'updated' : moment(brew.updatedAt).format(), - 'views' : brew.views, - 'latest' : moment(brew.lastViewed).format() - }; - return mapping[this.state.sortType]; - }, - - sortBrews : function(brews){ - return _.orderBy(brews, (brew)=>{ return this.sortBrewOrder(brew); }, this.state.sortDir); - }, - - handleSortOptionChange : function(event){ - this.setState({ - sortType : event.target.value - }); - }, - - handleSortDirChange : function(event){ - this.setState({ - sortDir : `${(this.state.sortDir == 'asc' ? 'desc' : 'asc')}` - }); - }, - - renderSortOption : function(sortTitle, sortValue){ - return - - ; - }, - - handleFilterTextChange : function(e){ - this.setState({ - filterString : e.target.value - }); - return; - }, - - renderFilterOption : function(){ - return - - ; - }, - - renderSortOptions : function(){ - return
- - - - - {this.renderSortOption('Title', 'alpha')} - {this.renderSortOption('Created Date', 'created')} - {this.renderSortOption('Updated Date', 'updated')} - {this.renderSortOption('Views', 'views')} - {/* {this.renderSortOption('Latest', 'latest')} */} - - - {this.renderFilterOption()} - - -
-
Sort by :
-
-
Direction :
-
- -
-
; - }, - getSortedBrews : function(){ - const testString = _.deburr(this.state.filterString).toLowerCase(); - const brewCollection = this.state.filterString ? _.filter(this.props.brews, (brew)=>{ - return (_.deburr(brew.title).toLowerCase().includes(testString)) || - (_.deburr(brew.description).toLowerCase().includes(testString)); - }) : this.props.brews; - return _.groupBy(brewCollection, (brew)=>{ + return _.groupBy(this.props.brews, (brew)=>{ return (brew.published ? 'published' : 'private'); }); }, @@ -158,33 +43,24 @@ const UserPage = createClass({ render : function(){ const brews = this.getSortedBrews(); - return
- - - - - - - - - + const brewCollections = [ + { + title : `${this.getUsernameWithS()} published brews`, + class : 'published', + brews : brews.published + } + ]; + if(this.props.username == global.account?.username){ + brewCollections.push( + { + title : `${this.getUsernameWithS()} unpublished brews`, + class : 'unpublished', + brews : brews.private + } + ); + } -
-
- {this.renderSortOptions()} -
-

{this.getUsernameWithS()} published brews

- {this.renderBrews(brews.published)} -
- {this.props.username == global.account?.username && -
-

{this.getUsernameWithS()} unpublished brews

- {this.renderBrews(brews.private)} -
- } -
-
-
; + return ; } }); From 4fc0bbc9d7f079f8255aea4ed8a36b11ff49ec01 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 4 Nov 2021 11:44:05 +1300 Subject: [PATCH 02/86] Remove unnecessary `userPage.less` --- client/homebrew/pages/userPage/userPage.jsx | 2 +- client/homebrew/pages/userPage/userPage.less | 77 -------------------- 2 files changed, 1 insertion(+), 78 deletions(-) delete mode 100644 client/homebrew/pages/userPage/userPage.less diff --git a/client/homebrew/pages/userPage/userPage.jsx b/client/homebrew/pages/userPage/userPage.jsx index db069a7ac..708f45a61 100644 --- a/client/homebrew/pages/userPage/userPage.jsx +++ b/client/homebrew/pages/userPage/userPage.jsx @@ -1,4 +1,4 @@ -require('./userPage.less'); +//require('./userPage.less'); const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); diff --git a/client/homebrew/pages/userPage/userPage.less b/client/homebrew/pages/userPage/userPage.less deleted file mode 100644 index d968aab9a..000000000 --- a/client/homebrew/pages/userPage/userPage.less +++ /dev/null @@ -1,77 +0,0 @@ - -.noColumns(){ - column-count : auto; - column-fill : auto; - column-gap : auto; - column-width : auto; - -webkit-column-count : auto; - -moz-column-count : auto; - -webkit-column-width : auto; - -moz-column-width : auto; - -webkit-column-gap : auto; - -moz-column-gap : auto; -} -.userPage{ - .content{ - overflow-y : scroll; - .phb{ - .noColumns(); - height : auto; - min-height : 279.4mm; - margin : 20px auto; - &::after{ - display : none; - } - .noBrews{ - margin : 10px 0px; - font-size : 1.3em; - font-style : italic; - } - - } - } - .sort-container{ - font-family : 'Open Sans', sans-serif; - position : fixed; - top : 35px; - left : calc(50vw - 408px); - border : 2px solid #58180D; - width : 800px; - background-color : #EEE5CE; - padding : 2px; - text-align : center; - z-index : 15; - h6{ - text-transform : uppercase; - font-family : 'Open Sans', sans-serif; - font-size : 11px; - font-weight : bold; - color : #58180D; - } - table{ - margin : 0px; - vertical-align : middle; - tbody tr{ - background-color: transparent !important; - i{ - padding-right : 5px - } - button{ - background-color : transparent; - color : #58180D; - font-family : 'Open Sans', sans-serif; - font-size : 11px; - text-transform : uppercase; - font-weight : normal; - &.active{ - font-weight : bold; - border : 2px solid #58180D; - } - &.sortDir{ - width : 75px; - } - } - } - } - } -} From fe708e0a0bb09a7badb88dcdc50c9ca3569bb07d Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 4 Nov 2021 11:44:41 +1300 Subject: [PATCH 03/86] Remove line rather than comment it out --- client/homebrew/pages/userPage/userPage.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/client/homebrew/pages/userPage/userPage.jsx b/client/homebrew/pages/userPage/userPage.jsx index 708f45a61..1168e0982 100644 --- a/client/homebrew/pages/userPage/userPage.jsx +++ b/client/homebrew/pages/userPage/userPage.jsx @@ -1,4 +1,3 @@ -//require('./userPage.less'); const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); From 6cd56dfd6213011969937e962e0b0ca5d8109d97 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 4 Nov 2021 14:03:57 +1300 Subject: [PATCH 04/86] Initial pass at `editorPage.jsx`. --- .../pages/basePages/editorPage/editorPage.jsx | 578 ++++++++++++++++++ .../basePages/editorPage/editorPage.less | 99 +++ client/homebrew/pages/editPage/editPage.jsx | 454 +------------- client/homebrew/pages/newPage/newPage.jsx | 250 +------- 4 files changed, 695 insertions(+), 686 deletions(-) create mode 100644 client/homebrew/pages/basePages/editorPage/editorPage.jsx create mode 100644 client/homebrew/pages/basePages/editorPage/editorPage.less diff --git a/client/homebrew/pages/basePages/editorPage/editorPage.jsx b/client/homebrew/pages/basePages/editorPage/editorPage.jsx new file mode 100644 index 000000000..99a5c2b52 --- /dev/null +++ b/client/homebrew/pages/basePages/editorPage/editorPage.jsx @@ -0,0 +1,578 @@ +/* eslint-disable max-lines */ +require('./editorPage.less'); +const React = require('react'); +const createClass = require('create-react-class'); +const _ = require('lodash'); +const request = require('superagent'); +const { Meta } = require('vitreum/headtags'); + +const Nav = require('naturalcrit/nav/nav.jsx'); +const Navbar = require('../../../navbar/navbar.jsx'); + +const NewBrew = require('../../../navbar/newbrew.navitem.jsx'); +const ReportIssue = require('../../../navbar/issue.navitem.jsx'); +const PrintLink = require('../../../navbar/print.navitem.jsx'); +const Account = require('../../../navbar/account.navitem.jsx'); +const RecentNavItem = require('../../../navbar/recent.navitem.jsx').both; + +const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); +const Editor = require('../../../editor/editor.jsx'); +const BrewRenderer = require('../../../brewRenderer/brewRenderer.jsx'); + +const Markdown = require('naturalcrit/markdown.js'); + +const googleDriveActive = require('../../../googleDrive.png'); +const googleDriveInactive = require('../../../googleDriveMono.png'); + +const SAVE_TIMEOUT = 3000; + +const BREWKEY = 'homebrewery-new'; +const STYLEKEY = 'homebrewery-new-style'; +const METAKEY = 'homebrewery-new-meta'; + +const EditorPage = createClass({ + getDefaultProps : function() { + return { + brew : { + text : '', + style : '', + shareId : null, + editId : null, + createdAt : null, + updatedAt : null, + gDrive : false, + trashed : false, + + title : '', + description : '', + tags : '', + published : false, + authors : [], + systems : [], + renderer : 'legacy' + }, + pageType : 'edit', + googleDriveOptions : [ + 'DRIVE > HB', + 'HB > DRIVE' + ] + }; + }, + + getInitialState : function() { + return { + brew : this.props.brew, + isSaving : false, + isPending : false, + alertTrashedGoogleBrew : this.props.brew.trashed, + alertLoginToTransfer : false, + saveGoogle : this.props.brew.googleId ? true : false, + confirmGoogleTransfer : false, + errors : null, + htmlErrors : Markdown.validate(this.props.brew.text), + url : '' + }; + // return { + // brew : { + // text : brew.text || '', + // style : brew.style || undefined, + // gDrive : false, + // title : brew.title || '', + // description : brew.description || '', + // tags : brew.tags || '', + // published : false, + // authors : [], + // systems : brew.systems || [], + // renderer : brew.renderer || 'legacy' + // }, + + // isSaving : false, + // isPending : false, + // alertTrashedGoogleBrew : this.props.brew.trashed, + // alertLoginToTransfer : false, + // saveGoogle : (global.account && global.account.googleId ? true : false), + // confirmGoogleTransfer : false, + // errors : null, + // htmlErrors : Markdown.validate(brew.text), + // url : '' + // }; + }, + savedBrew : null, + + componentDidMount : function(){ + this.setState({ + url : window.location.href + }); + + this.savedBrew = JSON.parse(JSON.stringify(this.props.brew)); //Deep copy + + this.trySave(); + window.onbeforeunload = ()=>{ + if(this.state.isSaving || this.state.isPending){ + return 'You have unsaved changes!'; + } + }; + + this.setState((prevState)=>({ + htmlErrors : Markdown.validate(prevState.brew.text) + })); + + document.addEventListener('keydown', this.handleControlKeys); + }, + componentWillUnmount : function() { + window.onbeforeunload = function(){}; + document.removeEventListener('keydown', this.handleControlKeys); + }, + + handleControlKeys : function(e){ + if(!(e.ctrlKey || e.metaKey)) return; + const S_KEY = 83; + const P_KEY = 80; + if(e.keyCode == S_KEY) this.save(); + if(e.keyCode == P_KEY) window.open(`/print/${this.processShareId()}?dialog=true`, '_blank').focus(); + if(e.keyCode == P_KEY || e.keyCode == S_KEY){ + e.stopPropagation(); + e.preventDefault(); + } + }, + + isEdit : function(){ + return this.props.pageType == 'edit'; + }, + + isNew : function(){ + return this.props.pageType == 'new'; + }, + + handleSplitMove : function(){ + this.refs.editor.update(); + }, + + handleTextChange : function(text){ + //If there are errors, run the validator on every change to give quick feedback + let htmlErrors = this.state.htmlErrors; + if(htmlErrors.length) htmlErrors = Markdown.validate(text); + + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { text: text }), + isPending : true, + htmlErrors : htmlErrors + }), ()=>this.trySave()); + }, + + handleStyleChange : function(style){ + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { style: style }), + isPending : true + }), ()=>this.trySave()); + }, + + handleMetaChange : function(metadata){ + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, metadata), + isPending : true, + }), ()=>this.trySave()); + + }, + + hasChanges : function(){ + return !_.isEqual(this.state.brew, this.savedBrew); + }, + + trySave : function(){ + if(!this.isEdit()) return; + if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); + if(this.hasChanges()){ + this.debounceSave(); + } else { + this.debounceSave.cancel(); + } + }, + + handleGoogleClick : function(){ + if(!global.account?.googleId) { + this.setState({ + alertLoginToTransfer : true + }); + return; + } + this.setState((prevState)=>({ + confirmGoogleTransfer : !prevState.confirmGoogleTransfer + })); + this.clearErrors(); + }, + + closeAlerts : function(event){ + event.stopPropagation(); //Only handle click once so alert doesn't reopen + this.setState({ + alertTrashedGoogleBrew : false, + alertLoginToTransfer : false, + confirmGoogleTransfer : false + }); + }, + + toggleGoogleStorage : function(){ + this.setState((prevState)=>({ + saveGoogle : !prevState.saveGoogle, + isSaving : false, + errors : null + }), ()=>this.isEdit() && this.save()); + }, + + clearErrors : function(){ + this.setState({ + errors : null, + isSaving : false + + }); + }, + + save : async function(){ + this.setState((prevState)=>({ + isSaving : true, + errors : null, + htmlErrors : Markdown.validate(prevState.brew.text) + })); + + if(this.isEdit()){ + if(this.debounceSave && this.debounceSave.cancel) this.debounceSave.cancel(); + + const transfer = this.state.saveGoogle == _.isNil(this.state.brew.googleId); + + const brew = this.state.brew; + brew.pageCount = ((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; + + if(this.state.saveGoogle) { + if(transfer) { + const res = await request + .post('/api/newGoogle/') + .send(brew) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Transferring to Google!'); + this.setState({ errors: err, saveGoogle: false }); + }); + + if(!res) { return; } + + console.log('Deleting Local Copy'); + await request.delete(`/api/${brew.editId}`) + .send() + .catch((err)=>{ + console.log('Error deleting Local Copy'); + }); + + this.savedBrew = res.body; + history.replaceState(null, null, `/edit/${this.savedBrew.googleId}${this.savedBrew.editId}`); //update URL to match doc ID + } else { + const res = await request + .put(`/api/updateGoogle/${brew.editId}`) + .send(brew) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Saving to Google!'); + this.setState({ errors: err }); + return; + }); + + this.savedBrew = res.body; + } + } else { + if(transfer) { + const res = await request.post('/api') + .send(brew) + .catch((err)=>{ + console.log('Error creating Local Copy'); + this.setState({ errors: err }); + return; + }); + + await request.get(`/api/removeGoogle/${brew.googleId}${brew.editId}`) + .send() + .catch((err)=>{ + console.log('Error Deleting Google Brew'); + }); + + this.savedBrew = res.body; + history.replaceState(null, null, `/edit/${this.savedBrew.editId}`); //update URL to match doc ID + } else { + const res = await request + .put(`/api/update/${brew.editId}`) + .send(brew) + .catch((err)=>{ + console.log('Error Updating Local Brew'); + this.setState({ errors: err }); + return; + }); + + this.savedBrew = res.body; + } + } + + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { + googleId : this.savedBrew.googleId ? this.savedBrew.googleId : null, + editId : this.savedBrew.editId, + shareId : this.savedBrew.shareId + }), + isPending : false, + isSaving : false, + })); + } + + if(this.isNew()){ + console.log('saving new brew'); + + let brew = this.state.brew; + // Split out CSS to Style if CSS codefence exists + if(brew.text.startsWith('```css') && brew.text.indexOf('```\n\n') > 0) { + const index = brew.text.indexOf('```\n\n'); + brew.style = `${brew.style ? `${brew.style}\n` : ''}${brew.text.slice(7, index - 1)}`; + brew.text = brew.text.slice(index + 5); + }; + + brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; + + if(this.state.saveGoogle) { + const res = await request + .post('/api/newGoogle/') + .send(brew) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Creating New Google Brew!'); + this.setState({ isSaving: false, errors: err }); + return; + }); + + brew = res.body; + localStorage.removeItem(BREWKEY); + localStorage.removeItem(STYLEKEY); + localStorage.removeItem(METAKEY); + window.location = `/edit/${brew.googleId}${brew.editId}`; + } else { + request.post('/api') + .send(brew) + .end((err, res)=>{ + if(err){ + this.setState({ + isSaving : false + }); + return; + } + window.onbeforeunload = function(){}; + brew = res.body; + localStorage.removeItem(BREWKEY); + localStorage.removeItem(STYLEKEY); + localStorage.removeItem(METAKEY); + window.location = `/edit/${brew.editId}`; + }); + } + } + }, + + renderGoogleDriveIcon : function(){ + return + {this.state.saveGoogle + ? googleDriveActive + : googleDriveInactive + } + + {this.state.confirmGoogleTransfer && +
+ { this.state.saveGoogle + ? this.props.googleDriveOptions[0] + : this.props.googleDriveOptions[1] + } +
+
+ Yes +
+
+ No +
+
+ } + + {this.state.alertLoginToTransfer && +
+ You must be signed in to a Google account to transfer + between the homebrewery and Google Drive! + +
+ Sign In +
+
+
+ Not Now +
+
+ } +
; + }, + + renderSaveButton : function(){ + if(this.state.errors){ + let errMsg = ''; + try { + errMsg += `${this.state.errors.toString()}\n\n`; + errMsg += `\`\`\`\n${this.state.errors.stack}\n`; + errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``; + console.log(errMsg); + } catch (e){} + + if(this.state.errors.status == '401'){ + return + Oops! +
+ You must be signed in to a Google account + to save this to
Google Drive!
+ +
+ Sign In +
+
+
+ Not Now +
+
+
; + } + + if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ + return + Oops! +
+ Looks like your Google credentials have + expired! Visit the log in page to sign out + and sign back in with Google + to save this to Google Drive! + +
+ Sign In +
+
+
+ Not Now +
+
+
; + } + + return + Oops! +
+ Looks like there was a problem saving.
+ Report the issue + here + . +
+
; + } + + if(this.state.isSaving){ + return saving...; + } + if(this.state.isPending && this.hasChanges()){ + return Save Now; + } + if(!this.state.isPending && !this.state.isSaving){ + return saved.; + } + }, + + processShareId : function() { + return this.state.brew.googleId ? + this.state.brew.googleId + this.state.brew.shareId : + this.state.brew.shareId; + }, + + getRedditLink : function(){ + + const shareLink = this.processShareId(); + const systems = this.props.brew.systems.length > 0 ? ` [${this.props.brew.systems.join(' - ')}]` : ''; + const title = `${this.props.brew.title} ${systems}`; + const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. + +**[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; + + return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title)}&text=${encodeURIComponent(text)}`; + }, + + renderNavbar : function(){ + const shareLink = this.processShareId(); + + return + + {this.state.alertTrashedGoogleBrew && +
+ This brew is currently in your Trash folder on Google Drive!
If you want to keep it, make sure to move it before it is deleted permanently!
+
+ OK +
+
+ } + + + {this.state.brew.title} + + + + {this.renderGoogleDriveIcon()} + {this.renderSaveButton()} + + + {this.isEdit() && <> + + + share + + + view + + {navigator.clipboard.writeText(`https://homebrewery.naturalcrit.com/share/${shareLink}`);}}> + copy url + + + post to reddit + + + + + } + + + + +
; + }, + + render : function(){ + return
+ + {this.renderNavbar()} + +
+ + + + +
+
; + } +}); + +module.exports = EditorPage; diff --git a/client/homebrew/pages/basePages/editorPage/editorPage.less b/client/homebrew/pages/basePages/editorPage/editorPage.less new file mode 100644 index 000000000..0cbfadcbd --- /dev/null +++ b/client/homebrew/pages/basePages/editorPage/editorPage.less @@ -0,0 +1,99 @@ +@keyframes glideDown { + 0% {transform : translate(-50% + 3px, 0px); + opacity : 0;} + 100% {transform : translate(-50% + 3px, 10px); + opacity : 1;} +} +.editPage{ + .navItem.save{ + width : 106px; + text-align : center; + position : relative; + &.saved{ + cursor : initial; + color : #666; + } + &.error{ + position : relative; + background-color : @red; + } + } + .googleDriveStorage { + position : relative; + } + .googleDriveStorage img{ + height : 20px; + padding : 0px; + margin : -5px; + } + .errorContainer{ + animation-name: glideDown; + animation-duration: 0.4s; + position : absolute; + top : 100%; + left : 50%; + z-index : 100000; + width : 140px; + padding : 3px; + color : white; + background-color : #333; + border : 3px solid #444; + border-radius : 5px; + transform : translate(-50% + 3px, 10px); + text-align : center; + font-size : 10px; + font-weight : 800; + text-transform : uppercase; + a{ + color : @teal; + } + &:before { + content: ""; + width: 0px; + height: 0px; + position: absolute; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 10px solid transparent; + border-bottom: 10px solid #444; + left: 53px; + top: -23px; + } + &:after { + content: ""; + width: 0px; + height: 0px; + position: absolute; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 10px solid transparent; + border-bottom: 10px solid #333; + left: 53px; + top: -19px; + } + .deny { + width : 48%; + margin : 1px; + padding : 5px; + background-color : #333; + display : inline-block; + border-left : 1px solid #666; + .animate(background-color); + &:hover{ + background-color : red; + } + } + .confirm { + width : 48%; + margin : 1px; + padding : 5px; + background-color : #333; + display : inline-block; + color : white; + .animate(background-color); + &:hover{ + background-color : teal; + } + } + } +} diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index ee4f41f5b..8e70cee32 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -3,28 +3,8 @@ require('./editPage.less'); const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); -const request = require('superagent'); -const { Meta } = require('vitreum/headtags'); -const Nav = require('naturalcrit/nav/nav.jsx'); -const Navbar = require('../../navbar/navbar.jsx'); - -const NewBrew = require('../../navbar/newbrew.navitem.jsx'); -const ReportIssue = require('../../navbar/issue.navitem.jsx'); -const PrintLink = require('../../navbar/print.navitem.jsx'); -const Account = require('../../navbar/account.navitem.jsx'); -const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; - -const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); -const Editor = require('../../editor/editor.jsx'); -const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); - -const Markdown = require('naturalcrit/markdown.js'); - -const googleDriveActive = require('../../googleDrive.png'); -const googleDriveInactive = require('../../googleDriveMono.png'); - -const SAVE_TIMEOUT = 3000; +const EditorPage = require('../basePages/editorPage/editorPage.jsx'); const EditPage = createClass({ getDefaultProps : function() { @@ -50,431 +30,17 @@ const EditPage = createClass({ }; }, - getInitialState : function() { - return { - brew : this.props.brew, - isSaving : false, - isPending : false, - alertTrashedGoogleBrew : this.props.brew.trashed, - alertLoginToTransfer : false, - saveGoogle : this.props.brew.googleId ? true : false, - confirmGoogleTransfer : false, - errors : null, - htmlErrors : Markdown.validate(this.props.brew.text), - url : '' - }; - }, - savedBrew : null, - - componentDidMount : function(){ - this.setState({ - url : window.location.href - }); - - this.savedBrew = JSON.parse(JSON.stringify(this.props.brew)); //Deep copy - - this.trySave(); - window.onbeforeunload = ()=>{ - if(this.state.isSaving || this.state.isPending){ - return 'You have unsaved changes!'; - } - }; - - this.setState((prevState)=>({ - htmlErrors : Markdown.validate(prevState.brew.text) - })); - - document.addEventListener('keydown', this.handleControlKeys); - }, - componentWillUnmount : function() { - window.onbeforeunload = function(){}; - document.removeEventListener('keydown', this.handleControlKeys); - }, - - handleControlKeys : function(e){ - if(!(e.ctrlKey || e.metaKey)) return; - const S_KEY = 83; - const P_KEY = 80; - if(e.keyCode == S_KEY) this.save(); - if(e.keyCode == P_KEY) window.open(`/print/${this.processShareId()}?dialog=true`, '_blank').focus(); - if(e.keyCode == P_KEY || e.keyCode == S_KEY){ - e.stopPropagation(); - e.preventDefault(); - } - }, - - handleSplitMove : function(){ - this.refs.editor.update(); - }, - - handleTextChange : function(text){ - //If there are errors, run the validator on every change to give quick feedback - let htmlErrors = this.state.htmlErrors; - if(htmlErrors.length) htmlErrors = Markdown.validate(text); - - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { text: text }), - isPending : true, - htmlErrors : htmlErrors - }), ()=>this.trySave()); - }, - - handleStyleChange : function(style){ - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { style: style }), - isPending : true - }), ()=>this.trySave()); - }, - - handleMetaChange : function(metadata){ - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, metadata), - isPending : true, - }), ()=>this.trySave()); - - }, - - hasChanges : function(){ - return !_.isEqual(this.state.brew, this.savedBrew); - }, - - trySave : function(){ - if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); - if(this.hasChanges()){ - this.debounceSave(); - } else { - this.debounceSave.cancel(); - } - }, - - handleGoogleClick : function(){ - if(!global.account?.googleId) { - this.setState({ - alertLoginToTransfer : true - }); - return; - } - this.setState((prevState)=>({ - confirmGoogleTransfer : !prevState.confirmGoogleTransfer - })); - this.clearErrors(); - }, - - closeAlerts : function(event){ - event.stopPropagation(); //Only handle click once so alert doesn't reopen - this.setState({ - alertTrashedGoogleBrew : false, - alertLoginToTransfer : false, - confirmGoogleTransfer : false - }); - }, - - toggleGoogleStorage : function(){ - this.setState((prevState)=>({ - saveGoogle : !prevState.saveGoogle, - isSaving : false, - errors : null - }), ()=>this.save()); - }, - - clearErrors : function(){ - this.setState({ - errors : null, - isSaving : false - - }); - }, - - save : async function(){ - if(this.debounceSave && this.debounceSave.cancel) this.debounceSave.cancel(); - - this.setState((prevState)=>({ - isSaving : true, - errors : null, - htmlErrors : Markdown.validate(prevState.brew.text) - })); - - const transfer = this.state.saveGoogle == _.isNil(this.state.brew.googleId); - - const brew = this.state.brew; - brew.pageCount = ((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; - - if(this.state.saveGoogle) { - if(transfer) { - const res = await request - .post('/api/newGoogle/') - .send(brew) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Transferring to Google!'); - this.setState({ errors: err, saveGoogle: false }); - }); - - if(!res) { return; } - - console.log('Deleting Local Copy'); - await request.delete(`/api/${brew.editId}`) - .send() - .catch((err)=>{ - console.log('Error deleting Local Copy'); - }); - - this.savedBrew = res.body; - history.replaceState(null, null, `/edit/${this.savedBrew.googleId}${this.savedBrew.editId}`); //update URL to match doc ID - } else { - const res = await request - .put(`/api/updateGoogle/${brew.editId}`) - .send(brew) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Saving to Google!'); - this.setState({ errors: err }); - return; - }); - - this.savedBrew = res.body; - } - } else { - if(transfer) { - const res = await request.post('/api') - .send(brew) - .catch((err)=>{ - console.log('Error creating Local Copy'); - this.setState({ errors: err }); - return; - }); - - await request.get(`/api/removeGoogle/${brew.googleId}${brew.editId}`) - .send() - .catch((err)=>{ - console.log('Error Deleting Google Brew'); - }); - - this.savedBrew = res.body; - history.replaceState(null, null, `/edit/${this.savedBrew.editId}`); //update URL to match doc ID - } else { - const res = await request - .put(`/api/update/${brew.editId}`) - .send(brew) - .catch((err)=>{ - console.log('Error Updating Local Brew'); - this.setState({ errors: err }); - return; - }); - - this.savedBrew = res.body; - } - } - - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { - googleId : this.savedBrew.googleId ? this.savedBrew.googleId : null, - editId : this.savedBrew.editId, - shareId : this.savedBrew.shareId - }), - isPending : false, - isSaving : false, - })); - }, - - renderGoogleDriveIcon : function(){ - return - {this.state.saveGoogle - ? googleDriveActive - : googleDriveInactive - } - - {this.state.confirmGoogleTransfer && -
- { this.state.saveGoogle - ? `Would you like to transfer this brew from your Google Drive storage back to the Homebrewery?` - : `Would you like to transfer this brew from the Homebrewery to your personal Google Drive storage?` - } -
-
- Yes -
-
- No -
-
- } - - {this.state.alertLoginToTransfer && -
- You must be signed in to a Google account to transfer - between the homebrewery and Google Drive! - -
- Sign In -
-
-
- Not Now -
-
- } -
; - }, - - renderSaveButton : function(){ - if(this.state.errors){ - let errMsg = ''; - try { - errMsg += `${this.state.errors.toString()}\n\n`; - errMsg += `\`\`\`\n${this.state.errors.stack}\n`; - errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``; - console.log(errMsg); - } catch (e){} - - if(this.state.errors.status == '401'){ - return - Oops! -
- You must be signed in to a Google account - to save this to
Google Drive!
- -
- Sign In -
-
-
- Not Now -
-
-
; - } - - if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ - return - Oops! -
- Looks like your Google credentials have - expired! Visit the log in page to sign out - and sign back in with Google - to save this to Google Drive! - -
- Sign In -
-
-
- Not Now -
-
-
; - } - - return - Oops! -
- Looks like there was a problem saving.
- Report the issue - here - . -
-
; - } - - if(this.state.isSaving){ - return saving...; - } - if(this.state.isPending && this.hasChanges()){ - return Save Now; - } - if(!this.state.isPending && !this.state.isSaving){ - return saved.; - } - }, - - processShareId : function() { - return this.state.brew.googleId ? - this.state.brew.googleId + this.state.brew.shareId : - this.state.brew.shareId; - }, - - getRedditLink : function(){ - - const shareLink = this.processShareId(); - const systems = this.props.brew.systems.length > 0 ? ` [${this.props.brew.systems.join(' - ')}]` : ''; - const title = `${this.props.brew.title} ${systems}`; - const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. - -**[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; - - return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title)}&text=${encodeURIComponent(text)}`; - }, - - renderNavbar : function(){ - const shareLink = this.processShareId(); - - return - - {this.state.alertTrashedGoogleBrew && -
- This brew is currently in your Trash folder on Google Drive!
If you want to keep it, make sure to move it before it is deleted permanently!
-
- OK -
-
- } - - - {this.state.brew.title} - - - - {this.renderGoogleDriveIcon()} - {this.renderSaveButton()} - - - - - share - - - view - - {navigator.clipboard.writeText(`https://homebrewery.naturalcrit.com/share/${shareLink}`);}}> - copy url - - - post to reddit - - - - - - - -
; - }, - render : function(){ - return
- - {this.renderNavbar()} + const googleDriveOptions = [ + 'Would you like to transfer this brew from your Google Drive storage back to the Homebrewery?', + 'Would you like to transfer this brew from the Homebrewery to your personal Google Drive storage?' + ]; -
- - - - -
-
; + return ; } }); diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 3f09cac4e..0e424a998 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -3,20 +3,11 @@ require('./newPage.less'); const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); -const request = require('superagent'); + +const EditorPage = require('../basePages/editorPage/editorPage.jsx'); const Markdown = require('naturalcrit/markdown.js'); -const Nav = require('naturalcrit/nav/nav.jsx'); -const Navbar = require('../../navbar/navbar.jsx'); -const AccountNavItem = require('../../navbar/account.navitem.jsx'); -const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; -const IssueNavItem = require('../../navbar/issue.navitem.jsx'); - -const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); -const Editor = require('../../editor/editor.jsx'); -const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); - const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; const METAKEY = 'homebrewery-new-meta'; @@ -82,238 +73,13 @@ const NewPage = createClass({ }; }, - componentDidMount : function() { - document.addEventListener('keydown', this.handleControlKeys); - }, - componentWillUnmount : function() { - document.removeEventListener('keydown', this.handleControlKeys); - }, - - handleControlKeys : function(e){ - if(!(e.ctrlKey || e.metaKey)) return; - const S_KEY = 83; - const P_KEY = 80; - if(e.keyCode == S_KEY) this.save(); - if(e.keyCode == P_KEY) this.print(); - if(e.keyCode == P_KEY || e.keyCode == S_KEY){ - e.stopPropagation(); - e.preventDefault(); - } - }, - - handleSplitMove : function(){ - this.refs.editor.update(); - }, - - handleTextChange : function(text){ - //If there are errors, run the validator on every change to give quick feedback - let htmlErrors = this.state.htmlErrors; - if(htmlErrors.length) htmlErrors = Markdown.validate(text); - - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { text: text }), - htmlErrors : htmlErrors - })); - localStorage.setItem(BREWKEY, text); - }, - - handleStyleChange : function(style){ - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { style: style }), - })); - localStorage.setItem(STYLEKEY, style); - }, - - handleMetaChange : function(metadata){ - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, metadata), - })); - localStorage.setItem(METAKEY, JSON.stringify({ - // 'title' : this.state.brew.title, - // 'description' : this.state.brew.description, - 'renderer' : this.state.brew.renderer - })); - }, - - clearErrors : function(){ - this.setState({ - errors : null, - isSaving : false - - }); - }, - - save : async function(){ - this.setState({ - isSaving : true - }); - - console.log('saving new brew'); - - let brew = this.state.brew; - // Split out CSS to Style if CSS codefence exists - if(brew.text.startsWith('```css') && brew.text.indexOf('```\n\n') > 0) { - const index = brew.text.indexOf('```\n\n'); - brew.style = `${brew.style ? `${brew.style}\n` : ''}${brew.text.slice(7, index - 1)}`; - brew.text = brew.text.slice(index + 5); - }; - - brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; - - if(this.state.saveGoogle) { - const res = await request - .post('/api/newGoogle/') - .send(brew) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Creating New Google Brew!'); - this.setState({ isSaving: false, errors: err }); - return; - }); - - brew = res.body; - localStorage.removeItem(BREWKEY); - localStorage.removeItem(STYLEKEY); - localStorage.removeItem(METAKEY); - window.location = `/edit/${brew.googleId}${brew.editId}`; - } else { - request.post('/api') - .send(brew) - .end((err, res)=>{ - if(err){ - this.setState({ - isSaving : false - }); - return; - } - window.onbeforeunload = function(){}; - brew = res.body; - localStorage.removeItem(BREWKEY); - localStorage.removeItem(STYLEKEY); - localStorage.removeItem(METAKEY); - window.location = `/edit/${brew.editId}`; - }); - } - }, - - renderSaveButton : function(){ - if(this.state.errors){ - let errMsg = ''; - try { - errMsg += `${this.state.errors.toString()}\n\n`; - errMsg += `\`\`\`\n${this.state.errors.stack}\n`; - errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``; - console.log(errMsg); - } catch (e){} - - if(this.state.errors.status == '401'){ - return - Oops! -
- You must be signed in to a Google account - to save this to
Google Drive!
- -
- Sign In -
-
-
- Not Now -
-
-
; - } - - if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ - return - Oops! -
- Looks like your Google credentials have - expired! Visit the log in page to sign out - and sign back in with Google - to save this to Google Drive! - -
- Sign In -
-
-
- Not Now -
-
-
; - } - - return - Oops! -
- Looks like there was a problem saving.
- Report the issue - here - . -
-
; - } - - if(this.state.isSaving){ - return - save... - ; - } else { - return - save - ; - } - }, - - print : function(){ - window.open('/print?dialog=true&local=print', '_blank'); - }, - - renderLocalPrintButton : function(){ - return - get PDF - ; - }, - - renderNavbar : function(){ - return - - - {this.state.brew.title} - - - - {this.renderSaveButton()} - {this.renderLocalPrintButton()} - - - - - ; - }, - render : function(){ - return
- {this.renderNavbar()} -
- - - - -
-
; + const googleDriveOptions = [ + 'Set save location to the Homebrewery?', + 'Set save location to your personal Google Drive storage?' + ]; + + return ; } }); From f422b22af14898352054f915e2bd0b4895fec56e Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 4 Nov 2021 14:07:11 +1300 Subject: [PATCH 05/86] Revert "Initial pass at `editorPage.jsx`." This reverts commit 6cd56dfd6213011969937e962e0b0ca5d8109d97. --- .../pages/basePages/editorPage/editorPage.jsx | 578 ------------------ .../basePages/editorPage/editorPage.less | 99 --- client/homebrew/pages/editPage/editPage.jsx | 456 +++++++++++++- client/homebrew/pages/newPage/newPage.jsx | 250 +++++++- 4 files changed, 687 insertions(+), 696 deletions(-) delete mode 100644 client/homebrew/pages/basePages/editorPage/editorPage.jsx delete mode 100644 client/homebrew/pages/basePages/editorPage/editorPage.less diff --git a/client/homebrew/pages/basePages/editorPage/editorPage.jsx b/client/homebrew/pages/basePages/editorPage/editorPage.jsx deleted file mode 100644 index 99a5c2b52..000000000 --- a/client/homebrew/pages/basePages/editorPage/editorPage.jsx +++ /dev/null @@ -1,578 +0,0 @@ -/* eslint-disable max-lines */ -require('./editorPage.less'); -const React = require('react'); -const createClass = require('create-react-class'); -const _ = require('lodash'); -const request = require('superagent'); -const { Meta } = require('vitreum/headtags'); - -const Nav = require('naturalcrit/nav/nav.jsx'); -const Navbar = require('../../../navbar/navbar.jsx'); - -const NewBrew = require('../../../navbar/newbrew.navitem.jsx'); -const ReportIssue = require('../../../navbar/issue.navitem.jsx'); -const PrintLink = require('../../../navbar/print.navitem.jsx'); -const Account = require('../../../navbar/account.navitem.jsx'); -const RecentNavItem = require('../../../navbar/recent.navitem.jsx').both; - -const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); -const Editor = require('../../../editor/editor.jsx'); -const BrewRenderer = require('../../../brewRenderer/brewRenderer.jsx'); - -const Markdown = require('naturalcrit/markdown.js'); - -const googleDriveActive = require('../../../googleDrive.png'); -const googleDriveInactive = require('../../../googleDriveMono.png'); - -const SAVE_TIMEOUT = 3000; - -const BREWKEY = 'homebrewery-new'; -const STYLEKEY = 'homebrewery-new-style'; -const METAKEY = 'homebrewery-new-meta'; - -const EditorPage = createClass({ - getDefaultProps : function() { - return { - brew : { - text : '', - style : '', - shareId : null, - editId : null, - createdAt : null, - updatedAt : null, - gDrive : false, - trashed : false, - - title : '', - description : '', - tags : '', - published : false, - authors : [], - systems : [], - renderer : 'legacy' - }, - pageType : 'edit', - googleDriveOptions : [ - 'DRIVE > HB', - 'HB > DRIVE' - ] - }; - }, - - getInitialState : function() { - return { - brew : this.props.brew, - isSaving : false, - isPending : false, - alertTrashedGoogleBrew : this.props.brew.trashed, - alertLoginToTransfer : false, - saveGoogle : this.props.brew.googleId ? true : false, - confirmGoogleTransfer : false, - errors : null, - htmlErrors : Markdown.validate(this.props.brew.text), - url : '' - }; - // return { - // brew : { - // text : brew.text || '', - // style : brew.style || undefined, - // gDrive : false, - // title : brew.title || '', - // description : brew.description || '', - // tags : brew.tags || '', - // published : false, - // authors : [], - // systems : brew.systems || [], - // renderer : brew.renderer || 'legacy' - // }, - - // isSaving : false, - // isPending : false, - // alertTrashedGoogleBrew : this.props.brew.trashed, - // alertLoginToTransfer : false, - // saveGoogle : (global.account && global.account.googleId ? true : false), - // confirmGoogleTransfer : false, - // errors : null, - // htmlErrors : Markdown.validate(brew.text), - // url : '' - // }; - }, - savedBrew : null, - - componentDidMount : function(){ - this.setState({ - url : window.location.href - }); - - this.savedBrew = JSON.parse(JSON.stringify(this.props.brew)); //Deep copy - - this.trySave(); - window.onbeforeunload = ()=>{ - if(this.state.isSaving || this.state.isPending){ - return 'You have unsaved changes!'; - } - }; - - this.setState((prevState)=>({ - htmlErrors : Markdown.validate(prevState.brew.text) - })); - - document.addEventListener('keydown', this.handleControlKeys); - }, - componentWillUnmount : function() { - window.onbeforeunload = function(){}; - document.removeEventListener('keydown', this.handleControlKeys); - }, - - handleControlKeys : function(e){ - if(!(e.ctrlKey || e.metaKey)) return; - const S_KEY = 83; - const P_KEY = 80; - if(e.keyCode == S_KEY) this.save(); - if(e.keyCode == P_KEY) window.open(`/print/${this.processShareId()}?dialog=true`, '_blank').focus(); - if(e.keyCode == P_KEY || e.keyCode == S_KEY){ - e.stopPropagation(); - e.preventDefault(); - } - }, - - isEdit : function(){ - return this.props.pageType == 'edit'; - }, - - isNew : function(){ - return this.props.pageType == 'new'; - }, - - handleSplitMove : function(){ - this.refs.editor.update(); - }, - - handleTextChange : function(text){ - //If there are errors, run the validator on every change to give quick feedback - let htmlErrors = this.state.htmlErrors; - if(htmlErrors.length) htmlErrors = Markdown.validate(text); - - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { text: text }), - isPending : true, - htmlErrors : htmlErrors - }), ()=>this.trySave()); - }, - - handleStyleChange : function(style){ - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { style: style }), - isPending : true - }), ()=>this.trySave()); - }, - - handleMetaChange : function(metadata){ - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, metadata), - isPending : true, - }), ()=>this.trySave()); - - }, - - hasChanges : function(){ - return !_.isEqual(this.state.brew, this.savedBrew); - }, - - trySave : function(){ - if(!this.isEdit()) return; - if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); - if(this.hasChanges()){ - this.debounceSave(); - } else { - this.debounceSave.cancel(); - } - }, - - handleGoogleClick : function(){ - if(!global.account?.googleId) { - this.setState({ - alertLoginToTransfer : true - }); - return; - } - this.setState((prevState)=>({ - confirmGoogleTransfer : !prevState.confirmGoogleTransfer - })); - this.clearErrors(); - }, - - closeAlerts : function(event){ - event.stopPropagation(); //Only handle click once so alert doesn't reopen - this.setState({ - alertTrashedGoogleBrew : false, - alertLoginToTransfer : false, - confirmGoogleTransfer : false - }); - }, - - toggleGoogleStorage : function(){ - this.setState((prevState)=>({ - saveGoogle : !prevState.saveGoogle, - isSaving : false, - errors : null - }), ()=>this.isEdit() && this.save()); - }, - - clearErrors : function(){ - this.setState({ - errors : null, - isSaving : false - - }); - }, - - save : async function(){ - this.setState((prevState)=>({ - isSaving : true, - errors : null, - htmlErrors : Markdown.validate(prevState.brew.text) - })); - - if(this.isEdit()){ - if(this.debounceSave && this.debounceSave.cancel) this.debounceSave.cancel(); - - const transfer = this.state.saveGoogle == _.isNil(this.state.brew.googleId); - - const brew = this.state.brew; - brew.pageCount = ((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; - - if(this.state.saveGoogle) { - if(transfer) { - const res = await request - .post('/api/newGoogle/') - .send(brew) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Transferring to Google!'); - this.setState({ errors: err, saveGoogle: false }); - }); - - if(!res) { return; } - - console.log('Deleting Local Copy'); - await request.delete(`/api/${brew.editId}`) - .send() - .catch((err)=>{ - console.log('Error deleting Local Copy'); - }); - - this.savedBrew = res.body; - history.replaceState(null, null, `/edit/${this.savedBrew.googleId}${this.savedBrew.editId}`); //update URL to match doc ID - } else { - const res = await request - .put(`/api/updateGoogle/${brew.editId}`) - .send(brew) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Saving to Google!'); - this.setState({ errors: err }); - return; - }); - - this.savedBrew = res.body; - } - } else { - if(transfer) { - const res = await request.post('/api') - .send(brew) - .catch((err)=>{ - console.log('Error creating Local Copy'); - this.setState({ errors: err }); - return; - }); - - await request.get(`/api/removeGoogle/${brew.googleId}${brew.editId}`) - .send() - .catch((err)=>{ - console.log('Error Deleting Google Brew'); - }); - - this.savedBrew = res.body; - history.replaceState(null, null, `/edit/${this.savedBrew.editId}`); //update URL to match doc ID - } else { - const res = await request - .put(`/api/update/${brew.editId}`) - .send(brew) - .catch((err)=>{ - console.log('Error Updating Local Brew'); - this.setState({ errors: err }); - return; - }); - - this.savedBrew = res.body; - } - } - - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { - googleId : this.savedBrew.googleId ? this.savedBrew.googleId : null, - editId : this.savedBrew.editId, - shareId : this.savedBrew.shareId - }), - isPending : false, - isSaving : false, - })); - } - - if(this.isNew()){ - console.log('saving new brew'); - - let brew = this.state.brew; - // Split out CSS to Style if CSS codefence exists - if(brew.text.startsWith('```css') && brew.text.indexOf('```\n\n') > 0) { - const index = brew.text.indexOf('```\n\n'); - brew.style = `${brew.style ? `${brew.style}\n` : ''}${brew.text.slice(7, index - 1)}`; - brew.text = brew.text.slice(index + 5); - }; - - brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; - - if(this.state.saveGoogle) { - const res = await request - .post('/api/newGoogle/') - .send(brew) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Creating New Google Brew!'); - this.setState({ isSaving: false, errors: err }); - return; - }); - - brew = res.body; - localStorage.removeItem(BREWKEY); - localStorage.removeItem(STYLEKEY); - localStorage.removeItem(METAKEY); - window.location = `/edit/${brew.googleId}${brew.editId}`; - } else { - request.post('/api') - .send(brew) - .end((err, res)=>{ - if(err){ - this.setState({ - isSaving : false - }); - return; - } - window.onbeforeunload = function(){}; - brew = res.body; - localStorage.removeItem(BREWKEY); - localStorage.removeItem(STYLEKEY); - localStorage.removeItem(METAKEY); - window.location = `/edit/${brew.editId}`; - }); - } - } - }, - - renderGoogleDriveIcon : function(){ - return - {this.state.saveGoogle - ? googleDriveActive - : googleDriveInactive - } - - {this.state.confirmGoogleTransfer && -
- { this.state.saveGoogle - ? this.props.googleDriveOptions[0] - : this.props.googleDriveOptions[1] - } -
-
- Yes -
-
- No -
-
- } - - {this.state.alertLoginToTransfer && -
- You must be signed in to a Google account to transfer - between the homebrewery and Google Drive! - -
- Sign In -
-
-
- Not Now -
-
- } -
; - }, - - renderSaveButton : function(){ - if(this.state.errors){ - let errMsg = ''; - try { - errMsg += `${this.state.errors.toString()}\n\n`; - errMsg += `\`\`\`\n${this.state.errors.stack}\n`; - errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``; - console.log(errMsg); - } catch (e){} - - if(this.state.errors.status == '401'){ - return - Oops! -
- You must be signed in to a Google account - to save this to
Google Drive!
- -
- Sign In -
-
-
- Not Now -
-
-
; - } - - if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ - return - Oops! -
- Looks like your Google credentials have - expired! Visit the log in page to sign out - and sign back in with Google - to save this to Google Drive! - -
- Sign In -
-
-
- Not Now -
-
-
; - } - - return - Oops! -
- Looks like there was a problem saving.
- Report the issue - here - . -
-
; - } - - if(this.state.isSaving){ - return saving...; - } - if(this.state.isPending && this.hasChanges()){ - return Save Now; - } - if(!this.state.isPending && !this.state.isSaving){ - return saved.; - } - }, - - processShareId : function() { - return this.state.brew.googleId ? - this.state.brew.googleId + this.state.brew.shareId : - this.state.brew.shareId; - }, - - getRedditLink : function(){ - - const shareLink = this.processShareId(); - const systems = this.props.brew.systems.length > 0 ? ` [${this.props.brew.systems.join(' - ')}]` : ''; - const title = `${this.props.brew.title} ${systems}`; - const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. - -**[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; - - return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title)}&text=${encodeURIComponent(text)}`; - }, - - renderNavbar : function(){ - const shareLink = this.processShareId(); - - return - - {this.state.alertTrashedGoogleBrew && -
- This brew is currently in your Trash folder on Google Drive!
If you want to keep it, make sure to move it before it is deleted permanently!
-
- OK -
-
- } - - - {this.state.brew.title} - - - - {this.renderGoogleDriveIcon()} - {this.renderSaveButton()} - - - {this.isEdit() && <> - - - share - - - view - - {navigator.clipboard.writeText(`https://homebrewery.naturalcrit.com/share/${shareLink}`);}}> - copy url - - - post to reddit - - - - - } - - - - -
; - }, - - render : function(){ - return
- - {this.renderNavbar()} - -
- - - - -
-
; - } -}); - -module.exports = EditorPage; diff --git a/client/homebrew/pages/basePages/editorPage/editorPage.less b/client/homebrew/pages/basePages/editorPage/editorPage.less deleted file mode 100644 index 0cbfadcbd..000000000 --- a/client/homebrew/pages/basePages/editorPage/editorPage.less +++ /dev/null @@ -1,99 +0,0 @@ -@keyframes glideDown { - 0% {transform : translate(-50% + 3px, 0px); - opacity : 0;} - 100% {transform : translate(-50% + 3px, 10px); - opacity : 1;} -} -.editPage{ - .navItem.save{ - width : 106px; - text-align : center; - position : relative; - &.saved{ - cursor : initial; - color : #666; - } - &.error{ - position : relative; - background-color : @red; - } - } - .googleDriveStorage { - position : relative; - } - .googleDriveStorage img{ - height : 20px; - padding : 0px; - margin : -5px; - } - .errorContainer{ - animation-name: glideDown; - animation-duration: 0.4s; - position : absolute; - top : 100%; - left : 50%; - z-index : 100000; - width : 140px; - padding : 3px; - color : white; - background-color : #333; - border : 3px solid #444; - border-radius : 5px; - transform : translate(-50% + 3px, 10px); - text-align : center; - font-size : 10px; - font-weight : 800; - text-transform : uppercase; - a{ - color : @teal; - } - &:before { - content: ""; - width: 0px; - height: 0px; - position: absolute; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - border-top: 10px solid transparent; - border-bottom: 10px solid #444; - left: 53px; - top: -23px; - } - &:after { - content: ""; - width: 0px; - height: 0px; - position: absolute; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - border-top: 10px solid transparent; - border-bottom: 10px solid #333; - left: 53px; - top: -19px; - } - .deny { - width : 48%; - margin : 1px; - padding : 5px; - background-color : #333; - display : inline-block; - border-left : 1px solid #666; - .animate(background-color); - &:hover{ - background-color : red; - } - } - .confirm { - width : 48%; - margin : 1px; - padding : 5px; - background-color : #333; - display : inline-block; - color : white; - .animate(background-color); - &:hover{ - background-color : teal; - } - } - } -} diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 8e70cee32..ee4f41f5b 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -3,8 +3,28 @@ require('./editPage.less'); const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); +const request = require('superagent'); +const { Meta } = require('vitreum/headtags'); -const EditorPage = require('../basePages/editorPage/editorPage.jsx'); +const Nav = require('naturalcrit/nav/nav.jsx'); +const Navbar = require('../../navbar/navbar.jsx'); + +const NewBrew = require('../../navbar/newbrew.navitem.jsx'); +const ReportIssue = require('../../navbar/issue.navitem.jsx'); +const PrintLink = require('../../navbar/print.navitem.jsx'); +const Account = require('../../navbar/account.navitem.jsx'); +const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; + +const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); +const Editor = require('../../editor/editor.jsx'); +const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); + +const Markdown = require('naturalcrit/markdown.js'); + +const googleDriveActive = require('../../googleDrive.png'); +const googleDriveInactive = require('../../googleDriveMono.png'); + +const SAVE_TIMEOUT = 3000; const EditPage = createClass({ getDefaultProps : function() { @@ -30,17 +50,431 @@ const EditPage = createClass({ }; }, - render : function(){ - const googleDriveOptions = [ - 'Would you like to transfer this brew from your Google Drive storage back to the Homebrewery?', - 'Would you like to transfer this brew from the Homebrewery to your personal Google Drive storage?' - ]; + getInitialState : function() { + return { + brew : this.props.brew, + isSaving : false, + isPending : false, + alertTrashedGoogleBrew : this.props.brew.trashed, + alertLoginToTransfer : false, + saveGoogle : this.props.brew.googleId ? true : false, + confirmGoogleTransfer : false, + errors : null, + htmlErrors : Markdown.validate(this.props.brew.text), + url : '' + }; + }, + savedBrew : null, - return ; + componentDidMount : function(){ + this.setState({ + url : window.location.href + }); + + this.savedBrew = JSON.parse(JSON.stringify(this.props.brew)); //Deep copy + + this.trySave(); + window.onbeforeunload = ()=>{ + if(this.state.isSaving || this.state.isPending){ + return 'You have unsaved changes!'; + } + }; + + this.setState((prevState)=>({ + htmlErrors : Markdown.validate(prevState.brew.text) + })); + + document.addEventListener('keydown', this.handleControlKeys); + }, + componentWillUnmount : function() { + window.onbeforeunload = function(){}; + document.removeEventListener('keydown', this.handleControlKeys); + }, + + handleControlKeys : function(e){ + if(!(e.ctrlKey || e.metaKey)) return; + const S_KEY = 83; + const P_KEY = 80; + if(e.keyCode == S_KEY) this.save(); + if(e.keyCode == P_KEY) window.open(`/print/${this.processShareId()}?dialog=true`, '_blank').focus(); + if(e.keyCode == P_KEY || e.keyCode == S_KEY){ + e.stopPropagation(); + e.preventDefault(); + } + }, + + handleSplitMove : function(){ + this.refs.editor.update(); + }, + + handleTextChange : function(text){ + //If there are errors, run the validator on every change to give quick feedback + let htmlErrors = this.state.htmlErrors; + if(htmlErrors.length) htmlErrors = Markdown.validate(text); + + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { text: text }), + isPending : true, + htmlErrors : htmlErrors + }), ()=>this.trySave()); + }, + + handleStyleChange : function(style){ + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { style: style }), + isPending : true + }), ()=>this.trySave()); + }, + + handleMetaChange : function(metadata){ + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, metadata), + isPending : true, + }), ()=>this.trySave()); + + }, + + hasChanges : function(){ + return !_.isEqual(this.state.brew, this.savedBrew); + }, + + trySave : function(){ + if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); + if(this.hasChanges()){ + this.debounceSave(); + } else { + this.debounceSave.cancel(); + } + }, + + handleGoogleClick : function(){ + if(!global.account?.googleId) { + this.setState({ + alertLoginToTransfer : true + }); + return; + } + this.setState((prevState)=>({ + confirmGoogleTransfer : !prevState.confirmGoogleTransfer + })); + this.clearErrors(); + }, + + closeAlerts : function(event){ + event.stopPropagation(); //Only handle click once so alert doesn't reopen + this.setState({ + alertTrashedGoogleBrew : false, + alertLoginToTransfer : false, + confirmGoogleTransfer : false + }); + }, + + toggleGoogleStorage : function(){ + this.setState((prevState)=>({ + saveGoogle : !prevState.saveGoogle, + isSaving : false, + errors : null + }), ()=>this.save()); + }, + + clearErrors : function(){ + this.setState({ + errors : null, + isSaving : false + + }); + }, + + save : async function(){ + if(this.debounceSave && this.debounceSave.cancel) this.debounceSave.cancel(); + + this.setState((prevState)=>({ + isSaving : true, + errors : null, + htmlErrors : Markdown.validate(prevState.brew.text) + })); + + const transfer = this.state.saveGoogle == _.isNil(this.state.brew.googleId); + + const brew = this.state.brew; + brew.pageCount = ((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; + + if(this.state.saveGoogle) { + if(transfer) { + const res = await request + .post('/api/newGoogle/') + .send(brew) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Transferring to Google!'); + this.setState({ errors: err, saveGoogle: false }); + }); + + if(!res) { return; } + + console.log('Deleting Local Copy'); + await request.delete(`/api/${brew.editId}`) + .send() + .catch((err)=>{ + console.log('Error deleting Local Copy'); + }); + + this.savedBrew = res.body; + history.replaceState(null, null, `/edit/${this.savedBrew.googleId}${this.savedBrew.editId}`); //update URL to match doc ID + } else { + const res = await request + .put(`/api/updateGoogle/${brew.editId}`) + .send(brew) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Saving to Google!'); + this.setState({ errors: err }); + return; + }); + + this.savedBrew = res.body; + } + } else { + if(transfer) { + const res = await request.post('/api') + .send(brew) + .catch((err)=>{ + console.log('Error creating Local Copy'); + this.setState({ errors: err }); + return; + }); + + await request.get(`/api/removeGoogle/${brew.googleId}${brew.editId}`) + .send() + .catch((err)=>{ + console.log('Error Deleting Google Brew'); + }); + + this.savedBrew = res.body; + history.replaceState(null, null, `/edit/${this.savedBrew.editId}`); //update URL to match doc ID + } else { + const res = await request + .put(`/api/update/${brew.editId}`) + .send(brew) + .catch((err)=>{ + console.log('Error Updating Local Brew'); + this.setState({ errors: err }); + return; + }); + + this.savedBrew = res.body; + } + } + + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { + googleId : this.savedBrew.googleId ? this.savedBrew.googleId : null, + editId : this.savedBrew.editId, + shareId : this.savedBrew.shareId + }), + isPending : false, + isSaving : false, + })); + }, + + renderGoogleDriveIcon : function(){ + return + {this.state.saveGoogle + ? googleDriveActive + : googleDriveInactive + } + + {this.state.confirmGoogleTransfer && +
+ { this.state.saveGoogle + ? `Would you like to transfer this brew from your Google Drive storage back to the Homebrewery?` + : `Would you like to transfer this brew from the Homebrewery to your personal Google Drive storage?` + } +
+
+ Yes +
+
+ No +
+
+ } + + {this.state.alertLoginToTransfer && +
+ You must be signed in to a Google account to transfer + between the homebrewery and Google Drive! + +
+ Sign In +
+
+
+ Not Now +
+
+ } +
; + }, + + renderSaveButton : function(){ + if(this.state.errors){ + let errMsg = ''; + try { + errMsg += `${this.state.errors.toString()}\n\n`; + errMsg += `\`\`\`\n${this.state.errors.stack}\n`; + errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``; + console.log(errMsg); + } catch (e){} + + if(this.state.errors.status == '401'){ + return + Oops! +
+ You must be signed in to a Google account + to save this to
Google Drive!
+ +
+ Sign In +
+
+
+ Not Now +
+
+
; + } + + if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ + return + Oops! +
+ Looks like your Google credentials have + expired! Visit the log in page to sign out + and sign back in with Google + to save this to Google Drive! + +
+ Sign In +
+
+
+ Not Now +
+
+
; + } + + return + Oops! +
+ Looks like there was a problem saving.
+ Report the issue + here + . +
+
; + } + + if(this.state.isSaving){ + return saving...; + } + if(this.state.isPending && this.hasChanges()){ + return Save Now; + } + if(!this.state.isPending && !this.state.isSaving){ + return saved.; + } + }, + + processShareId : function() { + return this.state.brew.googleId ? + this.state.brew.googleId + this.state.brew.shareId : + this.state.brew.shareId; + }, + + getRedditLink : function(){ + + const shareLink = this.processShareId(); + const systems = this.props.brew.systems.length > 0 ? ` [${this.props.brew.systems.join(' - ')}]` : ''; + const title = `${this.props.brew.title} ${systems}`; + const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. + +**[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; + + return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title)}&text=${encodeURIComponent(text)}`; + }, + + renderNavbar : function(){ + const shareLink = this.processShareId(); + + return + + {this.state.alertTrashedGoogleBrew && +
+ This brew is currently in your Trash folder on Google Drive!
If you want to keep it, make sure to move it before it is deleted permanently!
+
+ OK +
+
+ } + + + {this.state.brew.title} + + + + {this.renderGoogleDriveIcon()} + {this.renderSaveButton()} + + + + + share + + + view + + {navigator.clipboard.writeText(`https://homebrewery.naturalcrit.com/share/${shareLink}`);}}> + copy url + + + post to reddit + + + + + + + +
; + }, + + render : function(){ + return
+ + {this.renderNavbar()} + +
+ + + + +
+
; } }); diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 0e424a998..3f09cac4e 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -3,11 +3,20 @@ require('./newPage.less'); const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); - -const EditorPage = require('../basePages/editorPage/editorPage.jsx'); +const request = require('superagent'); const Markdown = require('naturalcrit/markdown.js'); +const Nav = require('naturalcrit/nav/nav.jsx'); +const Navbar = require('../../navbar/navbar.jsx'); +const AccountNavItem = require('../../navbar/account.navitem.jsx'); +const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; +const IssueNavItem = require('../../navbar/issue.navitem.jsx'); + +const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); +const Editor = require('../../editor/editor.jsx'); +const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); + const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; const METAKEY = 'homebrewery-new-meta'; @@ -73,13 +82,238 @@ const NewPage = createClass({ }; }, - render : function(){ - const googleDriveOptions = [ - 'Set save location to the Homebrewery?', - 'Set save location to your personal Google Drive storage?' - ]; + componentDidMount : function() { + document.addEventListener('keydown', this.handleControlKeys); + }, + componentWillUnmount : function() { + document.removeEventListener('keydown', this.handleControlKeys); + }, - return ; + handleControlKeys : function(e){ + if(!(e.ctrlKey || e.metaKey)) return; + const S_KEY = 83; + const P_KEY = 80; + if(e.keyCode == S_KEY) this.save(); + if(e.keyCode == P_KEY) this.print(); + if(e.keyCode == P_KEY || e.keyCode == S_KEY){ + e.stopPropagation(); + e.preventDefault(); + } + }, + + handleSplitMove : function(){ + this.refs.editor.update(); + }, + + handleTextChange : function(text){ + //If there are errors, run the validator on every change to give quick feedback + let htmlErrors = this.state.htmlErrors; + if(htmlErrors.length) htmlErrors = Markdown.validate(text); + + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { text: text }), + htmlErrors : htmlErrors + })); + localStorage.setItem(BREWKEY, text); + }, + + handleStyleChange : function(style){ + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { style: style }), + })); + localStorage.setItem(STYLEKEY, style); + }, + + handleMetaChange : function(metadata){ + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, metadata), + })); + localStorage.setItem(METAKEY, JSON.stringify({ + // 'title' : this.state.brew.title, + // 'description' : this.state.brew.description, + 'renderer' : this.state.brew.renderer + })); + }, + + clearErrors : function(){ + this.setState({ + errors : null, + isSaving : false + + }); + }, + + save : async function(){ + this.setState({ + isSaving : true + }); + + console.log('saving new brew'); + + let brew = this.state.brew; + // Split out CSS to Style if CSS codefence exists + if(brew.text.startsWith('```css') && brew.text.indexOf('```\n\n') > 0) { + const index = brew.text.indexOf('```\n\n'); + brew.style = `${brew.style ? `${brew.style}\n` : ''}${brew.text.slice(7, index - 1)}`; + brew.text = brew.text.slice(index + 5); + }; + + brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; + + if(this.state.saveGoogle) { + const res = await request + .post('/api/newGoogle/') + .send(brew) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Creating New Google Brew!'); + this.setState({ isSaving: false, errors: err }); + return; + }); + + brew = res.body; + localStorage.removeItem(BREWKEY); + localStorage.removeItem(STYLEKEY); + localStorage.removeItem(METAKEY); + window.location = `/edit/${brew.googleId}${brew.editId}`; + } else { + request.post('/api') + .send(brew) + .end((err, res)=>{ + if(err){ + this.setState({ + isSaving : false + }); + return; + } + window.onbeforeunload = function(){}; + brew = res.body; + localStorage.removeItem(BREWKEY); + localStorage.removeItem(STYLEKEY); + localStorage.removeItem(METAKEY); + window.location = `/edit/${brew.editId}`; + }); + } + }, + + renderSaveButton : function(){ + if(this.state.errors){ + let errMsg = ''; + try { + errMsg += `${this.state.errors.toString()}\n\n`; + errMsg += `\`\`\`\n${this.state.errors.stack}\n`; + errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``; + console.log(errMsg); + } catch (e){} + + if(this.state.errors.status == '401'){ + return + Oops! +
+ You must be signed in to a Google account + to save this to
Google Drive!
+ +
+ Sign In +
+
+
+ Not Now +
+
+
; + } + + if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ + return + Oops! +
+ Looks like your Google credentials have + expired! Visit the log in page to sign out + and sign back in with Google + to save this to Google Drive! + +
+ Sign In +
+
+
+ Not Now +
+
+
; + } + + return + Oops! +
+ Looks like there was a problem saving.
+ Report the issue + here + . +
+
; + } + + if(this.state.isSaving){ + return + save... + ; + } else { + return + save + ; + } + }, + + print : function(){ + window.open('/print?dialog=true&local=print', '_blank'); + }, + + renderLocalPrintButton : function(){ + return + get PDF + ; + }, + + renderNavbar : function(){ + return + + + {this.state.brew.title} + + + + {this.renderSaveButton()} + {this.renderLocalPrintButton()} + + + + + ; + }, + + render : function(){ + return
+ {this.renderNavbar()} +
+ + + + +
+
; } }); From b817148d1c949f87cb59e78cb5ab29f7ade4bfc3 Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Tue, 7 Dec 2021 22:09:01 -0600 Subject: [PATCH 06/86] Initial page for migrating from GMB to HB --- client/homebrew/pages/homePage/migrate_gmb.md | 174 ++++++++++++++++++ server.js | 12 ++ 2 files changed, 186 insertions(+) create mode 100644 client/homebrew/pages/homePage/migrate_gmb.md diff --git a/client/homebrew/pages/homePage/migrate_gmb.md b/client/homebrew/pages/homePage/migrate_gmb.md new file mode 100644 index 000000000..f90eaff18 --- /dev/null +++ b/client/homebrew/pages/homePage/migrate_gmb.md @@ -0,0 +1,174 @@ +# How to Convert a GMBinder Document to Homebrewery +Here you will find a number of steps to guide you through converting a GMBinder document into a Homebrewery document. + +**This document will evolve as users like yourself inform us of issues with it, or areas of conversion that it does not cover. _Please_ reach out if you have any suggestions for this document.** + +The first thing you'll want to do is switch the editor's rendering engine from `Legacy` to `v3`. This will be the renderer we design features for moving forward. + +### Simple Text Replacements +To make your life a little easier with this section, we recommend using a text editor like [VSCode](https://code.visualstudio.com/) or Notepad. + +The following table describes GMBinder elements and their Homebrewery counterparts. A simple find/replace should get these in working order. + +| GMBinder | Homebrewery | +|:----------------|:---| +| `\pagebreak` | `\page` | +| `======` | `\page` | +| `\pagebreaknum` | `{{pageNumber,auto}}\n\page` | +| `@=====` | `{{pageNumber,auto}}\n\page` | +| `\columnbreak` | `\column` | +| `.phb` | `.page` | + +### Margins and Padding +Any manual margins and padding to push text down the page will likely need to be updated. Something to note is immediately after a column break + +\page + +## Stat Blocks + +{{wide +There are pretty significant differences between stat blocks on GMBinder and Homebrewery. In this section we will describe a list of find/replace commands you can run against your GMB stat block to help make migrating them easier. +}} + +### GMBinder Example: + +``` +___ +> ## Centaur +> *Large Monstrosity, neutral good* +>___ +> - **Armor Class** 12 +> - **Hit Points** 45(6d10 + 12) +> - **Speed** 50ft. +>___ +>|STR|DEX|CON|INT|WIS|CHA| +>|:---:|:---:|:---:|:---:|:---:|:---:| +>|18 (+4)|14 (+2)|14 (+2)|9 (-1)|13 (+1)|11 (+0)| +>___ +> - **Skills** Athletics +6, Perception +3, Survival +3 +> - **Senses** passive Perception 13 +> - **Languages** Elvish, Sylvan +> - **Challenge** 2 (450 XP) +> ___ +> ***Charge.*** If the centaur moves at least 30 feet straight toward a target and then hits it with a pike attack on the same turn, the target takes an extra 10 (3d6) piercing damage. +> +> ***Second Thing*** More details. +> +> ### Actions +> ***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow. +> +> ***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage. +> +> ***Hooves.*** *Melee Weapon Attack:* +6 to hit, reach 5 ft., one target. *Hit:* 11 (2d6 + 4) bludgeoning damage. +> +> ***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage. +``` + +\column + +### Homebrewery example: + +``` +{{monster +## Centaur +*Large monstrosity, neutral good* +___ +**Armor Class** :: 12 +**Hit Points** :: 45(6d10 + 12) +**Speed** :: 50ft. +___ +| STR | DEX | CON | INT | WIS | CHA | +|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| +|18 (+4)|14 (+2)|14 (+2)|9 (-1) |13 (+1)|11 (+0)| +___ +**Skills** :: Athletics +6, Perception +3, Survival +3 +**Senses** :: passive Perception 13 +**Languages** :: Elvish, Sylvan +**Challenge** :: 2 (450 XP) +___ +***Charge.*** If the centaur moves at least 30 feet straight toward a target and then hits it with a pike attack on the same turn, the target takes an extra 10 (3d6) piercing damage. +: +***Second Thing*** More details. + +### Actions +***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow. +: +***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage. +: +***Hooves.*** *Melee Weapon Attack:* +6 to hit, reach 5 ft., one target. *Hit:* 11 (2d6 + 4) bludgeoning damage. +: +***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage. +}} +``` + +\page + +{{monster +## Centaur +*Large monstrosity, neutral good* +___ +**Armor Class** :: 12 +**Hit Points** :: 45(6d10 + 12) +**Speed** :: 50ft. +___ +| STR | DEX | CON | INT | WIS | CHA | +|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| +|18 (+4)|14 (+2)|14 (+2)|9 (-1) |13 (+1)|11 (+0)| +___ +**Skills** :: Athletics +6, Perception +3, Survival +3 +**Senses** :: passive Perception 13 +**Languages** :: Elvish, Sylvan +**Challenge** :: 2 (450 XP) +___ +***Charge.*** If the centaur moves at least 30 feet straight toward a target and then hits it with a pike attack on the same turn, the target takes an extra 10 (3d6) piercing damage. +: +***Second Thing*** More details. + +### Actions +***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow. +: +***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage. +: +***Hooves.*** *Melee Weapon Attack:* +6 to hit, reach 5 ft., one target. *Hit:* 11 (2d6 + 4) bludgeoning damage. +: +***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage. +}} + +\column + +**Use these find/replace commands in the order listed for the best result.** + +#### Blockquotes +The key difference is the lack of blockquotes. GMBinder uses the `>` symbol at the start of the line for each line in the stat block, and Homebrewery's v3 renderer does not. Running the following find/replace commands with regex enabled should remove the blockquotes: + +| Find | Replace | +|:------|:--------| +| `^> ` | | +| `^>` | | + +#### Lists +The basic characteristics and advanced characteristics sections are not list elements in Homebrewery. You can remove them by finding `^- ` and replacing it with nothing. + +#### Spacing +In order to have the correct spacing after removing the list elements, you will want to add `\:\:` between the name of each basic/advanced characteristic and its value. i.e: +``` +**Skills** :: Athletics +6 +``` + +: + +Additionally, in the special traits and actions sections, you will want to add a `\:` at the beginning of each line that separates a trait/action from another, as seen below. This can be accomplished with find/replace by replacing `^$` with `\:`. + +``` +### Actions +***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow. +: +***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage. +``` + +: + +#### Final Notes +Lastly you will want to remove the leading `___` that started the stat block in GMBinder, and replace that with `{{monster` before the stat block, and `}}` after it. If you want a frame around the stat block, you can use `{{monster,frame` instead. + + diff --git a/server.js b/server.js index a3a97cddf..f68c326ae 100644 --- a/server.js +++ b/server.js @@ -103,6 +103,7 @@ app.use(require('./server/admin.api.js')); const HomebrewModel = require('./server/homebrew.model.js').model; const welcomeText = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg.md', 'utf8'); const welcomeTextV3 = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8'); +const migrateGMBText = require('fs').readFileSync('./client/homebrew/pages/homePage/migrate_gmb.md', 'utf8'); const changelogText = require('fs').readFileSync('./changelog.md', 'utf8'); const faqText = require('fs').readFileSync('./faq.md', 'utf8'); @@ -133,6 +134,17 @@ app.get('/v3_preview', async (req, res, next)=>{ return next(); }); +//GMBinder Migration Guide +app.get('/migrate-from-gmb', async (req, res, next)=>{ + const brew = { + text : migrateGMBText, + renderer : 'V3' + }; + splitTextAndStyle(brew); + req.brew = brew; + return next(); +}); + //Changelog page app.get('/changelog', async (req, res, next)=>{ const brew = { From f1c4910993d601ab57176f65ff5730e053fa2597 Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Fri, 10 Dec 2021 20:25:31 -0600 Subject: [PATCH 07/86] Add to migrate document and update colon-replacement for the markdown renderer --- client/homebrew/pages/homePage/migrate_gmb.md | 13 ++++--------- shared/naturalcrit/markdown.js | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/client/homebrew/pages/homePage/migrate_gmb.md b/client/homebrew/pages/homePage/migrate_gmb.md index f90eaff18..5a70452df 100644 --- a/client/homebrew/pages/homePage/migrate_gmb.md +++ b/client/homebrew/pages/homePage/migrate_gmb.md @@ -139,25 +139,20 @@ ___ **Use these find/replace commands in the order listed for the best result.** #### Blockquotes -The key difference is the lack of blockquotes. GMBinder uses the `>` symbol at the start of the line for each line in the stat block, and Homebrewery's v3 renderer does not. Running the following find/replace commands with regex enabled should remove the blockquotes: - -| Find | Replace | -|:------|:--------| -| `^> ` | | -| `^>` | | +The key difference is the lack of blockquotes. GMBinder uses the `>` symbol at the start of the line for each line in the stat block, and Homebrewery's v3 renderer does not. **You will want to remove all `>` characters at the beginning of all lines, and delete any leading spaces.** #### Lists -The basic characteristics and advanced characteristics sections are not list elements in Homebrewery. You can remove them by finding `^- ` and replacing it with nothing. +The basic characteristics and advanced characteristics sections are not list elements in Homebrewery. **You will want to remove all `-` or `*` characters from the beginning of lines.** #### Spacing -In order to have the correct spacing after removing the list elements, you will want to add `\:\:` between the name of each basic/advanced characteristic and its value. i.e: +In order to have the correct spacing after removing the list elements, **you will want to add two colons (`::`) between the name of each basic/advanced characteristic and its value.** i.e: ``` **Skills** :: Athletics +6 ``` : -Additionally, in the special traits and actions sections, you will want to add a `\:` at the beginning of each line that separates a trait/action from another, as seen below. This can be accomplished with find/replace by replacing `^$` with `\:`. +Additionally, in the special traits and actions sections, you will want to add a colon at the beginning of each line that separates a trait/action from another, as seen below. **Any empty lines between special traits and actions should contain only a colon.** ``` ### Actions diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 5003d1053..10e92eb4e 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -535,7 +535,24 @@ module.exports = { marked : Markdown, render : (rawBrewText)=>{ rawBrewText = rawBrewText.replace(/^\\column$/gm, `\n
\n`) - .replace(/^(:+)$/gm, (match)=>`${`
`.repeat(match.length)}\n`); + .replace(/^(:+)$/gm, (match, _, i)=>{ + let test, matches=[]; + const codeBlock = /`/gm, inlineCodeBlock = /[^`]`[^`]/g; + while (test = codeBlock.exec(rawBrewText)) { + matches.push(test); + } + // console.log(match, m, i, indexes); + if(matches.filter((m)=>m.index < i).length % 2 !== 0) return match; + + // matches = []; + // while (test = inlineCodeBlock.exec(rawBrewText)) { + // matches.push(test); + // } + // console.log(matches, match, i); + // if(matches.filter((m)=>m.index < i).length % 2 !== 0) return match; + + return `${`
`.repeat(match.length)}\n`; + }); return Markdown( sanatizeScriptTags(rawBrewText), { renderer: renderer } From fd23396b955af37d2fe1605c76b73d4aee1f2bda Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Wed, 15 Dec 2021 23:57:52 -0600 Subject: [PATCH 08/86] Add migrate nav item to pages and update migrate document --- client/homebrew/navbar/migrate.navitem.jsx | 13 ++ client/homebrew/navbar/navbar.less | 7 +- client/homebrew/pages/editPage/editPage.jsx | 2 + client/homebrew/pages/errorPage/errorPage.jsx | 2 + client/homebrew/pages/homePage/homePage.jsx | 2 + client/homebrew/pages/homePage/migrate.md | 202 ++++++++++++++++++ client/homebrew/pages/homePage/migrate_gmb.md | 169 --------------- client/homebrew/pages/newPage/newPage.jsx | 2 + server.js | 8 +- shared/naturalcrit/markdown.js | 19 +- 10 files changed, 233 insertions(+), 193 deletions(-) create mode 100644 client/homebrew/navbar/migrate.navitem.jsx create mode 100644 client/homebrew/pages/homePage/migrate.md delete mode 100644 client/homebrew/pages/homePage/migrate_gmb.md diff --git a/client/homebrew/navbar/migrate.navitem.jsx b/client/homebrew/navbar/migrate.navitem.jsx new file mode 100644 index 000000000..d0ac086d3 --- /dev/null +++ b/client/homebrew/navbar/migrate.navitem.jsx @@ -0,0 +1,13 @@ +const React = require('react'); +const Nav = require('naturalcrit/nav/nav.jsx'); + +module.exports = function(props){ + return + migrate + ; +}; diff --git a/client/homebrew/navbar/navbar.less b/client/homebrew/navbar/navbar.less index 36cbdf935..37c28f3e8 100644 --- a/client/homebrew/navbar/navbar.less +++ b/client/homebrew/navbar/navbar.less @@ -1,5 +1,5 @@ @navbarHeight : 28px; -@keyframes coloring { +@keyframes pinkColoring { //from {color: white;} //to {color: red;} 0% {color: pink;} @@ -62,11 +62,14 @@ } i{ .animate(color); - animation-name: coloring; + animation-name: pinkColoring; animation-duration: 2s; color: pink; } } + .migrate.navItem{ + border-right : 1px solid #666; + } .recent.navItem{ position : relative; .dropdown{ diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index ee4f41f5b..c73e59bd7 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -23,6 +23,7 @@ const Markdown = require('naturalcrit/markdown.js'); const googleDriveActive = require('../../googleDrive.png'); const googleDriveInactive = require('../../googleDriveMono.png'); +const MigrateNavItem = require("../../navbar/migrate.navitem.jsx"); const SAVE_TIMEOUT = 3000; @@ -433,6 +434,7 @@ const EditPage = createClass({ {this.renderGoogleDriveIcon()} {this.renderSaveButton()} + diff --git a/client/homebrew/pages/errorPage/errorPage.jsx b/client/homebrew/pages/errorPage/errorPage.jsx index aa51c83be..fe4473dc7 100644 --- a/client/homebrew/pages/errorPage/errorPage.jsx +++ b/client/homebrew/pages/errorPage/errorPage.jsx @@ -11,6 +11,7 @@ const IssueNavItem = require('../../navbar/issue.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); +const MigrateNavItem = require("../../navbar/migrate.navitem.jsx"); const ErrorPage = createClass({ getDefaultProps : function() { @@ -33,6 +34,7 @@ const ErrorPage = createClass({ + diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index c46d451eb..f7384285d 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -10,6 +10,7 @@ const Nav = require('naturalcrit/nav/nav.jsx'); const Navbar = require('../../navbar/navbar.jsx'); const NewBrewItem = require('../../navbar/newbrew.navitem.jsx'); const IssueNavItem = require('../../navbar/issue.navitem.jsx'); +const MigrateNavItem = require('../../navbar/migrate.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const AccountNavItem = require('../../navbar/account.navitem.jsx'); @@ -58,6 +59,7 @@ const HomePage = createClass({ return + diff --git a/client/homebrew/pages/homePage/migrate.md b/client/homebrew/pages/homePage/migrate.md new file mode 100644 index 000000000..9624fef6c --- /dev/null +++ b/client/homebrew/pages/homePage/migrate.md @@ -0,0 +1,202 @@ +# How to Convert a Legacy Document to v3 +Here you will find a number of steps to guide you through converting a Legacy document into a Homebrewery v3 document. + +**The first thing you'll want to do is switch the editor's rendering engine from `Legacy` to `v3`.** This will be the renderer we design features for moving forward. + +There are some examples of Legacy code in the code pane if you need more context behind some of the changes. + +**This document will evolve as users like yourself inform us of issues with it, or areas of conversion that it does not cover. _Please_ reach out if you have any suggestions for this document.** + +## Simple Replacements +To make your life a little easier with this section, a text editor like [VSCode](https://code.visualstudio.com/) or Notepad will help a lot. + +The following table describes Legacy and other document elements and their Homebrewery counterparts. A simple find/replace should get these in working order. + +| Legacy / Other | Homebrewery | +|:----------------|:-----------------------------| +| `\pagebreak` | `\page` | +| `======` | `\page` | +| `\pagebreaknum` | `{{pageNumber,auto}}\n\page` | +| `@=====` | `{{pageNumber,auto}}\n\page` | +| `\columnbreak` | `\column` | +| `.phb` | `.page` | + +## Classed or Styled Divs +Anything that relies on the following syntax can be changed to the new Homebrewery v3 curly brace syntax: + +``` +
+... +
+``` +: +The above example is equivalent to the following in v3 syntax. + +``` +{{classTable,wide +... +}} +``` +: +Some examples of this include class tables (as shown above), descriptive blocks, notes, and spell lists. + +\column + +## Margins and Padding +Any manual margins and padding to push text down the page will likely need to be updated. Colons can be used on lines by themselves to push things down the page vertically if you'd rather not set pixel-perfect margins or padding. + +## Notes + +In Legacy, notes are denoted using markdown blockquote syntax. In Homebrewery v3, this is replaced by the curly brace syntax. + + + +{{note +##### Title +Information +}} + +## Split Tables +Split tables also use the curly brace syntax, as the new renderer can handle style values separately from class names. + + + +##### Typical Difficulty Classes +{{column-count:2 +| Task Difficulty | DC | +|:----------------|:--:| +| Very easy | 5 | +| Easy | 10 | +| Medium | 15 | + +| Task Difficulty | DC | +|:------------------|:--:| +| Hard | 20 | +| Very hard | 25 | +| Nearly impossible | 30 | +}} + +## Blockquotes +Blockquotes are denoted by the `>` character at the beginning of the line. In Homebrewery's v3 renderer, they hold virtually no meaning and have no CSS styling. You are free to use blockquotes when styling your document or creating themes without needing to worry about your CSS affecting other parts of the document. + +{{pageNumber,auto}} + +\page + +## Stat Blocks + +There are pretty significant differences between stat blocks on the Legacy renderer and Homebrewery v3. This section contains a list of changes that will need to be made to update the stat block. + +### Initial Changes +You will want to **remove all leading** `___` that started the stat block in Legacy, and replace that with `{{monster` before the stat block, and `}}` after it. + +**If you want a frame** around the stat block, you can add `,frame` to the curly brace definition. + +**If the stat block was wide**, make sure to add `,wide` to the curly brace definition. + +### Blockquotes +The key difference is the lack of blockquotes. Legacy documents use the `>` symbol at the start of the line for each line in the stat block, and the v3 renderer does not. **You will want to remove all `>` characters at the beginning of all lines, and delete any leading spaces.** + +### Lists +The basic characteristics and advanced characteristics sections are not list elements in Homebrewery. You will want to **remove all `-` or `*` characters from the beginning of lines.** + +### Spacing +In order to have the correct spacing after removing the list elements, you will want to **add two colons between the name of each basic/advanced characteristic and its value.** _(see example in the code pane)_ + +Additionally, in the special traits and actions sections, you will want to add a colon at the beginning of each line that separates a trait/action from another, as seen below. **Any empty lines between special traits and actions should contain only a colon.** _(see example in the code pane)_ + +\column + +{{margin-top:102px}} + + + +### Homebrewery example: + +{{monster +## Centaur +*Large monstrosity, neutral good* +___ +**Armor Class** :: 12 +**Hit Points** :: 45(6d10 + 12) +**Speed** :: 50ft. +___ +| STR | DEX | CON | INT | WIS | CHA | +|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| +|18 (+4)|14 (+2)|14 (+2)|9 (-1) |13 (+1)|11 (+0)| +___ +**Skills** :: Athletics +6, Perception +3, Survival +3 +**Senses** :: passive Perception 13 +**Languages** :: Elvish, Sylvan +**Challenge** :: 2 (450 XP) +___ +***Charge.*** If the centaur moves at least 30 feet straight toward a target and then hits it with a pike attack on the same turn, the target takes an extra 10 (3d6) piercing damage. +: +***Second Thing*** More details. + +### Actions +***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow. +: +***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage. +: +***Hooves.*** *Melee Weapon Attack:* +6 to hit, reach 5 ft., one target. *Hit:* 11 (2d6 + 4) bludgeoning damage. +: +***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage. +}} + +{{pageNumber,auto}} + + + diff --git a/client/homebrew/pages/homePage/migrate_gmb.md b/client/homebrew/pages/homePage/migrate_gmb.md deleted file mode 100644 index 5a70452df..000000000 --- a/client/homebrew/pages/homePage/migrate_gmb.md +++ /dev/null @@ -1,169 +0,0 @@ -# How to Convert a GMBinder Document to Homebrewery -Here you will find a number of steps to guide you through converting a GMBinder document into a Homebrewery document. - -**This document will evolve as users like yourself inform us of issues with it, or areas of conversion that it does not cover. _Please_ reach out if you have any suggestions for this document.** - -The first thing you'll want to do is switch the editor's rendering engine from `Legacy` to `v3`. This will be the renderer we design features for moving forward. - -### Simple Text Replacements -To make your life a little easier with this section, we recommend using a text editor like [VSCode](https://code.visualstudio.com/) or Notepad. - -The following table describes GMBinder elements and their Homebrewery counterparts. A simple find/replace should get these in working order. - -| GMBinder | Homebrewery | -|:----------------|:---| -| `\pagebreak` | `\page` | -| `======` | `\page` | -| `\pagebreaknum` | `{{pageNumber,auto}}\n\page` | -| `@=====` | `{{pageNumber,auto}}\n\page` | -| `\columnbreak` | `\column` | -| `.phb` | `.page` | - -### Margins and Padding -Any manual margins and padding to push text down the page will likely need to be updated. Something to note is immediately after a column break - -\page - -## Stat Blocks - -{{wide -There are pretty significant differences between stat blocks on GMBinder and Homebrewery. In this section we will describe a list of find/replace commands you can run against your GMB stat block to help make migrating them easier. -}} - -### GMBinder Example: - -``` -___ -> ## Centaur -> *Large Monstrosity, neutral good* ->___ -> - **Armor Class** 12 -> - **Hit Points** 45(6d10 + 12) -> - **Speed** 50ft. ->___ ->|STR|DEX|CON|INT|WIS|CHA| ->|:---:|:---:|:---:|:---:|:---:|:---:| ->|18 (+4)|14 (+2)|14 (+2)|9 (-1)|13 (+1)|11 (+0)| ->___ -> - **Skills** Athletics +6, Perception +3, Survival +3 -> - **Senses** passive Perception 13 -> - **Languages** Elvish, Sylvan -> - **Challenge** 2 (450 XP) -> ___ -> ***Charge.*** If the centaur moves at least 30 feet straight toward a target and then hits it with a pike attack on the same turn, the target takes an extra 10 (3d6) piercing damage. -> -> ***Second Thing*** More details. -> -> ### Actions -> ***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow. -> -> ***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage. -> -> ***Hooves.*** *Melee Weapon Attack:* +6 to hit, reach 5 ft., one target. *Hit:* 11 (2d6 + 4) bludgeoning damage. -> -> ***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage. -``` - -\column - -### Homebrewery example: - -``` -{{monster -## Centaur -*Large monstrosity, neutral good* -___ -**Armor Class** :: 12 -**Hit Points** :: 45(6d10 + 12) -**Speed** :: 50ft. -___ -| STR | DEX | CON | INT | WIS | CHA | -|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| -|18 (+4)|14 (+2)|14 (+2)|9 (-1) |13 (+1)|11 (+0)| -___ -**Skills** :: Athletics +6, Perception +3, Survival +3 -**Senses** :: passive Perception 13 -**Languages** :: Elvish, Sylvan -**Challenge** :: 2 (450 XP) -___ -***Charge.*** If the centaur moves at least 30 feet straight toward a target and then hits it with a pike attack on the same turn, the target takes an extra 10 (3d6) piercing damage. -: -***Second Thing*** More details. - -### Actions -***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow. -: -***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage. -: -***Hooves.*** *Melee Weapon Attack:* +6 to hit, reach 5 ft., one target. *Hit:* 11 (2d6 + 4) bludgeoning damage. -: -***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage. -}} -``` - -\page - -{{monster -## Centaur -*Large monstrosity, neutral good* -___ -**Armor Class** :: 12 -**Hit Points** :: 45(6d10 + 12) -**Speed** :: 50ft. -___ -| STR | DEX | CON | INT | WIS | CHA | -|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| -|18 (+4)|14 (+2)|14 (+2)|9 (-1) |13 (+1)|11 (+0)| -___ -**Skills** :: Athletics +6, Perception +3, Survival +3 -**Senses** :: passive Perception 13 -**Languages** :: Elvish, Sylvan -**Challenge** :: 2 (450 XP) -___ -***Charge.*** If the centaur moves at least 30 feet straight toward a target and then hits it with a pike attack on the same turn, the target takes an extra 10 (3d6) piercing damage. -: -***Second Thing*** More details. - -### Actions -***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow. -: -***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage. -: -***Hooves.*** *Melee Weapon Attack:* +6 to hit, reach 5 ft., one target. *Hit:* 11 (2d6 + 4) bludgeoning damage. -: -***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage. -}} - -\column - -**Use these find/replace commands in the order listed for the best result.** - -#### Blockquotes -The key difference is the lack of blockquotes. GMBinder uses the `>` symbol at the start of the line for each line in the stat block, and Homebrewery's v3 renderer does not. **You will want to remove all `>` characters at the beginning of all lines, and delete any leading spaces.** - -#### Lists -The basic characteristics and advanced characteristics sections are not list elements in Homebrewery. **You will want to remove all `-` or `*` characters from the beginning of lines.** - -#### Spacing -In order to have the correct spacing after removing the list elements, **you will want to add two colons (`::`) between the name of each basic/advanced characteristic and its value.** i.e: -``` -**Skills** :: Athletics +6 -``` - -: - -Additionally, in the special traits and actions sections, you will want to add a colon at the beginning of each line that separates a trait/action from another, as seen below. **Any empty lines between special traits and actions should contain only a colon.** - -``` -### Actions -***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow. -: -***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage. -``` - -: - -#### Final Notes -Lastly you will want to remove the leading `___` that started the stat block in GMBinder, and replace that with `{{monster` before the stat block, and `}}` after it. If you want a frame around the stat block, you can use `{{monster,frame` instead. - - diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 3f09cac4e..04b0be723 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -16,6 +16,7 @@ const IssueNavItem = require('../../navbar/issue.navitem.jsx'); const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); const Editor = require('../../editor/editor.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); +const MigrateNavItem = require("../../navbar/migrate.navitem.jsx"); const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; @@ -290,6 +291,7 @@ const NewPage = createClass({ {this.renderSaveButton()} {this.renderLocalPrintButton()} + diff --git a/server.js b/server.js index f68c326ae..2ea8f305b 100644 --- a/server.js +++ b/server.js @@ -103,7 +103,7 @@ app.use(require('./server/admin.api.js')); const HomebrewModel = require('./server/homebrew.model.js').model; const welcomeText = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg.md', 'utf8'); const welcomeTextV3 = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8'); -const migrateGMBText = require('fs').readFileSync('./client/homebrew/pages/homePage/migrate_gmb.md', 'utf8'); +const migrateText = require('fs').readFileSync('./client/homebrew/pages/homePage/migrate.md', 'utf8'); const changelogText = require('fs').readFileSync('./changelog.md', 'utf8'); const faqText = require('fs').readFileSync('./faq.md', 'utf8'); @@ -134,10 +134,10 @@ app.get('/v3_preview', async (req, res, next)=>{ return next(); }); -//GMBinder Migration Guide -app.get('/migrate-from-gmb', async (req, res, next)=>{ +//Legacy/Other Document -> v3 Migration Guide +app.get('/migrate', async (req, res, next)=>{ const brew = { - text : migrateGMBText, + text : migrateText, renderer : 'V3' }; splitTextAndStyle(brew); diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 10e92eb4e..52fc4c352 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -535,24 +535,7 @@ module.exports = { marked : Markdown, render : (rawBrewText)=>{ rawBrewText = rawBrewText.replace(/^\\column$/gm, `\n
\n`) - .replace(/^(:+)$/gm, (match, _, i)=>{ - let test, matches=[]; - const codeBlock = /`/gm, inlineCodeBlock = /[^`]`[^`]/g; - while (test = codeBlock.exec(rawBrewText)) { - matches.push(test); - } - // console.log(match, m, i, indexes); - if(matches.filter((m)=>m.index < i).length % 2 !== 0) return match; - - // matches = []; - // while (test = inlineCodeBlock.exec(rawBrewText)) { - // matches.push(test); - // } - // console.log(matches, match, i); - // if(matches.filter((m)=>m.index < i).length % 2 !== 0) return match; - - return `${`
`.repeat(match.length)}\n`; - }); + .replace(/^(:+)$/gm, (match)=>`${`
`.repeat(match.length)}\n`); return Markdown( sanatizeScriptTags(rawBrewText), { renderer: renderer } From 889d3073720763d23ff4e57f1951baaf1a05d990 Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Wed, 15 Dec 2021 23:58:49 -0600 Subject: [PATCH 09/86] Lint change double quotes into single quotes --- client/homebrew/pages/editPage/editPage.jsx | 2 +- client/homebrew/pages/errorPage/errorPage.jsx | 2 +- client/homebrew/pages/newPage/newPage.jsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index c73e59bd7..9b2a48aae 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -23,7 +23,7 @@ const Markdown = require('naturalcrit/markdown.js'); const googleDriveActive = require('../../googleDrive.png'); const googleDriveInactive = require('../../googleDriveMono.png'); -const MigrateNavItem = require("../../navbar/migrate.navitem.jsx"); +const MigrateNavItem = require('../../navbar/migrate.navitem.jsx'); const SAVE_TIMEOUT = 3000; diff --git a/client/homebrew/pages/errorPage/errorPage.jsx b/client/homebrew/pages/errorPage/errorPage.jsx index fe4473dc7..2b7aef8aa 100644 --- a/client/homebrew/pages/errorPage/errorPage.jsx +++ b/client/homebrew/pages/errorPage/errorPage.jsx @@ -11,7 +11,7 @@ const IssueNavItem = require('../../navbar/issue.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); -const MigrateNavItem = require("../../navbar/migrate.navitem.jsx"); +const MigrateNavItem = require('../../navbar/migrate.navitem.jsx'); const ErrorPage = createClass({ getDefaultProps : function() { diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 04b0be723..18a090b3d 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -16,7 +16,7 @@ const IssueNavItem = require('../../navbar/issue.navitem.jsx'); const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); const Editor = require('../../editor/editor.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); -const MigrateNavItem = require("../../navbar/migrate.navitem.jsx"); +const MigrateNavItem = require('../../navbar/migrate.navitem.jsx'); const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; From 25c1d03ccad3ab9c6f8465eb2f7791ac821c6d84 Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Wed, 15 Dec 2021 23:59:36 -0600 Subject: [PATCH 10/86] Update package-lock.json --- package-lock.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package-lock.json b/package-lock.json index a8ad026b8..0298d92f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "homebrewery", "version": "3.0.5", "hasInstallScript": true, "license": "MIT", From 0bc27e83edf0d62ca8cfc3e4ce95cfc7c6289f1a Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Thu, 16 Dec 2021 00:01:16 -0600 Subject: [PATCH 11/86] Fix reference to old function --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 88598f9a3..9812af38d 100644 --- a/server.js +++ b/server.js @@ -148,7 +148,7 @@ app.get('/migrate', async (req, res, next)=>{ text : migrateText, renderer : 'V3' }; - splitTextAndStyle(brew); + splitTextStyleAndMetadata(brew); req.brew = brew; return next(); }); From 603cf2c0abb54c6157e75c8faa45e1eb76a9ed22 Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Thu, 16 Dec 2021 00:03:23 -0600 Subject: [PATCH 12/86] Adjust migrate document text --- client/homebrew/pages/homePage/migrate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/homePage/migrate.md b/client/homebrew/pages/homePage/migrate.md index 9624fef6c..822e97ef0 100644 --- a/client/homebrew/pages/homePage/migrate.md +++ b/client/homebrew/pages/homePage/migrate.md @@ -163,7 +163,7 @@ ___ > ***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage. --> -### Homebrewery example: +### Homebrewery v3 Example: {{monster ## Centaur From 5bb580147aa7da8dc8fde419808c665f491e1c60 Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Tue, 28 Dec 2021 21:59:02 -0600 Subject: [PATCH 13/86] Add discord, github, and reddit links to home page document --- client/homebrew/pages/homePage/welcome_msg.md | 24 +++++++++++++++++++ server.js | 1 + 2 files changed, 25 insertions(+) diff --git a/client/homebrew/pages/homePage/welcome_msg.md b/client/homebrew/pages/homePage/welcome_msg.md index f182517f5..77be2bfe7 100644 --- a/client/homebrew/pages/homePage/welcome_msg.md +++ b/client/homebrew/pages/homePage/welcome_msg.md @@ -1,4 +1,28 @@ +```css +#header { + display: flex; + flex: 0 0 auto; + justify-content: space-between; +} + +#header a { + color: black; +} + +i.domt:before { + content: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3Csvg version='1.1' id='Layer_3' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' height='31' width='31' viewBox='0 0 36 36' style='enable-background:new 0 0 36 36;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bopacity:0.9;%7D .st1%7Bfill:%23001013;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23AA2A29;%7D%0A%3C/style%3E%3Cg class='st0'%3E%3Cpath d='M6.2,1.5C6,1.8,5.9,2,5.8,2.3C5.7,2.8,5.5,3.3,5.5,3.9c0,7.7,0,15.3,0,23c0,1.8,1.2,3.3,2.9,3.7c0.2,0,0.5,0.1,0.7,0.1 c6.3,0,12.7,0,19,0h0.6c-0.3-1.1-0.9-3.1-0.9-3.1l0.2,0.2c0,0,3.8,3.5,5.7,5.2c0.2,0.2,0.3,0.4,0.3,0.7c0,0.8,0,1.5,0,2.3 c-0.6-0.5-1.1-0.9-1.6-1.4c-0.9-0.8-1.8-1.6-2.6-2.3c-0.2-0.2-0.4-0.3-0.7-0.3c-7.2,0-14.3,0-21.5,0c-1.9,0-3.1-0.8-3.8-2.6 c-0.1-0.2-0.1-0.5-0.1-0.7c0-7.1,0-14.3,0-21.4V4.8C3.8,3.3,4.7,2.1,6.2,1.5z'/%3E%3C/g%3E%3Cpath class='st1' d='M28,28c0,0,0.5,1.8,0.8,2.8h-0.5c-6.4,0-12.7,0-19.1,0c-1.6,0-3.2-0.9-3.7-3.1c0-0.2,0-0.4,0-0.5 c0-7.8,0-15.7,0-23.5c0-1.8,1.4-3.4,3.2-3.5c0.3,0,0.5,0,0.8,0c7.5,0,15.1,0,22.6,0c1.2,0,2.3,0.3,3.1,1.3c0.6,0.7,0.9,1.5,0.9,2.3 c0,10.2,0,20.5,0,30.7c0,0.1,0,0.2,0,0.4c-0.4-0.3-0.7-0.6-1-0.9c-2.2-2-4.3-3.9-6.5-5.9c-0.1-0.1-0.3-0.3-0.3-0.3l-0.2-0.2L28,28z' /%3E%3Cpath class='st2' d='M35.4,33.9c-0.7-0.6-1.4-1.2-2-1.8c-1.7-1.6-3.4-3.2-5.2-4.8c-0.2-0.2-0.4-0.3-0.7-0.2 c-0.3,0.1-0.3,0.4-0.2,0.7c0.2,0.8,0.4,1.5,0.7,2.2c0,0.1,0,0.1,0,0.2c-0.1,0-0.3,0-0.4,0c-6.2,0-12.4,0-18.5,0 c-1.7,0-3-1.2-3.2-2.7c0-0.3-0.1-0.6-0.1-0.9c0-7.6,0-15.2,0-22.8c0-1,0.3-1.8,1-2.5c0.5-0.5,1.2-0.8,1.9-0.8c0.2,0,0.4,0,0.5,0 c7.6,0,15.1,0,22.7,0c0.9,0,1.7,0.2,2.4,0.8c0.7,0.7,1,1.6,1,2.5c0,3.7,0,7.5,0,11.2L35.4,33.9L35.4,33.9z'/%3E%3Cpath class='st3' d='M25.6,9.6c-1.1,4.1-2.1,8.2-3.2,12.3l-8.9-9.1L25.6,9.6z'/%3E%3Cpath class='st3' d='M31.9,18.3L23.1,22c1-4,2.1-8,3.1-11.9l0.1,0L31.9,18.3z'/%3E%3Cpath class='st3' d='M12.1,23.5c0.3-3.3,0.5-6.6,0.8-10l8.7,8.9L12.1,23.5z'/%3E%3Cpath class='st3' d='M17.4,3.8l7.6,5.1L13.3,12L17.4,3.8z'/%3E%3Cpath class='st3' d='M30.5,19.7l-6.7,6.7c-0.3-1.2-0.6-2.4-0.9-3.5L30.5,19.7z'/%3E%3Cpath class='st3' d='M22.1,23.1c0.3,1.2,0.6,2.3,1,3.5l-9.1-2.4l0-0.1L22.1,23.1z'/%3E%3Cpath class='st3' d='M31.3,16l-4.7-6.9l2.5-2L31.3,16L31.3,16z'/%3E%3Cpath class='st3' d='M12.1,12.9c-0.2,2.8-0.4,5.6-0.6,8.4l-0.1,0c-0.8-2.9-1.6-5.9-2.4-8.9L12.1,12.9z'/%3E%3Cpath class='st3' d='M26,8.5l-6.3-4.2l0-0.1l8.6,2.3L26,8.5z'/%3E%3Cpath class='st3' d='M9.5,11.7l6.1-6.3l0.1,0.1l-3.4,6.7L9.5,11.7z'/%3E%3C/svg%3E%0A"); +} +``` + + + Welcome traveler from an antique land. Please sit and tell us of what you have seen. The unheard of monsters, who slither and bite. Tell us of the wondrous items and and artifacts you have found, their mysteries yet to be unlocked. Of the vexing vocations and surprising skills you have seen. ### Homebrew D&D made easy diff --git a/server.js b/server.js index 4c4cb6f63..9e76030e9 100644 --- a/server.js +++ b/server.js @@ -126,6 +126,7 @@ app.get('/', async (req, res, next)=>{ const brew = { text : welcomeText }; + splitTextStyleAndMetadata(brew); req.brew = brew; return next(); }); From 48a5c12ab71d92b1be3d2b54ea79d2bdde16bef6 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 31 Dec 2021 12:59:48 +1300 Subject: [PATCH 14/86] Rebase on new `master` --- .../basePages/listPage/brewItem/brewItem.jsx | 144 +++++++++++++ .../basePages/listPage/brewItem/brewItem.less | 75 +++++++ .../pages/basePages/listPage/listPage.jsx | 189 ++++++++++++++++++ .../pages/basePages/listPage/listPage.less | 77 +++++++ 4 files changed, 485 insertions(+) create mode 100644 client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx create mode 100644 client/homebrew/pages/basePages/listPage/brewItem/brewItem.less create mode 100644 client/homebrew/pages/basePages/listPage/listPage.jsx create mode 100644 client/homebrew/pages/basePages/listPage/listPage.less diff --git a/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx new file mode 100644 index 000000000..c7c4d6f94 --- /dev/null +++ b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx @@ -0,0 +1,144 @@ +require('./brewItem.less'); +const React = require('react'); +const createClass = require('create-react-class'); +const _ = require('lodash'); +const cx = require('classnames'); +const moment = require('moment'); +const request = require('superagent'); + +const googleDriveIcon = require('../../../../googleDrive.png'); +const dedent = require('dedent-tabs').default; + +const BrewItem = createClass({ + getDefaultProps : function() { + return { + brew : { + title : '', + description : '', + + authors : [] + } + }; + }, + + deleteBrew : function(){ + if(this.props.brew.authors.length <= 1){ + if(!confirm('Are you sure you want to delete this brew? Because you are the only owner of this brew, the document will be deleted permanently.')) return; + if(!confirm('Are you REALLY sure? You will not be able to recover the document.')) return; + } else { + if(!confirm('Are you sure you want to remove this brew from your collection? This will remove you as an editor, but other owners will still be able to access the document.')) return; + if(!confirm('Are you REALLY sure? You will lose editor access to this document.')) return; + } + + if(this.props.brew.googleId) { + request.get(`/api/removeGoogle/${this.props.brew.googleId}${this.props.brew.editId}`) + .send() + .end(function(err, res){ + location.reload(); + }); + } else { + request.delete(`/api/${this.props.brew.editId}`) + .send() + .end(function(err, res){ + location.reload(); + }); + } + }, + + renderDeleteBrewLink : function(){ + if(!this.props.brew.editId) return; + + return + + ; + }, + + renderEditLink : function(){ + if(!this.props.brew.editId) return; + + let editLink = this.props.brew.editId; + if(this.props.brew.googleId) { + editLink = this.props.brew.googleId + editLink; + } + + return + + ; + }, + + renderShareLink : function(){ + if(!this.props.brew.shareId) return; + + let shareLink = this.props.brew.shareId; + if(this.props.brew.googleId) { + shareLink = this.props.brew.googleId + shareLink; + } + + return + + ; + }, + + renderDownloadLink : function(){ + if(!this.props.brew.shareId) return; + + let shareLink = this.props.brew.shareId; + if(this.props.brew.googleId) { + shareLink = this.props.brew.googleId + shareLink; + } + + return + + ; + }, + + renderGoogleDriveIcon : function(){ + if(!this.props.brew.gDrive) return; + + return + googleDriveIcon + ; + }, + + render : function(){ + const brew = this.props.brew; + const dateFormatString = 'YYYY-MM-DD HH:mm:ss'; + + return
+
+

{brew.title}

+

{brew.description}

+
+
+
+ + {brew.authors.join(', ')} + +
+ + {brew.views} + + {brew.pageCount && + + {brew.pageCount} + + } + + {moment(brew.updatedAt).fromNow()} + + {this.renderGoogleDriveIcon()} +
+ +
+ {this.renderShareLink()} + {this.renderEditLink()} + {this.renderDownloadLink()} + {this.renderDeleteBrewLink()} +
+
; + } +}); + +module.exports = BrewItem; diff --git a/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less new file mode 100644 index 000000000..d323874f5 --- /dev/null +++ b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.less @@ -0,0 +1,75 @@ + +.brewItem{ + position : relative; + display : inline-block; + vertical-align : top; + box-sizing : border-box; + box-sizing : border-box; + overflow : hidden; + width : 48%; + min-height : 105px; + margin-right : 15px; + margin-bottom : 15px; + padding : 5px 15px 2px 8px; + padding-right : 15px; + border : 1px solid #c9ad6a; + border-radius : 5px; + -webkit-column-break-inside : avoid; + page-break-inside : avoid; + break-inside : avoid; + .text { + min-height : 54px; + h4{ + margin-bottom : 5px; + font-size : 2.2em; + } + } + .info{ + position: initial; + bottom: 2px; + font-family : ScalySans; + font-size : 1.2em; + &>span{ + margin-right : 12px; + line-height : 1.5em; + } + } + &:hover{ + .links{ + opacity : 1; + } + } + &:nth-child(2n + 1){ + margin-right : 0px; + } + .links{ + .animate(opacity); + position : absolute; + top : 0px; + right : 0px; + height : 100%; + width : 2em; + opacity : 0; + background-color : fade(black, 60%); + text-align : center; + a{ + .animate(opacity); + display : block; + margin : 8px 0px; + opacity : 0.6; + font-size : 1.3em; + color : white; + &:hover{ + opacity : 1; + } + i{ + cursor : pointer; + } + } + } + .googleDriveIcon { + height : 20px; + padding : 0px; + margin : -5px; + } +} diff --git a/client/homebrew/pages/basePages/listPage/listPage.jsx b/client/homebrew/pages/basePages/listPage/listPage.jsx new file mode 100644 index 000000000..e4beb4a94 --- /dev/null +++ b/client/homebrew/pages/basePages/listPage/listPage.jsx @@ -0,0 +1,189 @@ +require('./listPage.less'); +const React = require('react'); +const createClass = require('create-react-class'); +const _ = require('lodash'); +const cx = require('classnames'); + +const moment = require('moment'); + +const Nav = require('naturalcrit/nav/nav.jsx'); +const Navbar = require('../../../navbar/navbar.jsx'); + +const RecentNavItem = require('../../../navbar/recent.navitem.jsx').both; +const Account = require('../../../navbar/account.navitem.jsx'); +const NewBrew = require('../../../navbar/newbrew.navitem.jsx'); +const BrewItem = require('./brewItem/brewItem.jsx'); +const ReportIssue = require('../../../navbar/issue.navitem.jsx'); + +// const brew = { +// title : 'SUPER Long title woah now', +// authors : [] +// }; + +//const BREWS = _.times(25, ()=>{ return brew;}); + + +const ListPage = createClass({ + getDefaultProps : function() { + return { + brewCollection : [ + { + title : '', + class : '', + brews : [] + } + ] + }; + }, + getInitialState : function() { + return { + sortType : 'alpha', + sortDir : 'asc', + filterString : '' + }; + }, + + renderBrews : function(brews){ + if(!brews || !brews.length) return
No Brews.
; + + const sortedBrews = this.sortBrews(brews); + + return _.map(sortedBrews, (brew, idx)=>{ + return ; + }); + }, + + sortBrewOrder : function(brew){ + if(!brew.title){brew.title = 'No Title';} + const mapping = { + 'alpha' : _.deburr(brew.title.toLowerCase()), + 'created' : moment(brew.createdAt).format(), + 'updated' : moment(brew.updatedAt).format(), + 'views' : brew.views, + 'latest' : moment(brew.lastViewed).format() + }; + return mapping[this.state.sortType]; + }, + + sortBrews : function(brews){ + return _.orderBy(brews, (brew)=>{ return this.sortBrewOrder(brew); }, this.state.sortDir); + }, + + handleSortOptionChange : function(event){ + this.setState({ + sortType : event.target.value + }); + }, + + handleSortDirChange : function(event){ + this.setState({ + sortDir : `${(this.state.sortDir == 'asc' ? 'desc' : 'asc')}` + }); + }, + + renderSortOption : function(sortTitle, sortValue){ + return + + ; + }, + + handleFilterTextChange : function(e){ + this.setState({ + filterString : e.target.value + }); + return; + }, + + renderFilterOption : function(){ + return + + ; + }, + + renderSortOptions : function(){ + return
+ + + + + {this.renderSortOption('Title', 'alpha')} + {this.renderSortOption('Created Date', 'created')} + {this.renderSortOption('Updated Date', 'updated')} + {this.renderSortOption('Views', 'views')} + {/* {this.renderSortOption('Latest', 'latest')} */} + + + {this.renderFilterOption()} + + +
+
Sort by :
+
+
Direction :
+
+ +
+
; + }, + + getSortedBrews : function(brewCollection){ + const testString = _.deburr(this.state.filterString).toLowerCase(); + const brews = this.state.filterString ? _.filter(brewCollection.brews, (brew)=>{ + return (_.deburr(brew.title).toLowerCase().includes(testString)) || + (_.deburr(brew.description).toLowerCase().includes(testString)); + }) : this.props.brewCollection.brews; + return _.groupBy(brews, (brew)=>{ + return (brew.published ? 'published' : 'private'); + }); + }, + + renderBrewCollection : function(brewCollection){ + return _.map(brewCollection, (brewItem, idx)=>{ + return
+

{brewItem.title || 'No Title'}

+ {this.renderBrews(brewItem.brews)} +
; + }); + }, + + render : function(){ + return
+ + + + + + + + + + +
+
+ {this.renderSortOptions()} + {this.renderBrewCollection(this.props.brewCollection)} +
+
+
; + } +}); + +module.exports = ListPage; diff --git a/client/homebrew/pages/basePages/listPage/listPage.less b/client/homebrew/pages/basePages/listPage/listPage.less new file mode 100644 index 000000000..6be946404 --- /dev/null +++ b/client/homebrew/pages/basePages/listPage/listPage.less @@ -0,0 +1,77 @@ + +.noColumns(){ + column-count : auto; + column-fill : auto; + column-gap : auto; + column-width : auto; + -webkit-column-count : auto; + -moz-column-count : auto; + -webkit-column-width : auto; + -moz-column-width : auto; + -webkit-column-gap : auto; + -moz-column-gap : auto; +} +.listPage{ + .content{ + overflow-y : scroll; + .phb{ + .noColumns(); + height : auto; + min-height : 279.4mm; + margin : 20px auto; + &::after{ + display : none; + } + .noBrews{ + margin : 10px 0px; + font-size : 1.3em; + font-style : italic; + } + + } + } + .sort-container{ + font-family : 'Open Sans', sans-serif; + position : fixed; + top : 35px; + left : calc(50vw - 408px); + border : 2px solid #58180D; + width : 800px; + background-color : #EEE5CE; + padding : 2px; + text-align : center; + z-index : 15; + h6{ + text-transform : uppercase; + font-family : 'Open Sans', sans-serif; + font-size : 11px; + font-weight : bold; + color : #58180D; + } + table{ + margin : 0px; + vertical-align : middle; + tbody tr{ + background-color: transparent !important; + i{ + padding-right : 5px + } + button{ + background-color : transparent; + color : #58180D; + font-family : 'Open Sans', sans-serif; + font-size : 11px; + text-transform : uppercase; + font-weight : normal; + &.active{ + font-weight : bold; + border : 2px solid #58180D; + } + &.sortDir{ + width : 75px; + } + } + } + } + } +} From 77f5e3e835749ad4ed347ae34f8e1699af5f3625 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 4 Nov 2021 11:44:05 +1300 Subject: [PATCH 15/86] Remove unnecessary `userPage.less` --- client/homebrew/pages/userPage/userPage.jsx | 2 +- client/homebrew/pages/userPage/userPage.less | 77 -------------------- 2 files changed, 1 insertion(+), 78 deletions(-) delete mode 100644 client/homebrew/pages/userPage/userPage.less diff --git a/client/homebrew/pages/userPage/userPage.jsx b/client/homebrew/pages/userPage/userPage.jsx index 700ca4131..498ff9df3 100644 --- a/client/homebrew/pages/userPage/userPage.jsx +++ b/client/homebrew/pages/userPage/userPage.jsx @@ -1,4 +1,4 @@ -require('./userPage.less'); +//require('./userPage.less'); const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); diff --git a/client/homebrew/pages/userPage/userPage.less b/client/homebrew/pages/userPage/userPage.less deleted file mode 100644 index d968aab9a..000000000 --- a/client/homebrew/pages/userPage/userPage.less +++ /dev/null @@ -1,77 +0,0 @@ - -.noColumns(){ - column-count : auto; - column-fill : auto; - column-gap : auto; - column-width : auto; - -webkit-column-count : auto; - -moz-column-count : auto; - -webkit-column-width : auto; - -moz-column-width : auto; - -webkit-column-gap : auto; - -moz-column-gap : auto; -} -.userPage{ - .content{ - overflow-y : scroll; - .phb{ - .noColumns(); - height : auto; - min-height : 279.4mm; - margin : 20px auto; - &::after{ - display : none; - } - .noBrews{ - margin : 10px 0px; - font-size : 1.3em; - font-style : italic; - } - - } - } - .sort-container{ - font-family : 'Open Sans', sans-serif; - position : fixed; - top : 35px; - left : calc(50vw - 408px); - border : 2px solid #58180D; - width : 800px; - background-color : #EEE5CE; - padding : 2px; - text-align : center; - z-index : 15; - h6{ - text-transform : uppercase; - font-family : 'Open Sans', sans-serif; - font-size : 11px; - font-weight : bold; - color : #58180D; - } - table{ - margin : 0px; - vertical-align : middle; - tbody tr{ - background-color: transparent !important; - i{ - padding-right : 5px - } - button{ - background-color : transparent; - color : #58180D; - font-family : 'Open Sans', sans-serif; - font-size : 11px; - text-transform : uppercase; - font-weight : normal; - &.active{ - font-weight : bold; - border : 2px solid #58180D; - } - &.sortDir{ - width : 75px; - } - } - } - } - } -} From 00158c1894cfce17635e87c92bd82030d49bab09 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 4 Nov 2021 11:44:41 +1300 Subject: [PATCH 16/86] Rebase on new `master` --- .../pages/basePages/editorPage/editorPage.jsx | 578 ++++++++++++++++++ .../basePages/editorPage/editorPage.less | 99 +++ client/homebrew/pages/userPage/userPage.jsx | 1 - 3 files changed, 677 insertions(+), 1 deletion(-) create mode 100644 client/homebrew/pages/basePages/editorPage/editorPage.jsx create mode 100644 client/homebrew/pages/basePages/editorPage/editorPage.less diff --git a/client/homebrew/pages/basePages/editorPage/editorPage.jsx b/client/homebrew/pages/basePages/editorPage/editorPage.jsx new file mode 100644 index 000000000..99a5c2b52 --- /dev/null +++ b/client/homebrew/pages/basePages/editorPage/editorPage.jsx @@ -0,0 +1,578 @@ +/* eslint-disable max-lines */ +require('./editorPage.less'); +const React = require('react'); +const createClass = require('create-react-class'); +const _ = require('lodash'); +const request = require('superagent'); +const { Meta } = require('vitreum/headtags'); + +const Nav = require('naturalcrit/nav/nav.jsx'); +const Navbar = require('../../../navbar/navbar.jsx'); + +const NewBrew = require('../../../navbar/newbrew.navitem.jsx'); +const ReportIssue = require('../../../navbar/issue.navitem.jsx'); +const PrintLink = require('../../../navbar/print.navitem.jsx'); +const Account = require('../../../navbar/account.navitem.jsx'); +const RecentNavItem = require('../../../navbar/recent.navitem.jsx').both; + +const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); +const Editor = require('../../../editor/editor.jsx'); +const BrewRenderer = require('../../../brewRenderer/brewRenderer.jsx'); + +const Markdown = require('naturalcrit/markdown.js'); + +const googleDriveActive = require('../../../googleDrive.png'); +const googleDriveInactive = require('../../../googleDriveMono.png'); + +const SAVE_TIMEOUT = 3000; + +const BREWKEY = 'homebrewery-new'; +const STYLEKEY = 'homebrewery-new-style'; +const METAKEY = 'homebrewery-new-meta'; + +const EditorPage = createClass({ + getDefaultProps : function() { + return { + brew : { + text : '', + style : '', + shareId : null, + editId : null, + createdAt : null, + updatedAt : null, + gDrive : false, + trashed : false, + + title : '', + description : '', + tags : '', + published : false, + authors : [], + systems : [], + renderer : 'legacy' + }, + pageType : 'edit', + googleDriveOptions : [ + 'DRIVE > HB', + 'HB > DRIVE' + ] + }; + }, + + getInitialState : function() { + return { + brew : this.props.brew, + isSaving : false, + isPending : false, + alertTrashedGoogleBrew : this.props.brew.trashed, + alertLoginToTransfer : false, + saveGoogle : this.props.brew.googleId ? true : false, + confirmGoogleTransfer : false, + errors : null, + htmlErrors : Markdown.validate(this.props.brew.text), + url : '' + }; + // return { + // brew : { + // text : brew.text || '', + // style : brew.style || undefined, + // gDrive : false, + // title : brew.title || '', + // description : brew.description || '', + // tags : brew.tags || '', + // published : false, + // authors : [], + // systems : brew.systems || [], + // renderer : brew.renderer || 'legacy' + // }, + + // isSaving : false, + // isPending : false, + // alertTrashedGoogleBrew : this.props.brew.trashed, + // alertLoginToTransfer : false, + // saveGoogle : (global.account && global.account.googleId ? true : false), + // confirmGoogleTransfer : false, + // errors : null, + // htmlErrors : Markdown.validate(brew.text), + // url : '' + // }; + }, + savedBrew : null, + + componentDidMount : function(){ + this.setState({ + url : window.location.href + }); + + this.savedBrew = JSON.parse(JSON.stringify(this.props.brew)); //Deep copy + + this.trySave(); + window.onbeforeunload = ()=>{ + if(this.state.isSaving || this.state.isPending){ + return 'You have unsaved changes!'; + } + }; + + this.setState((prevState)=>({ + htmlErrors : Markdown.validate(prevState.brew.text) + })); + + document.addEventListener('keydown', this.handleControlKeys); + }, + componentWillUnmount : function() { + window.onbeforeunload = function(){}; + document.removeEventListener('keydown', this.handleControlKeys); + }, + + handleControlKeys : function(e){ + if(!(e.ctrlKey || e.metaKey)) return; + const S_KEY = 83; + const P_KEY = 80; + if(e.keyCode == S_KEY) this.save(); + if(e.keyCode == P_KEY) window.open(`/print/${this.processShareId()}?dialog=true`, '_blank').focus(); + if(e.keyCode == P_KEY || e.keyCode == S_KEY){ + e.stopPropagation(); + e.preventDefault(); + } + }, + + isEdit : function(){ + return this.props.pageType == 'edit'; + }, + + isNew : function(){ + return this.props.pageType == 'new'; + }, + + handleSplitMove : function(){ + this.refs.editor.update(); + }, + + handleTextChange : function(text){ + //If there are errors, run the validator on every change to give quick feedback + let htmlErrors = this.state.htmlErrors; + if(htmlErrors.length) htmlErrors = Markdown.validate(text); + + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { text: text }), + isPending : true, + htmlErrors : htmlErrors + }), ()=>this.trySave()); + }, + + handleStyleChange : function(style){ + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { style: style }), + isPending : true + }), ()=>this.trySave()); + }, + + handleMetaChange : function(metadata){ + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, metadata), + isPending : true, + }), ()=>this.trySave()); + + }, + + hasChanges : function(){ + return !_.isEqual(this.state.brew, this.savedBrew); + }, + + trySave : function(){ + if(!this.isEdit()) return; + if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); + if(this.hasChanges()){ + this.debounceSave(); + } else { + this.debounceSave.cancel(); + } + }, + + handleGoogleClick : function(){ + if(!global.account?.googleId) { + this.setState({ + alertLoginToTransfer : true + }); + return; + } + this.setState((prevState)=>({ + confirmGoogleTransfer : !prevState.confirmGoogleTransfer + })); + this.clearErrors(); + }, + + closeAlerts : function(event){ + event.stopPropagation(); //Only handle click once so alert doesn't reopen + this.setState({ + alertTrashedGoogleBrew : false, + alertLoginToTransfer : false, + confirmGoogleTransfer : false + }); + }, + + toggleGoogleStorage : function(){ + this.setState((prevState)=>({ + saveGoogle : !prevState.saveGoogle, + isSaving : false, + errors : null + }), ()=>this.isEdit() && this.save()); + }, + + clearErrors : function(){ + this.setState({ + errors : null, + isSaving : false + + }); + }, + + save : async function(){ + this.setState((prevState)=>({ + isSaving : true, + errors : null, + htmlErrors : Markdown.validate(prevState.brew.text) + })); + + if(this.isEdit()){ + if(this.debounceSave && this.debounceSave.cancel) this.debounceSave.cancel(); + + const transfer = this.state.saveGoogle == _.isNil(this.state.brew.googleId); + + const brew = this.state.brew; + brew.pageCount = ((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; + + if(this.state.saveGoogle) { + if(transfer) { + const res = await request + .post('/api/newGoogle/') + .send(brew) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Transferring to Google!'); + this.setState({ errors: err, saveGoogle: false }); + }); + + if(!res) { return; } + + console.log('Deleting Local Copy'); + await request.delete(`/api/${brew.editId}`) + .send() + .catch((err)=>{ + console.log('Error deleting Local Copy'); + }); + + this.savedBrew = res.body; + history.replaceState(null, null, `/edit/${this.savedBrew.googleId}${this.savedBrew.editId}`); //update URL to match doc ID + } else { + const res = await request + .put(`/api/updateGoogle/${brew.editId}`) + .send(brew) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Saving to Google!'); + this.setState({ errors: err }); + return; + }); + + this.savedBrew = res.body; + } + } else { + if(transfer) { + const res = await request.post('/api') + .send(brew) + .catch((err)=>{ + console.log('Error creating Local Copy'); + this.setState({ errors: err }); + return; + }); + + await request.get(`/api/removeGoogle/${brew.googleId}${brew.editId}`) + .send() + .catch((err)=>{ + console.log('Error Deleting Google Brew'); + }); + + this.savedBrew = res.body; + history.replaceState(null, null, `/edit/${this.savedBrew.editId}`); //update URL to match doc ID + } else { + const res = await request + .put(`/api/update/${brew.editId}`) + .send(brew) + .catch((err)=>{ + console.log('Error Updating Local Brew'); + this.setState({ errors: err }); + return; + }); + + this.savedBrew = res.body; + } + } + + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { + googleId : this.savedBrew.googleId ? this.savedBrew.googleId : null, + editId : this.savedBrew.editId, + shareId : this.savedBrew.shareId + }), + isPending : false, + isSaving : false, + })); + } + + if(this.isNew()){ + console.log('saving new brew'); + + let brew = this.state.brew; + // Split out CSS to Style if CSS codefence exists + if(brew.text.startsWith('```css') && brew.text.indexOf('```\n\n') > 0) { + const index = brew.text.indexOf('```\n\n'); + brew.style = `${brew.style ? `${brew.style}\n` : ''}${brew.text.slice(7, index - 1)}`; + brew.text = brew.text.slice(index + 5); + }; + + brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; + + if(this.state.saveGoogle) { + const res = await request + .post('/api/newGoogle/') + .send(brew) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Creating New Google Brew!'); + this.setState({ isSaving: false, errors: err }); + return; + }); + + brew = res.body; + localStorage.removeItem(BREWKEY); + localStorage.removeItem(STYLEKEY); + localStorage.removeItem(METAKEY); + window.location = `/edit/${brew.googleId}${brew.editId}`; + } else { + request.post('/api') + .send(brew) + .end((err, res)=>{ + if(err){ + this.setState({ + isSaving : false + }); + return; + } + window.onbeforeunload = function(){}; + brew = res.body; + localStorage.removeItem(BREWKEY); + localStorage.removeItem(STYLEKEY); + localStorage.removeItem(METAKEY); + window.location = `/edit/${brew.editId}`; + }); + } + } + }, + + renderGoogleDriveIcon : function(){ + return + {this.state.saveGoogle + ? googleDriveActive + : googleDriveInactive + } + + {this.state.confirmGoogleTransfer && +
+ { this.state.saveGoogle + ? this.props.googleDriveOptions[0] + : this.props.googleDriveOptions[1] + } +
+
+ Yes +
+
+ No +
+
+ } + + {this.state.alertLoginToTransfer && +
+ You must be signed in to a Google account to transfer + between the homebrewery and Google Drive! + +
+ Sign In +
+
+
+ Not Now +
+
+ } +
; + }, + + renderSaveButton : function(){ + if(this.state.errors){ + let errMsg = ''; + try { + errMsg += `${this.state.errors.toString()}\n\n`; + errMsg += `\`\`\`\n${this.state.errors.stack}\n`; + errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``; + console.log(errMsg); + } catch (e){} + + if(this.state.errors.status == '401'){ + return + Oops! +
+ You must be signed in to a Google account + to save this to
Google Drive!
+ +
+ Sign In +
+
+
+ Not Now +
+
+
; + } + + if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ + return + Oops! +
+ Looks like your Google credentials have + expired! Visit the log in page to sign out + and sign back in with Google + to save this to Google Drive! + +
+ Sign In +
+
+
+ Not Now +
+
+
; + } + + return + Oops! +
+ Looks like there was a problem saving.
+ Report the issue + here + . +
+
; + } + + if(this.state.isSaving){ + return saving...; + } + if(this.state.isPending && this.hasChanges()){ + return Save Now; + } + if(!this.state.isPending && !this.state.isSaving){ + return saved.; + } + }, + + processShareId : function() { + return this.state.brew.googleId ? + this.state.brew.googleId + this.state.brew.shareId : + this.state.brew.shareId; + }, + + getRedditLink : function(){ + + const shareLink = this.processShareId(); + const systems = this.props.brew.systems.length > 0 ? ` [${this.props.brew.systems.join(' - ')}]` : ''; + const title = `${this.props.brew.title} ${systems}`; + const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. + +**[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; + + return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title)}&text=${encodeURIComponent(text)}`; + }, + + renderNavbar : function(){ + const shareLink = this.processShareId(); + + return + + {this.state.alertTrashedGoogleBrew && +
+ This brew is currently in your Trash folder on Google Drive!
If you want to keep it, make sure to move it before it is deleted permanently!
+
+ OK +
+
+ } + + + {this.state.brew.title} + + + + {this.renderGoogleDriveIcon()} + {this.renderSaveButton()} + + + {this.isEdit() && <> + + + share + + + view + + {navigator.clipboard.writeText(`https://homebrewery.naturalcrit.com/share/${shareLink}`);}}> + copy url + + + post to reddit + + + + + } + + + + +
; + }, + + render : function(){ + return
+ + {this.renderNavbar()} + +
+ + + + +
+
; + } +}); + +module.exports = EditorPage; diff --git a/client/homebrew/pages/basePages/editorPage/editorPage.less b/client/homebrew/pages/basePages/editorPage/editorPage.less new file mode 100644 index 000000000..0cbfadcbd --- /dev/null +++ b/client/homebrew/pages/basePages/editorPage/editorPage.less @@ -0,0 +1,99 @@ +@keyframes glideDown { + 0% {transform : translate(-50% + 3px, 0px); + opacity : 0;} + 100% {transform : translate(-50% + 3px, 10px); + opacity : 1;} +} +.editPage{ + .navItem.save{ + width : 106px; + text-align : center; + position : relative; + &.saved{ + cursor : initial; + color : #666; + } + &.error{ + position : relative; + background-color : @red; + } + } + .googleDriveStorage { + position : relative; + } + .googleDriveStorage img{ + height : 20px; + padding : 0px; + margin : -5px; + } + .errorContainer{ + animation-name: glideDown; + animation-duration: 0.4s; + position : absolute; + top : 100%; + left : 50%; + z-index : 100000; + width : 140px; + padding : 3px; + color : white; + background-color : #333; + border : 3px solid #444; + border-radius : 5px; + transform : translate(-50% + 3px, 10px); + text-align : center; + font-size : 10px; + font-weight : 800; + text-transform : uppercase; + a{ + color : @teal; + } + &:before { + content: ""; + width: 0px; + height: 0px; + position: absolute; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 10px solid transparent; + border-bottom: 10px solid #444; + left: 53px; + top: -23px; + } + &:after { + content: ""; + width: 0px; + height: 0px; + position: absolute; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 10px solid transparent; + border-bottom: 10px solid #333; + left: 53px; + top: -19px; + } + .deny { + width : 48%; + margin : 1px; + padding : 5px; + background-color : #333; + display : inline-block; + border-left : 1px solid #666; + .animate(background-color); + &:hover{ + background-color : red; + } + } + .confirm { + width : 48%; + margin : 1px; + padding : 5px; + background-color : #333; + display : inline-block; + color : white; + .animate(background-color); + &:hover{ + background-color : teal; + } + } + } +} diff --git a/client/homebrew/pages/userPage/userPage.jsx b/client/homebrew/pages/userPage/userPage.jsx index 498ff9df3..52744085e 100644 --- a/client/homebrew/pages/userPage/userPage.jsx +++ b/client/homebrew/pages/userPage/userPage.jsx @@ -1,4 +1,3 @@ -//require('./userPage.less'); const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); From eca12aae824090ad3f20590e4d8897d45ff5b4db Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 31 Dec 2021 13:06:21 +1300 Subject: [PATCH 17/86] Rebase on `master` --- .../pages/basePages/editorPage/editorPage.jsx | 578 ------------------ .../basePages/editorPage/editorPage.less | 99 --- client/homebrew/pages/editPage/editPage.jsx | 1 + client/homebrew/pages/newPage/newPage.jsx | 1 + 4 files changed, 2 insertions(+), 677 deletions(-) delete mode 100644 client/homebrew/pages/basePages/editorPage/editorPage.jsx delete mode 100644 client/homebrew/pages/basePages/editorPage/editorPage.less diff --git a/client/homebrew/pages/basePages/editorPage/editorPage.jsx b/client/homebrew/pages/basePages/editorPage/editorPage.jsx deleted file mode 100644 index 99a5c2b52..000000000 --- a/client/homebrew/pages/basePages/editorPage/editorPage.jsx +++ /dev/null @@ -1,578 +0,0 @@ -/* eslint-disable max-lines */ -require('./editorPage.less'); -const React = require('react'); -const createClass = require('create-react-class'); -const _ = require('lodash'); -const request = require('superagent'); -const { Meta } = require('vitreum/headtags'); - -const Nav = require('naturalcrit/nav/nav.jsx'); -const Navbar = require('../../../navbar/navbar.jsx'); - -const NewBrew = require('../../../navbar/newbrew.navitem.jsx'); -const ReportIssue = require('../../../navbar/issue.navitem.jsx'); -const PrintLink = require('../../../navbar/print.navitem.jsx'); -const Account = require('../../../navbar/account.navitem.jsx'); -const RecentNavItem = require('../../../navbar/recent.navitem.jsx').both; - -const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); -const Editor = require('../../../editor/editor.jsx'); -const BrewRenderer = require('../../../brewRenderer/brewRenderer.jsx'); - -const Markdown = require('naturalcrit/markdown.js'); - -const googleDriveActive = require('../../../googleDrive.png'); -const googleDriveInactive = require('../../../googleDriveMono.png'); - -const SAVE_TIMEOUT = 3000; - -const BREWKEY = 'homebrewery-new'; -const STYLEKEY = 'homebrewery-new-style'; -const METAKEY = 'homebrewery-new-meta'; - -const EditorPage = createClass({ - getDefaultProps : function() { - return { - brew : { - text : '', - style : '', - shareId : null, - editId : null, - createdAt : null, - updatedAt : null, - gDrive : false, - trashed : false, - - title : '', - description : '', - tags : '', - published : false, - authors : [], - systems : [], - renderer : 'legacy' - }, - pageType : 'edit', - googleDriveOptions : [ - 'DRIVE > HB', - 'HB > DRIVE' - ] - }; - }, - - getInitialState : function() { - return { - brew : this.props.brew, - isSaving : false, - isPending : false, - alertTrashedGoogleBrew : this.props.brew.trashed, - alertLoginToTransfer : false, - saveGoogle : this.props.brew.googleId ? true : false, - confirmGoogleTransfer : false, - errors : null, - htmlErrors : Markdown.validate(this.props.brew.text), - url : '' - }; - // return { - // brew : { - // text : brew.text || '', - // style : brew.style || undefined, - // gDrive : false, - // title : brew.title || '', - // description : brew.description || '', - // tags : brew.tags || '', - // published : false, - // authors : [], - // systems : brew.systems || [], - // renderer : brew.renderer || 'legacy' - // }, - - // isSaving : false, - // isPending : false, - // alertTrashedGoogleBrew : this.props.brew.trashed, - // alertLoginToTransfer : false, - // saveGoogle : (global.account && global.account.googleId ? true : false), - // confirmGoogleTransfer : false, - // errors : null, - // htmlErrors : Markdown.validate(brew.text), - // url : '' - // }; - }, - savedBrew : null, - - componentDidMount : function(){ - this.setState({ - url : window.location.href - }); - - this.savedBrew = JSON.parse(JSON.stringify(this.props.brew)); //Deep copy - - this.trySave(); - window.onbeforeunload = ()=>{ - if(this.state.isSaving || this.state.isPending){ - return 'You have unsaved changes!'; - } - }; - - this.setState((prevState)=>({ - htmlErrors : Markdown.validate(prevState.brew.text) - })); - - document.addEventListener('keydown', this.handleControlKeys); - }, - componentWillUnmount : function() { - window.onbeforeunload = function(){}; - document.removeEventListener('keydown', this.handleControlKeys); - }, - - handleControlKeys : function(e){ - if(!(e.ctrlKey || e.metaKey)) return; - const S_KEY = 83; - const P_KEY = 80; - if(e.keyCode == S_KEY) this.save(); - if(e.keyCode == P_KEY) window.open(`/print/${this.processShareId()}?dialog=true`, '_blank').focus(); - if(e.keyCode == P_KEY || e.keyCode == S_KEY){ - e.stopPropagation(); - e.preventDefault(); - } - }, - - isEdit : function(){ - return this.props.pageType == 'edit'; - }, - - isNew : function(){ - return this.props.pageType == 'new'; - }, - - handleSplitMove : function(){ - this.refs.editor.update(); - }, - - handleTextChange : function(text){ - //If there are errors, run the validator on every change to give quick feedback - let htmlErrors = this.state.htmlErrors; - if(htmlErrors.length) htmlErrors = Markdown.validate(text); - - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { text: text }), - isPending : true, - htmlErrors : htmlErrors - }), ()=>this.trySave()); - }, - - handleStyleChange : function(style){ - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { style: style }), - isPending : true - }), ()=>this.trySave()); - }, - - handleMetaChange : function(metadata){ - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, metadata), - isPending : true, - }), ()=>this.trySave()); - - }, - - hasChanges : function(){ - return !_.isEqual(this.state.brew, this.savedBrew); - }, - - trySave : function(){ - if(!this.isEdit()) return; - if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); - if(this.hasChanges()){ - this.debounceSave(); - } else { - this.debounceSave.cancel(); - } - }, - - handleGoogleClick : function(){ - if(!global.account?.googleId) { - this.setState({ - alertLoginToTransfer : true - }); - return; - } - this.setState((prevState)=>({ - confirmGoogleTransfer : !prevState.confirmGoogleTransfer - })); - this.clearErrors(); - }, - - closeAlerts : function(event){ - event.stopPropagation(); //Only handle click once so alert doesn't reopen - this.setState({ - alertTrashedGoogleBrew : false, - alertLoginToTransfer : false, - confirmGoogleTransfer : false - }); - }, - - toggleGoogleStorage : function(){ - this.setState((prevState)=>({ - saveGoogle : !prevState.saveGoogle, - isSaving : false, - errors : null - }), ()=>this.isEdit() && this.save()); - }, - - clearErrors : function(){ - this.setState({ - errors : null, - isSaving : false - - }); - }, - - save : async function(){ - this.setState((prevState)=>({ - isSaving : true, - errors : null, - htmlErrors : Markdown.validate(prevState.brew.text) - })); - - if(this.isEdit()){ - if(this.debounceSave && this.debounceSave.cancel) this.debounceSave.cancel(); - - const transfer = this.state.saveGoogle == _.isNil(this.state.brew.googleId); - - const brew = this.state.brew; - brew.pageCount = ((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; - - if(this.state.saveGoogle) { - if(transfer) { - const res = await request - .post('/api/newGoogle/') - .send(brew) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Transferring to Google!'); - this.setState({ errors: err, saveGoogle: false }); - }); - - if(!res) { return; } - - console.log('Deleting Local Copy'); - await request.delete(`/api/${brew.editId}`) - .send() - .catch((err)=>{ - console.log('Error deleting Local Copy'); - }); - - this.savedBrew = res.body; - history.replaceState(null, null, `/edit/${this.savedBrew.googleId}${this.savedBrew.editId}`); //update URL to match doc ID - } else { - const res = await request - .put(`/api/updateGoogle/${brew.editId}`) - .send(brew) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Saving to Google!'); - this.setState({ errors: err }); - return; - }); - - this.savedBrew = res.body; - } - } else { - if(transfer) { - const res = await request.post('/api') - .send(brew) - .catch((err)=>{ - console.log('Error creating Local Copy'); - this.setState({ errors: err }); - return; - }); - - await request.get(`/api/removeGoogle/${brew.googleId}${brew.editId}`) - .send() - .catch((err)=>{ - console.log('Error Deleting Google Brew'); - }); - - this.savedBrew = res.body; - history.replaceState(null, null, `/edit/${this.savedBrew.editId}`); //update URL to match doc ID - } else { - const res = await request - .put(`/api/update/${brew.editId}`) - .send(brew) - .catch((err)=>{ - console.log('Error Updating Local Brew'); - this.setState({ errors: err }); - return; - }); - - this.savedBrew = res.body; - } - } - - this.setState((prevState)=>({ - brew : _.merge({}, prevState.brew, { - googleId : this.savedBrew.googleId ? this.savedBrew.googleId : null, - editId : this.savedBrew.editId, - shareId : this.savedBrew.shareId - }), - isPending : false, - isSaving : false, - })); - } - - if(this.isNew()){ - console.log('saving new brew'); - - let brew = this.state.brew; - // Split out CSS to Style if CSS codefence exists - if(brew.text.startsWith('```css') && brew.text.indexOf('```\n\n') > 0) { - const index = brew.text.indexOf('```\n\n'); - brew.style = `${brew.style ? `${brew.style}\n` : ''}${brew.text.slice(7, index - 1)}`; - brew.text = brew.text.slice(index + 5); - }; - - brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1; - - if(this.state.saveGoogle) { - const res = await request - .post('/api/newGoogle/') - .send(brew) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Creating New Google Brew!'); - this.setState({ isSaving: false, errors: err }); - return; - }); - - brew = res.body; - localStorage.removeItem(BREWKEY); - localStorage.removeItem(STYLEKEY); - localStorage.removeItem(METAKEY); - window.location = `/edit/${brew.googleId}${brew.editId}`; - } else { - request.post('/api') - .send(brew) - .end((err, res)=>{ - if(err){ - this.setState({ - isSaving : false - }); - return; - } - window.onbeforeunload = function(){}; - brew = res.body; - localStorage.removeItem(BREWKEY); - localStorage.removeItem(STYLEKEY); - localStorage.removeItem(METAKEY); - window.location = `/edit/${brew.editId}`; - }); - } - } - }, - - renderGoogleDriveIcon : function(){ - return - {this.state.saveGoogle - ? googleDriveActive - : googleDriveInactive - } - - {this.state.confirmGoogleTransfer && -
- { this.state.saveGoogle - ? this.props.googleDriveOptions[0] - : this.props.googleDriveOptions[1] - } -
-
- Yes -
-
- No -
-
- } - - {this.state.alertLoginToTransfer && -
- You must be signed in to a Google account to transfer - between the homebrewery and Google Drive! - -
- Sign In -
-
-
- Not Now -
-
- } -
; - }, - - renderSaveButton : function(){ - if(this.state.errors){ - let errMsg = ''; - try { - errMsg += `${this.state.errors.toString()}\n\n`; - errMsg += `\`\`\`\n${this.state.errors.stack}\n`; - errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``; - console.log(errMsg); - } catch (e){} - - if(this.state.errors.status == '401'){ - return - Oops! -
- You must be signed in to a Google account - to save this to
Google Drive!
- -
- Sign In -
-
-
- Not Now -
-
-
; - } - - if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ - return - Oops! -
- Looks like your Google credentials have - expired! Visit the log in page to sign out - and sign back in with Google - to save this to Google Drive! - -
- Sign In -
-
-
- Not Now -
-
-
; - } - - return - Oops! -
- Looks like there was a problem saving.
- Report the issue - here - . -
-
; - } - - if(this.state.isSaving){ - return saving...; - } - if(this.state.isPending && this.hasChanges()){ - return Save Now; - } - if(!this.state.isPending && !this.state.isSaving){ - return saved.; - } - }, - - processShareId : function() { - return this.state.brew.googleId ? - this.state.brew.googleId + this.state.brew.shareId : - this.state.brew.shareId; - }, - - getRedditLink : function(){ - - const shareLink = this.processShareId(); - const systems = this.props.brew.systems.length > 0 ? ` [${this.props.brew.systems.join(' - ')}]` : ''; - const title = `${this.props.brew.title} ${systems}`; - const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. - -**[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; - - return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title)}&text=${encodeURIComponent(text)}`; - }, - - renderNavbar : function(){ - const shareLink = this.processShareId(); - - return - - {this.state.alertTrashedGoogleBrew && -
- This brew is currently in your Trash folder on Google Drive!
If you want to keep it, make sure to move it before it is deleted permanently!
-
- OK -
-
- } - - - {this.state.brew.title} - - - - {this.renderGoogleDriveIcon()} - {this.renderSaveButton()} - - - {this.isEdit() && <> - - - share - - - view - - {navigator.clipboard.writeText(`https://homebrewery.naturalcrit.com/share/${shareLink}`);}}> - copy url - - - post to reddit - - - - - } - - - - -
; - }, - - render : function(){ - return
- - {this.renderNavbar()} - -
- - - - -
-
; - } -}); - -module.exports = EditorPage; diff --git a/client/homebrew/pages/basePages/editorPage/editorPage.less b/client/homebrew/pages/basePages/editorPage/editorPage.less deleted file mode 100644 index 0cbfadcbd..000000000 --- a/client/homebrew/pages/basePages/editorPage/editorPage.less +++ /dev/null @@ -1,99 +0,0 @@ -@keyframes glideDown { - 0% {transform : translate(-50% + 3px, 0px); - opacity : 0;} - 100% {transform : translate(-50% + 3px, 10px); - opacity : 1;} -} -.editPage{ - .navItem.save{ - width : 106px; - text-align : center; - position : relative; - &.saved{ - cursor : initial; - color : #666; - } - &.error{ - position : relative; - background-color : @red; - } - } - .googleDriveStorage { - position : relative; - } - .googleDriveStorage img{ - height : 20px; - padding : 0px; - margin : -5px; - } - .errorContainer{ - animation-name: glideDown; - animation-duration: 0.4s; - position : absolute; - top : 100%; - left : 50%; - z-index : 100000; - width : 140px; - padding : 3px; - color : white; - background-color : #333; - border : 3px solid #444; - border-radius : 5px; - transform : translate(-50% + 3px, 10px); - text-align : center; - font-size : 10px; - font-weight : 800; - text-transform : uppercase; - a{ - color : @teal; - } - &:before { - content: ""; - width: 0px; - height: 0px; - position: absolute; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - border-top: 10px solid transparent; - border-bottom: 10px solid #444; - left: 53px; - top: -23px; - } - &:after { - content: ""; - width: 0px; - height: 0px; - position: absolute; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - border-top: 10px solid transparent; - border-bottom: 10px solid #333; - left: 53px; - top: -19px; - } - .deny { - width : 48%; - margin : 1px; - padding : 5px; - background-color : #333; - display : inline-block; - border-left : 1px solid #666; - .animate(background-color); - &:hover{ - background-color : red; - } - } - .confirm { - width : 48%; - margin : 1px; - padding : 5px; - background-color : #333; - display : inline-block; - color : white; - .animate(background-color); - &:hover{ - background-color : teal; - } - } - } -} diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index d2f21481d..fc378845e 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -351,6 +351,7 @@ const EditPage = createClass({ } if(this.state.errors.response.req.url.match(/^\/api\/.*Google.*$/m)){ + if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ return Oops!
diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 0c6b0aa6a..4f112c703 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -228,6 +228,7 @@ const NewPage = createClass({ } if(this.state.errors.response.req.url.match(/^\/api\/.*Google.*$/m)){ + if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ return Oops!
From 0beabc6c0c2bc4dc7e1262075a82a902f22d472d Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 31 Dec 2021 13:30:07 +1300 Subject: [PATCH 18/86] Fix New & EditPage issues after rebase --- client/homebrew/pages/editPage/editPage.jsx | 45 ++++++++++----------- client/homebrew/pages/newPage/newPage.jsx | 41 ++++++++++--------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index fc378845e..4567bff94 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -351,37 +351,38 @@ const EditPage = createClass({ } if(this.state.errors.response.req.url.match(/^\/api\/.*Google.*$/m)){ - if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ - return + if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ + return Oops! -
+
Looks like your Google credentials have expired! Visit our log in page to sign out and sign back in with Google, then try saving again! - -
+ +
Sign In -
-
-
+
+ +
Not Now +
+ ; + } + + return + Oops! +
+ Looks like there was a problem saving.
+ Report the issue + here + .
; } - - return - Oops! -
- Looks like there was a problem saving.
- Report the issue - here - . -
-
; } if(this.state.isSaving){ @@ -406,9 +407,7 @@ const EditPage = createClass({ const shareLink = this.processShareId(); const systems = this.props.brew.systems.length > 0 ? ` [${this.props.brew.systems.join(' - ')}]` : ''; const title = `${this.props.brew.title} ${systems}`; - const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. - -**[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; + const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. **[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title)}&text=${encodeURIComponent(text)}`; }, diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 4f112c703..10b5061f0 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -228,37 +228,38 @@ const NewPage = createClass({ } if(this.state.errors.response.req.url.match(/^\/api\/.*Google.*$/m)){ - if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ - return + if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ + return Oops! -
+
Looks like your Google credentials have expired! Visit our log in page to sign out and sign back in with Google, then try saving again! - -
+ +
Sign In -
-
-
+
+ +
Not Now +
+ ; + } + + return + Oops! +
+ Looks like there was a problem saving.
+ Report the issue + here + .
; } - - return - Oops! -
- Looks like there was a problem saving.
- Report the issue - here - . -
-
; } if(this.state.isSaving){ From 896d9ae2c77d6185c3d24e3384ceb850b9a830a3 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 31 Dec 2021 13:35:50 +1300 Subject: [PATCH 19/86] Lint fixes --- client/homebrew/pages/editPage/editPage.jsx | 3 +-- client/homebrew/pages/newPage/newPage.jsx | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 4567bff94..77c1834e4 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -376,8 +376,7 @@ const EditPage = createClass({ Oops!
Looks like there was a problem saving.
- Report the issue + Report the issue here .
diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 10b5061f0..9c1621287 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -253,8 +253,8 @@ const NewPage = createClass({ Oops!
Looks like there was a problem saving.
- Report the issue + Report the issue here .
From 605ea2aa62e767d66a712b3b3b32fece4e652230 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 31 Dec 2021 13:42:24 +1300 Subject: [PATCH 20/86] Revert New & EditPage to `master` status --- client/homebrew/pages/editPage/editPage.jsx | 43 +++++++++++---------- client/homebrew/pages/newPage/newPage.jsx | 40 +++++++++---------- 2 files changed, 41 insertions(+), 42 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 77c1834e4..d2f21481d 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -351,37 +351,36 @@ const EditPage = createClass({ } if(this.state.errors.response.req.url.match(/^\/api\/.*Google.*$/m)){ - if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ - return + return Oops! -
+
Looks like your Google credentials have expired! Visit our log in page to sign out and sign back in with Google, then try saving again! - -
+ +
Sign In -
-
-
- Not Now
+ +
+ Not Now
- ; - } - - return - Oops! -
- Looks like there was a problem saving.
- Report the issue - here - .
; } + + return + Oops! +
+ Looks like there was a problem saving.
+ Report the issue + here + . +
+
; } if(this.state.isSaving){ @@ -406,7 +405,9 @@ const EditPage = createClass({ const shareLink = this.processShareId(); const systems = this.props.brew.systems.length > 0 ? ` [${this.props.brew.systems.join(' - ')}]` : ''; const title = `${this.props.brew.title} ${systems}`; - const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. **[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; + const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out. + +**[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`; return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title)}&text=${encodeURIComponent(text)}`; }, diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 9c1621287..0c6b0aa6a 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -228,38 +228,36 @@ const NewPage = createClass({ } if(this.state.errors.response.req.url.match(/^\/api\/.*Google.*$/m)){ - if(this.state.errors.status == '403' && this.state.errors.response.body.errors[0].reason == 'insufficientPermissions'){ - return + return Oops! -
+
Looks like your Google credentials have expired! Visit our log in page to sign out and sign back in with Google, then try saving again! - -
+ +
Sign In -
-
-
- Not Now
+ +
+ Not Now
- ; - } - - return - Oops! -
- Looks like there was a problem saving.
- Report the issue - here - .
; } + + return + Oops! +
+ Looks like there was a problem saving.
+ Report the issue + here + . +
+
; } if(this.state.isSaving){ From 4070c531121bae392b2eebe0995c0fc9910e0d79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jan 2022 03:01:11 +0000 Subject: [PATCH 21/86] Bump @babel/plugin-transform-runtime from 7.16.7 to 7.16.8 Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.16.7 to 7.16.8. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.16.8/packages/babel-plugin-transform-runtime) --- updated-dependencies: - dependency-name: "@babel/plugin-transform-runtime" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 99 ++++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 61 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index baca1960a..b21f1c051 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "MIT", "dependencies": { "@babel/core": "^7.16.7", - "@babel/plugin-transform-runtime": "^7.16.7", + "@babel/plugin-transform-runtime": "^7.16.8", "@babel/preset-env": "^7.16.7", "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", @@ -1492,14 +1492,14 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.7.tgz", - "integrity": "sha512-2FoHiSAWkdq4L06uaDN3rS43i6x28desUVxq+zAFuE6kbWYQeiLPJI5IC7Sg9xKYVcrBKSQkVUfH6aeQYbl9QA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.8.tgz", + "integrity": "sha512-6Kg2XHPFnIarNweZxmzbgYnnWsXxkx9WQUVk2sksBRL80lBC1RAQV3wQagWxdCHiYHqPN+oenwNIuttlYgIbQQ==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", "semver": "^6.3.0" }, @@ -1510,6 +1510,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz", + "integrity": "sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.20.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -3599,12 +3611,12 @@ } }, "node_modules/browserslist": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", - "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dependencies": { - "caniuse-lite": "^1.0.30001274", - "electron-to-chromium": "^1.3.886", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -3790,9 +3802,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001275", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001275.tgz", - "integrity": "sha512-ihJVvj8RX0kn9GgP43HKhb5q9s2XQn4nEQhdldEJvZhCsuiB2XOq6fAMYQZaN6FPWfsr2qU0cdL0CSbETwbJAg==", + "version": "1.0.30001298", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz", + "integrity": "sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" @@ -4218,11 +4230,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", - "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.2.tgz", + "integrity": "sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg==", "dependencies": { - "browserslist": "^4.17.6", + "browserslist": "^4.19.1", "semver": "7.0.0" }, "funding": { @@ -4711,9 +4723,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.3.887", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.887.tgz", - "integrity": "sha512-QQUumrEjFDKSVYVdaeBmFdyQGoaV+fCSMyWHvfx/u22bRHSTeBQYt6P4jMY+gFd4kgKB9nqk7RMtWkDB49OYPA==" + "version": "1.4.39", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.39.tgz", + "integrity": "sha512-bFH3gdRq/l7WlzSleiO6dwpZH3RhiJ8vlMq0tOJMfT+5nb+x397eJn2RHF6Ho/9GCKv+BkimNlUMHl9+Yh+Qcg==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -13829,18 +13841,27 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.7.tgz", - "integrity": "sha512-2FoHiSAWkdq4L06uaDN3rS43i6x28desUVxq+zAFuE6kbWYQeiLPJI5IC7Sg9xKYVcrBKSQkVUfH6aeQYbl9QA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.8.tgz", + "integrity": "sha512-6Kg2XHPFnIarNweZxmzbgYnnWsXxkx9WQUVk2sksBRL80lBC1RAQV3wQagWxdCHiYHqPN+oenwNIuttlYgIbQQ==", "requires": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", "semver": "^6.3.0" }, "dependencies": { + "babel-plugin-polyfill-corejs3": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz", + "integrity": "sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.20.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -15529,12 +15550,12 @@ } }, "browserslist": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", - "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "requires": { - "caniuse-lite": "^1.0.30001274", - "electron-to-chromium": "^1.3.886", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -15673,9 +15694,9 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-lite": { - "version": "1.0.30001275", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001275.tgz", - "integrity": "sha512-ihJVvj8RX0kn9GgP43HKhb5q9s2XQn4nEQhdldEJvZhCsuiB2XOq6fAMYQZaN6FPWfsr2qU0cdL0CSbETwbJAg==" + "version": "1.0.30001298", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz", + "integrity": "sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ==" }, "chalk": { "version": "3.0.0", @@ -16014,11 +16035,11 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js-compat": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", - "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.2.tgz", + "integrity": "sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg==", "requires": { - "browserslist": "^4.17.6", + "browserslist": "^4.19.1", "semver": "7.0.0" }, "dependencies": { @@ -16429,9 +16450,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.887", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.887.tgz", - "integrity": "sha512-QQUumrEjFDKSVYVdaeBmFdyQGoaV+fCSMyWHvfx/u22bRHSTeBQYt6P4jMY+gFd4kgKB9nqk7RMtWkDB49OYPA==" + "version": "1.4.39", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.39.tgz", + "integrity": "sha512-bFH3gdRq/l7WlzSleiO6dwpZH3RhiJ8vlMq0tOJMfT+5nb+x397eJn2RHF6Ho/9GCKv+BkimNlUMHl9+Yh+Qcg==" }, "elliptic": { "version": "6.5.4", diff --git a/package.json b/package.json index 77fc99a47..59e8a9677 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ }, "dependencies": { "@babel/core": "^7.16.7", - "@babel/plugin-transform-runtime": "^7.16.7", + "@babel/plugin-transform-runtime": "^7.16.8", "@babel/preset-env": "^7.16.7", "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", From 0861e1ed295f1eddeaabd249c61c1cd0d8afe159 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jan 2022 03:01:23 +0000 Subject: [PATCH 22/86] Bump mongoose from 6.1.5 to 6.1.6 Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.5 to 6.1.6. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/6.1.5...6.1.6) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index baca1960a..d3a47f715 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.1.5", + "mongoose": "^6.1.6", "nanoid": "3.1.30", "nconf": "^0.11.3", "prop-types": "15.8.0", @@ -9267,9 +9267,9 @@ } }, "node_modules/mongoose": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.5.tgz", - "integrity": "sha512-0rRxTBoqMSuQF/YM3TEvbHn8Ybnd9dRjD7DItEjCXK0vwC/muLKXZ4rVCN4KAnWQAkwYzoWw2tXAy0YF6TUdEg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.6.tgz", + "integrity": "sha512-wvNRJ547x/Bn3EMhwbVInNsEp2OdlMxk4Q/vfgAkw8OI+giZQ72S90ZH0H6VzzIhs4lCU9SwXHYa2O0sPicnEQ==", "dependencies": { "@types/node": "< 17.0.6", "bson": "^4.2.2", @@ -19886,9 +19886,9 @@ } }, "mongoose": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.5.tgz", - "integrity": "sha512-0rRxTBoqMSuQF/YM3TEvbHn8Ybnd9dRjD7DItEjCXK0vwC/muLKXZ4rVCN4KAnWQAkwYzoWw2tXAy0YF6TUdEg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.6.tgz", + "integrity": "sha512-wvNRJ547x/Bn3EMhwbVInNsEp2OdlMxk4Q/vfgAkw8OI+giZQ72S90ZH0H6VzzIhs4lCU9SwXHYa2O0sPicnEQ==", "requires": { "@types/node": "< 17.0.6", "bson": "^4.2.2", diff --git a/package.json b/package.json index 77fc99a47..95f98372a 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.1.5", + "mongoose": "^6.1.6", "nanoid": "3.1.30", "nconf": "^0.11.3", "prop-types": "15.8.0", From 51cf363c845454561d1a776dc0b6eb58ab1e0995 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jan 2022 16:25:18 +0000 Subject: [PATCH 23/86] Bump @babel/preset-env from 7.16.7 to 7.16.8 Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.16.7 to 7.16.8. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.16.8/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 255 +++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 118 insertions(+), 139 deletions(-) diff --git a/package-lock.json b/package-lock.json index 295f80a66..c45e525b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@babel/core": "^7.16.7", "@babel/plugin-transform-runtime": "^7.16.8", - "@babel/preset-env": "^7.16.7", + "@babel/preset-env": "^7.16.8", "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", "classnames": "^2.3.1", @@ -67,9 +67,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", "engines": { "node": ">=6.9.0" } @@ -149,11 +149,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", - "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "dependencies": { - "@babel/types": "^7.16.7", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -416,13 +416,13 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.7.tgz", - "integrity": "sha512-C3o117GnP/j/N2OWo+oepeWbFEKRfNaay+F1Eo5Mj3A1SRjyx+qaFhm23nlipub7Cjv2azdUUiDH+VlpdwUFRg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" }, "engines": { "node": ">=6.9.0" @@ -493,14 +493,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.7.tgz", - "integrity": "sha512-7a9sABeVwcunnztZZ7WTgSw6jVYLzM1wua0Z4HIXm9S3/HC96WKQTkFgGEaj5W06SHHihPJ6Le6HzS5cGOQMNw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dependencies": { "@babel/helper-function-name": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" }, "engines": { "node": ">=6.9.0" @@ -562,9 +562,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/@babel/parser": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", - "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -603,12 +603,12 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.7.tgz", - "integrity": "sha512-TTXBT3A5c11eqRzaC6beO6rlFT3Mo9C2e8eB44tTr52ESXSK2CIc2fOp1ynpAwQA8HhBMho+WXhMHWlAe3xkpw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1063,13 +1063,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.7.tgz", - "integrity": "sha512-pFEfjnK4DfXCfAlA5I98BYdDJD8NltMzx19gt6DAmfE+2lXRfPUoa0/5SUjT4+TDE1W/rcxU/1lgN55vpAjjdg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.7" + "@babel/helper-remap-async-to-generator": "^7.16.8" }, "engines": { "node": ">=6.9.0" @@ -1282,9 +1282,9 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.7.tgz", - "integrity": "sha512-h2RP2kE7He1ZWKyAlanMZrAbdv+Acw1pA8dQZhE025WJZE2z0xzFADAinXA9fxd5bn7JnM+SdOGcndGx1ARs9w==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "dependencies": { "@babel/helper-module-transforms": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -1332,9 +1332,9 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.7.tgz", - "integrity": "sha512-kFy35VwmwIQwCjwrAQhl3+c/kr292i4KdLPKp5lPH03Ltc51qnFlIADoyPxc/6Naz3ok3WdYKg+KK6AH+D4utg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.7" }, @@ -1510,18 +1510,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz", - "integrity": "sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.20.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -1631,17 +1619,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.7.tgz", - "integrity": "sha512-urX3Cee4aOZbRWOSa3mKPk0aqDikfILuo+C7qq7HY0InylGNZ1fekq9jmlr3pLWwZHF4yD7heQooc2Pow2KMyQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.8.tgz", + "integrity": "sha512-9rNKgVCdwHb3z1IlbMyft6yIXIeP3xz6vWvGaLHrJThuEIqWfHb0DNBH9VuTgnDfdbUDhkmkvMZS/YMCtP7Elg==", "dependencies": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", "@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-class-static-block": "^7.16.7", "@babel/plugin-proposal-dynamic-import": "^7.16.7", @@ -1671,7 +1659,7 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", "@babel/plugin-transform-block-scoped-functions": "^7.16.7", "@babel/plugin-transform-block-scoping": "^7.16.7", "@babel/plugin-transform-classes": "^7.16.7", @@ -1685,10 +1673,10 @@ "@babel/plugin-transform-literals": "^7.16.7", "@babel/plugin-transform-member-expression-literals": "^7.16.7", "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", "@babel/plugin-transform-modules-systemjs": "^7.16.7", "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", "@babel/plugin-transform-new-target": "^7.16.7", "@babel/plugin-transform-object-super": "^7.16.7", "@babel/plugin-transform-parameters": "^7.16.7", @@ -1703,11 +1691,11 @@ "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.7", + "@babel/types": "^7.16.8", "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.19.1", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" }, "engines": { @@ -1789,18 +1777,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", - "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", + "@babel/generator": "^7.16.8", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1833,9 +1821,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz", - "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -3202,12 +3190,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", - "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz", + "integrity": "sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ==", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.18.0" + "core-js-compat": "^3.20.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -12892,9 +12880,9 @@ } }, "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==" + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==" }, "@babel/core": { "version": "7.16.7", @@ -12952,11 +12940,11 @@ } }, "@babel/generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", - "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "requires": { - "@babel/types": "^7.16.7", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -13148,13 +13136,13 @@ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.7.tgz", - "integrity": "sha512-C3o117GnP/j/N2OWo+oepeWbFEKRfNaay+F1Eo5Mj3A1SRjyx+qaFhm23nlipub7Cjv2azdUUiDH+VlpdwUFRg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helper-replace-supers": { @@ -13204,14 +13192,14 @@ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helper-wrap-function": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.7.tgz", - "integrity": "sha512-7a9sABeVwcunnztZZ7WTgSw6jVYLzM1wua0Z4HIXm9S3/HC96WKQTkFgGEaj5W06SHHihPJ6Le6HzS5cGOQMNw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "requires": { "@babel/helper-function-name": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helpers": { @@ -13260,9 +13248,9 @@ } }, "@babel/parser": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", - "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==" + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -13283,12 +13271,12 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.7.tgz", - "integrity": "sha512-TTXBT3A5c11eqRzaC6beO6rlFT3Mo9C2e8eB44tTr52ESXSK2CIc2fOp1ynpAwQA8HhBMho+WXhMHWlAe3xkpw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "requires": { "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, @@ -13581,13 +13569,13 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.7.tgz", - "integrity": "sha512-pFEfjnK4DfXCfAlA5I98BYdDJD8NltMzx19gt6DAmfE+2lXRfPUoa0/5SUjT4+TDE1W/rcxU/1lgN55vpAjjdg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "requires": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.7" + "@babel/helper-remap-async-to-generator": "^7.16.8" } }, "@babel/plugin-transform-block-scoped-functions": { @@ -13715,9 +13703,9 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.7.tgz", - "integrity": "sha512-h2RP2kE7He1ZWKyAlanMZrAbdv+Acw1pA8dQZhE025WJZE2z0xzFADAinXA9fxd5bn7JnM+SdOGcndGx1ARs9w==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "requires": { "@babel/helper-module-transforms": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -13747,9 +13735,9 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.7.tgz", - "integrity": "sha512-kFy35VwmwIQwCjwrAQhl3+c/kr292i4KdLPKp5lPH03Ltc51qnFlIADoyPxc/6Naz3ok3WdYKg+KK6AH+D4utg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.7" } @@ -13853,15 +13841,6 @@ "semver": "^6.3.0" }, "dependencies": { - "babel-plugin-polyfill-corejs3": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz", - "integrity": "sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.20.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -13928,17 +13907,17 @@ } }, "@babel/preset-env": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.7.tgz", - "integrity": "sha512-urX3Cee4aOZbRWOSa3mKPk0aqDikfILuo+C7qq7HY0InylGNZ1fekq9jmlr3pLWwZHF4yD7heQooc2Pow2KMyQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.8.tgz", + "integrity": "sha512-9rNKgVCdwHb3z1IlbMyft6yIXIeP3xz6vWvGaLHrJThuEIqWfHb0DNBH9VuTgnDfdbUDhkmkvMZS/YMCtP7Elg==", "requires": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", "@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-class-static-block": "^7.16.7", "@babel/plugin-proposal-dynamic-import": "^7.16.7", @@ -13968,7 +13947,7 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", "@babel/plugin-transform-block-scoped-functions": "^7.16.7", "@babel/plugin-transform-block-scoping": "^7.16.7", "@babel/plugin-transform-classes": "^7.16.7", @@ -13982,10 +13961,10 @@ "@babel/plugin-transform-literals": "^7.16.7", "@babel/plugin-transform-member-expression-literals": "^7.16.7", "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", "@babel/plugin-transform-modules-systemjs": "^7.16.7", "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", "@babel/plugin-transform-new-target": "^7.16.7", "@babel/plugin-transform-object-super": "^7.16.7", "@babel/plugin-transform-parameters": "^7.16.7", @@ -14000,11 +13979,11 @@ "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.7", + "@babel/types": "^7.16.8", "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.19.1", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" }, "dependencies": { @@ -14066,18 +14045,18 @@ } }, "@babel/traverse": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", - "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", + "@babel/generator": "^7.16.8", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -14103,9 +14082,9 @@ } }, "@babel/types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz", - "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -15198,12 +15177,12 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", - "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.0.tgz", + "integrity": "sha512-Hcrgnmkf+4JTj73GbK3bBhlVPiLL47owUAnoJIf69Hakl3q+KfodbDXiZWGMM7iqCZTxCG3Z2VRfPNYES4rXqQ==", "requires": { "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.18.0" + "core-js-compat": "^3.20.0" } }, "babel-plugin-polyfill-regenerator": { diff --git a/package.json b/package.json index da5106717..1370ff96e 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "dependencies": { "@babel/core": "^7.16.7", "@babel/plugin-transform-runtime": "^7.16.8", - "@babel/preset-env": "^7.16.7", + "@babel/preset-env": "^7.16.8", "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", "classnames": "^2.3.1", From 8895b44be9b2f401243d1ef266cbc327acbef26f Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Tue, 11 Jan 2022 22:24:23 +0300 Subject: [PATCH 24/86] [NFC] Outline an express app into a separate module This is done in order to be able to re-use that app in API unit tests later --- server.js | 301 ++------------------------------------------------ server/app.js | 298 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 306 insertions(+), 293 deletions(-) create mode 100644 server/app.js diff --git a/server.js b/server.js index 3bdb77b92..c9ce63c8f 100644 --- a/server.js +++ b/server.js @@ -1,75 +1,5 @@ -/*eslint max-lines: ["warn", {"max": 300, "skipBlankLines": true, "skipComments": true}]*/ -const _ = require('lodash'); -const jwt = require('jwt-simple'); -const express = require('express'); -const yaml = require('js-yaml'); -const app = express(); - -const homebrewApi = require('./server/homebrew.api.js'); -const GoogleActions = require('./server/googleActions.js'); -const serveCompressedStaticAssets = require('./server/static-assets.mv.js'); -const sanitizeFilename = require('sanitize-filename'); -const asyncHandler = require('express-async-handler'); - -const brewAccessTypes = ['edit', 'share', 'raw']; - -//Get the brew object from the HB database or Google Drive -const getBrewFromId = asyncHandler(async (id, accessType)=>{ - if(!brewAccessTypes.includes(accessType)) - throw ('Invalid Access Type when getting brew'); - let brew; - if(id.length > 12) { - const googleId = id.slice(0, -12); - id = id.slice(-12); - brew = await GoogleActions.readFileMetadata(config.get('google_api_key'), googleId, id, accessType); - } else { - brew = await HomebrewModel.get(accessType == 'edit' ? { editId: id } : { shareId: id }); - brew = brew.toObject(); // Convert MongoDB object to standard Javascript Object - } - - brew = sanitizeBrew(brew, accessType === 'edit' ? false : true); - //Split brew.text into text and style - //unless the Access Type is RAW, in which case return immediately - if(accessType == 'raw') { - return brew; - } - splitTextStyleAndMetadata(brew); - return brew; -}); - -const sanitizeBrew = (brew, full=false)=>{ - delete brew._id; - delete brew.__v; - if(full){ - delete brew.editId; - } - return brew; -}; - -const splitTextStyleAndMetadata = (brew)=>{ - brew.text = brew.text.replaceAll('\r\n', '\n'); - if(brew.text.startsWith('```metadata')) { - const index = brew.text.indexOf('```\n\n'); - const metadataSection = brew.text.slice(12, index - 1); - const metadata = yaml.load(metadataSection); - Object.assign(brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer'])); - brew.text = brew.text.slice(index + 5); - } - if(brew.text.startsWith('```css')) { - const index = brew.text.indexOf('```\n\n'); - brew.style = brew.text.slice(7, index - 1); - brew.text = brew.text.slice(index + 5); - } -}; - -app.use('/', serveCompressedStaticAssets(`${__dirname}/build`)); - -process.chdir(__dirname); - -//app.use(express.static(`${__dirname}/build`)); -app.use(require('body-parser').json({ limit: '25mb' })); -app.use(require('cookie-parser')()); -app.use(require('./server/forcessl.mw.js')); +const DB = require('./server/db.js'); +const server = require('./server/app.js'); const config = require('nconf') .argv() @@ -77,226 +7,11 @@ const config = require('nconf') .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) .file('defaults', { file: 'config/default.json' }); -// DB -const DB = require('./server/db.js'); -DB.connect(config); - -//Account Middleware -app.use((req, res, next)=>{ - if(req.cookies && req.cookies.nc_session){ - try { - req.account = jwt.decode(req.cookies.nc_session, config.get('secret')); - //console.log("Just loaded up JWT from cookie:"); - //console.log(req.account); - } catch (e){} - } - - req.config = { - google_client_id : config.get('google_client_id'), - google_client_secret : config.get('google_client_secret') - }; - return next(); -}); - -app.use(homebrewApi); -app.use(require('./server/admin.api.js')); - -const HomebrewModel = require('./server/homebrew.model.js').model; -const welcomeText = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg.md', 'utf8'); -const welcomeTextV3 = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8'); -const changelogText = require('fs').readFileSync('./changelog.md', 'utf8'); -const faqText = require('fs').readFileSync('./faq.md', 'utf8'); - -String.prototype.replaceAll = function(s, r){return this.split(s).join(r);}; - -//Robots.txt -app.get('/robots.txt', (req, res)=>{ - return res.sendFile(`${__dirname}/robots.txt`); -}); - -//Home page -app.get('/', async (req, res, next)=>{ - const brew = { - text : welcomeText - }; - req.brew = brew; - return next(); -}); - -//Home page v3 -app.get('/v3_preview', async (req, res, next)=>{ - const brew = { - text : welcomeTextV3, - renderer : 'V3' - }; - splitTextStyleAndMetadata(brew); - req.brew = brew; - return next(); -}); - -//Changelog page -app.get('/changelog', async (req, res, next)=>{ - const brew = { - title : 'Changelog', - text : changelogText, - renderer : 'V3' - }; - splitTextStyleAndMetadata(brew); - req.brew = brew; - return next(); -}); - -//FAQ page -app.get('/faq', async (req, res, next)=>{ - const brew = { - title : 'FAQ', - text : faqText, - renderer : 'V3' - }; - splitTextStyleAndMetadata(brew); - req.brew = brew; - return next(); -}); - -//Source page -app.get('/source/:id', asyncHandler(async (req, res)=>{ - const brew = await getBrewFromId(req.params.id, 'raw'); - - const replaceStrings = { '&': '&', '<': '<', '>': '>' }; - let text = brew.text; - for (const replaceStr in replaceStrings) { - text = text.replaceAll(replaceStr, replaceStrings[replaceStr]); - } - text = `
${text}
`; - res.status(200).send(text); -})); - -//Download brew source page -app.get('/download/:id', asyncHandler(async (req, res)=>{ - const brew = await getBrewFromId(req.params.id, 'raw'); - const prefix = 'HB - '; - - let fileName = sanitizeFilename(`${prefix}${brew.title}`).replaceAll(' ', ''); - if(!fileName || !fileName.length) { fileName = `${prefix}-Untitled-Brew`; }; - res.set({ - 'Cache-Control' : 'no-cache', - 'Content-Type' : 'text/plain', - 'Content-Disposition' : `attachment; filename="${fileName}.txt"` +DB.connect(config).then(()=>{ + // Ensure that we have successfully connected to the database + // before launching server + const PORT = process.env.PORT || config.get('web_port') || 8000; + server.app.listen(PORT, ()=>{ + console.log(`server on port: ${PORT}`); }); - res.status(200).send(brew.text); -})); - -//User Page -app.get('/user/:username', async (req, res, next)=>{ - const ownAccount = req.account && (req.account.username == req.params.username); - - let brews = await HomebrewModel.getByUser(req.params.username, ownAccount) - .catch((err)=>{ - console.log(err); - }); - - if(ownAccount && req?.account?.googleId){ - const googleBrews = await GoogleActions.listGoogleBrews(req, res) - .catch((err)=>{ - console.error(err); - }); - - if(googleBrews) - brews = _.concat(brews, googleBrews); - } - - req.brews = _.map(brews, (brew)=>{ - return sanitizeBrew(brew, !ownAccount); - }); - - return next(); -}); - -//Edit Page -app.get('/edit/:id', asyncHandler(async (req, res, next)=>{ - res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. - const brew = await getBrewFromId(req.params.id, 'edit'); - req.brew = brew; - return next(); -})); - -//New Page -app.get('/new/:id', asyncHandler(async (req, res, next)=>{ - const brew = await getBrewFromId(req.params.id, 'share'); - brew.title = `CLONE - ${brew.title}`; - req.brew = brew; - return next(); -})); - -//Share Page -app.get('/share/:id', asyncHandler(async (req, res, next)=>{ - const brew = await getBrewFromId(req.params.id, 'share'); - - if(req.params.id.length > 12) { - const googleId = req.params.id.slice(0, -12); - const shareId = req.params.id.slice(-12); - await GoogleActions.increaseView(googleId, shareId, 'share', brew) - .catch((err)=>{next(err);}); - } else { - await HomebrewModel.increaseView({ shareId: brew.shareId }); - } - - req.brew = brew; - return next(); -})); - -//Print Page -app.get('/print/:id', asyncHandler(async (req, res, next)=>{ - const brew = await getBrewFromId(req.params.id, 'share'); - req.brew = brew; - return next(); -})); - -//Render the page -const templateFn = require('./client/template.js'); -app.use((req, res)=>{ - const props = { - version : require('./package.json').version, - url : req.originalUrl, - brew : req.brew, - brews : req.brews, - googleBrews : req.googleBrews, - account : req.account, - enable_v3 : config.get('enable_v3') - }; - templateFn('homebrew', title = req.brew ? req.brew.title : '', props) - .then((page)=>{ res.send(page); }) - .catch((err)=>{ - console.log(err); - return res.sendStatus(500); - }); -}); - -//v=====----- Error-Handling Middleware -----=====v// -//Format Errors so all fields will be sent -const replaceErrors = (key, value)=>{ - if(value instanceof Error) { - const error = {}; - Object.getOwnPropertyNames(value).forEach(function (key) { - error[key] = value[key]; - }); - return error; - } - return value; -}; - -const getPureError = (error)=>{ - return JSON.parse(JSON.stringify(error, replaceErrors)); -}; - -app.use((err, req, res, next)=>{ - const status = err.status || 500; - console.error(err); - res.status(status).send(getPureError(err)); -}); -//^=====--------------------------------------=====^// - -const PORT = process.env.PORT || config.get('web_port') || 8000; -app.listen(PORT, ()=>{ - console.log(`server on port:${PORT}`); }); diff --git a/server/app.js b/server/app.js new file mode 100644 index 000000000..1d940aff3 --- /dev/null +++ b/server/app.js @@ -0,0 +1,298 @@ +/*eslint max-lines: ["warn", {"max": 300, "skipBlankLines": true, "skipComments": true}]*/ +const _ = require('lodash'); +const jwt = require('jwt-simple'); +const express = require('express'); +const yaml = require('js-yaml'); +const app = express(); + +const homebrewApi = require('./homebrew.api.js'); +const GoogleActions = require('./googleActions.js'); +const serveCompressedStaticAssets = require('./static-assets.mv.js'); +const sanitizeFilename = require('sanitize-filename'); +const asyncHandler = require('express-async-handler'); + +const brewAccessTypes = ['edit', 'share', 'raw']; + +//Get the brew object from the HB database or Google Drive +const getBrewFromId = asyncHandler(async (id, accessType)=>{ + if(!brewAccessTypes.includes(accessType)) + throw ('Invalid Access Type when getting brew'); + let brew; + if(id.length > 12) { + const googleId = id.slice(0, -12); + id = id.slice(-12); + brew = await GoogleActions.readFileMetadata(config.get('google_api_key'), googleId, id, accessType); + } else { + brew = await HomebrewModel.get(accessType == 'edit' ? { editId: id } : { shareId: id }); + brew = brew.toObject(); // Convert MongoDB object to standard Javascript Object + } + + brew = sanitizeBrew(brew, accessType === 'edit' ? false : true); + //Split brew.text into text and style + //unless the Access Type is RAW, in which case return immediately + if(accessType == 'raw') { + return brew; + } + splitTextStyleAndMetadata(brew); + return brew; +}); + +const sanitizeBrew = (brew, full=false)=>{ + delete brew._id; + delete brew.__v; + if(full){ + delete brew.editId; + } + return brew; +}; + +const splitTextStyleAndMetadata = (brew)=>{ + brew.text = brew.text.replaceAll('\r\n', '\n'); + if(brew.text.startsWith('```metadata')) { + const index = brew.text.indexOf('```\n\n'); + const metadataSection = brew.text.slice(12, index - 1); + const metadata = yaml.load(metadataSection); + Object.assign(brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer'])); + brew.text = brew.text.slice(index + 5); + } + if(brew.text.startsWith('```css')) { + const index = brew.text.indexOf('```\n\n'); + brew.style = brew.text.slice(7, index - 1); + brew.text = brew.text.slice(index + 5); + } +}; + +app.use('/', serveCompressedStaticAssets(`${__dirname}/../build`)); + +process.chdir(__dirname); + +//app.use(express.static(`${__dirname}/build`)); +app.use(require('body-parser').json({ limit: '25mb' })); +app.use(require('cookie-parser')()); +app.use(require('./forcessl.mw.js')); + +// FIXME: the config should be passed as an argument for the app +const config = require('nconf') + .argv() + .env({ lowerCase: true }) + .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) + .file('defaults', { file: 'config/default.json' }); + +//Account Middleware +app.use((req, res, next)=>{ + if(req.cookies && req.cookies.nc_session){ + try { + req.account = jwt.decode(req.cookies.nc_session, config.get('secret')); + //console.log("Just loaded up JWT from cookie:"); + //console.log(req.account); + } catch (e){} + } + + req.config = { + google_client_id : config.get('google_client_id'), + google_client_secret : config.get('google_client_secret') + }; + return next(); +}); + +app.use(homebrewApi); +app.use(require('./admin.api.js')); + +const HomebrewModel = require('./homebrew.model.js').model; +const welcomeText = require('fs').readFileSync('./../client/homebrew/pages/homePage/welcome_msg.md', 'utf8'); +const welcomeTextV3 = require('fs').readFileSync('./../client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8'); +const changelogText = require('fs').readFileSync('./../changelog.md', 'utf8'); +const faqText = require('fs').readFileSync('./../faq.md', 'utf8'); + +String.prototype.replaceAll = function(s, r){return this.split(s).join(r);}; + +//Robots.txt +app.get('/robots.txt', (req, res)=>{ + return res.sendFile(`${__dirname}/robots.txt`); +}); + +//Home page +app.get('/', async (req, res, next)=>{ + const brew = { + text : welcomeText + }; + req.brew = brew; + return next(); +}); + +//Home page v3 +app.get('/v3_preview', async (req, res, next)=>{ + const brew = { + text : welcomeTextV3, + renderer : 'V3' + }; + splitTextStyleAndMetadata(brew); + req.brew = brew; + return next(); +}); + +//Changelog page +app.get('/changelog', async (req, res, next)=>{ + const brew = { + title : 'Changelog', + text : changelogText, + renderer : 'V3' + }; + splitTextStyleAndMetadata(brew); + req.brew = brew; + return next(); +}); + +//FAQ page +app.get('/faq', async (req, res, next)=>{ + const brew = { + title : 'FAQ', + text : faqText, + renderer : 'V3' + }; + splitTextStyleAndMetadata(brew); + req.brew = brew; + return next(); +}); + +//Source page +app.get('/source/:id', asyncHandler(async (req, res)=>{ + const brew = await getBrewFromId(req.params.id, 'raw'); + + const replaceStrings = { '&': '&', '<': '<', '>': '>' }; + let text = brew.text; + for (const replaceStr in replaceStrings) { + text = text.replaceAll(replaceStr, replaceStrings[replaceStr]); + } + text = `
${text}
`; + res.status(200).send(text); +})); + +//Download brew source page +app.get('/download/:id', asyncHandler(async (req, res)=>{ + const brew = await getBrewFromId(req.params.id, 'raw'); + const prefix = 'HB - '; + + let fileName = sanitizeFilename(`${prefix}${brew.title}`).replaceAll(' ', ''); + if(!fileName || !fileName.length) { fileName = `${prefix}-Untitled-Brew`; }; + res.set({ + 'Cache-Control' : 'no-cache', + 'Content-Type' : 'text/plain', + 'Content-Disposition' : `attachment; filename="${fileName}.txt"` + }); + res.status(200).send(brew.text); +})); + +//User Page +app.get('/user/:username', async (req, res, next)=>{ + const ownAccount = req.account && (req.account.username == req.params.username); + + let brews = await HomebrewModel.getByUser(req.params.username, ownAccount) + .catch((err)=>{ + console.log(err); + }); + + if(ownAccount && req?.account?.googleId){ + const googleBrews = await GoogleActions.listGoogleBrews(req, res) + .catch((err)=>{ + console.error(err); + }); + + if(googleBrews) + brews = _.concat(brews, googleBrews); + } + + req.brews = _.map(brews, (brew)=>{ + return sanitizeBrew(brew, !ownAccount); + }); + + return next(); +}); + +//Edit Page +app.get('/edit/:id', asyncHandler(async (req, res, next)=>{ + res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. + const brew = await getBrewFromId(req.params.id, 'edit'); + req.brew = brew; + return next(); +})); + +//New Page +app.get('/new/:id', asyncHandler(async (req, res, next)=>{ + const brew = await getBrewFromId(req.params.id, 'share'); + brew.title = `CLONE - ${brew.title}`; + req.brew = brew; + return next(); +})); + +//Share Page +app.get('/share/:id', asyncHandler(async (req, res, next)=>{ + const brew = await getBrewFromId(req.params.id, 'share'); + + if(req.params.id.length > 12) { + const googleId = req.params.id.slice(0, -12); + const shareId = req.params.id.slice(-12); + await GoogleActions.increaseView(googleId, shareId, 'share', brew) + .catch((err)=>{next(err);}); + } else { + await HomebrewModel.increaseView({ shareId: brew.shareId }); + } + + req.brew = brew; + return next(); +})); + +//Print Page +app.get('/print/:id', asyncHandler(async (req, res, next)=>{ + const brew = await getBrewFromId(req.params.id, 'share'); + req.brew = brew; + return next(); +})); + +//Render the page +const templateFn = require('./../client/template.js'); +app.use((req, res)=>{ + const props = { + version : require('./../package.json').version, + url : req.originalUrl, + brew : req.brew, + brews : req.brews, + googleBrews : req.googleBrews, + account : req.account, + enable_v3 : config.get('enable_v3') + }; + templateFn('homebrew', title = req.brew ? req.brew.title : '', props) + .then((page)=>{ res.send(page); }) + .catch((err)=>{ + console.log(err); + return res.sendStatus(500); + }); +}); + +//v=====----- Error-Handling Middleware -----=====v// +//Format Errors so all fields will be sent +const replaceErrors = (key, value)=>{ + if(value instanceof Error) { + const error = {}; + Object.getOwnPropertyNames(value).forEach(function (key) { + error[key] = value[key]; + }); + return error; + } + return value; +}; + +const getPureError = (error)=>{ + return JSON.parse(JSON.stringify(error, replaceErrors)); +}; + +app.use((err, req, res, next)=>{ + const status = err.status || 500; + console.error(err); + res.status(status).send(getPureError(err)); +}); +//^=====--------------------------------------=====^// + +module.exports = { + app: app +} From 0dfe18cd18fd0d48f66e65221ade02dde5063933 Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Tue, 11 Jan 2022 23:24:50 +0300 Subject: [PATCH 25/86] Fix liner errors --- server/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/app.js b/server/app.js index 1d940aff3..c36533b9b 100644 --- a/server/app.js +++ b/server/app.js @@ -294,5 +294,5 @@ app.use((err, req, res, next)=>{ //^=====--------------------------------------=====^// module.exports = { - app: app -} + app : app +}; From d4a4e7d139b61471eb38277eb7f59a1fca6d6247 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jan 2022 03:01:44 +0000 Subject: [PATCH 26/86] Bump marked from 4.0.9 to 4.0.10 Bumps [marked](https://github.com/markedjs/marked) from 4.0.9 to 4.0.10. - [Release notes](https://github.com/markedjs/marked/releases) - [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json) - [Commits](https://github.com/markedjs/marked/compare/v4.0.9...v4.0.10) --- updated-dependencies: - dependency-name: marked dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c45e525b0..af5637e1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", - "marked": "4.0.9", + "marked": "4.0.10", "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", @@ -8895,9 +8895,9 @@ } }, "node_modules/marked": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.9.tgz", - "integrity": "sha512-HmoFvQwFLxNESeGupeOC+6CLb5WzcCWQmqvVetsErmrI3vrZ6gBumty5IP0ynLPR0zYSoVY7ITC1GffsYIGkog==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", + "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", "bin": { "marked": "bin/marked.js" }, @@ -19591,9 +19591,9 @@ } }, "marked": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.9.tgz", - "integrity": "sha512-HmoFvQwFLxNESeGupeOC+6CLb5WzcCWQmqvVetsErmrI3vrZ6gBumty5IP0ynLPR0zYSoVY7ITC1GffsYIGkog==" + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", + "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==" }, "marked-extended-tables": { "version": "1.0.3", diff --git a/package.json b/package.json index 1370ff96e..cded4cf39 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", - "marked": "4.0.9", + "marked": "4.0.10", "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", From 6c1b4b1839344e00907838e11f863f05571f5b16 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jan 2022 03:01:30 +0000 Subject: [PATCH 27/86] Bump eslint from 8.6.0 to 8.7.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.6.0 to 8.7.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.6.0...v8.7.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 130 ++++++++++++---------------------------------- package.json | 2 +- 2 files changed, 33 insertions(+), 99 deletions(-) diff --git a/package-lock.json b/package-lock.json index c45e525b0..9e3818bfe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" }, "devDependencies": { - "eslint": "^8.6.0", + "eslint": "^8.7.0", "eslint-plugin-react": "^7.28.0", "jest": "^27.4.5" }, @@ -2820,15 +2820,6 @@ "node": ">=6" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -4772,18 +4763,6 @@ "once": "^1.4.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -4950,9 +4929,9 @@ } }, "node_modules/eslint": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", - "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", + "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.0.5", @@ -4962,11 +4941,10 @@ "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", + "eslint-visitor-keys": "^3.2.0", "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", @@ -4975,7 +4953,7 @@ "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", @@ -4986,9 +4964,7 @@ "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", "regexpp": "^3.2.0", - "semver": "^7.2.1", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", @@ -5104,9 +5080,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5172,27 +5148,21 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/eslint/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -10117,15 +10087,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -14891,12 +14852,6 @@ } } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -16483,15 +16438,6 @@ "once": "^1.4.0" } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, "errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -16615,9 +16561,9 @@ } }, "eslint": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", - "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", + "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.5", @@ -16627,11 +16573,10 @@ "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", + "eslint-visitor-keys": "^3.2.0", "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", @@ -16640,7 +16585,7 @@ "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", @@ -16651,9 +16596,7 @@ "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", "regexpp": "^3.2.0", - "semver": "^7.2.1", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", @@ -16700,21 +16643,18 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -16809,9 +16749,9 @@ } }, "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true }, "espree": { @@ -20531,12 +20471,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", diff --git a/package.json b/package.json index 1370ff96e..8b947f346 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" }, "devDependencies": { - "eslint": "^8.6.0", + "eslint": "^8.7.0", "eslint-plugin-react": "^7.28.0", "jest": "^27.4.5" } From 8d0dbac8824ee05a4d100b3c0e9f8da84597db54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 03:01:19 +0000 Subject: [PATCH 28/86] Bump mongoose from 6.1.6 to 6.1.7 Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.6 to 6.1.7. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/6.1.6...6.1.7) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c45e525b0..8a4c38bf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.1.6", + "mongoose": "^6.1.7", "nanoid": "3.1.30", "nconf": "^0.11.3", "prop-types": "15.8.0", @@ -9267,9 +9267,9 @@ } }, "node_modules/mongoose": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.6.tgz", - "integrity": "sha512-wvNRJ547x/Bn3EMhwbVInNsEp2OdlMxk4Q/vfgAkw8OI+giZQ72S90ZH0H6VzzIhs4lCU9SwXHYa2O0sPicnEQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.7.tgz", + "integrity": "sha512-GqU/G/5yu/CWBHdW24cfGPsW4rADER+eeXj+bwvb6mLjg6uAASl8GnE6pmEbafZJ4Uv9V7jf5LaBMJMNwvQEtg==", "dependencies": { "@types/node": "< 17.0.6", "bson": "^4.2.2", @@ -19886,9 +19886,9 @@ } }, "mongoose": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.6.tgz", - "integrity": "sha512-wvNRJ547x/Bn3EMhwbVInNsEp2OdlMxk4Q/vfgAkw8OI+giZQ72S90ZH0H6VzzIhs4lCU9SwXHYa2O0sPicnEQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.7.tgz", + "integrity": "sha512-GqU/G/5yu/CWBHdW24cfGPsW4rADER+eeXj+bwvb6mLjg6uAASl8GnE6pmEbafZJ4Uv9V7jf5LaBMJMNwvQEtg==", "requires": { "@types/node": "< 17.0.6", "bson": "^4.2.2", diff --git a/package.json b/package.json index 1370ff96e..d977a50d2 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.1.6", + "mongoose": "^6.1.7", "nanoid": "3.1.30", "nconf": "^0.11.3", "prop-types": "15.8.0", From a0e2bcb8e4fefbf3bab2cff79f273348dff45da8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 22:01:45 +0000 Subject: [PATCH 29/86] Bump nanoid from 3.1.30 to 3.2.0 Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.30 to 3.2.0. - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](https://github.com/ai/nanoid/compare/3.1.30...3.2.0) --- updated-dependencies: - dependency-name: nanoid dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ed8b0dea..ae3c5cd8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", "mongoose": "^6.1.7", - "nanoid": "3.1.30", + "nanoid": "3.2.0", "nconf": "^0.11.3", "prop-types": "15.8.0", "query-string": "7.1.0", @@ -9319,9 +9319,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -19891,9 +19891,9 @@ "optional": true }, "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" }, "nanomatch": { "version": "1.2.13", diff --git a/package.json b/package.json index 7f95e9cb7..4ce8c2c68 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", "mongoose": "^6.1.7", - "nanoid": "3.1.30", + "nanoid": "3.2.0", "nconf": "^0.11.3", "prop-types": "15.8.0", "query-string": "7.1.0", From 4ea2fc34f0e903890f254acf88905dc59daa2dc6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jan 2022 03:01:12 +0000 Subject: [PATCH 30/86] Bump @babel/preset-env from 7.16.8 to 7.16.11 Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.16.8 to 7.16.11. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.16.11/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/preset-env" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 46 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ed8b0dea..9f3c0a757 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@babel/core": "^7.16.7", "@babel/plugin-transform-runtime": "^7.16.8", - "@babel/preset-env": "^7.16.8", + "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", "classnames": "^2.3.1", @@ -218,9 +218,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz", - "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -789,11 +789,11 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz", - "integrity": "sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.10", "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { @@ -1619,9 +1619,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.8.tgz", - "integrity": "sha512-9rNKgVCdwHb3z1IlbMyft6yIXIeP3xz6vWvGaLHrJThuEIqWfHb0DNBH9VuTgnDfdbUDhkmkvMZS/YMCtP7Elg==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "dependencies": { "@babel/compat-data": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", @@ -1641,7 +1641,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.16.7", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -12953,9 +12953,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz", - "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -13346,11 +13346,11 @@ } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz", - "integrity": "sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.10", "@babel/helper-plugin-utils": "^7.16.7" } }, @@ -13868,9 +13868,9 @@ } }, "@babel/preset-env": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.8.tgz", - "integrity": "sha512-9rNKgVCdwHb3z1IlbMyft6yIXIeP3xz6vWvGaLHrJThuEIqWfHb0DNBH9VuTgnDfdbUDhkmkvMZS/YMCtP7Elg==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "requires": { "@babel/compat-data": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", @@ -13890,7 +13890,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.16.7", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", diff --git a/package.json b/package.json index 7f95e9cb7..6a2c53d8c 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "dependencies": { "@babel/core": "^7.16.7", "@babel/plugin-transform-runtime": "^7.16.8", - "@babel/preset-env": "^7.16.8", + "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", "classnames": "^2.3.1", From 6cb39709c490736f3d67189ff89fc45fcb889de3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jan 2022 03:01:49 +0000 Subject: [PATCH 31/86] Bump codemirror from 5.65.0 to 5.65.1 Bumps [codemirror](https://github.com/codemirror/CodeMirror) from 5.65.0 to 5.65.1. - [Release notes](https://github.com/codemirror/CodeMirror/releases) - [Changelog](https://github.com/codemirror/CodeMirror/blob/master/CHANGELOG.md) - [Commits](https://github.com/codemirror/CodeMirror/compare/5.65.0...5.65.1) --- updated-dependencies: - dependency-name: codemirror dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ed8b0dea..15829a7c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", "classnames": "^2.3.1", - "codemirror": "^5.65.0", + "codemirror": "^5.65.1", "cookie-parser": "^1.4.6", "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.1", @@ -4004,9 +4004,9 @@ } }, "node_modules/codemirror": { - "version": "5.65.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.0.tgz", - "integrity": "sha512-gWEnHKEcz1Hyz7fsQWpK7P0sPI2/kSkRX2tc7DFA6TmZuDN75x/1ejnH/Pn8adYKrLEA1V2ww6L00GudHZbSKw==" + "version": "5.65.1", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.1.tgz", + "integrity": "sha512-s6aac+DD+4O2u1aBmdxhB7yz2XU7tG3snOyQ05Kxifahz7hoxnfxIRHxiCSEv3TUC38dIVH8G+lZH9UWSfGQxA==" }, "node_modules/collect-v8-coverage": { "version": "1.0.1", @@ -15804,9 +15804,9 @@ "dev": true }, "codemirror": { - "version": "5.65.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.0.tgz", - "integrity": "sha512-gWEnHKEcz1Hyz7fsQWpK7P0sPI2/kSkRX2tc7DFA6TmZuDN75x/1ejnH/Pn8adYKrLEA1V2ww6L00GudHZbSKw==" + "version": "5.65.1", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.1.tgz", + "integrity": "sha512-s6aac+DD+4O2u1aBmdxhB7yz2XU7tG3snOyQ05Kxifahz7hoxnfxIRHxiCSEv3TUC38dIVH8G+lZH9UWSfGQxA==" }, "collect-v8-coverage": { "version": "1.0.1", diff --git a/package.json b/package.json index 7f95e9cb7..63306d8b5 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", "classnames": "^2.3.1", - "codemirror": "^5.65.0", + "codemirror": "^5.65.1", "cookie-parser": "^1.4.6", "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.1", From 9c574503303c0eb66190fe9676261d449f36bf5d Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Sat, 22 Jan 2022 00:18:13 +0300 Subject: [PATCH 32/86] [NFC] Explicitly define variables before using them Fixed two errors which were discovered by trying to run the code in "strict" mode, which is automatically done by Jest testing framework. --- server/app.js | 3 ++- server/googleActions.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/server/app.js b/server/app.js index c36533b9b..db2eaac5f 100644 --- a/server/app.js +++ b/server/app.js @@ -261,7 +261,8 @@ app.use((req, res)=>{ account : req.account, enable_v3 : config.get('enable_v3') }; - templateFn('homebrew', title = req.brew ? req.brew.title : '', props) + const title = req.brew ? req.brew.title : ''; + templateFn('homebrew', title, props) .then((page)=>{ res.send(page); }) .catch((err)=>{ console.log(err); diff --git a/server/googleActions.js b/server/googleActions.js index 0050cb81d..d780dc4ac 100644 --- a/server/googleActions.js +++ b/server/googleActions.js @@ -11,7 +11,7 @@ const config = require('nconf') //let oAuth2Client; -GoogleActions = { +const GoogleActions = { authCheck : (account, res)=>{ if(!account || !account.googleId){ // If not signed into Google From fc1af353f38c5b9049a1625b8121c6ae0488c1a8 Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Sat, 22 Jan 2022 00:36:10 +0300 Subject: [PATCH 33/86] Install and configure required packages for HTTP testing Two new dev dependencies were added: - supertest package to perform HTTP testing - @babel/plugin-transform-runtime Configured jest to so it is able load files from server directory --- package.json | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 7f95e9cb7..e77f33716 100644 --- a/package.json +++ b/package.json @@ -33,18 +33,21 @@ "jest": { "modulePaths": [ "mode_modules", - "shared" - ] + "shared", + "server" + ] }, "babel": { "presets": [ "@babel/preset-env", "@babel/preset-react" + ], + "plugins": [ + "@babel/plugin-transform-runtime" ] }, "dependencies": { "@babel/core": "^7.16.7", - "@babel/plugin-transform-runtime": "^7.16.8", "@babel/preset-env": "^7.16.8", "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", @@ -80,8 +83,10 @@ "vitreum": "git+https://git@github.com/calculuschild/vitreum.git" }, "devDependencies": { + "@babel/plugin-transform-runtime": "^7.16.10", "eslint": "^8.7.0", "eslint-plugin-react": "^7.28.0", - "jest": "^27.4.5" + "jest": "^27.4.5", + "supertest": "^6.2.2" } } From 543d65f43f21b19e0b15d1d18670b963800cb901 Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Sat, 22 Jan 2022 00:36:54 +0300 Subject: [PATCH 34/86] Add very first HTTP tests Added tests for "static" pages like Home, Changelog, FAQ, etc. --- tests/routes/static-pages.test.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 tests/routes/static-pages.test.js diff --git a/tests/routes/static-pages.test.js b/tests/routes/static-pages.test.js new file mode 100644 index 000000000..0d86bc307 --- /dev/null +++ b/tests/routes/static-pages.test.js @@ -0,0 +1,29 @@ +const supertest = require('supertest'); + +// Mimic https responses to avoid being redirected all the time +const app = supertest.agent(require('app.js').app) + .set('X-Forwarded-Proto', 'https'); + +describe('Tests for static pages', ()=>{ + it('Home page works', ()=>{ + return app.get('/').expect(200); + }); + + it('Home page v3 works', ()=>{ + return app.get('/v3_preview').expect(200); + }); + + it('Changelog page works', ()=>{ + return app.get('/changelog').expect(200); + }); + + it('FAQ page works', ()=>{ + return app.get('/faq').expect(200); + }); + + // FIXME: robots.txt file can't be properly loaded under testing environment, + // most likely due to __dirname being different from what is expected + it.skip('robots.txt works', ()=>{ + return app.get('/robots.txt').expect(200); + }); +}); From d7d93c8975148607991dbe35c0885556f9b23e57 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Jan 2022 16:36:20 +0000 Subject: [PATCH 35/86] Bump @babel/plugin-transform-runtime from 7.16.8 to 7.16.10 Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.16.8 to 7.16.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.16.10/packages/babel-plugin-transform-runtime) --- updated-dependencies: - dependency-name: "@babel/plugin-transform-runtime" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 989943c47..b79936a4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "MIT", "dependencies": { "@babel/core": "^7.16.7", - "@babel/plugin-transform-runtime": "^7.16.8", + "@babel/plugin-transform-runtime": "^7.16.10", "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", @@ -1492,9 +1492,9 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.8.tgz", - "integrity": "sha512-6Kg2XHPFnIarNweZxmzbgYnnWsXxkx9WQUVk2sksBRL80lBC1RAQV3wQagWxdCHiYHqPN+oenwNIuttlYgIbQQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -13790,9 +13790,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.8.tgz", - "integrity": "sha512-6Kg2XHPFnIarNweZxmzbgYnnWsXxkx9WQUVk2sksBRL80lBC1RAQV3wQagWxdCHiYHqPN+oenwNIuttlYgIbQQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", "requires": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", diff --git a/package.json b/package.json index a62c3c60f..69a2782aa 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ }, "dependencies": { "@babel/core": "^7.16.7", - "@babel/plugin-transform-runtime": "^7.16.8", + "@babel/plugin-transform-runtime": "^7.16.10", "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "body-parser": "^1.19.1", From 12d0f69e9cb35c997cd99bacc0e0b5b61575db24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Jan 2022 18:23:01 +0000 Subject: [PATCH 36/86] Bump @babel/core from 7.16.7 to 7.16.12 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.16.7 to 7.16.12. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.16.12/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 58 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index b79936a4e..bd5d881ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.16.7", + "@babel/core": "^7.16.12", "@babel/plugin-transform-runtime": "^7.16.10", "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", @@ -75,19 +75,19 @@ } }, "node_modules/@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", + "@babel/generator": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", + "@babel/parser": "^7.16.12", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -562,9 +562,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1777,9 +1777,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -1787,7 +1787,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -12846,19 +12846,19 @@ "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==" }, "@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", + "@babel/generator": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", + "@babel/parser": "^7.16.12", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -13209,9 +13209,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==" + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -14006,9 +14006,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -14016,7 +14016,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" diff --git a/package.json b/package.json index 69a2782aa..941270632 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ ] }, "dependencies": { - "@babel/core": "^7.16.7", + "@babel/core": "^7.16.12", "@babel/plugin-transform-runtime": "^7.16.10", "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", From 4fd085b684ecb3676bd45b9191fc4aa717a01b8c Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Sun, 23 Jan 2022 20:00:16 +0300 Subject: [PATCH 37/86] Update package-lock.json --- package-lock.json | 341 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 328 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd5d881ef..1321a870f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,8 @@ "devDependencies": { "eslint": "^8.7.0", "eslint-plugin-react": "^7.28.0", - "jest": "^27.4.5" + "jest": "^27.4.5", + "supertest": "^6.2.2" }, "engines": { "node": "16.11.x" @@ -2981,6 +2982,12 @@ "node": ">=8" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -4188,9 +4195,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" }, "node_modules/copy-anything": { "version": "2.0.1", @@ -4598,6 +4605,16 @@ "node": ">=0.8.0" } }, + "node_modules/dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/diff-sequences": { "version": "27.4.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", @@ -5624,9 +5641,9 @@ "dev": true }, "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fast-text-encoding": { "version": "1.0.3", @@ -6269,6 +6286,15 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -11595,6 +11621,161 @@ "node": ">=10" } }, + "node_modules/supertest": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.2.tgz", + "integrity": "sha512-wCw9WhAtKJsBvh07RaS+/By91NNE0Wh0DN19/hWPlBOU8tAfOtbZoVSV4xXeoKoxgPx0rx2y+y+8660XtE7jzg==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^7.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/supertest/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/supertest/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/supertest/node_modules/formidable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "dev": true, + "dependencies": { + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/supertest/node_modules/formidable/node_modules/qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "dev": true, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supertest/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/supertest/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/supertest/node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supertest/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/supertest/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/supertest/node_modules/superagent": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz", + "integrity": "sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.3", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "^2.5.0", + "qs": "^6.10.1", + "readable-stream": "^3.6.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -14966,6 +15147,12 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -15951,9 +16138,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" }, "copy-anything": { "version": "2.0.1", @@ -16295,6 +16482,16 @@ "minimist": "^1.1.1" } }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "diff-sequences": { "version": "27.4.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", @@ -17091,9 +17288,9 @@ "dev": true }, "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "fast-text-encoding": { "version": "1.0.3", @@ -17573,6 +17770,12 @@ "minimalistic-assert": "^1.0.1" } }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true + }, "history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -21703,6 +21906,118 @@ } } }, + "supertest": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.2.tgz", + "integrity": "sha512-wCw9WhAtKJsBvh07RaS+/By91NNE0Wh0DN19/hWPlBOU8tAfOtbZoVSV4xXeoKoxgPx0rx2y+y+8660XtE7jzg==", + "dev": true, + "requires": { + "methods": "^1.1.2", + "superagent": "^7.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "dev": true, + "requires": { + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" + }, + "dependencies": { + "qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "dev": true + } + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "superagent": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz", + "integrity": "sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==", + "dev": true, + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.3", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "^2.5.0", + "qs": "^6.10.1", + "readable-stream": "^3.6.0", + "semver": "^7.3.5" + } + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", From 588bcebc877a77a4a357cf54c1459524eaca5b16 Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Fri, 21 Jan 2022 23:11:44 +0300 Subject: [PATCH 38/86] [NFC] Outline config creation into a separate module This is done in order to have config creation rules unified in one place to avoid modifying them multiple times if they change. We already had 3 duplicated pieces of code initializing the config and there will be more config uses in future tests. This resolves #1960 --- server.js | 6 +----- server/config.js | 5 +++++ server/googleActions.js | 6 +----- server/token.js | 6 +----- 4 files changed, 8 insertions(+), 15 deletions(-) create mode 100644 server/config.js diff --git a/server.js b/server.js index c9ce63c8f..3a9b07b51 100644 --- a/server.js +++ b/server.js @@ -1,11 +1,7 @@ const DB = require('./server/db.js'); const server = require('./server/app.js'); -const config = require('nconf') - .argv() - .env({ lowerCase: true }) - .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) - .file('defaults', { file: 'config/default.json' }); +const config = require('./server/config.js'); DB.connect(config).then(()=>{ // Ensure that we have successfully connected to the database diff --git a/server/config.js b/server/config.js new file mode 100644 index 000000000..fc50e68ba --- /dev/null +++ b/server/config.js @@ -0,0 +1,5 @@ +module.exports = require('nconf') + .argv() + .env({ lowerCase: true }) + .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) + .file('defaults', { file: 'config/default.json' }); diff --git a/server/googleActions.js b/server/googleActions.js index 0050cb81d..b4eeba5e3 100644 --- a/server/googleActions.js +++ b/server/googleActions.js @@ -3,11 +3,7 @@ const _ = require('lodash'); const { google } = require('googleapis'); const { nanoid } = require('nanoid'); const token = require('./token.js'); -const config = require('nconf') - .argv() - .env({ lowerCase: true }) // Load environment variables - .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) - .file('defaults', { file: 'config/default.json' }); +const config = require('./config.js'); //let oAuth2Client; diff --git a/server/token.js b/server/token.js index 40d76a484..70d6e01c5 100644 --- a/server/token.js +++ b/server/token.js @@ -1,11 +1,7 @@ const jwt = require('jwt-simple'); // Load configuration values -const config = require('nconf') - .argv() - .env({ lowerCase: true }) // Load environment variables - .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) - .file('defaults', { file: 'config/default.json' }); +const config = require('./config.js'); // Generate an Access Token for the given User ID const generateAccessToken = (account)=>{ From 6fc176e6163bcd055d8e16bbd6153adefa9c1dd6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jan 2022 03:01:18 +0000 Subject: [PATCH 39/86] Bump mongoose from 6.1.7 to 6.1.8 Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.7 to 6.1.8. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/6.1.7...6.1.8) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 66 ++++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 26 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd5d881ef..491343856 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.1.7", + "mongoose": "^6.1.8", "nanoid": "3.2.0", "nconf": "^0.11.3", "prop-types": "15.8.0", @@ -9237,20 +9237,19 @@ } }, "node_modules/mongoose": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.7.tgz", - "integrity": "sha512-GqU/G/5yu/CWBHdW24cfGPsW4rADER+eeXj+bwvb6mLjg6uAASl8GnE6pmEbafZJ4Uv9V7jf5LaBMJMNwvQEtg==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.8.tgz", + "integrity": "sha512-/voqwU2dtet3zAR73r8jdPhqluU1VzIAnk7ecXPJBgyXKREnwQrz40lfW7fLpaqhmMhsAbA+JQ7ICUn2vAVFLw==", "dependencies": { "@types/node": "< 17.0.6", "bson": "^4.2.2", "kareem": "2.3.3", "mongodb": "4.2.2", "mpath": "0.8.4", - "mquery": "4.0.0", + "mquery": "4.0.2", "ms": "2.1.2", "regexp-clone": "1.0.0", - "sift": "13.5.2", - "sliced": "1.0.1" + "sift": "13.5.2" }, "engines": { "node": ">=12.0.0" @@ -9274,22 +9273,20 @@ } }, "node_modules/mquery": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.0.tgz", - "integrity": "sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.2.tgz", + "integrity": "sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA==", "dependencies": { - "debug": "4.x", - "regexp-clone": "^1.0.0", - "sliced": "1.0.1" + "debug": "4.x" }, "engines": { "node": ">=12.0.0" } }, "node_modules/mquery/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -10973,11 +10970,6 @@ "node": ">=8" } }, - "node_modules/sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -19826,20 +19818,19 @@ } }, "mongoose": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.7.tgz", - "integrity": "sha512-GqU/G/5yu/CWBHdW24cfGPsW4rADER+eeXj+bwvb6mLjg6uAASl8GnE6pmEbafZJ4Uv9V7jf5LaBMJMNwvQEtg==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.8.tgz", + "integrity": "sha512-/voqwU2dtet3zAR73r8jdPhqluU1VzIAnk7ecXPJBgyXKREnwQrz40lfW7fLpaqhmMhsAbA+JQ7ICUn2vAVFLw==", "requires": { "@types/node": "< 17.0.6", "bson": "^4.2.2", "kareem": "2.3.3", "mongodb": "4.2.2", "mpath": "0.8.4", - "mquery": "4.0.0", + "mquery": "4.0.2", "ms": "2.1.2", "regexp-clone": "1.0.0", - "sift": "13.5.2", - "sliced": "1.0.1" + "sift": "13.5.2" }, "dependencies": { "ms": { @@ -19855,19 +19846,17 @@ "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" }, "mquery": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.0.tgz", - "integrity": "sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.2.tgz", + "integrity": "sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA==", "requires": { - "debug": "4.x", - "regexp-clone": "^1.0.0", - "sliced": "1.0.1" + "debug": "4.x" }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -21198,11 +21187,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", diff --git a/package.json b/package.json index 941270632..a32121ffe 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.1.7", + "mongoose": "^6.1.8", "nanoid": "3.2.0", "nconf": "^0.11.3", "prop-types": "15.8.0", From 38c0527d35dfa00a6e4acd3c369370ca55b62b35 Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Wed, 26 Jan 2022 08:40:33 -0600 Subject: [PATCH 40/86] Add color mixins, help dropdown, and remove unused nav items --- client/homebrew/navbar/help.navitem.jsx | 49 +++++++++++++++++++ client/homebrew/navbar/issue.navitem.jsx | 13 ----- client/homebrew/navbar/migrate.navitem.jsx | 13 ----- client/homebrew/navbar/navbar.less | 25 ++++++---- client/homebrew/navbar/recent.navitem.jsx | 4 +- client/homebrew/pages/editPage/editPage.jsx | 6 +-- client/homebrew/pages/errorPage/errorPage.jsx | 6 +-- client/homebrew/pages/homePage/homePage.jsx | 6 +-- client/homebrew/pages/newPage/newPage.jsx | 6 +-- client/homebrew/pages/userPage/userPage.jsx | 4 +- shared/naturalcrit/nav/nav.less | 22 +-------- shared/naturalcrit/styles/colors.less | 25 +++++++++- 12 files changed, 102 insertions(+), 77 deletions(-) create mode 100644 client/homebrew/navbar/help.navitem.jsx delete mode 100644 client/homebrew/navbar/issue.navitem.jsx delete mode 100644 client/homebrew/navbar/migrate.navitem.jsx diff --git a/client/homebrew/navbar/help.navitem.jsx b/client/homebrew/navbar/help.navitem.jsx new file mode 100644 index 000000000..7252d03c7 --- /dev/null +++ b/client/homebrew/navbar/help.navitem.jsx @@ -0,0 +1,49 @@ +const React = require('react'); +const createClass = require('create-react-class'); +const _ = require('lodash'); + +const Nav = require('naturalcrit/nav/nav.jsx'); + +const Help = createClass({ + + getInitialState : function() { + return { + showDropdown : false + }; + }, + + handleDropdown : function(show){ + this.setState({ + showDropdown : show + }); + }, + + renderDropdown : function(){ + return !this.state.showDropdown ? null : ; + }, + + render : function(){ + return this.handleDropdown(true)} + onMouseLeave={()=>this.handleDropdown(false)}> + Need Help? + {this.renderDropdown()} + ; + } + +}); + +module.exports = Help; diff --git a/client/homebrew/navbar/issue.navitem.jsx b/client/homebrew/navbar/issue.navitem.jsx deleted file mode 100644 index 529744c29..000000000 --- a/client/homebrew/navbar/issue.navitem.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const React = require('react'); -const createClass = require('create-react-class'); -const Nav = require('naturalcrit/nav/nav.jsx'); - -module.exports = function(props){ - return - report issue - ; -}; diff --git a/client/homebrew/navbar/migrate.navitem.jsx b/client/homebrew/navbar/migrate.navitem.jsx deleted file mode 100644 index d0ac086d3..000000000 --- a/client/homebrew/navbar/migrate.navitem.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const React = require('react'); -const Nav = require('naturalcrit/nav/nav.jsx'); - -module.exports = function(props){ - return - migrate - ; -}; diff --git a/client/homebrew/navbar/navbar.less b/client/homebrew/navbar/navbar.less index 37c28f3e8..b8a032914 100644 --- a/client/homebrew/navbar/navbar.less +++ b/client/homebrew/navbar/navbar.less @@ -1,3 +1,4 @@ +@import 'naturalcrit/styles/colors.less'; @navbarHeight : 28px; @keyframes pinkColoring { //from {color: white;} @@ -67,17 +68,17 @@ color: pink; } } - .migrate.navItem{ - border-right : 1px solid #666; - } - .recent.navItem{ + .recent.navItem, + .help.navItem{ position : relative; .dropdown{ - position : absolute; - top : 28px; - left : 0px; - z-index : 10000; - width : 100%; + position : absolute; + top : 28px; + left : 0px; + z-index : 10000; + width : 100%; + overflow : hidden auto; + max-height : ~"calc(100vh - 28px)"; h4{ display : block; box-sizing : border-box; @@ -91,6 +92,7 @@ &:nth-of-type(2){ background-color: darken(@purple, 30%); } } .item{ + #backgroundColors; .animate(background-color); position : relative; display : block; @@ -104,11 +106,14 @@ background-color : @blue; } .title{ - display : inline-block; overflow : hidden; width : 100%; text-overflow : ellipsis; white-space : nowrap; + + i{ + float: right; + } } .time{ position : absolute; diff --git a/client/homebrew/navbar/recent.navitem.jsx b/client/homebrew/navbar/recent.navitem.jsx index e386d9caf..4e0611b3c 100644 --- a/client/homebrew/navbar/recent.navitem.jsx +++ b/client/homebrew/navbar/recent.navitem.jsx @@ -123,8 +123,8 @@ const RecentItems = createClass({ if(!this.state.showDropdown) return null; const makeItems = (brews)=>{ - return _.map(brews, (brew)=>{ - return + return _.map(brews, (brew, i)=>{ + return {brew.title || '[ no title ]'} {Moment(brew.ts).fromNow()} ; diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 22db79ff7..89bf51e57 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -10,7 +10,7 @@ const Nav = require('naturalcrit/nav/nav.jsx'); const Navbar = require('../../navbar/navbar.jsx'); const NewBrew = require('../../navbar/newbrew.navitem.jsx'); -const ReportIssue = require('../../navbar/issue.navitem.jsx'); +const HelpNavItem = require('../../navbar/help.navitem.jsx'); const PrintLink = require('../../navbar/print.navitem.jsx'); const Account = require('../../navbar/account.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; @@ -23,7 +23,6 @@ const Markdown = require('naturalcrit/markdown.js'); const googleDriveActive = require('../../googleDrive.png'); const googleDriveInactive = require('../../googleDriveMono.png'); -const MigrateNavItem = require('../../navbar/migrate.navitem.jsx'); const SAVE_TIMEOUT = 3000; @@ -434,8 +433,7 @@ const EditPage = createClass({ {this.renderGoogleDriveIcon()} {this.renderSaveButton()} - - + share diff --git a/client/homebrew/pages/errorPage/errorPage.jsx b/client/homebrew/pages/errorPage/errorPage.jsx index 2b7aef8aa..560ab5625 100644 --- a/client/homebrew/pages/errorPage/errorPage.jsx +++ b/client/homebrew/pages/errorPage/errorPage.jsx @@ -7,11 +7,10 @@ const cx = require('classnames'); const Nav = require('naturalcrit/nav/nav.jsx'); const Navbar = require('../../navbar/navbar.jsx'); const PatreonNavItem = require('../../navbar/patreon.navitem.jsx'); -const IssueNavItem = require('../../navbar/issue.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; +const HelpNavItem = require('../../navbar/help.navitem.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); -const MigrateNavItem = require('../../navbar/migrate.navitem.jsx'); const ErrorPage = createClass({ getDefaultProps : function() { @@ -34,8 +33,7 @@ const ErrorPage = createClass({ - - + diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index f7384285d..e95c75c0d 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -9,8 +9,7 @@ const { Meta } = require('vitreum/headtags'); const Nav = require('naturalcrit/nav/nav.jsx'); const Navbar = require('../../navbar/navbar.jsx'); const NewBrewItem = require('../../navbar/newbrew.navitem.jsx'); -const IssueNavItem = require('../../navbar/issue.navitem.jsx'); -const MigrateNavItem = require('../../navbar/migrate.navitem.jsx'); +const HelpNavItem = require('../../navbar/help.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const AccountNavItem = require('../../navbar/account.navitem.jsx'); @@ -59,8 +58,7 @@ const HomePage = createClass({ return - - + diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index b4529f873..21d1d9dcd 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -11,12 +11,11 @@ const Nav = require('naturalcrit/nav/nav.jsx'); const Navbar = require('../../navbar/navbar.jsx'); const AccountNavItem = require('../../navbar/account.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; -const IssueNavItem = require('../../navbar/issue.navitem.jsx'); +const HelpNavItem = require('../../navbar/help.navitem.jsx'); const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); const Editor = require('../../editor/editor.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); -const MigrateNavItem = require('../../navbar/migrate.navitem.jsx'); const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; @@ -291,8 +290,7 @@ const NewPage = createClass({ {this.renderSaveButton()} {this.renderLocalPrintButton()} - - + diff --git a/client/homebrew/pages/userPage/userPage.jsx b/client/homebrew/pages/userPage/userPage.jsx index 3ef0d0340..aa9860128 100644 --- a/client/homebrew/pages/userPage/userPage.jsx +++ b/client/homebrew/pages/userPage/userPage.jsx @@ -13,7 +13,7 @@ const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const Account = require('../../navbar/account.navitem.jsx'); const NewBrew = require('../../navbar/newbrew.navitem.jsx'); const BrewItem = require('./brewItem/brewItem.jsx'); -const ReportIssue = require('../../navbar/issue.navitem.jsx'); +const HelpNavItem = require('../../navbar/help.navitem.jsx'); // const brew = { // title : 'SUPER Long title woah now', @@ -163,7 +163,7 @@ const UserPage = createClass({ - + diff --git a/shared/naturalcrit/nav/nav.less b/shared/naturalcrit/nav/nav.less index fea4c1c8b..02e890dea 100644 --- a/shared/naturalcrit/nav/nav.less +++ b/shared/naturalcrit/nav/nav.less @@ -1,3 +1,4 @@ +@import '../styles/colors'; @keyframes glideDropDown { 0% {transform : translate(0px, -100%); opacity : 0; @@ -49,6 +50,7 @@ nav{ } } .navItem{ + #backgroundColors; .animate(background-color); padding : 8px 12px; cursor : pointer; @@ -62,26 +64,6 @@ nav{ margin-left : 5px; font-size : 13px; } - &.tealLight:hover{ background-color : @tealLight }; - &.teal:hover{ background-color : @teal }; - &.greenLight:hover{ background-color : @greenLight }; - &.green:hover{ background-color : @green }; - &.blueLight:hover{ background-color : @blueLight }; - &.blue:hover{ background-color : @blue }; - &.purpleLight:hover{ background-color : @purpleLight }; - &.purple:hover{ background-color : @purple }; - &.steelLight:hover{ background-color : @steelLight }; - &.steel:hover{ background-color : @steel }; - &.yellowLight:hover{ background-color : @yellowLight }; - &.yellow:hover{ background-color : @yellow }; - &.orangeLight:hover{ background-color : @orangeLight }; - &.orange:hover{ background-color : @orange }; - &.redLight:hover{ background-color : @redLight }; - &.red:hover{ background-color : @red }; - &.silverLight:hover{ background-color : @silverLight }; - &.silver:hover{ background-color : @silver }; - &.greyLight:hover{ background-color : @greyLight }; - &.grey:hover{ background-color : @grey }; } .navSection:last-child .navItem{ border-left : 1px solid #666; diff --git a/shared/naturalcrit/styles/colors.less b/shared/naturalcrit/styles/colors.less index 4fea42bc3..340fb38a7 100644 --- a/shared/naturalcrit/styles/colors.less +++ b/shared/naturalcrit/styles/colors.less @@ -20,4 +20,27 @@ @silverLight : #ECF0F1; @silver : #BDC3C7; @greyLight : #95A5A6; -@grey : #7F8C8D; \ No newline at end of file +@grey : #7F8C8D; + +#backgroundColors { + &.tealLight:hover{ background-color : @tealLight }; + &.teal:hover{ background-color : @teal }; + &.greenLight:hover{ background-color : @greenLight }; + &.green:hover{ background-color : @green }; + &.blueLight:hover{ background-color : @blueLight }; + &.blue:hover{ background-color : @blue }; + &.purpleLight:hover{ background-color : @purpleLight }; + &.purple:hover{ background-color : @purple }; + &.steelLight:hover{ background-color : @steelLight }; + &.steel:hover{ background-color : @steel }; + &.yellowLight:hover{ background-color : @yellowLight }; + &.yellow:hover{ background-color : @yellow }; + &.orangeLight:hover{ background-color : @orangeLight }; + &.orange:hover{ background-color : @orange }; + &.redLight:hover{ background-color : @redLight }; + &.red:hover{ background-color : @red }; + &.silverLight:hover{ background-color : @silverLight }; + &.silver:hover{ background-color : @silver }; + &.greyLight:hover{ background-color : @greyLight }; + &.grey:hover{ background-color : @grey }; +} \ No newline at end of file From e614fbc5a18b3c98c802277848165a6e2b64efd3 Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Wed, 26 Jan 2022 08:46:45 -0600 Subject: [PATCH 41/86] Update app.js from master --- server/app.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/server/app.js b/server/app.js index c36533b9b..0b7228811 100644 --- a/server/app.js +++ b/server/app.js @@ -101,6 +101,7 @@ app.use(require('./admin.api.js')); const HomebrewModel = require('./homebrew.model.js').model; const welcomeText = require('fs').readFileSync('./../client/homebrew/pages/homePage/welcome_msg.md', 'utf8'); const welcomeTextV3 = require('fs').readFileSync('./../client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8'); +const migrateText = require('fs').readFileSync('./../client/homebrew/pages/homePage/migrate.md', 'utf8'); const changelogText = require('fs').readFileSync('./../changelog.md', 'utf8'); const faqText = require('fs').readFileSync('./../faq.md', 'utf8'); @@ -131,6 +132,17 @@ app.get('/v3_preview', async (req, res, next)=>{ return next(); }); +//Legacy/Other Document -> v3 Migration Guide +app.get('/migrate', async (req, res, next)=>{ + const brew = { + text : migrateText, + renderer : 'V3' + }; + splitTextStyleAndMetadata(brew); + req.brew = brew; + return next(); +}); + //Changelog page app.get('/changelog', async (req, res, next)=>{ const brew = { From 2db127d805622f598f1cdead5b8c823efbc87eb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jan 2022 03:01:08 +0000 Subject: [PATCH 42/86] Bump marked from 4.0.10 to 4.0.11 Bumps [marked](https://github.com/markedjs/marked) from 4.0.10 to 4.0.11. - [Release notes](https://github.com/markedjs/marked/releases) - [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json) - [Commits](https://github.com/markedjs/marked/compare/v4.0.10...v4.0.11) --- updated-dependencies: - dependency-name: marked dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd5d881ef..566c2dce7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", - "marked": "4.0.10", + "marked": "4.0.11", "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", @@ -8865,9 +8865,9 @@ } }, "node_modules/marked": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", - "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.11.tgz", + "integrity": "sha512-xL2aJ5JDggqToKOqKHJWIDXaYk24XoGm1mNlhSPFP+0OKRCcKx+/hH7hlAr5LYqBKUzqCANylALgwNstVRgtCw==", "bin": { "marked": "bin/marked.js" }, @@ -19531,9 +19531,9 @@ } }, "marked": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", - "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==" + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.11.tgz", + "integrity": "sha512-xL2aJ5JDggqToKOqKHJWIDXaYk24XoGm1mNlhSPFP+0OKRCcKx+/hH7hlAr5LYqBKUzqCANylALgwNstVRgtCw==" }, "marked-extended-tables": { "version": "1.0.3", diff --git a/package.json b/package.json index 941270632..e275f0d8d 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", - "marked": "4.0.10", + "marked": "4.0.11", "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", From 22b80ffbb20d63fd6c05eef38506e329bfd26c77 Mon Sep 17 00:00:00 2001 From: Charlie Humphreys Date: Wed, 26 Jan 2022 21:56:12 -0600 Subject: [PATCH 43/86] update app templates for welcome messages, add new images --- client/homebrew/pages/homePage/welcome_msg.md | 38 +++++------------- .../homebrew/pages/homePage/welcome_msg_v3.md | 38 +++++++++--------- scripts/buildHomebrew.js | 3 +- server.js | 2 +- server/app.js | 2 +- server/googleActions.js | 2 +- server/token.js | 2 +- themes/assets/discord.png | Bin 0 -> 3149 bytes themes/assets/discordOfManyThings.svg | 1 + themes/assets/github.png | Bin 0 -> 5033 bytes themes/assets/patreon.png | Bin 0 -> 2436 bytes themes/assets/reddit.png | Bin 0 -> 4073 bytes 12 files changed, 36 insertions(+), 52 deletions(-) create mode 100644 themes/assets/discord.png create mode 100644 themes/assets/discordOfManyThings.svg create mode 100644 themes/assets/github.png create mode 100644 themes/assets/patreon.png create mode 100644 themes/assets/reddit.png diff --git a/client/homebrew/pages/homePage/welcome_msg.md b/client/homebrew/pages/homePage/welcome_msg.md index 77be2bfe7..2a15bd89b 100644 --- a/client/homebrew/pages/homePage/welcome_msg.md +++ b/client/homebrew/pages/homePage/welcome_msg.md @@ -1,27 +1,4 @@ -```css -#header { - display: flex; - flex: 0 0 auto; - justify-content: space-between; -} - -#header a { - color: black; -} - -i.domt:before { - content: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3Csvg version='1.1' id='Layer_3' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' height='31' width='31' viewBox='0 0 36 36' style='enable-background:new 0 0 36 36;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bopacity:0.9;%7D .st1%7Bfill:%23001013;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23AA2A29;%7D%0A%3C/style%3E%3Cg class='st0'%3E%3Cpath d='M6.2,1.5C6,1.8,5.9,2,5.8,2.3C5.7,2.8,5.5,3.3,5.5,3.9c0,7.7,0,15.3,0,23c0,1.8,1.2,3.3,2.9,3.7c0.2,0,0.5,0.1,0.7,0.1 c6.3,0,12.7,0,19,0h0.6c-0.3-1.1-0.9-3.1-0.9-3.1l0.2,0.2c0,0,3.8,3.5,5.7,5.2c0.2,0.2,0.3,0.4,0.3,0.7c0,0.8,0,1.5,0,2.3 c-0.6-0.5-1.1-0.9-1.6-1.4c-0.9-0.8-1.8-1.6-2.6-2.3c-0.2-0.2-0.4-0.3-0.7-0.3c-7.2,0-14.3,0-21.5,0c-1.9,0-3.1-0.8-3.8-2.6 c-0.1-0.2-0.1-0.5-0.1-0.7c0-7.1,0-14.3,0-21.4V4.8C3.8,3.3,4.7,2.1,6.2,1.5z'/%3E%3C/g%3E%3Cpath class='st1' d='M28,28c0,0,0.5,1.8,0.8,2.8h-0.5c-6.4,0-12.7,0-19.1,0c-1.6,0-3.2-0.9-3.7-3.1c0-0.2,0-0.4,0-0.5 c0-7.8,0-15.7,0-23.5c0-1.8,1.4-3.4,3.2-3.5c0.3,0,0.5,0,0.8,0c7.5,0,15.1,0,22.6,0c1.2,0,2.3,0.3,3.1,1.3c0.6,0.7,0.9,1.5,0.9,2.3 c0,10.2,0,20.5,0,30.7c0,0.1,0,0.2,0,0.4c-0.4-0.3-0.7-0.6-1-0.9c-2.2-2-4.3-3.9-6.5-5.9c-0.1-0.1-0.3-0.3-0.3-0.3l-0.2-0.2L28,28z' /%3E%3Cpath class='st2' d='M35.4,33.9c-0.7-0.6-1.4-1.2-2-1.8c-1.7-1.6-3.4-3.2-5.2-4.8c-0.2-0.2-0.4-0.3-0.7-0.2 c-0.3,0.1-0.3,0.4-0.2,0.7c0.2,0.8,0.4,1.5,0.7,2.2c0,0.1,0,0.1,0,0.2c-0.1,0-0.3,0-0.4,0c-6.2,0-12.4,0-18.5,0 c-1.7,0-3-1.2-3.2-2.7c0-0.3-0.1-0.6-0.1-0.9c0-7.6,0-15.2,0-22.8c0-1,0.3-1.8,1-2.5c0.5-0.5,1.2-0.8,1.9-0.8c0.2,0,0.4,0,0.5,0 c7.6,0,15.1,0,22.7,0c0.9,0,1.7,0.2,2.4,0.8c0.7,0.7,1,1.6,1,2.5c0,3.7,0,7.5,0,11.2L35.4,33.9L35.4,33.9z'/%3E%3Cpath class='st3' d='M25.6,9.6c-1.1,4.1-2.1,8.2-3.2,12.3l-8.9-9.1L25.6,9.6z'/%3E%3Cpath class='st3' d='M31.9,18.3L23.1,22c1-4,2.1-8,3.1-11.9l0.1,0L31.9,18.3z'/%3E%3Cpath class='st3' d='M12.1,23.5c0.3-3.3,0.5-6.6,0.8-10l8.7,8.9L12.1,23.5z'/%3E%3Cpath class='st3' d='M17.4,3.8l7.6,5.1L13.3,12L17.4,3.8z'/%3E%3Cpath class='st3' d='M30.5,19.7l-6.7,6.7c-0.3-1.2-0.6-2.4-0.9-3.5L30.5,19.7z'/%3E%3Cpath class='st3' d='M22.1,23.1c0.3,1.2,0.6,2.3,1,3.5l-9.1-2.4l0-0.1L22.1,23.1z'/%3E%3Cpath class='st3' d='M31.3,16l-4.7-6.9l2.5-2L31.3,16L31.3,16z'/%3E%3Cpath class='st3' d='M12.1,12.9c-0.2,2.8-0.4,5.6-0.6,8.4l-0.1,0c-0.8-2.9-1.6-5.9-2.4-8.9L12.1,12.9z'/%3E%3Cpath class='st3' d='M26,8.5l-6.3-4.2l0-0.1l8.6,2.3L26,8.5z'/%3E%3Cpath class='st3' d='M9.5,11.7l6.1-6.3l0.1,0.1l-3.4,6.7L9.5,11.7z'/%3E%3C/svg%3E%0A"); -} -``` - - Welcome traveler from an antique land. Please sit and tell us of what you have seen. The unheard of monsters, who slither and bite. Tell us of the wondrous items and and artifacts you have found, their mysteries yet to be unlocked. Of the vexing vocations and surprising skills you have seen. @@ -81,17 +58,20 @@ The Homebrewery is licensed using the [MIT License](https://github.com/naturalcr If you wish to sell or in some way gain profit for what you make on this site, it's your responsibility to ensure you have the proper licenses/rights for any images or resources used. ### More Resources -If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/wiki/resources). +Discord of Many Things Logo +If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/wiki/resources). The Discord of Many Things is another great resource to connect with fellow homebrewers for help and feedback. - - - +
1
PART 1 | FANCINESS
- - +
+Discord +Github +Patreon +Reddit +
\page diff --git a/client/homebrew/pages/homePage/welcome_msg_v3.md b/client/homebrew/pages/homePage/welcome_msg_v3.md index 9cd1b6062..76dfa134a 100644 --- a/client/homebrew/pages/homePage/welcome_msg_v3.md +++ b/client/homebrew/pages/homePage/welcome_msg_v3.md @@ -1,13 +1,3 @@ -```css -.page #example + table td { - border:1px dashed #00000030; -} - -.page { - padding-bottom : 1.1cm; -} -``` - # The Homebrewery *V3* Welcome traveler from an antique land. Please sit and tell us of what you have seen. The unheard of monsters, who slither and bite. Tell us of the wondrous items and and artifacts you have found, their mysteries yet to be unlocked. Of the vexing vocations and surprising skills you have seen. @@ -44,6 +34,13 @@ If you want to save ink or have a monochrome printer, add the **PRINT → {{fas, [naturalcrit](https://homebrew.naturalcrit.com) }} +{{position:absolute;top:40px;right:-580px +Discord +Github +Patreon +Reddit +}} + {{pageNumber 1}} {{footnote PART 1 | FANCINESS}} @@ -79,12 +76,12 @@ If you wish to sell or in some way gain profit for what's created on this site, #### Crediting Me If you'd like to credit me in your brew, I'd be flattered! Just reference that you made it with The Homebrewery. -### More Homebrew Resources -Check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/wiki/resources). - - \page +### More Homebrew Resources +Discord of Many Things Logo +If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/wiki/resources). The Discord of Many Things is another great resource to connect with fellow homebrewers for help and feedback. + ## Markdown+ The Homebrewery aims to make homebrewing as simple as possible, providing a live editor with Markdown syntax that is more human-readable and faster to write with than raw HTML. @@ -122,6 +119,8 @@ A blank line can be achieved with a run of one or more `:` alone on a line. More Much nicer than `




` +\column + ### Definition Lists V3 uses HTML *definition lists* to create "lists" with hanging indents. @@ -130,14 +129,12 @@ V3 uses HTML *definition lists* to create "lists" with hanging indents. ### Column Breaks Column and page breaks with `\column` and `\page`. -\column - ### Tables Tables now allow column & row spanning between cells. This is included in some updated snippets, but a simplified example is given below. A cell can be spanned across columns by grouping multiple pipe `|` characters at the end of a cell. -Row spanning is achieved by adding a `^` at the end of a cell just before the `|`. +Row spanning is achieved by adding a `^` at the end of a cell just before the `|`. These can be combined to span a cell across both columns and rows. Cells must have the same colspan if they are to be rowspan'd. @@ -164,8 +161,13 @@ Using *Curly Injection* you can assign an id, classes, or specific inline CSS pr ## Snippets Homebrewery comes with a series of *code snippets* found at the top of the editor pane that make it easy to create brews as quickly as possible. Just set your cursor where you want the code to appear in the editor pane, choose a snippet, and make the adjustments you need. +{{pageNumber 2}} +{{footnote PART 2 | BORING STUFF}} + +\page + ## Style Editor Panel {{fa,fa-paint-brush}} Technically released prior to v3 but still new to many users, check out the new **Style Editor** located on the right side of the Snippet bar. This editor accepts CSS for styling without requiring `Discord of Many Things blank \ No newline at end of file diff --git a/themes/assets/github.png b/themes/assets/github.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba6d7768a371c2bb3c9a2e2682fb5f59a9e32c7 GIT binary patch literal 5033 zcmV;a6ISerP)J6t8$S@^lMFZ&F=u} z0dx;(ZFI!k4Dk;N3Yx`aG9T-_))^$=3tZ%KdA}#!Q0R2J#)IS0?&RoHA(cu`R8&+P z0Z>gchB26fA)cd0kIu5Rw4B-5+36(`i7baQIGfGxb#!v%se9GmUcGvCI{@BL#=n;b zWr&S0mz!c`X}PYgt!<20EVh0Sg}4`2S63yA#rj><+qqA|Jp*F-hJUo11 zXJ_X>nwpx}DwS#|W9y8Sl@&ZaJw;AVPVbbIlza}LW2j;el_6FU5fRJV+S=Y|XlQU5 zih!i>@$u--*2v^h2@rtiV9DY1~M^0K|xKu>fTpss%s9L zGLFd%VK5l%QKLp3sj8}))Z5!@k{CmcrKKeT0|WEx>+92HGMUH}F)Wx22654`8h$KHzI<=1b=`37Nt^|+|bbQI|)51 z36b#d@L3Xxr1Y<51^`r7SG!3hlG2EXh}k6cjBZ0BqoQ8>?YG}PlSm{(`h;yx$mMd2 z_V)IS2@w$r0iXYiF+kOSKhbD35b*gik&%%sfk2RJh=xIiL`6rxeX+3cB|`%K6=-g5o){Sw zMHle-XY@T*Z$ska<6p|p&)@j>m7$%M=H^LpadF*${PD-H`W&a1A<;20=|vYW?&f`Fx#B z(e*jR+QGr$^xtOak60|Wc5rYw4M3-Jr_&V@6&?NkuLT8Z`W9x?s8N`fl7hZIHH1PT zc#S+%RaHSIlj$qP*( zCK?eFCxS}-^N+;W*B39pr2h?OaZyoPbWF_C1^M|0wC$($3Zc{KBODwZ8(Ny1Y5Ep` z$zU`>$|zRDZ0A4M#<&!)`9lX+J=lBH}1cNm;nGmK|%2L_8xG%gM$MSlajD!-(Kw5 zw-+H}$Lg$YVPOGlYirPGG|=gEFc=Il7!1(qbkJxtSX*1e!oosly^yhEZKZiE*Q2Ye3vF#}=;`SJ06054P4s1!S&;!sHn)G^HNe=oE#Y$8DCgfc&@+g0~(@KDfcLqN`ry|(0Xp>) zN@5~*eDo1Uj2MAQlO`iC9^T@5bBowT*Jp}edNzx?tGghC-!tXzqZkPy9fyuJU= z;4&zcN+?yzy#Rdr+upAsQxX%OJDZo+?*Y2v;$qlI3=R&)u1`KOCiH-~y1F7MIT=aG z$wuoKLs@CrsGH|_@4eglYeOsqeEwTTMZ}F;#)lOqlWDX@vq11RfcqM{`wWSVja^b* zU2XJhL@M>+?OmY|s9IH36)P?-Zt1<>-)G3RuC8^)hXbw~(f*h_J=e($Xzb|hTzl_# zcNr2H8JSdn^(v9^Q)020gp66z*49Qur~c|y&xsQ!-qoPpeT7gc8%T9)H1V2<=$Ip< z>L!!PK%r9C-}&90hOqhkrU)XD0F;-Pp}X5Gr(hUGcXv0+%gc!A3Hba70Jq!h+lIu) z$1fJ}1y-a2m6evE{%SobIkTbuYCXzI$r-}u^R43J;}_rheA^JUT0M_g6aZ<{rz0ph zh@_-h5ELAQwCRI(+Umuf=l+%WNF+ziA_iXkOuw!}<|K}H6#({|efDgf)Y_V)24M43z`R%d0A zkQx@O&dMUvjRF8SJ+P(%aOO2O5*d@5lA5Y_FYj>1+uIu{si{P?ZhGKMO-M-KwzRb9 z{x(Mov*!>QZ#=9ZRp*wL7K?<01TNLd*(s5PptrZTLGKoZJ0T$<#QqgrTwIc=3b}&F z)A{7s$#8UZBq24daCCIUMoI5?PymO`QM zqDmwZ76~yA4-N^LVTqf&I}shJRLZ8x<#HnTZFY8cBxHsq4)z0&Qqc#QOva!}BoZ5A zg)A&AU}I~v%&^7A*50UaAEZmU@hXdf1>+s6^UNnM`IuC6RAL zrBprCuWScHsZxT(G;ozl1uBKmtx>P);mFot2&C#xp-?D9rbPpQs@FU-`wRsn>rT}W znw!?qK4ck;%nnj@*Jv~vDvd@XVu(P%Cm}N|Ays!8ji#Y8nM@){N%(vL37KJufKc6; zOs1O3U@(Y``l_m`GHA}ka7QYYqOwxwIh|TzFc{aVcJ}rX5@J^_U&gg-*GNbWD>^$n zaplStB3gF#_7bYSz1@JbdGtXlm7=DmhJ@6xqPC`n*qljwd%ISugS|r?5j6m(PM#tq zHEbYRX9s(SIx2(7B$gHJ#PQ<~ui4!M?=`onhVydXM^(RvAF@!=PjvYNp zL~A&3?C4Plg+d})6bc2MogEh_BUo%_KYu@AO?3^CK}O?3Ly>ztSFcHz!x6PwjcJch z!=>_aB6@!QeyW=4nvqlho!;Kw#L{bDDlf-@{rgGDnJowQ?G0cbqj zJqm~^193RFmW3Q2;!bT4k352@k4^=f%?6LhLupAVs%vU+wN87t zSWiz6zC3gY-+%WVQc_Yd_lbE33JQXYi+L<5A`*#k<;oR&_2rj1dE(^lBsHdj#bRj~ z48~n^)$hxfm6V)Zapv@Ct<&2+{p>T$m^tJ2XC9A-FAp6;VPPSD`B}fj&Vhk}n3ggP z;o;%%^z?$4w-;<|hGvYHR4PSdVCu&nl-SpvVuaPKviWGT7)fVX>P{4wL~&> zVCSw~m^FJA5v@Z958|aP^T_`^ZQ8Wj+}vEhd%y3uRrd4uTVZc+uT`+8rw8wEdmqb| zEJaUG4`?(Rx+UG%_3=(DT(k)5UN_#5#Y>hTeO9{BI=6Uo{(LN4xR98hq1f5kf$PUz z+26JSb1r6NWEAD(JwQ@abot0l1M%(Za$4y{cX;m_HvSB_#$G+Re=kCr_Uu zKATr46e2k>>4D~A$;ikk&dJH?cV5nb_pJ;j^BH#!cb(QN`tIBBux;x$05@_e9{J`7 z(r3=ZbBh;i&0naE1y3z7$<*qRBS&JvQwxae>WZ7Ydmn?zd}g5S0~+%AzI~Ocsj0hl zeR=i%wr#ll+iw7Xu&_|Lxw#=?Vg%mb{(+uFzOndLTztIV$LUIZd_0lS>iR;VP>`CM zvgh-C`vx4QqBTvdP}E9!V(z@wbLY|mGiDCyEiM4W#l?xg$~in@Bzwewx1d^oCL`G+G_jAwrgAtO zozCRBbLUWy|L3cfWfvPdxdAb4f`_lrDkgayh2YxRIQNMx#L_5&@bU zcQ^?N31G9?aCUNrg{39j-QD2t?+-V3cZ5#}$Ft8qi>#MlLi(&(CZDf(;lc%6zI@rF zG4AAvC!hH6gZDq!GuVDQuZ}Qx?%dMDhYyDhwjYzp#JAsnhcRQu+_!Dr+I2Xve?Ly1 zK83)*KvY&%qN=hAQy-lQ27`g@4cRCt$j8=g+Yl6F+Dt;PuX`Q4|MMS{#<<0tIdjUt z{`%`d&mEx0Ds8E0X_I4PV+VarCY4ID?w@O+QrQS^1!~dFI(? z@a}u>Y2Am%u>WA;XTykmz+V}yogv+k^8SA13eKE44W^wP*lf00C09Oq@)XL;$ffGL z6Ap*dH)H0E=Qh8&`G~&98njAV;je|4mM&Y`+{kN8lXOe8n$q6hj^nwx$jdu}?rsU> zayb+V1$tE~s8lK_l}bn?5{N`1G&D4zAin@onG_x#9(tEcAM(!RnZyux4|mO+j5(Rx zKiGa>8gX4Pc$CSO_qOc*_xd-w4;?&su(qal&|!)-)iro)^JV~my}dnHY&Ph0I;<=$ z(bLm|YhBmSDr|*Xt;YNX^AQn2EJ5m!;mhT!=P#H)KYRTKgV$U)YS>Tq`VEIa-0_k4 zi~R?3FJ8Q;^9YIV?ryDvvS~EkmX0tdA|fJs7Cf~eC2Mt-QLED!-J!GUg%^KZxMnwA={b<5UOrZNLC(G_wh*&DL20*L$M(@!Jw z&YansUyvU(*hG7|TyE-Op;w3eBpw_O#6-tb#3v*yUb$k0UaLME%8>n)EPwv_LIA<< zy!Y;;(vs5cm6erYzg@c2?-lCkNG3y@Hnc617czEiUtnNhSwuuc)~m0)@^em3j>*e& z3%z=KNpdvzm`Coh+_wb+e%kq;&O6+i0K@g;V(;F4;QDDD7G^ZHHMLl@Xc6jaZ}j~+ zIXNNrkw>~bJlu~aCMNx3&g|I_Bv%N6aEPU40kX2bsjSo7s2Df!-<00000NkvXXu0mjf;g-46 literal 0 HcmV?d00001 diff --git a/themes/assets/patreon.png b/themes/assets/patreon.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4c0a67372584ce0d21574b72221f5dbaa9f5ed GIT binary patch literal 2436 zcmV-~348X5P)--qD}T^-(CJKSEl@^Gbx>q<)K+ST-=i5fm5NFh)P%ti!plOw=Jpd6@ix$SOvDacS@4kE;4ubhbDpNKH8 zA(uVZ@j{SWfS&+!fg9XzJV9E44Zv!k*3E_u7uy<-eEJRo3-GTPAiga?eEkdJyDPXM zNH$Q0Jmoy$Qk$wUkjv@;qz~C{G^mRJFc0_ycp85`(IrZ6qz|6}^O3%3L6;!8z*b-_ zFho-uUN8h$gY+#|M*}(pDFyZd#Tsn;g<_3J0xq|mNk8HDt84bpcd zs1jrZunW1qrW*5+zK>L4Oobp5kRMccE3lQU+znJBW8ny=f=mH+Vr{}r}YnZSG4oS(BJ$V6n?IxU7d1CcSBX!S&^ zf_wq^D=^qy7X_iC;$wj^$X`E3;0uz$)1PK6tCN<`!bTbH8Pn@aycxx2%fcqS~^6V1G z9Sy-?&+l8h44Te4ZmyGo1EH`$jxnPldnokl2ZjM{ZE)ctoT`VTb#SN_jvZImc5I4~ zOaB_PH}oXPFkqDuHzwW+!-mFxUmr!2rbSbrWIEh43HtX-{Jc;91KW4QKemZbdRT=# ztv1E_V^4ytKq5n&({whzAi*G9z3Qx;uiXo?XF-0Rz4OQ13{QSnj`u!*@;Bg2qcfkn zlLh<=SQzV%X7`Zsz*DL{(Z-F#VbuzFX0d%SqIqa0yz)nQ^g%WDy0QS1zzH)!mXj=N z;M1nU`ZBodPW86?_JKuD$vrTjbQ!%j@La4v#1iBd;Bl3$Yh%{Ku;LfcSJ{GHY>KDB z%P+!!{wl4`Mj|%55KEB7Ca?R8Z$APHf9PI&`FZft3o6AokbuE%FGiA$hJ}0OO#ce} zXrBA+-ZT<^ujawCgHobmy`lw~3s`tg^njdfSpIYG+8;L-e!57NwSK^pkuO9G;^H;H zCM%!y+5`B;{qW`6RaxsYM;Ix{Bx2lTe8mGL>K<#I^2}mYmI{%v2f7OK9aSx8!_Av` zJhFzsLo-xa>m2(?L1wA4u7w9mAaj7%UUX&d995P&$37%TKJI5OS!0$jGQGMoEKAkB zWE>qScp*V%s<5h!kt3kMEM?GRzFw@#(o6^oGEJ3LElj$@YY)u1-EpvDh-nZOq)3%j zEff}b?SVPj%5r!*1<3(!R%KNSd1Jixz?`-=RhC8pIR=uH?_UA|`E~AB;;n*O;|>F< zklulkuffRa7KDO?JU;oy<_Nw;4q9wXpIb-+vn3-=g03>3VsHC^OB`RLM!8A+!{? zn`BASiN)p1u(}NXz7-yS45r@W%-*?X*z^v(`L^@C$HdtU;k32n79>RVA^7FR*tQE=TlMmMOL27}j(0`&=4A;8rOB$jI(L@XK3UJ9iUs9e+$e4E$El4A> z=}H=RC?{$?DprugYT%kH?xZ%?fES`)j3r17=_f8X*a&oskT44adJgb-S?;=~9jQmw z4KqOw1Ao%yPMS5C?EcnMpxiP*P25dp0#(Ta0Wh>}?c^t#0n_>*J!Qf)0ZUQwO=)a` zA@Qn{2jOZ;JWDLWq~0RL-&it$Y=Bj))~A$ZJ5U0cCML#1pZ~qoz$iZ3s)E`f?Nh3 zBbg&q+~*|lEoAHx!fL|KN#L8nd5ho~DJ7ILxym+ZLB?pm)f4Te zv{eERk`^TvEy&nZ+Bw-tj^R$=ev&ESM?cNTnApzbahmj5iEN^H!l9k(ffLAB*!pIK zP?3eZAK7m7BL%jSm5+d_*tlmzqbe=>H1g?4#UGFBkiIL)L{pik-ilOd{vN3@_jLg& z%|0LLyApI14k!oi1a@e!?H6_+eN>(ot*es5F=R8b1zcZGVa-UN?n6^5pw7}7L1d}2 z0NLp>nb+vskv?+bAur{B%uGqu1Iz^%x# zu@QqndLxDhGd znT2c~AF8zcIdBDuCu;;6kkTP_KsB%r_{>G$E%SdS-__M{uKgGQ0000W#VPIE6S@7T!4+p>tiSIb` zARc*-K7avw?vyVE1G_G2ibn~+z9C08_CW3f=yNnqE3lPJ$%C^hIdaN~#C`A4LC+mA zu*rtB=0SRpkWV!P&;ig&3%tn&mb_>^VUTWux0UqBn@nIUnVJ_(Um%_8dQrE-z?vOR zYhFa%2TKgvnjXAU2G$%<8vtH2pBo2jO#n^X!L=7y1~rx7+6OFynrd+E0k)EHJb%g_ zHC}M*=(#NhHeOh(UPL%x#-wQIf!k+bqu>5pNN;*dwLSo7m~0cW2E$qh&7(7{>hv3c zfp_khebzA;Q|Do+7N7|(T1lEN&~t0a0+wLyb0&bHHQy32tZC3|&+1tYEW^ss zS{7lO3@bxx2e5SDJitmPv^Becr93OcnqGaD1#SFU0y^G|1xmfIye84BStF zTgerAl^VTQzTp3CG6IHu;JQP{pjL0wnXiv}$D)&X0A0BVnb{Fb%~ld%u)jR$g=NO;-; zjzVM;zgz(CYbwve5Iwh~6WBg@b?bKJ3qbqd-JW|l^dT0}c$JPD!13?lUtc}6AJB8_ z>Vc(N$Um6IfPV5_jH&6HtA_x8Us$#qVRZVEUQ3-`?%HK$H(=Qcgwxw5@anf^AGv49 z>AM>OzbakzG6v;mLy!EP?D&Q)hBbr^SHN&w0QMaEzrzv@%ARR*S5J#{47bYG79N0_ z`ZeT7Sk4NBSI=D@TpbtI!@UUcQ$@vYpH5U~4FKSWu(M!KLc%JRxv-){*G-X346qhe zEYs^e^Zv|BXyUl%=r}tq(DqZ(EI}RI@-m!?E3U^)$nnOoPY)3RbB+&hr6vbpHF|+c zrW$7Rkl<6Z{uV+knGrUK?x!?c)ouWn*5B|#eSk2v1PvZ&#RP1eDWtew>!z>k3>}22 zoec&oMOQA!4y&BAJZQQb#`_+(0~*9d(R`*l54#*?16Fhejj#=-&%o#^)Q)(0{?cwM z_Ji8Z?Z9$$-CfVh@%z_R>a}){+;_w1z{jI{kSH4@!g6#qX~4Bk@5`haVd#6*KQj+~=rl|wwLfo8x$0!yTG-qi;G zx=D6Gx~LbZWJ>E+CS=(TDDtm%!lN%^5X!^SV2f80MA73?!O1wDHCyRWHSC~^y=xNe zfW6vZH~7kiC7i{;>Ws446?UKmE+LHHzv?S4u~k23${eqGM}S}dd9%UDq8fq7Ff0e>|ae&c@wZaSs(*gj<6DdrS93R zD9Sm@D_Db;`?1!J3Kr8_PuRciIH(d{HRt$IHRr63xaa+c)?hyMI}>vB4H{)T4D2T5 z3lBT69F}(Lg|)Zu*A=X5MI`DBM02;BzKOM}I#m+D`mKs8nJLm-PM9wcn8h+hPu)%vD`eT*4r#v-$!^Z0_HP6t~?p?QL=()}!u<2>=mUF1B z`p9OTuSM{tM?awFj-D)dgyculUm67Kp5@Nx`A_tij0xP!W*VYy0l+AmcwqAd z>iysTm-_$jCCH}d52#IidqkgcamScsW(vM#2^^yiP29G{NPTe;UC>dqh^R*?Sf#$V zPoMMXHPAi_7IDQOGs-zuA7Q_FSl5U{Dwcs)b-LYc)0Ye2&&Kkylbl1ZvC9S(NztZl zjp8`R8Z!lE0Go4wcdcM2@v$yH03YlA#dz1UxnF9$y1Alrb32Id9P85=1mO+aMGueK46a<_9pJrtfSYfS5+udR?EBQ9GYoj*{OG}lmVNB*`_orf3Uhx zU6Cblv;fPpTa}uQcXhJRF)gdn1F>R~o(QYS60jYxUz+yCRSzsjS5^c)QT~pm6jaP- zeod)ZUnL4beyr*(nwih&xE5C%EFN2m2dx?R2z{tt-rdt&YjgR5ibFPidGZC|tfM|x zeBA}kYnzWPN?kylU#eHi$LnWVZ68*b&ficW$F@j683DhRsA5T#KAixK>h@#1pVIHO z&-9%~O{;yg0Mx&;u1+YQPRIs?(fgX3-U44P!tY4fZm9i28E_4=0Mwhxu+YSzo2%Wo zsFc0=+GMed9T zhzzPU8Arc`$&4sbSHG%WJ*%;pTaSkoCs~#MierEv%d_1Lqo?}rr|Oy}x6ib;SJLBQ z7r&`0PPEDWtK!N_tH^JExzM}wchBwX1vc!4zASzEa$&^I-`RCrBr1oteI_qI8^?5T zPEwLQu3iGNic#h>pz+ECSck$A0KiQ9SEt>e?a*ap51ze<4xFr#$T(_CckQeg#9tp5 zOlgTUT?Ez)lXpLrw?sQCa5C#ZqprS?wR+=zYEm- zN7=(tI=b6Dim=HCc5i>TwMe3Gf^40(!hfN1j+$dLL;Xcy`>FWI&wm0Mo#0@IcJC@m z`JNW(y@DQFzCgd9o|VS~^E|97Xg>}%d(xak%g{f5RaU6W^VZda|bMY`+nnMT{0&_@XfMjSN%{gu*o0)StE0%v<(K9x4AS&H-=n`p1T5A znxdWYNn#lmVILHlWY>jWtr2!UV_38Yjw@3zl!~0Q_Num%Z-FpPoE@>Hqz>p{(r`j6F(G$>opHR8}k<1^I*zT+R%_pO@GXfft-L2X)TK2v{=H*4*O&+hUhE!N=E ziM-cewLE1qqLrdQe@E{vvwy;Mm%1t*7uL5elDVc#_YQ|4*jsH0{9EM+CX^h0^O`Mr z<$#|~wl|B*Il!|r)ubMlc3Z7F8Pk_R)Vc=QHT!K--nOLYZ%mu0>7wUWcLla?#NbO6 zv^Q52Rl^QE#P;m~u;=&@d$Ev5Z0#OK#WKMvYh{6XumZr##piu?(}uj?+|;%^7>6q)Bd>mWR_irlZr2AEkSzc!T>4p@_;tnhh_ zj{03y#NbKnKr`RqQ4dSxZ3U$Hg1U8ULU%*p_o~TDkhVtGFuE^zwNbXWl(@Bs#kur@^5#c2DsnU;Q2>(xF3 zE}N!J2&~e#o&)g$OVHK;e753(70YH7vZ#{olw5di%)3SdmY^K~u%|~(TEMjrQ~0ZH!Cl4zCiigN=m&#UIcdpD$n|6k1{v~vnI(25Q$L0biI znV8$_VTr(1HR}}Qc0cUX?Akw_B=sDd0VsJj*9w6pXj=f1nLk=AAv`R}@5L&%!xUwQ zw~1}pyOR}&3s?uHwCPk8g~jyho&$VeSl+g1u|`%*-!4i_OX0o-6PhBkOwrI|A~r=IbS)3U%CK?jmL+45wR65zg(VP?wh!P9U$4}| zT8Sgiw=p=DUD1J;L@Q(no?Of{_Xvjpq22Q}ET`j)j0*0QYBm3hDtv?b6MOZ$BN ztkYo4%bTaKVgC>O#^CmiZCZkF*Y`4H8c;TpWw+c#u zu}z5Y_TMli1CTsmeQ-Gi7ENO>qIPUMa65s0=x^%`ZYWS2stZ;a*ky2Q9=L23R%-~L zX)~zF0rnxhH4k1MoRPX7sQsjTpkx8-gIn?JmOBBjX^u|3;;|$KnFHVlQOV&MdZ@LPf7rsEzg>IP?9)e b?xg<%;9rZ(OEzCJ00000NkvXXu0mjfUU1L% literal 0 HcmV?d00001 From 235f878dbacfb53f5d7f4b79b2c58240b8dac51f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jan 2022 03:59:52 +0000 Subject: [PATCH 44/86] Bump node-fetch from 2.6.1 to 2.6.7 Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) --- updated-dependencies: - dependency-name: node-fetch dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 66 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e6e641c8..f8995abb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9390,11 +9390,41 @@ } }, "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/node-forge": { @@ -19938,9 +19968,33 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } }, "node-forge": { "version": "0.10.0", From 56fc23f23a9ea6fa8e930e2bf4be969bcaaf6ebd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jan 2022 14:36:29 +0000 Subject: [PATCH 45/86] Bump cached-path-relative from 1.0.2 to 1.1.0 Bumps [cached-path-relative](https://github.com/ashaffer/cached-path-relative) from 1.0.2 to 1.1.0. - [Release notes](https://github.com/ashaffer/cached-path-relative/releases) - [Commits](https://github.com/ashaffer/cached-path-relative/commits) --- updated-dependencies: - dependency-name: cached-path-relative dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 80 ++++------------------------------------------- 1 file changed, 6 insertions(+), 74 deletions(-) diff --git a/package-lock.json b/package-lock.json index f89e03a32..b5b6d114f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2658,25 +2658,6 @@ "node": ">= 0.6" } }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dependencies": { - "mime-db": "1.43.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -3757,9 +3738,9 @@ } }, "node_modules/cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" }, "node_modules/call-bind": { "version": "1.0.2", @@ -12118,25 +12099,6 @@ "node": ">= 0.6" } }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dependencies": { - "mime-db": "1.43.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -14893,21 +14855,6 @@ "requires": { "mime-types": "~2.1.24", "negotiator": "0.6.2" - }, - "dependencies": { - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" - } - } } }, "acorn": { @@ -15782,9 +15729,9 @@ } }, "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" }, "call-bind": { "version": "1.0.2", @@ -22279,21 +22226,6 @@ "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" - }, - "dependencies": { - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" - } - } } }, "typedarray": { From 041abf12204ecc86ece5c4fe3ff61e15a0784aa1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jan 2022 03:00:41 +0000 Subject: [PATCH 46/86] Bump marked from 4.0.11 to 4.0.12 Bumps [marked](https://github.com/markedjs/marked) from 4.0.11 to 4.0.12. - [Release notes](https://github.com/markedjs/marked/releases) - [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json) - [Commits](https://github.com/markedjs/marked/compare/v4.0.11...v4.0.12) --- updated-dependencies: - dependency-name: marked dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f89e03a32..d8078ef51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", - "marked": "4.0.11", + "marked": "4.0.12", "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", @@ -8891,9 +8891,9 @@ } }, "node_modules/marked": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.11.tgz", - "integrity": "sha512-xL2aJ5JDggqToKOqKHJWIDXaYk24XoGm1mNlhSPFP+0OKRCcKx+/hH7hlAr5LYqBKUzqCANylALgwNstVRgtCw==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", + "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", "bin": { "marked": "bin/marked.js" }, @@ -19726,9 +19726,9 @@ } }, "marked": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.11.tgz", - "integrity": "sha512-xL2aJ5JDggqToKOqKHJWIDXaYk24XoGm1mNlhSPFP+0OKRCcKx+/hH7hlAr5LYqBKUzqCANylALgwNstVRgtCw==" + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", + "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==" }, "marked-extended-tables": { "version": "1.0.3", diff --git a/package.json b/package.json index f0bad7dda..eb5dfedf1 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", - "marked": "4.0.11", + "marked": "4.0.12", "marked-extended-tables": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", From 039e4dd4e597f316e9ec9c70ff3b0c2c1e551412 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 28 Jan 2022 00:38:00 -0500 Subject: [PATCH 47/86] Revert extraneous Config changes Looks like these were part of something else? In any case it conflicts with #1981 so just undoing these changes. --- server.js | 2 +- server/app.js | 2 +- server/googleActions.js | 2 +- server/token.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server.js b/server.js index 22db8a63b..c9ce63c8f 100644 --- a/server.js +++ b/server.js @@ -4,7 +4,7 @@ const server = require('./server/app.js'); const config = require('nconf') .argv() .env({ lowerCase: true }) - .file('environment', { file: `${__dirname}/config/${process.env.NODE_ENV}.json` }) + .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) .file('defaults', { file: 'config/default.json' }); DB.connect(config).then(()=>{ diff --git a/server/app.js b/server/app.js index 0c41e7d06..c36533b9b 100644 --- a/server/app.js +++ b/server/app.js @@ -75,7 +75,7 @@ app.use(require('./forcessl.mw.js')); const config = require('nconf') .argv() .env({ lowerCase: true }) - .file('environment', { file: `${__dirname}/../config/${process.env.NODE_ENV}.json` }) + .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) .file('defaults', { file: 'config/default.json' }); //Account Middleware diff --git a/server/googleActions.js b/server/googleActions.js index c075bae4b..0050cb81d 100644 --- a/server/googleActions.js +++ b/server/googleActions.js @@ -6,7 +6,7 @@ const token = require('./token.js'); const config = require('nconf') .argv() .env({ lowerCase: true }) // Load environment variables - .file('environment', { file: `${__dirname}/../config/${process.env.NODE_ENV}.json` }) + .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) .file('defaults', { file: 'config/default.json' }); //let oAuth2Client; diff --git a/server/token.js b/server/token.js index 8baf60e06..40d76a484 100644 --- a/server/token.js +++ b/server/token.js @@ -4,7 +4,7 @@ const jwt = require('jwt-simple'); const config = require('nconf') .argv() .env({ lowerCase: true }) // Load environment variables - .file('environment', { file: `${__dirname}/../config/${process.env.NODE_ENV}.json` }) + .file('environment', { file: `config/${process.env.NODE_ENV}.json` }) .file('defaults', { file: 'config/default.json' }); // Generate an Access Token for the given User ID From 4c08f4a6e1e4ab117265e7bbec292f3bc15cf921 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 28 Jan 2022 09:44:43 -0500 Subject: [PATCH 48/86] Condense v3_preview to fit on two pages again. --- .../homebrew/pages/homePage/welcome_msg_v3.md | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/client/homebrew/pages/homePage/welcome_msg_v3.md b/client/homebrew/pages/homePage/welcome_msg_v3.md index 76dfa134a..704c566f2 100644 --- a/client/homebrew/pages/homePage/welcome_msg_v3.md +++ b/client/homebrew/pages/homePage/welcome_msg_v3.md @@ -47,9 +47,9 @@ If you want to save ink or have a monochrome printer, add the **PRINT → {{fas, \column ## New in V3.0.0 -With the latest major update to *The Homebrewery* we've implemented an extended Markdown-like syntax for block and span elements, plus a few other changes, eliminating the need for HTML tags like `div` and `span` in most cases. No raw HTML tags should be needed in a brew, and going forward, raw HTML will no longer receive debugging support (*but can still be used if you insist*). +We've implemented an extended Markdown-like syntax for block and span elements, plus a few other changes, eliminating the need for HTML tags like `div` and `span` in most cases. No raw HTML tags should be needed in a brew (*but can still be used if you insist*). -Much of the syntax and styling has changed in V3. Code in one version may be broken in the other, and updating an older brew to V3 will require more than just a copy and paste. *However*, all brews made prior to the release of v3.0.0 will still render normally, and you may switch between the "Legacy" brew renderer and the newer "V3" renderer via the {{fa,fa-info-circle}} **Properties** button on your brew at any time. +Much of the syntax and styling has changed in V3, so converting a Legacy brew to V3 (or vice-versa) will require tweaking your document. *However*, all brews made prior to the release of v3.0.0 will still render normally, and you may switch between the "Legacy" brew renderer and the newer "V3" renderer via the {{fa,fa-info-circle}} **Properties** button on your brew at any time. Scroll down to the next page for a brief summary of the changes and new features available in V3! @@ -76,12 +76,12 @@ If you wish to sell or in some way gain profit for what's created on this site, #### Crediting Me If you'd like to credit me in your brew, I'd be flattered! Just reference that you made it with The Homebrewery. -\page - ### More Homebrew Resources Discord of Many Things Logo If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/wiki/resources). The Discord of Many Things is another great resource to connect with fellow homebrewers for help and feedback. +\page + ## Markdown+ The Homebrewery aims to make homebrewing as simple as possible, providing a live editor with Markdown syntax that is more human-readable and faster to write with than raw HTML. @@ -119,22 +119,20 @@ A blank line can be achieved with a run of one or more `:` alone on a line. More Much nicer than `




` -\column - ### Definition Lists -V3 uses HTML *definition lists* to create "lists" with hanging indents. - -**Senses** :: Here is some text that is long and overflows into a second line, creating a "hanging indent". +**Example** :: V3 uses HTML *definition lists* to create "lists" with hanging indents. ### Column Breaks Column and page breaks with `\column` and `\page`. +\column + ### Tables Tables now allow column & row spanning between cells. This is included in some updated snippets, but a simplified example is given below. A cell can be spanned across columns by grouping multiple pipe `|` characters at the end of a cell. -Row spanning is achieved by adding a `^` at the end of a cell just before the `|`. +Row spanning is achieved by adding a `^` at the end of a cell just before the `|`. These can be combined to span a cell across both columns and rows. Cells must have the same colspan if they are to be rowspan'd. @@ -150,9 +148,9 @@ These can be combined to span a cell across both columns and rows. Cells must ha | 6A | 6B ^| 6C | ## Images -Images must be hosted online somewhere, like [Imgur](https://www.imgur.com). You use the address to that image to reference it in your brew\*. Images can be included using Markdown-style images. +Images must be hosted online somewhere, like [Imgur](https://www.imgur.com). You use the address to that image to reference it in your brew\*. -Using *Curly Injection* you can assign an id, classes, or specific inline CSS properties to the image. +Using *Curly Injection* you can assign an id, classes, or inline CSS properties to the Markdown image syntax. ![alt-text](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:100px,border:"2px solid",border-radius:10px} @@ -161,13 +159,8 @@ Using *Curly Injection* you can assign an id, classes, or specific inline CSS pr ## Snippets Homebrewery comes with a series of *code snippets* found at the top of the editor pane that make it easy to create brews as quickly as possible. Just set your cursor where you want the code to appear in the editor pane, choose a snippet, and make the adjustments you need. -{{pageNumber 2}} -{{footnote PART 2 | BORING STUFF}} - -\page - ## Style Editor Panel {{fa,fa-paint-brush}} Technically released prior to v3 but still new to many users, check out the new **Style Editor** located on the right side of the Snippet bar. This editor accepts CSS for styling without requiring `