diff --git a/Dockerfile b/Dockerfile index 70ec04e53..0b014e277 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,12 @@ -FROM node:16.1 as build +FROM node:18.18.0 as build WORKDIR /var/app COPY . /var/app +ENV NODE_OPTIONS --openssl-legacy-provider RUN yarn install -RUN yarn build-version && yarn build +RUN yarn build-version && export NODE_OPTIONS=--openssl-legacy-provider && yarn build -FROM node:16.1-alpine +FROM node:18.18.0-alpine WORKDIR /var/app @@ -15,6 +16,7 @@ ENV SOURCE_COMMIT ${SOURCE_COMMIT} COPY --from=build /var/app /var/app ENV PORT 8080 ENV NODE_ENV production +ENV NODE_OPTIONS --openssl-legacy-provider EXPOSE 8080 CMD [ "yarn", "run", "prod" ] diff --git a/README.md b/README.md index b21bbc7e0..29fb855b3 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ sudo docker-compose up #### Install for Development mode ```bash -curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - +curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs @@ -71,4 +71,4 @@ We adhere to BEM methodology with exception for Foundation classes, here is an e
  • Element with modifier
  • -``` \ No newline at end of file +``` diff --git a/app/ResolveRoute.js b/app/ResolveRoute.js index b4c33240b..d690921b6 100644 --- a/app/ResolveRoute.js +++ b/app/ResolveRoute.js @@ -1,9 +1,9 @@ export const routeRegex = { PostsIndex: /^\/(@[\w\.\d-]+)\/feed\/?$/, UserProfile1: /^\/(@[\w\.\d-]+)\/?$/, - UserProfile2: /^\/(@[\w\.\d-]+)\/(blog|posts|comments|reputation|mentions|created|recent-replies|discussions|feed|followed|followers|settings)\/??(?:&?[^=&]*=[^=&]*)*$/, + UserProfile2: /^\/(@[\w\.\d-]+)\/(blog|posts|comments|reputation|mentions|created|recent-replies|discussions|feed|followed|followers|sponsors|settings)\/??(?:&?[^=&]*=[^=&]*)*$/, UserProfile3: /^\/(@[\w\.\d-]+)\/[\w\.\d-]+/, - UserEndPoints: /^(blog|posts|comments|reputation|mentions|created|recent-replies|discussions|feed|followed|followers|settings)$/, + UserEndPoints: /^(blog|posts|comments|reputation|mentions|created|recent-replies|discussions|feed|followed|followers|sponsors|settings)$/, CategoryFilters: /^\/(hot|responses|donates|forums|trending|promoted|allposts|allcomments|created|active)\/?$/ig, PostNoCategory: /^\/(@[\w\.\d-]+)\/([\w\d-]+)/, Post: /^\/([\w\d\-\/]+)\/(\@[\w\d\.-]+)\/([\w\d-]+)\/?($|\?)/, diff --git a/app/assets/images/nft.png b/app/assets/images/nft.png new file mode 100644 index 000000000..db3321a57 Binary files /dev/null and b/app/assets/images/nft.png differ diff --git a/app/components/App.jsx b/app/components/App.jsx index 582272a79..1d217e0d3 100644 --- a/app/components/App.jsx +++ b/app/components/App.jsx @@ -12,7 +12,7 @@ import { createGlobalStyle } from 'styled-components' import AppPropTypes from 'app/utils/AppPropTypes'; import Header from 'app/components/modules/Header'; import Footer from 'app/components/modules/Footer'; -import AppReminder from 'app/components/elements/app/AppReminder' +import NewsPopups from 'app/components/elements/NewsPopups' import URLLoader from 'app/components/elements/app/URLLoader'; import TooltipManager from 'app/components/elements/common/TooltipManager'; import user from 'app/redux/User'; @@ -33,8 +33,6 @@ import { APP_ICON, VEST_TICKER, } from 'app/client_config'; import session from 'app/utils/session' import { loadGrayHideSettings } from 'app/utils/ContentAccess' -const APP_REMINDER_INTERVAL = 30*24*60*60*1000 - const GlobalStyle = createGlobalStyle` body { fill: currentColor; @@ -100,16 +98,6 @@ class App extends React.Component { } } - showAppReminder = () => { - if (process.env.IS_APP || typeof(localStorage) === 'undefined') { - return false - } - const now = Date.now() - let reminded = localStorage.getItem('app_reminder') || 0 - reminded = parseInt(reminded) - return !reminded || (now - reminded > APP_REMINDER_INTERVAL) - } - constructor(props) { super(props) if (process.env.BROWSER) { @@ -380,8 +368,6 @@ class App extends React.Component { const noHeader = isApp const noFooter = isApp || location.pathname.startsWith('/submit') - const reminder = this.showAppReminder() ? : null - return (
    {children} {noFooter ? null :
    } - {reminder} +
    diff --git a/app/components/all.scss b/app/components/all.scss index c898a4044..aa90959f3 100644 --- a/app/components/all.scss +++ b/app/components/all.scss @@ -39,7 +39,7 @@ @import "./elements/VerticalMenu"; @import "./elements/VotesAndComments"; @import "./elements/Voting"; -@import "./elements/app/AppReminder"; +@import "./elements/NewsPopups"; @import "./elements/common/YoutubePlayer/YoutubePlayer"; @import "./elements/common/TelegramPlayer/TelegramPlayer"; @import "./elements/common/Button/index"; @@ -50,6 +50,7 @@ @import "./elements/common/DialogManager/index"; @import "./elements/common/TooltipManager/index"; @import "./elements/market/CMCWidget"; +@import "./elements/nft/NFTSmallIcon"; @import "./elements/donate/Donate"; @import "./elements/postEditor/MarkdownEditor/MarkdownEditor"; @import "./elements/postEditor/MarkdownEditorToolbar/index"; @@ -68,11 +69,14 @@ @import "./modules/BottomPanel"; @import "./modules/ChangeAccount"; @import "./modules/Footer"; +@import "./modules/GiftNFT"; @import "./modules/Header"; @import "./modules/LoginForm"; @import "./modules/Settings"; @import "./modules/SidePanel"; @import "./modules/SignUp"; +@import "./modules/SponsorList"; +@import "./modules/SponsorSubscription"; @import "./modules/BottomPanel"; @import "./modules/TopRightMenu"; @import "./modules/Modals"; diff --git a/app/components/cards/PostFull.jsx b/app/components/cards/PostFull.jsx index d8ac060cd..2dd7fae7f 100644 --- a/app/components/cards/PostFull.jsx +++ b/app/components/cards/PostFull.jsx @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import { Link } from 'react-router'; import { connect } from 'react-redux'; import tt from 'counterpart'; +import { Asset } from 'golos-lib-js/lib/utils' + import user from 'app/redux/User'; import transaction from 'app/redux/Transaction'; import { repLog10, parsePayoutAmount } from 'app/utils/ParsersAndFormatters'; @@ -25,6 +27,7 @@ import CommentFormLoader from 'app/components/modules/CommentForm/loader'; import { isBlocked } from 'app/utils/blacklist' import { getEditDraftPermLink } from 'app/utils/postForm'; import { proxifyImageUrl } from 'app/utils/ProxifyUrl'; +import { makeOid } from 'app/utils/sponsors' import PostSummaryThumb from 'app/components/elements/PostSummaryThumb'; import { SEO_TITLE, CHANGE_IMAGE_PROXY_TO_STEEMIT_TIME } from 'app/client_config'; @@ -127,13 +130,14 @@ class PostFull extends React.Component { } shouldComponentUpdate(props, state) { - const { cont, post, prevPosts, username } = this.props; + const { cont, post, prevPosts, username, pso } = this.props; return ( cont !== props.cont || post !== props.post || prevPosts.length !== props.prevPosts.length || username !== props.username || + pso !== props.pso || this.state !== state ); } @@ -173,6 +177,18 @@ class PostFull extends React.Component { this.props.deletePost(content.get('author'), content.get('permlink')); }; + becomeSponsor = async (e) => { + e.preventDefault() + + const { username, pso } = this.props + this.props.becomeSponsor(username, pso.author, pso.cost, pso.tip_cost, () => { + this.setState({ + hideSponsorBtn: true + }) + }, (err) => { + }) + } + showPromotePost = () => { const postContent = this.props.cont.get(this.props.post); @@ -198,7 +214,7 @@ class PostFull extends React.Component { const p = extractContent(immutableAccessor, postContent); const content = postContent.toJS(); - const { author, permlink, parent_author, parent_permlink, root_author } = content; + const { author, permlink, parent_author, parent_permlink, root_author, encrypted } = content; const jsonMetadata = showReply ? null : p.json_metadata; let link = `/@${content.author}/${content.permlink}`; @@ -221,6 +237,7 @@ class PostFull extends React.Component { category, title, body, + encrypted, }; const APP_DOMAIN = $STM_Config.site_domain; @@ -345,7 +362,7 @@ class PostFull extends React.Component { } _renderContent(postContent, content, jsonMetadata, authorRepLog10) { - const { username, post } = this.props; + const { username, post, pso } = this.props; const { author, permlink, category } = content; const url = `/${category}/@${author}/${permlink}`; @@ -432,6 +449,18 @@ class PostFull extends React.Component { , ]; + if (pso && !this.state.hideSponsorBtn && username !== author) { + main.push( + + ) + } + const showPromote = username && postContent.get('last_payout') === '1970-01-01T00:00:00' && @@ -440,7 +469,7 @@ class PostFull extends React.Component { if (showPromote) { main.push( +
    + {err && err.toString()} +
    + + } + + render() { + const { dis, encrypted, username } = this.props + + const author = dis.get('author') + + if (encrypted === EncryptedStates.no_sponsor) { + const sub = dis.get('encrypted_sub') + + if (!username) { + return (
    + {this._renderAuthor(tt('poststub.for_sponsors'), author)} + {tt('poststub.login_to_become_sponsor')} +
    ) + } + + return (
    + {this._renderAuthor(tt('poststub.for_sponsors'), author)} + {this._renderSub(sub)} + {this._renderButton(sub, tt('poststub.become_sponsor'))} +
    ) + } else if (encrypted === EncryptedStates.inactive) { + const sub = dis.get('encrypted_sub') + + return (
    + {this._renderAuthor(tt('poststub.sponsorship_expired'), author)} + {this._renderSub(sub)} + {this._renderButton(sub, tt('poststub.prolong_sponsorship'))} +
    ) + } else if (encrypted === EncryptedStates.no_key) { + return
    {tt('postsummary_jsx.no_decrypt_key')}
    + } else if (encrypted === EncryptedStates.no_sub) { + return
    {tt('postsummary_jsx.no_sub')}
    + } else if (encrypted === EncryptedStates.wrong_format) { + return
    {tt('postsummary_jsx.wrong_format')}
    + } + return
    {tt('postsummary_jsx.no_decrypt_key')}
    + } +} + +export default connect( + (state, ownProps) => { + const current_user = state.user.get('current') + const username = current_user ? current_user.get('username') : null + + return { + username + } + }, + (dispatch) => ({ + transfer: (username, author, amount, from_tip, onSuccess, onError) => { + dispatch(transaction.actions.broadcastOperation({ + type: 'paid_subscription_transfer', + operation: { + from: username, + to: author, + oid: makeOid(), + amount, + memo: '', + from_tip, + }, + username, + successCallback: () => { + onSuccess() + }, + errorCallback: (err) => { + onError(err) + } + })) + }, + fetchState: () => { + const pathname = window.location.pathname + dispatch({type: 'FETCH_STATE', payload: {pathname}}) + } + }) +)(EncryptedStub) diff --git a/app/components/elements/NewsPopups.jsx b/app/components/elements/NewsPopups.jsx new file mode 100644 index 000000000..a153590bc --- /dev/null +++ b/app/components/elements/NewsPopups.jsx @@ -0,0 +1,179 @@ +import React from 'react' +import tt from 'counterpart' +import { connect } from 'react-redux' +import { api } from 'golos-lib-js' + +import CloseButton from 'react-foundation-components/lib/global/close-button' + +import user from 'app/redux/User' + +const APP_REMINDER_INTERVAL = 30*24*60*60*1000 + +class NewsPopups extends React.Component { + state = { + hidden: false, + hiddenNews: [] + } + + checkNews = async () => { + if (typeof(localStorage) === 'undefined') { + this.setState({ news: [] }) + return + } + try { + let news_read = localStorage.getItem('news_read') || '' + news_read = news_read.split(',') + if ($STM_Config.golos_news && $STM_Config.golos_news.account) { + const acc = $STM_Config.golos_news.account + const entries = await api.getBlogEntriesAsync(acc, 0, 5, ['fm-'], {}) + const news_to_load = [] + for (const post of entries) { + const { author, hashlink } = post + if (news_read.includes(hashlink)) { + continue + } + news_to_load.push({ + author, + hashlink + }) + } + if (news_to_load.length) { + const news = await api.getContentPreviewsAsync(news_to_load) + this.setState({ + news + }) + } else { + this.setState({ + news: [] + }) + } + } + } catch (err) { + console.error('NewsPopups', err) + this.setState({ + news: [] + }) + } + } + + componentDidMount() { + this.checkNews() + } + + hideMe = (i) => { + if (i) { + let { hiddenNews } = this.state + hiddenNews = [...hiddenNews] + hiddenNews.push(i) + this.setState({ + hiddenNews + }) + let news_read = localStorage.getItem('news_read') || '' + news_read = news_read.split(',') + news_read.push(i) + localStorage.setItem('news_read', news_read.join(',')) + return + } + const now = Date.now() + localStorage.setItem('app_reminder', now) + this.setState({ + hidden: true + }) + } + + openNew = (e, i, url) => { + e.preventDefault() + this.hideMe(i) + window.open(url, '_blank') + } + + showModal = (e) => { + e.preventDefault() + this.props.showModal() + this.hideMe() + } + + showAppReminder = () => { + if (process.env.IS_APP || typeof(localStorage) === 'undefined' + || location.pathname.startsWith('/submit')) { + return false + } + const now = Date.now() + let reminded = localStorage.getItem('app_reminder') || 0 + reminded = parseInt(reminded) + return !reminded || (now - reminded > APP_REMINDER_INTERVAL) + } + + render() { + const { news,hiddenNews } = this.state + + let appReminder = null + if (news && this.showAppReminder() && !this.state.hidden) { + appReminder = + { + e.stopPropagation() + this.hideMe() + }} + /> + {tt('app_reminder.text')} + + } + + let newItems = [] + if (news) { + let newCount = 0 + for (const ne of news) { + if (hiddenNews.includes(ne.hashlink)) { + continue + } + newCount++ + } + newCount -= 1 + for (const ne of news) { + if (hiddenNews.includes(ne.hashlink)) { + continue + } + let title = ne.title + if (title.length > 100) { + title = title.substring(0, 100) + '...' + } + let bottom = newCount * 65 + if (appReminder) { + bottom += 65 + } else { + bottom += 2 + } + newItems.push( this.openNew(e, ne.hashlink, ne.url)} target='_blank' rel='noopener noreferrer nofollow'> + + { + e.stopPropagation() + e.preventDefault() + this.hideMe(ne.hashlink) + }} + /> + {title} + + ) + --newCount + } + } + + return
    + {appReminder} + {newItems} +
    + } +} + +export default connect( + state => { + return {} + }, + dispatch => ({ + showModal: () => { + dispatch(user.actions.showAppDownload()) + } + }) +)(NewsPopups) diff --git a/app/components/elements/app/AppReminder.scss b/app/components/elements/NewsPopups.scss similarity index 95% rename from app/components/elements/app/AppReminder.scss rename to app/components/elements/NewsPopups.scss index 227071e5b..fe5c9b22a 100644 --- a/app/components/elements/app/AppReminder.scss +++ b/app/components/elements/NewsPopups.scss @@ -1,4 +1,4 @@ -.AppReminder { +.NewsPopups { @include themify($themes) { background-color: themed('modalReminder') !important; } diff --git a/app/components/elements/app/AppReminder.jsx b/app/components/elements/app/AppReminder.jsx deleted file mode 100644 index 7043fc288..000000000 --- a/app/components/elements/app/AppReminder.jsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react' -import tt from 'counterpart' -import { connect } from 'react-redux' - -import CloseButton from 'react-foundation-components/lib/global/close-button' - -import user from 'app/redux/User' - -class AppReminder extends React.Component { - state = { - hidden: false - } - - hideMe = () => { - const now = Date.now() - localStorage.setItem('app_reminder', now) - this.setState({ - hidden: true - }) - } - - showModal = (e) => { - e.preventDefault() - this.props.showModal() - this.hideMe() - } - - render() { - if (this.state.hidden) { - return null - } - return - { - e.stopPropagation() - this.hideMe() - }} - /> - {tt('app_reminder.text')} - - } -} - -export default connect( - state => { - return {} - }, - dispatch => ({ - showModal: () => { - dispatch(user.actions.showAppDownload()) - } - }) -)(AppReminder) diff --git a/app/components/elements/forms/AmountAssetField.jsx b/app/components/elements/forms/AmountAssetField.jsx new file mode 100644 index 000000000..4eb5782cf --- /dev/null +++ b/app/components/elements/forms/AmountAssetField.jsx @@ -0,0 +1,50 @@ +import React from 'react' +import { Field, } from 'formik' +import { Asset, AssetEditor, } from 'golos-lib-js/lib/utils' + +class AmountAssetField extends React.Component { + static defaultProps = { + amountField: 'amount', + } + + onChange = (e) => { + const { amountField, values, setFieldValue, assets } = this.props + const value = e.target.value + const asset = assets[value] + if (asset) { + const { supply } = asset + const oldValue = values[amountField].asset + setFieldValue(amountField, AssetEditor(oldValue.amount, + supply.precision, supply.symbol)) + + if (!values.author) { // if not edit mode + if (asset.allow_override_transfer || value === 'GBG') { + if (values.tip_cost) + setFieldValue('tip_cost', false) + setFieldValue('disable_tip', true) + } else { + setFieldValue('disable_tip', false) + } + } + } + } + + render() { + const { name, assets, values, amountField } = this.props + + const options = [] + for (const [ sym, asset ] of Object.entries(assets)) { + options.push() + } + + const { asset } = values[amountField] + + return ( + {options} + ) + } +} + +export default AmountAssetField diff --git a/app/components/elements/forms/AmountField.jsx b/app/components/elements/forms/AmountField.jsx index 8aeda2f2a..cf70d02c4 100644 --- a/app/components/elements/forms/AmountField.jsx +++ b/app/components/elements/forms/AmountField.jsx @@ -1,8 +1,12 @@ import React from 'react' -import { Field, ErrorMessage, } from 'formik' +import { Field, } from 'formik' import { AssetEditor } from 'golos-lib-js/lib/utils' class AmountField extends React.Component { + static defaultProps = { + name: 'amount', + } + _renderInput = ({ field, form }) => { const { value, ...rest } = field const { values, setFieldValue } = form @@ -12,15 +16,16 @@ class AmountField extends React.Component { } onChange = (e, values, setFieldValue) => { - const newAmount = values.amount.withChange(e.target.value) + const { name } = this.props + const newAmount = values[name].withChange(e.target.value) if (newAmount.hasChange && newAmount.asset.amount >= 0) { - setFieldValue('amount', newAmount) + setFieldValue(name, newAmount) } } render() { - const { placeholder, } = this.props - return ( {this._renderInput} diff --git a/app/components/elements/nft/NFTSmallIcon.jsx b/app/components/elements/nft/NFTSmallIcon.jsx new file mode 100644 index 000000000..1cc8bacd3 --- /dev/null +++ b/app/components/elements/nft/NFTSmallIcon.jsx @@ -0,0 +1,12 @@ +import React, { Component, } from 'react' + +class NFTSmallIcon extends Component { + render() { + const { image, onClick, ...rest } = this.props + + return + } +} + +export default NFTSmallIcon diff --git a/app/components/elements/nft/NFTSmallIcon.scss b/app/components/elements/nft/NFTSmallIcon.scss new file mode 100644 index 000000000..0ee59410a --- /dev/null +++ b/app/components/elements/nft/NFTSmallIcon.scss @@ -0,0 +1,11 @@ +.NFTSmallIcon { + background-size: cover; + background-repeat: no-repeat; + background-position: 50% 50%; + border-radius: 50%; + + width: 3rem; + height: 3rem; + display: inline-block; + vertical-align: top; +} diff --git a/app/components/elements/postEditor/MarkdownEditor/MarkdownEditor.jsx b/app/components/elements/postEditor/MarkdownEditor/MarkdownEditor.jsx index 47925af94..b027ad229 100644 --- a/app/components/elements/postEditor/MarkdownEditor/MarkdownEditor.jsx +++ b/app/components/elements/postEditor/MarkdownEditor/MarkdownEditor.jsx @@ -247,7 +247,10 @@ export default class MarkdownEditor extends PureComponent { ) || lineContent.match( /(?:^|\s)(?:https?:)?\/\/youtu\.be\/([A-Za-z0-9_-]{11})(?:\s|&|$)/ - ); + ) || + lineContent.match( + /(?:^|\s)(?:https?:)?\/\/(?:www\.)?youtube\.com\/shorts\/([A-Za-z0-9_-]{11})(?:\s|&|$)/ + ) if (match) { this._addLineWidget( diff --git a/app/components/elements/postEditor/PostFooter/PostFooter.jsx b/app/components/elements/postEditor/PostFooter/PostFooter.jsx index c0ed994b1..2e21fa872 100644 --- a/app/components/elements/postEditor/PostFooter/PostFooter.jsx +++ b/app/components/elements/postEditor/PostFooter/PostFooter.jsx @@ -7,6 +7,7 @@ import TagsEditLine from 'app/components/elements/postEditor/TagsEditLine'; import PostOptions from 'app/components/elements/postEditor/PostOptions/PostOptions'; import Button from 'app/components/elements/common/Button'; import Hint from 'app/components/elements/common/Hint'; +import VerticalMenu from 'app/components/elements/VerticalMenu' import { NSFW_TAG, ONLYBLOG_TAG, ONLYAPP_TAG } from 'app/utils/tags'; import { VISIBLE_TYPES } from 'app/components/modules/PostForm/PostForm'; import './PostFooter.scss'; @@ -17,11 +18,12 @@ export default class PostFooter extends PureComponent { tags: PropTypes.array, publishedLimited: PropTypes.bool, postDisabled: PropTypes.bool, + postEncrypted: PropTypes.bool, disabledHint: PropTypes.string, onPayoutTypeChange: PropTypes.func.isRequired, onCurationPercentChange: PropTypes.func.isRequired, onTagsChange: PropTypes.func.isRequired, - onPostClick: PropTypes.func.isRequired, + onPost: PropTypes.func.isRequired, onResetClick: PropTypes.func.isRequired, onCancelClick: PropTypes.func.isRequired, }; @@ -29,8 +31,14 @@ export default class PostFooter extends PureComponent { state = { temporaryErrorText: null, singleLine: true, + showVisibleOptions: false, }; + constructor(props) { + super(props) + this._onAwayClickListen = false + } + componentDidMount() { this._checkSingleLine(); @@ -42,6 +50,12 @@ export default class PostFooter extends PureComponent { componentWillUnmount() { clearInterval(this._resizeInterval); clearTimeout(this._temporaryErrorTimeout); + + this._unmount = true + + if (this._onAwayClickListen) { + window.removeEventListener('mousedown', this._onAwayClick) + } } onCategoryChange = (event) => { @@ -52,6 +66,66 @@ export default class PostFooter extends PureComponent { [event.target.value, ...tags]); } + onPostClick = (e) => { + e.preventDefault() + + const { editMode, postEncrypted } = this.props + if (editMode) { + this.props.onPost(postEncrypted ? VISIBLE_TYPES.ONLY_SPONSORS : VISIBLE_TYPES.ALL) + return + } + + this.setState({ + showVisibleOptions: !this.state.showVisibleOptions + }, + () => { + const { showVisibleOptions } = this.state; + + if (showVisibleOptions && !this._onAwayClickListen) { + window.addEventListener('mousedown', this._onAwayClick) + this._onAwayClickListen = true + } + }) + } + + _onAwayClick = e => { + if (!this._popupVisible || !this._popupVisible.contains(e.target)) { + setTimeout(() => { + if (!this._unmount) { + this.setState({ + showVisibleOptions: false, + }); + } + }, 50); + } + }; + + _popupVisibleRef = el => { + this._popupVisible = el + } + + _renderVisibleOptions = () => { + const onClick = (e) => { + e.preventDefault() + this.props.onPost(parseInt(e.target.parentNode.dataset.value)) + } + + const visibleItems = [ + {link: '#', label: tt('post_editor.visible_option_all'), value: VISIBLE_TYPES.ALL, onClick }, + {link: '#', label: tt('post_editor.visible_option_onlyblog'), value: VISIBLE_TYPES.ONLY_BLOG, onClick }, + {link: '#', label: tt('post_editor.visible_option_onlysponsors'), value: VISIBLE_TYPES.ONLY_SPONSORS, onClick }, + ] + + return ( + + + {tt('post_editor.set_visible_type')} + + + + ) + } + render() { let { editMode, @@ -60,7 +134,7 @@ export default class PostFooter extends PureComponent { postDisabled, disabledHint, } = this.props; - const { temporaryErrorText, singleLine } = this.state; + const { temporaryErrorText, singleLine, showVisibleOptions } = this.state; let category = ""; @@ -92,20 +166,12 @@ export default class PostFooter extends PureComponent { isMobile = window.matchMedia('screen and (max-width: 39.9375em)').matches; } - const visibleType = this.props.tags.includes(ONLYAPP_TAG) ? - VISIBLE_TYPES.ONLY_APP : - (this.props.tags.includes(ONLYBLOG_TAG) ? - VISIBLE_TYPES.ONLY_BLOG : VISIBLE_TYPES.ALL) - const options = () @@ -140,11 +206,11 @@ export default class PostFooter extends PureComponent { {temporaryErrorText} - ) : null} + ) : showVisibleOptions ? this._renderVisibleOptions() : null} + } { dispatch(user.actions.setDonateDefaults(donateDefaults)) }, + showGiftNft: (author, permlink, is_comment) => { + dispatch(user.actions.setGiftNftDefaults({ author, permlink, is_comment })) + dispatch(user.actions.showGiftNft()) + }, dispatchSubmit: async ({ to, amount, memo, isMemoEncrypted, permlink, is_comment, vote, myVote, voteAllowType, currentUser, errorCallback diff --git a/app/components/modules/GiftNFT.jsx b/app/components/modules/GiftNFT.jsx new file mode 100644 index 000000000..e0ceac29d --- /dev/null +++ b/app/components/modules/GiftNFT.jsx @@ -0,0 +1,164 @@ +import React from 'react' +import { connect } from 'react-redux' +import { Map } from 'immutable' +import tt from 'counterpart' +import { Asset } from 'golos-lib-js/lib/utils' + +import NFTSmallIcon from 'app/components/elements/nft/NFTSmallIcon' +import LoadingIndicator from 'app/components/elements/LoadingIndicator' +import g from 'app/redux/GlobalReducer' +import transaction from 'app/redux/Transaction' +import { getAssetMeta } from 'app/utils/market/utils' + +class GiftNFT extends React.Component { + constructor(props) { + super(props) + this.state = { + } + } + + componentDidMount() { + if (!this.props.nft_tokens) { + this.props.fetchNFTTokens(this.props.currentUser) + } + } + + giftNFT = (e, token_id) => { + e.preventDefault() + const { currentUser, opts } = this.props + this.setState({ + isSubmitting: true + }) + this.props.giftNFT(currentUser, token_id, opts.author, opts.permlink, opts.is_comment, () => { + this.props.onCancel() + }, (err) => { + console.error(err) + const errorMessage = err.toString() + this.setState({ + errorMessage: errorMessage !== 'Canceled' && errorMessage, + isSubmitting: false + }) + }) + } + + render() { + const { nft_tokens, nft_assets, currentUser } = this.props + + const tokens = nft_tokens ? nft_tokens.toJS().data : [] + const assets = nft_assets ? nft_assets.toJS() : null + + const next_from = nft_tokens && nft_tokens.get('next_from') + + let items = [] + let count = 0 + for (const token of tokens) { + const { json_metadata, image, token_id } = token + + let data + if (json_metadata) { + data = JSON.parse(json_metadata) + } + data = data || {} // node allows to use '', null, object, or array + + let last_price + const last_buy_price = Asset(token.last_buy_price) + if (last_buy_price.amount > 0) { + const asset = assets[last_buy_price.symbol] + let imageUrl + if (asset) { + imageUrl = getAssetMeta(asset).image_url + } + last_price = + {imageUrl && {''}} + {last_buy_price.amountFloat} + + } + + items.push( this.giftNFT(e, token_id)}> + + e.preventDefault()} /> + + + {data.title} + + + {last_price} + + ) + + ++count + } + + if (!items.length) { + items = + } else { + items = + {items} +
    + } + + const { isSubmitting, errorMessage } = this.state + + return
    +
    +

    {tt('transfer_jsx.gift_nft')}

    +
    + {items} + {next_from ?
    +
    +
    : null} + {errorMessage &&
    + {errorMessage} +
    } + {isSubmitting ?
    + : + + } +
    + } +} + +export default connect( + (state, ownProps) => { + const opts = state.user.get('gift_nft_defaults', Map()).toJS() + + const currentUser = state.user.getIn(['current']) + const currentAccount = currentUser && state.global.getIn(['accounts', currentUser.get('username')]) + + return { ...ownProps, + currentUser, + currentAccount, + opts, + nft_tokens: state.global.get('nft_tokens'), + nft_assets: state.global.get('nft_assets'), + } + }, + dispatch => ({ + fetchNFTTokens: (currentUser, start_token_id = 0) => { + if (!currentUser) return + const account = currentUser.get('username') + dispatch(g.actions.fetchNftTokens({ account, start_token_id })) + }, + giftNFT: (currentUser, token_id, to, permlink, is_comment, successCallback, errorCallback) => { + const username = currentUser.get('username') + const operation = { + from: username, + to, + token_id, + memo: (is_comment ? 'Comment' : 'Post') + ': @' + to + '/' + permlink + } + + dispatch(transaction.actions.broadcastOperation({ + type: 'nft_transfer', + username, + operation, + successCallback, + errorCallback + })) + } + }) +)(GiftNFT) diff --git a/app/components/modules/GiftNFT.scss b/app/components/modules/GiftNFT.scss new file mode 100644 index 000000000..dbaa1da7a --- /dev/null +++ b/app/components/modules/GiftNFT.scss @@ -0,0 +1,18 @@ +.GiftNFT { + tr { + cursor: pointer; + td:first-child { + width: 10px; + white-space: nowrap; + } + } + tr:hover { + background-color: rgba(208,208,208,0.45); + } + + .price-icon { + width: 20px; + height: 20px; + margin-right: 0.25rem; + } +} diff --git a/app/components/modules/LoginForm.jsx b/app/components/modules/LoginForm.jsx index b57c220c7..2ef21da2e 100644 --- a/app/components/modules/LoginForm.jsx +++ b/app/components/modules/LoginForm.jsx @@ -337,7 +337,7 @@ export default connect( dispatch(user.actions.usernamePasswordLogin({username, password, saveLogin: true, afterLoginRedirectToWelcome, operationType: type})) dispatch(user.actions.closeLogin()) } else { - dispatch(user.actions.usernamePasswordLogin({username, password, saveLogin, afterLoginRedirectToWelcome})) + dispatch(user.actions.usernamePasswordLogin({username, password, saveLogin, afterLoginRedirectToWelcome, refetchState: true})) } }, clearError: () => { if (hasError) dispatch(user.actions.loginError({error: null})) }, diff --git a/app/components/modules/Modals.jsx b/app/components/modules/Modals.jsx index de745b5b9..547d18a42 100644 --- a/app/components/modules/Modals.jsx +++ b/app/components/modules/Modals.jsx @@ -1,12 +1,15 @@ import React from 'react'; import PropTypes from 'prop-types' import {connect} from 'react-redux'; +import Confetti from 'react-dom-confetti' import CloseButton from 'react-foundation-components/lib/global/close-button'; import Reveal from 'react-foundation-components/lib/global/reveal'; +import { CONFETTI_CONFIG } from 'app/client_config' import LoginForm from 'app/components/modules/LoginForm'; import ConfirmTransactionForm from 'app/components/modules/ConfirmTransactionForm'; import Donate from 'app/components/modules/Donate' +import GiftNFT from 'app/components/modules/GiftNFT' import SignUp from 'app/components/modules/SignUp' import ChangeAccount from 'app/components/modules/ChangeAccount' import AddAccount from 'app/components/modules/AddAccount' @@ -22,11 +25,13 @@ class Modals extends React.Component { show_login_modal: PropTypes.bool, show_confirm_modal: PropTypes.bool, show_donate_modal: PropTypes.bool, + show_gift_nft_modal: PropTypes.bool, show_signup_modal: PropTypes.bool, show_promote_post_modal: PropTypes.bool, show_change_account_modal: PropTypes.bool, show_add_account_modal: PropTypes.bool, show_app_download_modal: PropTypes.bool, + confetti_nft_active: PropTypes.bool, hideLogin: PropTypes.func.isRequired, hideConfirm: PropTypes.func.isRequired, hideSignUp: PropTypes.func.isRequired, @@ -53,12 +58,15 @@ class Modals extends React.Component { show_login_modal, show_confirm_modal, show_donate_modal, + show_gift_nft_modal, show_signup_modal, show_change_account_modal, show_add_account_modal, show_app_download_modal, + confetti_nft_active, hideLogin, hideDonate, + hideGiftNFT, hideConfirm, hideSignUp, hideChangeAccount, @@ -89,6 +97,10 @@ class Modals extends React.Component { } + {show_gift_nft_modal && + + + } {show_signup_modal && @@ -105,6 +117,9 @@ class Modals extends React.Component { } +
    + +
    ); } @@ -119,12 +134,14 @@ export default connect( loginUnclosable, show_confirm_modal: state.transaction.get('show_confirm_modal'), show_donate_modal: state.user.get('show_donate_modal'), + show_gift_nft_modal: state.user.get('show_gift_nft_modal'), show_promote_post_modal: state.user.get('show_promote_post_modal'), show_signup_modal: state.user.get('show_signup_modal'), show_change_account_modal: state.user.get('show_change_account_modal'), show_add_account_modal: state.user.get('show_add_account_modal'), show_app_download_modal: state.user.get('show_app_download_modal'), notifications: state.app.get('notifications'), + confetti_nft_active: state.global.get('confetti_nft_active') } }, dispatch => ({ @@ -140,6 +157,10 @@ export default connect( if (e) e.preventDefault() dispatch(user.actions.hideDonate()) }, + hideGiftNFT: e => { + if (e) e.preventDefault() + dispatch(user.actions.hideGiftNft()) + }, hidePromotePost: e => { if (e) e.preventDefault(); dispatch(user.actions.hidePromotePost()) diff --git a/app/components/modules/PostForm/PostForm.jsx b/app/components/modules/PostForm/PostForm.jsx index 5099ba6c4..d78c33076 100644 --- a/app/components/modules/PostForm/PostForm.jsx +++ b/app/components/modules/PostForm/PostForm.jsx @@ -5,6 +5,7 @@ import { connect } from 'react-redux'; import Turndown from 'turndown'; import cn from 'classnames'; import tt from 'counterpart'; +import { api } from 'golos-lib-js' import transaction from 'app/redux/Transaction'; import HtmlReady, { getTags } from 'shared/HtmlReady'; import DialogManager from 'app/components/elements/common/DialogManager'; @@ -29,6 +30,7 @@ import { } from 'app/utils/tags'; import { DRAFT_KEY, EDIT_KEY } from 'app/utils/postForm'; import { checkAllowed, AllowTypes } from 'app/utils/Allowance' +import { makeOid, encryptPost, } from 'app/utils/sponsors' const EDITORS_TYPES = { MARKDOWN: 1, @@ -45,7 +47,7 @@ export const PAYOUT_TYPES = { export const VISIBLE_TYPES = { ALL: 1, ONLY_BLOG: 2, - ONLY_APP: 3, + ONLY_SPONSORS: 3, }; const DEFAULT_CURATION_PERCENT = 5000; // 50% @@ -68,22 +70,6 @@ export const PAYOUT_OPTIONS = [ }, ]; -export const VISIBLE_OPTIONS = [ - { - id: VISIBLE_TYPES.ALL, - title: 'post_editor.visible_option_all', - }, - { - id: VISIBLE_TYPES.ONLY_BLOG, - title: 'post_editor.visible_option_onlyblog', - }, - { - id: VISIBLE_TYPES.ONLY_APP, - title: 'post_editor.visible_option_onlyapp', - hint: 'post_editor.visible_option_onlyapp_hint', - }, -]; - class PostForm extends React.Component { static propTypes = { editMode: PropTypes.bool, @@ -106,7 +92,6 @@ class PostForm extends React.Component { emptyBody: true, rteState: null, tags: [], - publishedLimited: false, postError: null, payoutType: PAYOUT_TYPES.PAY_100, curationPercent: DEFAULT_CURATION_PERCENT, @@ -130,7 +115,6 @@ class PostForm extends React.Component { if (editMode) { const tags = this._getTagsFromMetadata(); - this.state.publishedLimited = tags.includes(ONLYAPP_TAG) || tags.includes(ONLYBLOG_TAG) if (!isLoaded) { this._fillFromMetadata(tags); } @@ -219,14 +203,13 @@ class PostForm extends React.Component { } render() { - const { editMode, categories } = this.props; + const { editMode, editParams, categories } = this.props; const { editorId, title, text, tags, - publishedLimited, payoutType, curationPercent, isPreview, @@ -298,7 +281,6 @@ class PostForm extends React.Component { editMode={editMode} errorText={postError} tags={tags} - publishedLimited={publishedLimited} categories={categories.get('categories').toJS()} onTagsChange={this._onTagsChange} payoutType={payoutType} @@ -308,12 +290,13 @@ class PostForm extends React.Component { postDisabled={ Boolean(disallowPostCode) || isPosting } + postEncrypted={editMode ? editParams.encrypted : false} disabledHint={ disallowPostCode ? tt(disallowPostCode) : null } - onPostClick={this._postSafe} + onPost={this._postSafe} onResetClick={this._onResetClick} onCancelClick={this._onCancelClick} /> @@ -551,7 +534,7 @@ class PostForm extends React.Component { }; } - _post = () => { + _post = (visibleType) => { const { author, editMode } = this.props; const { title, tags, payoutType, curationPercent, editorId } = this.state; let error; @@ -582,7 +565,12 @@ class PostForm extends React.Component { return; } - const processedTags = processTagsToSend(tags); + let processedTags = processTagsToSend(tags); + + if (visibleType === VISIBLE_TYPES.ONLY_BLOG) { + if (!processedTags.includes(ONLYBLOG_TAG)) + processedTags.push(ONLYBLOG_TAG) + } const body = this.refs.editor.getValue(); let html; @@ -620,7 +608,8 @@ class PostForm extends React.Component { } if (rtags.images.size) { - meta.image = [...rtags.images]; + const [firstImage] = rtags.images + meta.image = [firstImage] } if (rtags.links.size) { @@ -667,6 +656,7 @@ class PostForm extends React.Component { this.props.onPost( data, editMode, + visibleType, () => { try { if (editMode) { @@ -803,7 +793,33 @@ export default connect( categories: state.global.get('tag_idx'), }), dispatch => ({ - async onPost(payload, editMode, onSuccess, onError) { + async onPost(payload, editMode, visibleType, onSuccess, onError) { + if (visibleType === VISIBLE_TYPES.ONLY_SPONSORS) { + let pso + try { + pso = await api.getPaidSubscriptionOptionsAsync({ + author: payload.author, + oid: makeOid() + }) + } catch (err) { + console.error('Cannot get paid subscription', err) + onError(err) + return + } + if (!pso.author) { + window.location.href = '/@' + payload.author + '/sponsors' + return + } + + try { + payload.body = await encryptPost(payload) + } catch (err) { + console.error('Cannot encrypt', err) + onError(err) + return + } + } + let blocking = await checkAllowed(payload.author, [], null, editMode ? AllowTypes.postEdit : AllowTypes.post) diff --git a/app/components/modules/SponsorList.jsx b/app/components/modules/SponsorList.jsx new file mode 100644 index 000000000..e51526cbe --- /dev/null +++ b/app/components/modules/SponsorList.jsx @@ -0,0 +1,265 @@ +import React from 'react' +import { connect } from 'react-redux' +import tt from 'counterpart' +import { Asset } from 'golos-lib-js/lib/utils' + +import DialogManager from 'app/components/elements/common/DialogManager'; +import Icon from 'app/components/elements/Icon' +import LoadingIndicator from 'app/components/elements/LoadingIndicator' +import TimeAgoWrapper from 'app/components/elements/TimeAgoWrapper' +import g from 'app/redux/GlobalReducer' +import transaction from 'app/redux/Transaction' +import LinkEx from 'app/utils/LinkEx' +import session from 'app/utils/session' +import { makeOid, SPONSORS_PER_PAGE } from 'app/utils/sponsors' +import { walletUrl } from 'app/utils/walletUtils' + +class SponsorList extends React.Component { + state = { + from: '', + prevFroms: [], + } + + /*shouldComponentUpdate(nextProps) { + const { items, username } = this.props + console.log('scu', items.data.length, nextProps.items.data.length) + return items.data.length !== nextProps.items.data.length || + items.loading !== nextProps.loading || + username !== nextProps.username + }*/ + + goBack = async (e) => { + e.preventDefault() + + const { account } = this.props + const prevFroms = [ ...this.state.prevFroms ] + const prevFrom = prevFroms.pop() + if (this.props.type === 'sponsoreds') { + await this.props.fetchSponsoreds(account.name, prevFrom) + } else { + await this.props.fetchSponsors(account.name, prevFrom) + } + this.setState({ + prevFroms, + from: prevFrom + }) + } + + goNext = async (e) => { + e.preventDefault() + + const isSponsoreds = this.props.type === 'sponsoreds' + + const { account, items } = this.props + + const last = items.data[items.data.length - 1] + let newFrom + if (isSponsoreds) { + newFrom = last.author + await this.props.fetchSponsoreds(account.name, newFrom) + } else { + newFrom = last.subscriber + await this.props.fetchSponsors(account.name, newFrom) + } + + const { prevFroms, from } = this.state + this.setState({ + prevFroms: [...prevFroms, from], + from: newFrom + }) + } + + render() { + const { items, type } = this.props + + const isSponsoreds = type === 'sponsoreds' + + let content + + let { username } = this.props + if (!username && process.env.BROWSER) { + username = session.load().currentName + } + + if (!items.data.length) { + const { account, } = this.props + const isMyAccount = account.name === username + if (isSponsoreds) { + return
    + {isMyAccount ? tt('sponsorslist_jsx.no_sponsoreds') : account.name + tt('sponsorslist_jsx.no_sponsoreds2')} +
    + } else { + return
    + {isMyAccount ? tt('sponsorslist_jsx.no_sponsors') : account.name + tt('sponsorslist_jsx.no_sponsors2')} +
    + } + } + + let hasMore = false + let rows = [] + let count = 0 + for (let s of items.data) { + hasMore = count == SPONSORS_PER_PAGE + if (hasMore) { + break + } + + let cost = Asset(s.cost).floatString + + const expiredHint = (e) => { + e.preventDefault() + DialogManager.info(
    + {tt('sponsorslist_jsx.expired_hint') + + (s.tip_cost ? 'TIP-' : '')} + {tt('g.balance')} + {' ' + tt('g.on_by') + ' '} + {cost} + {'. ' + tt('sponsorslist_jsx.expired_hint2')} +
    , '') + } + + const prolongIt = (e) => { + e.preventDefault() + this.props.prolong(s.subscriber, s.author, s.cost, s.tip_cost, () => { + }, (err) => { + }) + } + + const cancelIt = (e) => { + e.preventDefault() + this.props.cancel(s.subscriber, s.author, () => { + window.location.reload() + }, (err) => { + }) + } + + if (s.tip_cost) { + cost += tt('poststub.for_sponsors3') + } + + const user = isSponsoreds ? s.author : s.subscriber + + const mySponsored = username === s.subscriber + + rows.push( + {user} + {cost} + {s.active ? + {tt('sponsorslist_jsx.payment') + ' '} + + : + {s.inactive_reason === 'subscription_update' ? + + {tt('sponsorslist_jsx.expired_update')} + + : + + {tt('sponsorslist_jsx.expired')} + + {' '} + {mySponsored ? : null} + } + } + {mySponsored ? + {!s.active ? : null} + + : } + ) + + ++count + } + + const { from } = this.state + + const navButtons = ( + + ) + + content =
    + {items.loading ? : + + {rows} +
    } +
    + + return
    + {navButtons} + {content} + {navButtons} +
    + } +} + +export default connect( + state => { + return { + }; + }, + dispatch => ({ + prolong: (username, author, amount, from_tip, onSuccess, onError) => { + dispatch(transaction.actions.broadcastOperation({ + type: 'paid_subscription_transfer', + operation: { + from: username, + to: author, + oid: makeOid(), + amount, + memo: '', + from_tip, + extensions: [], + __prolong: true + }, + username, + successCallback: () => { + onSuccess() + }, + errorCallback: (err) => { + onError(err) + } + })) + }, + cancel: (username, author, onSuccess, onError) => { + dispatch(transaction.actions.broadcastOperation({ + type: 'paid_subscription_cancel', + confirm: tt('sponsorslist_jsx.cancel_confirm'), + operation: { + subscriber: username, + author, + oid: makeOid(), + extensions: [], + __config: {title: tt('g.are_you_sure')} + }, + username, + successCallback: () => { + onSuccess() + }, + errorCallback: (err) => { + onError(err) + } + })) + }, + fetchSponsors: (author, from) => { + dispatch(g.actions.fetchSponsors({ + author, from + })) + }, + fetchSponsoreds: (sponsor, from) => { + dispatch(g.actions.fetchSponsoreds({ + sponsor, from + })) + } + }) +)(SponsorList) \ No newline at end of file diff --git a/app/components/modules/SponsorList.scss b/app/components/modules/SponsorList.scss new file mode 100644 index 000000000..d9d35a352 --- /dev/null +++ b/app/components/modules/SponsorList.scss @@ -0,0 +1,5 @@ +.SponsorList__content { + .button { + margin-bottom: 0px; + } +} diff --git a/app/components/modules/SponsorSubscription.jsx b/app/components/modules/SponsorSubscription.jsx new file mode 100644 index 000000000..790ebdf19 --- /dev/null +++ b/app/components/modules/SponsorSubscription.jsx @@ -0,0 +1,313 @@ +import React from 'react' +import { connect } from 'react-redux' +import { Formik, Form, Field, ErrorMessage, } from 'formik' +import tt from 'counterpart' +import { Asset, AssetEditor } from 'golos-lib-js/lib/utils' + +import AmountField from 'app/components/elements/forms/AmountField' +import AmountAssetField from 'app/components/elements/forms/AmountAssetField' +import LoadingIndicator from 'app/components/elements/LoadingIndicator' +import transaction from 'app/redux/Transaction' +import session from 'app/utils/session' + +class SponsorSubscription extends React.Component { + constructor(props) { + super(props) + } + + state = { + } + + async componentDidMount() { + await this.initForm() + } + + async componentDidUpdate() { + await this.initForm() + } + + initForm = async () => { + if ((!this.state.pso && this.props.pso) + || (this.state.pso && this.state.pso.author !== this.props.pso.get('author'))) { + const pso = this.props.pso.toJS() + pso.cost = await AssetEditor(pso.cost) + this.setState({ + pso + }) + } + } + + createNew = (e) => { + e.preventDefault() + this.setState({ + creating: true, + pso: { + ...this.state.pso, + cost: AssetEditor('1000.000 GOLOS') + } + }) + } + + cancelCreate = (e) => { + e.preventDefault() + this.setState({ + creating: false + }) + } + + validate = (values) => { + const errors = {} + if (values.cost.asset.eq(0)) { + errors.cost = tt('sponsors_jsx.fill_cost') + } + return errors + } + + setSubmitting = (submitting) => { + this.setState({ submitting }) + } + + _onSubmit = async (values) => { + const { username } = this.props + this.setSubmitting(true) + if (values.author) { + await this.props.updatePso(username, values.oid, values.cost, () => { + this.setState({ + saved: true, + }) + setTimeout(() => { + this.setState({ + saved: false + }) + }, 2000) + this.setSubmitting(false) + }, (err) => { + console.error(err) + this.setSubmitting(false) + }) + return + } + await this.props.createPso(username, values.oid, values.cost, () => { + this.props.fetchState() + this.setState({ + created: true, + }) + setTimeout(() => { + this.setState({ + created: false + }) + }, 3000) + this.setSubmitting(false) + }, (err) => { + console.error(err) + this.setSubmitting(false) + }) + } + + deletePso = async (e) => { + e.preventDefault() + this.setSubmitting(true) + + const { pso } = this.state + const { username } = this.props + await this.props.deletePso(username, pso.oid, pso.subscribers, () => { + this.props.fetchState() + this.setSubmitting(false) + }, (err) => { + console.error(err) + this.setSubmitting(false) + }) + } + + _renderSubmittingIndicator = () => { + const { submitting } = this.state + + return submitting ? + + : null + } + + render() { + const { pso, creating, submitting } = this.state + + let { account, username } = this.props + if (!username && process.env.BROWSER) { + username = session.load().currentName + } + + if (!pso || !account) { + return
    +

    {tt('sponsors_jsx.title')}

    + +
    + } + + if (account.name !== username) { + if (!pso.author) { + return
    +

    {tt('sponsors_jsx.title')}

    + {tt('sponsors_jsx.not_yet_NAME', { NAME: account.name })} +
    + } + return
    +

    {tt('sponsors_jsx.title')}

    + {tt('poststub.for_sponsors2')} + {pso.cost.asset.floatString} + {pso.tip_cost ? tt('poststub.for_sponsors3') : null} + {tt('poststub.for_sponsors4')}{' '} +
    + } + + if (creating || pso.author) { + const assets = {} + assets['GOLOS'] = { supply: Asset(0, 3, 'GOLOS') } + for (const asset of this.props.tokens) { + asset.supply = asset.supply.symbol ? asset.supply : Asset(asset.supply) + assets[asset.supply.symbol] = asset + } + + return
    +

    {tt('sponsors_jsx.title')}

    + + {({ + handleSubmit, isValid, values, setFieldValue, handleChange, + }) => { + const { symbol } = values.cost.asset + return ( +
    +
    + {tt('sponsors_jsx.cost')} +
    +
    +
    +
    + + + + +
    + +
    +
    +
    + {pso.author ?
    + + + {this._renderSubmittingIndicator()} + {this.state.saved ? {tt('g.saved') + '!'} : null} + {this.state.created ? {tt('sponsors_jsx.created') + '!'} : null} +
    :
    + + + {this._renderSubmittingIndicator()} + {this.state.created ? {tt('sponsors_jsx.created') + '!'} : null} +
    } +
    +
    + )}}
    +
    + } else { + return
    +

    {tt('sponsors_jsx.title')}

    + {tt('sponsors_jsx.not_yet') + ' '} + {tt('sponsors_jsx.create_it')} + {tt('sponsors_jsx.to_be_able_to_create_paid_posts')} +
    + } + } +} + +export default connect( + state => { + const current_user = state.user.get('current') + const username = current_user ? current_user.get('username') : null + const pso = state.global.get('pso') + const tokens = state.global.get('tokens') + + return { + current_user, + username, + pso, + tokens: tokens ? tokens.toJS() : {}, + }; + }, + dispatch => ({ + createPso: async (author, oid, cost, successCallback, errorCallback) => { + const operation = { + author, + oid, + cost: cost.asset.toString(), + tip_cost: true, + allow_prepaid: false, + interval: 30*24*60*60, + executions: 4294967295, + extensions: [] + } + dispatch( + transaction.actions.broadcastOperation({ + type: 'paid_subscription_create', + operation, + successCallback, + errorCallback + }) + ) + }, + updatePso: async (author, oid, cost, successCallback, errorCallback) => { + const operation = { + author, + oid, + cost: cost.asset.toString(), + tip_cost: true, + interval: 30*24*60*60, + executions: 4294967295, + extensions: [] + } + dispatch( + transaction.actions.broadcastOperation({ + type: 'paid_subscription_update', + operation, + successCallback, + errorCallback + }) + ) + }, + deletePso: async (author, oid, subscribers, successCallback, errorCallback) => { + const operation = { + author, + oid, + extensions: [] + } + let confirm = tt('sponsors_jsx.are_you_sure') + subscribers + if (subscribers) { + confirm = tt('sponsors_jsx.are_you_sure_COUNT', { COUNT: subscribers}) + } + dispatch( + transaction.actions.broadcastOperation({ + type: 'paid_subscription_delete', + confirm, + operation, + successCallback, + errorCallback + }) + ) + }, + fetchState: () => { + const pathname = window.location.pathname + dispatch({type: 'FETCH_STATE', payload: {pathname}}) + } + }) +)(SponsorSubscription) diff --git a/app/components/modules/SponsorSubscription.scss b/app/components/modules/SponsorSubscription.scss new file mode 100644 index 000000000..5b9457a9d --- /dev/null +++ b/app/components/modules/SponsorSubscription.scss @@ -0,0 +1,11 @@ +.submitter { + .LoadingIndicator { + display: inline-block; + } +} + +.saved { + display: inline-block; + vertical-align: top; + padding-top: 10px; +} diff --git a/app/components/modules/Sponsors.jsx b/app/components/modules/Sponsors.jsx new file mode 100644 index 000000000..d8a75505e --- /dev/null +++ b/app/components/modules/Sponsors.jsx @@ -0,0 +1,66 @@ +import React from 'react' +import { connect } from 'react-redux' +import tt from 'counterpart' + +import LoadingIndicator from 'app/components/elements/LoadingIndicator' +import SponsorList from 'app/components/modules/SponsorList' +import SponsorSubscription from 'app/components/modules/SponsorSubscription' + +class Sponsors extends React.Component { + constructor(props) { + super(props) + } + + state = { + } + + render() { + const { pso, } = this.props + + if (!pso) { + return
    + +
    + } + + let { sponsors, sponsoreds, account, current_user } = this.props + + sponsors = sponsors.toJS() + sponsoreds = sponsoreds.toJS() + + const username = current_user && current_user.get('username') + + const isMyAccount = account && account.name == username + + return
    + +
    +

    {tt('sponsors_jsx.your_sponsors')}

    + +
    +
    +

    {tt('sponsors_jsx.sponsored_authors')}

    + +
    +
    + } +} + + +export default connect( + state => { + const pso = state.global.get('pso') + const sponsors = state.global.get('sponsors') + const sponsoreds = state.global.get('sponsoreds') + + return { + pso, + sponsors, + sponsoreds, + }; + }, + dispatch => ({ + }) +)(Sponsors) diff --git a/app/components/modules/TopRightMenu.jsx b/app/components/modules/TopRightMenu.jsx index a70bcdc18..57b5bce02 100644 --- a/app/components/modules/TopRightMenu.jsx +++ b/app/components/modules/TopRightMenu.jsx @@ -153,11 +153,11 @@ function TopRightMenu({account, savings_withdraws, price_per_golos, globalprops, if (loggedIn) { // change back to if(username) after bug fix: Clicking on Login does not cause drop-down to close #TEMP! let user_menu = [ {link: feedLink, icon: 'new/home', value: tt('g.feed'), addon: }, - {link: accountLink, icon: 'new/blogging', value: tt('g.blog')}, + {link: accountLink, icon: 'new/blogging', value: tt('g.blog'), addon: }, {link: repliesLink, icon: 'new/answer', value: tt('g.replies'), addon: }, {link: discussionsLink, icon: 'new/bell', value: tt('g.discussions'), addon: }, {link: mentionsLink, icon: 'new/mention', value: tt('g.mentions'), addon: }, - {link: walletLink, target: walletTarget(), icon: 'new/wallet', value: tt('g.wallet'), addon: }, + {link: walletLink, target: walletTarget(), icon: 'new/wallet', value: tt('g.wallet'), addon: }, {link: donatesLink, target: walletTarget(), icon: 'hf/hf8', value: tt('g.rewards'), addon: }, (messagesLink ? {link: messagesLink, icon: 'new/envelope', value: tt('g.messages'), target: '_blank', addon: } : @@ -199,7 +199,7 @@ function TopRightMenu({account, savings_withdraws, price_per_golos, globalprops, -
    +
    } {navAdditional} diff --git a/app/components/pages/Post.jsx b/app/components/pages/Post.jsx index 784124fef..4c6b91f2a 100644 --- a/app/components/pages/Post.jsx +++ b/app/components/pages/Post.jsx @@ -3,9 +3,11 @@ import PropTypes from 'prop-types' import {connect} from 'react-redux' import {Set} from 'immutable' import tt from 'counterpart' +import { Asset } from 'golos-lib-js/lib/utils' import Comment from 'app/components/cards/Comment' import PostFull from 'app/components/cards/PostFull' +import EncryptedStub from 'app/components/elements/EncryptedStub' import Follow from 'app/components/elements/Follow' import FoundationDropdownMenu from 'app/components/elements/FoundationDropdownMenu' import Icon from 'app/components/elements/Icon' @@ -20,6 +22,7 @@ import { hidePost } from 'app/utils/ContentAccess' import { subscribePost, unsubscribePost, getSubs } from 'app/utils/NotifyApiClient' import shouldComponentUpdate from 'app/utils/shouldComponentUpdate' import session from 'app/utils/session' +import { EncryptedStates } from 'app/utils/sponsors' import { isHighlight, markCommentsRead, notifyPageView } from 'app/utils/NotifyApiClient' class Post extends React.Component { @@ -246,6 +249,13 @@ class Post extends React.Component { } } + const encrypted = dis.get('encrypted') + if (encrypted === EncryptedStates.loading) { + return this._renderLoadingStub(tt('poststub')) + } else if (encrypted && encrypted !== EncryptedStates.decrypted) { + return this._renderStub() + } + const stats = dis.get('stats').toJS() if(!showAnyway) { diff --git a/app/components/pages/Search.jsx b/app/components/pages/Search.jsx index e269c95a3..6826a754a 100644 --- a/app/components/pages/Search.jsx +++ b/app/components/pages/Search.jsx @@ -295,8 +295,11 @@ class Search extends React.Component { title = 'RE: ' + title; url += '#@' + author + '/' + permlink; } - let body = hit.highlight && hit.highlight.body; + let body = hit.highlight && hit.highlight.body body = body ? body[0].split(' ').join(' ') : truncate(hit.fields.body[0], {length: 250}); + if (body.startsWith('{"t":"e",')) { + body = tt('postsummary_jsx.for_sponsors') + } if (this.state.author && author !== this.state.author) return null; diff --git a/app/components/pages/UserProfile.jsx b/app/components/pages/UserProfile.jsx index 38cc6994e..4b958f80f 100644 --- a/app/components/pages/UserProfile.jsx +++ b/app/components/pages/UserProfile.jsx @@ -14,6 +14,7 @@ import UserKeys from 'app/components/elements/UserKeys'; import Settings from 'app/components/modules/Settings'; import ReputationHistory from 'app/components/modules/ReputationHistory' import Mentions from 'app/components/modules/Mentions' +import Sponsors from 'app/components/modules/Sponsors' import UserList from 'app/components/elements/UserList'; import Follow from 'app/components/elements/Follow'; import LoadingIndicator from 'app/components/elements/LoadingIndicator'; @@ -392,6 +393,11 @@ export default class UserProfile extends React.Component { { isMyAccount &&
    } ); + } else if (section === 'sponsors') { + tab_content =
    + + +
    } tab_content =
    @@ -437,7 +443,7 @@ export default class UserProfile extends React.Component {
    - {tt('g.wallet')} {isMyAccount && } + {tt('g.wallet')} {isMyAccount && } {tt('user_profile.follower_count', {count: followerCount})} {tt('user_profile.post_count', {count: account.post_count || 0})} {tt('user_profile.followed_count', {count: followingCount})} + {tt('user_profile.sponsor_count', {count: account.sponsor_count || 0})} + {isMyAccount && } +

    {location && {location}} diff --git a/app/components/pages/UserProfile.scss b/app/components/pages/UserProfile.scss index f993b25b0..380b90232 100644 --- a/app/components/pages/UserProfile.scss +++ b/app/components/pages/UserProfile.scss @@ -192,6 +192,15 @@ } } +.sponsors_notify { + a { + .NotifiCounter { + top: -1px !important; + margin-left: 0.5rem; + } + } +} + .UserProfile__rep-panel { .Icon { margin-left: 5px; diff --git a/app/locales/en.json b/app/locales/en.json index 35ef47ad9..b29eed6ed 100644 --- a/app/locales/en.json +++ b/app/locales/en.json @@ -83,6 +83,7 @@ "back": "Back", "more_list": "More", "back_to_top": "Back to top", + "balance": "balance", "balances": "Balances", "bid": "Bid", "blog": "Blog", @@ -91,6 +92,7 @@ "buy_VESTING_TOKEN": "Buy %(VESTING_TOKEN)s", "buy_or_sell": "Buy or Sell", "cancel": "Cancel", + "cancel2": "Cancel", "cancel_all": "Cancel All", "change_password": "Change Password", "clear": "Clear", @@ -103,6 +105,7 @@ "continue": "continue", "convert": "Convert", "convert_assets": "Exchange", + "create": "Create", "date": "Date", "decrypt": "Decrypt", "delete": "Delete", @@ -119,6 +122,7 @@ "follow": "Follow", "for": " for ", "from": " from ", + "gift": "Gift", "gp": "GP", "here": "здесь", "hide": "Hide", @@ -151,6 +155,7 @@ "nothing_yet": "Nothing yet", "ok": "Ok", "older": "Older", + "on_by": "by", "or": "or", "order_placed": "Order placed", "password": "Password", @@ -159,6 +164,7 @@ "invites": "Invite checks", "assets": "UIA assets", "help_wallet": "Wallet functions", + "per_month": "per month", "phone": "phone", "post": "Post", "posting": "Posting key", @@ -168,6 +174,7 @@ "promoted_title": "promoted", "promoted_post": "This post was promoted for ", "for_followers": "for followers", + "for_sponsors": "for sponsors", "only_app": "in application", "preview": "Preview", "previous": "Previous", @@ -377,6 +384,19 @@ "responses": "responses", "popular": "popular" }, + "sponsorslist_jsx": { + "payment": "Payment", + "payment_hint": "Next payment, will be claimed automatically", + "no_sponsors": "You are sponsored by nobody.", + "no_sponsors2": " is sponsored by nobody.", + "no_sponsoreds": "You sponsoring nobody.", + "no_sponsoreds2": " sponsoring nobody.", + "expired": "Expired", + "expired_hint": "There was not enough tokens on your balance. Please replenish your ", + "expired_hint2": "Next click Prolong button. First payment will be claimed now, and next - every month automatically.", + "expired_update": "Paused - author updated the cost", + "cancel_confirm": "Do you really want to cancel a sponsorship? Already claimed money will not be returned to you." + }, "submit_a_story": { "title": "Title", "editor": "editor", @@ -498,7 +518,13 @@ "zero": "No posts", "one": "1 post", "other": "%(count)s posts" - } + }, + "sponsor_count": { + "zero": "No sponsors", + "one": "1 sponsor", + "other": "%(count)s sponsors" + }, + "account_frozen": "Account is temporarily deactivated." }, "plurals": { "reply_count": { @@ -674,7 +700,16 @@ "sign_up": "sign up", "onlyapp": "This post is available only in GOLOS Blogs desktop application.", "install": "Install application", - "login_to_see_comment": "Log in to see this comment." + "login_to_see_comment": "Log in to see this comment.", + "for_sponsors": "This post is available only for sponsors of ", + "for_sponsors2": "Cost is ", + "for_sponsors3": " (TIP-balance)", + "for_sponsors4": " per month.", + "for_sponsors5": "First payment will be claimed now, and next - automatically every month.", + "become_sponsor": "Become sponsor", + "sponsorship_expired": "Your sponsorship is expired. Please prolong it, to read posts by ", + "prolong_sponsorship": "Prolong", + "login_to_become_sponsor": "Login to become sponsor." }, "postsummary_jsx": { "resteemed": "Reposted", @@ -686,7 +721,11 @@ "display_preferences": "display preferences", "create_an_account": "create an account", "to_save_your_preferences": "to save your preferences", - "mute_in_new": "Hide in New" + "mute_in_new": "Hide in New", + "for_sponsors": "Post is available only for author sponsors.", + "wrong_format": "Wrong post format, not supported by Golos Blogs.", + "no_decrypt_key": "Cannot decipher post due to an error.", + "no_sub": "Unavailable. Author deleted sponsor subscription." }, "confirmtransactionform_jsx": { "ok": "Ok", @@ -823,6 +862,23 @@ "profile_location": "Location", "profile_website": "Website" }, + "sponsors_jsx": { + "title": "Sponsor subscription", + "not_yet": "You have no sponsor subscription.", + "not_yet_NAME": "%(NAME)s has no sponsor subscription.", + "create_it": "Create it", + "to_be_able_to_create_paid_posts": " to publish posts, which can be read only by users who will regularly sponsor you.", + "tip_cost": "Pay TIP-balance tokens", + "cost": "Amount of monthly payment (TIP-balance):", + "no_tip_for": "Unavailable for ", + "cannot_edit_tip_cost": "Cannot edit tip cost.", + "fill_cost": "Please fill the amount.", + "are_you_sure": "Are you sure you want to remove subscription?", + "are_you_sure_COUNT": "You have %(COUNT)s sponsor(-s). All of them will be automatically unsubscribed. Are you sure?", + "your_sponsors": "Sponsors ", + "sponsored_authors": "Sponsored authors", + "created": "Created" + }, "transfer_jsx": { "amount_is_in_form": "Amount is in the form 99999.999", "insufficient_funds": "Insufficient funds", @@ -854,7 +910,8 @@ "balance": "Balance", "private_key_in_memo": "Do not write your private keys in this field!", "verified_exchange_no_memo": "You must include a memo for your exchange transfer, according to exchanger's rules.", - "verified_exchange_liquid_only": "You may exchange tokens from GOLOS balance only." + "verified_exchange_liquid_only": "You may exchange tokens from GOLOS balance only.", + "gift_nft": "Gift NFT" }, "user_saga_js": { "image_upload": { @@ -900,9 +957,7 @@ "payout_option_0_hint": "Without payout from the publication pool", "visible_option_all": "Everyone", "visible_option_onlyblog": "Followers only", - "visible_option_onlyapp": "Application only", - "visible_option_onlyapp_hint": "Golos Blogs desktop application only", - "onlyapp_cannot_be_removed": "You are yet published post. Cannot make it available on web UI", + "visible_option_onlysponsors": "Sponsors only", "tags_input_placeholder": "Add tags", "convert_to_md_warning": "Converting to Markdown may cause some changes and markup loses. Are you sure?", "convert_to_html_warning": "Converting to HTML may cause some changes and markup loses. Are you sure?", diff --git a/app/locales/ru-RU.json b/app/locales/ru-RU.json index d0fa3383b..daa9e4549 100644 --- a/app/locales/ru-RU.json +++ b/app/locales/ru-RU.json @@ -139,6 +139,7 @@ "back": "Назад", "more_list": "Ещё", "back_to_top": "Наверх", + "balance": "баланс", "balances": "Балансы", "bid": "Покупка", "blog": "Блог", @@ -148,6 +149,7 @@ "buy_VESTING_TOKEN": "Купить %(VESTING_TOKEN2)s", "buy_or_sell": "Купить или Продать", "cancel": "Отмена", + "cancel2": "Отменить", "cancel_all": "Отменить все", "change_password": "Сменить пароль", "clear": "Очистить", @@ -160,6 +162,7 @@ "continue": "продолжить", "convert": "Конвертировать", "convert_assets": "Обменять", + "create": "Создать", "created": "Сначала новые", "old": "Сначала старые", "date": "Дата", @@ -178,6 +181,7 @@ "follow": "Подписаться", "for": " для ", "from": " от ", + "gift": "Подарить", "gp": "СГ", "here": "здесь", "hide": "Скрыть", @@ -210,6 +214,7 @@ "nothing_yet": "Пока ничего нет", "ok": "OK", "older": "Старее", + "on_by": "на", "or": "или", "order_placed": "Заказ размещен", "owner": "Ключ владельца", @@ -219,6 +224,7 @@ "invites": "Инвайт-чеки", "assets": "Активы UIA", "help_wallet": "Функции кошелька", + "per_month": "в месяц", "phone": "телефон", "post": "Пост", "posting": "Постинг ключ", @@ -229,6 +235,7 @@ "promoted_title": "продвижение", "promoted_post": "Этот пост был продвинут за ", "for_followers": "для подписчиков", + "for_sponsors": "для спонсоров", "only_app": "в приложении", "preview": "Предварительный просмотр", "previous": "Предыдущий", @@ -629,7 +636,16 @@ "sign_up": "зарегистрируйтесь", "onlyapp": "Этот пост доступен только в десктопном приложении Golos.", "install": "Установить приложение", - "login_to_see_comment": "Авторизуйтесь, чтобы видеть комментарий." + "login_to_see_comment": "Авторизуйтесь, чтобы видеть комментарий.", + "for_sponsors": "Этот пост доступен только спонсорам ", + "for_sponsors2": "Цена - ", + "for_sponsors3": " (TIP-баланс)", + "for_sponsors4": " в месяц.", + "for_sponsors5": "Первый платеж спишется сейчас, а потом - автоматически раз в месяц.", + "become_sponsor": "Стать спонсором", + "sponsorship_expired": "Ваше спонсорство истекло. Продлите его, чтобы читать посты ", + "prolong_sponsorship": "Продлить", + "login_to_become_sponsor": "Войдите, чтобы стать спонсором." }, "postsummary_jsx": { "resteemed": "Репост", @@ -641,7 +657,11 @@ "display_preferences": "настройки отображения", "create_an_account": "зарегистрироваться", "to_save_your_preferences": "сохранить ваши настройки", - "mute_in_new": "Скрывать в Новом" + "mute_in_new": "Скрывать в Новом", + "for_sponsors": "Пост доступен только спонсорам автора.", + "wrong_format": "Неизвестный формат поста, не поддерживается Блогами.", + "no_decrypt_key": "Не удается расшифровать пост из-за ошибки.", + "no_sub": "Недоступно. Автор удалил спонсорскую подписку." }, "promote_post_jsx": { "promote_post": "Продвинуть пост", @@ -737,6 +757,36 @@ "profile_location": "Местоположение", "profile_website": "Веб-сайт" }, + "sponsors_jsx": { + "title": "Спонсорская подписка", + "not_yet": "У вас пока нет подписки для спонсоров.", + "not_yet_NAME": "У %(NAME)s пока нет подписки для спонсоров.", + "create_it": "Создайте ее", + "to_be_able_to_create_paid_posts": ", чтобы публиковать посты, доступные только тем, кто будет вас регулярно спонсировать.", + "tip_cost": "Платежи токенами TIP-баланса", + "cost": "Сумма ежемесячного платежа (TIP-баланс):", + "no_tip_for": "Недоступно для ", + "cannot_edit_tip_cost": "Эту опцию нельзя менять у уже созданной подписки.", + "fill_cost": "Укажите сумму.", + "are_you_sure": "Вы уверены, что хотите удалить подписку?", + "are_you_sure_COUNT": "У вас есть %(COUNT)s спонсор(-ов). Все они будут автоматически отписаны от вас. Вы уверены?", + "your_sponsors": "Спонсоры ", + "sponsored_authors": "Спонсируемые авторы", + "created": "Создано" + }, + "sponsorslist_jsx": { + "payment": "Платеж", + "payment_hint": "Следующий платеж, спишется автоматически", + "no_sponsors": "Вас никто не спонсирует.", + "no_sponsors2": " никто не спонсирует.", + "no_sponsoreds": "Вы никого не спонсируете.", + "no_sponsoreds2": " никого не спонсирует.", + "expired": "Истекло", + "expired_hint": "На очередной платеж не хватило средств, поэтому спонсорство отменено. Пополните ваш ", + "expired_hint2": "Затем нажмите кнопку Продлить. Платеж за первый месяц будет списан сейчас, далее - автоматически каждый месяц.", + "expired_update": "Приостановлено - автор изменил цену", + "cancel_confirm": "Вы уверены, что хотите отменить спонсорство? Уже оплаченные средства возвращены не будут." + }, "submit_a_story": { "title": "Заголовок", "editor": "Редактор", @@ -795,7 +845,8 @@ "can_issue": "Можно выпустить", "private_key_in_memo": "Не пишите в этом поле приватные ключи!", "verified_exchange_no_memo": "Для перевода токенов на этот аккаунт нужно указать заметку/memo.", - "verified_exchange_liquid_only": "Перевод токенов на этот аккаунт с TIP-баланса невозможен, используйте основной баланс." + "verified_exchange_liquid_only": "Перевод токенов на этот аккаунт с TIP-баланса невозможен, используйте основной баланс.", + "gift_nft": "Подарить NFT" }, "user_profile": { "unknown_account": "Неизвестный аккаунт", @@ -834,6 +885,11 @@ "one": "1 пост", "other": "%(count)s постов" }, + "sponsor_count": { + "zero": "0 спонсоров", + "one": "1 спонсор", + "other": "%(count)s спонсоров" + }, "account_frozen": "Аккаунт временно деактивирован." }, "invites_jsx": { @@ -966,9 +1022,7 @@ "payout_option_0_hint": "Без вознаграждений из общего пула", "visible_option_all": "Всем", "visible_option_onlyblog": "Только подписчикам", - "visible_option_onlyapp": "Только в приложении", - "visible_option_onlyapp_hint": "Видно только в десктоп-приложении", - "onlyapp_cannot_be_removed": "Вы уже опубликовали пост. Нельзя сделать его доступным на сайте", + "visible_option_onlysponsors": "Только спонсорам", "tags_input_placeholder": "Добавьте теги", "convert_to_md_warning": "Будет произведена попытка перевода текста в Markdown, при это какие-то элементы могут пропасть. Вы точно уверены?", "convert_to_html_warning": "Будет произведен перевод текста в HTML, при это какие-то элементы могут пропасть. Вы точно уверены?", diff --git a/app/redux/AuthSaga.js b/app/redux/AuthSaga.js index 3353a6c33..266abcd33 100644 --- a/app/redux/AuthSaga.js +++ b/app/redux/AuthSaga.js @@ -93,10 +93,11 @@ function pubkeyThreshold({pubkeys, authority}) { return available } -export function* findSigningKey({opType, username, password}) { +export function* findSigningKey({opType, op, username, password}) { let authTypes const opInfo = broadcast._operations[opType] - if (opInfo && opInfo.roles[0] === 'posting') { + if (opInfo && opInfo.roles[0] === 'posting' && + (opType !== 'paid_subscription_transfer' || op.from_tip)) { authTypes = 'posting, active' } else { authTypes = 'active, owner' diff --git a/app/redux/FetchDataSaga.js b/app/redux/FetchDataSaga.js index 5b51a4aaa..8ebe6e871 100644 --- a/app/redux/FetchDataSaga.js +++ b/app/redux/FetchDataSaga.js @@ -1,6 +1,7 @@ import { call, put, select, fork, cancelled, takeLatest, takeEvery } from 'redux-saga/effects'; import cookie from "react-cookie"; import {config, api} from 'golos-lib-js'; +import { Asset } from 'golos-lib-js/lib/utils' import { getPinnedPosts, getMutedInNew } from 'app/utils/NormalizeProfile'; import {loadFollows, fetchFollowCount} from 'app/redux/FollowSaga'; @@ -11,11 +12,13 @@ import GlobalReducer from './GlobalReducer'; import constants from './constants'; import session from 'app/utils/session' import { getFilterApps, } from 'app/utils/ContentAccess'; -import { reveseTag, getFilterTags } from 'app/utils/tags'; +import { reveseTag, getFilterTags, isNsfwMeta, nsfwTags } from 'app/utils/tags'; import { PUBLIC_API, CATEGORIES, SELECT_TAGS_KEY, DEBT_TOKEN_SHORT, LIQUID_TICKER } from 'app/client_config'; +import { parseNFTImage, NFTImageStub } from 'app/utils/NFTUtils' import { getSubs, notifyGetViews, } from 'app/utils/NotifyApiClient' import { SearchRequest, searchData, stateSetVersion } from 'app/utils/SearchClient' import { hashPermlink, } from 'app/utils/StateFunctions' +import { makeOid, tryDecryptContents, SPONSORS_PER_PAGE } from 'app/utils/sponsors' export function* fetchDataWatches () { yield fork(watchLocationChange); @@ -26,6 +29,7 @@ export function* fetchDataWatches () { yield fork(watchFetchExchangeRates); yield fork(watchFetchVestingDelegations); yield fork(watchFetchUiaBalances); + yield fork(watchFetchNftTokens) } export function* watchGetContent() { @@ -80,10 +84,15 @@ export function* fetchState(location_change_action) { const state = {} state.current_route = location state.content = {} + state.decrypting = false state.prev_posts = [] - state.assets = {} + state.assets = {} // account balances + state.tokens = [] + state.sponsors = { data: [] } + state.sponsoreds = { data: [] } state.minused_accounts = {} state.accounts = {} + state.confetti_nft_active = false const authorsForCheck = new Set() // if not blocked by current user const checkAuthor = (author) => authorsForCheck.add(author) @@ -153,7 +162,10 @@ export function* fetchState(location_change_action) { } } if (ids.length) { - const previews = yield call([api, api.getContentPreviewsAsync], ids, 500) + const previews = yield call([api, api.getContentPreviewsAsync], ids, 500, 'false') + + yield tryDecryptContents(previews) + for (const i in previews) { const { author, permlink } = previews[i] checkAuthor(author) @@ -195,7 +207,10 @@ export function* fetchState(location_change_action) { ids.push({ author, hashlink }) } - const previews = yield call([api, api.getContentPreviewsAsync], ids, 10000) + const previews = yield call([api, api.getContentPreviewsAsync], ids, 10000, 'false') + + yield tryDecryptContents(previews) + for (const i in previews) { const { author, permlink } = previews[i] const link = `${author}/${permlink}` @@ -238,6 +253,36 @@ export function* fetchState(location_change_action) { yield fork(listBlockings, uname) break + case 'sponsors': + const oid = makeOid() + state.pso = yield call([api, api.getPaidSubscriptionOptionsAsync], { + author: uname, + oid + }) + if (!state.pso.author) { + state.pso.oid = oid + } + const tokens = yield call([api, api.getAssetsAsync], '', [], '', 5000, 'by_marketed') + state.tokens = tokens.filter(t => !t.allow_override_transfer) + state.sponsors = { + data: yield call([api, api.getPaidSubscribersAsync], { + author: uname, + oid, + sort: 'by_date', + from: '', limit: SPONSORS_PER_PAGE + 1 + }) + } + state.sponsoreds = { + data: yield call([api, api.getPaidSubscriptionsAsync], { + subscriber: uname, + select_oid: oid, + start_author: '', + sort: 'by_date', + limit: SPONSORS_PER_PAGE + 1 + }) + } + break + case 'blog': default: const blogEntries = yield call([api, api.getBlogEntriesAsync], uname, 0, 20, ['fm-'], {}) @@ -259,7 +304,10 @@ export function* fetchState(location_change_action) { ids.push({ author, hashlink }) } - const previews = yield call([api, api.getContentPreviewsAsync], ids, 10000) + const previews = yield call([api, api.getContentPreviewsAsync], ids, 10000, 'false') + + yield tryDecryptContents(previews) + for (const i in previews) { const { author, permlink } = previews[i] @@ -296,6 +344,8 @@ export function* fetchState(location_change_action) { state.content[curl].views = 0 } + yield tryDecryptContents([state.content[curl]]) + state.content[curl].donate_list = []; if (state.content[curl].donates != '0.000 GOLOS') { const donates = yield call([api, api.getDonatesAsync], false, {author: account, permlink: permlink}, '', '', 20, 0, true) @@ -307,6 +357,17 @@ export function* fetchState(location_change_action) { } state.content[curl].confetti_active = false + if (curUser) { + const ps = yield call([api, api.getPaidSubscribeAsync], { + author: account, + oid: makeOid(), + subscriber: curUser + }) + if (ps.subscription.author && !ps.subscribe.subscriber) { + state.pso = ps.subscription + } + } + yield put(GlobalReducer.actions.receiveState(state)) const replies = yield call([api, api.getAllContentRepliesAsync], account, permlink, constants.DEFAULT_VOTE_LIMIT, 0, [], [], false, null, prefs([], [account, curUser])) @@ -337,9 +398,10 @@ export function* fetchState(location_change_action) { yield applyEventHighlight(state.content, account, permlink, curUser) + const ppFilterTags = isNsfwMeta(state.content[curl].json_metadata) ? [] : nsfwTags() const filter_apps = getFilterApps() let args = { truncate_body: 128, select_categories: [category], filter_tag_masks: ['fm-'], - filter_tags: getFilterTags(), + filter_tags: [...getFilterTags(), ...ppFilterTags], prefs: { ...prefs(curUser), filter_apps } }; let prev_posts = yield call([api, api[PUBLIC_API.created]], {limit: 4, start_author: account, start_permlink: permlink, select_authors: [account], ...args}); prev_posts = prev_posts.slice(1); @@ -448,7 +510,7 @@ export function* fetchData(action) { start_author: author, start_permlink: permlink, filter_tag_masks: ['fm-'], - prefs: { ...prefs(curUser), filter_apps } + prefs: { ...prefs(curUser), filter_apps, filter_special: true } } ]; if (category.length && (!category.startsWith('tag-') || category.length > 4)) { @@ -567,8 +629,6 @@ export function* fetchData(action) { yield put({ type: 'FETCH_DATA_BEGIN' }); try { - let posts = [] - let data = [] if (!from) { @@ -582,7 +642,7 @@ export function* fetchData(action) { // Add top 3 from promo to tranding and 1 to hot, created args[0].limit = order == 'trending' ? 3 : 1 const promo_posts = yield call([api, api[PUBLIC_API.promoted]], ...args); - posts = posts.concat(promo_posts) + data = promo_posts.concat(data) } } @@ -630,13 +690,11 @@ export function* fetchData(action) { } } - data.forEach(post => { - posts.push(post) - }) + yield tryDecryptContents(data) yield put( GlobalReducer.actions.receiveData({ - data: posts, + data, order, category, author, @@ -789,3 +847,53 @@ export function* fetchUiaBalances({ payload: { account } }) { console.error('fetchUiaBalances', err) } } + +export function* watchFetchNftTokens() { + yield takeLatest('global/FETCH_NFT_TOKENS', fetchNftTokens) +} + +export function* fetchNftTokens({ payload: { account, start_token_id } }) { + try { + const limit = 10 + + const nft_tokens = yield call([api, api.getNftTokensAsync], { + owner: account, + state: 'not_selling_only', + start_token_id, + limit: limit + 1 + }) + + let next_from + if (nft_tokens.length > limit) { + next_from = nft_tokens.pop().token_id + } + + const syms = new Set() + + let nft_assets + + try { + for (const no of nft_tokens) { + no.image = parseNFTImage(no.json_metadata) || NFTImageStub() + + const price = Asset(no.last_buy_price) + syms.add(price.symbol) + } + + nft_assets = {} + if (syms.size) { + const assets = yield call([api, api.getAssets], '', [...syms]) + for (const a of assets) { + const supply = Asset(a.supply) + nft_assets[supply.symbol] = a + } + } + } catch (err) { + console.error(err) + } + + yield put(GlobalReducer.actions.receiveNftTokens({nft_tokens, start_token_id, next_from, nft_assets})) + } catch (err) { + console.error('fetchNftTokens', err) + } +} diff --git a/app/redux/GlobalReducer.js b/app/redux/GlobalReducer.js index 59c7b9b1c..6317daa96 100644 --- a/app/redux/GlobalReducer.js +++ b/app/redux/GlobalReducer.js @@ -6,6 +6,18 @@ import { contentStats, fromJSGreedy } from 'app/utils/StateFunctions'; const emptyContentMap = Map(emptyContent); +const upsertNftAssets = (state, nft_assets, start_token_id) => { + if (!start_token_id) { + state = state.set('nft_assets', fromJS(nft_assets)) + } else { + state = state.update('nft_assets', data => { + data = data.merge(nft_assets) + return data + }) + } + return state +} + export default createModule({ name: 'global', initialState: Map({ status: {} }), @@ -55,7 +67,14 @@ export default createModule({ ); } } - let res = state.mergeDeep(payload); + let res = state.setIn(['sponsors', 'data'], List()) + if (!payload.has('pso')) { + res = res.delete('pso') + } + res = res.setIn(['sponsoreds', 'data'], List()) + if (res.has('nft_tokens')) + res = res.delete('nft_tokens') + res = res.mergeDeep(payload); let con = res.get('content').withMutations(con => { con.forEach((cc, key) => { if (!payload.hasIn(['content', key, 'versions'])) { @@ -186,6 +205,36 @@ export default createModule({ return state.set('assets', fromJS(assets)) }, }, + { + action: 'FETCH_NFT_TOKENS', + reducer: state => state, + }, + { + action: 'RECEIVE_NFT_TOKENS', + reducer: (state, { payload: { nft_tokens, start_token_id, next_from, nft_assets } }) => { + let new_state = state + if (!new_state.has('nft_tokens')) { + new_state = new_state.set('nft_tokens', fromJS({ + data: nft_tokens, + next_from: next_from + })) + } else { + new_state = new_state.update('nft_tokens', tokens => { + tokens = tokens.update('data', data => { + for (const token of nft_tokens) { + data = data.push(fromJS(token)) + } + return data + }) + tokens = tokens.set('next_from', next_from) + return tokens + }) + } + if (nft_assets) + new_state = upsertNftAssets(new_state, nft_assets, start_token_id) + return new_state + }, + }, { action: 'LINK_REPLY', reducer: (state, { payload: op }) => { @@ -551,5 +600,13 @@ export default createModule({ action: 'SHOW_VERSION', reducer: state => state, // saga }, + { + action: 'FETCH_SPONSORS', + reducer: state => state, // saga + }, + { + action: 'FETCH_SPONSOREDS', + reducer: state => state, // saga + }, ], }); diff --git a/app/redux/RootSaga.js b/app/redux/RootSaga.js index b75f61332..fefa998e2 100644 --- a/app/redux/RootSaga.js +++ b/app/redux/RootSaga.js @@ -4,6 +4,7 @@ import { sharedWatches } from 'app/redux/SagaShared'; import { userWatches } from 'app/redux/UserSaga'; import { authWatches } from 'app/redux/AuthSaga'; import { pushNotificationWatches } from 'app/redux/services/PushNotificationSaga' +import { sponsorWatches } from 'app/redux/SponsorsSaga' import { transactionWatches } from 'app/redux/TransactionSaga'; import { versionsWatches } from 'app/redux/VersionsSaga' import PollDataSaga from 'app/redux/PollDataSaga'; @@ -16,6 +17,7 @@ export default function* rootSaga() { yield fork(sharedWatches) yield fork(authWatches) yield fork(pushNotificationWatches) + yield fork(sponsorWatches) yield fork(transactionWatches) yield fork(versionsWatches) } diff --git a/app/redux/SagaShared.js b/app/redux/SagaShared.js index 18d9be38b..b57f33f93 100644 --- a/app/redux/SagaShared.js +++ b/app/redux/SagaShared.js @@ -5,6 +5,7 @@ import { api } from 'golos-lib-js' import constants from './constants' import g from 'app/redux/GlobalReducer' import { isHighlight, getEvents } from 'app/utils/NotifyApiClient' +import { tryDecryptContents, } from 'app/utils/sponsors' export function* sharedWatches() { yield fork(watchTransactionErrors) @@ -40,6 +41,7 @@ function* showTransactionErrorNotification() { export function* getContent({author, permlink, resolve, reject}) { const content = yield call([api, api.getContentAsync], author, permlink, constants.DEFAULT_VOTE_LIMIT); + yield tryDecryptContents([content]) yield put(g.actions.receiveContent({content})) if (resolve && content) { resolve(content); diff --git a/app/redux/SponsorsSaga.js b/app/redux/SponsorsSaga.js new file mode 100644 index 000000000..907b4ea43 --- /dev/null +++ b/app/redux/SponsorsSaga.js @@ -0,0 +1,72 @@ +import { fromJS, Map, List } from 'immutable' +import { api } from 'golos-lib-js' + +import { fork, call, put, takeLatest } from 'redux-saga/effects' +import { makeOid, SPONSORS_PER_PAGE } from 'app/utils/sponsors' + +export function* sponsorWatches() { + yield takeLatest('global/FETCH_SPONSORS', fetchSponsors) + yield takeLatest('global/FETCH_SPONSOREDS', fetchSponsoreds) +} + +export function* fetchSponsors({ payload: { author, from }}) { + yield put({ + type: 'global/UPDATE', + payload: { + key: ['sponsors'], + notSet: Map(), + updater: m => m.set('loading', true) + } + }) + + let sponsors = yield call([api, api.getPaidSubscribersAsync], { + author, + oid: makeOid(), + from, limit: SPONSORS_PER_PAGE + 1 + }) + + yield put({ + type: 'global/UPDATE', + payload: { + key: ['sponsors'], + notSet: Map(), + updater: m => { + m = m.set('loading', false) + m = m.set('data', fromJS(sponsors)) + return m + } + } + }) +} + +export function* fetchSponsoreds({ payload: { sponsor, from }}) { + yield put({ + type: 'global/UPDATE', + payload: { + key: ['sponsoreds'], + notSet: Map(), + updater: m => m.set('loading', true) + } + }) + + let sponsoreds = yield call([api, api.getPaidSubscriptionsAsync], { + subscriber: sponsor, + select_oid: makeOid(), + start_author: from, + start_oid: from ? makeOid() : undefined, + limit: SPONSORS_PER_PAGE + 1 + }) + + yield put({ + type: 'global/UPDATE', + payload: { + key: ['sponsoreds'], + notSet: Map(), + updater: m => { + m = m.set('loading', false) + m = m.set('data', fromJS(sponsoreds)) + return m + } + } + }) +} diff --git a/app/redux/TransactionSaga.js b/app/redux/TransactionSaga.js index 0822a0c5b..ebd3103de 100644 --- a/app/redux/TransactionSaga.js +++ b/app/redux/TransactionSaga.js @@ -50,6 +50,8 @@ const hook = { accepted_withdraw_vesting, accepted_donate, accepted_worker_request_vote, + accepted_paid_subscription_transfer, + accepted_nft_transfer, } function* encryptMemoIfNeed(memoStr, to) { @@ -199,7 +201,7 @@ function* broadcastOperation( if (!keys || keys.length === 0) { payload.keys = [] // user may already be logged in, or just enterend a signing passowrd or wif - const signingKey = yield call(findSigningKey, {opType: type, username, password}) + const signingKey = yield call(findSigningKey, {opType: type, op, username, password}) if (signingKey) payload.keys.push(signingKey) else { @@ -207,6 +209,7 @@ function* broadcastOperation( const opInfo = broadcast._operations[type] let authType = opInfo && opInfo.roles[0] if (authType === 'posting') authType = '' + if (type === 'paid_subscription_transfer' && !op.from_tip) authType = 'active' yield put(user.actions.showLogin({ operation: {type, operation: op, trx, username, successCallback, errorCallback, saveLogin: true}, loginDefault: { username, authType } @@ -344,6 +347,58 @@ function* accepted_worker_request_vote({operation}) { yield call(getWorkerRequest, {author, permlink, voter}) } +function* accepted_paid_subscription_transfer({operation}) { + const { from, to, __prolong } = operation + if (!__prolong) return + + console.log('Paid subscription prolongation accepted:', from, to); + + const state = yield select(state => state.global) + const interval = state.getIn(['pso', 'interval']) + + const updater = data => { + const idx = data.findIndex(i => i.get('subscriber') === from) + if (idx !== -1) { + data = data.update(idx, psro => { + psro = psro.set('active', true) + const np = new Date() + np.setSeconds(np.getSeconds() + interval) + psro = psro.set('next_payment', np.toISOString()) + return psro + }) + } + return data + } + + yield put(g.actions.update({ + key: ['sponsors', 'data'], + notSet: List(), + updater, + })) + + yield put(g.actions.update({ + key: ['sponsoreds', 'data'], + notSet: List(), + updater, + })) +} + +function* accepted_nft_transfer({operation}) { + yield put(g.actions.update({ + key: ['confetti_nft_active'], + updater: data => { + return true + }, + })) + yield new Promise(resolve => setTimeout(resolve, 250)) + yield put(g.actions.update({ + key: ['confetti_nft_active'], + updater: data => { + return false + }, + })) +} + function* accepted_withdraw_vesting({operation}) { let [account] = yield call([api, api.getAccountsAsync], [operation.account]) account = fromJS(account) diff --git a/app/redux/Transaction_Error.js b/app/redux/Transaction_Error.js index 8b32730b2..79f7e4052 100644 --- a/app/redux/Transaction_Error.js +++ b/app/redux/Transaction_Error.js @@ -142,6 +142,8 @@ export default function transactionErrorReducer( errorKey = errorStr = tt('chain_errors.only_vote_once_every'); } else if (errorKey.includes('Missing Active Authority')) { errorKey = errorStr = tt('chain_errors.missing_active_authority'); + } else if (errorKey.includes('')) { + errorKey = errorStr = tt('g.invalid_amount'); } else if ( errorKey.includes( 'Voting weight is too small, please accumulate more voting power or Golos Power' diff --git a/app/redux/User.js b/app/redux/User.js index 24bf2fa97..49c4c5c59 100644 --- a/app/redux/User.js +++ b/app/redux/User.js @@ -8,6 +8,7 @@ const defaultState = fromJS({ show_login_modal: false, show_transfer_modal: false, show_donate_modal: false, + show_nft_gift_modal: false, show_convert_assets_modal: false, show_promote_post_modal: false, show_signup_modal: false, @@ -71,6 +72,9 @@ export default createModule({ { action: 'SHOW_DONATE', reducer: state => state.set('show_donate_modal', true) }, { action: 'HIDE_DONATE', reducer: state => state.set('show_donate_modal', false) }, { action: 'SET_DONATE_DEFAULTS', reducer: (state, {payload}) => state.set('donate_defaults', fromJS(payload)) }, + { action: 'SHOW_GIFT_NFT', reducer: state => state.set('show_gift_nft_modal', true) }, + { action: 'HIDE_GIFT_NFT', reducer: state => state.set('show_gift_nft_modal', false) }, + { action: 'SET_GIFT_NFT_DEFAULTS', reducer: (state, {payload}) => state.set('gift_nft_defaults', fromJS(payload)) }, { action: 'SHOW_CONVERT_ASSETS', reducer: state => state.set('show_convert_assets_modal', true) }, { action: 'HIDE_CONVERT_ASSETS', reducer: state => state.set('show_convert_assets_modal', false) }, { action: 'SET_CONVERT_ASSETS_DEFAULTS', reducer: (state, {payload}) => state.set('convert_assets_defaults', fromJS(payload)) }, diff --git a/app/redux/UserSaga.js b/app/redux/UserSaga.js index d81b4e401..303b7051f 100644 --- a/app/redux/UserSaga.js +++ b/app/redux/UserSaga.js @@ -8,6 +8,7 @@ import {authApiLogin, authApiLogout, authSession} from 'app/utils/AuthApiClient' import {notifyApiLogin, notifyApiLogout, notifySession, notificationUnsubscribe} from 'app/utils/NotifyApiClient'; import {serverApiLogin, serverApiLogout} from 'app/utils/ServerApiClient'; import {serverApiRecordEvent} from 'app/utils/ServerApiClient'; +import { fetchState } from 'app/redux/FetchDataSaga' import {loadFollows} from 'app/redux/FollowSaga' import { signData } from 'golos-lib-js/lib/auth' import {PrivateKey, Signature, hash} from 'golos-lib-js/lib/auth/ecc' @@ -83,6 +84,24 @@ function* getAccountWatch() { yield takeEvery('user/GET_ACCOUNT', getAccountHandler); } +function* refetchStateIfNeed() { + if (process.env.BROWSER) { + try { + const pathname = window.location.pathname + const parts = pathname.split('/') + // blog or post + if ((parts.length == 3 && !parts[0] && parts[1].startsWith('@') && parts[2] === 'feed') + || (parts.length == 3 && !parts[0] && parts[1].startsWith('@') && parts[2] === 'discussions') + || (parts.length == 2 && !parts[0] && parts[1].startsWith('@')) + || (parts.length == 4 && parts[2].startsWith('@'))) { + yield call(fetchState, { payload: {pathname}}) + } + } catch (err) { + console.error('Refetch error', err) + } + } +} + /** @arg {object} action.username - Unless a WIF is provided, this is hashed with the password and key_type to create private keys. @arg {object} action.password - Password or WIF private key. A WIF becomes the posting key, a password can create all three @@ -91,6 +110,12 @@ function* getAccountWatch() { function* usernamePasswordLogin(action) { // Sets 'loading' while the login is taking place. The key generation can take a while on slow computers. yield call(usernamePasswordLogin2, action) + + const { payload: { refetchState } } = action + if (refetchState) { + yield refetchStateIfNeed() + } + const current = yield select(state => state.user.get('current')) if (current) { const username = current.get('username') @@ -353,7 +378,9 @@ function* changeAccount(action) { } catch (err) {} } const { payload: { username, password } } = action - yield put(user.actions.usernamePasswordLogin({username, password, saveLogin: true })) + yield put(user.actions.usernamePasswordLogin({ + username, password, saveLogin: true, refetchState: true + })) } function* saveLogin_localStorage() { @@ -415,20 +442,25 @@ function* saveLogin_localStorage() { function* logout() { yield put(user.actions.saveLoginConfirm(false)) // Just incase it is still showing if (process.env.BROWSER) { + localStorage.removeItem('guid') + authApiLogout() + notifyApiLogout() + serverApiLogout() const curName = session.load().currentName if (curName) { const newCurrent = {} session.logout(curName, newCurrent).save() if (newCurrent.name) { const password = newCurrent.data.posting - yield put(user.actions.usernamePasswordLogin({ username: newCurrent.name, password, saveLogin: true })) + yield put(user.actions.usernamePasswordLogin({ + username: newCurrent.name, password, + saveLogin: true, refetchState: true + })) return } + } else { + yield refetchStateIfNeed() } - localStorage.removeItem('guid') - authApiLogout(); - notifyApiLogout(); - serverApiLogout(); } } diff --git a/app/redux/VersionsSaga.js b/app/redux/VersionsSaga.js index 105046ddd..e965e02d8 100644 --- a/app/redux/VersionsSaga.js +++ b/app/redux/VersionsSaga.js @@ -3,6 +3,7 @@ import { Map } from 'immutable' import { api } from 'golos-lib-js' import { listVersions, getVersion } from 'app/utils/SearchClient' +import { tryDecryptContents, } from 'app/utils/sponsors' import { fromJSGreedy } from 'app/utils/StateFunctions' export function* versionsWatches() { @@ -82,6 +83,7 @@ export function* showVersion(action) { } else { try { const post = yield api.getContentAsync(author, permlink, 0) + yield tryDecryptContents([post]) body = post.body lastUpdate = post.last_update } catch (err) { diff --git a/app/utils/APIWrapper.js b/app/utils/APIWrapper.js index 2e36008ea..28fb68a39 100644 --- a/app/utils/APIWrapper.js +++ b/app/utils/APIWrapper.js @@ -29,8 +29,8 @@ export function getAccountsBalances(names) { return api.getAccountsBalancesAsync(names) } -export function getAssets(creator='', names=[], from='', limit=5000) { - return api.getAssetsAsync(creator, names, from, limit) +export function getAssets(creator='', names=[], from='', limit=5000, sort='by_symbol_name', query={}) { + return api.getAssetsAsync(creator, names, from, limit, sort, query) } export function getAccountHistory(account, from, limit, filter_ops, select_ops = undefined) { @@ -114,3 +114,19 @@ export function getWorkerRequestVotes(author, permlink, voter, limit) { export function getFollowing(follower, startFollowing, followType, limit) { return api.getFollowingAsync(follower, startFollowing, followType, limit) } + +export function getPaidSubscriptionOptions(query) { + return api.getPaidSubscriptionOptionsAsync(query) +} + +export function getPaidSubscribers(query) { + return api.getPaidSubscribersAsync(query) +} + +export function getPaidSubscribe(query) { + return api.getPaidSubscribeAsync(query) +} + +export function getPaidSubscriptions(query) { + return api.getPaidSubscriptionsAsync(query) +} diff --git a/app/utils/AuthApiClient.js b/app/utils/AuthApiClient.js index d166b7c73..076730bc0 100644 --- a/app/utils/AuthApiClient.js +++ b/app/utils/AuthApiClient.js @@ -1,3 +1,5 @@ +import { fetchEx } from 'golos-lib-js/lib/utils' + const request_base = { method: 'post', credentials: 'include', @@ -72,3 +74,35 @@ export function authApiLogout() { }); } +export async function cryptostoreEncrypt() { + if (!authAvailable()) return {} + let request = Object.assign({}, request_base, { + body: JSON.stringify({}), + }) + setSession(request) + let r = await fetchEx(authUrl(`/api/cryptostore/encrypt`), request) + saveSession(r) + const obj = await r.json() + if (obj.status !== 'ok') { + console.error('cryptostoreEncrypt', obj) + throw new Error(obj.error) + } + return obj // .key, .generated +} + + +export async function cryptostoreDecrypt(entries, oid) { + if (!authAvailable()) return {} + let request = Object.assign({}, request_base, { + body: JSON.stringify({ entries, oid }), + }) + setSession(request) + let r = await fetchEx(authUrl(`/api/cryptostore/decrypt`), request) + saveSession(r) + const obj = await r.json() + if (obj.status !== 'ok') { + console.error('cryptostoreDecrypt', obj) + throw new Error(obj.error) + } + return obj +} diff --git a/app/utils/Links.js b/app/utils/Links.js index 9dd5e07fb..c9a5027b3 100644 --- a/app/utils/Links.js +++ b/app/utils/Links.js @@ -30,7 +30,7 @@ export default { image: image(), imageFile: imageFile(), youTube: youTube(), - youTubeId: /(?:(?:youtube.com\/watch\?v=)|(?:youtu.be\/)|(?:youtube.com\/embed\/))([A-Za-z0-9_-]+)/i, + youTubeId: /(?:(?:youtube.com\/watch\?v=)|(?:youtu.be\/)|(?:youtube.com\/shorts\/)|(?:youtube.com\/embed\/))([A-Za-z0-9_-]+)/i, vimeoId: /(?:vimeo.com\/|player.vimeo.com\/video\/)([0-9]+)/, coubId: /(?:(?:https?:)?\/\/)?coub\.com\/view\/([A-Za-z0-9]+)/, rutubeId: /(?:(?:https?:)?\/\/)?rutube\.ru\/video\/([A-Za-z0-9]+)\/?/, diff --git a/app/utils/NFTUtils.js b/app/utils/NFTUtils.js new file mode 100644 index 000000000..d5fb6bc24 --- /dev/null +++ b/app/utils/NFTUtils.js @@ -0,0 +1,12 @@ + +export function parseNFTImage(json_metadata) { + if (json_metadata) { + const meta = JSON.parse(json_metadata) + if (meta) return meta.image + } + return null +} + +export function NFTImageStub() { + return require('app/assets/images/nft.png') +} diff --git a/app/utils/StateBuilder.js b/app/utils/StateBuilder.js index 4fbbf74ea..22bdf45e8 100644 --- a/app/utils/StateBuilder.js +++ b/app/utils/StateBuilder.js @@ -2,8 +2,9 @@ import { PUBLIC_API, CATEGORIES } from 'app/client_config'; import { contentPrefs as prefs } from 'app/utils/Allowance' import { getFilterApps, } from 'app/utils/ContentAccess' import { getPinnedPosts, getMutedInNew } from 'app/utils/NormalizeProfile'; -import { reveseTag, prepareTrendingTags, getFilterTags } from 'app/utils/tags'; +import { reveseTag, prepareTrendingTags, getFilterTags, isNsfwMeta, nsfwTags } from 'app/utils/tags' import { stateSetVersion } from 'app/utils/SearchClient' +import { makeOid, markEncryptedContent, SPONSORS_PER_PAGE } from 'app/utils/sponsors' const DEFAULT_VOTE_LIMIT = 10000 @@ -21,6 +22,8 @@ export default async function getState(api, url, offchain = {}) { // decode tag for cyrillic symbols const tag = typeof parts[1] !== 'undefined' ? decodeURIComponent(parts[1]) : '' + let has_encrypted = false + const state = {} state.current_route = `/${url}` state.props = await api.getDynamicGlobalProperties() @@ -28,9 +31,13 @@ export default async function getState(api, url, offchain = {}) { state.categories = {} state.tags = {} state.content = {} + state.decrypting = false state.prev_posts = [] - state.assets = {} - state.minused_accounts = [] + state.assets = {} // account balances + state.tokens = [] + state.sponsors = { data: [] } + state.sponsoreds = { data: [] } + state.minused_accounts = {} state.accounts = {} state.discussion_idx = {} state.feed_price = await api.getCurrentMedianHistoryPrice() @@ -104,6 +111,8 @@ export default async function getState(api, url, offchain = {}) { state.content[link].reblogged_by = feedEntries[key].reblog_by state.content[link].first_reblogged_on = feedEntries[key].reblog_on } + + markEncryptedContent(state.content[link], state) } break @@ -131,6 +140,36 @@ export default async function getState(api, url, offchain = {}) { }); break + case 'sponsors': + const oid = makeOid() + state.pso = await api.getPaidSubscriptionOptions({ + author: uname, + oid + }) + if (!state.pso.author) { + state.pso.oid = oid + } + const tokens = await api.getAssets('', [], '', 5000, 'by_marketed') + state.tokens = tokens.filter(t => !t.allow_override_transfer) + state.sponsors = { + data: await api.getPaidSubscribers({ + author: uname, + oid, + sort: 'by_date', + from: '', limit: SPONSORS_PER_PAGE + 1 + }) + } + state.sponsoreds = { + data: await api.getPaidSubscriptions({ + subscriber: uname, + select_oid: oid, + start_author: '', + sort: 'by_date', + limit: SPONSORS_PER_PAGE + 1 + }) + } + break + case 'blog': default: const blogEntries = await api.getBlogEntries(uname, 0, 20, ['fm-'], {}) @@ -149,6 +188,8 @@ export default async function getState(api, url, offchain = {}) { if (blogEntries[key].reblog_on !== '1970-01-01T00:00:00') { state.content[link].first_reblogged_on = blogEntries[key].reblog_on } + + markEncryptedContent(state.content[link], state) } break } @@ -166,6 +207,8 @@ export default async function getState(api, url, offchain = {}) { } accounts.add(account) + markEncryptedContent(state.content[curl]) + const replies = await api.getAllContentReplies(account, permlink, DEFAULT_VOTE_LIMIT, prefs([], [account, curUser])) for (let key in replies) { @@ -200,10 +243,11 @@ export default async function getState(api, url, offchain = {}) { } state.content[curl].confetti_active = false; + const ppFilterTags = isNsfwMeta(state.content[curl].json_metadata) ? [] : nsfwTags() const filter_apps = getFilterApps() let args = { truncate_body: 1024, select_categories: [category], filter_tag_masks: ['fm-'], - filter_tags: getFilterTags(), - prefs: { ...prefs(curUser), filter_apps } }; + filter_tags: [...getFilterTags(), ...ppFilterTags], + prefs: { ...prefs(curUser), filter_apps, } }; let prev_posts = await api.gedDiscussionsBy('created', {limit: 4, start_author: account, start_permlink: permlink, select_authors: [account], ...args}); prev_posts = prev_posts.slice(1); let p_ids = []; @@ -232,6 +276,15 @@ export default async function getState(api, url, offchain = {}) { if (curUser) { state.assets = (await api.getAccountsBalances([curUser]))[0] + + const ps = await api.getPaidSubscribe({ + author: account, + oid: makeOid(), + subscriber: curUser + }) + if (ps.subscription.author && !ps.subscribe.subscriber) { + state.pso = ps.subscription + } } } else if (parts[0] === 'minused_accounts') { const mhistory = await api.getAccountHistory('null', -1, 1000, [], ['minus_reputation']); @@ -245,7 +298,7 @@ export default async function getState(api, url, offchain = {}) { } else if (Object.keys(PUBLIC_API).includes(parts[0])) { const filter_apps = getFilterApps() let args = { limit: 20, truncate_body: 0, - prefs: { ...prefs(curUser), filter_apps } } + prefs: { ...prefs(curUser), filter_apps, filter_special: true } } const discussionsType = parts[0] if (typeof tag === 'string' && tag.length && (!tag.startsWith('tag-') || tag.length > 4)) { if (tag.startsWith('tag-')) { @@ -341,6 +394,8 @@ export default async function getState(api, url, offchain = {}) { discussion_idxes[discussionsType].push(link) } state.content[link] = discussion + + markEncryptedContent(state.content[link], state) }) const discussions_key = typeof tag === 'string' && tag.length diff --git a/app/utils/market/utils.js b/app/utils/market/utils.js index 9660181aa..3304bbaf5 100644 --- a/app/utils/market/utils.js +++ b/app/utils/market/utils.js @@ -55,15 +55,26 @@ function normalizeAssets(assets) { } function getAssetMeta(asset) { + let sym + try { + sym = asset.supply && asset.supply.split(' ')[1] + } catch (err) { + console.warn(err) + } + let res = {} try { let obj = JSON.parse(asset.json_metadata) - if (typeof(obj) !== 'object' || !obj || Array.isArray(obj)) { - return {} + if (typeof(obj) === 'object' && obj && !Array.isArray(obj)) { + res = obj } - return obj } catch (err) { - return {} } + if (sym === 'GOLOS') { + res.image_url = '/images/golos.png' + } else if (sym === 'GBG') { + res.image_url = '/images/gold-golos.png' + } + return res } function getTradablesFor(assets, syms, onlyFirst = false) { diff --git a/app/utils/sponsors.js b/app/utils/sponsors.js new file mode 100644 index 000000000..5f05e806e --- /dev/null +++ b/app/utils/sponsors.js @@ -0,0 +1,125 @@ +import crypto from 'browserify-aes' +import { hash } from 'golos-lib-js/lib/auth/ecc' +import forIn from 'lodash/forIn' + +import { authSession, cryptostoreEncrypt, cryptostoreDecrypt } from 'app/utils/AuthApiClient' + +const ourOid = { + app: 'golos-blog', + name: 'blog', + version: 1 +} + +export const makeOid = () => { + return { ...ourOid } +} + +export async function encryptPost(commentOp) { + const { author, body } = commentOp + let data + try { + data = await cryptostoreEncrypt() + } catch (err) { + if (err.message && err.message.startsWith('not authorized')) { + console.log('Cannot authorize in cryptostore, waiting (maybe page not yet init...)') + await new Promise(resolve => setTimeout(resolve, 3000)) + + data = await cryptostoreEncrypt() + } + throw err + } + + const { key } = data + + const buff = new Buffer(body, 'utf-8') + const keySha = hash.sha512(key) + const cKey = keySha.slice(0, 32) + const iv = keySha.slice(32, 48) + const cipher = crypto.createCipheriv('aes-256-cbc', cKey, iv) + let encrypted = Buffer.concat([cipher.update(buff), cipher.final()]) + encrypted = encrypted.toString('base64') + + let newBody = {} + newBody.t = 'e' + newBody.c = encrypted + newBody = JSON.stringify(newBody) + return newBody +} + +export const EncryptedStates = { + loading: 1, + no_sponsor: 2, + inactive: 3, + no_sub: 4, + no_key: 5, + unknown: 6, + wrong_format: 7, + decrypted: 8, +} + +function isEncrypted(content) { + const { body } = content + return body.startsWith('{"t":"e"') +} + +export function markEncryptedContent(content, state = null) { + if (isEncrypted(content)) { + content.encrypted = EncryptedStates.loading + if (state) state.decrypting = true + } +} + +export async function tryDecryptContents(contents) { + const entries = [] + forIn(contents, (content, i) => { + if (isEncrypted(content)) { + let data + try { + data = JSON.parse(content.body) + } catch (err) { + console.error('tryDecryptContent - wrong JSON:', err) + content.encrypted = EncryptedStates.wrong_format + return + } + entries.push({ + author: content.author, body: data.c, _i: i + }) + } + }) + + try { + const result = await cryptostoreDecrypt(entries, makeOid()) + forIn(result.result, (res, i) => { + const content = contents[entries[i]._i] + + const { body, err, sub } = res + if (body) { + content.body = body + content.encrypted = EncryptedStates.decrypted + } else if (err === 'no_sponsor' || err === 'no_auth') { + content.encrypted = EncryptedStates.no_sponsor + } else if (err === 'no_sub') { + content.encrypted = EncryptedStates.no_sub + } else if (err === 'inactive') { + content.encrypted = EncryptedStates.inactive + } else if (err === 'no_key') { + content.encrypted = EncryptedStates.no_key + } else { + content.encrypted = EncryptedStates.unknown + } + content.encrypted_sub = sub + }) + } catch (err) { + console.error('tryDecryptContents', err) + try { + forIn(entries, (entry, i) => { + const content = contents[entry._i] + content.encrypted = EncryptedStates.unknown + }) + } catch (err) { + console.error('tryDecryptContents', err) + } + } +} + +export const SPONSORS_PER_PAGE = 20 diff --git a/app/utils/tags.js b/app/utils/tags.js index 27747f0d9..4cb1c479e 100644 --- a/app/utils/tags.js +++ b/app/utils/tags.js @@ -14,6 +14,27 @@ function filterRealTags(tags) { return tags.filter(tag => tag !== NSFW_TAG_NUMERIC && tag !== NSFW_TAG); } +export function isNsfwMeta(json) { + let jObj + let tags = [] + try { + jObj = json ? JSON.parse(json) : {} + tags = jObj.tags || []; + if(typeof tags == 'string') { + tags = [tags]; + } if(!Array.isArray(tags)) { + tags = []; + } + } catch(e) { + tags = [] + } + return tags.includes(NSFW_TAG) || tags.includes(NSFW_TAG_NUMERIC) +} + +export function nsfwTags() { + return [NSFW_TAG, NSFW_TAG_NUMERIC] +} + export function getFilterTags() { let ignore_tags = [...IGNORE_TAGS] if (!process.env.IS_APP) { diff --git a/config/default.json b/config/default.json index 3d0bc1949..cd6cab3be 100644 --- a/config/default.json +++ b/config/default.json @@ -58,6 +58,9 @@ "apidex_service": { "host": "https://api-dex.golos.app" }, + "golos_news": { + "account": "progolos" + }, "forums": { "white_list": ["fm-golostalk", "fm-prizmtalk", "fm-graphenetalks"], "fm-golostalk": {"domain": "golostalk.com"}, diff --git a/package.json b/package.json index 65e434c55..629c949f9 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "foundation-sites": "^6.4.3", "fs-extra": "^10.0.1", "git-rev-sync": "^3.0.2", - "golos-lib-js": "^0.9.51", + "golos-lib-js": "^0.9.56", "history": "^2.0.0-rc2", "immutable": "^3.8.2", "intl": "^1.2.5", @@ -79,7 +79,7 @@ "minimist": "^1.2.0", "multiselect-react-dropdown": "^1.6.7", "multistream": "^2.1.1", - "node-sass": "6.0.0", + "node-sass": "8.0.0", "numeral": "^2.0.6", "polished": "^1.9.2", "prop-types": "^15.6.1", diff --git a/server/index.js b/server/index.js index 8ad28a7e7..c325c4a3e 100755 --- a/server/index.js +++ b/server/index.js @@ -46,6 +46,9 @@ global.$STM_Config = { wallet_service: config.get('wallet_service'), messenger_service: config.get('messenger_service'), apidex_service: config.get('apidex_service'), + golos_news: config.has('golos_news') ? config.get('golos_news') : { + account: 'progolos' + }, forums: config.get('forums'), blocked_users, blocked_posts, diff --git a/yarn.lock b/yarn.lock index 4de315279..23a8776ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1250,6 +1250,11 @@ intl-messageformat "10.2.5" tslib "^2.4.0" +"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" @@ -1287,6 +1292,38 @@ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@popperjs/core@^2.6.0": version "2.9.2" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" @@ -1308,6 +1345,11 @@ "@shellscape/koa-send" "^4.1.0" debug "^2.6.8" +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -1343,6 +1385,16 @@ resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.8.tgz#b316887ab3499d0a8f4c70b7bd8508f92d477955" integrity sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw== +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/normalize-package-data@^2.4.0": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" + integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== + "@types/prop-types@*": version "15.7.4" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" @@ -1642,13 +1694,28 @@ acorn@^8.1.0, acorn@^8.8.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== -agent-base@6: +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" +agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -1695,16 +1762,6 @@ ajv@^6.10.2, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.5.5: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -1718,10 +1775,6 @@ alphanum-sort@^1.0.0: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -1740,21 +1793,28 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + any-promise@^1.0.0, any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -1782,10 +1842,23 @@ aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + arch@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -1879,14 +1952,15 @@ assert@^1.1.1, assert@^1.4.1: util "0.10.3" assert@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" - integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" assertion-error@^1.0.1: version "1.1.0" @@ -1908,6 +1982,7 @@ async-each@^1.0.1: async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA== async-limiter@~1.0.0: version "1.0.0" @@ -1964,11 +2039,6 @@ aws4@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" -aws4@^1.8.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" - integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== - axobject-query@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" @@ -2174,6 +2244,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.2.2, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -2381,6 +2458,54 @@ cacache@^12.0.2: unique-filename "^1.1.1" y18n "^4.0.0" +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -2447,13 +2572,6 @@ camel-case@^1.2.2: sentence-case "^1.1.1" upper-case "^1.1.1" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - camelcase-keys@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" @@ -2462,14 +2580,19 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -2478,6 +2601,11 @@ camelcase@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelize@1.0.0, camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -2554,6 +2682,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3 escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" @@ -2676,6 +2812,11 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -2709,14 +2850,14 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" clone-deep@^0.3.0: version "0.3.0" @@ -2816,6 +2957,13 @@ color-convert@^1.9.3: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" @@ -2825,7 +2973,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -2838,6 +2986,11 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + color@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" @@ -2856,7 +3009,7 @@ combined-stream@1.0.6, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2949,7 +3102,7 @@ console-browserify@^1.1.0: dependencies: date-now "^0.1.4" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -3024,9 +3177,9 @@ core-js@^2.4.0, core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" core-js@^3.17.3: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.2.tgz#85b35453a424abdcacb97474797815f4d62ebbf7" - integrity sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w== + version "3.32.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.2.tgz#172fb5949ef468f93b4be7841af6ab1f21992db7" + integrity sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ== core-js@^3.19.0, core-js@^3.19.1: version "3.19.1" @@ -3500,7 +3653,7 @@ debug@*, debug@3.1.0, debug@^3.1.0: dependencies: ms "2.0.0" -debug@4: +debug@4, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3534,7 +3687,15 @@ decamelize-keys@^1.0.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3592,6 +3753,15 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-properties@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" @@ -3606,6 +3776,15 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-properties@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -3955,10 +4134,10 @@ emoji-regex@^6.1.0: version "6.5.1" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emojis-list@^2.0.0: version "2.1.0" @@ -3969,7 +4148,7 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encoding@^0.1.11: +encoding@^0.1.11, encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -4024,6 +4203,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -4109,11 +4293,6 @@ es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" - integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== - es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" @@ -4424,11 +4603,6 @@ extend@^3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - external-editor@^2.0.4: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" @@ -4606,7 +4780,7 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0: +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -4682,15 +4856,6 @@ form-data@~2.3.1: combined-stream "1.0.6" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - formatio@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" @@ -4775,7 +4940,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-minipass@^2.0.0: +fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== @@ -4832,6 +4997,20 @@ functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -4848,6 +5027,7 @@ gauge@~2.7.3: gaze@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== dependencies: globule "^1.0.0" @@ -4856,7 +5036,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -4874,13 +5054,14 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" -get-intrinsic@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-port@^3.2.0: @@ -4890,6 +5071,7 @@ get-port@^3.2.0: get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw== get-stream@^3.0.0: version "3.0.0" @@ -4936,7 +5118,7 @@ glob-parent@~5.1.0, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: +glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -4947,27 +5129,28 @@ glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" +glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3, glob@^7.1.4: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^5.0.1" once "^1.3.0" - path-is-absolute "^1.0.0" global-dirs@^0.1.0: version "0.1.1" @@ -4991,17 +5174,18 @@ globby@^5.0.0: pinkie-promise "^2.0.0" globule@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + version "1.3.4" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.4.tgz#7c11c43056055a75a6e68294453c17f2796170fb" + integrity sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg== dependencies: glob "~7.1.1" - lodash "~4.17.10" + lodash "^4.17.21" minimatch "~3.0.2" -golos-lib-js@^0.9.51: - version "0.9.51" - resolved "https://registry.yarnpkg.com/golos-lib-js/-/golos-lib-js-0.9.51.tgz#202b7af01a0637e5c713a2674cbac90f88314eda" - integrity sha512-nJGoY1ovq2m4SYIy4KgV0fxXNP2VemDjSLrpelbeaoGW9ShmSqkdXD50EgXanoeUv/WP6cEfS3WXVV2YazfiAQ== +golos-lib-js@^0.9.56: + version "0.9.56" + resolved "https://registry.yarnpkg.com/golos-lib-js/-/golos-lib-js-0.9.56.tgz#3dfe8c0658fba2f50976ef49103ddc3f34109c19" + integrity sha512-h9ay0q2AuHiYL8aFXsCGoEFe6ojHt67FHMv8W6oWbqayl44JlRuuEysfE1MZQiiLwzBDFOO1SNMAtv5sE0bRcg== dependencies: abort-controller "^3.0.0" assert "^2.0.0" @@ -5062,7 +5246,7 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" -graceful-fs@^4.1.15, graceful-fs@^4.2.3: +graceful-fs@^4.1.15: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -5072,6 +5256,11 @@ graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -5087,13 +5276,10 @@ har-validator@~5.0.3: ajv "^5.1.0" har-schema "^2.0.0" -har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== has-ansi@^2.0.0: version "2.0.0" @@ -5114,6 +5300,23 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" @@ -5135,7 +5338,7 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.0: +has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -5276,6 +5479,13 @@ hosted-git-info@^2.1.4: version "2.6.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + hpkp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" @@ -5370,6 +5580,11 @@ http-basic@^2.5.1: concat-stream "^1.4.6" http-response-object "^1.0.0" +http-cache-semantics@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + http-errors@1.6.3, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, http-errors@~1.6.1, http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -5379,6 +5594,15 @@ http-errors@1.6.3, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, h setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" @@ -5404,7 +5628,7 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" -https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5412,6 +5636,13 @@ https-proxy-agent@^5.0.1: agent-base "6" debug "4" +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + humanize-number@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18" @@ -5507,16 +5738,15 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -5526,7 +5756,7 @@ indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" -infer-owner@^1.0.3: +infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== @@ -5612,6 +5842,11 @@ invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + irregular-plurals@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" @@ -5717,6 +5952,13 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" +is-core-module@^2.13.0, is-core-module@^2.5.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + is-core-module@^2.2.0: version "2.8.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" @@ -5781,12 +6023,6 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -5797,6 +6033,11 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-generator-function@^1.0.3: version "1.0.7" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" @@ -5838,7 +6079,12 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" -is-nan@^1.2.1: +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-nan@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== @@ -5996,25 +6242,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== +is-typed-array@^1.1.3: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - is-weakref@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" @@ -6083,10 +6321,15 @@ jquery@^2.2.0: resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02" integrity sha1-LInWiJterFIqfuoywUUhVZxsvwI= -js-base64@^2.1.8, js-base64@^2.1.9: +js-base64@^2.1.9: version "2.4.5" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92" +js-base64@^2.4.9: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -6190,6 +6433,11 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -6298,6 +6546,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" +kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -6561,15 +6814,10 @@ lightbox-react@^0.3.8: prop-types "^15.6.1" react-modal "^3.4.4" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== load-json-file@^2.0.0: version "2.0.0" @@ -6699,7 +6947,7 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@~4.17.10: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -6787,6 +7035,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -6808,11 +7061,55 @@ make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" +make-fetch-happen@^10.0.4: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -6820,6 +7117,11 @@ map-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -6878,21 +7180,6 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - meow@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" @@ -6907,6 +7194,24 @@ meow@^5.0.0: trim-newlines "^2.0.0" yargs-parser "^10.0.0" +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-anything@^2.2.4: version "2.4.4" resolved "https://registry.yarnpkg.com/merge-anything/-/merge-anything-2.4.4.tgz#6226b2ac3d3d3fc5fb9e8d23aa400df25f98fdf0" @@ -6968,11 +7273,6 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - "mime-db@>= 1.34.0 < 2": version "1.34.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" @@ -6987,13 +7287,6 @@ mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, m dependencies: mime-db "~1.33.0" -mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - mime@^2.0.3, mime@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" @@ -7002,6 +7295,11 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + mini-css-extract-plugin@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.0.tgz#ff3bf08bee96e618e177c16ca6131bfecef707f9" @@ -7017,12 +7315,35 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@~3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" + integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + minimist-options@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" @@ -7034,7 +7355,7 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -7043,6 +7364,56 @@ minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + minipass@^2.2.1, minipass@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" @@ -7050,20 +7421,25 @@ minipass@^2.2.1, minipass@^2.3.3: safe-buffer "^5.1.2" yallist "^3.0.0" -minipass@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + minizlib@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" dependencies: minipass "^2.2.1" -minizlib@^2.1.1: +minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -7134,7 +7510,7 @@ mkdirp@^0.5.3, mkdirp@~0.5.1: dependencies: minimist "^1.2.5" -mkdirp@^1.0.3: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -7176,6 +7552,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multiselect-react-dropdown@^1.6.7: version "1.6.13" resolved "https://registry.yarnpkg.com/multiselect-react-dropdown/-/multiselect-react-dropdown-1.6.13.tgz#7b101d9f5db992ccff92037275f215376691f13f" @@ -7219,11 +7600,16 @@ mz@~2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.12.1, nan@^2.13.2: +nan@^2.12.1: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== +nan@^2.17.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== + nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -7311,6 +7697,11 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +negotiator@^0.6.2, negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo-async@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" @@ -7368,20 +7759,20 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-gyp@^7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" - integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== +node-gyp@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== dependencies: env-paths "^2.2.0" glob "^7.1.4" - graceful-fs "^4.2.3" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" nopt "^5.0.0" - npmlog "^4.1.2" - request "^2.88.2" + npmlog "^6.0.0" rimraf "^3.0.2" - semver "^7.3.2" - tar "^6.0.2" + semver "^7.3.5" + tar "^6.1.2" which "^2.0.2" node-libs-browser@^2.2.1: @@ -7438,27 +7829,25 @@ node-releases@^2.0.1: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== -node-sass@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-6.0.0.tgz#f30da3e858ad47bfd138bc0e0c6f924ed2f734af" - integrity sha512-GDzDmNgWNc9GNzTcSLTi6DU6mzSPupVJoStIi7cF3GjwSE9q1cVakbvAAVSt59vzUjV9JJoSZFKoo9krbjKd2g== +node-sass@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-8.0.0.tgz#c80d52148db0ce88610bcf1e1d112027393c13e1" + integrity sha512-jPzqCF2/e6JXw6r3VxfIqYc8tKQdkj5Z/BDATYyG6FL6b/LuYBNFGFVhus0mthcWifHm/JzBpKAd+3eXsWeK/A== dependencies: async-foreach "^0.1.3" - chalk "^1.1.1" + chalk "^4.1.2" cross-spawn "^7.0.3" gaze "^1.0.0" get-stdin "^4.0.1" glob "^7.0.3" lodash "^4.17.15" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^7.1.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "2.2.5" + make-fetch-happen "^10.0.4" + meow "^9.0.0" + nan "^2.17.0" + node-gyp "^8.4.1" + sass-graph "^4.0.1" stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" + "true-case-path" "^2.2.1" node-watch@^0.7.1: version "0.7.1" @@ -7488,6 +7877,26 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -7525,7 +7934,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2: +npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -7534,6 +7943,16 @@ npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2: gauge "~2.7.3" set-blocking "~2.0.0" +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -7573,11 +7992,6 @@ oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -7595,7 +8009,7 @@ object-inspect@^1.11.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== -object-is@^1.0.1: +object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -7637,6 +8051,16 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -7791,6 +8215,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -7851,6 +8282,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -7940,14 +8381,6 @@ path-to-regexp@^1.1.1, path-to-regexp@^1.2.0: dependencies: isarray "0.0.1" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -8556,6 +8989,14 @@ promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -8608,11 +9049,6 @@ psl@^1.1.24: version "1.1.28" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -8672,7 +9108,7 @@ qr-image@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/qr-image/-/qr-image-3.2.0.tgz#9fa8295beae50c4a149cf9f909a1db464a8672e8" -qs@^6.1.0, qs@^6.4.0, qs@~6.5.1, qs@~6.5.2: +qs@^6.1.0, qs@^6.4.0, qs@~6.5.1: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -8706,6 +9142,11 @@ quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + ramda@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.19.1.tgz#89c4ad697265ff6b1face9f286439e2520d6679c" @@ -9001,13 +9442,6 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -9022,13 +9456,14 @@ read-pkg-up@^3.0.0: find-up "^2.0.0" read-pkg "^3.0.0" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" read-pkg@^2.0.0: version "2.0.0" @@ -9046,6 +9481,16 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.0, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -9058,7 +9503,7 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9067,6 +9512,15 @@ readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.5.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -9097,13 +9551,6 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - redent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" @@ -9111,6 +9558,14 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + reduce-reducers@^0.1.0: version "0.1.5" resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.1.5.tgz#ff77ca8068ff41007319b8b4b91533c7e0e54576" @@ -9290,12 +9745,6 @@ repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" @@ -9335,35 +9784,10 @@ request@*, request@^2.83.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -request@^2.88.0, request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^1.1.0: version "1.2.1" @@ -9376,11 +9800,6 @@ require-hacker@^3.0.0: babel-runtime "^6.6.1" colors "^1.1.2" -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -9432,6 +9851,15 @@ resolve@^1.1.6: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.10.0: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^1.12.0, resolve@^1.14.2: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" @@ -9457,6 +9885,11 @@ ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + rgb-regex@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" @@ -9567,15 +10000,15 @@ sanitize-html@^2.5.3: parse-srcset "^1.0.2" postcss "^8.3.11" -sass-graph@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" - integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== +sass-graph@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-4.0.1.tgz#2ff8ca477224d694055bf4093f414cf6cfad1d2e" + integrity sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA== dependencies: glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^13.3.2" + lodash "^4.17.11" + scss-tokenizer "^0.4.3" + yargs "^17.2.1" sass-loader@6.0.6: version "6.0.6" @@ -9651,12 +10084,13 @@ scroll-behavior@^0.9.5: dom-helpers "^3.2.1" invariant "^2.2.2" -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" +scss-tokenizer@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz#1058400ee7d814d71049c29923d2b25e61dc026c" + integrity sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw== dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" + js-base64 "^2.4.9" + source-map "^0.7.3" secure-random@^1.1.1: version "1.1.1" @@ -9677,7 +10111,12 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -9687,10 +10126,10 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@^7.3.4, semver@^7.3.5: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -9812,6 +10251,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + simple-html-tokenizer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz#05c2eec579ffffe145a030ac26cfea61b980fabe" @@ -9853,6 +10297,11 @@ slick-carousel@^1.8.1: resolved "https://registry.yarnpkg.com/slick-carousel/-/slick-carousel-1.8.1.tgz#a4bfb29014887bb66ce528b90bd0cda262cc8f8d" integrity sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -9880,6 +10329,32 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" @@ -9919,12 +10394,6 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -9933,6 +10402,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" @@ -10001,6 +10475,20 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -10018,8 +10506,9 @@ statuses@1, "statuses@>= 1.4.0 < 2", statuses@^1.2.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== dependencies: readable-stream "^2.0.1" @@ -10094,14 +10583,14 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" string.prototype.trimend@^1.0.4: version "1.0.4" @@ -10144,18 +10633,12 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^4.1.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -10165,16 +10648,17 @@ strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -10247,6 +10731,13 @@ supports-color@^5.5.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -10380,14 +10871,14 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -tar@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" - integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -10559,14 +11050,6 @@ tough-cookie@~2.3.3: dependencies: punycode "^1.4.1" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -10590,19 +11073,19 @@ traverse@^0.6.6: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - trim-newlines@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" -"true-case-path@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" - dependencies: - glob "^6.0.4" +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +"true-case-path@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" + integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== tslib@^1.10.0, tslib@^1.9.3: version "1.14.1" @@ -10653,6 +11136,21 @@ type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-is@^1.5.5, type-is@^1.6.14: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" @@ -10806,12 +11304,26 @@ unique-filename@^1.1.1: dependencies: unique-slug "^2.0.0" +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== + dependencies: + unique-slug "^3.0.0" + unique-slug@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" dependencies: imurmurhash "^0.1.4" +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + dependencies: + imurmurhash "^0.1.4" + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -10978,7 +11490,7 @@ util@^0.11.0: dependencies: inherits "2.0.3" -util@^0.12.0: +util@^0.12.5: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== @@ -10998,11 +11510,6 @@ uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - v8-compile-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" @@ -11343,21 +11850,16 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which-typed-array@^1.1.2: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.11, which-typed-array@^1.1.2: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^1.2.9: version "1.3.1" @@ -11378,6 +11880,13 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + widest-line@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" @@ -11409,14 +11918,14 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" @@ -11443,11 +11952,16 @@ ws@^4.0.0: async-limiter "~1.0.0" safe-buffer "~5.1.0" -ws@^8.11.0, ws@^8.2.3: +ws@^8.11.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== +ws@^8.2.3: + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== + x-xss-protection@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.1.0.tgz#4f1898c332deb1e7f2be1280efb3e2c53d69c1a7" @@ -11482,6 +11996,11 @@ y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -11501,29 +12020,28 @@ yargs-parser@^10.0.0: dependencies: camelcase "^4.1.0" -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== +yargs@^17.2.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" yargs@~3.10.0: version "3.10.0"