diff --git a/.travis.yml b/.travis.yml index 63d9e22f..cab3be3f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,12 +18,3 @@ matrix: install: pip install -r requirements/dev.txt script: - flask test - # Blockchain - - language: node_js - node_js: 8.13.0 - before_install: - - cd blockchain - install: yarn - script: - - yarn run test - - yarn run build diff --git a/admin/package.json b/admin/package.json index 0213df2b..aee327c3 100644 --- a/admin/package.json +++ b/admin/package.json @@ -103,11 +103,14 @@ "tslint-react": "^3.6.0", "typescript": "3.0.3", "url-loader": "^1.1.1", - "webpack": "^4.19.0", + "webpack": "^4.42.0", "webpack-cli": "^3.1.0", "webpack-dev-server": "3.2.1", "webpack-hot-middleware": "^2.24.0", - "xss": "^1.0.3" + "xss": "^1.0.3", + "acorn": "^6.4.1", + "minimist": "^1.2.3", + "kind-of": "^6.0.3" }, "devDependencies": { "@types/bn.js": "4.11.1", diff --git a/admin/src/Routes.tsx b/admin/src/Routes.tsx index 01f84bd2..1b77d0c2 100644 --- a/admin/src/Routes.tsx +++ b/admin/src/Routes.tsx @@ -18,9 +18,6 @@ import CCRDetail from 'components/CCRDetail'; import RFPs from 'components/RFPs'; import RFPForm from 'components/RFPForm'; import RFPDetail from 'components/RFPDetail'; -import Contributions from 'components/Contributions'; -import ContributionForm from 'components/ContributionForm'; -import ContributionDetail from 'components/ContributionDetail'; import Financials from 'components/Financials'; import Moderation from 'components/Moderation'; import Settings from 'components/Settings'; @@ -55,10 +52,6 @@ class Routes extends React.Component { - - - - diff --git a/admin/src/components/ArbiterControl/index.tsx b/admin/src/components/ArbiterControl/index.tsx index fd71ae5f..ec1b7a74 100644 --- a/admin/src/components/ArbiterControl/index.tsx +++ b/admin/src/components/ArbiterControl/index.tsx @@ -34,7 +34,7 @@ class ArbiterControlNaked extends React.Component { const { showSearch, searching } = this.state; const { results, search, error } = store.arbitersSearch; const showEmpty = !results.length && !searching; - const buttonDisabled = isVersionTwo && acceptedWithFunding === false + const buttonDisabled = isVersionTwo && !acceptedWithFunding; const disp = { [PROPOSAL_ARBITER_STATUS.MISSING]: 'Nominate arbiter', diff --git a/admin/src/components/CCRDetail/index.tsx b/admin/src/components/CCRDetail/index.tsx index 860d4d87..35d5ed25 100644 --- a/admin/src/components/CCRDetail/index.tsx +++ b/admin/src/components/CCRDetail/index.tsx @@ -73,8 +73,8 @@ class CCRDetailNaked extends React.Component { + } /> @@ -185,7 +201,6 @@ class CCRDetailNaked extends React.Component { {c.author.displayName} - @@ -215,6 +230,11 @@ class CCRDetailNaked extends React.Component { await store.approveCCR(false, reason); message.info('CCR changes requested'); }; + + private handleRejectPermanently = async (rejectReason: string) => { + await store.rejectPermanentlyCcr(rejectReason); + message.info('CCR rejected permanently'); + }; } const CCRDetail = withRouter(view(CCRDetailNaked)); diff --git a/admin/src/components/Emails/emails.ts b/admin/src/components/Emails/emails.ts index 1b7e888f..64512b77 100644 --- a/admin/src/components/Emails/emails.ts +++ b/admin/src/components/Emails/emails.ts @@ -41,11 +41,52 @@ export default [ title: 'Proposal approved', description: 'Sent when an admin approves your submitted proposal', }, + { + id: 'proposal_approved_without_funding', + title: 'Proposal approved without funding', + description: 'Sent when an admin approves your submitted proposal', + }, + { + id: 'proposal_approved_discussion', + title: 'Proposal approved for public discussion', + description: 'Sent when an admin approves a proposal for public discussion', + }, { id: 'proposal_rejected', title: 'Proposal changes requested', description: 'Sent when an admin requests changes for your submitted proposal', }, + { + id: 'proposal_rejected_permanently', + title: 'Proposal rejected permanently', + description: 'Sent when an admin rejects a proposal permanently', + }, + { + id: 'proposal_arbiter_assigned', + title: 'Proposal arbiter assigned', + description: 'Sent when a nominated arbiter accepts', + }, + { + id: 'ccr_approved', + title: 'Request has been approved', + description: 'Sent when an admin approves a submitted CCR', + }, + { + id: 'ccr_rejected', + title: 'Request has changes requested', + description: 'Sent when an admin requests changes for a CCR', + }, + { + id: 'ccr_rejected_permanently', + title: 'Request rejected permanently', + description: 'Sent when an admin rejects a CCR permanently', + }, + { + id: 'proposal_rejected_discussion', + title: 'Proposal changes requested', + description: + 'Sent when an admin requests changes for a proposal open for public discussion', + }, { id: 'proposal_contribution', title: 'Proposal received contribution', @@ -140,6 +181,11 @@ export default [ title: 'Admin Approval', description: 'Sent when proposal is ready for review', }, + { + id: 'admin_changes_resolved', + title: 'Admin Requested Changes Resolved', + description: 'Sent when proposal team has marked requested changes as resolved', + }, { id: 'admin_arbiter', title: 'Admin Arbiter', @@ -161,4 +207,9 @@ export default [ title: 'Followed Proposal Update', description: 'Sent to followers of a proposal when it has a new update', }, + { + id: 'followed_proposal_revised', + title: 'Followed Proposal Revised', + description: 'Sent to followers of a proposal when a revision has been made', + }, ] as Email[]; diff --git a/admin/src/components/Financials/index.tsx b/admin/src/components/Financials/index.tsx index 04343f4d..63a11caf 100644 --- a/admin/src/components/Financials/index.tsx +++ b/admin/src/components/Financials/index.tsx @@ -1,95 +1,53 @@ import React from 'react'; -import { Spin, Card, Row, Col } from 'antd'; +import { Spin, Card, Row, Col, Dropdown, Button, Icon, Menu } from 'antd'; import { Charts } from 'ant-design-pro'; import { view } from 'react-easy-state'; import store from '../../store'; import Info from 'components/Info'; +import { formatUsd } from '../../util/formatters'; import './index.less'; -class Financials extends React.Component { - componentDidMount() { - store.fetchFinancials(); +interface State { + selectedYear: string; +} + +class Financials extends React.Component<{}, State> { + state: State = { + selectedYear: '', + }; + + async componentDidMount() { + await store.fetchFinancials(); + + const years = Object.keys(store.financials.payoutsByQuarter); + const selectedYear = years[years.length - 1]; + + this.setState({ + selectedYear, + }); } render() { - const { contributions, grants, payouts } = store.financials; - if (!store.financialsFetched) { + const { selectedYear } = this.state; + const { grants, payouts, payoutsByQuarter } = store.financials; + if (!store.financialsFetched || !selectedYear) { return ; } + const years = Object.keys(store.financials.payoutsByQuarter); + const quarterData = payoutsByQuarter[this.state.selectedYear]; + + const payoutsByQuarterMenu = ( + this.setState({ selectedYear: e.key })}> + {years.map(year => ( + {year} + ))} + + ); + return (
- - - ( - - )} - data={[ - { x: 'funded', y: parseFloat(contributions.funded) }, - { x: 'funding', y: parseFloat(contributions.funding) }, - { x: 'refunding', y: parseFloat(contributions.refunding) }, - { x: 'refunded', y: parseFloat(contributions.refunded) }, - { x: 'donation', y: parseFloat(contributions.donations) }, - { x: 'staking', y: parseFloat(contributions.staking) }, - ]} - valueFormat={val => } - height={180} - /> - - - - - -

- Matching and bounty obligations for active and completed - proposals. -

- matching - total matching amount pleged -
- bounties - total bounty amount pledged -
- - } - > - Grants - - } - > - ( - - )} - data={[ - { x: 'bounties', y: parseFloat(grants.bounty) }, - { x: 'matching', y: parseFloat(grants.matching) }, - ]} - valueFormat={val => } - height={180} - /> -
- - ( )} @@ -129,7 +87,70 @@ class Financials extends React.Component { { x: 'future', y: parseFloat(payouts.future) }, { x: 'paid', y: parseFloat(payouts.paid) }, ]} - valueFormat={val => } + valueFormat={val => ( + + )} + height={180} + /> + + + + + + +

+ Milestone payouts broken down by quarter. Use the dropdown to + select a different year. +

+ + } + > + Payouts by Quarter +
+ + + +
+ } + > + ( + + )} + data={[ + { x: 'Q1', y: parseFloat(quarterData.q1) }, + { x: 'Q2', y: parseFloat(quarterData.q2) }, + { x: 'Q3', y: parseFloat(quarterData.q3) }, + { x: 'Q4', y: parseFloat(quarterData.q3) }, + ]} + valueFormat={val => ( + + )} height={180} /> diff --git a/admin/src/components/ProposalDetail/index.tsx b/admin/src/components/ProposalDetail/index.tsx index 3d921d34..9e2b2130 100644 --- a/admin/src/components/ProposalDetail/index.tsx +++ b/admin/src/components/ProposalDetail/index.tsx @@ -177,8 +177,91 @@ class ProposalDetailNaked extends React.Component { /> ); - const renderReview = () => + const renderKycColumn = () => + p.isVersionTwo && ( + + + {p.rfpOptIn ? ( +

KYC has been accepted by the proposer.

+ ) : ( +

KYC has been rejected. Recommend against approving with funding.

+ )} + + } + /> + + ); + + const renderReviewDiscussion = () => p.status === PROPOSAL_STATUS.PENDING && ( + <> + + + +

Please review this proposal and render your judgment.

+ + + + + } + /> + + {renderKycColumn()} +
+ + ); + + const renderReviewProposal = () => + p.status === PROPOSAL_STATUS.DISCUSSION && + !p.changesRequestedDiscussion && ( <> @@ -191,25 +274,25 @@ class ProposalDetailNaked extends React.Component {

Please review this proposal and render your judgment.

} /> - {p.isVersionTwo && ( - - - {p.rfpOptIn ? ( -

KYC has been accepted by the proposer.

- ) : ( -

- KYC has been rejected. Recommend against approving with funding. -

- )} - - } - /> - - )} + {renderKycColumn()}
); @@ -271,6 +335,39 @@ class ProposalDetailNaked extends React.Component { /> ); + const renderChangesRequestedDiscussion = () => + p.status === PROPOSAL_STATUS.DISCUSSION && + p.changesRequestedDiscussion && ( + +

+ This proposal has changes requested. The team will be able to update their + proposal and mark the changes as resolved should they desire to do so. +

+ Reason: +
+ {p.changesRequestedDiscussionReason} +
+
+ +
+ + } + /> + ); + const renderNominateArbiter = () => needsArbiter && shouldShowArbiter && ( @@ -409,8 +506,10 @@ class ProposalDetailNaked extends React.Component { {/* MAIN */} {renderApproved()} - {renderReview()} + {renderReviewDiscussion()} + {renderReviewProposal()} {renderRejected()} + {renderChangesRequestedDiscussion()} {renderNominateArbiter()} {renderNominatedArbiter()} {renderMilestoneAccepted()} @@ -602,15 +701,42 @@ class ProposalDetailNaked extends React.Component { this.setState({ showCancelAndRefundPopover: false }); }; - private handleApprove = (withFunding: boolean) => { - store.approveProposal(true, withFunding); + private handleApproveDiscussion = async () => { + await store.approveDiscussion(true); + message.info('Proposal now open for discussion'); }; - private handleReject = async (reason: string) => { - await store.approveProposal(false, false, reason); + private handleRejectDiscussion = async (rejectReason: string) => { + await store.approveDiscussion(false, rejectReason); message.info('Proposal changes requested'); }; + private handleRejectPermanently = async (rejectReason: string) => { + await store.rejectPermanentlyProposal(rejectReason); + message.info('Proposal rejected permanently'); + }; + + private handleAcceptProposal = async ( + isAccepted: boolean, + withFunding: boolean, + changesRequestedReason?: string, + ) => { + await store.acceptProposal(isAccepted, withFunding, changesRequestedReason); + message.info(`Proposal accepted ${withFunding ? 'with' : 'without'} funding`); + }; + + private handleRejectProposal = async (changesRequestedReason: string) => { + await store.acceptProposal(false, false, changesRequestedReason); + message.info(`Proposal changes requested`); + }; + + private handleMarkChangesAsResolved = async () => { + const success = await store.markProposalChangesAsResolved(); + if (success) { + message.info(`Requested changes marked as resolved`); + } + }; + private handlePaidMilestone = async () => { const pid = store.proposalDetail!.proposalId; const mid = store.proposalDetail!.currentMilestone!.id; diff --git a/admin/src/components/Template/index.tsx b/admin/src/components/Template/index.tsx index 5d5aad58..6360d9e6 100644 --- a/admin/src/components/Template/index.tsx +++ b/admin/src/components/Template/index.tsx @@ -63,12 +63,6 @@ class Template extends React.Component { RFPs - - - - Contributions - - diff --git a/admin/src/store.ts b/admin/src/store.ts index 6c1dc42b..6ce3ec5d 100644 --- a/admin/src/store.ts +++ b/admin/src/store.ts @@ -130,20 +130,44 @@ async function deleteProposal(id: number) { return data; } -async function approveProposal( +async function approveDiscussion( + id: number, + isOpenForDiscussion: boolean, + rejectReason?: string, +) { + const { data } = await api.put(`/admin/proposals/${id}/discussion`, { + isOpenForDiscussion, + rejectReason, + }); + return data; +} + +async function acceptProposal( id: number, isAccepted: boolean, withFunding: boolean, - rejectReason?: string, + changesRequestedReason?: string, ) { const { data } = await api.put(`/admin/proposals/${id}/accept`, { isAccepted, withFunding, + changesRequestedReason, + }); + return data; +} + +async function rejectPermanentlyProposal(id: number, rejectReason: string) { + const { data } = await api.put(`/admin/proposals/${id}/reject_permanently`, { rejectReason, }); return data; } +async function markProposalChangesAsResolved(id: number) { + const { data } = await api.put(`/admin/proposals/${id}/resolve`); + return data; +} + async function cancelProposal(id: number) { const { data } = await api.put(`/admin/proposals/${id}/cancel`); return data; @@ -190,6 +214,13 @@ async function approveCCR(id: number, isAccepted: boolean, rejectReason?: string return data; } +async function rejectPermanentlyCcr(id: number, rejectReason: string) { + const { data } = await api.put(`/admin/ccrs/${id}/reject_permanently`, { + rejectReason, + }); + return data; +} + async function fetchCCRs(params: Partial) { const { data } = await api.get(`/admin/ccrs`, { params }); return data; @@ -238,6 +269,14 @@ async function editContribution(id: number, args: ContributionArgs) { return data; } +interface QuarterData { + q1: string; + q2: string; + q3: string; + q4: string; + yearTotal: string; +} + // STORE const app = store({ /*** DATA ***/ @@ -267,22 +306,13 @@ const app = store({ matching: '0', bounty: '0', }, - contributions: { - total: '0', - gross: '0', - staking: '0', - funding: '0', - funded: '0', - refunding: '0', - refunded: '0', - donations: '0', - }, payouts: { total: '0', due: '0', paid: '0', future: '0', }, + payoutsByQuarter: {} as { [type: string]: QuarterData }, }, users: { @@ -312,12 +342,15 @@ const app = store({ proposalDetail: null as null | Proposal, proposalDetailFetching: false, - proposalDetailApproving: false, + proposalDetailApprovingDiscussion: false, + proposalDetailMarkingChangesAsResolved: false, + proposalDetailAcceptingProposal: false, proposalDetailMarkingMilestonePaid: false, proposalDetailCanceling: false, proposalDetailUpdating: false, proposalDetailUpdated: false, proposalDetailChangingToAcceptedWithFunding: false, + proposalDetailRejectingPermanently: false, ccrs: { page: createDefaultPageData('CREATED:DESC'), @@ -335,6 +368,7 @@ const app = store({ ccrDetailUpdating: false, ccrDetailUpdated: false, ccrDetailChangingToAcceptedWithFunding: false, + ccrDetailRejectingPermanently: false, ccrCreatedRFPId: null, comments: { @@ -583,6 +617,24 @@ const app = store({ app.ccrDetailApproving = false; }, + async rejectPermanentlyCcr(rejectReason: string) { + if (!app.ccrDetail) { + const m = 'store.rejectPermanentlyCcr(): Expected ccrDetail to be populated!'; + app.generalError.push(m); + console.error(m); + return; + } + app.ccrDetailRejectingPermanently = true; + try { + const { ccrId } = app.ccrDetail; + await rejectPermanentlyCcr(ccrId, rejectReason); + await app.fetchCCRDetail(ccrId); + } catch (e) { + handleApiError(e); + } + app.ccrDetailRejectingPermanently = false; + }, + // Proposals async fetchProposals() { @@ -636,32 +688,89 @@ const app = store({ handleApiError(e); } }, - - async approveProposal( + async acceptProposal( isAccepted: boolean, withFunding: boolean, - rejectReason?: string, + changesRequestedReason?: string, ) { if (!app.proposalDetail) { - const m = 'store.approveProposal(): Expected proposalDetail to be populated!'; + const m = 'store.acceptProposal(): Expected proposalDetail to be populated!'; app.generalError.push(m); console.error(m); return; } - app.proposalDetailApproving = true; + app.proposalDetailAcceptingProposal = true; try { const { proposalId } = app.proposalDetail; - const res = await approveProposal( + const res = await acceptProposal( proposalId, isAccepted, withFunding, - rejectReason, + changesRequestedReason, ); app.updateProposalInStore(res); } catch (e) { handleApiError(e); } - app.proposalDetailApproving = false; + app.proposalDetailAcceptingProposal = false; + }, + + async approveDiscussion(isOpenForDiscussion: boolean, rejectReason?: string) { + if (!app.proposalDetail) { + const m = 'store.approveDiscussion(): Expected proposalDetail to be populated!'; + app.generalError.push(m); + console.error(m); + return; + } + app.proposalDetailApprovingDiscussion = true; + try { + const { proposalId } = app.proposalDetail; + const res = await approveDiscussion(proposalId, isOpenForDiscussion, rejectReason); + app.updateProposalInStore(res); + } catch (e) { + handleApiError(e); + } + app.proposalDetailApprovingDiscussion = false; + }, + + async rejectPermanentlyProposal(rejectReason: string) { + if (!app.proposalDetail) { + const m = + 'store.rejectPermanentlyProposal(): Expected proposalDetail to be populated!'; + app.generalError.push(m); + console.error(m); + return; + } + app.proposalDetailRejectingPermanently = true; + try { + const { proposalId } = app.proposalDetail; + const res = await rejectPermanentlyProposal(proposalId, rejectReason); + app.updateProposalInStore(res); + } catch (e) { + handleApiError(e); + } + app.proposalDetailRejectingPermanently = false; + }, + + async markProposalChangesAsResolved() { + if (!app.proposalDetail) { + const m = 'store.approveDiscussion(): Expected proposalDetail to be populated!'; + app.generalError.push(m); + return; + } + let success = false; + app.proposalDetailMarkingChangesAsResolved = true; + try { + const { proposalId } = app.proposalDetail; + const res = await markProposalChangesAsResolved(proposalId); + app.updateProposalInStore(res); + success = true; + } catch (e) { + handleApiError(e); + success = false; + } + app.proposalDetailMarkingChangesAsResolved = false; + return success; }, async cancelProposal(id: number) { diff --git a/admin/src/types.ts b/admin/src/types.ts index dd73c51f..3e61b3ec 100644 --- a/admin/src/types.ts +++ b/admin/src/types.ts @@ -73,9 +73,12 @@ export interface ProposalArbiter { // NOTE: sync with backend/grant/utils/enums.py ProposalStatus export enum PROPOSAL_STATUS { DRAFT = 'DRAFT', + LIVE_DRAFT = 'LIVE_DRAFT', PENDING = 'PENDING', + DISCUSSION = 'DISCUSSION', APPROVED = 'APPROVED', REJECTED = 'REJECTED', + REJECTED_PERMANENTLY = 'REJECTED_PERMANENTLY', LIVE = 'LIVE', DELETED = 'DELETED', STAKING = 'STAKING', @@ -118,6 +121,8 @@ export interface Proposal { arbiter: ProposalArbiter; acceptedWithFunding: boolean | null; isVersionTwo: boolean; + changesRequestedDiscussion: boolean | null; + changesRequestedDiscussionReason: string | null; } export interface Comment { id: number; @@ -206,6 +211,7 @@ export enum CCR_STATUS { PENDING = 'PENDING', APPROVED = 'APPROVED', REJECTED = 'REJECTED', + REJECTED_PERMANENTLY = 'REJECTED_PERMANENTLY', LIVE = 'LIVE', DELETED = 'DELETED', } diff --git a/admin/src/util/statuses.ts b/admin/src/util/statuses.ts index c001044b..559c592e 100644 --- a/admin/src/util/statuses.ts +++ b/admin/src/util/statuses.ts @@ -87,6 +87,13 @@ export const CCR_STATUSES: Array> = [ hint: 'Admin has requested changes for this Request. User may adjust it and resubmit for approval.', }, + { + id: CCR_STATUS.REJECTED_PERMANENTLY, + tagDisplay: 'Rejected Permanently', + tagColor: '#eb4118', + hint: + 'Admin has rejected this CCR permanently. It cannot be resubmitted for approval.', + }, ]; export const PROPOSAL_STATUSES: Array> = [ @@ -96,6 +103,18 @@ export const PROPOSAL_STATUSES: Array> = [ tagColor: '#afd500', hint: 'Proposal has been approved and is awaiting being published by user.', }, + { + id: PROPOSAL_STATUS.DISCUSSION, + tagDisplay: 'Open for Public Review', + tagColor: '#afd500', + hint: 'Proposal has been opened for public discussion.', + }, + { + id: PROPOSAL_STATUS.LIVE_DRAFT, + tagDisplay: 'Live Draft', + tagColor: '#8d8d8d', + hint: 'Proposal is an edit that will to be published to another proposal.', + }, { id: PROPOSAL_STATUS.DELETED, tagDisplay: 'Deleted', @@ -127,6 +146,13 @@ export const PROPOSAL_STATUSES: Array> = [ hint: 'Admin has requested changes for this proposal. User may adjust it and resubmit for approval.', }, + { + id: PROPOSAL_STATUS.REJECTED_PERMANENTLY, + tagDisplay: 'Rejected Permanently', + tagColor: '#eb4118', + hint: + 'Admin has rejected this proposal permanently. It cannot be resubmitted for approval.', + }, { id: PROPOSAL_STATUS.STAKING, tagDisplay: 'Staking', diff --git a/admin/yarn.lock b/admin/yarn.lock index 23d03efc..c32c5708 100644 --- a/admin/yarn.lock +++ b/admin/yarn.lock @@ -962,147 +962,166 @@ "@types/uglify-js" "*" source-map "^0.6.0" -"@webassemblyjs/ast@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.10.tgz#0cfc61d61286240b72fc522cb755613699eea40a" +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== dependencies: - "@webassemblyjs/helper-module-context" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/wast-parser" "1.7.10" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" -"@webassemblyjs/floating-point-hex-parser@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz#ee63d729c6311a85863e369a473f9983f984e4d9" +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== -"@webassemblyjs/helper-api-error@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz#bfcb3bbe59775357475790a2ad7b289f09b2f198" +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== -"@webassemblyjs/helper-buffer@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz#0a8c624c67ad0b214d2e003859921a1988cb151b" +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== -"@webassemblyjs/helper-code-frame@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz#0ab7e22fad0241a173178c73976fc0edf50832ce" +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== dependencies: - "@webassemblyjs/wast-printer" "1.7.10" + "@webassemblyjs/wast-printer" "1.8.5" -"@webassemblyjs/helper-fsm@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz#0915e7713fbbb735620a9d3e4fa3d7951f97ac64" +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== -"@webassemblyjs/helper-module-context@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz#9beb83f72740f5ac8075313b5cac5e796510f755" - -"@webassemblyjs/helper-wasm-bytecode@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz#797b1e734bbcfdea8399669cdc58308ef1c7ffc0" - -"@webassemblyjs/helper-wasm-section@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz#c0ea3703c615d7bc3e3507c3b7991c8767b2f20e" +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-buffer" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/wasm-gen" "1.7.10" + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" -"@webassemblyjs/ieee754@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz#62c1728b7ef0f66ef8221e2966a0afd75db430df" +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.10.tgz#167e0bb4b06d7701585772a73fba9f4df85439f6" +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== dependencies: - "@xtuc/long" "4.2.1" + "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.10.tgz#b6728f5b6f50364abc155be029f9670e6685605a" +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== -"@webassemblyjs/wasm-edit@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz#83fe3140f5a58f5a30b914702be9f0e59a399092" +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-buffer" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/helper-wasm-section" "1.7.10" - "@webassemblyjs/wasm-gen" "1.7.10" - "@webassemblyjs/wasm-opt" "1.7.10" - "@webassemblyjs/wasm-parser" "1.7.10" - "@webassemblyjs/wast-printer" "1.7.10" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" -"@webassemblyjs/wasm-gen@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz#4de003806ae29c97ab3707782469b53299570174" +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/ieee754" "1.7.10" - "@webassemblyjs/leb128" "1.7.10" - "@webassemblyjs/utf8" "1.7.10" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -"@webassemblyjs/wasm-opt@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz#d151e31611934a556c82789fdeec41a814993c2a" +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-buffer" "1.7.10" - "@webassemblyjs/wasm-gen" "1.7.10" - "@webassemblyjs/wasm-parser" "1.7.10" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" -"@webassemblyjs/wasm-parser@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz#0367be7bf8f09e3e6abc95f8e483b9206487ec65" +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-api-error" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/ieee754" "1.7.10" - "@webassemblyjs/leb128" "1.7.10" - "@webassemblyjs/utf8" "1.7.10" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -"@webassemblyjs/wast-parser@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz#058f598b52f730b23fc874d4775b6286b6247264" +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/floating-point-hex-parser" "1.7.10" - "@webassemblyjs/helper-api-error" "1.7.10" - "@webassemblyjs/helper-code-frame" "1.7.10" - "@webassemblyjs/helper-fsm" "1.7.10" - "@xtuc/long" "4.2.1" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz#d817909d2450ae96c66b7607624d98a33b84223b" +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/wast-parser" "1.7.10" - "@xtuc/long" "4.2.1" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -"@xtuc/long@4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - abs-svg-path@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" @@ -1114,12 +1133,6 @@ accepts@~1.3.4, accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - dependencies: - acorn "^5.0.0" - acorn-globals@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" @@ -1131,14 +1144,20 @@ acorn-walk@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.0.tgz#c957f4a1460da46af4a0388ce28b4c99355b0cbc" -acorn@^5.0.0, acorn@^5.6.2: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - acorn@^6.0.1, acorn@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.2.tgz#6a459041c320ab17592c6317abbfdf4bbaa98ca4" +acorn@^6.2.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + +acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + add-dom-event-listener@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310" @@ -1154,9 +1173,10 @@ ajv-errors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" -ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== ajv@^5.3.0: version "5.5.2" @@ -1167,11 +1187,12 @@ ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0: - version "6.5.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" +ajv@^6.1.0, ajv@^6.10.2: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== dependencies: - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" @@ -1207,10 +1228,12 @@ ansi-html@0.0.7: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^2.2.1: version "2.2.1" @@ -1323,20 +1346,15 @@ any-observable@^0.3.0: anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -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" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== argparse@^1.0.7: version "1.0.10" @@ -1354,6 +1372,7 @@ arr-diff@^2.0.0: arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" @@ -1362,6 +1381,7 @@ arr-flatten@^1.0.1, arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-equal@^1.0.0: version "1.0.0" @@ -1409,6 +1429,7 @@ array-unique@^0.2.1: array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= arrify@^1.0.1: version "1.0.1" @@ -1422,6 +1443,7 @@ asap@~2.0.3: asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" @@ -1438,18 +1460,22 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: + object-assign "^4.1.1" util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-each@^1.0.0, async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async-limiter@~1.0.0: version "1.0.0" @@ -1470,9 +1496,10 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== author-regex@^1.0.0: version "1.0.0" @@ -1618,14 +1645,17 @@ babylon@^6.18.0: balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1652,15 +1682,29 @@ bcrypt-pbkdf@^1.0.0: big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== bindings@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bip66@^1.1.3: version "1.1.5" resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" @@ -1685,9 +1729,10 @@ bizcharts@^3.4.2: prop-types "^15.6.0" warning "^3.0.0" -bluebird@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.0, bn.js@^4.11.3, bn.js@^4.4.0: version "4.11.8" @@ -1726,6 +1771,7 @@ boolbase@^1.0.0, boolbase@~1.0.0: brace-expansion@^1.0.0, brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1738,9 +1784,10 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0, braces@^2.3.1: +braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1756,6 +1803,7 @@ braces@^2.3.0, braces@^2.3.1: brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-process-hrtime@^0.1.2: version "0.1.3" @@ -1775,6 +1823,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6: browserify-cipher@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" @@ -1783,6 +1832,7 @@ browserify-cipher@^1.0.0: browserify-des@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" @@ -1791,7 +1841,8 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1799,6 +1850,7 @@ browserify-rsa@^4.0.0: browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" @@ -1811,6 +1863,7 @@ browserify-sign@^4.0.0: browserify-zlib@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" @@ -1825,6 +1878,7 @@ browserslist@^4.1.0: buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-indexof@^1.0.0: version "1.1.1" @@ -1833,10 +1887,12 @@ buffer-indexof@^1.0.0: buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1849,32 +1905,37 @@ builtin-modules@^1.0.0, builtin-modules@^1.1.1: builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" y18n "^4.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" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1951,7 +2012,7 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" -chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4: +chokidar@^2.0.0, chokidar@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" dependencies: @@ -1970,13 +2031,34 @@ chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4: optionalDependencies: fsevents "^1.2.2" -chownr@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" +chokidar@^2.0.2: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== dependencies: tslib "^1.9.0" @@ -1987,6 +2069,7 @@ ci-info@^1.5.0: cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -1994,6 +2077,7 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -2082,10 +2166,12 @@ coa@~2.0.1: code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -2118,13 +2204,15 @@ commander@2.17.x, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= component-classes@1.x, component-classes@^1.2.5, component-classes@^1.2.6: version "1.2.6" @@ -2134,8 +2222,9 @@ component-classes@1.x, component-classes@^1.2.5, component-classes@^1.2.6: component-indexof "0.0.3" component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== component-indexof@0.0.3: version "0.0.3" @@ -2163,10 +2252,12 @@ compression@^1.5.2: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" @@ -2178,18 +2269,14 @@ connect-history-api-fallback@^1.3.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.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" + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= container-query-toolkit@0.1.3: version "0.1.3" @@ -2224,6 +2311,7 @@ cookie@0.3.1: copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== dependencies: aproba "^1.1.1" fs-write-stream-atomic "^1.0.8" @@ -2235,6 +2323,7 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= copy-to-clipboard@^3: version "3.0.8" @@ -2271,13 +2360,15 @@ cosmiconfig@^5.0.2, cosmiconfig@^5.0.6: create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0" create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" @@ -2287,7 +2378,8 @@ create-hash@^1.1.0, create-hash@^1.1.2: create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -2341,6 +2433,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -2459,9 +2552,10 @@ csstype@^2.2.0: version "2.5.7" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.7.tgz#bf9235d5872141eccfb2d16d82993c6b149179ff" -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= d3-array@1, d3-array@~1.2.0: version "1.2.4" @@ -2612,11 +2706,7 @@ date-fns@^1.27.2: version "1.29.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -2654,6 +2744,7 @@ decamelize@^2.0.0: decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= dedent@^0.7.0: version "0.7.0" @@ -2663,10 +2754,6 @@ deep-equal@^1.0.1, deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -2688,18 +2775,21 @@ define-properties@^1.1.2: define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" @@ -2723,17 +2813,14 @@ delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -2748,10 +2835,6 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - detect-node@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" @@ -2770,7 +2853,8 @@ diff@^3.2.0: diffie-hellman@^5.0.0: version "5.0.3" - resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" @@ -2842,6 +2926,7 @@ dom-walk@^0.1.0: domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domelementtype@1: version "1.2.1" @@ -2909,8 +2994,9 @@ duplexer@^0.1.1: resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -2942,7 +3028,20 @@ element-resize-detector@1.1.13: dependencies: batch-processor "^1.0.0" -elliptic@^6.0.0, elliptic@^6.2.3: +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +elliptic@^6.2.3: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" dependencies: @@ -2957,6 +3056,12 @@ elliptic@^6.0.0, elliptic@^6.2.3: emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== encodeurl@~1.0.2: version "1.0.2" @@ -2970,12 +3075,13 @@ encoding@^0.1.11: iconv-lite "~0.4.13" end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: +enhanced-resolve@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" dependencies: @@ -2983,6 +3089,15 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + enquire-js@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/enquire-js/-/enquire-js-0.2.1.tgz#f2478cf5808d42f54e8231f20fa133493e7f0fcb" @@ -3047,9 +3162,10 @@ escodegen@^1.11.0: optionalDependencies: source-map "~0.6.1" -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -3066,10 +3182,16 @@ esprima@^4.0.0: esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -3119,9 +3241,10 @@ eventlistener@0.0.1: resolved "https://registry.yarnpkg.com/eventlistener/-/eventlistener-0.0.1.tgz#ed2baabb852227af2bcf889152c72c63ca532eb8" integrity sha1-7Suqu4UiJ68rz4iRUscsY8pTLrg= -events@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== eventsource@0.1.6: version "0.1.6" @@ -3138,6 +3261,7 @@ eventsource@^1.0.7: evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" @@ -3208,6 +3332,7 @@ expand-brackets@^0.1.4: expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -3272,12 +3397,14 @@ express@^4.16.2: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -3303,6 +3430,7 @@ extglob@^0.3.1: extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -3325,13 +3453,15 @@ fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: version "2.0.6" @@ -3370,6 +3500,11 @@ fecha@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -3390,6 +3525,11 @@ file-loader@^2.0.0: loader-utils "^1.0.2" schema-utils "^1.0.0" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -3411,6 +3551,7 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -3439,11 +3580,21 @@ find-babel-config@^1.1.0: find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= dependencies: commondir "^1.0.1" make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-parent-dir@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" @@ -3459,6 +3610,7 @@ find-up@^1.0.0, find-up@^1.1.2: find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" @@ -3469,11 +3621,12 @@ find-up@^3.0.0: locate-path "^3.0.0" flush-write-stream@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" + inherits "^2.0.3" + readable-stream "^2.3.6" fmin@0.0.2: version "0.0.2" @@ -3550,6 +3703,7 @@ forwarded@~0.1.2: fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" @@ -3560,6 +3714,7 @@ fresh@0.5.2: from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" readable-stream "^2.0.0" @@ -3572,15 +3727,10 @@ fs-extra@^3.0.1: jsonfile "^3.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - dependencies: - minipass "^2.2.1" - fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= dependencies: graceful-fs "^4.1.2" iferr "^0.1.5" @@ -3590,31 +3740,20 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" +fsevents@^1.2.2, fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + bindings "^1.5.0" + nan "^2.12.1" function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - get-caller-file@^1.0.1, get-caller-file@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -3641,6 +3780,7 @@ get-stream@^4.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" @@ -3664,11 +3804,12 @@ glob-parent@^2.0.0: glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: +glob@^7.0.3, glob@^7.1.1, glob@~7.1.2: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: @@ -3679,6 +3820,18 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules-path@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" @@ -3726,7 +3879,12 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3819,13 +3977,10 @@ has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3834,6 +3989,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3842,10 +3998,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -3859,11 +4017,20 @@ has@^1.0.1, has@~1.0.3: hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.5: +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hash.js@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" dependencies: @@ -3887,6 +4054,7 @@ history@^4.7.2: hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -4009,6 +4177,7 @@ http-signature@~1.2.0: https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= husky@^1.0.0-rc.8: version "1.1.2" @@ -4025,7 +4194,7 @@ husky@^1.0.0-rc.8: run-node "^1.0.0" slash "^2.0.0" -iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" dependencies: @@ -4048,18 +4217,14 @@ icss-utils@^2.1.0: postcss "^6.0.1" ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - dependencies: - minimatch "^3.0.4" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= image-size@~0.5.0: version "0.5.5" @@ -4085,33 +4250,44 @@ import-local@^2.0.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" -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: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@^1.3.4, ini@~1.3.0: +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inquirer@3.3.0: version "3.3.0" @@ -4182,12 +4358,14 @@ ipaddr.js@^1.9.0: is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" @@ -4198,6 +4376,7 @@ is-arrayish@^0.2.1: is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" @@ -4229,12 +4408,14 @@ is-ci@^1.2.1: is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" @@ -4245,6 +4426,7 @@ is-date-object@^1.0.1: is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -4253,6 +4435,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -4275,10 +4458,12 @@ is-equal-shallow@^0.1.3: is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" @@ -4289,6 +4474,7 @@ is-extglob@^1.0.0: 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" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" @@ -4299,12 +4485,14 @@ is-finite@^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" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" 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" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" @@ -4315,12 +4503,14 @@ is-glob@^2.0.0, is-glob@^2.0.1: is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" @@ -4342,6 +4532,7 @@ is-number@^2.1.0: is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" @@ -4378,6 +4569,7 @@ is-path-inside@^1.0.0: is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" @@ -4440,6 +4632,7 @@ isarray@0.0.1, isarray@~0.0.1: isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" @@ -4453,12 +4646,14 @@ ismobilejs@^0.5.1: isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isomorphic-fetch@^2.1.1: version "2.2.1" @@ -4578,6 +4773,7 @@ json-schema-traverse@^0.3.0: json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.2.3: version "0.2.3" @@ -4606,7 +4802,15 @@ json3@^3.3.2: json5@^0.5.0, json5@^0.5.1: version "0.5.1" - resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" jsonfile@^3.0.0: version "3.0.1" @@ -4649,22 +4853,26 @@ kind-of@^2.0.1: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -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.0, kind-of@^6.0.2, 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== lazy-cache@^0.2.3: version "0.2.7" @@ -4797,9 +5005,10 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-runner@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== loader-utils@^0.2.16: version "0.2.17" @@ -4810,7 +5019,7 @@ loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: @@ -4818,9 +5027,19 @@ loader-utils@^1.0.2, loader-utils@^1.1.0: emojis-list "^2.0.0" json5 "^0.5.0" +loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -4943,19 +5162,40 @@ lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" -lru-cache@^4.0.1, lru-cache@^4.1.1: +lru-cache@^4.0.1: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + map-age-cleaner@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" @@ -4965,10 +5205,12 @@ map-age-cleaner@^0.1.1: map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" @@ -4979,6 +5221,7 @@ math-random@^1.0.1: md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" @@ -5011,9 +5254,18 @@ memoize-one@^5.0.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.0.tgz#d55007dffefb8de7546659a1722a5d42e128286e" integrity sha512-7g0+ejkOaI9w5x6LvQwmj68kUj6rxROywPSCqmclG/HBacmFnZqhVscQ8kovkn9FBCNJmOz6SY42+jnvZzDWdw== -memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -5055,6 +5307,7 @@ micromatch@^2.3.11: micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5073,6 +5326,7 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" @@ -5130,10 +5384,12 @@ mini-store@^2.0.0: minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 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" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= minimatch@3.0.3: version "3.0.3" @@ -5144,33 +5400,29 @@ minimatch@3.0.3: minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" +minimist@^1.2.2: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minizlib@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" - dependencies: - minipass "^2.2.1" - -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== dependencies: concat-stream "^1.5.0" duplexify "^3.4.2" @@ -5178,14 +5430,15 @@ mississippi@^2.0.0: flush-write-stream "^1.0.0" from2 "^2.1.0" parallel-transform "^1.1.0" - pump "^2.0.1" + pump "^3.0.0" pumpify "^1.3.3" stream-each "^1.1.0" through2 "^2.0.0" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -5197,9 +5450,10 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" @@ -5215,6 +5469,7 @@ moment@^2.22.2: move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= dependencies: aproba "^1.1.1" copy-concurrently "^1.0.0" @@ -5226,6 +5481,7 @@ move-concurrently@^1.0.1: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.1.1: version "2.1.1" @@ -5251,13 +5507,19 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.2.1, nan@^2.9.2: +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nan@^2.2.1: version "2.11.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5271,21 +5533,14 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -neo-async@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== nice-try@^1.0.4: version "1.0.5" @@ -5309,9 +5564,10 @@ node-forge@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" -node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -5320,10 +5576,10 @@ node-libs-browser@^2.0.0: constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^1.0.0" + events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" - path-browserify "0.0.0" + path-browserify "0.0.1" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" @@ -5334,41 +5590,19 @@ node-libs-browser@^2.0.0: timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" + util "^0.11.0" + vm-browserify "^1.0.1" node-modules-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - node-releases@^1.0.0-alpha.15: version "1.0.0-alpha.15" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.15.tgz#bdb08730287cc50ddbfa3c1a358366a4a2f5d397" dependencies: semver "^5.3.0" -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -5384,16 +5618,10 @@ normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - -npm-packlist@^1.1.6: - version "1.1.12" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-path@^2.0.2: version "2.0.4" @@ -5415,15 +5643,6 @@ npm-which@^3.0.1: npm-path "^2.0.2" which "^1.2.10" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@^1.0.2, nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -5433,6 +5652,7 @@ nth-check@^1.0.2, nth-check@~1.0.1: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= numeral@^2.0.6: version "2.0.6" @@ -5458,6 +5678,7 @@ object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4. object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -5474,6 +5695,7 @@ object-keys@^1.0.11, object-keys@^1.0.12: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" @@ -5503,6 +5725,7 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" @@ -5539,6 +5762,7 @@ on-headers@~1.0.1: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" @@ -5584,10 +5808,7 @@ original@>=0.0.5, original@^1.0.0: os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-locale@^2.0.0: version "2.1.0" @@ -5605,16 +5826,10 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= p-defer@^1.0.0: version "1.0.0" @@ -5631,6 +5846,7 @@ p-is-promise@^1.1.0: p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" @@ -5643,6 +5859,7 @@ p-limit@^2.0.0: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" @@ -5659,20 +5876,23 @@ p-map@^1.1.1: p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== dependencies: - cyclist "~0.2.2" + cyclist "^1.0.1" inherits "^2.0.3" readable-stream "^2.1.5" @@ -5683,14 +5903,16 @@ param-case@2.1.x: no-case "^2.2.0" parse-asn1@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" parse-author@^2.0.0: version "2.0.0" @@ -5739,14 +5961,17 @@ parseurl@~1.3.2: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" @@ -5757,10 +5982,12 @@ path-exists@^2.0.0: path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" @@ -5799,6 +6026,7 @@ path-type@^1.0.0: pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5818,6 +6046,12 @@ pify@^2.0.0: pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" @@ -5838,6 +6072,7 @@ pirates@^4.0.0: pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: find-up "^2.1.0" @@ -5886,6 +6121,7 @@ portfinder@^1.0.9: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-modules-extract-imports@^1.2.0: version "1.2.0" @@ -5974,12 +6210,14 @@ private@^0.1.6: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= process@~0.5.1: version "0.5.2" @@ -5988,6 +6226,7 @@ process@~0.5.1: promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise@^7.1.1: version "7.3.1" @@ -6013,10 +6252,12 @@ proxy-addr@~2.0.4: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: version "1.1.29" @@ -6025,6 +6266,7 @@ psl@^1.1.24: public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" @@ -6033,9 +6275,10 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" -pump@^2.0.0, pump@^2.0.1: +pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -6051,6 +6294,7 @@ pump@^3.0.0: pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== dependencies: duplexify "^3.6.0" inherits "^2.0.3" @@ -6059,6 +6303,7 @@ pumpify@^1.3.3: punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" @@ -6067,6 +6312,7 @@ punycode@^1.2.4, punycode@^1.4.1: punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== q@^1.1.2: version "1.5.1" @@ -6104,10 +6350,12 @@ query-string@6.1.0: querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0, querystring@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystringify@^2.0.0: version "2.1.0" @@ -6129,14 +6377,16 @@ randomatic@^3.0.0: math-random "^1.0.1" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" @@ -6569,15 +6819,6 @@ rc-util@^4.0.4, rc-util@^4.1.0, rc-util@^4.1.1, rc-util@^4.3.0, rc-util@^4.4.0, prop-types "^15.5.10" shallowequal "^0.2.2" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - react-container-query@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/react-container-query/-/react-container-query-0.11.0.tgz#b07ac2794612499dd8f2d1759b72e9c415e53567" @@ -6765,9 +7006,10 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.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.6, 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.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -6795,9 +7037,10 @@ readable-stream@^3.0.6: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.0.0: +readdirp@^2.0.0, readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" micromatch "^3.1.10" @@ -6853,6 +7096,7 @@ regex-cache@^0.4.2: regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" @@ -6907,6 +7151,7 @@ relateurl@0.2.x: remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= renderkid@^2.0.1: version "2.0.2" @@ -6921,6 +7166,7 @@ renderkid@^2.0.1: repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" @@ -7022,6 +7268,7 @@ resolve-pathname@^2.2.0: resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0: version "1.8.1" @@ -7058,6 +7305,7 @@ resumer@~0.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== right-align@^0.1.1: version "0.1.3" @@ -7065,15 +7313,23 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@^2.2.8: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" inherits "^2.0.1" @@ -7113,6 +7369,7 @@ run-node@^1.0.0: run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: aproba "^1.1.1" @@ -7136,13 +7393,20 @@ rxjs@^6.1.0: dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" @@ -7150,7 +7414,7 @@ safe-regex@^1.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" -sax@^1.2.4, sax@~1.2.4: +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -7166,13 +7430,6 @@ schedule@^0.5.0: dependencies: object-assign "^4.1.1" -schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -7208,10 +7465,15 @@ semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" -"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" +semver@^5.3.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -7230,9 +7492,10 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" -serialize-javascript@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== serve-index@^1.7.2: version "1.9.1" @@ -7255,22 +7518,15 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -7287,7 +7543,8 @@ setprototypeof@1.1.0: sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -7346,6 +7603,7 @@ showdown@^1.8.7: 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" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= simple-statistics@~6.1.0: version "6.1.1" @@ -7362,6 +7620,7 @@ slice-ansi@0.0.4: snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -7370,12 +7629,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -7426,12 +7687,14 @@ sort-order@^1.0.1: source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" @@ -7450,9 +7713,18 @@ source-map-support@^0.5.9: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + 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" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.1.32: version "0.1.32" @@ -7516,6 +7788,7 @@ spdy@^4.0.0: split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" @@ -7538,11 +7811,12 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: - safe-buffer "^5.1.1" + figgy-pudding "^3.5.1" stable@~0.1.6: version "0.1.8" @@ -7555,6 +7829,7 @@ staged-git-files@1.1.1: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -7572,8 +7847,9 @@ stealthy-require@^1.1.0: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" @@ -7581,6 +7857,7 @@ stream-browserify@^2.0.1: stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: end-of-stream "^1.1.0" stream-shift "^1.0.0" @@ -7588,6 +7865,7 @@ stream-each@^1.1.0: stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" @@ -7596,8 +7874,9 @@ stream-http@^2.7.2: xtend "^4.0.0" stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== strict-uri-encode@^2.0.0: version "2.0.0" @@ -7615,14 +7894,16 @@ string-convert@^0.2.0: string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -7635,11 +7916,12 @@ string.prototype.trim@~1.1.2: es-abstract "^1.5.0" function-bind "^1.0.2" -string_decoder@^1.0.0, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" +string_decoder@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - safe-buffer "~5.1.0" + safe-buffer "~5.2.0" string_decoder@^1.1.1: version "1.2.0" @@ -7652,6 +7934,13 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-object@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -7662,13 +7951,15 @@ stringify-object@^3.2.2: strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" @@ -7688,10 +7979,6 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "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" - style-loader@^0.23.0: version "0.23.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" @@ -7743,9 +8030,10 @@ symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" -tapable@^1.0.0, tapable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tape@^4.5.1: version "4.9.1" @@ -7765,17 +8053,29 @@ tape@^4.5.1: string.prototype.trim "~1.1.2" through "~2.3.8" -tar@^4: - version "4.4.6" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" + integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" test-exclude@^3.3.0: version "3.3.0" @@ -7793,10 +8093,11 @@ text-table@0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: - readable-stream "^2.1.5" + readable-stream "~2.3.6" xtend "~4.0.1" through@^2.3.6, through@~2.3.4, through@~2.3.8: @@ -7808,8 +8109,9 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== dependencies: setimmediate "^1.0.4" @@ -7827,6 +8129,7 @@ tmp@^0.0.33: to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-fast-properties@^1.0.3: version "1.0.3" @@ -7839,12 +8142,14 @@ to-fast-properties@^2.0.0: to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -7852,6 +8157,7 @@ to-regex-range@^2.1.0: to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" @@ -7903,10 +8209,15 @@ tslib@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" -tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.2: +tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.2: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" +tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + tslint-config-airbnb@^5.9.2: version "5.11.0" resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.0.tgz#4477fa64e2d8b4282b43666d6a34925c766cc949" @@ -7985,6 +8296,7 @@ tsutils@^3.0.0: tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tunnel-agent@^0.6.0: version "0.6.0" @@ -8012,6 +8324,7 @@ type-is@~1.6.16: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@3.0.3: version "3.0.3" @@ -8022,13 +8335,6 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - uglify-js@3.4.x: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" @@ -8049,19 +8355,6 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -uglifyjs-webpack-plugin@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -8082,23 +8375,26 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" -unique-filename@^1.1.0: +unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" @@ -8117,13 +8413,15 @@ unquote@~1.1.1: unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" +upath@^1.0.5, upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== upper-case@^1.1.1: version "1.1.3" @@ -8132,12 +8430,14 @@ upper-case@^1.1.1: uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-loader@^1.1.1: version "1.1.2" @@ -8157,6 +8457,7 @@ url-parse@^1.1.8, url-parse@^1.4.3: url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" @@ -8164,10 +8465,12 @@ url@^0.11.0: use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" @@ -8179,12 +8482,14 @@ util.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0: util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== dependencies: inherits "2.0.3" @@ -8235,11 +8540,10 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - dependencies: - indexof "0.0.1" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== w3c-hr-time@^1.0.1: version "1.0.1" @@ -8268,9 +8572,10 @@ warning@^4.0.1, warning@^4.0.2, warning@~4.0.2: dependencies: loose-envify "^1.0.0" -watchpack@^1.5.0: +watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" @@ -8363,41 +8668,42 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-sources@^1.1.0, webpack-sources@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.19.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.23.0.tgz#0cfbf324b7f6789ac2e6c98fa83eabe96fa56232" +webpack@^4.42.0: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-module-context" "1.7.10" - "@webassemblyjs/wasm-edit" "1.7.10" - "@webassemblyjs/wasm-parser" "1.7.10" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" + eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.1.0" - uglifyjs-webpack-plugin "^1.2.4" - watchpack "^1.5.0" - webpack-sources "^1.3.0" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" websocket-driver@>=0.5.1: version "0.7.0" @@ -8443,12 +8749,6 @@ which@^1.2.10, which@^1.2.14, which@^1.2.9: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - dependencies: - string-width "^1.0.2 || 2" - window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" @@ -8465,9 +8765,10 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== dependencies: errno "~0.1.7" @@ -8481,6 +8782,7 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= ws@^6.1.0: version "6.1.0" @@ -8509,8 +8811,9 @@ xss@^1.0.3: cssfilter "0.0.10" xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^3.2.1: version "3.2.1" @@ -8523,10 +8826,12 @@ y18n@^3.2.1: yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yargs-parser@^10.1.0: version "10.1.0" diff --git a/backend/.env.example b/backend/.env.example index b5f09516..46ef7ac7 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -7,6 +7,7 @@ DATABASE_URL="sqlite:////tmp/dev.db" REDISTOGO_URL="redis://localhost:6379" SECRET_KEY="not-so-secret" SENDGRID_API_KEY="optional, but emails won't send without it" +SESSION_COOKIE_SAMESITE=Lax # set this so third-party cookie blocking doesn't kill backend sessions (production) # SESSION_COOKIE_DOMAIN="zfnd.org" diff --git a/backend/app.py b/backend/app.py index ca204ca6..77155ca9 100755 --- a/backend/app.py +++ b/backend/app.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- """Create an application instance.""" +from grant.patches import patch_werkzeug_set_samesite +patch_werkzeug_set_samesite() from grant.app import create_app - app = create_app() diff --git a/backend/grant/admin/example_emails.py b/backend/grant/admin/example_emails.py index f4f9f24b..1adcb0d2 100644 --- a/backend/grant/admin/example_emails.py +++ b/backend/grant/admin/example_emails.py @@ -35,8 +35,17 @@ class FakeUpdate(object): proposal_id = 123 +class FakeCCR(object): + id = 123 + title = 'Example CCR' + brief = 'This is an example CCR' + content = 'Example example example example' + target = "100" + + user = FakeUser() proposal = FakeProposal() +ccr = FakeCCR() milestone = FakeMilestone() contribution = FakeContribution() update = FakeUpdate() @@ -67,16 +76,55 @@ example_email_args = { 'recover_url': 'http://somerecoverurl.com', 'contact_url': 'http://somecontacturl.com', }, + 'proposal_approved_without_funding': { + 'proposal': proposal, + 'proposal_url': 'http://someproposal.com', + 'admin_note': "We've opened up your proposal for community donations.", + }, 'proposal_approved': { 'proposal': proposal, 'proposal_url': 'http://someproposal.com', 'admin_note': 'This proposal was the hottest stuff our team has seen yet. We look forward to throwing the fat stacks at you.', }, + 'proposal_approved_discussion': { + 'proposal': proposal, + 'proposal_url': 'http://someproposal.com', + }, 'proposal_rejected': { 'proposal': proposal, 'proposal_url': 'http://someproposal.com', 'admin_note': 'We think that you’ve asked for too much money for the project you’ve proposed, and for such an inexperienced team. Feel free to change your target amount, or elaborate on why you need so much money, and try applying again.', }, + 'proposal_rejected_discussion': { + 'proposal': proposal, + 'proposal_url': 'http://someproposal.com', + }, + 'proposal_rejected_permanently': { + 'proposal': proposal, + 'proposal_url': 'http://someproposal.com', + 'profile_rejected_url': 'http://someproposal.com/profile?tab=rejected', + 'admin_note': 'We don\'t really think this is needed right now by the ecosystem. Feel free to elaborate and submit again', + }, + 'proposal_arbiter_assigned': { + 'proposal': proposal, + 'proposal_url': 'http://someproposal.com' + }, + 'ccr_approved': { + 'ccr': ccr, + 'ccr_url': 'http://someproposal.com', + 'admin_note': 'This proposal was the hottest stuff our team has seen yet. Great work.', + }, + 'ccr_rejected': { + 'ccr': ccr, + 'ccr_url': 'http://someproposal.com', + 'admin_note': 'We don\'t really think this is needed right now by the ecosystem. Feel free to elaborate and submit again', + }, + 'ccr_rejected_permanently': { + 'ccr': ccr, + 'ccr_url': 'http://someproposal.com', + 'profile_rejected_url': 'http://someproposal.com/profile?tab=rejected', + 'admin_note': 'We don\'t really think this will ever be needed by the ecosystem.', + }, 'proposal_contribution': { 'proposal': proposal, 'contribution': contribution, @@ -174,6 +222,10 @@ example_email_args = { 'proposal': proposal, 'proposal_url': 'https://grants-admin.zfnd.org/proposals/999', }, + 'admin_changes_resolved': { + 'proposal': proposal, + 'proposal_url': 'https://grants-admin.zfnd.org/proposals/999', + }, 'admin_arbiter': { 'proposal': proposal, 'proposal_url': 'https://grants-admin.zfnd.org/proposals/999', @@ -191,4 +243,8 @@ example_email_args = { "proposal": proposal, "proposal_url": "http://someproposal.com", }, + 'followed_proposal_revised': { + "proposal": proposal, + "proposal_url": "http://someproposal.com", + }, } diff --git a/backend/grant/admin/views.py b/backend/grant/admin/views.py index 6fee7186..b74b08fe 100644 --- a/backend/grant/admin/views.py +++ b/backend/grant/admin/views.py @@ -158,19 +158,19 @@ def stats(): .filter(Milestone.stage == MilestoneStage.ACCEPTED) \ .scalar() # Count contributions on proposals that didn't get funded for users who have specified a refund address - contribution_refundable_count = db.session.query(func.count(ProposalContribution.id)) \ - .filter(ProposalContribution.refund_tx_id == None) \ - .filter(ProposalContribution.staking == False) \ - .filter(ProposalContribution.status == ContributionStatus.CONFIRMED) \ - .join(Proposal) \ - .filter(or_( - Proposal.stage == ProposalStage.FAILED, - Proposal.stage == ProposalStage.CANCELED, - )) \ - .join(ProposalContribution.user) \ - .join(UserSettings) \ - .filter(UserSettings.refund_address != None) \ - .scalar() + # contribution_refundable_count = db.session.query(func.count(ProposalContribution.id)) \ + # .filter(ProposalContribution.refund_tx_id == None) \ + # .filter(ProposalContribution.staking == False) \ + # .filter(ProposalContribution.status == ContributionStatus.CONFIRMED) \ + # .join(Proposal) \ + # .filter(or_( + # Proposal.stage == ProposalStage.FAILED, + # Proposal.stage == ProposalStage.CANCELED, + # )) \ + # .join(ProposalContribution.user) \ + # .join(UserSettings) \ + # .filter(UserSettings.refund_address != None) \ + # .scalar() return { "userCount": user_count, "ccrPendingCount": ccr_pending_count, @@ -178,7 +178,7 @@ def stats(): "proposalPendingCount": proposal_pending_count, "proposalNoArbiterCount": proposal_no_arbiter_count, "proposalMilestonePayoutsCount": proposal_milestone_payouts_count, - "contributionRefundableCount": contribution_refundable_count, + "contributionRefundableCount": 0, } @@ -302,6 +302,9 @@ def set_arbiter(proposal_id, user_id): if proposal.is_failed: return {"message": "Cannot set arbiter on failed proposal"}, 400 + if proposal.version == '2' and not proposal.accepted_with_funding: + return {"message": "Cannot set arbiter, proposal has not been accepted with funding"}, 400 + user = User.query.filter(User.id == user_id).first() if not user: return {"message": "User not found"}, 404 @@ -334,7 +337,7 @@ def get_proposals(page, filters, search, sort): filters_workaround = request.args.getlist('filters[]') page = pagination.proposal( schema=proposals_schema, - query=Proposal.query, + query=Proposal.query.filter(Proposal.status.notin_([ProposalStatus.ARCHIVED])), page=page, filters=filters_workaround, search=search, @@ -358,25 +361,96 @@ def delete_proposal(id): return {"message": "Not implemented."}, 400 -@blueprint.route('/proposals//accept', methods=['PUT']) +@blueprint.route('/proposals//discussion', methods=['PUT']) @body({ - "isAccepted": fields.Bool(required=True), - "withFunding": fields.Bool(required=True), + "isOpenForDiscussion": fields.Bool(required=True), "rejectReason": fields.Str(required=False, missing=None) }) @admin.admin_auth_required -def approve_proposal(id, is_accepted, with_funding, reject_reason=None): - proposal = Proposal.query.filter_by(id=id).first() - if proposal: - proposal.approve_pending(is_accepted, with_funding, reject_reason) +def open_proposal_for_discussion(proposal_id, is_open_for_discussion, reject_reason=None): + proposal = Proposal.query.get(proposal_id) + if not proposal: + return {"message": "No Proposal found."}, 404 - if is_accepted and with_funding: + proposal.approve_discussion(is_open_for_discussion, reject_reason) + db.session.commit() + return proposal_schema.dump(proposal) + + +@blueprint.route('/proposals//accept', methods=['PUT']) +@body({ + "isAccepted": fields.Bool(required=True), + "withFunding": fields.Bool(required=False, missing=None), + "changesRequestedReason": fields.Str(required=False, missing=None) +}) +@admin.admin_auth_required +def accept_proposal(id, is_accepted, with_funding, changes_requested_reason): + proposal = Proposal.query.get(id) + if not proposal: + return {"message": "No proposal found."}, 404 + + if is_accepted: + proposal.accept_proposal(with_funding) + + if with_funding: Milestone.set_v2_date_estimates(proposal) + else: + proposal.request_changes_discussion(changes_requested_reason) - db.session.commit() - return proposal_schema.dump(proposal) + db.session.add(proposal) + db.session.commit() + return proposal_schema.dump(proposal) - return {"message": "No proposal found."}, 404 + +@blueprint.route('/proposals//reject_permanently', methods=['PUT']) +@body({ + "rejectReason": fields.Str(required=True, missing=None) +}) +@admin.admin_auth_required +def reject_permanently_proposal(proposal_id, reject_reason): + proposal = Proposal.query.get(proposal_id) + + if not proposal: + return {"message": "No proposal found."}, 404 + + reject_permanently_statuses = [ + ProposalStatus.REJECTED, + ProposalStatus.PENDING + ] + + if proposal.status not in reject_permanently_statuses: + return {"message": "Proposal status is not REJECTED or PENDING."}, 401 + + proposal.status = ProposalStatus.REJECTED_PERMANENTLY + proposal.reject_reason = reject_reason + + db.session.add(proposal) + db.session.commit() + + for user in proposal.team: + send_email(user.email_address, 'proposal_rejected_permanently', { + 'user': user, + 'proposal': proposal, + 'proposal_url': make_url(f'/proposals/{proposal.id}'), + 'admin_note': reject_reason, + 'profile_rejected_url': make_url('/profile?tab=rejected'), + }) + + return proposal_schema.dump(proposal) + + +@blueprint.route('/proposals//resolve', methods=['PUT']) +@admin.admin_auth_required +def resolve_changes_discussion(proposal_id): + proposal = Proposal.query.get(proposal_id) + if not proposal: + return {"message": "No proposal found"}, 404 + + proposal.resolve_changes_discussion() + + db.session.add(proposal) + db.session.commit() + return proposal_schema.dump(proposal) @blueprint.route('/proposals//accept/fund', methods=['PUT']) @@ -536,6 +610,41 @@ def approve_ccr(ccr_id, is_accepted, reject_reason=None): return {"message": "No CCR found."}, 404 +@blueprint.route('/ccrs//reject_permanently', methods=['PUT']) +@body({ + "rejectReason": fields.Str(required=True, missing=None) +}) +@admin.admin_auth_required +def reject_permanently_ccr(ccr_id, reject_reason): + ccr = CCR.query.get(ccr_id) + + if not ccr: + return {"message": "No CCR found."}, 404 + + reject_permanently_statuses = [ + CCRStatus.REJECTED, + CCRStatus.PENDING + ] + + if ccr.status not in reject_permanently_statuses: + return {"message": "CCR status is not REJECTED or PENDING."}, 401 + + ccr.status = CCRStatus.REJECTED_PERMANENTLY + ccr.reject_reason = reject_reason + + db.session.add(ccr) + db.session.commit() + + send_email(ccr.author.email_address, 'ccr_rejected_permanently', { + 'user': ccr.author, + 'ccr': ccr, + 'admin_note': reject_reason, + 'profile_rejected_url': make_url('/profile?tab=rejected') + }) + + return ccr_schema.dump(ccr) + + # Requests for Proposal @@ -809,50 +918,60 @@ def financials(): SELECT SUM(TO_NUMBER(ms.payout_percent, '999')/100 * TO_NUMBER(p.target, '999999.99999999')) FROM milestone as ms INNER JOIN proposal as p ON ms.proposal_id = p.id - WHERE {where} + WHERE p.version = '2' AND {where} ''' def ex(sql: str): res = db.engine.execute(text(sql)) return [row[0] if row[0] else Decimal(0) for row in res][0].normalize() - contributions = { - 'total': str(ex(sql_pc("status = 'CONFIRMED' AND staking = FALSE"))), - 'staking': str(ex(sql_pc("status = 'CONFIRMED' AND staking = TRUE"))), - 'funding': str(ex(sql_pc_p("pc.status = 'CONFIRMED' AND pc.staking = FALSE AND p.stage = 'FUNDING_REQUIRED'"))), - 'funded': str( - ex(sql_pc_p("pc.status = 'CONFIRMED' AND pc.staking = FALSE AND p.stage in ('WIP', 'COMPLETED')"))), - # should have a refund_address - 'refunding': str(ex(sql_pc_p( - ''' - pc.status = 'CONFIRMED' AND - pc.staking = FALSE AND - pc.refund_tx_id IS NULL AND - p.stage IN ('CANCELED', 'FAILED') AND - us.refund_address IS NOT NULL - ''' - ))), - # here we don't care about current refund_address of user, just that there has been a refund_tx_id - 'refunded': str(ex(sql_pc_p( - ''' - pc.status = 'CONFIRMED' AND - pc.staking = FALSE AND - pc.refund_tx_id IS NOT NULL AND - p.stage IN ('CANCELED', 'FAILED') - ''' - ))), - # if there is no user, or the user hasn't any refund_address - 'donations': str(ex(sql_pc_p( - ''' - pc.status = 'CONFIRMED' AND - pc.staking = FALSE AND - pc.refund_tx_id IS NULL AND - (pc.user_id IS NULL OR us.refund_address IS NULL) AND - p.stage IN ('CANCELED', 'FAILED') - ''' - ))), - 'gross': str(ex(sql_pc_p("pc.status = 'CONFIRMED' AND pc.refund_tx_id IS NULL"))), - } + def gen_quarter_date_range(year, quarter): + if quarter == 1: + return f"{year}-1-1", f"{year}-3-31" + if quarter == 2: + return f"{year}-4-1", f"{year}-6-30" + if quarter == 3: + return f"{year}-7-1", f"{year}-9-30" + if quarter == 4: + return f"{year}-10-1", f"{year}-12-31" + + # contributions = { + # 'total': str(ex(sql_pc("status = 'CONFIRMED' AND staking = FALSE"))), + # 'staking': str(ex(sql_pc("status = 'CONFIRMED' AND staking = TRUE"))), + # 'funding': str(ex(sql_pc_p("pc.status = 'CONFIRMED' AND pc.staking = FALSE AND p.stage = 'FUNDING_REQUIRED'"))), + # 'funded': str( + # ex(sql_pc_p("pc.status = 'CONFIRMED' AND pc.staking = FALSE AND p.stage in ('WIP', 'COMPLETED')"))), + # # should have a refund_address + # 'refunding': str(ex(sql_pc_p( + # ''' + # pc.status = 'CONFIRMED' AND + # pc.staking = FALSE AND + # pc.refund_tx_id IS NULL AND + # p.stage IN ('CANCELED', 'FAILED') AND + # us.refund_address IS NOT NULL + # ''' + # ))), + # # here we don't care about current refund_address of user, just that there has been a refund_tx_id + # 'refunded': str(ex(sql_pc_p( + # ''' + # pc.status = 'CONFIRMED' AND + # pc.staking = FALSE AND + # pc.refund_tx_id IS NOT NULL AND + # p.stage IN ('CANCELED', 'FAILED') + # ''' + # ))), + # # if there is no user, or the user hasn't any refund_address + # 'donations': str(ex(sql_pc_p( + # ''' + # pc.status = 'CONFIRMED' AND + # pc.staking = FALSE AND + # pc.refund_tx_id IS NULL AND + # (pc.user_id IS NULL OR us.refund_address IS NULL) AND + # p.stage IN ('CANCELED', 'FAILED') + # ''' + # ))), + # 'gross': str(ex(sql_pc_p("pc.status = 'CONFIRMED' AND pc.refund_tx_id IS NULL"))), + # } po_due = ex(sql_ms("ms.stage = 'ACCEPTED'")) # payments accepted but not yet marked as paid po_paid = ex(sql_ms("ms.stage = 'PAID'")) # will catch paid ms from all proposals regardless of status/stage @@ -860,6 +979,24 @@ def financials(): po_future = ex(sql_ms("ms.stage IN ('IDLE', 'REJECTED', 'REQUESTED') AND p.stage IN ('WIP', 'COMPLETED')")) po_total = po_due + po_paid + po_future + now = datetime.now() + start_year = 2019 + end_year = now.year + + payouts_by_quarter = {} + + for year in range(start_year, end_year + 1): + payouts_by_quarter[f"{year}"] = {} + year_total = 0 + + for quarter in range(1, 5): + begin, end = gen_quarter_date_range(year, quarter) + payouts = ex(sql_ms(f"ms.stage = 'PAID' AND (ms.date_paid BETWEEN '{begin}' AND '{end}')")) + payouts_by_quarter[f"{year}"][f"q{quarter}"] = str(payouts) + year_total += payouts + + payouts_by_quarter[f"{year}"]["year_total"] = str(year_total) + payouts = { 'total': str(po_total), 'due': str(po_due), @@ -876,7 +1013,7 @@ def financials(): def add_str_dec(a: str, b: str): return str((Decimal(a) + Decimal(b)).quantize(Decimal('0.001'), rounding=ROUND_HALF_DOWN)) - proposals = Proposal.query.all() + proposals = Proposal.query.filter_by(version='2') for p in proposals: # CANCELED proposals excluded, though they could have had milestones paid out with grant funds @@ -899,7 +1036,6 @@ def financials(): return { 'grants': grants, - 'contributions': contributions, 'payouts': payouts, - 'net': str(Decimal(contributions['gross']) - Decimal(payouts['paid'])) + 'payouts_by_quarter': payouts_by_quarter } diff --git a/backend/grant/app.py b/backend/grant/app.py index c833b582..f7dca141 100644 --- a/backend/grant/app.py +++ b/backend/grant/app.py @@ -11,6 +11,7 @@ from flask_security import SQLAlchemyUserDatastore from flask_sslify import SSLify from sentry_sdk.integrations.flask import FlaskIntegration from sentry_sdk.integrations.logging import LoggingIntegration + from grant import ( commands, proposal, @@ -20,7 +21,6 @@ from grant import ( milestone, admin, email, - blockchain, task, rfp, e2e, @@ -44,6 +44,8 @@ class JSONResponse(Response): def create_app(config_objects=["grant.settings"]): + from grant.patches import patch_werkzeug_set_samesite + patch_werkzeug_set_samesite() app = Flask(__name__.split(".")[0]) app.response_class = JSONResponse @@ -151,7 +153,6 @@ def register_blueprints(app): app.register_blueprint(milestone.views.blueprint) app.register_blueprint(admin.views.blueprint) app.register_blueprint(email.views.blueprint) - app.register_blueprint(blockchain.views.blueprint) app.register_blueprint(task.views.blueprint) app.register_blueprint(rfp.views.blueprint) app.register_blueprint(home.views.blueprint) diff --git a/backend/grant/blockchain/__init__.py b/backend/grant/blockchain/__init__.py deleted file mode 100644 index 14cd5bd9..00000000 --- a/backend/grant/blockchain/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import views diff --git a/backend/grant/blockchain/views.py b/backend/grant/blockchain/views.py deleted file mode 100644 index 80869e58..00000000 --- a/backend/grant/blockchain/views.py +++ /dev/null @@ -1,14 +0,0 @@ -from flask import Blueprint, current_app - -from grant.blockchain.bootstrap import send_bootstrap_data -from grant.utils.auth import internal_webhook - -blueprint = Blueprint("blockchain", __name__, url_prefix="/api/v1/blockchain") - - -@blueprint.route("/bootstrap", methods=["GET"]) -@internal_webhook -def get_bootstrap_info(): - current_app.logger.info('Bootstrap data requested from blockchain watcher microservice...') - send_bootstrap_data() - return {"message": "ok"}, 200 diff --git a/backend/grant/ccr/views.py b/backend/grant/ccr/views.py index 28c1077a..b05c7379 100644 --- a/backend/grant/ccr/views.py +++ b/backend/grant/ccr/views.py @@ -67,6 +67,7 @@ def delete_ccr(ccr_id): CCRStatus.PENDING, CCRStatus.APPROVED, CCRStatus.REJECTED, + CCRStatus.REJECTED_PERMANENTLY ] status = g.current_ccr.status if status not in deleteable_statuses: diff --git a/backend/grant/email/send.py b/backend/grant/email/send.py index 3d1d7fd3..a86d7b91 100644 --- a/backend/grant/email/send.py +++ b/backend/grant/email/send.py @@ -14,6 +14,7 @@ from .subscription_settings import EmailSubscription, is_subscribed default_template_args = { 'home_url': make_url('/'), 'account_url': make_url('/profile'), + 'profile_rejected_url': make_url('/profile?tab=rejected'), 'email_settings_url': make_url('/profile/settings?tab=emails'), 'unsubscribe_url': make_url('/profile/settings?tab=emails'), } @@ -69,38 +70,94 @@ def change_password_info(email_args): def proposal_approved(email_args): return { - 'subject': 'Your proposal has been reviewed', - 'title': 'Your proposal has been reviewed', - 'preview': '{} is now live on ZF Grants.'.format(email_args['proposal'].title), + 'subject': "Your proposal '{}' has been funded".format(email_args['proposal'].title), + 'title': "Your proposal '{}' has been funded".format(email_args['proposal'].title), + 'preview': "Your proposal '{}' has been funded".format(email_args['proposal'].title), + 'subscription': EmailSubscription.MY_PROPOSAL_APPROVAL + } + + +def proposal_approved_without_funding(email_args): + return { + 'subject': "Your proposal '{}' has been listed on ZF Grants for community donations".format( + email_args['proposal'].title), + 'title': "Your proposal '{}' has been listed on ZF Grants for community donations".format( + email_args['proposal'].title), + 'preview': "Your proposal '{}' has been listed on ZF Grants for community donations".format( + email_args['proposal'].title), + 'subscription': EmailSubscription.MY_PROPOSAL_APPROVAL + } + + +def proposal_approved_discussion(email_args): + return { + 'subject': "Your proposal '{}' has been approved for public discussion".format(email_args['proposal'].title), + 'title': "Your proposal '{}' has been approved for public discussion".format(email_args['proposal'].title), + 'preview': '{} is now open for public discussion on ZF Grants.'.format(email_args['proposal'].title), 'subscription': EmailSubscription.MY_PROPOSAL_APPROVAL } def ccr_approved(email_args): return { - 'subject': 'Your request has been approved!', - 'title': 'Your request has been approved', + 'subject': "Your request '{}' has been approved!".format(email_args['ccr'].title), + 'title': "Your request '{}' has been approved!".format(email_args['ccr'].title), 'preview': '{} will soon be live on ZF Grants!'.format(email_args['ccr'].title), } def ccr_rejected(email_args): return { - 'subject': 'Your request has changes requested', - 'title': 'Your request has changes requested', + 'subject': "Your request '{}' has changes requested".format(email_args['ccr'].title), + 'title': "Your request '{}' has changes requested".format(email_args['ccr'].title), 'preview': '{} has changes requested'.format(email_args['ccr'].title), } +def ccr_rejected_permanently(email_args): + return { + 'subject': "Your request '{}' has been rejected".format(email_args['ccr'].title), + 'title': "Your request '{}' has been rejected".format(email_args['ccr'].title), + 'preview': f'{email_args["ccr"].title} won\'t be accepted', + } + + def proposal_rejected(email_args): return { - 'subject': 'Your proposal has changes requested', - 'title': 'Your proposal has changes requested', + 'subject': "Your proposal '{}' has changes requested".format(email_args['proposal'].title), + 'title': "Your proposal '{}' has changes requested".format(email_args['proposal'].title), 'preview': '{} has changes requested'.format(email_args['proposal'].title), 'subscription': EmailSubscription.MY_PROPOSAL_APPROVAL } +def proposal_rejected_discussion(email_args): + return { + 'subject': "Your proposal '{}' has changes requested".format(email_args['proposal'].title), + 'title': "Your proposal '{}' has changes requested".format(email_args['proposal'].title), + 'preview': '{} has changes requested'.format(email_args['proposal'].title), + 'subscription': EmailSubscription.MY_PROPOSAL_APPROVAL + } + + +def proposal_rejected_permanently(email_args): + return { + 'subject': "Your proposal '{}' has been rejected".format(email_args['proposal'].title), + 'title': "Your proposal '{}' has been rejected".format(email_args['proposal'].title), + 'preview': '{} has been rejected'.format(email_args['proposal'].title), + 'subscription': EmailSubscription.MY_PROPOSAL_APPROVAL + } + + +def proposal_arbiter_assigned(email_args): + return { + 'subject': "Your proposal '{}' is ready for payout requests".format(email_args['proposal'].title), + 'title': "Your proposal '{}' is ready for payout requests".format(email_args['proposal'].title), + 'preview': '{} is ready for payout '.format(email_args['proposal'].title), + 'subscription': EmailSubscription.MY_PROPOSAL_APPROVAL + } + + def proposal_contribution(email_args): if email_args['contribution'].private: email_args['contributor'] = None @@ -118,7 +175,8 @@ def proposal_contribution(email_args): def proposal_comment(email_args): return { - 'subject': 'New comment from {}'.format(email_args['author'].display_name), + 'subject': "New comment from {} to your proposal '{}'".format(email_args['author'].display_name, + email_args['proposal'].title), 'title': 'You got a comment', 'preview': '{} has added a comment to your proposal {}'.format( email_args['author'].display_name, @@ -130,8 +188,8 @@ def proposal_comment(email_args): def proposal_failed(email_args): return { - 'subject': 'Your proposal failed to get funding', - 'title': 'Proposal failed', + 'subject': "Your proposal '{}' failed to get funding".format(email_args['proposal'].title), + 'title': "Your proposal '{}' failed to get funding".format(email_args['proposal'].title), 'preview': 'Your proposal entitled {} failed to get enough funding by the deadline'.format( email_args['proposal'].title, ), @@ -143,7 +201,7 @@ def proposal_canceled(email_args): return { 'subject': 'Your proposal has been canceled', 'title': 'Proposal canceled', - 'preview': 'Your proposal entitled {} has been canceled, and your contributors will be refunded'.format( + 'preview': 'Your proposal entitled {} has been canceled'.format( email_args['proposal'].title, ), } @@ -291,7 +349,7 @@ def milestone_accept(email_args): return { 'subject': f'Payout approved for {p.title} - {ms.title}!', 'title': f'Milestone payout approved', - 'preview': f'The payout of {a} ZEC for milestone {ms.title} has been approved.', + 'preview': f'The payout of ${a} in ZEC for milestone {ms.title} has been approved.', 'subscription': EmailSubscription.MY_PROPOSAL_APPROVAL, } @@ -303,7 +361,7 @@ def milestone_paid(email_args): return { 'subject': f'{p.title} - {ms.title} has been paid!', 'title': f'Milestone paid', - 'preview': f'The milestone {ms.title} payout of {a} ZEC has been paid!', + 'preview': f'The milestone {ms.title} payout of ${a} in ZEC has been paid!', 'subscription': EmailSubscription.MY_PROPOSAL_FUNDED, } @@ -326,6 +384,15 @@ def admin_approval_ccr(email_args): } +def admin_changes_resolved(email_args): + return { + 'subject': f'Changes marked as resolved for {email_args["proposal"].title}', + 'title': f'Changes Resolved', + 'preview': f'Team members of proposal {email_args["proposal"].title} have marked requested changes as resolved.', + 'subscription': EmailSubscription.ADMIN_APPROVAL, + } + + def admin_arbiter(email_args): return { 'subject': f'Arbiter needed for {email_args["proposal"].title}', @@ -365,6 +432,16 @@ def followed_proposal_update(email_args): } +def followed_proposal_revised(email_args): + p = email_args["proposal"] + return { + "subject": f"Proposal '{p.title}' has been revised.", + "title": f"Proposal Revised", + "preview": f"Followed proposal {p.title} has been revised", + "subscription": EmailSubscription.FOLLOWED_PROPOSAL, + } + + get_info_lookup = { 'signup': signup_info, 'team_invite': team_invite_info, @@ -372,10 +449,16 @@ get_info_lookup = { 'change_email': change_email_info, 'change_email_old': change_email_old_info, 'change_password': change_password_info, - 'ccr_rejected': ccr_rejected, 'ccr_approved': ccr_approved, + 'ccr_rejected': ccr_rejected, + 'ccr_rejected_permanently': ccr_rejected_permanently, + 'proposal_approved_without_funding': proposal_approved_without_funding, 'proposal_approved': proposal_approved, + 'proposal_approved_discussion': proposal_approved_discussion, 'proposal_rejected': proposal_rejected, + 'proposal_rejected_discussion': proposal_rejected_discussion, + 'proposal_rejected_permanently': proposal_rejected_permanently, + 'proposal_arbiter_assigned': proposal_arbiter_assigned, 'proposal_contribution': proposal_contribution, 'proposal_comment': proposal_comment, 'proposal_failed': proposal_failed, @@ -396,10 +479,12 @@ get_info_lookup = { 'milestone_paid': milestone_paid, 'admin_approval': admin_approval, 'admin_approval_ccr': admin_approval_ccr, + 'admin_changes_resolved': admin_changes_resolved, 'admin_arbiter': admin_arbiter, 'admin_payout': admin_payout, 'followed_proposal_milestone': followed_proposal_milestone, - 'followed_proposal_update': followed_proposal_update + 'followed_proposal_update': followed_proposal_update, + 'followed_proposal_revised': followed_proposal_revised } diff --git a/backend/grant/milestone/models.py b/backend/grant/milestone/models.py index 48040922..11cea658 100644 --- a/backend/grant/milestone/models.py +++ b/backend/grant/milestone/models.py @@ -83,6 +83,26 @@ class Milestone(db.Model): ) db.session.add(m) + # clone milestones from one proposal to another + @staticmethod + def clone(source_proposal, destination_proposal): + # delete any milestones on destination proposal + [db.session.delete(ms) for ms in destination_proposal.milestones] + + # copy milestones from source proposal to destination proposal + for i, ms in enumerate(source_proposal.milestones): + new_ms = Milestone( + proposal_id=destination_proposal.id, + title=ms.title, + content=ms.content, + days_estimated=ms.days_estimated, + payout_percent=ms.payout_percent, + immediate_payout=ms.immediate_payout, + index=i + ) + db.session.add(new_ms) + + # The purpose of this method is to set the `date_estimated` property on all milestones in a proposal. This works # by figuring out a starting point for each milestone (the `base_date` below) and adding `days_estimated`. # diff --git a/backend/grant/patches.py b/backend/grant/patches.py new file mode 100644 index 00000000..99a222df --- /dev/null +++ b/backend/grant/patches.py @@ -0,0 +1,8 @@ +from werkzeug import http, wrappers + +from grant.werkzeug_http_fork import dump_cookie + + +def patch_werkzeug_set_samesite(): + http.dump_cookie = dump_cookie + wrappers.base_response.dump_cookie = dump_cookie diff --git a/backend/grant/proposal/models.py b/backend/grant/proposal/models.py index c008de18..777bdd08 100644 --- a/backend/grant/proposal/models.py +++ b/backend/grant/proposal/models.py @@ -1,14 +1,16 @@ import datetime +import json from typing import Optional from decimal import Decimal, ROUND_DOWN from functools import reduce from marshmallow import post_dump -from sqlalchemy import func, or_, select +from sqlalchemy import func, or_, select, ForeignKey from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import column_property from grant.comment.models import Comment +from grant.milestone.models import Milestone from grant.email.send import send_email from grant.extensions import ma, db from grant.settings import PROPOSAL_STAKING_AMOUNT, PROPOSAL_TARGET_MAX @@ -19,12 +21,14 @@ from grant.utils.enums import ( Category, ContributionStatus, ProposalArbiterStatus, - MilestoneStage + MilestoneStage, + ProposalChange ) from grant.utils.exceptions import ValidationException from grant.utils.misc import dt_to_unix, make_url, make_admin_url, gen_random_id from grant.utils.requests import blockchain_get from grant.utils.stubs import anonymous_user +from grant.utils.validate import is_z_address_valid proposal_team = db.Table( 'proposal_team', db.Model.metadata, @@ -228,6 +232,111 @@ class ProposalArbiter(db.Model): raise ValidationException('User is not arbiter') +class ProposalRevision(db.Model): + __tablename__ = "proposal_revision" + + id = db.Column(db.Integer(), primary_key=True) + date_created = db.Column(db.DateTime) + + # user who submitted the changes + author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) + author = db.relationship("User", uselist=False, lazy=True) + + # the proposal these changes are associated with + proposal_id = db.Column(db.Integer, db.ForeignKey("proposal.id"), nullable=False) + proposal = db.relationship("Proposal", foreign_keys=[proposal_id], back_populates="revisions") + + # the archived proposal id associated with these changes + proposal_archive_id = db.Column(db.Integer, db.ForeignKey("proposal.id"), nullable=False) + + # the detected changes as a JSON string + changes = db.Column(db.Text, nullable=False) + + # the placement of this revision in the total revisions + revision_index = db.Column(db.Integer) + + def __init__(self, author, proposal_id: int, proposal_archive_id: int, changes: str, revision_index: int): + self.id = gen_random_id(ProposalRevision) + self.date_created = datetime.datetime.now() + self.author = author + self.proposal_id = proposal_id + self.proposal_archive_id = proposal_archive_id + self.changes = changes + self.revision_index = revision_index + + @staticmethod + def calculate_milestone_changes(old_milestones, new_milestones): + changes = [] + old_length = len(old_milestones) + new_length = len(new_milestones) + + # determine the longer milestone collection so we can enumerate it + long_ms = None + short_ms = None + if old_length >= new_length: + long_ms = old_milestones + short_ms = new_milestones + else: + long_ms = new_milestones + short_ms = old_milestones + + # detect whether we're adding or removing milestones + is_adding = False + is_removing = False + if old_length > new_length: + is_removing = True + if new_length > old_length: + is_adding = True + + for i, ms in enumerate(long_ms): + compare_ms = short_ms[i] if len(short_ms) - 1 >= i else None + + # when compare milestone doesn't exist, the current milestone is either being added or removed + if not compare_ms: + if is_adding: + changes.append({"type": ProposalChange.MILESTONE_ADD, "milestone_index": i}) + if is_removing: + changes.append({"type": ProposalChange.MILESTONE_REMOVE, "milestone_index": i}) + continue + + if ms.days_estimated != compare_ms.days_estimated: + changes.append({"type": ProposalChange.MILESTONE_EDIT_DAYS, "milestone_index": i}) + + if ms.immediate_payout != compare_ms.immediate_payout: + changes.append({"type": ProposalChange.MILESTONE_EDIT_IMMEDIATE_PAYOUT, "milestone_index": i}) + + if ms.payout_percent != compare_ms.payout_percent: + changes.append({"type": ProposalChange.MILESTONE_EDIT_PERCENT, "milestone_index": i}) + + if ms.content != compare_ms.content: + changes.append({"type": ProposalChange.MILESTONE_EDIT_CONTENT, "milestone_index": i}) + + if ms.title != compare_ms.title: + changes.append({"type": ProposalChange.MILESTONE_EDIT_TITLE, "milestone_index": i}) + + return changes + + @staticmethod + def calculate_proposal_changes(old_proposal, new_proposal): + proposal_changes = [] + + if old_proposal.brief != new_proposal.brief: + proposal_changes.append({"type": ProposalChange.PROPOSAL_EDIT_BRIEF}) + + if old_proposal.content != new_proposal.content: + proposal_changes.append({"type": ProposalChange.PROPOSAL_EDIT_CONTENT}) + + if old_proposal.target != new_proposal.target: + proposal_changes.append({"type": ProposalChange.PROPOSAL_EDIT_TARGET}) + + if old_proposal.title != new_proposal.title: + proposal_changes.append({"type": ProposalChange.PROPOSAL_EDIT_TITLE}) + + milestone_changes = ProposalRevision.calculate_milestone_changes(old_proposal.milestones, new_proposal.milestones) + + return proposal_changes + milestone_changes + + def default_proposal_content(): return """# Applicant background @@ -283,6 +392,8 @@ class Proposal(db.Model): date_published = db.Column(db.DateTime) reject_reason = db.Column(db.String()) accepted_with_funding = db.Column(db.Boolean(), nullable=True) + changes_requested_discussion = db.Column(db.Boolean(), nullable=True) + changes_requested_discussion_reason = db.Column(db.String(255), nullable=True) # Payment info target = db.Column(db.String(255), nullable=False) @@ -320,6 +431,10 @@ class Proposal(db.Model): .where(proposal_liker.c.proposal_id == id) .correlate_except(proposal_liker) ) + live_draft_parent_id = db.Column(db.Integer, ForeignKey('proposal.id')) + live_draft = db.relationship("Proposal", uselist=False, backref=db.backref('live_draft_parent', remote_side=[id], uselist=False)) + + revisions = db.relationship(ProposalRevision, foreign_keys=[ProposalRevision.proposal_id], lazy=True, cascade="all, delete-orphan") def __init__( self, @@ -407,24 +522,13 @@ class Proposal(db.Model): if self.deadline_duration > 7776000: raise ValidationException("Deadline duration cannot be more than 90 days") - # Check with node that the payout address is kosher - try: - res = blockchain_get('/validate/address', {'address': self.payout_address}) - except: - raise ValidationException( - "Could not validate your payout address due to an internal server error, please try again later") - if not res['valid']: - raise ValidationException("Payout address is not a valid Zcash address") - - if self.tip_jar_address: - # Check with node that the tip jar address is kosher - try: - res = blockchain_get('/validate/address', {'address': self.tip_jar_address}) - except: - raise ValidationException( - "Could not validate your tipping address due to an internal server error, please try again later") - if not res['valid']: - raise ValidationException("Tipping address is not a valid Zcash address") + # Validate payout address + if not is_z_address_valid(self.payout_address): + raise ValidationException("Payout address is not a valid z address") + + # Validate tip jar address + if self.tip_jar_address and not is_z_address_valid(self.tip_jar_address): + raise ValidationException("Tip address is not a valid z address") # Then run through regular validation Proposal.simple_validate(vars(self)) @@ -465,7 +569,7 @@ class Proposal(db.Model): return proposal @staticmethod - def get_by_user(user, statuses=[ProposalStatus.LIVE]): + def get_by_user(user, statuses=[ProposalStatus.LIVE, ProposalStatus.DISCUSSION]): status_filter = or_(Proposal.status == v for v in statuses) return Proposal.query \ .join(proposal_team) \ @@ -578,39 +682,19 @@ class Proposal(db.Model): db.session.add(self) db.session.flush() - # state: status PENDING -> (LIVE || REJECTED) - def approve_pending(self, is_approve, with_funding, reject_reason=None): - self.validate_publishable() - # specific validation + # approve a proposal moving from PENDING to DISCUSSION status + # state: status PENDING -> (DISCUSSION || REJECTED) + def approve_discussion(self, is_open_for_discussion, reject_reason=None): if not self.status == ProposalStatus.PENDING: - raise ValidationException(f"Proposal must be pending to approve or reject") + raise ValidationException("Proposal must be pending to open for public discussion") - if is_approve: - self.status = ProposalStatus.LIVE - self.date_approved = datetime.datetime.now() - self.accepted_with_funding = with_funding - - # also update date_published and stage since publish() is no longer called by user - self.date_published = datetime.datetime.now() - self.stage = ProposalStage.WIP - - if with_funding: - self.fully_fund_contibution_bounty() + if is_open_for_discussion: + self.status = ProposalStatus.DISCUSSION for t in self.team: - admin_note = '' - if with_funding: - admin_note = 'Congratulations! Your proposal has been accepted with funding from the Zcash Foundation.' - else: - admin_note = ''' - We've chosen to list your proposal on ZF Grants, but we won't be funding your proposal at this time. - Your proposal can still receive funding from the community in the form of tips if you have set a tip address for your proposal. - If you have not yet done so, you can do this from the actions dropdown at your proposal. - ''' - send_email(t.email_address, 'proposal_approved', { + send_email(t.email_address, 'proposal_approved_discussion', { 'user': t, 'proposal': self, - 'proposal_url': make_url(f'/proposals/{self.id}'), - 'admin_note': admin_note + 'proposal_url': make_url(f'/proposals/{self.id}') }) else: if not reject_reason: @@ -625,6 +709,73 @@ class Proposal(db.Model): 'admin_note': reject_reason }) + # request changes for a proposal with a DISCUSSION status + def request_changes_discussion(self, reason): + if self.status != ProposalStatus.DISCUSSION: + raise ValidationException("Proposal does not have a DISCUSSION status") + if not reason: + raise ValidationException("Please provide a reason for requesting changes") + + self.changes_requested_discussion = True + self.changes_requested_discussion_reason = reason + for t in self.team: + send_email(t.email_address, 'proposal_rejected_discussion', { + 'user': t, + 'proposal': self, + 'proposal_url': make_url(f'/proposals/{self.id}'), + 'admin_note': reason + }) + + # mark a request changes as resolve for a proposal with a DISCUSSION status + def resolve_changes_discussion(self): + if self.status != ProposalStatus.DISCUSSION: + raise ValidationException("Proposal does not have a DISCUSSION status") + + if not self.changes_requested_discussion: + raise ValidationException("Proposal does not have changes requested") + + self.changes_requested_discussion = False + self.changes_requested_discussion_reason = None + + # state: status DISCUSSION -> (LIVE) + def accept_proposal(self, with_funding): + self.validate_publishable() + # specific validation + if not self.status == ProposalStatus.DISCUSSION: + raise ValidationException(f"Proposal must have a DISCUSSION status to approve or reject") + + self.status = ProposalStatus.LIVE + self.date_approved = datetime.datetime.now() + self.accepted_with_funding = with_funding + + # also update date_published and stage since publish() is no longer called by user + self.date_published = datetime.datetime.now() + self.stage = ProposalStage.WIP + + if with_funding: + self.fully_fund_contibution_bounty() + for t in self.team: + if with_funding: + admin_note = 'Congratulations! Your proposal has been accepted with funding from the Zcash Foundation.' + send_email(t.email_address, 'proposal_approved', { + 'user': t, + 'proposal': self, + 'proposal_url': make_url(f'/proposals/{self.id}'), + 'admin_note': admin_note + }) + else: + admin_note = ''' + We've chosen to list your proposal on ZF Grants, but we won't be funding your proposal at this time. + Your proposal can still receive funding from the community in the form of tips if you have set a tip address for your proposal. + If you have not yet done so, you can do this from the actions dropdown at your proposal. + ''' + send_email(t.email_address, 'proposal_approved_without_funding', { + 'user': t, + 'proposal': self, + 'proposal_url': make_url(f'/proposals/{self.id}'), + 'admin_note': admin_note + }) + def update_proposal_with_funding(self): self.accepted_with_funding = True self.fully_fund_contibution_bounty() @@ -803,6 +954,105 @@ class Proposal(db.Model): else: return self.tip_jar_view_key + # make a LIVE_DRAFT proposal by copying the relevant fields from an existing proposal + @staticmethod + def make_live_draft(proposal): + live_draft_proposal = Proposal.create( + title=proposal.title, + brief=proposal.brief, + content=proposal.content, + target=proposal.target, + payout_address=proposal.payout_address, + status=ProposalStatus.LIVE_DRAFT + ) + live_draft_proposal.tip_jar_address = proposal.tip_jar_address + live_draft_proposal.changes_requested_discussion_reason = proposal.changes_requested_discussion_reason + live_draft_proposal.rfp_opt_in = proposal.rfp_opt_in + live_draft_proposal.team = proposal.team + + db.session.add(live_draft_proposal) + + Milestone.clone(proposal, live_draft_proposal) + + return live_draft_proposal + + # port changes made in LIVE_DRAFT proposal to self and delete the draft + def consume_live_draft(self, author): + if self.status != ProposalStatus.DISCUSSION: + raise ValidationException("Proposal is not open for public review") + + live_draft = self.live_draft + revision_changes = ProposalRevision.calculate_proposal_changes(self, live_draft) + + if len(revision_changes) == 0: + if live_draft.rfp_opt_in == self.rfp_opt_in \ + and live_draft.payout_address == self.payout_address \ + and live_draft.tip_jar_address == self.tip_jar_address \ + and live_draft.team == self.team: + + raise ValidationException("Live draft does not appear to have any changes") + else: + # cover special cases where properties not tracked in revisions have changed: + self.rfp_opt_in = live_draft.rfp_opt_in + self.payout_address = live_draft.payout_address + self.tip_jar_address = live_draft.tip_jar_address + self.team = live_draft.team + self.live_draft = None + db.session.add(self) + db.session.delete(live_draft) + return False + + # if this is the first revision, create a base revision that's a snapshot of the original proposal + if len(self.revisions) == 0: + base_draft = self.make_live_draft(self) + base_draft.status = ProposalStatus.ARCHIVED + base_draft.invites = [] + + db.session.add(base_draft) + + base_revision = ProposalRevision( + author=author, + proposal_id=self.id, + proposal_archive_id=base_draft.id, + changes=json.dumps([]), + revision_index=0 + ) + self.revisions.append(base_revision) + + revision_index = len(self.revisions) + + revision = ProposalRevision( + author=author, + proposal_id=self.id, + proposal_archive_id=live_draft.id, + changes=json.dumps(revision_changes), + revision_index=revision_index + ) + + self.title = live_draft.title + self.brief = live_draft.brief + self.content = live_draft.content + self.target = live_draft.target + self.payout_address = live_draft.payout_address + self.tip_jar_address = live_draft.tip_jar_address + self.rfp_opt_in = live_draft.rfp_opt_in + self.team = live_draft.team + self.invites = [] + self.live_draft = None + + self.revisions.append(revision) + + db.session.add(self) + + # copy milestones + Milestone.clone(live_draft, self) + + # archive live draft + live_draft.status = ProposalStatus.ARCHIVED + live_draft.invites = [] + db.session.add(live_draft) + return True + class ProposalSchema(ma.Schema): class Meta: @@ -843,7 +1093,10 @@ class ProposalSchema(ma.Schema): "authed_liked", "likes_count", "tip_jar_address", - "tip_jar_view_key" + "tip_jar_view_key", + "changes_requested_discussion", + "changes_requested_discussion_reason", + "live_draft_id" ) date_created = ma.Method("get_date_created") @@ -852,6 +1105,7 @@ class ProposalSchema(ma.Schema): proposal_id = ma.Method("get_proposal_id") is_version_two = ma.Method("get_is_version_two") tip_jar_view_key = ma.Method("get_tip_jar_view_key") + live_draft_id = ma.Method("get_live_draft_id") updates = ma.Nested("ProposalUpdateSchema", many=True) team = ma.Nested("UserSchema", many=True) @@ -879,6 +1133,10 @@ class ProposalSchema(ma.Schema): def get_tip_jar_view_key(self, obj): return obj.get_tip_jar_view_key + def get_live_draft_id(self, obj): + return obj.live_draft.id if obj.live_draft else None + + proposal_schema = ProposalSchema() proposals_schema = ProposalSchema(many=True) user_fields = [ @@ -894,6 +1152,7 @@ user_fields = [ "date_approved", "date_published", "reject_reason", + "changes_requested_discussion_reason", "team", "accepted_with_funding", "is_version_two", @@ -934,6 +1193,40 @@ proposal_update_schema = ProposalUpdateSchema() proposals_update_schema = ProposalUpdateSchema(many=True) +class ProposalRevisionSchema(ma.Schema): + class Meta: + model = ProposalRevision + # Fields to expose + fields = ( + "revision_id", + "date_created", + "author", + "proposal_id", + "proposal_archive_id", + "changes", + "revision_index" + ) + + revision_id = ma.Method("get_revision_id") + date_created = ma.Method("get_date_created") + changes = ma.Method("get_changes") + + author = ma.Nested("UserSchema") + + def get_revision_id(self, obj): + return obj.id + + def get_date_created(self, obj): + return dt_to_unix(obj.date_created) + + def get_changes(self, obj): + return json.loads(obj.changes) + + +proposal_revision_schema = ProposalRevisionSchema() +proposals_revisions_schema = ProposalRevisionSchema(many=True) + + class ProposalTeamInviteSchema(ma.Schema): class Meta: model = ProposalTeamInvite diff --git a/backend/grant/proposal/views.py b/backend/grant/proposal/views.py index 90b460bc..17421e3a 100644 --- a/backend/grant/proposal/views.py +++ b/backend/grant/proposal/views.py @@ -25,7 +25,7 @@ from grant.utils.auth import ( get_authed_user, internal_webhook ) -from grant.utils.requests import validate_blockchain_get +from grant.utils.validate import is_z_address_valid from grant.utils.enums import Category from grant.utils.enums import ProposalStatus, ProposalStage, ContributionStatus, RFPStatus from grant.utils.exceptions import ValidationException @@ -36,11 +36,13 @@ from .models import ( proposal_schema, ProposalUpdate, proposal_update_schema, + proposals_revisions_schema, ProposalContribution, proposal_contribution_schema, proposal_team, ProposalTeamInvite, proposal_team_invite_schema, + proposal_team_invites_schema, proposal_proposal_contributions_schema, db, ) @@ -52,7 +54,9 @@ blueprint = Blueprint("proposal", __name__, url_prefix="/api/v1/proposals") def get_proposal(proposal_id): proposal = Proposal.query.filter_by(id=proposal_id).first() if proposal: - if proposal.status != ProposalStatus.LIVE: + if proposal.status == ProposalStatus.ARCHIVED: + return {"message": "Proposal has been archived"}, 401 + if proposal.status not in [ProposalStatus.LIVE, ProposalStatus.DISCUSSION]: if proposal.status == ProposalStatus.DELETED: return {"message": "Proposal was deleted"}, 404 authed_user = get_authed_user() @@ -64,6 +68,19 @@ def get_proposal(proposal_id): return {"message": "No proposal matching id"}, 404 +@blueprint.route("//archive", methods=["GET"]) +def get_archived_proposal(proposal_id): + proposal = Proposal.query.get(proposal_id) + + if not proposal: + return {"message": "No proposal matching id"}, 404 + + if proposal.status != ProposalStatus.ARCHIVED: + return {"message": "Proposal is not archived"}, 401 + + return proposal_schema.dump(proposal) + + @blueprint.route("//comments", methods=["GET"]) @query(paginated_fields) def get_proposal_comments(proposal_id, page, filters, search, sort): @@ -110,8 +127,8 @@ def post_proposal_comments(proposal_id, comment, parent_comment_id): if not proposal: return {"message": "No proposal matching id"}, 404 - if proposal.status != ProposalStatus.LIVE: - return {"message": "Proposal must be live to comment"}, 400 + if proposal.status != ProposalStatus.LIVE and proposal.status != ProposalStatus.DISCUSSION: + return {"message": "Proposal must be live or open for public review to comment"}, 400 # Make sure the parent comment exists parent = None @@ -164,7 +181,10 @@ def post_proposal_comments(proposal_id, comment, parent_comment_id): @query(paginated_fields) def get_proposals(page, filters, search, sort): filters_workaround = request.args.getlist('filters[]') - query = Proposal.query.filter_by(status=ProposalStatus.LIVE) \ + query = Proposal.query.filter(or_( + Proposal.status == ProposalStatus.LIVE, + Proposal.status == ProposalStatus.DISCUSSION + )) \ .filter(Proposal.stage != ProposalStage.CANCELED) \ .filter(Proposal.stage != ProposalStage.FAILED) page = pagination.proposal( @@ -207,6 +227,22 @@ def make_proposal_draft(rfp_id): return proposal_schema.dump(proposal), 201 +@blueprint.route("//draft", methods=["POST"]) +@requires_team_member_auth +def make_proposal_live_draft(proposal_id): + proposal = g.current_proposal + + if proposal.status != ProposalStatus.DISCUSSION: + return {"message": "Proposal does not have a DISCUSSION status"}, 404 + + if not proposal.live_draft: + proposal.live_draft = Proposal.make_live_draft(proposal) + db.session.add(proposal) + db.session.commit() + + return proposal_schema.dump(proposal.live_draft), 201 + + @blueprint.route("/drafts", methods=["GET"]) @requires_auth def get_proposal_drafts(): @@ -215,6 +251,7 @@ def get_proposal_drafts(): .filter(or_( Proposal.status == ProposalStatus.DRAFT, Proposal.status == ProposalStatus.REJECTED, + Proposal.status == ProposalStatus.LIVE_DRAFT )) .join(proposal_team) .filter(proposal_team.c.user_id == g.current_user.id) @@ -241,6 +278,7 @@ def update_proposal(milestones, proposal_id, rfp_opt_in, **kwargs): # Update the base proposal fields try: if g.current_proposal.status not in [ProposalStatus.DRAFT, + ProposalStatus.LIVE_DRAFT, ProposalStatus.REJECTED]: raise ValidationException( f"Proposal with status: {g.current_proposal.status} are not authorized for updates" @@ -261,6 +299,21 @@ def update_proposal(milestones, proposal_id, rfp_opt_in, **kwargs): return proposal_schema.dump(g.current_proposal), 200 +@blueprint.route("//resolve", methods=["PUT"]) +@requires_team_member_auth +def resolve_changes_discussion(proposal_id): + proposal = Proposal.query.get(proposal_id) + if not proposal: + return {"message": "No proposal found"}, 404 + + proposal.resolve_changes_discussion() + db.session.add(proposal) + db.session.commit() + + proposal.send_admin_email('admin_changes_resolved') + return proposal_schema.dump(proposal) + + @blueprint.route("//tips", methods=["PUT"]) @requires_team_member_auth @body({ @@ -268,11 +321,11 @@ def update_proposal(milestones, proposal_id, rfp_opt_in, **kwargs): "viewKey": fields.Str(required=False, missing=None) }) def update_proposal_tip_jar(proposal_id, address, view_key): + if address is not None and address is not '' and not is_z_address_valid(address): + return {"message": "Tip address is not a valid z address"}, 400 if address is not None: - if address is not '': - validate_blockchain_get('/validate/address', {'address': address}) - g.current_proposal.tip_jar_address = address + if view_key is not None: g.current_proposal.tip_jar_view_key = view_key @@ -299,6 +352,7 @@ def delete_proposal(proposal_id): deleteable_statuses = [ ProposalStatus.DRAFT, ProposalStatus.PENDING, + ProposalStatus.REJECTED_PERMANENTLY, ProposalStatus.APPROVED, ProposalStatus.REJECTED, ProposalStatus.STAKING, @@ -339,6 +393,42 @@ def publish_proposal(proposal_id): return proposal_schema.dump(g.current_proposal), 200 +@blueprint.route("//publish/live", methods=["PUT"]) +@requires_team_member_auth +def publish_live_draft(proposal_id): + if g.current_proposal.status != ProposalStatus.LIVE_DRAFT: + return {"message": "Proposal is not a live draft"}, 403 + + if not g.current_proposal.live_draft_parent_id: + return {"message": "No parent proposal found"}, 404 + + parent_proposal = Proposal.query.get(g.current_proposal.live_draft_parent_id) + + if not parent_proposal: + return {"message": "No proposal matching id"}, 404 + + # TODO: double check this isn't needed: + # + # if g.current_user not in proposal.team: + # return {"message": "You are not a team member of this proposal"} + + try: + parent_proposal.live_draft.validate_publishable() + except ValidationException as e: + return {"message": "{}".format(str(e))}, 400 + + had_revisions = parent_proposal.consume_live_draft(g.current_user) + db.session.commit() + + # Send email to all followers if revisions were detected + if had_revisions: + parent_proposal.send_follower_email( + "followed_proposal_revised", url_suffix="?tab=revisions" + ) + + return proposal_schema.dump(parent_proposal), 200 + + @blueprint.route("//updates", methods=["GET"]) def get_proposal_updates(proposal_id): proposal = Proposal.query.filter_by(id=proposal_id).first() @@ -362,6 +452,26 @@ def get_proposal_update(proposal_id, update_id): return {"message": "No proposal matching id"}, 404 +@blueprint.route("//revisions", methods=["GET"]) +def get_proposal_revisions(proposal_id): + proposal = Proposal.query.get(proposal_id) + + if not proposal: + return {"message": "No proposal matching id"}, 404 + + if proposal.status in [ProposalStatus.DRAFT, ProposalStatus.REJECTED]: + return {"message": "Proposal is not live"}, 400 + + def sort_by_revision_index(r): + return r.revision_index + + revisions = proposal.revisions + revisions.sort(key=sort_by_revision_index) + + dumped_revisions = proposals_revisions_schema.dump(revisions) + return dumped_revisions + + @blueprint.route("//updates", methods=["POST"]) @limiter.limit("5/day;1/minute") @requires_team_member_auth @@ -395,6 +505,16 @@ def post_proposal_update(proposal_id, title, content): return dumped_update, 201 +@blueprint.route("//invites", methods=["GET"]) +@requires_team_member_auth +def get_proposal_team_invites(proposal_id): + proposal_dump = proposal_schema.dump(g.current_proposal) + return { + "team": proposal_dump["team"], + "invites": proposal_dump["invites"] + } + + @blueprint.route("//invite", methods=["POST"]) @limiter.limit("30/day;10/minute") @requires_team_member_auth @@ -710,8 +830,8 @@ def like_proposal(proposal_id, is_liked): if not proposal: return {"message": "No proposal matching id"}, 404 - if not proposal.status == ProposalStatus.LIVE: - return {"message": "Cannot like a proposal that's not live"}, 404 + if proposal.status not in [ProposalStatus.LIVE, ProposalStatus.DISCUSSION]: + return {"message": "Cannot like a proposal that's not live or in discussion"}, 404 proposal.like(user, is_liked) db.session.commit() diff --git a/backend/grant/settings.py b/backend/grant/settings.py index 687fdc92..8e50887b 100644 --- a/backend/grant/settings.py +++ b/backend/grant/settings.py @@ -31,6 +31,8 @@ SQLALCHEMY_TRACK_MODIFICATIONS = False # so backend session cookies are first-party SESSION_COOKIE_DOMAIN = env.str('SESSION_COOKIE_DOMAIN', default=None) CORS_DOMAINS = env.str('CORS_DOMAINS', default='*') +SESSION_COOKIE_SAMESITE = env.str('SESSION_COOKIE_SAMESITE', default='None') +SESSION_COOKIE_SECURE = True if SESSION_COOKIE_SAMESITE == 'None' else False SENDGRID_API_KEY = env.str("SENDGRID_API_KEY", default="") SENDGRID_DEFAULT_FROM = "noreply@grants.zfnd.org" diff --git a/backend/grant/templates/emails/admin_changes_resolved.html b/backend/grant/templates/emails/admin_changes_resolved.html new file mode 100644 index 00000000..4eb0c40e --- /dev/null +++ b/backend/grant/templates/emails/admin_changes_resolved.html @@ -0,0 +1,33 @@ +

+ Team members of proposal + + {{ args.proposal.title }} + have marked requested changes as resolved. As an admin you can help out by reviewing it. +

+ + + + + +
+ + + + +
+ + Review Proposal + +
+
diff --git a/backend/grant/templates/emails/admin_changes_resolved.txt b/backend/grant/templates/emails/admin_changes_resolved.txt new file mode 100644 index 00000000..9279f383 --- /dev/null +++ b/backend/grant/templates/emails/admin_changes_resolved.txt @@ -0,0 +1,5 @@ +Team members of proposal {{ args.proposal.title }} have marked requested changes as resolved. + +As an admin you can help out by reviewing it. + +Visit the proposal and review: {{ args.proposal_url }} diff --git a/backend/grant/templates/emails/ccr_approved.html b/backend/grant/templates/emails/ccr_approved.html index 42a942cc..1efe52fe 100644 --- a/backend/grant/templates/emails/ccr_approved.html +++ b/backend/grant/templates/emails/ccr_approved.html @@ -4,7 +4,7 @@ {% if args.admin_note %}

- A note from the admin team was attached to your approval: + A note from the Zcash Foundation:

“{{ args.admin_note }}” diff --git a/backend/grant/templates/emails/ccr_approved.txt b/backend/grant/templates/emails/ccr_approved.txt index 5dc43e75..3d802055 100644 --- a/backend/grant/templates/emails/ccr_approved.txt +++ b/backend/grant/templates/emails/ccr_approved.txt @@ -1,7 +1,7 @@ Congratulations on your approval! We look forward to seeing proposals that are generated as a result of your request. {% if args.admin_note %} -A note from the admin team was attached to your approval: +A note from the Zcash Foundation: > {{ args.admin_note }} {% endif %} diff --git a/backend/grant/templates/emails/ccr_rejected.html b/backend/grant/templates/emails/ccr_rejected.html index 9d5f0db3..0c930087 100644 --- a/backend/grant/templates/emails/ccr_rejected.html +++ b/backend/grant/templates/emails/ccr_rejected.html @@ -5,7 +5,7 @@ {% if args.admin_note %}

- A note from the admin team was attached to your rejection: + A note from the Zcash Foundation:

“{{ args.admin_note }}” diff --git a/backend/grant/templates/emails/ccr_rejected.txt b/backend/grant/templates/emails/ccr_rejected.txt index 6a542201..add29f3b 100644 --- a/backend/grant/templates/emails/ccr_rejected.txt +++ b/backend/grant/templates/emails/ccr_rejected.txt @@ -2,7 +2,7 @@ Your request has changes requested. You're free to modify it and try submitting again. {% if args.admin_note %} -A note from the admin team was attached to your rejection: +A note from the Zcash Foundation: > {{ args.admin_note }} {% endif %} diff --git a/backend/grant/templates/emails/ccr_rejected_permanently.html b/backend/grant/templates/emails/ccr_rejected_permanently.html new file mode 100644 index 00000000..33b0e6c5 --- /dev/null +++ b/backend/grant/templates/emails/ccr_rejected_permanently.html @@ -0,0 +1,13 @@ +

+ Your request has been rejected. Your request won't be publicly visible on ZF Grants. + Visit your profile to delete this request. +

+ +{% if args.admin_note %} +

+ A note from the Zcash Foundation: +

+

+ “{{ args.admin_note }}” +

+{% endif %} diff --git a/backend/grant/templates/emails/ccr_rejected_permanently.txt b/backend/grant/templates/emails/ccr_rejected_permanently.txt new file mode 100644 index 00000000..351f722f --- /dev/null +++ b/backend/grant/templates/emails/ccr_rejected_permanently.txt @@ -0,0 +1,9 @@ +Your request has been rejected. Your request won't be publicly visible on ZF Grants. Visit your profile to delete this request: + +{{ args.profile_rejected_url }} + +{% if args.admin_note %} +A note from the Zcash Foundation: + +> {{ args.admin_note }} +{% endif %} diff --git a/backend/grant/templates/emails/followed_proposal_revised.html b/backend/grant/templates/emails/followed_proposal_revised.html new file mode 100644 index 00000000..f7dd9db0 --- /dev/null +++ b/backend/grant/templates/emails/followed_proposal_revised.html @@ -0,0 +1,29 @@ +

+ Your followed proposal {{ args.proposal.title }} has been revised! +

+ + + + + +
+ + + + +
+ + Check it out + +
+
diff --git a/backend/grant/templates/emails/followed_proposal_revised.txt b/backend/grant/templates/emails/followed_proposal_revised.txt new file mode 100644 index 00000000..ef9887ed --- /dev/null +++ b/backend/grant/templates/emails/followed_proposal_revised.txt @@ -0,0 +1,3 @@ +Your followed proposal {{ args.proposal.title }} has been revised! + +Check it out: {{ args.proposal_url }} \ No newline at end of file diff --git a/backend/grant/templates/emails/milestone_accept.html b/backend/grant/templates/emails/milestone_accept.html index 93ee87b2..a96d409f 100644 --- a/backend/grant/templates/emails/milestone_accept.html +++ b/backend/grant/templates/emails/milestone_accept.html @@ -3,7 +3,7 @@ {{ args.proposal.title }} - {{ args.proposal.current_milestone.title }} - payout of {{ args.amount }} ZEC has been approved. + payout of ${{ args.amount }} in ZEC has been approved.

diff --git a/backend/grant/templates/emails/milestone_accept.txt b/backend/grant/templates/emails/milestone_accept.txt index a087f88d..7252a01a 100644 --- a/backend/grant/templates/emails/milestone_accept.txt +++ b/backend/grant/templates/emails/milestone_accept.txt @@ -1,5 +1,5 @@ The proposal milestone "{{ args.proposal.title }} - {{args.proposal.current_milestone.title }}" -payout of {{args.amount}} ZEC has been approved! +payout of ${{args.amount}} in ZEC has been approved! You will receive payment shortly! diff --git a/backend/grant/templates/emails/milestone_paid.html b/backend/grant/templates/emails/milestone_paid.html index 572aee3c..353f57e5 100644 --- a/backend/grant/templates/emails/milestone_paid.html +++ b/backend/grant/templates/emails/milestone_paid.html @@ -1,5 +1,5 @@

- Hooray! {{ args.amount }} ZEC has been paid out for + Hooray! ${{ args.amount }} in ZEC has been paid out for {{ args.proposal.title }} - {{ args.milestone.title }}! You can view the transaction below: diff --git a/backend/grant/templates/emails/milestone_paid.txt b/backend/grant/templates/emails/milestone_paid.txt index 2fc1044b..0c167bca 100644 --- a/backend/grant/templates/emails/milestone_paid.txt +++ b/backend/grant/templates/emails/milestone_paid.txt @@ -1,4 +1,4 @@ -Hooray! {{args.amount}} ZEC has been paid out for "{{ args.proposal.title }} - {{args.milestone.title }}"! +Hooray! ${{args.amount}} in ZEC has been paid out for "{{ args.proposal.title }} - {{args.milestone.title }}"! You can view the transaction below: {{ args.tx_explorer_url }} diff --git a/backend/grant/templates/emails/proposal_approved.html b/backend/grant/templates/emails/proposal_approved.html index 84f07632..a1e46e87 100644 --- a/backend/grant/templates/emails/proposal_approved.html +++ b/backend/grant/templates/emails/proposal_approved.html @@ -1,10 +1,10 @@

- Your proposal has been reviewed by the Zcash Foundation and is now listed on ZF Grants! + Congratulations, your proposal has been funded by the Zcash Foundation! Once an arbiter is selected by the Foundation, you'll be able to request payouts according to your grant's milestone schedule.

{% if args.admin_note %}

- A note from the admin team was attached to your approval: + A note from the Zcash Foundation:

“{{ args.admin_note }}” diff --git a/backend/grant/templates/emails/proposal_approved.txt b/backend/grant/templates/emails/proposal_approved.txt index 7080ed43..497ffa10 100644 --- a/backend/grant/templates/emails/proposal_approved.txt +++ b/backend/grant/templates/emails/proposal_approved.txt @@ -1,8 +1,8 @@ -Your proposal has been reviewed by the Zcash Foundation and is now listed on ZF Grants! +Congratulations, your proposal has been funded by the Zcash Foundation! Once an arbiter is selected by the Foundation, you'll be able to request payouts according to your grant's milestone schedule. {% if args.admin_note %} -A note from the admin team was attached to your approval: +A note from the Zcash Foundation: > {{ args.admin_note }} {% endif %} diff --git a/backend/grant/templates/emails/proposal_approved_discussion.html b/backend/grant/templates/emails/proposal_approved_discussion.html new file mode 100644 index 00000000..da4a2ad7 --- /dev/null +++ b/backend/grant/templates/emails/proposal_approved_discussion.html @@ -0,0 +1,13 @@ +

+ Your proposal has been approved for public discussion and community feedback on ZF Grants. The Zcash Foundation reviews open grant applications on an ongoing basis, and may request additional revisions based on open feedback before making a final funding determination. +

+ +{% if args.admin_note %} +

+ A note from the Zcash Foundation: +

+

+ “{{ args.admin_note }}” +

+{% endif %} + diff --git a/backend/grant/templates/emails/proposal_approved_discussion.txt b/backend/grant/templates/emails/proposal_approved_discussion.txt new file mode 100644 index 00000000..3770ace5 --- /dev/null +++ b/backend/grant/templates/emails/proposal_approved_discussion.txt @@ -0,0 +1,10 @@ +Your proposal has been approved for public discussion and community feedback on ZF Grants. The Zcash Foundation reviews open grant applications on an ongoing basis, and may request additional revisions based on open feedback before making a final funding determination. + + +{% if args.admin_note %} +A note from the Zcash Foundation: + +> {{ args.admin_note }} +{% endif %} + +{{ args.proposal_url }} \ No newline at end of file diff --git a/backend/grant/templates/emails/proposal_approved_without_funding.html b/backend/grant/templates/emails/proposal_approved_without_funding.html new file mode 100644 index 00000000..5e3312bf --- /dev/null +++ b/backend/grant/templates/emails/proposal_approved_without_funding.html @@ -0,0 +1,13 @@ +

+ Your proposal has been reviewed by the Zcash Foundation and has been listed on ZF Grants for community donations. Although the Zcash Foundation won't be providing funding to your proposal directly, the community will have an opportunity to provide funding to your 'tip address'. +

+ +{% if args.admin_note %} +

+ A note from the Zcash Foundation: +

+

+ “{{ args.admin_note }}” +

+{% endif %} + diff --git a/backend/grant/templates/emails/proposal_approved_without_funding.txt b/backend/grant/templates/emails/proposal_approved_without_funding.txt new file mode 100644 index 00000000..18aca95d --- /dev/null +++ b/backend/grant/templates/emails/proposal_approved_without_funding.txt @@ -0,0 +1,10 @@ +Your proposal has been reviewed by the Zcash Foundation and is now listed on ZF Grants! + + +{% if args.admin_note %} +A note from the Zcash Foundation: + +> {{ args.admin_note }} +{% endif %} + +{{ args.proposal_url }} \ No newline at end of file diff --git a/backend/grant/templates/emails/proposal_arbiter_assigned.html b/backend/grant/templates/emails/proposal_arbiter_assigned.html new file mode 100644 index 00000000..04dc6593 --- /dev/null +++ b/backend/grant/templates/emails/proposal_arbiter_assigned.html @@ -0,0 +1,6 @@ +

+ Your proposal {{ args.proposal.title }} is ready for payout requests. + + Visit your proposal to see more. +

diff --git a/backend/grant/templates/emails/proposal_arbiter_assigned.txt b/backend/grant/templates/emails/proposal_arbiter_assigned.txt new file mode 100644 index 00000000..7a1cf279 --- /dev/null +++ b/backend/grant/templates/emails/proposal_arbiter_assigned.txt @@ -0,0 +1,5 @@ +Your proposal {{ args.proposal.title }} is ready for payout requests. + +Visit your proposal to see more: + +{{ args.proposal_url }} \ No newline at end of file diff --git a/backend/grant/templates/emails/proposal_rejected.html b/backend/grant/templates/emails/proposal_rejected.html index ea363c62..34eb98c9 100644 --- a/backend/grant/templates/emails/proposal_rejected.html +++ b/backend/grant/templates/emails/proposal_rejected.html @@ -5,7 +5,7 @@ {% if args.admin_note %}

- A note from the admin team was attached to your rejection: + A note from the Zcash Foundation:

“{{ args.admin_note }}” diff --git a/backend/grant/templates/emails/proposal_rejected.txt b/backend/grant/templates/emails/proposal_rejected.txt index 39488aee..511bd9e2 100644 --- a/backend/grant/templates/emails/proposal_rejected.txt +++ b/backend/grant/templates/emails/proposal_rejected.txt @@ -2,7 +2,7 @@ Your proposal has changes requested. You're free to modify it and try submitting again. {% if args.admin_note %} -A note from the admin team was attached to your rejection: +A note from the Zcash Foundation: > {{ args.admin_note }} {% endif %} diff --git a/backend/grant/templates/emails/proposal_rejected_discussion.html b/backend/grant/templates/emails/proposal_rejected_discussion.html new file mode 100644 index 00000000..baa3d2bd --- /dev/null +++ b/backend/grant/templates/emails/proposal_rejected_discussion.html @@ -0,0 +1,19 @@ +

+ Your proposal is still open for public discussion, but the ZF team has requested changes. + Please make the necessary edits and mark the changes as resolved. +

+ +{% if args.admin_note %} +

+ A note from the Zcash Foundation: +

+

+ “{{ args.admin_note }}” +

+{% endif %} + +

+ Please note that repeated submissions without significant changes or with + content that doesn't match the platform guidelines may result in a removal + of your submission privileges. +

\ No newline at end of file diff --git a/backend/grant/templates/emails/proposal_rejected_discussion.txt b/backend/grant/templates/emails/proposal_rejected_discussion.txt new file mode 100644 index 00000000..6c5e9697 --- /dev/null +++ b/backend/grant/templates/emails/proposal_rejected_discussion.txt @@ -0,0 +1,12 @@ + Your proposal is still open for public discussion, but the ZF team has requested changes. + Please make the necessary edits and mark the changes as resolved. + +{% if args.admin_note %} +A note from the Zcash Foundation: + +> {{ args.admin_note }} +{% endif %} + +Please note that repeated submissions without significant changes or with +content that doesn't match the platform guidelines may result in a removal +of your submission privileges. \ No newline at end of file diff --git a/backend/grant/templates/emails/proposal_rejected_permanently.html b/backend/grant/templates/emails/proposal_rejected_permanently.html new file mode 100644 index 00000000..623b0859 --- /dev/null +++ b/backend/grant/templates/emails/proposal_rejected_permanently.html @@ -0,0 +1,13 @@ +

+ Your proposal has been rejected. + Visit your profile to delete this proposal. +

+ +{% if args.admin_note %} +

+ A note from the Zcash Foundation: +

+

+ “{{ args.admin_note }}” +

+{% endif %} diff --git a/backend/grant/templates/emails/proposal_rejected_permanently.txt b/backend/grant/templates/emails/proposal_rejected_permanently.txt new file mode 100644 index 00000000..8365ca00 --- /dev/null +++ b/backend/grant/templates/emails/proposal_rejected_permanently.txt @@ -0,0 +1,9 @@ +Your proposal has been rejected. Visit your profile to delete this proposal: + +{{ args.profile_rejected_url }} + +{% if args.admin_note %} +A note from the Zcash Foundation: + +> {{ args.admin_note }} +{% endif %} diff --git a/backend/grant/user/views.py b/backend/grant/user/views.py index ea4cb74d..5b3ea4e7 100644 --- a/backend/grant/user/views.py +++ b/backend/grant/user/views.py @@ -4,6 +4,8 @@ from flask import Blueprint, g, current_app from marshmallow import fields from validate_email import validate_email from webargs import validate +from grant.email.send import send_email +from grant.utils.misc import make_url import grant.utils.auth as auth from grant.comment.models import Comment, user_comments_schema @@ -20,9 +22,8 @@ from grant.proposal.models import ( user_proposal_arbiters_schema ) from grant.proposal.models import ProposalContribution -from grant.utils.enums import ProposalStatus, ContributionStatus +from grant.utils.enums import ProposalStatus, ContributionStatus, CCRStatus from grant.utils.exceptions import ValidationException -from grant.utils.requests import validate_blockchain_get from grant.utils.social import verify_social, get_social_login_url, VerifySocialException from grant.utils.upload import remove_avatar, sign_avatar_upload, AvatarException from .models import ( @@ -34,6 +35,7 @@ from .models import ( user_settings_schema, db ) +from grant.utils.validate import is_z_address_valid blueprint = Blueprint('user', __name__, url_prefix='/api/v1/users') @@ -52,10 +54,11 @@ def get_me(): "withFunded": fields.Bool(required=False, missing=None), "withPending": fields.Bool(required=False, missing=None), "withArbitrated": fields.Bool(required=False, missing=None), - "withRequests": fields.Bool(required=False, missing=None) + "withRequests": fields.Bool(required=False, missing=None), + "withRejectedPermanently": fields.Bool(required=False, missing=None) }) -def get_user(user_id, with_proposals, with_comments, with_funded, with_pending, with_arbitrated, with_requests): +def get_user(user_id, with_proposals, with_comments, with_funded, with_pending, with_arbitrated, with_requests, with_rejected_permanently): user = User.get_by_id(user_id) if user: result = user_schema.dump(user) @@ -91,15 +94,24 @@ def get_user(user_id, with_proposals, with_comments, with_funded, with_pending, pending_proposals_dump = user_proposals_schema.dump(pending_proposals) result["pendingProposals"] = pending_proposals_dump pending_ccrs = CCR.get_by_user(user, [ - ProposalStatus.STAKING, - ProposalStatus.PENDING, - ProposalStatus.APPROVED, - ProposalStatus.REJECTED, + CCRStatus.PENDING, + CCRStatus.APPROVED, + CCRStatus.REJECTED, ]) pending_ccrs_dump = ccrs_schema.dump(pending_ccrs) result["pendingRequests"] = pending_ccrs_dump if with_arbitrated and is_self: result["arbitrated"] = user_proposal_arbiters_schema.dump(user.arbiter_proposals) + if with_rejected_permanently and is_self: + rejected_proposals = Proposal.get_by_user(user, [ + ProposalStatus.REJECTED_PERMANENTLY + ]) + result["rejectedPermanentlyProposals"] = user_proposals_schema.dump(rejected_proposals) + + rejected_ccrs = CCR.get_by_user(user, [ + CCRStatus.REJECTED_PERMANENTLY, + ]) + result["rejectedPermanentlyRequests"] = ccrs_schema.dump(rejected_ccrs) return result else: @@ -363,8 +375,7 @@ def get_user_settings(user_id): @auth.requires_same_user_auth @body({ "emailSubscriptions": fields.Dict(required=False, missing=None), - "refundAddress": fields.Str(required=False, missing=None, - validate=lambda r: validate_blockchain_get('/validate/address', {'address': r})), + "refundAddress": fields.Str(required=False, missing=None), "tipJarAddress": fields.Str(required=False, missing=None), "tipJarViewKey": fields.Str(required=False, missing=None) # TODO: add viewkey validation here }) @@ -376,16 +387,18 @@ def set_user_settings(user_id, email_subscriptions, refund_address, tip_jar_addr except ValidationException as e: return {"message": str(e)}, 400 + if refund_address is not None and refund_address != '' and not is_z_address_valid(refund_address): + return {"message": "Refund address is not a valid z address"}, 400 if refund_address == '' and g.current_user.settings.refund_address: return {"message": "Refund address cannot be unset, only changed"}, 400 if refund_address: g.current_user.settings.refund_address = refund_address + if tip_jar_address is not None and tip_jar_address is not '' and not is_z_address_valid(tip_jar_address): + return {"message": "Tip address is not a valid z address"}, 400 if tip_jar_address is not None: - if tip_jar_address is not '': - validate_blockchain_get('/validate/address', {'address': tip_jar_address}) - g.current_user.settings.tip_jar_address = tip_jar_address + if tip_jar_view_key is not None: g.current_user.settings.tip_jar_view_key = tip_jar_view_key @@ -406,6 +419,14 @@ def set_user_arbiter(user_id, proposal_id, is_accept): if is_accept: proposal.arbiter.accept_nomination(g.current_user.id) + + for user in proposal.team: + send_email(user.email_address, 'proposal_arbiter_assigned', { + 'user': user, + 'proposal': proposal, + 'proposal_url': make_url(f'/proposals/{proposal.id}') + }) + return {"message": "Accepted nomination"}, 200 else: proposal.arbiter.reject_nomination(g.current_user.id) diff --git a/backend/grant/utils/bech32.py b/backend/grant/utils/bech32.py new file mode 100644 index 00000000..e0df3b6a --- /dev/null +++ b/backend/grant/utils/bech32.py @@ -0,0 +1,123 @@ +# Copyright (c) 2017 Pieter Wuille +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +"""Reference implementation for Bech32 and segwit addresses.""" + + +CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" + + +def bech32_polymod(values): + """Internal function that computes the Bech32 checksum.""" + generator = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3] + chk = 1 + for value in values: + top = chk >> 25 + chk = (chk & 0x1ffffff) << 5 ^ value + for i in range(5): + chk ^= generator[i] if ((top >> i) & 1) else 0 + return chk + + +def bech32_hrp_expand(hrp): + """Expand the HRP into values for checksum computation.""" + return [ord(x) >> 5 for x in hrp] + [0] + [ord(x) & 31 for x in hrp] + + +def bech32_verify_checksum(hrp, data): + """Verify a checksum given HRP and converted data characters.""" + return bech32_polymod(bech32_hrp_expand(hrp) + data) == 1 + + +def bech32_create_checksum(hrp, data): + """Compute the checksum values given HRP and data.""" + values = bech32_hrp_expand(hrp) + data + polymod = bech32_polymod(values + [0, 0, 0, 0, 0, 0]) ^ 1 + return [(polymod >> 5 * (5 - i)) & 31 for i in range(6)] + + +def bech32_encode(hrp, data): + """Compute a Bech32 string given HRP and data values.""" + combined = data + bech32_create_checksum(hrp, data) + return hrp + '1' + ''.join([CHARSET[d] for d in combined]) + + +def bech32_decode(bech): + """Validate a Bech32 string, and determine HRP and data.""" + if ((any(ord(x) < 33 or ord(x) > 126 for x in bech)) or + (bech.lower() != bech and bech.upper() != bech)): + return (None, None) + bech = bech.lower() + pos = bech.rfind('1') + if pos < 1 or pos + 7 > len(bech) or len(bech) > 90: + return (None, None) + if not all(x in CHARSET for x in bech[pos+1:]): + return (None, None) + hrp = bech[:pos] + data = [CHARSET.find(x) for x in bech[pos+1:]] + if not bech32_verify_checksum(hrp, data): + return (None, None) + return (hrp, data[:-6]) + + +def convertbits(data, frombits, tobits, pad=True): + """General power-of-2 base conversion.""" + acc = 0 + bits = 0 + ret = [] + maxv = (1 << tobits) - 1 + max_acc = (1 << (frombits + tobits - 1)) - 1 + for value in data: + if value < 0 or (value >> frombits): + return None + acc = ((acc << frombits) | value) & max_acc + bits += frombits + while bits >= tobits: + bits -= tobits + ret.append((acc >> bits) & maxv) + if pad: + if bits: + ret.append((acc << (tobits - bits)) & maxv) + elif bits >= frombits or ((acc << (tobits - bits)) & maxv): + return None + return ret + + +def decode(hrp, addr): + """Decode a segwit address.""" + hrpgot, data = bech32_decode(addr) + if hrpgot != hrp: + return (None, None) + decoded = convertbits(data[1:], 5, 8, False) + if decoded is None or len(decoded) < 2 or len(decoded) > 40: + return (None, None) + if data[0] > 16: + return (None, None) + if data[0] == 0 and len(decoded) != 20 and len(decoded) != 32: + return (None, None) + return (data[0], decoded) + + +def encode(hrp, witver, witprog): + """Encode a segwit address.""" + ret = bech32_encode(hrp, [witver] + convertbits(witprog, 8, 5)) + if decode(hrp, ret) == (None, None): + return None + return ret \ No newline at end of file diff --git a/backend/grant/utils/enums.py b/backend/grant/utils/enums.py index 71a380ea..76239422 100644 --- a/backend/grant/utils/enums.py +++ b/backend/grant/utils/enums.py @@ -16,6 +16,7 @@ class CCRStatusEnum(CustomEnum): PENDING = 'PENDING' APPROVED = 'APPROVED' REJECTED = 'REJECTED' + REJECTED_PERMANENTLY = 'REJECTED_PERMANENTLY' LIVE = 'LIVE' DELETED = 'DELETED' @@ -25,10 +26,14 @@ CCRStatus = CCRStatusEnum() class ProposalStatusEnum(CustomEnum): DRAFT = 'DRAFT' + LIVE_DRAFT = 'LIVE_DRAFT' + ARCHIVED = 'ARCHIVED' STAKING = 'STAKING' + DISCUSSION = 'DISCUSSION' PENDING = 'PENDING' APPROVED = 'APPROVED' REJECTED = 'REJECTED' + REJECTED_PERMANENTLY = 'REJECTED_PERMANENTLY' LIVE = 'LIVE' DELETED = 'DELETED' @@ -102,3 +107,20 @@ class ProposalArbiterStatusEnum(CustomEnum): ProposalArbiterStatus = ProposalArbiterStatusEnum() + + +class ProposalChangeEnum(CustomEnum): + PROPOSAL_EDIT_BRIEF = 'PROPOSAL_EDIT_BRIEF' + PROPOSAL_EDIT_CONTENT = 'PROPOSAL_EDIT_CONTENT' + PROPOSAL_EDIT_TARGET = 'PROPOSAL_EDIT_TARGET' + PROPOSAL_EDIT_TITLE = 'PROPOSAL_EDIT_TITLE' + MILESTONE_ADD = 'MILESTONE_ADD' + MILESTONE_REMOVE = 'MILESTONE_REMOVE' + MILESTONE_EDIT_DAYS = 'MILESTONE_EDIT_DAYS' + MILESTONE_EDIT_IMMEDIATE_PAYOUT = 'MILESTONE_EDIT_IMMEDIATE_PAYOUT' + MILESTONE_EDIT_PERCENT = 'MILESTONE_EDIT_PERCENT' + MILESTONE_EDIT_CONTENT = 'MILESTONE_EDIT_CONTENT' + MILESTONE_EDIT_TITLE = 'MILESTONE_EDIT_TITLE' + +ProposalChange = ProposalChangeEnum() + diff --git a/backend/grant/utils/pagination.py b/backend/grant/utils/pagination.py index d29e1c5c..3127f2ea 100644 --- a/backend/grant/utils/pagination.py +++ b/backend/grant/utils/pagination.py @@ -338,10 +338,10 @@ class CCRPagination(Pagination): page: int = 1, filters: list = None, search: str = None, - sort: str = 'PUBLISHED:DESC', + sort: str = 'CREATED:DESC', ): query = query or CCR.query - sort = sort or 'PUBLISHED:DESC' + sort = sort or 'CREATED:DESC' # FILTER if filters: diff --git a/backend/grant/utils/requests.py b/backend/grant/utils/requests.py index 06c1cd82..84b3226e 100644 --- a/backend/grant/utils/requests.py +++ b/backend/grant/utils/requests.py @@ -29,20 +29,6 @@ def blockchain_get(path, params=None): raise e -def validate_blockchain_get(path, params=None): - if path == '/validate/address' and params and params['address'] and params['address'][0] == 't': - raise ValidationException('T addresses are not allowed') - - try: - res = blockchain_get(path, params) - except Exception: - raise ValidationException('Unable to validate zcash address right now, try again later') - if not res.get('valid'): - raise ValidationException('Invalid Zcash address') - - return True - - def blockchain_post(path, data=None): if E2E_TESTING: return blockchain_rest_e2e(path, data) diff --git a/backend/grant/utils/validate.py b/backend/grant/utils/validate.py new file mode 100644 index 00000000..f9fad819 --- /dev/null +++ b/backend/grant/utils/validate.py @@ -0,0 +1,19 @@ +from grant.utils.bech32 import bech32_decode + + +def is_z_address_valid(addr: str): + if type(addr) != str: + return False + + if addr[:3] != 'zs1': + return False + + hrp, data = bech32_decode(addr) + + if hrp is None: + return False + + if data is None: + return False + + return True diff --git a/backend/grant/werkzeug_http_fork.py b/backend/grant/werkzeug_http_fork.py new file mode 100644 index 00000000..70f2d36f --- /dev/null +++ b/backend/grant/werkzeug_http_fork.py @@ -0,0 +1,192 @@ +import warnings +from datetime import timedelta, datetime +from time import time, gmtime + +from werkzeug._compat import to_bytes, string_types, text_type, PY2, integer_types +from werkzeug._internal import _make_cookie_domain, _cookie_quote +from werkzeug.urls import iri_to_uri + + +def dump_cookie( + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=False, + httponly=False, + charset="utf-8", + sync_expires=True, + max_size=4093, + samesite=None, +): + """Creates a new Set-Cookie header without the ``Set-Cookie`` prefix + The parameters are the same as in the cookie Morsel object in the + Python standard library but it accepts unicode data, too. + + On Python 3 the return value of this function will be a unicode + string, on Python 2 it will be a native string. In both cases the + return value is usually restricted to ascii as the vast majority of + values are properly escaped, but that is no guarantee. If a unicode + string is returned it's tunneled through latin1 as required by + PEP 3333. + + The return value is not ASCII safe if the key contains unicode + characters. This is technically against the specification but + happens in the wild. It's strongly recommended to not use + non-ASCII values for the keys. + + :param max_age: should be a number of seconds, or `None` (default) if + the cookie should last only as long as the client's + browser session. Additionally `timedelta` objects + are accepted, too. + :param expires: should be a `datetime` object or unix timestamp. + :param path: limits the cookie to a given path, per default it will + span the whole domain. + :param domain: Use this if you want to set a cross-domain cookie. For + example, ``domain=".example.com"`` will set a cookie + that is readable by the domain ``www.example.com``, + ``foo.example.com`` etc. Otherwise, a cookie will only + be readable by the domain that set it. + :param secure: The cookie will only be available via HTTPS + :param httponly: disallow JavaScript to access the cookie. This is an + extension to the cookie standard and probably not + supported by all browsers. + :param charset: the encoding for unicode values. + :param sync_expires: automatically set expires if max_age is defined + but expires not. + :param max_size: Warn if the final header value exceeds this size. The + default, 4093, should be safely `supported by most browsers + `_. Set to 0 to disable this check. + :param samesite: Limits the scope of the cookie such that it will only + be attached to requests if those requests are "same-site". + + .. _`cookie`: http://browsercookielimits.squawky.net/ + """ + key = to_bytes(key, charset) + value = to_bytes(value, charset) + + if path is not None: + path = iri_to_uri(path, charset) + domain = _make_cookie_domain(domain) + if isinstance(max_age, timedelta): + max_age = (max_age.days * 60 * 60 * 24) + max_age.seconds + if expires is not None: + if not isinstance(expires, string_types): + expires = cookie_date(expires) + elif max_age is not None and sync_expires: + expires = to_bytes(cookie_date(time() + max_age)) + + samesite = samesite.title() if samesite else None + if samesite not in ("Strict", "Lax", 'None', None): + raise ValueError("invalid SameSite value; must be 'Strict', 'Lax', 'None', or None") + + buf = [key + b"=" + _cookie_quote(value)] + + # XXX: In theory all of these parameters that are not marked with `None` + # should be quoted. Because stdlib did not quote it before I did not + # want to introduce quoting there now. + for k, v, q in ( + (b"Domain", domain, True), + (b"Expires", expires, False), + (b"Max-Age", max_age, False), + (b"Secure", secure, None), + (b"HttpOnly", httponly, None), + (b"Path", path, False), + (b"SameSite", samesite, False), + ): + if q is None: + if v: + buf.append(k) + continue + + if v is None: + continue + + tmp = bytearray(k) + if not isinstance(v, (bytes, bytearray)): + v = to_bytes(text_type(v), charset) + if q: + v = _cookie_quote(v) + tmp += b"=" + v + buf.append(bytes(tmp)) + + # The return value will be an incorrectly encoded latin1 header on + # Python 3 for consistency with the headers object and a bytestring + # on Python 2 because that's how the API makes more sense. + rv = b"; ".join(buf) + if not PY2: + rv = rv.decode("latin1") + + # Warn if the final value of the cookie is less than the limit. If the + # cookie is too large, then it may be silently ignored, which can be quite + # hard to debug. + cookie_size = len(rv) + + if max_size and cookie_size > max_size: + value_size = len(value) + warnings.warn( + 'The "{key}" cookie is too large: the value was {value_size} bytes' + " but the header required {extra_size} extra bytes. The final size" + " was {cookie_size} bytes but the limit is {max_size} bytes." + " Browsers may silently ignore cookies larger than this.".format( + key=key, + value_size=value_size, + extra_size=cookie_size - value_size, + cookie_size=cookie_size, + max_size=max_size, + ), + stacklevel=2, + ) + + return rv + + +def cookie_date(expires=None): + """Formats the time to ensure compatibility with Netscape's cookie + standard. + + Accepts a floating point number expressed in seconds since the epoch in, a + datetime object or a timetuple. All times in UTC. The :func:`parse_date` + function can be used to parse such a date. + + Outputs a string in the format ``Wdy, DD-Mon-YYYY HH:MM:SS GMT``. + + :param expires: If provided that date is used, otherwise the current. + """ + return _dump_date(expires, "-") + + +def _dump_date(d, delim): + """Used for `http_date` and `cookie_date`.""" + if d is None: + d = gmtime() + elif isinstance(d, datetime): + d = d.utctimetuple() + elif isinstance(d, (integer_types, float)): + d = gmtime(d) + return "%s, %02d%s%s%s%s %02d:%02d:%02d GMT" % ( + ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")[d.tm_wday], + d.tm_mday, + delim, + ( + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + )[d.tm_mon - 1], + delim, + str(d.tm_year), + d.tm_hour, + d.tm_min, + d.tm_sec, + ) \ No newline at end of file diff --git a/backend/migrations/versions/6624244a249e_.py b/backend/migrations/versions/6624244a249e_.py new file mode 100644 index 00000000..43d53d74 --- /dev/null +++ b/backend/migrations/versions/6624244a249e_.py @@ -0,0 +1,30 @@ +"""empty message + +Revision ID: 6624244a249e +Revises: 8f8001e98e65 +Create Date: 2020-02-10 20:25:34.448725 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '6624244a249e' +down_revision = '8f8001e98e65' +branch_labels = None +depends_on = None + + +def upgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.add_column('proposal', sa.Column('live_draft_parent_id', sa.Integer(), nullable=True)) + op.create_foreign_key(None, 'proposal', 'proposal', ['live_draft_parent_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'proposal', type_='foreignkey') + op.drop_column('proposal', 'live_draft_parent_id') + # ### end Alembic commands ### diff --git a/backend/migrations/versions/8f8001e98e65_.py b/backend/migrations/versions/8f8001e98e65_.py new file mode 100644 index 00000000..04e53208 --- /dev/null +++ b/backend/migrations/versions/8f8001e98e65_.py @@ -0,0 +1,30 @@ +"""empty message + +Revision ID: 8f8001e98e65 +Revises: 2721189b0c8f +Create Date: 2020-02-07 12:42:57.248894 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '8f8001e98e65' +down_revision = '2721189b0c8f' +branch_labels = None +depends_on = None + + +def upgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.add_column('proposal', sa.Column('changes_requested_discussion', sa.Boolean(), nullable=True)) + op.add_column('proposal', sa.Column('changes_requested_discussion_reason', sa.String(length=255), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.drop_column('proposal', 'changes_requested_discussion_reason') + op.drop_column('proposal', 'changes_requested_discussion') + # ### end Alembic commands ### diff --git a/backend/migrations/versions/bea5c35d0cd6_.py b/backend/migrations/versions/bea5c35d0cd6_.py new file mode 100644 index 00000000..d01965c4 --- /dev/null +++ b/backend/migrations/versions/bea5c35d0cd6_.py @@ -0,0 +1,40 @@ +"""empty message + +Revision ID: bea5c35d0cd6 +Revises: 6624244a249e +Create Date: 2020-02-26 13:55:40.484701 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'bea5c35d0cd6' +down_revision = '6624244a249e' +branch_labels = None +depends_on = None + + +def upgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.create_table('proposal_revision', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('date_created', sa.DateTime(), nullable=True), + sa.Column('author_id', sa.Integer(), nullable=False), + sa.Column('proposal_id', sa.Integer(), nullable=False), + sa.Column('proposal_archive_id', sa.Integer(), nullable=False), + sa.Column('changes', sa.Text(), nullable=False), + sa.Column('revision_index', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['author_id'], ['user.id'], ), + sa.ForeignKeyConstraint(['proposal_archive_id'], ['proposal.id'], ), + sa.ForeignKeyConstraint(['proposal_id'], ['proposal.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): +# ### commands auto generated by Alembic - please adjust! ### + op.drop_table('proposal_revision') + # ### end Alembic commands ### diff --git a/backend/requirements/prod.txt b/backend/requirements/prod.txt index d51640ad..f5b917c1 100644 --- a/backend/requirements/prod.txt +++ b/backend/requirements/prod.txt @@ -84,4 +84,4 @@ Flask-Limiter==1.0.1 validate_email==1.3 # validate URLS -validators==0.12.4 +validators==0.12.6 \ No newline at end of file diff --git a/backend/tests/admin/test_admin_api.py b/backend/tests/admin/test_admin_api.py index 2b441732..1626c0f9 100644 --- a/backend/tests/admin/test_admin_api.py +++ b/backend/tests/admin/test_admin_api.py @@ -1,13 +1,14 @@ import json -from grant.utils.enums import ProposalStatus +from grant.utils.enums import ProposalStatus, CCRStatus import grant.utils.admin as admin from grant.utils import totp_2fa from grant.user.models import admin_user_schema -from grant.proposal.models import proposal_schema, db +from grant.proposal.models import proposal_schema, db, Proposal +from grant.ccr.models import CCR from mock import patch -from ..config import BaseProposalCreatorConfig -from ..test_data import mock_blockchain_api_requests +from ..config import BaseProposalCreatorConfig, BaseCCRCreatorConfig +from ..test_data import mock_blockchain_api_requests, test_ccr json_checklogin = { "isLoggedIn": False, @@ -242,13 +243,107 @@ class TestAdminAPI(BaseProposalCreatorConfig): # 2 proposals created by BaseProposalCreatorConfig self.assertEqual(len(resp.json['items']), 2) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_accept_proposal_with_funding(self, mock_get): + def test_open_proposal_for_discussion_accept(self): + # an admin should be able to open a proposal for discussion self.login_admin() # proposal needs to be PENDING self.proposal.status = ProposalStatus.PENDING + # approve open for discussion + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/discussion", + data=json.dumps({"isOpenForDiscussion": True}) + ) + + self.assert200(resp) + self.assertEqual(resp.json["status"], ProposalStatus.DISCUSSION) + + proposal = Proposal.query.get(self.proposal.id) + self.assertEqual(proposal.status, ProposalStatus.DISCUSSION) + + def test_open_proposal_for_discussion_reject(self): + # an admin should be able to reject opening a proposal for discussion + reject_reason = "this is a test" + + self.login_admin() + + # proposal needs to be PENDING + self.proposal.status = ProposalStatus.PENDING + + # disapprove open for discussion + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/discussion", + data=json.dumps({"isOpenForDiscussion": False, "rejectReason": reject_reason}) + ) + + self.assert200(resp) + self.assertEqual(resp.json["status"], ProposalStatus.REJECTED) + self.assertEqual(resp.json["rejectReason"], reject_reason) + + proposal = Proposal.query.get(self.proposal.id) + self.assertEqual(proposal.status, ProposalStatus.REJECTED) + self.assertEqual(proposal.reject_reason, reject_reason) + + def test_open_proposal_for_discussion_bad_proposal_id_fail(self): + # request should fail if a bad proposal id is provided + bad_proposal_id = "11111111111111111111" + self.login_admin() + + # approve open for discussion + resp = self.app.put( + f"/api/v1/admin/proposals/{bad_proposal_id}/discussion", + data=json.dumps({"isOpenForDiscussion": True}) + ) + self.assert404(resp) + + def test_open_proposal_for_discussion_not_admin_fail(self): + # request should fail if user is not an admin + self.login_default_user() + + # proposal needs to be PENDING + self.proposal.status = ProposalStatus.PENDING + + # approve open for discussion + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/discussion", + data=json.dumps({"isOpenForDiscussion": True}) + ) + self.assert401(resp) + + def test_open_proposal_for_discussion_not_pending_fail(self): + # request should fail if proposal is not in PENDING state + self.login_admin() + + self.proposal.status = ProposalStatus.DISCUSSION + + # approve open for discussion + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/discussion", + data=json.dumps({"isOpenForDiscussion": True}) + ) + self.assert400(resp) + + def test_open_proposal_for_discussion_no_reject_reason_fail(self): + # denying opening a proposal for discussion should fail if no reason is provided + self.login_admin() + + # proposal needs to be PENDING + self.proposal.status = ProposalStatus.PENDING + + # disapprove open for discussion + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/discussion", + data=json.dumps({"isOpenForDiscussion": False}) + ) + self.assert400(resp) + + def test_accept_proposal_with_funding(self): + self.login_admin() + + # proposal needs to be DISCUSSION + self.proposal.status = ProposalStatus.DISCUSSION + # approve resp = self.app.put( "/api/v1/admin/proposals/{}/accept".format(self.proposal.id), @@ -264,12 +359,11 @@ class TestAdminAPI(BaseProposalCreatorConfig): for milestone in resp.json["milestones"]: self.assertIsNotNone(milestone["dateEstimated"]) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_accept_proposal_without_funding(self, mock_get): + def test_accept_proposal_without_funding(self): self.login_admin() - # proposal needs to be PENDING - self.proposal.status = ProposalStatus.PENDING + # proposal needs to be DISCUSSION + self.proposal.status = ProposalStatus.DISCUSSION # approve resp = self.app.put( @@ -286,13 +380,128 @@ class TestAdminAPI(BaseProposalCreatorConfig): for milestone in resp.json["milestones"]: self.assertIsNone(milestone["dateEstimated"]) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_change_proposal_to_accepted_with_funding(self, mock_get): + def test_accept_proposal_changes_requested(self): + # an admin should be able to request changes on a proposal + reason = "this is a test" self.login_admin() - # proposal needs to be PENDING + # proposal needs to be DISCUSSION + self.proposal.status = ProposalStatus.DISCUSSION + + # approve + resp = self.app.put( + "/api/v1/admin/proposals/{}/accept".format(self.proposal.id), + data=json.dumps({"isAccepted": False, "changesRequestedReason": reason}) + ) + + self.assert200(resp) + self.assertEqual(resp.json["status"], ProposalStatus.DISCUSSION) + self.assertEqual(resp.json["changesRequestedDiscussion"], True) + self.assertEqual(resp.json["changesRequestedDiscussionReason"], reason) + + proposal = Proposal.query.get(self.proposal.id) + self.assertEqual(proposal.status, ProposalStatus.DISCUSSION) + self.assertEqual(proposal.changes_requested_discussion, True) + self.assertEqual(proposal.changes_requested_discussion_reason, reason) + + def test_accept_proposal_changes_requested_no_reason_provided_fail(self): + # requesting changes to a proposal without providing a reason should fail + self.login_admin() + + # proposal needs to be DISCUSSION + self.proposal.status = ProposalStatus.DISCUSSION + + # approve + resp = self.app.put( + "/api/v1/admin/proposals/{}/accept".format(self.proposal.id), + data=json.dumps({"isAccepted": False}) + ) + + self.assert400(resp) + + def test_accept_proposal_changes_requested_not_discussion_fail(self): + # requesting changes on a proposal not in DISCUSSION should fail + self.login_admin() self.proposal.status = ProposalStatus.PENDING + # disapprove + resp = self.app.put( + "/api/v1/admin/proposals/{}/accept".format(self.proposal.id), + data=json.dumps({"isAccepted": False, "changesRequestedReason": "test"}) + ) + + self.assert400(resp) + + def test_accept_proposal_not_discussion_fail(self): + # accepting a proposal not in DISCUSSION should fail + self.login_admin() + self.proposal.status = ProposalStatus.PENDING + + # approve + resp = self.app.put( + "/api/v1/admin/proposals/{}/accept".format(self.proposal.id), + data=json.dumps({"isAccepted": True, "withFunding": True}) + ) + + self.assert400(resp) + + def test_resolve_changes_discussion(self): + # an admin should be able to resolve discussion changes + self.login_admin() + self.proposal.status = ProposalStatus.DISCUSSION + self.proposal.changes_requested_discussion = True + self.proposal.changes_requested_discussion_reason = 'test' + + # resolve changes + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/resolve" + ) + self.assert200(resp) + self.assertEqual(resp.json['changesRequestedDiscussion'], False) + self.assertIsNone(resp.json['changesRequestedDiscussionReason']) + + def test_resolve_changes_discussion_wrong_status_fail(self): + # resolve should fail if proposal is not in a DISCUSSION state + self.login_admin() + self.proposal.status = ProposalStatus.PENDING + self.proposal.changes_requested_discussion = True + self.proposal.changes_requested_discussion_reason = 'test' + + # resolve changes + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/resolve" + ) + self.assert400(resp) + + def test_resolve_changes_discussion_bad_proposal_fail(self): + # resolve should fail if bad proposal id is provided + self.login_admin() + bad_id = '111111111111' + # resolve changes + resp = self.app.put( + f"/api/v1/admin/proposals/{bad_id}/resolve" + ) + self.assert404(resp) + + def test_resolve_changes_discussion_no_changes_requested_fail(self): + # resolve should fail if changes are not requested on the proposal + self.login_admin() + self.proposal.status = ProposalStatus.DISCUSSION + self.proposal.changes_requested_discussion = False + self.proposal.changes_requested_discussion_reason = None + + # resolve changes + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/resolve" + ) + self.assert400(resp) + + def test_change_proposal_to_accepted_with_funding(self): + self.login_admin() + + # proposal needs to be DISCUSSION + self.proposal.status = ProposalStatus.DISCUSSION + # accept without funding resp = self.app.put( "/api/v1/admin/proposals/{}/accept".format(self.proposal.id), @@ -330,7 +539,7 @@ class TestAdminAPI(BaseProposalCreatorConfig): self.proposal.version = '2' # should failed if proposal is not LIVE or APPROVED - self.proposal.status = ProposalStatus.PENDING + self.proposal.status = ProposalStatus.DISCUSSION self.proposal.accepted_with_funding = False resp = self.app.put( f"/api/v1/admin/proposals/{self.proposal.id}/accept/fund" @@ -338,10 +547,7 @@ class TestAdminAPI(BaseProposalCreatorConfig): self.assert404(resp) self.assertEqual(resp.json["message"], 'Only live or approved proposals can be modified by this endpoint') - - - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_reject_proposal(self, mock_get): + def test_reject_proposal_discussion(self): self.login_admin() # proposal needs to be PENDING @@ -349,18 +555,63 @@ class TestAdminAPI(BaseProposalCreatorConfig): # reject resp = self.app.put( - "/api/v1/admin/proposals/{}/accept".format(self.proposal.id), - data=json.dumps({"isAccepted": False, "withFunding": False, "rejectReason": "Funnzies."}) + "/api/v1/admin/proposals/{}/discussion".format(self.proposal.id), + data=json.dumps({"isOpenForDiscussion": False, "rejectReason": "Funnzies."}) ) self.assert200(resp) self.assertEqual(resp.json["status"], ProposalStatus.REJECTED) self.assertEqual(resp.json["rejectReason"], "Funnzies.") + def test_reject_permanently_proposal(self): + rejected = { + "rejectReason": "test" + } + self.login_admin() + + # no reject reason should 400 + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/reject_permanently", + content_type='application/json' + ) + self.assert400(resp) + + # bad proposal id should 404 + resp = self.app.put( + f"/api/v1/admin/proposals/111111111/reject_permanently", + data=json.dumps(rejected), + content_type='application/json' + ) + self.assert404(resp) + + # bad status should 401 + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/reject_permanently", + data=json.dumps(rejected), + content_type='application/json' + ) + self.assert401(resp) + + self.proposal.status = ProposalStatus.PENDING + + # should go through + resp = self.app.put( + f"/api/v1/admin/proposals/{self.proposal.id}/reject_permanently", + data=json.dumps(rejected), + content_type='application/json' + ) + self.assert200(resp) + + self.assertEqual(resp.json["status"], ProposalStatus.REJECTED_PERMANENTLY) + self.assertEqual(resp.json["rejectReason"], rejected["rejectReason"]) + @patch('grant.email.send.send_email') def test_nominate_arbiter(self, mock_send_email): mock_send_email.return_value.ok = True self.login_admin() + self.proposal.status = ProposalStatus.LIVE + self.proposal.accepted_with_funding = True + # nominate arbiter resp = self.app.put( "/api/v1/admin/arbiters", @@ -386,3 +637,183 @@ class TestAdminAPI(BaseProposalCreatorConfig): }) ) self.assert200(resp) + + def test_get_ccrs(self): + create_ccr(self) + + # non-admins should fail + resp = self.app.get( + "/api/v1/admin/ccrs" + ) + self.assert401(resp) + + # admins should be able to retrieve ccrs + self.login_admin() + resp = self.app.get( + "/api/v1/admin/ccrs" + ) + self.assert200(resp) + self.assertEqual(resp.json["total"], 1) + + def test_delete_ccr(self): + ccr_json = create_ccr(self) + ccr_id = ccr_json["ccrId"] + fake_id = '11111111111111' + self.login_admin() + + # bad CCR id should 404 + resp = self.app.delete( + f"/api/v1/admin/ccrs/{fake_id}" + ) + self.assert404(resp) + + # good CCR id should 200 + resp = self.app.delete( + f"/api/v1/admin/ccrs/{ccr_id}" + ) + self.assert200(resp) + + # ccr should be deleted + resp = self.app.get( + "/api/v1/admin/ccrs" + ) + self.assert200(resp) + self.assertEqual(resp.json["total"], 0) + + def test_get_ccr(self): + ccr_json = create_ccr(self) + ccr_id = ccr_json["ccrId"] + fake_id = '11111111111111' + self.login_admin() + + # bad ccr id should 404 + resp = self.app.get( + f"/api/v1/admin/ccrs/{fake_id}" + ) + self.assert404(resp) + + # good ccr id should 200 + resp = self.app.get( + f"/api/v1/admin/ccrs/{ccr_id}" + ) + self.assert200(resp) + self.assertEqual(resp.json, ccr_json) + + def test_approve_ccr(self): + ccr1_json = create_ccr(self) + ccr1_id = ccr1_json["ccrId"] + ccr2_json = create_ccr(self) + ccr2_id = ccr2_json["ccrId"] + fake_id = '11111111111111' + accepted = {"isAccepted": True} + rejected = { + "isAccepted": False, + "rejectReason": "test" + } + + submit_ccr(self, ccr1_id) + submit_ccr(self, ccr2_id) + self.login_admin() + + # bad ccr id should 404 + resp = self.app.put( + f"/api/v1/admin/ccrs/{fake_id}/accept", + data=json.dumps(accepted), + content_type='application/json' + ) + self.assert404(resp) + + # good ccr id that's accepted should be live + resp = self.app.put( + f"/api/v1/admin/ccrs/{ccr1_id}/accept", + data=json.dumps(accepted), + content_type='application/json' + ) + self.assertStatus(resp, 201) + ccr = CCR.query.get(ccr1_id) + self.assertEqual(ccr.status, CCRStatus.LIVE) + + # good ccr id that's rejected should be rejected + resp = self.app.put( + f"/api/v1/admin/ccrs/{ccr2_id}/accept", + data=json.dumps(rejected), + content_type='application/json' + ) + self.assert200(resp) + ccr = CCR.query.get(ccr2_id) + self.assertEqual(ccr.status, CCRStatus.REJECTED) + self.assertEqual(ccr.reject_reason, rejected["rejectReason"]) + + def test_reject_permanently_ccr(self): + ccr_json = create_ccr(self) + ccr_id = ccr_json["ccrId"] + rejected = { + "rejectReason": "test" + } + self.login_admin() + + # no reject reason should 400 + resp = self.app.put( + f"/api/v1/admin/ccrs/{ccr_id}/reject_permanently", + content_type='application/json' + ) + self.assert400(resp) + + # bad ccr id should 404 + resp = self.app.put( + f"/api/v1/admin/ccrs/111111111/reject_permanently", + data=json.dumps(rejected), + content_type='application/json' + ) + self.assert404(resp) + + # bad status should 401 + resp = self.app.put( + f"/api/v1/admin/ccrs/{ccr_id}/reject_permanently", + data=json.dumps(rejected), + content_type='application/json' + ) + self.assert401(resp) + + submit_ccr(self, ccr_id) + + # should go through + resp = self.app.put( + f"/api/v1/admin/ccrs/{ccr_id}/reject_permanently", + data=json.dumps(rejected), + content_type='application/json' + ) + self.assert200(resp) + + self.assertEqual(resp.json["status"], CCRStatus.REJECTED_PERMANENTLY) + self.assertEqual(resp.json["rejectReason"], rejected["rejectReason"]) + + +def create_ccr(self): + # create CCR draft + self.login_default_user() + resp = self.app.post( + "/api/v1/ccrs/drafts", + ) + ccr_id = resp.json['ccrId'] + self.assertStatus(resp, 201) + + # save CCR + new_ccr = test_ccr.copy() + resp = self.app.put( + f"/api/v1/ccrs/{ccr_id}", + data=json.dumps(new_ccr), + content_type='application/json' + ) + self.assertStatus(resp, 200) + return resp.json + + +def submit_ccr(self, ccr_id): + self.login_default_user() + resp = self.app.put( + f"/api/v1/ccrs/{ccr_id}/submit_for_approval" + ) + self.assert200(resp) + return resp.json + diff --git a/backend/tests/ccr/test_ccr_api.py b/backend/tests/ccr/test_ccr_api.py index b95a45a1..ee73c250 100644 --- a/backend/tests/ccr/test_ccr_api.py +++ b/backend/tests/ccr/test_ccr_api.py @@ -1,13 +1,59 @@ import json -from grant.ccr.models import CCR +from grant.ccr.models import CCR, db +from grant.utils.enums import CCRStatus from ..config import BaseCCRCreatorConfig from ..test_data import test_ccr class TestCCRApi(BaseCCRCreatorConfig): - def test_create_new_draft(self): + def test_get_ccr(self): + self.login_default_user() + + # bad ccr id should 404 + resp = self.app.get( + "/api/v1/ccrs/1111111111" + ) + self.assert404(resp) + + # ccr id should work if user is author + ccr_id = self.ccr.id + resp = self.app.get( + f"/api/v1/ccrs/{ccr_id}" + ) + self.assert200(resp) + self.assertEqual(resp.json["ccrId"], ccr_id) + + # ccr id should fail if user is not author + self.login_other_user() + resp = self.app.get( + f"/api/v1/ccrs/{ccr_id}" + ) + self.assert404(resp) + + # ccr should be available to anyone if it's live + ccr = CCR.query.get(ccr_id) + ccr.status = CCRStatus.LIVE + db.session.add(ccr) + db.session.commit() + resp = self.app.get( + f"/api/v1/ccrs/{ccr_id}" + ) + self.assert200(resp) + self.assertEqual(resp.json["ccrId"], ccr_id) + + # ccr should 404 if it's deleted + ccr = CCR.query.get(ccr_id) + ccr.status = CCRStatus.DELETED + db.session.add(ccr) + db.session.commit() + resp = self.app.get( + f"/api/v1/ccrs/{ccr_id}" + ) + self.assert404(resp) + + def test_make_ccr_draft(self): self.login_default_user() resp = self.app.post( "/api/v1/ccrs/drafts", @@ -17,13 +63,48 @@ class TestCCRApi(BaseCCRCreatorConfig): ccr_db = CCR.query.filter_by(id=resp.json['ccrId']) self.assertIsNotNone(ccr_db) - def test_no_auth_create_new_draft(self): + def test_get_ccr_drafts(self): + # should return drafts if they exist + self.login_default_user() + resp = self.app.get( + "api/v1/ccrs/drafts" + ) + self.assert200(resp) + self.assertEqual(len(resp.json), 1) + + # should return no drafts if they don't exist + self.login_other_user() + resp = self.app.get( + "api/v1/ccrs/drafts" + ) + self.assert200(resp) + self.assertEqual(len(resp.json), 0) + + def test_make_ccr_draft_no_auth(self): resp = self.app.post( "/api/v1/ccrs/drafts" ) self.assert401(resp) - def test_update_CCR_draft(self): + def test_delete_ccr(self): + ccr_id = self.ccr.id + self.login_default_user() + + # ccr should exist + ccr = CCR.query.get(ccr_id) + self.assertIsNotNone(ccr) + + # author should be able to delete ccr + resp = self.app.delete( + f"/api/v1/ccrs/{ccr_id}" + ) + self.assertStatus(resp, 202) + + # ccr should no longer exist + ccr = CCR.query.get(ccr_id) + self.assertIsNone(ccr) + + def test_update_ccr(self): new_title = "Updated!" new_ccr = test_ccr.copy() new_ccr["title"] = new_title @@ -34,7 +115,36 @@ class TestCCRApi(BaseCCRCreatorConfig): data=json.dumps(new_ccr), content_type='application/json' ) - print(resp) self.assert200(resp) self.assertEqual(resp.json["title"], new_title) self.assertEqual(self.ccr.title, new_title) + + # updates to live ccr should fail + self.ccr.status = CCRStatus.LIVE + db.session.add(self.ccr) + db.session.commit() + + resp = self.app.put( + f"/api/v1/ccrs/{self.ccr.id}", + data=json.dumps(new_ccr), + content_type='application/json' + ) + self.assert400(resp) + + def test_submit_for_approval_ccr(self): + ccr_id = self.ccr.id + + # ccr should not be pending + ccr = CCR.query.get(ccr_id) + self.assertTrue(ccr.status != CCRStatus.PENDING) + + # author should be able to submit for approval + self.login_default_user() + resp = self.app.put( + f"/api/v1/ccrs/{ccr_id}/submit_for_approval" + ) + self.assert200(resp) + + # ccr should be pending + ccr = CCR.query.get(ccr_id) + self.assertTrue(ccr.status == CCRStatus.PENDING) diff --git a/backend/tests/config.py b/backend/tests/config.py index 83f86cb7..93814951 100644 --- a/backend/tests/config.py +++ b/backend/tests/config.py @@ -174,8 +174,7 @@ class BaseProposalCreatorConfig(BaseUserConfig): proposal_reminder = ProposalReminder(self.proposal.id) proposal_reminder.make_task() - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def stake_proposal(self, mock_get): + def stake_proposal(self): # 1. submit self.proposal.submit_for_approval() # 2. get staking contribution diff --git a/backend/tests/milestone/test_milestone_methods.py b/backend/tests/milestone/test_milestone_methods.py index 3e9315b8..65ba5f2f 100644 --- a/backend/tests/milestone/test_milestone_methods.py +++ b/backend/tests/milestone/test_milestone_methods.py @@ -49,7 +49,7 @@ test_proposal = { "milestones": test_milestones, "category": Category.ACCESSIBILITY, "target": "12345", - "payoutAddress": "123", + "payoutAddress": "zs15el0hzs4w60ggfy6kq4p3zttjrl00mfq7yxfwsjqpz9d7hptdtkltzlcqar994jg2ju3j9k85zk", } @@ -71,10 +71,10 @@ class TestMilestoneMethods(BaseUserConfig): self.assert200(resp) proposal = Proposal.query.get(proposal_id) - proposal.status = ProposalStatus.PENDING + proposal.status = ProposalStatus.DISCUSSION # accept with funding - proposal.approve_pending(True, True) + proposal.accept_proposal(True) Milestone.set_v2_date_estimates(proposal) db.session.add(proposal) @@ -83,8 +83,7 @@ class TestMilestoneMethods(BaseUserConfig): print(proposal_schema.dump(proposal)) return proposal - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_set_v2_date_estimates(self, mock_get): + def test_set_v2_date_estimates(self): proposal_data = test_proposal.copy() proposal = self.init_proposal(proposal_data) total_days_estimated = 0 @@ -112,8 +111,7 @@ class TestMilestoneMethods(BaseUserConfig): tasks = Task.query.filter_by(job_type=MilestoneDeadline.JOB_TYPE).all() self.assertEqual(len(tasks), 1) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_set_v2_date_estimates_immediate_payout(self, mock_get): + def test_set_v2_date_estimates_immediate_payout(self): proposal_data = test_proposal.copy() proposal_data["milestones"][0]["immediate_payout"] = True @@ -123,8 +121,7 @@ class TestMilestoneMethods(BaseUserConfig): # ensure MilestoneDeadline task not created when immediate payout is set self.assertEqual(len(tasks), 0) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_set_v2_date_estimates_deadline_recalculation(self, mock_get): + def test_set_v2_date_estimates_deadline_recalculation(self): proposal_data = test_proposal.copy() proposal = self.init_proposal(proposal_data) diff --git a/backend/tests/proposal/test_api.py b/backend/tests/proposal/test_api.py index 5a08a2d5..b0d4a514 100644 --- a/backend/tests/proposal/test_api.py +++ b/backend/tests/proposal/test_api.py @@ -62,8 +62,7 @@ class TestProposalAPI(BaseProposalCreatorConfig): ) self.assert401(resp) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_update_live_proposal_fails(self, mock_get): + def test_update_live_proposal_fails(self): self.login_default_user() self.proposal.status = ProposalStatus.APPROVED resp = self.app.put("/api/v1/proposals/{}/publish".format(self.proposal.id)) @@ -121,52 +120,67 @@ class TestProposalAPI(BaseProposalCreatorConfig): self.assert404(resp) # /submit_for_approval - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_proposal_draft_submit_for_approval(self, mock_get): + def test_proposal_draft_submit_for_approval(self): self.login_default_user() resp = self.app.put("/api/v1/proposals/{}/submit_for_approval".format(self.proposal.id)) self.assert200(resp) self.assertEqual(resp.json['status'], ProposalStatus.PENDING) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_no_auth_proposal_draft_submit_for_approval(self, mock_get): + def test_no_auth_proposal_draft_submit_for_approval(self): resp = self.app.put("/api/v1/proposals/{}/submit_for_approval".format(self.proposal.id)) self.assert401(resp) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_invalid_proposal_draft_submit_for_approval(self, mock_get): + def test_invalid_proposal_draft_submit_for_approval(self): self.login_default_user() resp = self.app.put("/api/v1/proposals/12345/submit_for_approval") self.assert404(resp) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_invalid_status_proposal_draft_submit_for_approval(self, mock_get): + def test_invalid_status_proposal_draft_submit_for_approval(self): self.login_default_user() self.proposal.status = ProposalStatus.PENDING # should be ProposalStatus.DRAFT resp = self.app.put("/api/v1/proposals/{}/submit_for_approval".format(self.proposal.id)) self.assert400(resp) - @patch('requests.get', side_effect=mock_invalid_address) - def test_invalid_address_proposal_draft_submit_for_approval(self, mock_get): + def test_invalid_address_proposal_draft_submit_for_approval(self): self.login_default_user() + self.proposal.payout_address = 'invalid' resp = self.app.put("/api/v1/proposals/{}/submit_for_approval".format(self.proposal.id)) self.assert400(resp) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_invalid_status_proposal_publish_proposal(self, mock_get): + def test_invalid_status_proposal_publish_proposal(self): self.login_default_user() self.proposal.status = ProposalStatus.PENDING # should be ProposalStatus.APPROVED resp = self.app.put("/api/v1/proposals/{}/publish".format(self.proposal.id)) self.assert400(resp) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_not_verified_email_address_publish_proposal(self, mock_get): + def test_not_verified_email_address_publish_proposal(self): self.login_default_user() self.mark_user_not_verified() self.proposal.status = "DRAFT" resp = self.app.put("/api/v1/proposals/{}/publish".format(self.proposal.id)) self.assert403(resp) + def test_get_archived_proposal(self): + self.login_default_user() + + bad_id = '111111111111' + resp = self.app.get( + f"/api/v1/proposals/{bad_id}/archive" + ) + self.assert404(resp) + + resp = self.app.get( + f"/api/v1/proposals/{self.proposal.id}/archive" + ) + self.assert401(resp) + + self.proposal.status = ProposalStatus.ARCHIVED + resp = self.app.get( + f"/api/v1/proposals/{self.proposal.id}/archive" + ) + self.assert200(resp) + self.assertEqual(self.proposal.id, resp.json["proposalId"]) + # / def test_get_proposals(self): self.proposal.status = ProposalStatus.LIVE @@ -247,7 +261,7 @@ class TestProposalAPI(BaseProposalCreatorConfig): content_type="application/json", ) self.assert404(resp) - self.assertEquals(resp.json["message"], "Cannot like a proposal that's not live") + self.assertEquals(resp.json["message"], "Cannot like a proposal that's not live or in discussion") # proposal is live self.proposal.status = ProposalStatus.LIVE @@ -281,3 +295,281 @@ class TestProposalAPI(BaseProposalCreatorConfig): self.assert200(resp) self.assertEqual(resp.json["authedLiked"], False) self.assertEqual(resp.json["likesCount"], 0) + + def test_resolve_changes_discussion(self): + self.login_default_user() + + self.proposal.status = ProposalStatus.DISCUSSION + self.proposal.changes_requested_discussion = True + self.proposal.changes_requested_discussion_reason = 'test' + + resp = self.app.put( + f"/api/v1/proposals/{self.proposal.id}/resolve" + ) + self.assert200(resp) + self.assertEqual(resp.json['changesRequestedDiscussion'], False) + self.assertIsNone(resp.json['changesRequestedDiscussionReason']) + + proposal = Proposal.query.get(self.proposal.id) + self.assertEqual(proposal.changes_requested_discussion, False) + self.assertIsNone(proposal.changes_requested_discussion_reason) + + def test_resolve_changes_discussion_wrong_status_fail(self): + # resolve should fail if proposal is not in a DISCUSSION state + self.login_default_user() + self.proposal.status = ProposalStatus.PENDING + self.proposal.changes_requested_discussion = True + self.proposal.changes_requested_discussion_reason = 'test' + + # resolve changes + resp = self.app.put( + f"/api/v1/proposals/{self.proposal.id}/resolve" + ) + self.assert400(resp) + + def test_resolve_changes_discussion_bad_proposal_fail(self): + # resolve should fail if bad proposal id is provided + self.login_default_user() + bad_id = '111111111111' + # resolve changes + resp = self.app.put( + f"/api/v1/proposals/{bad_id}/resolve" + ) + self.assert404(resp) + + def test_resolve_changes_discussion_no_changes_requested_fail(self): + # resolve should fail if changes are not requested on the proposal + self.login_default_user() + self.proposal.status = ProposalStatus.DISCUSSION + self.proposal.changes_requested_discussion = False + self.proposal.changes_requested_discussion_reason = None + + # resolve changes + resp = self.app.put( + f"/api/v1/proposals/{self.proposal.id}/resolve" + ) + self.assert400(resp) + + def test_make_proposal_live_draft(self): + # user should be able to make live draft of a proposal + self.login_default_user() + self.proposal.status = ProposalStatus.DISCUSSION + + draft_resp = self.app.post( + f"/api/v1/proposals/{self.proposal.id}/draft" + ) + self.assertStatus(draft_resp, 201) + self.assertIsNone(draft_resp.json['liveDraftId']) + self.assertEqual(draft_resp.json['status'], ProposalStatus.LIVE_DRAFT) + + proposal = Proposal.query.get(self.proposal.id) + draft = Proposal.query.get(draft_resp.json['proposalId']) + draft_id = draft.id + + self.assertEqual(draft.live_draft_parent_id, proposal.id) + self.assertEqual(proposal.live_draft, draft) + + # live draft id should be included in the parent proposal json response + proposal_resp = self.app.get( + f"/api/v1/proposals/{self.proposal.id}" + ) + self.assert200(proposal_resp) + self.assertEqual(proposal_resp.json['liveDraftId'], draft_id) + + # if endpoint is called again, the same live draft should be returned + resp = self.app.post( + f"/api/v1/proposals/{self.proposal.id}/draft" + ) + self.assertStatus(resp, 201) + self.assertEqual(resp.json['status'], ProposalStatus.LIVE_DRAFT) + self.assertEqual(resp.json['proposalId'], draft_id) + + # check milestones were copied + + for i, ms in enumerate(draft_resp.json['milestones']): + title_draft = ms['title'] + title_proposal = proposal_resp.json['milestones'][i]['title'] + + self.assertEqual(title_draft, title_proposal) + + def test_make_proposal_live_draft_bad_status_fail(self): + # making live draft should fail if not in a DISCUSSION status + self.login_default_user() + resp = self.app.post( + f"/api/v1/proposals/{self.proposal.id}/draft" + ) + self.assert404(resp) + + def test_publish_live_draft(self): + # user should be able to publish live draft of a proposal + self.login_default_user() + self.proposal.status = ProposalStatus.DISCUSSION + + # double check to make sure there are no proposal revisions + self.assertEqual(len(self.proposal.revisions), 0) + + # create live draft + draft_resp = self.app.post( + f"/api/v1/proposals/{self.proposal.id}/draft" + ) + + # check the two proposals have been related correctly + self.assertStatus(draft_resp, 201) + self.assertNotEqual(draft_resp.json['proposalId'], self.proposal.id) + draft = Proposal.query.get(draft_resp.json['proposalId']) + draft_id = draft.id + + # update live draft title + new_draft_title = 'This is a test for live drafts!' + draft.title = new_draft_title + + # update live draft first milestone title + new_milestone_title = 'This is a test renaming a milestone title' + first_draft_milestone = draft.milestones[0] + first_draft_milestone.title = new_milestone_title + + # persist changes + db.session.add(first_draft_milestone) + db.session.add(draft) + db.session.commit() + + # publish live draft + resp = self.app.put( + f"/api/v1/proposals/{draft_id}/publish/live" + ) + self.assert200(resp) + self.assertEqual(resp.json['proposalId'], self.proposal.id) + + # check to see the changes have been copied to the proposal + proposal = Proposal.query.get(self.proposal.id) + self.assertEqual(proposal.title, new_draft_title) + self.assertEqual(proposal.milestones[0].title, new_milestone_title) + + # check the draft has been archived + self.assertIsNone(proposal.live_draft) + old_live_draft = Proposal.query.get(draft_id) + self.assertEqual(old_live_draft.status, ProposalStatus.ARCHIVED) + + # check the proposal revision and base snapshot was added + self.assertEqual(len(self.proposal.revisions), 2) + + def find_revision_with_index(revisions, index): + return next((r for r in revisions if r.revision_index == index), None) + + # check the base snapshot was created correctly + base_revision = find_revision_with_index(self.proposal.revisions, 0) + self.assertEqual(base_revision.revision_index, 0) + self.assertEqual(base_revision.author, self.user) + self.assertEqual(base_revision.proposal, self.proposal) + self.assertIsNotNone(base_revision.proposal_archive_id) + self.assertNotEqual(base_revision.proposal_archive_id, draft_id) + self.assertEqual(len(json.loads(base_revision.changes)), 0) + + # check the proposal revision was created correctly + revision = find_revision_with_index(proposal.revisions, 1) + self.assertEqual(revision.revision_index, 1) + self.assertEqual(revision.author, self.user) + self.assertEqual(revision.proposal, self.proposal) + self.assertEqual(revision.proposal_archive_id, draft_id) + self.assertEqual(len(json.loads(revision.changes)), 2) + + def test_publish_live_draft_bad_status_fail(self): + # publishing a live draft without a LIVE_DRAFT status should fail + self.login_default_user() + resp = self.app.put( + f"/api/v1/proposals/{self.proposal.id}/publish/live" + ) + self.assert403(resp) + + def test_publish_live_draft_bad_parent_fail(self): + # publishing a live draft without a valid parent should fail + self.login_default_user() + self.proposal.status = ProposalStatus.LIVE_DRAFT + db.session.add(self.proposal) + db.session.commit() + resp = self.app.put( + f"/api/v1/proposals/{self.proposal.id}/publish/live" + ) + self.assert404(resp) + + # publishing a live draft with an invalid parent should fail + self.proposal.live_draft_parent_id = 111111111111 + resp = self.app.put( + f"/api/v1/proposals/{self.proposal.id}/publish/live" + ) + self.assert404(resp) + + def get_proposal_revisions(self): + # user should be able to publish live draft of a proposal + self.login_default_user() + self.proposal.status = ProposalStatus.DISCUSSION + + # double check to make sure there are no proposal revisions + self.assertEqual(len(self.proposal.revisions), 0) + + # create live draft + draft1_resp = self.app.post( + f"/api/v1/proposals/{self.proposal.id}/draft" + ) + + self.assertStatus(draft1_resp, 201) + draft1 = Proposal.query.get(draft1_resp.json['proposalId']) + draft1_id = draft1.id + + # set new title and save + draft1.title = 'draft 1 title' + db.session.add(draft1) + db.session.commit() + + # publish live draft1 + resp = self.app.put( + f"/api/v1/proposals/{draft1_id}/publish/live" + ) + self.assert200(resp) + + # make sure proposal revision was created as expected + self.assertEqual(len(self.proposal.revisions), 1) + + # create second live draft + draft2_resp = self.app.post( + f"/api/v1/proposals/{self.proposal.id}/draft" + ) + self.assertStatus(draft2_resp, 201) + draft2 = Proposal.query.get(draft2_resp.json['proposalId']) + draft2_id = draft2.id + + # set new title and save + draft2.title = 'draft 2 title' + db.session.add(draft2) + db.session.commit() + + # publish live draft2 + resp = self.app.put( + f"/api/v1/proposals/{draft2_id}/publish/live" + ) + self.assert200(resp) + + # make sure proposal revision was created as expected + self.assertEqual(len(self.proposal.revisions), 2) + + # finally, call the revisions API and make sure it returns the two revisions as expected + revisions_resp = self.app.get( + f"/api/v1/proposals/{self.proposal.id}/revisions" + ) + revisions = revisions_resp.json + self.assertEqual(len(revisions), 2) + + revision1 = revisions[0] + revision2 = revisions[1] + + # check revision 1 data + self.assertEqual(revision1["proposalId"], self.proposal.id) + self.assertEqual(revision1["proposalArchiveId"], draft1_id) + self.assertGreater(len(revision1["changes"]), 0) + self.assertEqual(revision1["revisionIndex"], 0) + + # check revision 2 data + self.assertEqual(revision2["proposalId"], self.proposal.id) + self.assertEqual(revision2["proposalArchiveId"], draft2_id) + self.assertGreater(len(revision2["changes"]), 0) + self.assertEqual(revision2["revisionIndex"], 1) diff --git a/backend/tests/proposal/test_proposal_revision.py b/backend/tests/proposal/test_proposal_revision.py new file mode 100644 index 00000000..67603334 --- /dev/null +++ b/backend/tests/proposal/test_proposal_revision.py @@ -0,0 +1,226 @@ + +from ..config import BaseProposalCreatorConfig +import json +from grant.proposal.models import Proposal, ProposalRevision +from grant.utils.enums import ProposalChange +from ..test_data import test_team + + +test_milestones_a = [ + { + "title": "first milestone a", + "content": "content a", + "daysEstimated": "30", + "payoutPercent": "25", + "immediatePayout": False + }, + { + "title": "second milestone a", + "content": "content a", + "daysEstimated": "10", + "payoutPercent": "25", + "immediatePayout": False + }, + { + "title": "third milestone a", + "content": "content a", + "daysEstimated": "20", + "payoutPercent": "25", + "immediatePayout": False + }, + { + "title": "fourth milestone a", + "content": "content a", + "daysEstimated": "30", + "payoutPercent": "25", + "immediatePayout": False + } +] + +test_proposal_a = { + "team": test_team, + "content": "## My Proposal A", + "title": "Give Me Money A", + "brief": "$$$ A", + "milestones": test_milestones_a, + "target": "200", + "payoutAddress": "123", +} + +test_milestones_b = [ + { + "title": "first milestone b", + "content": "content b", + "daysEstimated": "30", + "payoutPercent": "25", + "immediatePayout": True + }, + { + "title": "second milestone b", + "content": "content b", + "daysEstimated": "40", + "payoutPercent": "75", + "immediatePayout": False + } +] + +test_proposal_b = { + "team": test_team, + "content": "## My Proposal B", + "title": "Give Me Money B", + "brief": "$$$ B", + "milestones": test_milestones_b, + "target": "100", + "payoutAddress": "123", +} + +test_proposal_c = { + "team": test_team, + "content": "## My Proposal C", + "title": "Give Me Money C", + "brief": "$$$ C", + "milestones": test_milestones_b, + "target": "100", + "payoutAddress": "123", +} + +test_proposal_d = { + "team": test_team, + "content": "## My Proposal B", + "title": "Give Me Money B", + "brief": "$$$ B", + "milestones": test_milestones_b, + "target": "200", + "payoutAddress": "123", +} + + +class TestProposalMethods(BaseProposalCreatorConfig): + def init_proposal(self, proposal_data): + self.login_default_user() + resp = self.app.post( + "/api/v1/proposals/drafts" + ) + self.assertStatus(resp, 201) + proposal_id = resp.json["proposalId"] + + resp = self.app.put( + f"/api/v1/proposals/{proposal_id}", + data=json.dumps(proposal_data), + content_type='application/json' + ) + self.assert200(resp) + return proposal_id + + def validate_changes(self, changes, expected_change, expected_milestone_index=None): + if expected_milestone_index is not None: + change = {"type": expected_change, "milestone_index": expected_milestone_index} + else: + change = {"type": expected_change} + + self.assertTrue(change in changes) + + def test_calculate_milestone_changes_no_changes(self): + old_proposal_id = self.init_proposal(test_proposal_a) + new_proposal_id = self.init_proposal(test_proposal_a) + old_proposal = Proposal.query.get(old_proposal_id) + new_proposal = Proposal.query.get(new_proposal_id) + + changes = ProposalRevision.calculate_milestone_changes(old_proposal.milestones, new_proposal.milestones) + self.assertEqual(len(changes), 0) + + def test_calculate_milestone_changes_a_to_b(self): + old_proposal_id = self.init_proposal(test_proposal_a) + new_proposal_id = self.init_proposal(test_proposal_b) + old_proposal = Proposal.query.get(old_proposal_id) + new_proposal = Proposal.query.get(new_proposal_id) + + changes = ProposalRevision.calculate_milestone_changes(old_proposal.milestones, new_proposal.milestones) + + print(changes) + + # going from milestones a to b, there should be 9 total changes + self.assertEqual(len(changes), 9) + + # the following change types should be detected + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_TITLE, 0) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_CONTENT, 0) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_IMMEDIATE_PAYOUT, 0) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_TITLE, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_CONTENT, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_DAYS, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_PERCENT, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_REMOVE, 2) + self.validate_changes(changes, ProposalChange.MILESTONE_REMOVE, 3) + + def test_calculate_milestone_changes_b_to_a(self): + old_proposal_id = self.init_proposal(test_proposal_b) + new_proposal_id = self.init_proposal(test_proposal_a) + old_proposal = Proposal.query.get(old_proposal_id) + new_proposal = Proposal.query.get(new_proposal_id) + + changes = ProposalRevision.calculate_milestone_changes(old_proposal.milestones, new_proposal.milestones) + + print(changes) + + # going from milestones b to a, there should be 9 total changes + self.assertEqual(len(changes), 9) + + # the following change types should be detected + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_TITLE, 0) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_CONTENT, 0) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_IMMEDIATE_PAYOUT, 0) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_TITLE, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_CONTENT, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_DAYS, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_PERCENT, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_ADD, 2) + self.validate_changes(changes, ProposalChange.MILESTONE_ADD, 3) + + def test_calculate_proposal_changes_c_to_d(self): + old_proposal_id = self.init_proposal(test_proposal_c) + new_proposal_id = self.init_proposal(test_proposal_d) + old_proposal = Proposal.query.get(old_proposal_id) + new_proposal = Proposal.query.get(new_proposal_id) + + changes = ProposalRevision.calculate_proposal_changes(old_proposal, new_proposal) + + print(changes) + + # going from proposal c to d, there should be 4 total changes + self.assertEqual(len(changes), 4) + + # the following change types should be detected + self.validate_changes(changes, ProposalChange.PROPOSAL_EDIT_CONTENT) + self.validate_changes(changes, ProposalChange.PROPOSAL_EDIT_TITLE) + self.validate_changes(changes, ProposalChange.PROPOSAL_EDIT_BRIEF) + self.validate_changes(changes, ProposalChange.PROPOSAL_EDIT_TARGET) + + def test_calculate_proposal_changes_d_to_a(self): + old_proposal_id = self.init_proposal(test_proposal_d) + new_proposal_id = self.init_proposal(test_proposal_a) + old_proposal = Proposal.query.get(old_proposal_id) + new_proposal = Proposal.query.get(new_proposal_id) + + changes = ProposalRevision.calculate_proposal_changes(old_proposal, new_proposal) + + print(changes) + + # going from proposal d to a, there should be 4 total changes + self.assertEqual(len(changes), 12) + + # the following proposal change types should be detected + self.validate_changes(changes, ProposalChange.PROPOSAL_EDIT_CONTENT) + self.validate_changes(changes, ProposalChange.PROPOSAL_EDIT_TITLE) + self.validate_changes(changes, ProposalChange.PROPOSAL_EDIT_BRIEF) + + # the following milestone change types should be detected + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_TITLE, 0) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_CONTENT, 0) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_IMMEDIATE_PAYOUT, 0) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_TITLE, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_CONTENT, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_DAYS, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_EDIT_PERCENT, 1) + self.validate_changes(changes, ProposalChange.MILESTONE_ADD, 2) + self.validate_changes(changes, ProposalChange.MILESTONE_ADD, 3) diff --git a/backend/tests/proposal/test_tips_api.py b/backend/tests/proposal/test_tips_api.py index dc2d88c5..4b3e22b8 100644 --- a/backend/tests/proposal/test_tips_api.py +++ b/backend/tests/proposal/test_tips_api.py @@ -5,7 +5,7 @@ from mock import patch from ..test_data import mock_blockchain_api_requests address_json = { - "address": "valid_address" + "address": "zs15el0hzs4w60ggfy6kq4p3zttjrl00mfq7yxfwsjqpz9d7hptdtkltzlcqar994jg2ju3j9k85zk" } view_key_json = { @@ -15,8 +15,7 @@ view_key_json = { class TestProposalInviteAPI(BaseProposalCreatorConfig): - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_set_proposal_tip_address(self, mock_get): + def test_set_proposal_tip_address(self): self.login_default_user() res = self.app.put( f"/api/v1/proposals/{self.proposal.id}/tips", @@ -27,8 +26,7 @@ class TestProposalInviteAPI(BaseProposalCreatorConfig): proposal = Proposal.query.get(self.proposal.id) self.assertEqual(proposal.tip_jar_address, address_json["address"]) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_set_proposal_tip_view_key(self, mock_get): + def test_set_proposal_tip_view_key(self): self.login_default_user() res = self.app.put( f"/api/v1/proposals/{self.proposal.id}/tips", diff --git a/backend/tests/task/test_api.py b/backend/tests/task/test_api.py index d878e04c..17cda811 100644 --- a/backend/tests/task/test_api.py +++ b/backend/tests/task/test_api.py @@ -181,8 +181,7 @@ class TestTaskAPI(BaseProposalCreatorConfig): @patch('grant.task.jobs.send_email') @patch('grant.task.views.datetime') - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_milestone_deadline(self, mock_get, mock_datetime, mock_send_email): + def test_milestone_deadline(self, mock_datetime, mock_send_email): tasks = Task.query.filter_by(completed=False).all() self.assertEqual(len(tasks), 0) @@ -199,8 +198,8 @@ class TestTaskAPI(BaseProposalCreatorConfig): self.login_admin() - # proposal needs to be PENDING - self.proposal.status = ProposalStatus.PENDING + # proposal needs to be DISCUSSION + self.proposal.status = ProposalStatus.DISCUSSION # approve proposal with funding resp = self.app.put( diff --git a/backend/tests/test_data.py b/backend/tests/test_data.py index a23e50fa..27e34edc 100644 --- a/backend/tests/test_data.py +++ b/backend/tests/test_data.py @@ -45,7 +45,7 @@ test_proposal = { "milestones": milestones, "category": Category.ACCESSIBILITY, "target": "12345", - "payoutAddress": "123", + "payoutAddress": "zs15el0hzs4w60ggfy6kq4p3zttjrl00mfq7yxfwsjqpz9d7hptdtkltzlcqar994jg2ju3j9k85zk", "deadlineDuration": 100 } diff --git a/backend/tests/user/test_user_api.py b/backend/tests/user/test_user_api.py index 904696c9..0f6f3a84 100644 --- a/backend/tests/user/test_user_api.py +++ b/backend/tests/user/test_user_api.py @@ -386,9 +386,8 @@ class TestUserAPI(BaseUserConfig): ) self.assert400(resp) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_put_user_settings_tip_jar_address(self, mock_get): - address = "address" + def test_put_user_settings_tip_jar_address(self): + address = "zs15el0hzs4w60ggfy6kq4p3zttjrl00mfq7yxfwsjqpz9d7hptdtkltzlcqar994jg2ju3j9k85zk" self.login_default_user() resp = self.app.put( @@ -401,8 +400,7 @@ class TestUserAPI(BaseUserConfig): user = User.query.get(self.user.id) self.assertEqual(user.settings.tip_jar_address, address) - @patch('requests.get', side_effect=mock_blockchain_api_requests) - def test_put_user_settings_tip_jar_view_key(self, mock_get): + def test_put_user_settings_tip_jar_view_key(self): view_key = "view_key" self.login_default_user() diff --git a/backend/tests/utils/__init__.py b/backend/tests/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/tests/utils/test_validate.py b/backend/tests/utils/test_validate.py new file mode 100644 index 00000000..90c0212a --- /dev/null +++ b/backend/tests/utils/test_validate.py @@ -0,0 +1,49 @@ + +from ..config import BaseTestConfig +from grant.utils.validate import is_z_address_valid + + +good_addresses = [ + "zs15el0hzs4w60ggfy6kq4p3zttjrl00mfq7yxfwsjqpz9d7hptdtkltzlcqar994jg2ju3j9k85zk", + "zs15xh8vjmlnqknztlgs7s8cu9wlj4rnd0m7hpyjwkjehalhlgwhfkvqnp8ycdpvhzfwywnc9r7yqs", + "zs1h6u0s750jtqthyf5dcck5xgvhadfsvp6vj0meem9y8ledq5r7gc6fnrgeseeprnmkzfwk8x4erc", + "zs1ke0qynx5hvx6rkqk2cg6eg2cdc7kn6ugs7ye0907pr6d09d6dsmzcxzhpawpcj73nk4svc6ualm", + "zs1m576g2evlaem403jlam3s08aned3srg5cvwphm4w7jjxylxsulzegusjpjxstau0klzckhld4s4", + "zs1su7cu6kgxp8luxs4rvvy4rd42caau7jkxmaufmj5ny6e8nuctuw4cptepjff6m8kvnsdywt733k", + "zs1qyk7tqzgreu9qsxs6ze0ptgm7tlr9j9e2dumqv5en7whhwwznscll49nteghtegz4mvtj7nt304", + "zs15vku5xmethefjarje8e9ee82znhtzlyesskee5fz0kge3m4sealp3xaqdx2se6gj2e2uzw5amnz", + "zs1szg7qncv0ywjppttagxecetlr5gler7uwcqdcfrshugh27l8mux209ff243fy60svphzvz8fss0", + "zs1rdk0xkrk2mxjge33su9fshxzrdpg5hz25zutl82l6gjyz5ph5lw9hhtd759hdg8qqttyxpqudxc" + +] + +bad_addresses = [ + None, + False, + 3, + "", + "cs15el0hzs4w60ggfy6kq4p3zttjrl00mfq7yxfwsjqpz9d7hptdtkltzlcqar994jg2ju3j9k85zk", + "zs15el0hzs4w60ggfy6kq4p3zttjrl00mfq7yxfwsjqpz9ddhptdtkltzlcqar994jg2ju3j9k85zz", + "zs15xh8vjmlnqknztlgs7s8cu9wlj4r0d0m7hpyjwkjehalhlgwhfkvqnp8ycdpvhzfwywnc9r7yqs", + "zs1h6u0s750jtqthyf5dcck5xgvhadfsvp6vj0eeem9y8ledq5r7gc6fnrgeseeprnmkzfwk8x4erc", + "zs1ke0qynx5hvx6rkqk2cg6eg2cdc7kn6ugs7yd0907pr6d09d6dsmzcxzhpawpcj73nk4svc6ualm", + "zs1m576g2evlaem403jlam3s08aned3srg5cvwph4w7jjxylxsulzegusjpjxstau0klzckhld4s4", + "zs1su7cu6kgxp8luxs4rvvy4rd42caau7jkxmauhfmj5ny6e8nuctuw4cptepjff6m8kvnsdywt733k", + "zs1qyk7tqzgreu9qsxs6ze0ptgm7tlr9j9e2duv5en7whhwwznscll49nteghtegz4mvtj7nt304", + "zs15vku5xmethefjarje8e9ee82znhtzlzwyesskee5fz0kge3m4sealp3xaqdx2se6gj2e2uzw5amnz", + "zs1szg7qncv0ywjppttagxecetlr5gler70wcqdcfrshugh27l8mux209ff243fy60svphzvz8fss0", + "zs1rdk0xkrk2mxjge33su9fshxzrdpg5hz25zutl82l6gjyz5ph5tw9hhtd759hdg8qqttyxpqudxc" +] + + +class TestValidate(BaseTestConfig): + + def test_good_addresses_should_be_valid(self): + for addr in good_addresses: + is_valid = is_z_address_valid(addr) + self.assertTrue(is_valid) + + def test_bad_addresses_should_be_invalid(self): + for addr in bad_addresses: + is_valid = is_z_address_valid(addr) + self.assertFalse(is_valid) diff --git a/blockchain/.env.example b/blockchain/.env.example deleted file mode 100644 index b8187afe..00000000 --- a/blockchain/.env.example +++ /dev/null @@ -1,48 +0,0 @@ -# Webhooks Config -WEBHOOK_URL="http://localhost:5000/api/v1" - -# REST Server Config -PORT="5051" - -# Zcash Node (Defaults are for regtest) -ZCASH_NODE_URL="http://localhost:18232" -ZCASH_NODE_USERNAME="zcash_user" -ZCASH_NODE_PASSWORD="zcash_password" -MINIMUM_BLOCK_CONFIRMATIONS="6" - -# Shared Server Config, run `yarn genkey` to generate -API_SECRET_HASH="" -API_SECRET_KEY="" - -############################ ADDRESS DERIVATION ############################ -# You should only set one OR the other. The former will generate addresses # -# using Bip32 address derivation. The latter uses BitGo's API. If you set # -# both, BitGo takes precedence. API key should ONLY HAVE VIEW ACCESS! # -############################################################################ - -# BITGO_WALLET_ID="" -# BITGO_ACCESS_TOKEN="" - -### OR ### - -# BIP32_XPUB="" - -############################################################################ - - -# Addresses, run `yarn genaddress` to get sprout information -SPROUT_ADDRESS="" -SPROUT_VIEWKEY="" - -# Block heights to fall back on for starting our scan -MAINNET_START_BLOCK="464000" -TESTNET_START_BLOCK="390000" - -# Sentry URL -SENTRY_DSN="" - -# Logging level -LOG_LEVEL="debug" - -# Fixie proxy URL for BitGo requests (optional) -# FIXIE_URL="" diff --git a/blockchain/.gitignore b/blockchain/.gitignore deleted file mode 100755 index f892b34e..00000000 --- a/blockchain/.gitignore +++ /dev/null @@ -1,69 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.testnet - -# next.js build output -.next - -# zcash -.zcash/regtest -.zcash/export - -# Output -dist \ No newline at end of file diff --git a/blockchain/.zcash/zcash.conf b/blockchain/.zcash/zcash.conf deleted file mode 100644 index 2049393d..00000000 --- a/blockchain/.zcash/zcash.conf +++ /dev/null @@ -1,15 +0,0 @@ -regtest=1 -server=1 - -rpcuser=zcash_user -rpcpassword=zcash_password -rpcport=18232 -rpcconnect=127.0.0.1 - -txindex=1 -experimentalfeatures=1 -developersapling=1 -nuparams=5ba81b19:98 -nuparams=76b809bb:100 - -exportdir=.zcash/export \ No newline at end of file diff --git a/blockchain/Procfile b/blockchain/Procfile deleted file mode 100644 index 709e0a25..00000000 --- a/blockchain/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: yarn start \ No newline at end of file diff --git a/blockchain/README.md b/blockchain/README.md deleted file mode 100755 index 5b1e8678..00000000 --- a/blockchain/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Blockchain Watcher - -Creates a websocket server that reads and reports on the activity of the Zcash -blockchain. Communicates with a node over RPC. - -## Development - -### First time setup (Only do once) - -1. Run `yarn` to fetch all dependencies -2. Copy `.env.example` to `.env` -3. Run a zcashd regtest node with the following command - ``` - zcashd -daemon -datadir=./.zcash -wallet=offline.dat - ``` -4. Mine at least 100 blocks with `zcash-cli generate 101` to activate Overwinter and Sapling -4. Run `yarn genkey` and copy the environment variables into `.env` -6. Run `yarn genaddress` and copy the environment variables into `.env` - -### After all that... - -1. Run zcashd (without the offline wallet) - ``` - zcashd -daemon -datadir=./.zcash - ``` -2. Run the websocket server with - ``` - yarn dev - ``` - -See [the Wiki page](https://github.com/dternyak/zcash-grant-system/wiki/Running-ZCash-Regtest) for more information on running a regtest node. - -## Deployment - -TBD diff --git a/blockchain/package.json b/blockchain/package.json deleted file mode 100755 index e9c40b0b..00000000 --- a/blockchain/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "zcash-blockchain-watcher", - "version": "1.0.0", - "engines": { - "node": "8.13.0" - }, - "main": "index.js", - "license": "MIT", - "scripts": { - "dev": "yarn run build:live", - "build": "tsc -p .", - "build:live": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/dev/index.ts", - "genkey": "yarn run ts-node src/bin/genkey.ts", - "genaddress": "yarn run ts-node src/bin/genaddress.ts", - "test": "NODE_ENV=test yarn ts-mocha --no-colors src/**/*.spec.ts", - "heroku-postbuild": "yarn build", - "start": "node ./dist/index.js" - }, - "devDependencies": { - "@types/body-parser": "1.17.0", - "@types/expect": "^1.20.3", - "@types/express": "4.16.0", - "@types/mocha": "^5.2.5", - "@types/node": "^10.12.11", - "isomorphic-ws": "^4.0.1", - "mocha": "^5.2.0", - "nodemon": "^1.18.7", - "ts-mocha": "^2.0.0", - "ts-node": "^7.0.1", - "typescript": "^3.2.1" - }, - "dependencies": { - "@sentry/node": "4.6.4", - "@types/cors": "2.8.4", - "@types/dotenv": "^6.1.0", - "@types/ws": "^6.0.1", - "axios": "0.18.0", - "bitgo": "4.48.1", - "body-parser": "1.18.3", - "cors": "2.8.5", - "dotenv": "^6.1.0", - "express": "4.16.4", - "redux": "4.0.1", - "stdrpc": "1.0.0", - "winston": "3.1.0", - "ws": "^6.1.2", - "zcash-bitcore-lib": "0.13.20-rc3" - } -} diff --git a/blockchain/src/bin/genaddress.ts b/blockchain/src/bin/genaddress.ts deleted file mode 100644 index ee6302a8..00000000 --- a/blockchain/src/bin/genaddress.ts +++ /dev/null @@ -1,18 +0,0 @@ -import node from '../node'; -import { extractErrMessage } from '../util'; - -async function printAddressAndKey() { - try { - let address = await node.z_getnewaddress('sprout'); - const viewkey = await node.z_exportviewingkey(address); - - console.log("\nCopy these to your .env\n"); - console.log(`SPROUT_ADDRESS="${address}"`); - console.log(`SPROUT_VIEWKEY="${viewkey}"\n`); - } catch(err) { - console.error(extractErrMessage(err)); - process.exit(1); - } -} - -printAddressAndKey(); diff --git a/blockchain/src/bin/genkey.ts b/blockchain/src/bin/genkey.ts deleted file mode 100755 index 7ee7fafc..00000000 --- a/blockchain/src/bin/genkey.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { generateApiKey } from "../util"; - -const result = generateApiKey(); - -console.log("\nCopy both to your .env, and API_SECRET_KEY to your client environment.\n"); -console.log(` API_SECRET_KEY=${result.key}`); -console.log(` API_SECRET_HASH=${result.hash}\n`); diff --git a/blockchain/src/bitgo.ts b/blockchain/src/bitgo.ts deleted file mode 100644 index a7c06f21..00000000 --- a/blockchain/src/bitgo.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { BitGo, Wallet } from 'bitgo'; -import bitcore from "zcash-bitcore-lib"; -import env from './env'; -import log from './log'; -import { getNetwork } from './node'; - -let bitgoWallet: Wallet; - -export async function initBitGo() { - if (!env.BITGO_ACCESS_TOKEN || !env.BITGO_WALLET_ID) { - log.info('BITGO environment variables not set, nooping initBitGo'); - return; - } - - // Assert that we're on mainnet - const network = getNetwork(); - if (network !== bitcore.Networks.mainnet) { - throw new Error(`BitGo cannot be used on anything but mainnet, connected node is ${network}`); - } - - const proxy = env.FIXIE_URL || undefined; - const bitgo = new BitGo({ - env: 'prod', // Non-prod ZEC is not supported - accessToken: env.BITGO_ACCESS_TOKEN, - proxy, - }); - bitgoWallet = await bitgo.coin('zec').wallets().get({ id: env.BITGO_WALLET_ID }); - log.info(`Initialized BitGo wallet "${bitgoWallet.label()}"`); - if (proxy) { - log.info(`Proxying BitGo requests through ${proxy}`); - } -} - -export async function getContributionAddress(id: number) { - if (!bitgoWallet) { - throw new Error('Must run initBitGo before getContributionAddress'); - } - - // Attempt to fetch first - const label = `Contribution #${id}`; - const res = await bitgoWallet.addresses({ labelContains: label }); - if (res.addresses.length) { - if (res.addresses.length > 1) { - log.warn(`Contribution ${id} has ${res.addresses.length} associated with it. Using the first one (${res.addresses[0].address})`); - } - return res.addresses[0].address; - } - - // Create a new one otherwise - const createRes = await bitgoWallet.createAddress({ label }); - log.info(`Generate new address for contribution ${id}`); - return createRes.address; -} - -function generateLabel(id: number) { - return `Contribution #${id}`; -} \ No newline at end of file diff --git a/blockchain/src/dev/index.html b/blockchain/src/dev/index.html deleted file mode 100755 index 3ca296c5..00000000 --- a/blockchain/src/dev/index.html +++ /dev/null @@ -1,272 +0,0 @@ - - - - - - - ts-node-websocket-microservice DEV - - - - - - -
- -
-
- disconnected - -

Websocket

- - -
-
-
- - - -
-
- - - - -
-
-

REST API

-
-
-
Send a request to view the response
-
-
- - - -
-
- -
- - diff --git a/blockchain/src/dev/index.ts b/blockchain/src/dev/index.ts deleted file mode 100755 index ad968471..00000000 --- a/blockchain/src/dev/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import http from "http"; -import fs from "fs"; -import env from "../env"; -import log from "../log"; - -import "../index"; - -const hostname = "127.0.0.1"; -const port = 3050; - -http.createServer(function(request, response) { - fs.readFile("./src/dev/index.html", function(err, html) { - if (err) { - throw err; - } - response.writeHead(200, { "Content-Type": "text/html" }); - response.write( - html - .toString() - .replace(/\$\$API_SECRET_KEY/g, env.API_SECRET_KEY || "") - .replace(/\$\$REST_PORT/g, env.PORT || "") - ); - response.end(); - }); -}) -.listen(port, hostname, () => { - log.info(`Devtool running at http://${hostname}:${port}/`); -}); diff --git a/blockchain/src/env.ts b/blockchain/src/env.ts deleted file mode 100644 index fa9fa522..00000000 --- a/blockchain/src/env.ts +++ /dev/null @@ -1,72 +0,0 @@ -import dotenv from "dotenv"; -dotenv.load(); - -// Maps to .env.example variables, plus any node ones we use -// fill in sensible defaults, falsy values will throw if not set -const DEFAULTS = { - NODE_ENV: "development", - LOG_LEVEL: "info", - - API_SECRET_HASH: "", - API_SECRET_KEY: "", - - WEBHOOK_URL: "", - PORT: "5051", - - ZCASH_NODE_URL: "", - ZCASH_NODE_USERNAME: "", - ZCASH_NODE_PASSWORD: "", - MINIMUM_BLOCK_CONFIRMATIONS: "6", - - BITGO_WALLET_ID: "", - BITGO_ACCESS_TOKEN: "", - - BIP32_XPUB: "", - - SPROUT_ADDRESS: "", - SPROUT_VIEWKEY: "", - - MAINNET_START_BLOCK: "464000", - TESTNET_START_BLOCK: "390000", - - SENTRY_DSN: "", - FIXIE_URL: "", -}; - -const OPTIONAL: { [key: string]: undefined | boolean } = { - BITGO_WALLET_ID: true, - BITGO_ACCESS_TOKEN: true, - BIP32_XPUB: true, - FIXIE_URL: true, - // NOTE: Remove these from optional when sapling is ready - SPROUT_ADDRESS: true, - SPROUT_VIEWKEY: true, -} - -type CustomEnvironment = typeof DEFAULTS; - -// ignore when testing -if (process.env.NODE_ENV !== "test") { - // Set environment variables, throw on missing required ones - Object.entries(DEFAULTS).forEach(([k, v]) => { - if (!process.env[k]) { - const defVal = (DEFAULTS as any)[k]; - if (defVal) { - console.info(`Using default environment variable ${k}="${defVal}"`); - process.env[k] = defVal; - } else if (!OPTIONAL[k]) { - throw new Error(`Missing required environment variable ${k}`); - } - } - }); - - // Ensure we have either xpub or bitgo, and warn if we have both - if (!process.env.BIP32_XPUB && (!process.env.BITGO_WALLET_ID || !process.env.BITGO_ACCESS_TOKEN)) { - throw new Error('Either BIP32_XPUB or BITGO_* environment variables required, missing both'); - } - if (process.env.BIP32_XPUB && process.env.BITGO_WALLET_ID) { - console.info('BIP32_XPUB and BITGO environment variables set, BIP32_XPUB will be ignored'); - } -} - -export default (process.env as any) as CustomEnvironment; diff --git a/blockchain/src/index.ts b/blockchain/src/index.ts deleted file mode 100755 index aad5fa12..00000000 --- a/blockchain/src/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -import * as Sentry from "@sentry/node"; -import * as Webhooks from "./webhooks"; -import * as RestServer from "./server"; -import { initNode } from "./node"; -import { initBitGo } from "./bitgo"; -import { extractErrMessage } from "./util"; -import env from "./env"; -import log from "./log"; - -async function start() { - if (env.SENTRY_DSN) { - Sentry.init({ - dsn: env.SENTRY_DSN, - environment: env.NODE_ENV, - }); - } - - log.info("============== Starting services =============="); - await initNode(); - await initBitGo(); - await RestServer.start(); - Webhooks.start(); - log.info("==============================================="); -} - -process.on("SIGINT", () => { - log.info('Shutting down services...'); - Webhooks.exit(); - RestServer.exit(); - log.info('Exiting!'); - process.exit(); -}); - -start().catch(err => { - Sentry.captureException(err); - log.error(`Unexpected error while starting blockchain watcher: ${extractErrMessage(err)}`); - process.exit(1); -}); diff --git a/blockchain/src/log.ts b/blockchain/src/log.ts deleted file mode 100644 index 88abe473..00000000 --- a/blockchain/src/log.ts +++ /dev/null @@ -1,16 +0,0 @@ -import winston from 'winston'; -import env from './env'; - -const logger = winston.createLogger({ - level: env.LOG_LEVEL || 'info', - format: winston.format.combine( - winston.format.colorize(), - winston.format.timestamp({ format: 'MM/DD/YY HH:mm:ss' }), - winston.format.printf(i => `[${i.timestamp}] [${i.level}]: ${i.message}`), - ), - transports: [ - new winston.transports.Console(), - ], -}); - -export default logger; diff --git a/blockchain/src/node.ts b/blockchain/src/node.ts deleted file mode 100644 index 17c09e21..00000000 --- a/blockchain/src/node.ts +++ /dev/null @@ -1,254 +0,0 @@ -import stdrpc from "stdrpc"; -import bitcore from "zcash-bitcore-lib"; -import { captureException } from "@sentry/node"; -import env from "./env"; -import log from "./log"; -import { extractErrMessage } from "./util"; - -export interface BlockChainInfo { - chain: string; - blocks: number; - headers: number; - bestblockhash: string; - difficulty: number; - // Much much more, but not necessary -} - -export interface ScriptPubKey { - asm: string; - hex: string; - type: string; - reqSigs?: number; - addresses?: string[]; -} - -export interface VIn { - sequence: number; - coinbase?: string; -} - -export interface VOut { - value: number; - valueZat: number; - n: number; - scriptPubKey: ScriptPubKey; -} - -export interface Transaction { - txid: string; - hex: string; - version: number; - locktime: number; - expiryheight: number; - blockhash: string; - blocktime: number; - confirmations: number; - time: number; - vin: VIn[]; - vout: VOut[]; - // unclear what vjoinsplit is - vjoinsplit: any[]; -} - -export interface RawTransaction { - txid: string; - hex: string; - overwintered: boolean; - version: number; - versiongroupid: number; - locktime: number; - expiryheight: string; - vin: VIn[]; - vout: VOut[]; - valueBalance: string; - blockhash: string; - blocktime: number; - confirmations: number; - time: number; - // unclear what these are - vjoinsplit: any[]; - vShieldedSpend: any[]; - vShieldedOutput: any[]; -} - -export interface Block { - hash: string; - confirmations: number; - size: number; - height: number; - version: number; - merkleroot: string; - finalsaplingroot: string; - time: number; - nonce: string; - solution: string; - bits: string; - difficulty: number; - chainwork: string; - anchor: string; - // valuePools ? - previousblockhash?: string; - nextblockhash?: string; -} - -export interface BlockWithTransactionIds extends Block { - tx: string[]; -} - -export interface BlockWithTransactions extends Block { - tx: Transaction[]; -} - -export interface Receipt { - txid: string; - amount: number; - memo: string; - change: boolean; -} - -export interface DisclosedPayment { - txid: string; - jsIndex: number; - outputIndex: number; - version: number; - onetimePrivKey: string; - joinSplitPubKey: string; - signatureVerified: boolean; - paymentAddress: string; - memo: string; - value: number; - commitmentMatch: boolean; - valid: boolean; - message?: string; -} - -// Actually comes back with a bunch of args, but this is all we need -export interface ValidationResponse { - isvalid: boolean; -} - -// https://github.com/zcash/zcash/blob/master/doc/payment-api.md -interface ZCashNode { - getblockchaininfo: () => Promise; - getblockcount: () => Promise; - getblock: { - (numberOrHash: string | number, verbosity?: 1): Promise< - BlockWithTransactionIds - >; - (numberOrHash: string | number, verbosity: 2): Promise< - BlockWithTransactions - >; - (numberOrHash: string | number, verbosity: 0): Promise; - }; - gettransaction: (txid: string) => Promise; - getrawtransaction: { - (numberOrHash: string | number, verbosity: 1): Promise; - (numberOrHash: string | number, verbosity?: 0): Promise; - }; - validateaddress: (address: string) => Promise; - z_getbalance: (address: string, minConf?: number) => Promise; - z_getnewaddress: (type?: "sprout" | "sapling") => Promise; - z_listaddresses: () => Promise; - z_listreceivedbyaddress: ( - address: string, - minConf?: number - ) => Promise; - z_importviewingkey: ( - key: string, - rescan?: "yes" | "no" | "whenkeyisnew", - startHeight?: number - ) => Promise; - z_exportviewingkey: (zaddr: string) => Promise; - z_validatepaymentdisclosure: ( - disclosure: string - ) => Promise; - z_validateaddress: (address: string) => Promise; -} - -export const rpcOptions = { - url: env.ZCASH_NODE_URL, - username: env.ZCASH_NODE_USERNAME, - password: env.ZCASH_NODE_PASSWORD -}; - -const node: ZCashNode = stdrpc(rpcOptions); - -export default node; - -let network: any; -export async function initNode() { - // Check if node is available & setup network - try { - const info = await node.getblockchaininfo(); - log.info(`Connected to ${info.chain} node at block height ${info.blocks}`); - - if (info.chain === "regtest") { - bitcore.Networks.enableRegtest(); - } - if (info.chain.includes("test")) { - network = bitcore.Networks.testnet; - } else { - network = bitcore.Networks.mainnet; - } - } catch (err) { - captureException(err); - log.error(extractErrMessage(err)); - log.error(`Failed to connect to zcash node with the following credentials: ${JSON.stringify(rpcOptions, null, 2)}`); - process.exit(1); - } - - // Check if sprout address is readable - // NOTE: Replace with sapling when ready - // try { - // if (!env.SPROUT_ADDRESS) { - // console.error("Missing SPROUT_ADDRESS environment variable, exiting"); - // process.exit(1); - // } - // await node.z_getbalance(env.SPROUT_ADDRESS as string); - // } catch (err) { - // if (!env.SPROUT_VIEWKEY) { - // log.error( - // "Unable to view SPROUT_ADDRESS and missing SPROUT_VIEWKEY environment variable, exiting" - // ); - // process.exit(1); - // } - // await node.z_importviewingkey(env.SPROUT_VIEWKEY as string); - // await node.z_getbalance(env.SPROUT_ADDRESS as string); - // } -} - -export function getNetwork() { - if (!network) { - throw new Error("Called getNetwork before initNode"); - } - return network; -} - -// Relies on initNode being called first -export async function getBootstrapBlockHeight(txid: string | undefined) { - if (txid) { - try { - const tx = await node.getrawtransaction(txid, 1); - const block = await node.getblock(tx.blockhash); - const height = - block.height - parseInt(env.MINIMUM_BLOCK_CONFIRMATIONS, 10); - return height.toString(); - } catch (err) { - log.warn(`Attempted to get block height for tx ${txid} but failed with the following error: ${extractErrMessage(err)}`); - } - } - - // If we can't find the latest tx block, fall back to when the grant - // system first launched, and scan from there. Regtest or unknown networks - // start from the bottom. - const net = getNetwork(); - let height = "0"; - if (net === bitcore.Networks.mainnet) { - height = env.MAINNET_START_BLOCK; - } else if (net === bitcore.Networks.testnet && !net.regtestEnabled) { - height = env.TESTNET_START_BLOCK; - } - - log.info(`Falling back to hard-coded starter block height ${height}`); - return height; -} diff --git a/blockchain/src/server/index.ts b/blockchain/src/server/index.ts deleted file mode 100644 index 4aadc12c..00000000 --- a/blockchain/src/server/index.ts +++ /dev/null @@ -1,162 +0,0 @@ -import express from 'express'; -import bodyParser from 'body-parser'; -import { Server } from 'http'; -import cors from 'cors'; -import { captureException } from "@sentry/node"; -import authMiddleware from './middleware/auth'; -import errorHandlerMiddleware from './middleware/errorHandler'; -import { - store, - setStartingBlockHeight, - generateAddresses, - getAddressesByContributionId, - addPaymentDisclosure, -} from '../store'; -import env from '../env'; -import node, { getBootstrapBlockHeight } from '../node'; -import { makeContributionMemo, extractErrMessage } from '../util'; -import log from '../log'; - -// Configure server -const app = express(); -const limit = '50mb'; -app.set('port', env.PORT); -app.use(cors()); -app.use(bodyParser.json({ limit })); -app.use(bodyParser.urlencoded({ extended: true, limit })); -app.use(authMiddleware); - -// Routes -app.post('/bootstrap', async (req, res) => { - const { pendingContributions, latestTxId } = req.body; - - let info; - let startHeight; - try { - info = await node.getblockchaininfo(); - startHeight = await getBootstrapBlockHeight(latestTxId); - } catch(err) { - log.error(`Unknown node error during bootstrap: ${extractErrMessage(err)}`); - return res.status(500).json({ error: 'Unknown zcash node error' }); - } - - console.info('Bootstrapping watcher!'); - console.info(' * Start height:', startHeight); - console.info(' * Current height:', info.blocks); - console.info(' * Number of pending contributions:', pendingContributions.length); - console.info('Generating addresses to watch for each contribution...'); - - // Running generate address on each will add each contribution to redux state - try { - const dispatchers = pendingContributions.map(async (c: any) => { - const action = await generateAddresses(c.id); - store.dispatch(action); - }); - await Promise.all(dispatchers); - console.info(`Done! Generated ${pendingContributions.length} addresses.`); - store.dispatch(setStartingBlockHeight(startHeight)); - } catch(err) { - log.error(`Unknown error during bootstrap address generation: ${extractErrMessage(err)}`); - return res.status(500).json({ error: 'Failed to generate addresses for contributions' }); - } - - // Send back some basic info about where the chain is at - res.json({ - data: { - startHeight, - currentHeight: info.blocks, - }, - }); -}); - -app.get('/contribution/addresses', async (req, res) => { - const { contributionId } = req.query; - let addresses = getAddressesByContributionId(store.getState(), contributionId) - if (!addresses) { - try { - const action = await generateAddresses(contributionId); - addresses = action.payload.addresses; - store.dispatch(action); - } catch(err) { - log.error(`Unknown error during address generation for contribution ${contributionId}: ${extractErrMessage(err)}`); - } - } - - if (addresses) { - res.json({ - data: { - ...addresses, - memo: makeContributionMemo(contributionId), - }, - }); - } else { - res.status(500).json({ error: 'Failed to generate addresses' }); - } -}); - - -app.post('/contribution/disclosure', async (req, res) => { - const { disclosure, contributionId } = req.body; - if (!disclosure) { - return res.status(400).json({ error: 'Argument `disclosure` is required' }); - } - - try { - const receipt = await node.z_validatepaymentdisclosure(disclosure); - if (receipt.valid) { - // Add disclosure to redux. Even if validated, we won't confirm the - // payment until it's been settled after some number of blocks. This - // also keeps all of the confirmation code in one place. - store.dispatch(addPaymentDisclosure(contributionId, disclosure)); - return res.status(200).json({ data: receipt }); - } else { - log.warn('Invalid payment disclosure provided:', receipt); - return res.status(400).json({ error: 'Payment disclosure is invalid' }); - } - } catch(err) { - captureException(err); - // -8 seems to be the "invalid disclosure hex" catch-all code - if (err.response && err.response.data && err.response.data.error.code === -8) { - return res.status(400).json({ error: err.response.data.error.message }); - } - else { - log.error(`Unknown node error during disclosure: ${extractErrMessage(err)}`); - return res.status(500).json({ error: 'Unknown zcash node error' }); - } - } -}); - -app.get('/validate/address', async (req, res) => { - const { address } = req.query; - const [tRes, zRes] = await Promise.all([ - node.validateaddress(address as string), - node.z_validateaddress(address as string), - ]); - return res.json({ - data: { - valid: tRes.isvalid || zRes.isvalid, - }, - }); -}); - -// Error handler after all routes to catch thrown exceptions -app.use(errorHandlerMiddleware); - -// Exports -let server: Server; - -export function start() { - return new Promise(resolve => { - server = app.listen(env.PORT, () => { - log.info(`REST server started on port ${env.PORT}`); - resolve(); - }); - }); -} - -export function exit() { - if (server) { - server.close(); - log.info('REST server has been closed'); - } -} diff --git a/blockchain/src/server/middleware/auth.ts b/blockchain/src/server/middleware/auth.ts deleted file mode 100644 index 2adc437e..00000000 --- a/blockchain/src/server/middleware/auth.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; -import { authenticate } from '../../util'; - -export default function(req: Request, res: Response, next: NextFunction) { - if (!req.headers['authorization']) { - res.status(403).json({ error: 'Authorization header is required' }); - return; - } - if (!authenticate(req.headers['authorization'])) { - res.status(403).json({ error: 'Authorization header is invalid' }); - return; - } - next(); -} diff --git a/blockchain/src/server/middleware/errorHandler.ts b/blockchain/src/server/middleware/errorHandler.ts deleted file mode 100644 index d3be2f37..00000000 --- a/blockchain/src/server/middleware/errorHandler.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { captureException } from "@sentry/node"; -import { Request, Response, NextFunction } from 'express'; -import log from "../../log"; -import { extractErrMessage } from "../../util"; - -export default function errorHandler(err: Error, req: Request, res: Response, next: NextFunction) { - // Non-error responses, or something else handled & responded - if (!err || res.headersSent) { - next(err); - } - - captureException(err); - log.error(`Uncaught ${err.name} exception at ${req.method} ${req.path}: ${extractErrMessage(err)}`); - log.debug(`Query: ${JSON.stringify(req.query, null, 2)}`); - log.debug(`Body: ${JSON.stringify(req.body, null, 2)}`); - log.debug(`Full stacktrace:\n${err.stack}`); - return res.status(500).json({ error: err.message }); -} diff --git a/blockchain/src/store/actions.ts b/blockchain/src/store/actions.ts deleted file mode 100644 index c6236594..00000000 --- a/blockchain/src/store/actions.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type, { AddressCollection } from './types'; -import { deriveTransparentAddress } from '../util'; -import { getNetwork } from '../node'; -import { getContributionAddress } from '../bitgo'; -import env from '../env'; - -export function setStartingBlockHeight(height: string | number) { - return { - type: type.SET_STARTING_BLOCK_HEIGHT as type.SET_STARTING_BLOCK_HEIGHT, - payload: parseInt(height.toString(), 10), - } -} - -export async function generateAddresses(contributionId: number) { - let transparent; - if (env.BITGO_WALLET_ID) { - transparent = await getContributionAddress(contributionId); - } else { - transparent = deriveTransparentAddress(contributionId, getNetwork()); - } - - const addresses: AddressCollection = { - transparent, - sprout: env.SPROUT_ADDRESS, - }; - return { - type: type.GENERATE_ADDRESSES as type.GENERATE_ADDRESSES, - payload: { - addresses, - contributionId, - }, - }; -} - -export function addPaymentDisclosure(contributionId: number, disclosure: string) { - return { - type: type.ADD_PAYMENT_DISCLOSURE as type.ADD_PAYMENT_DISCLOSURE, - payload: { - contributionId, - disclosure, - }, - }; -} - -export function confirmPaymentDisclosure(contributionId: number, disclosure: string) { - return { - type: type.CONFIRM_PAYMENT_DISCLOSURE as type.CONFIRM_PAYMENT_DISCLOSURE, - payload: { - contributionId, - disclosure, - }, - }; -} - -type UnwrapPromise = T extends Promise ? U : T; -export type ActionTypes = - | ReturnType - | UnwrapPromise> - | ReturnType - | ReturnType; diff --git a/blockchain/src/store/index.ts b/blockchain/src/store/index.ts deleted file mode 100644 index 158c27c1..00000000 --- a/blockchain/src/store/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createStore, Store } from 'redux'; -import { reducer, StoreState } from './reducer'; - -export * from './reducer'; -export * from './selectors'; -export * from './actions'; - -export const store = createStore(reducer); diff --git a/blockchain/src/store/reducer.ts b/blockchain/src/store/reducer.ts deleted file mode 100644 index 5997d3e5..00000000 --- a/blockchain/src/store/reducer.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type, { AddressCollection } from './types'; -import { ActionTypes } from './actions'; -import { dedupeArray, removeItem } from '../util'; - -export interface StoreState { - startingBlockHeight: number | null; - watchAddresses: { [contributionId: number]: AddressCollection }; - watchDisclosures: { [contributionId: number]: string }; -} - -const INITIAL_STATE: StoreState = { - startingBlockHeight: null, - watchAddresses: {}, - watchDisclosures: {}, -}; - -export function reducer(state: StoreState = INITIAL_STATE, action: ActionTypes): StoreState { - switch(action.type) { - case type.SET_STARTING_BLOCK_HEIGHT: - return { - ...state, - startingBlockHeight: action.payload, - }; - - case type.GENERATE_ADDRESSES: - return { - ...state, - watchAddresses: { - ...state.watchAddresses, - [action.payload.contributionId]: action.payload.addresses, - }, - }; - - case type.ADD_PAYMENT_DISCLOSURE: - return { - ...state, - watchDisclosures: { - ...state.watchDisclosures, - [action.payload.contributionId]: action.payload.disclosure, - }, - }; - - case type.CONFIRM_PAYMENT_DISCLOSURE: { - const watchDisclosures = { ...state.watchDisclosures }; - delete watchDisclosures[action.payload.contributionId]; - return { - ...state, - watchDisclosures, - }; - } - } - return state; -} diff --git a/blockchain/src/store/selectors.ts b/blockchain/src/store/selectors.ts deleted file mode 100644 index c2d6eb2d..00000000 --- a/blockchain/src/store/selectors.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { StoreState as S } from './reducer'; -import { AddressCollection } from './types' - -export const getWatchAddresses = (s: S) => s.watchAddresses; -export const getAddressesByContributionId = (s: S, cid: number): AddressCollection | undefined => - s.watchAddresses[cid]; - -export const getWatchDisclosures = (s: S) => s.watchDisclosures; -export const getWatchDisclosureByContributionId = (s: S, cid: number): string | undefined => - s.watchDisclosures[cid]; diff --git a/blockchain/src/store/types.ts b/blockchain/src/store/types.ts deleted file mode 100644 index d6d004ab..00000000 --- a/blockchain/src/store/types.ts +++ /dev/null @@ -1,13 +0,0 @@ -enum ACTION_TYPE { - SET_STARTING_BLOCK_HEIGHT = 'SET_STARTING_BLOCK_HEIGHT', - GENERATE_ADDRESSES = 'GENERATE_ADDRESSES', - ADD_PAYMENT_DISCLOSURE = 'ADD_PAYMENT_DISCLOSURE', - CONFIRM_PAYMENT_DISCLOSURE = 'CONFIRM_PAYMENT_DISCLOSURE', -} - -export default ACTION_TYPE; - -export interface AddressCollection { - transparent: string; - sprout: string; -} diff --git a/blockchain/src/util.spec.ts b/blockchain/src/util.spec.ts deleted file mode 100644 index ca4556b2..00000000 --- a/blockchain/src/util.spec.ts +++ /dev/null @@ -1,196 +0,0 @@ -import 'mocha'; -import assert from 'assert'; -import bitcore from 'zcash-bitcore-lib'; -import * as util from './util'; - -describe('util', () => { - describe('generateApiKey', () => { - it('Should generate a a secrey key and hash', () => { - const key = util.generateApiKey(); - assert.ok(key.hash); - assert.ok(key.key); - }); - - it('Should generate a random API key', () => { - const key1 = util.generateApiKey(); - const key2 = util.generateApiKey(); - assert.notEqual(key1.hash, key2.hash); - assert.notEqual(key1.key, key2.key); - }); - }); - - describe('authenticate', () => { - const key = util.generateApiKey(); - let oldHash: any; - before(() => { - oldHash = process.env.API_SECRET_HASH; - process.env.API_SECRET_HASH = key.hash; - }); - - it('Should authenticate a key generated from generateApiKey', () => { - assert.ok(util.authenticate(key.key)); - }); - - after(() => { - process.env.API_SECRET_HASH = oldHash; - }); - }); - - // Keys and values taken from https://iancoleman.io/bip39/ - describe('deriveTransparentAddress', () => { - const xpub = 'xpub6DKCpzYonPtjhfL9Gc6cJRxqtX3pvw3ACLguiZByfS1vic1EqgHPRBu7inUvoNxBT1m6BNuU5uUSSo5X3Zzi5mbrByBBQwhvNmmi8HErHt6'; - const addresses = { - mainnet: { - 0: 't1MZtRMbCE6uJTbVot6XczUKNvG5iRgcf8d', - 999: 't1aCsQns9UuRZzdXp71gFTpcMomyFfpWE1W', - }, - testnet: { - 0: 'tmDQdkC5bcmQobqhFYpqMr8z8XFAXragbZ6', - 999: 'tmS3cjdMYsZw58sjFmjyzKVH7Qm458gbea7', - }, - }; - let oldXPub: any; - - before(() => { - oldXPub = process.env.BIP32_XPUB; - process.env.BIP32_XPUB = xpub; - }); - - - it('Should generate the correct address for mainnet m/0/0', () => { - const addr = util.deriveTransparentAddress(0, bitcore.Networks.mainnet); - assert.equal(addr, addresses.mainnet[0]); - }); - - it('Should generate the correct address for index m/0/999', () => { - const addr = util.deriveTransparentAddress(999, bitcore.Networks.mainnet); - assert.equal(addr, addresses.mainnet[999]); - }); - - it('Should generate the correct address for testnet m/0/0', () => { - const addr = util.deriveTransparentAddress(0, bitcore.Networks.testnet); - assert.equal(addr, addresses.testnet[0]); - }); - - it('Should generate the correct address for testnet index m/0/999', () => { - const addr = util.deriveTransparentAddress(999, bitcore.Networks.testnet); - assert.equal(addr, addresses.testnet[999]); - }); - - it('Should throw on numbers greater than or equal to 2^31', () => { - assert.ok(util.deriveTransparentAddress(Math.pow(2, 31) - 1, bitcore.Networks.mainnet)); - assert.throws(() => { - util.deriveTransparentAddress(Math.pow(2, 31), bitcore.Networks.mainnet); - }); - }); - - it('Should throw on numbers less than 0', () => { - assert.throws(() => { - util.deriveTransparentAddress(-1, bitcore.Networks.mainnet); - }); - }); - - after(() => { - process.env.BIP32_XPUB = oldXPub; - }); - }); - - describe('dedupeArray', () => { - it('Should remove duplicates', () => { - const numArray = [1, 2, 3, 3]; - assert.deepEqual(util.dedupeArray(numArray), [1, 2, 3]); - - const stringArray = ['two', 'one', 'two', 'three']; - assert.deepEqual(util.dedupeArray(stringArray), ['two', 'one', 'three']); - - const one = { 1: 'one' }; - const two = { 2: 'two' }; - const three = { 3: 'three' }; - const objArray = [one, two, three, one]; - assert.deepEqual(util.dedupeArray(objArray), [one, two, three]); - }); - - it('Should leave non-duplicate arrays unchanged', () => { - const arr = ['one', 'two', 'three']; - assert.deepEqual(util.dedupeArray(arr), arr); - }); - - it('Should deduplicate by reference, not deep equality', () => { - const testObj = { test: 'test' }; - const arr = [testObj, { ...testObj }, testObj]; - assert.equal(util.dedupeArray(arr).length, 2); - }); - }); - - describe('removeItem', () => { - it('Should remove all instances of an item', () => { - const numArray = [1, 2, 3, 3]; - assert.deepEqual(util.removeItem(numArray, 2), [1, 3, 3]); - - const stringArray = ['two', 'one', 'two', 'three']; - assert.deepEqual(util.removeItem(stringArray, 'two'), ['one', 'three']); - - const one = { 1: 'one' }; - const two = { 2: 'two' }; - const three = { 3: 'three' }; - const objArray = [one, two, three, one]; - assert.deepEqual(util.removeItem(objArray, three), [one, two, one]); - }); - - it('Should remove by reference, not deep equality', () => { - const testObj = { test: 'test' }; - const arr = [testObj, { ...testObj }, testObj]; - assert.equal(util.removeItem(arr, testObj).length, 1); - }); - }); - - describe('encodeHexMemo & decodeHexMemo', () => { - const memo = 'hello tester!'; - const hex = '68656c6c6f2074657374657221'; - it('encodeHexMemo should encode a memo string as hex', () => { - const thisHex = util.encodeHexMemo(memo); - assert.equal(thisHex, hex); - }); - - it('decodeHexMemo should decode a hex memo to a string', () => { - const thisMemo = util.decodeHexMemo(hex); - assert.equal(thisMemo, memo); - }); - - it('encodeHexMemo and decodeHexMemo should be compatible', () => { - assert.equal(util.decodeHexMemo(util.encodeHexMemo(memo)), memo); - assert.equal(util.encodeHexMemo(util.decodeHexMemo(hex)), hex); - }); - }); - - describe('makeContributionMemo & getContributionIdFromMemo', () => { - const cid = 123; - const hex = '436f6e747269627574696f6e20313233206f6e204772616e742e696f'; - - it('makeContributionMemo should make an encoded memo in the right format', () => { - assert.equal(util.makeContributionMemo(cid), hex); - }); - - it('getContributionIdFromMemo should get the contribution ID from a hex memo', () => { - assert.equal(util.getContributionIdFromMemo(hex), cid); - }); - - it('getContributionIdFromMemo should handle zero-padded hex', () => { - assert.equal(util.getContributionIdFromMemo(hex.padEnd(512, '0')), cid); - }); - - it('Both methods should be compatible', () => { - assert.equal(util.getContributionIdFromMemo(util.makeContributionMemo(cid)), cid); - }); - }); - - describe('toBaseUnit', () => { - it('Should convert 20 ZEC to 2000000000 Zat', () => { - assert.equal(util.toBaseUnit(20), 2000000000); - }); - - it('Should convert 0.00005 ZEC to 5000 Zat', () => { - assert.equal(util.toBaseUnit(0.00005), 5000); - }); - }); -}); diff --git a/blockchain/src/util.ts b/blockchain/src/util.ts deleted file mode 100755 index ba4fbf38..00000000 --- a/blockchain/src/util.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { randomBytes, createHmac } from "crypto"; -import { HDPublicKey, Address } from "zcash-bitcore-lib"; -import env from "./env"; - -function sha256(input: string) { - const hash = createHmac("sha256", input); - return hash.digest("hex"); -} - -export function generateApiKey() { - const key = randomBytes(16).toString("hex"); - const hash = sha256(key); - return { key, hash }; -} - -export function authenticate(secret: string) { - const hash = env.API_SECRET_HASH; - if (!hash) { - throw Error("API_SECRET_HASH environment variable required."); - } - return hash === sha256(secret); -} - -// NOTE: this is just one way to derive t-addrs -export function deriveTransparentAddress(index: number, network: any) { - const root = new HDPublicKey(env.BIP32_XPUB); - const child = root.derive(`m/0/${index}`); - const address = new Address(child.publicKey, network); - return address.toString(); -} - -export function dedupeArray(arr: any[]) { - return arr.filter((item, index) => arr.indexOf(item) === index); -} - -export function removeItem(arr: T[], remove: T) { - return arr.filter(item => item !== remove); -} - -export function encodeHexMemo(memo: string) { - return new Buffer(memo, "utf8").toString("hex"); -} - -export function decodeHexMemo(memoHex: string) { - return ( - new Buffer(memoHex, "hex") - .toString() - // Remove null bytes from zero padding - .replace(/\0.*$/g, "") - ); -} - -export function makeContributionMemo(contributionId: number) { - return encodeHexMemo(`Contribution ${contributionId} on Grant.io`); -} - -export function getContributionIdFromMemo(memoHex: string) { - const matches = decodeHexMemo(memoHex).match( - /Contribution ([0-9]+) on Grant\.io/ - ); - if (matches && matches[1]) { - return parseInt(matches[1], 10); - } - return false; -} - -export function toBaseUnit(unit: number) { - return Math.floor(100000000 * unit); -} - -export function sleep(ms: number) { - return new Promise(resolve => { - setTimeout(resolve, ms); - }); -} - -// They come in all shapes and sizes, and nested data can get truncated as -// [object Object], so try to extract the best parts available. -export function extractErrMessage(err: any) { - if (err.response && err.response.data) { - if (err.response.data.error && err.response.data.error.message) { - return err.response.data.error.message; - } - return JSON.stringify(err.response.data, null, 2); - } - return err.message || err.toString(); -} \ No newline at end of file diff --git a/blockchain/src/webhooks/index.ts b/blockchain/src/webhooks/index.ts deleted file mode 100755 index ab4c19a1..00000000 --- a/blockchain/src/webhooks/index.ts +++ /dev/null @@ -1,129 +0,0 @@ -import axios from 'axios'; -import { captureException } from "@sentry/node"; -import { initializeNotifiers } from "./notifiers"; -import { Notifier } from "./notifiers/notifier"; -import node from "../node"; -import env from "../env"; -import { store } from "../store"; -import { sleep, extractErrMessage } from "../util"; -import log from "../log"; - -let blockScanTimeout: any = null; -let notifiers = [] as Notifier[]; -let consecutiveBlockFailures = 0; -const MAXIMUM_BLOCK_FAILURES = 10; -const MIN_BLOCK_CONF = parseInt(env.MINIMUM_BLOCK_CONFIRMATIONS, 10); - -export async function start() { - initScan(); - initNotifiers(); - - let { startingBlockHeight } = store.getState(); - while (startingBlockHeight === undefined || startingBlockHeight === null) { - await requestBootstrap(); - await sleep(10000); - startingBlockHeight = store.getState().startingBlockHeight; - } -} - -export function exit() { - notifiers.forEach(n => n.destroy && n.destroy()); - log.info('Webhook notifiers have exited'); -} - - -function initScan() { - // Scan is actually kicked off by redux action setting start height - let prevHeight: number | null = null; - store.subscribe(() => { - const { startingBlockHeight } = store.getState(); - if (startingBlockHeight !== null && prevHeight !== startingBlockHeight) { - log.info(`Starting block scan at block ${startingBlockHeight}`); - clearTimeout(blockScanTimeout); - scanBlock(startingBlockHeight); - prevHeight = startingBlockHeight; - } - }); -} - -async function scanBlock(height: number) { - try { - // Fetch the current block height, try again in 5 seconds if the next - // block doesn't meet our confirmation requirement - const highestBlock = await node.getblockcount(); - if (height > highestBlock - MIN_BLOCK_CONF) { - blockScanTimeout = setTimeout(() => { - scanBlock(height); - }, 5000); - return; - } - - // Process the block, then try the next one - const block = await node.getblock(String(height), 2); // 2 == full blocks - log.info(`Processing block #${block.height}...`); - notifiers.forEach(n => n.onNewBlock && n.onNewBlock(block)); - consecutiveBlockFailures = 0; - scanBlock(height + 1); - } catch(err) { - log.warn(`Failed to fetch block ${height}: ${extractErrMessage(err)}`); - consecutiveBlockFailures++; - // If we fail a certain number of times, it's reasonable to - // assume that the blockchain is down, and we should just quit. - if (consecutiveBlockFailures >= MAXIMUM_BLOCK_FAILURES) { - captureException(err); - log.error('Maximum consecutive failures reached, exiting!'); - process.exit(1); - } - else { - log.warn('Attempting to fetch again in 60 seconds...'); - await sleep(60000); - } - // Try same block again - scanBlock(height); - } -} - -function initNotifiers() { - notifiers = initializeNotifiers(); - notifiers.forEach(n => n.registerSend(send)); -} - -async function requestBootstrap() { - try { - log.debug('Requesting bootstrap from backend...'); - await send('/blockchain/bootstrap', 'GET'); - } catch(err) { - log.error(`Request for bootstrap failed: ${extractErrMessage(err)}`); - } -} - -export type Send = (route: string, method: string, payload?: object) => void; -const send: Send = (route, method, payload) => { - log.debug(`About to send to ${method} ${route}:`, payload); - const headers: any = { - 'Authorization': `Bearer ${env.API_SECRET_KEY}`, - }; - if (payload && (method === 'PUT' || method === 'POST')) { - headers['Content-Type'] = 'application/json'; - } - axios.request({ - method, - url: `${env.WEBHOOK_URL}${route}`, - data: payload, - headers, - }) - .then((res) => { - if (res.status >= 400) { - log.error(res.data); - log.error(`Webhook server responded to ${method} ${route} with status code ${res.status}. See above for details.`); - } - }) - .catch((err) => { - if (err.code && err.code === 'ECONNREFUSED') { - log.warn('Unable to send to backend, probably offline'); - return; - } - captureException(err); - log.error(`Webhook server request to ${method} ${route} failed: ${extractErrMessage(err)}`); - }); -}; diff --git a/blockchain/src/webhooks/notifiers/blockchain/index.ts b/blockchain/src/webhooks/notifiers/blockchain/index.ts deleted file mode 100644 index 071b9bb0..00000000 --- a/blockchain/src/webhooks/notifiers/blockchain/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Send } from "../../index"; -import { Notifier } from "../notifier"; -import { Block } from "../../../node"; - -export default class ContributionNotifier implements Notifier { - private send: Send = () => null; - - onNewBlock = (block: Block) => { - // Uncomment below if you want to see new blocks! - // this.send({ - // type: "blockchain:block", - // payload: block, - // }); - }; - - registerSend = (sm: Send) => (this.send = sm); -} diff --git a/blockchain/src/webhooks/notifiers/contribution/index.ts b/blockchain/src/webhooks/notifiers/contribution/index.ts deleted file mode 100644 index b84ccace..00000000 --- a/blockchain/src/webhooks/notifiers/contribution/index.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { captureException } from "@sentry/node"; -import { Send } from "../../index"; -import { Notifier } from "../notifier"; -import node, { BlockWithTransactions } from "../../../node"; -import { - store, - getWatchAddresses, - getWatchDisclosures, - confirmPaymentDisclosure, -} from "../../../store"; -import env from "../../../env"; -import log from "../../../log"; -import { getContributionIdFromMemo, decodeHexMemo, toBaseUnit, extractErrMessage } from "../../../util"; - -interface ContributionConfirmationPayload { - to: string; - amount: string; - txid: string; - memo: string; - contributionId: number; -} - -export default class ContributionNotifier implements Notifier { - private send: Send = () => null; - private confirmedTxIds: string[] = []; - - onNewBlock = (block: BlockWithTransactions) => { - this.checkBlockForTransparentPayments(block); - // NOTE: Re-enable when sapling is ready - // this.checkForMemoPayments(); - // this.checkDisclosuresForPayment(block); - }; - - registerSend = (sm: Send) => (this.send = sm); - - private checkBlockForTransparentPayments = (block: BlockWithTransactions) => { - const addresses = getWatchAddresses(store.getState()); - const tAddressIdMap = Object.entries(addresses).reduce((prev, [cid, cAddresses]) => { - prev[cAddresses.transparent] = parseInt(cid, 10); - return prev; - }, {} as { [address: string]: number }); - - block.tx.forEach(tx => { - tx.vout.forEach(vout => { - // Some vouts are not transactions with addresses, ignore those - if (!vout.scriptPubKey.addresses) { - return; - } - - // Addresses is an array because of multisigs, but we'll never - // generate one, so all of our addresses will only have addresses[0] - const to = vout.scriptPubKey.addresses[0]; - if (tAddressIdMap[to]) { - this.sendContributionConfirmation({ - to, - amount: vout.valueZat.toString(), - txid: tx.txid, - contributionId: tAddressIdMap[to], - // T-address transactions don't have memos - memo: '', - }); - } - }); - }); - }; - - - private checkForMemoPayments = async () => { - try { - const received = await node.z_listreceivedbyaddress( - env.SPROUT_ADDRESS, - parseInt(env.MINIMUM_BLOCK_CONFIRMATIONS, 10), - ); - const newReceived = received.filter(r => !this.confirmedTxIds.includes(r.txid)); - - newReceived.forEach(receipt => { - log.info(`Received new tx ${receipt.txid}`); - this.confirmedTxIds.push(receipt.txid); - const contributionId = getContributionIdFromMemo(receipt.memo); - if (!contributionId) { - log.warn(`Sprout address ${env.SPROUT_ADDRESS} received transaction with invalid memo:\n`, { - txid: receipt.txid, - decodedMemo: decodeHexMemo(receipt.memo) - }); - return; - } - - this.sendContributionConfirmation({ - to: env.SPROUT_ADDRESS, - amount: toBaseUnit(receipt.amount).toString(), - txid: receipt.txid, - memo: decodeHexMemo(receipt.memo), - contributionId, - }); - }); - } catch(err) { - captureException(err); - log.error( - 'Failed to check sprout address for memo payments:\n', - extractErrMessage(err), - ); - } - }; - - private checkDisclosuresForPayment = (block: BlockWithTransactions) => { - const disclosures = getWatchDisclosures(store.getState()); - Object.entries(disclosures).forEach(([cid, disclosure]) => { - this.checkDisclosureForPayment(disclosure, parseInt(cid, 10), block.height); - }); - }; - - private checkDisclosureForPayment = async ( - disclosure: string, - contributionId: number, - maxHeight: number, - ) => { - try { - const receipt = await node.z_validatepaymentdisclosure(disclosure); - if (!receipt.valid) { - log.warn('Invalid disclosure checked:', receipt); - return; - } - const tx = await node.gettransaction(receipt.txid); - const block = await node.getblock(tx.blockhash); - if (block.height > maxHeight) { - log.info(`Validated disclosure, will confirm in ${block.height - maxHeight} block(s)`); - return; - } - log.info('Confirming disclosure:', receipt.paymentAddress); - this.sendContributionConfirmation({ - to: receipt.paymentAddress, - amount: receipt.value.toString(), - txid: receipt.txid, - memo: decodeHexMemo(receipt.memo), - contributionId, - }); - store.dispatch(confirmPaymentDisclosure(contributionId, disclosure)); - } catch(err) { - captureException(err); - log.warn( - 'Encountered an error while checking disclosure:\n', - extractErrMessage(err), - ); - } - }; - - private sendContributionConfirmation = (p: ContributionConfirmationPayload) => { - log.info(`Contribution confirmed for contribution ${p.contributionId}, +${p.amount} ZEC`); - this.send(`/proposals/contribution/${p.contributionId}/confirm`, 'POST', p); - }; -} diff --git a/blockchain/src/webhooks/notifiers/index.ts b/blockchain/src/webhooks/notifiers/index.ts deleted file mode 100755 index b365e5c9..00000000 --- a/blockchain/src/webhooks/notifiers/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Notifier } from './notifier'; -import BlockchainNotifier from './blockchain'; -import ContributionNotifier from './contribution'; - -export const initializeNotifiers = () => [ - new BlockchainNotifier(), - new ContributionNotifier(), -] as Notifier[]; diff --git a/blockchain/src/webhooks/notifiers/notifier.ts b/blockchain/src/webhooks/notifiers/notifier.ts deleted file mode 100644 index d47b6509..00000000 --- a/blockchain/src/webhooks/notifiers/notifier.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Send } from "../index"; -import { Block } from "../../node"; - -export interface Notifier { - registerSend(send: Send): void; - onNewBlock?(block: Block): void; - destroy?(): void; -} diff --git a/blockchain/tsconfig.json b/blockchain/tsconfig.json deleted file mode 100755 index 5fdcec26..00000000 --- a/blockchain/tsconfig.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "compilerOptions": { - /* Basic Options */ - "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - "lib": ["es2017"], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - // "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "dist", /* Redirect output structure to the directory. */ - // "rootDir": "src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - "baseUrl": ".", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // ts-node requires explicit definition for paths - // https://www.npmjs.com/package/ts-node#help-my-types-are-missing - "paths": { - "stdrpc": ["types/stdrpc"], - "zcash-bitcore-lib": ["types/zcash-bitcore-lib"], - "bitgo": ["types/bitgo"] - }, - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - - /* Advanced Options */ - "resolveJsonModule": true /* Include modules imported with '.json' extension */ - }, - "include": ["./src/**/*", "./types/**/*"] -} \ No newline at end of file diff --git a/blockchain/types/bitgo.d.ts b/blockchain/types/bitgo.d.ts deleted file mode 100644 index 0b7ce5c3..00000000 --- a/blockchain/types/bitgo.d.ts +++ /dev/null @@ -1,71 +0,0 @@ -// Adapted from documentation here: https://www.bitgo.com/api/v2/?javascript -// Far from exhaustive, only functions used are properly typed. - -declare module 'bitgo' { - // Wallet - interface CreateAddressOptions { - label: string; - } - - interface GetAddressesOptions { - labelContains?: string; - limit?: number; - mine?: boolean; - prevId?: string; - chains?: number[]; - sort?: 1 | -1; - } - - interface AddressInfo { - id: string; - address: string; - chain: number; - index: number; - coin: string; - lastNonce: number; - wallet: string; - label: string; - addressType: string; - } - - interface GetAddressResponse { - coin: string; - totalAddressCount: number; - pendingAddressCount: number; - addresses: AddressInfo[]; - nextBatchPrevId: string; - } - - export class Wallet { - id(): string; - label(): string; - createAddress(options?: CreateAddressOptions): Promise; - addresses(options?: GetAddressesOptions): Promise; - } - - // Wallets - interface GetWalletOptions { - id: string; - } - - export class Wallets { - get(options: GetWalletOptions): Promise; - } - - // BaseCoin - export class BaseCoin { - wallets(): Wallets; - } - - // BitGo - interface BitGoOptions { - env: 'test' | 'prod'; - accessToken: string; - proxy?: string; - } - - export class BitGo { - constructor(options: BitGoOptions); - coin(coin: string): BaseCoin; - } -} diff --git a/blockchain/types/stdrpc.d.ts b/blockchain/types/stdrpc.d.ts deleted file mode 100644 index 46da17d5..00000000 --- a/blockchain/types/stdrpc.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module 'stdrpc' { - const stdrpc: any; - export default stdrpc; -} diff --git a/blockchain/types/zcash-bitcore-lib.d.ts b/blockchain/types/zcash-bitcore-lib.d.ts deleted file mode 100644 index 685f3bca..00000000 --- a/blockchain/types/zcash-bitcore-lib.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare module 'zcash-bitcore-lib' { - const bitcore: any; - export default bitcore; - export const HDPublicKey: any; - export const Address: any; -} diff --git a/blockchain/yarn.lock b/blockchain/yarn.lock deleted file mode 100755 index c09b612e..00000000 --- a/blockchain/yarn.lock +++ /dev/null @@ -1,3720 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@sentry/core@4.6.4": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-4.6.4.tgz#7236e08115423b81b96a13c2c37f29bcc1477745" - integrity sha512-NGl2nkAaQ8dGqJAMS1Hb+7RyVjW4tmCbK6d7H/zKnOpBuU+qSW4XCm2NoGLLa8qb4SZUPIBRv6U0ByvEQlGtqw== - dependencies: - "@sentry/hub" "4.6.4" - "@sentry/minimal" "4.6.4" - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.4" - tslib "^1.9.3" - -"@sentry/hub@4.6.4": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-4.6.4.tgz#2bd5d67ccd43d4f5afc45005a330a11b14d46cea" - integrity sha512-R3ACxUZbrAMP6vyIvt1k4bE3OIyg1CzbEhzknKljPrk1abVmJVP7W/X1vBysdRtI3m/9RjOSO7Lxx3XXqoHoQg== - dependencies: - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.4" - tslib "^1.9.3" - -"@sentry/minimal@4.6.4": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-4.6.4.tgz#dc4bb47df90dad6025d832852ac11fe29ed50147" - integrity sha512-jZa9mfzDzJI98tg6uxFG3gdVLyz0nOHpLP9H8Kn/BelZ7WEG/ogB8PDi1hI9JvCTXAr8kV81mEecldADa9L9Yg== - dependencies: - "@sentry/hub" "4.6.4" - "@sentry/types" "4.5.3" - tslib "^1.9.3" - -"@sentry/node@4.6.4": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-4.6.4.tgz#933c2e3ce93bc7861de6d4310ed1fe66f85da301" - integrity sha512-nfaLB+cE0dddjWD0yI0nB/UqXkPw/6FKDRpB1NZ61amAM4QRXa4hRTdHvqjUovzV/5/pVMQYsOyCk0pNWMtMUQ== - dependencies: - "@sentry/core" "4.6.4" - "@sentry/hub" "4.6.4" - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.4" - "@types/stack-trace" "0.0.29" - cookie "0.3.1" - https-proxy-agent "2.2.1" - lru_map "0.3.3" - lsmod "1.0.0" - stack-trace "0.0.10" - tslib "^1.9.3" - -"@sentry/types@4.5.3": - version "4.5.3" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-4.5.3.tgz#3350dce2b7f9b936a8c327891c12e3aef7bd8852" - integrity sha512-7ll1PAFNjrBNX9rzy3P2qAQrpQwHaDO3uKj735qsnGw34OtAS8Xr8WYrjI14f9fMPa/XIeWvMPb4GMic28V/ag== - -"@sentry/utils@4.6.4": - version "4.6.4" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-4.6.4.tgz#ca254c142b519b4f20d63c2f9edf1a89966be36f" - integrity sha512-Tc5R46z7ve9Z+uU34ceDoEUR7skfQgXVIZqjbrTQphgm6EcMSNdRfkK3SJYZL5MNKiKhb7Tt/O3aPBy5bTZy6w== - dependencies: - "@sentry/types" "4.5.3" - tslib "^1.9.3" - -"@types/body-parser@*", "@types/body-parser@1.17.0": - version "1.17.0" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.32" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" - dependencies: - "@types/node" "*" - -"@types/cors@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.4.tgz#50991a759a29c0b89492751008c6af7a7c8267b0" - dependencies: - "@types/express" "*" - -"@types/dotenv@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/dotenv/-/dotenv-6.1.0.tgz#fba2bfd1f28a46eadaa049f3313ebb89bdedfc53" - dependencies: - "@types/node" "*" - -"@types/events@*": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" - -"@types/expect@^1.20.3": - version "1.20.3" - resolved "https://registry.yarnpkg.com/@types/expect/-/expect-1.20.3.tgz#a99d059ace4bd051332faf03f5b4b4266149a501" - -"@types/express-serve-static-core@*": - version "4.16.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" - dependencies: - "@types/events" "*" - "@types/node" "*" - "@types/range-parser" "*" - -"@types/express@*", "@types/express@4.16.0": - version "4.16.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "*" - "@types/serve-static" "*" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - -"@types/lodash@^4.14.85": - version "4.14.123" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.123.tgz#39be5d211478c8dd3bdae98ee75bb7efe4abfe4d" - integrity sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q== - -"@types/mime@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" - -"@types/mocha@^5.2.5": - version "5.2.5" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" - -"@types/node@*", "@types/node@^10.12.11": - version "10.12.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.11.tgz#715c476c99a5f6898a1ae61caf9825e43c03912e" - -"@types/node@^8.0.7": - version "8.10.44" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.44.tgz#b00cf3595c6a3d75740af9768739a8125053a5a9" - integrity sha512-HY3SK7egERHGUfY8p6ztXIEQWcIPHouYhCGcLAPQin7gE2G/fALFz+epnMwcxKUS6aKqTVoAFdi+t1llQd3xcw== - -"@types/range-parser@*": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" - -"@types/serve-static@*": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" - dependencies: - "@types/express-serve-static-core" "*" - "@types/mime" "*" - -"@types/stack-trace@0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.29.tgz#eb7a7c60098edb35630ed900742a5ecb20cfcb4d" - -"@types/ws@^3.2.0": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-3.2.1.tgz#b0c1579e58e686f83ce0a97bb9463d29705827fb" - integrity sha512-t5n0/iHoavnX1MqeYmKJgWc1W6yX4BXsNxQg7M5862RWrfN9S5k8yaWbDMGJSTCzbH7+q5QS8chjymd+ND9gMw== - dependencies: - "@types/node" "*" - -"@types/ws@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz#ca7a3f3756aa12f62a0a62145ed14c6db25d5a28" - dependencies: - "@types/events" "*" - "@types/node" "*" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -accepts@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" - -agent-base@4, agent-base@^4.1.0, agent-base@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - dependencies: - es6-promisify "^5.0.0" - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - dependencies: - string-width "^2.0.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -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" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -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" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -assert@0.4.9: - version "0.4.9" - resolved "https://registry.yarnpkg.com/assert/-/assert-0.4.9.tgz#45faff1a58f718508118873dead940c8b51db939" - integrity sha1-Rfr/Glj3GFCBGIc96tlAyLUduTk= - dependencies: - util ">= 0.4.9" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -ast-types@0.x.x: - version "0.12.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.12.2.tgz#341656049ee328ac03fc805c156b49ebab1e4462" - integrity sha512-8c83xDLJM/dLDyXNLiR6afRRm4dPKN6KAnKqytRK3DBJul9lA+atxdQkNDkSVPdTqea5HiRq3lnnOIZ0MBpvdg== - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - -async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - dependencies: - lodash "^4.17.10" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - -axios@0.18.0, axios@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" - dependencies: - follow-redirects "^1.3.0" - is-buffer "^1.1.5" - -axios@^0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.2.tgz#ba4f92f17167dfbab40983785454b9ac149c3c6d" - dependencies: - follow-redirects "^1.2.3" - is-buffer "^1.1.5" - -babel-runtime@^5.8.20: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.8.38.tgz#1c0b02eb63312f5f087ff20450827b425c9d4c19" - integrity sha1-HAsC62MxL18If/IEUIJ7QlydTBk= - dependencies: - core-js "^1.0.0" - -babel-runtime@^6.6.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base-x@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac" - integrity sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w= - -base-x@^3.0.2: - version "3.0.5" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.5.tgz#d3ada59afed05b921ab581ec3112e6444ba0795a" - integrity sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA== - dependencies: - safe-buffer "^5.0.1" - -base32.js@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.1.0.tgz#b582dec693c2f11e893cf064ee6ac5b6131a2202" - integrity sha1-tYLexpPC8R6JPPBk7mrFthMaIgI= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -basic-auth@^2.0.0, basic-auth@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - dependencies: - safe-buffer "5.1.2" - -bech32@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-0.0.3.tgz#736747c4a6531c5d8937d0400498de30e93b2f9c" - integrity sha512-O+K1w8P/aAOLcYwwQ4sbiPYZ51ZIW95lnS4/6nE8Aib/z+OOddQIIPdu2qi94qGDp4HhYy/wJotttXKkak1lXg== - -big.js@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" - integrity sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg= - -bigi@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.0.tgz#90ac1aeac0a531216463bdb58f42c1e05c8407ac" - integrity sha1-kKwa6sClMSFkY721j0LB4FyEB6w= - -bigi@^1.1.0, bigi@^1.4.0, bigi@^1.4.2, bigi@~1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" - integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU= - -bignumber.js@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.0.1.tgz#5d419191370fb558c64e3e5f70d68e5947138832" - integrity sha512-zAySveTJXkgLYCBi0b14xzfnOs+f3G6x36I8w2a1+PFQpWk/dp0mI0F+ZZK2bu+3ELewDcSyP+Cfq++NcHX7sg== - -bignumber.js@^4.0.0, bignumber.js@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" - integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA== - -binary-extensions@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" - -bindings@^1.2.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bip66@^1.1.0, bip66@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" - integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= - dependencies: - safe-buffer "^5.0.1" - -bitcoin-ops@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz#e45de620398e22fd4ca6023de43974ff42240278" - integrity sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow== - -bitcoin-ops@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bitcoin-ops/-/bitcoin-ops-1.3.0.tgz#6b126b585537bc679b02ed499f14450cffc37e13" - integrity sha1-axJrWFU3vGebAu1JnxRFDP/DfhM= - -bitcoinjs-lib@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/bitcoinjs-lib/-/bitcoinjs-lib-3.0.3.tgz#3470eed5d6778b5404b770effbd0fcbb2bd89655" - integrity sha1-NHDu1dZ3i1QEt3Dv+9D8uyvYllU= - dependencies: - bigi "^1.4.0" - bip66 "^1.1.0" - bitcoin-ops "^1.3.0" - bs58check "^2.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.3" - ecurve "^1.0.0" - merkle-lib "^2.0.10" - pushdata-bitcoin "^1.0.1" - randombytes "^2.0.1" - typeforce "^1.8.7" - varuint-bitcoin "^1.0.4" - wif "^2.0.1" - -bitcoinjs-message@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bitcoinjs-message/-/bitcoinjs-message-2.0.0.tgz#e285d223607dabf2b33a6ee486a223b59d1b1548" - integrity sha512-H5pJC7/eSqVjREiEOZ4jifX+7zXYP3Y28GIOIqg9hrgE7Vj8Eva9+HnVqnxwA1rJPOwZKuw0vo6k0UxgVc6q1A== - dependencies: - bs58check "^2.0.2" - buffer-equals "^1.0.3" - create-hash "^1.1.2" - secp256k1 "^3.0.1" - varuint-bitcoin "^1.0.1" - -bitgo-utxo-lib@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bitgo-utxo-lib/-/bitgo-utxo-lib-1.3.0.tgz#585f365c3eb61d53c7bc0e6a87573dae9d867c27" - integrity sha512-jry6Y97g2jr1XlY1Ou5WkWUg1rQbyioLYp9AgyK4OwZ7t2ETRyTB1rcJV9kYOlTnTjC6k+Sef+IKcZLM/u9zjA== - dependencies: - bech32 "0.0.3" - bigi "^1.4.0" - bip66 "^1.1.0" - bitcoin-ops "^1.3.0" - blake2b "https://github.com/BitGo/blake2b#6268e6dd678661e0acc4359e9171b97eb1ebf8ac" - bs58check "^2.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.3" - debug "~3.1.0" - ecurve "^1.0.0" - merkle-lib "^2.0.10" - pushdata-bitcoin "^1.0.1" - randombytes "^2.0.1" - safe-buffer "^5.0.1" - typeforce "^1.11.3" - varuint-bitcoin "^1.0.4" - wif "^2.0.1" - optionalDependencies: - secp256k1 "^3.5.2" - -bitgo@4.48.1: - version "4.48.1" - resolved "https://registry.yarnpkg.com/bitgo/-/bitgo-4.48.1.tgz#8b3965516441ef99fbf327e8a05109a450a7bcea" - integrity sha512-+LF9J5zFuIUv48J2n4o/oyEd16Z3RPyXReIIZELaB88CGnqeIspHOwmnRM2+gn5Q7NPP+xZYOLn5stqOGmUJ6w== - dependencies: - argparse "1.0.10" - assert "0.4.9" - big.js "3.1.3" - bigi "1.4.0" - bignumber.js "8.0.1" - bitcoinjs-message "2.0.0" - bitgo-utxo-lib "1.3.0" - bluebird "3.5.3" - body-parser "1.18.3" - bs58 "2.0.1" - bs58check "1.0.4" - cashaddress "1.1.0" - create-hmac "1.1.7" - debug "3.1.0" - ecurve "1.0.6" - eol "0.5.0" - express "4.16.4" - http-proxy "1.11.1" - lodash "4.17.11" - minimist "0.2.0" - moment "2.20.1" - morgan "1.9.1" - prova-lib "0.2.10" - ripple-lib "0.22.0" - sanitize-html "1.13.0" - secrets.js-grempe "1.1.0" - stellar-sdk "0.11.0" - superagent "3.8.3" - superagent-proxy "1.0.3" - optionalDependencies: - ethereumjs-abi "0.6.5" - ethereumjs-tx "1.3.7" - ethereumjs-util "4.4.1" - secp256k1 "3.6.1" - -"blake2b-wasm@https://github.com/BitGo/blake2b-wasm#193cdb71656c1a6c7f89b05d0327bb9b758d071b": - version "2.0.0" - resolved "https://github.com/BitGo/blake2b-wasm#193cdb71656c1a6c7f89b05d0327bb9b758d071b" - dependencies: - nanoassert "^1.0.0" - -"blake2b@git+https://github.com/BitGo/blake2b.git#6268e6dd678661e0acc4359e9171b97eb1ebf8ac": - version "2.1.3" - resolved "git+https://github.com/BitGo/blake2b.git#6268e6dd678661e0acc4359e9171b97eb1ebf8ac" - dependencies: - blake2b-wasm "https://github.com/BitGo/blake2b-wasm#193cdb71656c1a6c7f89b05d0327bb9b758d071b" - nanoassert "^1.0.0" - -bluebird@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== - -bn.js@=2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.0.4.tgz#220a7cd677f7f1bfa93627ff4193776fe7819480" - -bn.js@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625" - -bn.js@^3.1.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-3.3.0.tgz#1138e577889fdc97bbdab51844f2190dfc0ae3d7" - integrity sha1-ETjld4if3Je72rUYRPIZDfwK49c= - -bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.3, bn.js@^4.4.0, bn.js@^4.8.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -body-parser@1.18.3: - version "1.18.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "~1.6.3" - iconv-lite "0.4.23" - on-finished "~2.3.0" - qs "6.5.2" - raw-body "2.3.3" - type-is "~1.6.16" - -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.0, braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1, brorand@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - -browserify-aes@^1.0.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-sha3@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.4.tgz#086c47b8c82316c9d47022c26185954576dd8e26" - integrity sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY= - dependencies: - js-sha3 "^0.6.1" - safe-buffer "^5.1.1" - -bs58@2.0.1, bs58@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d" - integrity sha1-VZCNWPGYKrogCPob7Y+RmYopv40= - -bs58@=2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.0.tgz#72b713bed223a0ac518bbda0e3ce3f4817f39eb5" - -bs58@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= - dependencies: - base-x "^3.0.2" - -bs58check@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-1.0.4.tgz#94180ab90821fe250496151f60d0eb3d9f321198" - integrity sha1-lBgKuQgh/iUElhUfYNDrPZ8yEZg= - dependencies: - bs58 "^2.0.1" - -bs58check@<3.0.0, bs58check@^2.0.0, bs58check@^2.0.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -bs58check@~2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.0.2.tgz#06f63b01c2fa6173033c90eb87f1fe3d2e13d89a" - integrity sha1-BvY7AcL6YXMDPJDrh/H+PS4T2Jo= - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - -buffer-compare@=1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.0.0.tgz#acaa7a966e98eee9fae14b31c39a5f158fb3c4a2" - -buffer-equals@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5" - integrity sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U= - -buffer-from@^1.0.0, buffer-from@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -camelcase@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - -cashaddress@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cashaddress/-/cashaddress-1.1.0.tgz#1a7d3b4e3b3bbdef77b666fecf322ea79bcc9799" - integrity sha1-Gn07Tjs7ve93tmb+zzIup5vMl5k= - dependencies: - bigi "^1.4.2" - -chalk@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chokidar@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" - optionalDependencies: - fsevents "^1.2.2" - -chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@3.0.x: - version "3.0.0" - resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - -colornames@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" - -colors@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - -colorspace@1.1.x: - version "1.1.1" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972" - dependencies: - color "3.0.x" - text-hex "1.0.x" - -combined-stream@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== - dependencies: - delayed-stream "~1.0.0" - -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - -component-emitter@^1.2.0, component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -console-control-strings@^1.0.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" - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - -cookiejar@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-js@^2.4.0, core-js@^2.6.3: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cors@2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - dependencies: - object-assign "^4" - vary "^1" - -crc@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964" - integrity sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ= - -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@1.1.7, create-hmac@^1.1.3, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - -cursor@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/cursor/-/cursor-0.1.5.tgz#ea778c2b09d33c2e564fd92147076750483ebb2c" - integrity sha1-6neMKwnTPC5WT9khRwdnUEg+uyw= - -data-uri-to-buffer@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.0.tgz#0ba23671727349828c32cfafddea411908d13d23" - integrity sha512-YbKCNLPPP4inc0E5If4OaalBc7gpaM2MRv77Pv2VThVComLKfbGYtJcdDCViDyp1Wd4SebhHLz94vp91zbK6bw== - dependencies: - "@types/node" "^8.0.7" - -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@3.1.0, debug@=3.1.0, debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -debug@4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - dependencies: - ms "^2.1.1" - -decimal.js@^5.0.8: - version "5.0.8" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-5.0.8.tgz#b48c3fb7d73a2d4d4940e0b38f1cd21db5b367ce" - integrity sha1-tIw/t9c6LU1JQOCzjxzSHbWzZ84= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -deepmerge@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -degenerator@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" - integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= - dependencies: - ast-types "0.x.x" - escodegen "1.x.x" - esprima "3.x.x" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -diagnostics@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a" - dependencies: - colorspace "1.1.x" - enabled "1.0.x" - kuler "1.0.x" - -diff@3.5.0, diff@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - -dom-serializer@0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - dependencies: - is-obj "^1.0.0" - -dotenv@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.1.0.tgz#9853b6ca98292acb7dec67a95018fa40bccff42c" - -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" - integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -ecurve@1.0.6, ecurve@^1.0.0, ecurve@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.6.tgz#dfdabbb7149f8d8b78816be5a7d5b83fcf6de797" - integrity sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w== - dependencies: - bigi "^1.1.0" - safe-buffer "^5.0.1" - -ed25519@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/ed25519/-/ed25519-0.0.4.tgz#e56218ace2fc903d259593aef0b2a9639f475beb" - integrity sha1-5WIYrOL8kD0llZOu8LKpY59HW+s= - dependencies: - bindings "^1.2.1" - nan "^2.0.9" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -elliptic@=3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-3.0.3.tgz#865c9b420bfbe55006b9f969f97a0d2c44966595" - dependencies: - bn.js "^2.0.0" - brorand "^1.0.1" - hash.js "^1.0.0" - inherits "^2.0.1" - -elliptic@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-5.2.1.tgz#fa294b6563c6ddbc9ba3dc8594687ae840858f10" - integrity sha1-+ilLZWPG3bybo9yFlGh66ECFjxA= - dependencies: - bn.js "^3.1.1" - brorand "^1.0.1" - hash.js "^1.0.0" - inherits "^2.0.1" - -elliptic@^6.2.3: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -enabled@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" - dependencies: - env-variable "0.0.x" - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -env-variable@0.0.x: - version "0.0.5" - resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88" - -eol@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/eol/-/eol-0.5.0.tgz#7544ee1c9cefcac6041286abac1e7f5e5b36f10c" - integrity sha1-dUTuHJzvysYEEoarrB5/Xls28Qw= - -es6-promise@^4.0.3: - version "4.2.5" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" - -es6-promise@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" - integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - dependencies: - es6-promise "^4.0.3" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escodegen@1.x.x: - version "1.11.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" - integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -esprima@3.x.x, esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - -estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - -ethereum-common@^0.0.18: - version "0.0.18" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" - integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= - -ethereumjs-abi@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" - integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= - dependencies: - bn.js "^4.10.0" - ethereumjs-util "^4.3.0" - -ethereumjs-tx@1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" - integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== - dependencies: - ethereum-common "^0.0.18" - ethereumjs-util "^5.0.0" - -ethereumjs-util@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.4.1.tgz#6316bfbc8a01c8767a78620928ed79ef424c3f92" - integrity sha1-Yxa/vIoByHZ6eGIJKO1570JMP5I= - dependencies: - bn.js "^4.8.0" - create-hash "^1.1.2" - keccakjs "^0.2.0" - rlp "^2.0.0" - secp256k1 "^3.0.1" - -ethereumjs-util@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6" - integrity sha1-PpQosxfuvaPXJg2FT93alUsfG8Y= - dependencies: - bn.js "^4.8.0" - create-hash "^1.1.2" - keccakjs "^0.2.0" - rlp "^2.0.0" - secp256k1 "^3.0.1" - -ethereumjs-util@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" - integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "^0.1.3" - keccak "^1.0.2" - rlp "^2.0.0" - safe-buffer "^5.1.1" - secp256k1 "^3.0.1" - -ethjs-util@^0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -event-source-polyfill@0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/event-source-polyfill/-/event-source-polyfill-0.0.12.tgz#e539cd67fdef2760a16aa5262fa98134df52e3af" - integrity sha1-5TnNZ/3vJ2ChaqUmL6mBNN9S468= - -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= - -eventsource@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== - dependencies: - original "^1.0.0" - -evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -express@4.16.4: - version "4.16.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" - dependencies: - accepts "~1.3.5" - array-flatten "1.1.1" - body-parser "1.18.3" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.1" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.4" - qs "6.5.2" - range-parser "~1.2.0" - safe-buffer "5.1.2" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0, 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== - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fast-safe-stringify@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" - -fecha@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" - -file-uri-to-path@1, file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -finalhandler@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.4.0" - unpipe "~1.0.0" - -follow-redirects@^1.2.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - dependencies: - debug "=3.1.0" - -follow-redirects@^1.3.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.6.1.tgz#514973c44b5757368bad8bddfe52f81f015c94cb" - dependencies: - debug "=3.1.0" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -form-data@^2.3.1: - 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" - -formidable@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" - integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== - -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - dependencies: - minipass "^2.2.1" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -ftp@~0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -get-uri@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.3.tgz#fa13352269781d75162c6fc813c9e905323fbab5" - integrity sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw== - dependencies: - data-uri-to-buffer "2" - debug "4" - extend "~3.0.2" - file-uri-to-path "1" - ftp "~0.3.10" - readable-stream "3" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.5: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - dependencies: - ini "^1.3.4" - -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -htmlparser2@^3.9.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" - -http-proxy@1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.11.1.tgz#71df55757e802d58ea810df2244019dda05ae85d" - integrity sha1-cd9VdX6ALVjqgQ3yJEAZ3aBa6F0= - dependencies: - eventemitter3 "1.x.x" - requires-port "0.x.x" - -https-proxy-agent@2.2.1, https-proxy-agent@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" - integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== - dependencies: - agent-base "^4.1.0" - debug "^3.1.0" - -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - dependencies: - minimatch "^3.0.4" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@=2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -ip@^1.1.4, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - dependencies: - ci-info "^1.5.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -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-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" - dependencies: - number-is-nan "^1.0.0" - -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-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - dependencies: - is-extglob "^2.1.1" - -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= - -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - -js-sha3@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.6.1.tgz#5b89f77a7477679877f58c4a075240934b1f95c0" - integrity sha1-W4n3enR3Z5h39YxKB1JAk0sflcA= - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - -js-xdr@^1.0.5: - version "1.1.1" - resolved "https://registry.yarnpkg.com/js-xdr/-/js-xdr-1.1.1.tgz#38b1dbba77e4b381b9603e564fe1d374649ce2e1" - integrity sha512-csYOkKC78umSY2r3oDUONGH1ZcyTex7VlzpfmjKdzlNoeqFQtOA1rhBE9/e3mFNiO0Do65EVvyWx2jHHtRYPPg== - dependencies: - core-js "^2.6.3" - cursor "^0.1.5" - lodash "^4.17.5" - long "^2.2.3" - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - dependencies: - minimist "^1.2.0" - -jsonschema@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.2.tgz#83ab9c63d65bf4d596f91d81195e78772f6452bc" - integrity sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA== - -keccak@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" - integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== - dependencies: - bindings "^1.2.1" - inherits "^2.0.3" - nan "^2.2.1" - safe-buffer "^5.1.0" - -keccakjs@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.3.tgz#5e4e969ce39689a3861f445d7752ee3477f9fe72" - integrity sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg== - dependencies: - browserify-sha3 "^0.0.4" - sha3 "^1.2.2" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -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" - -koa-basic-auth@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/koa-basic-auth/-/koa-basic-auth-3.0.0.tgz#05967f2320735264d193e37806634615206a710b" - dependencies: - basic-auth "^2.0.0" - -kuler@1.0.x: - version "1.0.1" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6" - dependencies: - colornames "^1.1.1" - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - dependencies: - package-json "^4.0.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - -lodash@4.17.11, lodash@^4.12.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.4: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - -lodash@=3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -logform@^1.9.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-1.10.0.tgz#c9d5598714c92b546e23f4e78147c40f1e02012e" - dependencies: - colors "^1.2.1" - fast-safe-stringify "^2.0.4" - fecha "^2.3.3" - ms "^2.1.1" - triple-beam "^1.2.0" - -long@^2.2.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" - integrity sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8= - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - -lru-cache@^4.0.1, lru-cache@^4.1.2: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru_map@0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= - -lsmod@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lsmod/-/lsmod-1.0.0.tgz#9a00f76dca36eb23fa05350afe1b585d4299e64b" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - dependencies: - pify "^3.0.0" - -make-error@^1.1.1: - version "1.3.5" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - -merkle-lib@^2.0.10: - version "2.0.10" - resolved "https://registry.yarnpkg.com/merkle-lib/-/merkle-lib-2.0.10.tgz#82b8dbae75e27a7785388b73f9d7725d0f6f3326" - integrity sha1-grjbrnXieneFOItz+ddyXQ9vMyY= - -methods@^1.1.1, methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@~1.37.0: - version "1.37.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" - -mime-db@~1.38.0: - version "1.38.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" - integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== - -mime-types@^2.1.12: - version "2.1.22" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" - integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== - dependencies: - mime-db "~1.38.0" - -mime-types@~2.1.18: - version "2.1.21" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" - dependencies: - mime-db "~1.37.0" - -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - -mime@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - -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" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@3.0.4, 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" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784= - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minipass@^2.2.1, minipass@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" - dependencies: - minipass "^2.2.1" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -moment@2.20.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" - integrity sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg== - -morgan@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" - integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== - dependencies: - basic-auth "~2.0.0" - debug "2.6.9" - depd "~1.1.2" - on-finished "~2.3.0" - on-headers "~1.0.1" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -ms@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - -nan@2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== - -nan@^2.0.9, nan@^2.2.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" - integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== - -nan@^2.9.2: - version "2.11.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" - -nanoassert@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-1.1.0.tgz#4f3152e09540fde28c76f44b19bbcd1d5a42478d" - integrity sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40= - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -netmask@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" - integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= - -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -nodemon@^1.18.7: - version "1.18.7" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.7.tgz#716b66bf3e89ac4fcfb38a9e61887a03fc82efbb" - dependencies: - chokidar "^2.0.4" - debug "^3.1.0" - ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.2" - semver "^5.5.0" - supports-color "^5.2.0" - touch "^3.1.0" - undefsafe "^2.0.2" - update-notifier "^2.3.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - dependencies: - abbrev "1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - -npm-packlist@^1.1.6: - version "1.1.12" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -object-assign@^4, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -one-time@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" - -optionator@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -pac-proxy-agent@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz#90d9f6730ab0f4d2607dcdcd4d3d641aa26c3896" - integrity sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA== - dependencies: - agent-base "^4.2.0" - debug "^3.1.0" - get-uri "^2.0.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" - pac-resolver "^3.0.0" - raw-body "^2.2.0" - socks-proxy-agent "^3.0.0" - -pac-resolver@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26" - integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA== - dependencies: - co "^4.6.0" - degenerator "^1.0.4" - ip "^1.1.5" - netmask "^1.0.6" - thunkify "^2.1.2" - -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -prova-lib@0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/prova-lib/-/prova-lib-0.2.10.tgz#324c17227d62c0cbd74b62198f0928560a889a92" - integrity sha512-L1K1BiBteuTL4Q/gyMROmPI4BJVG2KsmEkhmQEOKQw5SA3D54UC3iG6u+DSZKW7nvjsTPSbpzDzaCOmSgtTGuA== - dependencies: - bigi "~1.4.2" - bitcoin-ops "~1.3.0" - bitcoinjs-lib "~3.0.2" - bs58check "~2.0.1" - ecurve "~1.0.5" - lodash "~4.17.4" - typeforce "~1.10.6" - varuint-bitcoin "~1.0.4" - optionalDependencies: - secp256k1 "~3.5.0" - -proxy-addr@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.8.0" - -proxy-agent@2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.3.1.tgz#3d49d863d46cf5f37ca8394848346ea02373eac6" - integrity sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg== - dependencies: - agent-base "^4.2.0" - debug "^3.1.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" - lru-cache "^4.1.2" - pac-proxy-agent "^2.0.1" - proxy-from-env "^1.0.0" - socks-proxy-agent "^3.0.0" - -proxy-from-env@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -pstree.remy@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.2.tgz#4448bbeb4b2af1fed242afc8dc7416a6f504951a" - -pushdata-bitcoin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz#15931d3cd967ade52206f523aa7331aef7d43af7" - integrity sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc= - dependencies: - bitcoin-ops "^1.3.0" - -qs@6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - -qs@^6.5.1: - version "6.6.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" - integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== - -querystringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" - integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== - -randombytes@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -raw-body@2.3.3, raw-body@^2.2.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" - dependencies: - bytes "3.0.0" - http-errors "1.6.3" - iconv-lite "0.4.23" - unpipe "1.0.0" - -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@3, readable-stream@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.2.0.tgz#de17f229864c120a9f56945756e4f32c4045245d" - integrity sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.5, readable-stream@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -redux@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" - dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp-quote@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/regexp-quote/-/regexp-quote-0.0.0.tgz#1e0f4650c862dcbfed54fd42b148e9bb1721fcf2" - integrity sha1-Hg9GUMhi3L/tVP1CsUjpuxch/PI= - -registry-auth-token@^3.0.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -requires-port@0.x.x: - version "0.0.1" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-0.0.1.tgz#4b4414411d9df7c855995dd899a8c78a2951c16d" - integrity sha1-S0QUQR2d98hVmV3YmajHiilRwW0= - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -ripple-address-codec@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripple-address-codec/-/ripple-address-codec-2.0.1.tgz#eddbe3a7960d2e02c5c1c74fb9a9fa0d2dfb6571" - integrity sha1-7dvjp5YNLgLFwcdPuan6DS37ZXE= - dependencies: - hash.js "^1.0.3" - x-address-codec "^0.7.0" - -ripple-binary-codec@^0.1.0, ripple-binary-codec@^0.1.13: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ripple-binary-codec/-/ripple-binary-codec-0.1.15.tgz#bf69aa4aef097237f682ff517be29959102cd816" - integrity sha512-7b8JO8XmwzcNpBO3bBjNeATiW+NO3qPm56rZBaPn2HJ8Ig0bLJ/ZuA/Vg3SKJQSGOwtx2UD9Cm7PHSpbp+qmIg== - dependencies: - babel-runtime "^6.6.1" - bn.js "^4.11.3" - create-hash "^1.1.2" - decimal.js "^5.0.8" - inherits "^2.0.1" - lodash "^4.12.0" - ripple-address-codec "^2.0.1" - -ripple-hashes@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/ripple-hashes/-/ripple-hashes-0.3.1.tgz#f2f46f1ff05e6487500a99839019114cd2482411" - integrity sha1-8vRvH/BeZIdQCpmDkBkRTNJIJBE= - dependencies: - bignumber.js "^4.1.0" - create-hash "^1.1.2" - ripple-address-codec "^2.0.1" - ripple-binary-codec "^0.1.0" - -ripple-keypairs@^0.10.1: - version "0.10.2" - resolved "https://registry.yarnpkg.com/ripple-keypairs/-/ripple-keypairs-0.10.2.tgz#b3a1d1e2fca85a11c5224b2a7e6da506c19720d0" - integrity sha512-NvY+jCrhtpy7ox2unZTIfOfSrUWqVTq+tfCTqgDD8XZ957JGwHBlL5osYAypkTWed/JglH5hggxw14NTKEZzGA== - dependencies: - babel-runtime "^5.8.20" - bn.js "^3.1.1" - brorand "^1.0.5" - elliptic "^5.1.0" - hash.js "^1.0.3" - ripple-address-codec "^2.0.1" - -ripple-lib-transactionparser@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.6.2.tgz#eb117834816cab3398445a74ec3cacec95b6b5fa" - integrity sha1-6xF4NIFsqzOYRFp07Dys7JW2tfo= - dependencies: - bignumber.js "^4.1.0" - lodash "^4.17.4" - -ripple-lib@0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/ripple-lib/-/ripple-lib-0.22.0.tgz#09c230eaa036dc544c7fb60536c25c527a2c45f7" - integrity sha1-CcIw6qA23FRMf7YFNsJcUnosRfc= - dependencies: - "@types/lodash" "^4.14.85" - "@types/ws" "^3.2.0" - bignumber.js "^4.1.0" - https-proxy-agent "2.2.1" - jsonschema "1.2.2" - lodash "^4.17.4" - ripple-address-codec "^2.0.1" - ripple-binary-codec "^0.1.13" - ripple-hashes "^0.3.1" - ripple-keypairs "^0.10.1" - ripple-lib-transactionparser "^0.6.2" - ws "^3.3.1" - -rlp@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.2.tgz#e6677b83cca9105371d930e01d8ffc1263139d05" - integrity sha512-Ng2kJEN731Sfv4ZAY2i0ytPMc0BbJKBsVNl0QZY8LxOWSwd+1xpg+fpSRfaMn0heHU447s6Kgy8qfHZR0XTyVw== - dependencies: - bn.js "^4.11.1" - safe-buffer "^5.1.1" - -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - -sanitize-html@1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.13.0.tgz#4ee17cbec516bfe32f2ce6686a569d7e6b4f3631" - integrity sha1-TuF8vsUWv+MvLOZoaladfmtPNjE= - dependencies: - htmlparser2 "^3.9.0" - regexp-quote "0.0.0" - xtend "^4.0.0" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -secp256k1@3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.6.1.tgz#f0475d42096218ff00e45a127242abdff9285335" - integrity sha512-utLpWv4P4agEw7hakR73wlWX0NBmC5t/vkJ0TAfTyvETAUzo0tm6aFKPYetVYRaVubxMeWm5Ekv9ETwOgcDCqw== - dependencies: - bindings "^1.2.1" - bip66 "^1.1.3" - bn.js "^4.11.3" - create-hash "^1.1.2" - drbg.js "^1.0.1" - elliptic "^6.2.3" - nan "^2.2.1" - safe-buffer "^5.1.0" - -secp256k1@^3.0.1, secp256k1@^3.5.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.6.2.tgz#da835061c833c74a12f75c73d2ec2e980f00dc1f" - integrity sha512-90nYt7yb0LmI4A2jJs1grglkTAXrBwxYAjP9bpeKjvJKOjG2fOeH/YI/lchDMIvjrOasd5QXwvV2jwN168xNng== - dependencies: - bindings "^1.2.1" - bip66 "^1.1.3" - bn.js "^4.11.3" - create-hash "^1.1.2" - drbg.js "^1.0.1" - elliptic "^6.2.3" - nan "^2.2.1" - safe-buffer "^5.1.0" - -secp256k1@~3.5.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.5.2.tgz#f95f952057310722184fe9c914e6b71281f2f2ae" - integrity sha512-iin3kojdybY6NArd+UFsoTuapOF7bnJNf2UbcWXaY3z+E1sJDipl60vtzB5hbO/uquBu7z0fd4VC4Irp+xoFVQ== - dependencies: - bindings "^1.2.1" - bip66 "^1.1.3" - bn.js "^4.11.3" - create-hash "^1.1.2" - drbg.js "^1.0.1" - elliptic "^6.2.3" - nan "^2.2.1" - safe-buffer "^5.1.0" - -secrets.js-grempe@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/secrets.js-grempe/-/secrets.js-grempe-1.1.0.tgz#bb3b606dd68637ca244681a10fdee6c512049294" - integrity sha1-uztgbdaGN8okRoGhD97mxRIEkpQ= - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - -semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - -send@0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.4.0" - -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - -sha.js@^2.3.6, sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -sha3@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.2.tgz#a66c5098de4c25bc88336ec8b4817d005bca7ba9" - integrity sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k= - dependencies: - nan "2.10.0" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -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" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - dependencies: - is-arrayish "^0.3.1" - -smart-buffer@^1.0.13: - version "1.1.15" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" - integrity sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY= - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -socks-proxy-agent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" - integrity sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA== - dependencies: - agent-base "^4.1.0" - socks "^1.1.10" - -socks@^1.1.10: - version "1.1.10" - resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" - integrity sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o= - dependencies: - ip "^1.1.4" - smart-buffer "^1.0.13" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -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.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -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" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -stack-trace@0.0.10, stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - -stdrpc@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stdrpc/-/stdrpc-1.0.0.tgz#fd7c2dbcffce2088e46bc5fb9fe07bca47eb25a2" - dependencies: - axios "^0.16.2" - koa-basic-auth "^3.0.0" - -stellar-base@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/stellar-base/-/stellar-base-0.9.0.tgz#03a4d71c9bfe49f0c54afd4a8f34517ed49c0924" - integrity sha512-4tyztbyNeLW3bGUMepMqdcywfLUmfAI1A/RSiMgNHRC7vK8Jueh5Dn8RmQPhmAlKsgXhDSmbvpCLwEr2i00Emg== - dependencies: - base32.js "~0.1.0" - bignumber.js "^4.0.0" - crc "3.5.0" - js-xdr "^1.0.5" - lodash "^4.17.10" - sha.js "^2.3.6" - tweetnacl "^1.0.0" - optionalDependencies: - ed25519 "0.0.4" - -stellar-sdk@0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/stellar-sdk/-/stellar-sdk-0.11.0.tgz#d5415b1c535df188dbd3ab173f93bb24d18266d5" - integrity sha512-VNiJBea4eqZsuuNoqJu2WfBq0xhfaKex4soowJFQzYbLY0xVUe4qigetMO8dwlJrRevL4c/EDUd4ouKbT1lqAQ== - dependencies: - axios "^0.18.0" - es6-promise "^4.2.4" - event-source-polyfill "0.0.12" - eventsource "^1.0.5" - lodash "^4.17.10" - stellar-base "^0.9.0" - toml "^2.3.0" - urijs "1.19.1" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== - dependencies: - safe-buffer "~5.1.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= - dependencies: - is-hex-prefixed "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" - -superagent-proxy@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/superagent-proxy/-/superagent-proxy-1.0.3.tgz#acfa776672f11c24a90ad575e855def8be44f741" - integrity sha512-79Ujg1lRL2ICfuHUdX+H2MjIw73kB7bXsIkxLwHURz3j0XUmEEEoJ+u/wq+mKwna21Uejsm2cGR3OESA00TIjA== - dependencies: - debug "^3.1.0" - proxy-agent "2" - -superagent@3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" - integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== - dependencies: - component-emitter "^1.2.0" - cookiejar "^2.1.0" - debug "^3.1.0" - extend "^3.0.0" - form-data "^2.3.1" - formidable "^1.2.0" - methods "^1.1.1" - mime "^1.4.1" - qs "^6.5.1" - readable-stream "^2.3.5" - -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - dependencies: - has-flag "^3.0.0" - -supports-color@^5.2.0, supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - dependencies: - has-flag "^3.0.0" - -symbol-observable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - -tar@^4: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - dependencies: - execa "^0.7.0" - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - -thunkify@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" - integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= - -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toml@^2.3.0: - version "2.3.6" - resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.6.tgz#25b0866483a9722474895559088b436fd11f861b" - integrity sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ== - -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - dependencies: - nopt "~1.0.10" - -triple-beam@^1.2.0, triple-beam@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" - -ts-mocha@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-2.0.0.tgz#0dbd3cd04671df9933b9303b4aa46347573c5635" - dependencies: - ts-node "7.0.0" - optionalDependencies: - tsconfig-paths "^3.5.0" - -ts-node@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.0.tgz#a94a13c75e5e1aa6b82814b84c68deb339ba7bff" - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" - -ts-node@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" - -tsconfig-paths@^3.5.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.7.0.tgz#02ae978db447b22e09dafcd4198be95c4885ceb2" - dependencies: - "@types/json5" "^0.0.29" - deepmerge "^2.0.1" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - -tslib@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - -tweetnacl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.1.tgz#2594d42da73cd036bd0d2a54683dd35a6b55ca17" - integrity sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A== - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.16: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - -typeforce@^1.11.3, typeforce@^1.8.7: - version "1.18.0" - resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" - integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== - -typeforce@~1.10.6: - version "1.10.6" - resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.10.6.tgz#71bdca35b4e635b61245371b57c008cedfbec4db" - integrity sha1-cb3KNbTmNbYSRTcbV8AIzt++xNs= - dependencies: - inherits "^2.0.1" - -typescript@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.1.tgz#0b7a04b8cf3868188de914d9568bd030f0c56192" - -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - -undefsafe@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" - dependencies: - debug "^2.2.0" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - dependencies: - crypto-random-string "^1.0.0" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - -update-notifier@^2.3.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -urijs@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" - integrity sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg== - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - -url-parse@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" - integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg== - dependencies: - querystringify "^2.0.0" - requires-port "^1.0.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -"util@>= 0.4.9": - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - -varuint-bitcoin@^1.0.1, varuint-bitcoin@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.1.0.tgz#7a343f50537607af6a3059312b9782a170894540" - integrity sha512-jCEPG+COU/1Rp84neKTyDJQr478/hAfVp5xxYn09QEH0yBjbmPeMfuuQIrp+BUD83hybtYZKhr5elV3bvdV1bA== - dependencies: - safe-buffer "^5.1.1" - -varuint-bitcoin@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.0.4.tgz#d812c5dae16e32f60544b6adee1d4be1307d0283" - integrity sha1-2BLF2uFuMvYFRLat7h1L4TB9AoM= - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - dependencies: - string-width "^1.0.2 || 2" - -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - dependencies: - string-width "^2.1.1" - -wif@^2.0.1: - version "2.0.6" - resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" - integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ= - dependencies: - bs58check "<3.0.0" - -winston-transport@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66" - dependencies: - readable-stream "^2.3.6" - triple-beam "^1.2.0" - -winston@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.1.0.tgz#80724376aef164e024f316100d5b178d78ac5331" - dependencies: - async "^2.6.0" - diagnostics "^1.1.1" - is-stream "^1.1.0" - logform "^1.9.1" - one-time "0.0.4" - readable-stream "^2.3.6" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.2.0" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -ws@^3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -ws@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" - dependencies: - async-limiter "~1.0.0" - -x-address-codec@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/x-address-codec/-/x-address-codec-0.7.2.tgz#2a2f7bb00278520bd13733a7959a05443d6802e0" - integrity sha1-Ki97sAJ4UgvRNzOnlZoFRD1oAuA= - dependencies: - base-x "^1.0.1" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= - -xtend@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" - -zcash-bitcore-lib@0.13.20-rc3: - version "0.13.20-rc3" - resolved "https://registry.yarnpkg.com/zcash-bitcore-lib/-/zcash-bitcore-lib-0.13.20-rc3.tgz#813a0f56dcf8b76bc1429951bea6d1236c507008" - dependencies: - bn.js "=2.0.4" - bs58 "=2.0.0" - buffer-compare "=1.0.0" - elliptic "=3.0.3" - inherits "=2.0.1" - lodash "=3.10.1" diff --git a/e2e/package.json b/e2e/package.json index bbcdff74..8a444d7f 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -11,8 +11,11 @@ "@cypress/webpack-preprocessor": "^4.0.3", "cypress": "^3.1.5", "lodash": "^4.17.15", - "ts-loader": "^5.0.0", + "ts-loader": "^5.4.5", "typescript": "^3.0.3", - "webpack": "^4.17.2" + "webpack": "^4.42.0", + "acorn": "^6.4.1", + "minimist": "^1.2.3", + "kind-of": "^6.0.3" } } diff --git a/e2e/yarn.lock b/e2e/yarn.lock index 4fc2ae50..2658124a 100644 --- a/e2e/yarn.lock +++ b/e2e/yarn.lock @@ -862,15 +862,15 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== +acorn@^6.2.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== -acorn@^6.0.5: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== +acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== ajv-errors@^1.0.0: version "1.0.1" @@ -882,6 +882,11 @@ ajv-keywords@^3.1.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== +ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + ajv@^5.1.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -902,6 +907,16 @@ ajv@^6.1.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.2: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + 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" + ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -1020,7 +1035,7 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -1098,10 +1113,10 @@ bluebird@3.5.0: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= -bluebird@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" @@ -1234,22 +1249,23 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -cacache@^11.0.2: - version "11.3.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" - integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== dependencies: - bluebird "^3.5.3" + bluebird "^3.5.5" chownr "^1.1.1" figgy-pudding "^3.5.1" - glob "^7.1.3" + glob "^7.1.4" graceful-fs "^4.1.15" + infer-owner "^1.0.3" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" - rimraf "^2.6.2" + rimraf "^2.6.3" ssri "^6.0.1" unique-filename "^1.1.1" y18n "^4.0.0" @@ -1344,10 +1360,10 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== dependencies: tslib "^1.9.0" @@ -1436,10 +1452,10 @@ commander@2.11.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== -commander@~2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== common-tags@1.4.0: version "1.4.0" @@ -1454,9 +1470,9 @@ commondir@^1.0.1: integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" @@ -1805,10 +1821,10 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" @@ -1817,7 +1833,16 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: +enhanced-resolve@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== @@ -1859,10 +1884,10 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-scope@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.2.tgz#5f10cd6cabb1965bf479fa65745673439e21cb0e" - integrity sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg== +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -1999,6 +2024,11 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -2043,6 +2073,15 @@ find-cache-dir@^2.0.0: make-dir "^1.0.0" pkg-dir "^3.0.0" +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -2206,6 +2245,18 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -2218,11 +2269,16 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.6: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -2381,10 +2437,10 @@ indent-string@^3.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" @@ -2394,7 +2450,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -2404,6 +2460,11 @@ inherits@2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= +inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -2563,7 +2624,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -2604,6 +2665,11 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2731,10 +2797,10 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -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" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +kind-of@^6.0.0, kind-of@^6.0.2, 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== lazy-ass@1.6.0: version "1.6.0" @@ -2792,18 +2858,18 @@ listr@0.12.0: stream-to-observable "^0.1.0" strip-ansi "^3.0.1" -loader-runner@^2.3.0: +loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== +loader-utils@^1.0.2, loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== dependencies: big.js "^5.2.2" - emojis-list "^2.0.0" + emojis-list "^3.0.0" json5 "^1.0.1" locate-path@^3.0.0: @@ -2877,6 +2943,14 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" @@ -2903,7 +2977,7 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -memory-fs@^0.4.0, memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -2911,7 +2985,15 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -2977,6 +3059,11 @@ minimist@1.2.0, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.2.2: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minipass@^2.2.1, minipass@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" @@ -3009,9 +3096,9 @@ mississippi@^3.0.0: through2 "^2.0.0" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -3023,7 +3110,7 @@ mkdirp@0.5.0: dependencies: minimist "0.0.8" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -3093,15 +3180,20 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== +neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-libs-browser@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -3113,7 +3205,7 @@ node-libs-browser@^2.0.0: events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" - path-browserify "0.0.0" + path-browserify "0.0.1" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" @@ -3125,7 +3217,7 @@ node-libs-browser@^2.0.0: tty-browserify "0.0.0" url "^0.11.0" util "^0.11.0" - vm-browserify "0.0.4" + vm-browserify "^1.0.1" node-pre-gyp@^0.10.0: version "0.10.3" @@ -3356,10 +3448,10 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-dirname@^1.0.0: version "1.0.2" @@ -3422,6 +3514,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -3440,9 +3537,9 @@ private@^0.1.6: integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.10: version "0.11.10" @@ -3556,7 +3653,7 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -3569,6 +3666,19 @@ rc@^1.2.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^2.0.1: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + 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" @@ -3719,13 +3829,20 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -3779,35 +3896,30 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: +semver@^5.0.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -serialize-javascript@^1.4.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" - integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -3885,20 +3997,20 @@ source-list-map@^2.0.0: integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@~0.5.9: - version "0.5.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" - integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -4071,10 +4183,10 @@ symbol-observable@1.0.1: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= -tapable@^1.0.0, tapable@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" - integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^4: version "4.4.8" @@ -4089,28 +4201,29 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -terser-webpack-plugin@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" - integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== dependencies: - cacache "^11.0.2" - find-cache-dir "^2.0.0" + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^1.4.0" + serialize-javascript "^2.1.2" source-map "^0.6.1" - terser "^3.16.1" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" -terser@^3.16.1: - version "3.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493" - integrity sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow== +terser@^4.1.2: + version "4.6.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" + integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== dependencies: - commander "~2.17.1" + commander "^2.20.0" source-map "~0.6.1" - source-map-support "~0.5.9" + source-map-support "~0.5.12" throttleit@~0.0.2: version "0.0.2" @@ -4186,10 +4299,10 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -ts-loader@^5.0.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-5.3.3.tgz#8b4af042e773132d86b3c99ef0acf3b4d325f473" - integrity sha512-KwF1SplmOJepnoZ4eRIloH/zXL195F51skt7reEsS6jvDqzgc/YSbz9b8E07GxIUwLXdcD4ssrJu6v8CwaTafA== +ts-loader@^5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-5.4.5.tgz#a0c1f034b017a9344cef0961bfd97cc192492b8b" + integrity sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw== dependencies: chalk "^2.3.0" enhanced-resolve "^4.0.0" @@ -4253,14 +4366,14 @@ unicode-property-aliases-ecmascript@^1.0.4: integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" unique-filename@^1.1.1: version "1.1.1" @@ -4360,14 +4473,12 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -watchpack@^1.5.0: +watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== @@ -4376,43 +4487,42 @@ watchpack@^1.5.0: graceful-fs "^4.1.2" neo-async "^2.5.0" -webpack-sources@^1.1.0, webpack-sources@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" - integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.17.2: - version "4.29.6" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.6.tgz#66bf0ec8beee4d469f8b598d3988ff9d8d90e955" - integrity sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw== +webpack@^4.42.0: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== dependencies: "@webassemblyjs/ast" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5" "@webassemblyjs/wasm-edit" "1.8.5" "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.0.5" - acorn-dynamic-import "^4.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" + eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" schema-utils "^1.0.0" - tapable "^1.1.0" - terser-webpack-plugin "^1.1.0" - watchpack "^1.5.0" - webpack-sources "^1.3.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" which@^1.2.9: version "1.3.1" @@ -4428,10 +4538,10 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== dependencies: errno "~0.1.7" diff --git a/frontend/.storybook/webpack.config.js b/frontend/.storybook/webpack.config.js index bc2a3673..557f449f 100644 --- a/frontend/.storybook/webpack.config.js +++ b/frontend/.storybook/webpack.config.js @@ -1,11 +1,13 @@ const paths = require('../config/paths'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const { client: clientLoaders } = require('../config/webpack.config.js/loaders'); const { alias } = require('../config/webpack.config.js/resolvers'); module.exports = (baseConfig, env, defaultConfig) => { const rules = [...baseConfig.module.rules, ...clientLoaders]; baseConfig.module.rules = rules; - baseConfig.resolve.extensions.push('.ts', '.tsx', '.json'); + baseConfig.resolve.extensions.push('.ts', '.tsx', '.json', '.less'); baseConfig.resolve.alias = alias; + baseConfig.plugins.push(new MiniCssExtractPlugin()); return baseConfig; }; diff --git a/frontend/client/Routes.tsx b/frontend/client/Routes.tsx index a63f00e4..3ccd1d3e 100644 --- a/frontend/client/Routes.tsx +++ b/frontend/client/Routes.tsx @@ -25,6 +25,7 @@ const RequestEdit = loadable(() => import('pages/request-edit'), opts); const ProposalEdit = loadable(() => import('pages/proposal-edit'), opts); const Proposals = loadable(() => import('pages/proposals'), opts); const Proposal = loadable(() => import('pages/proposal'), opts); +const Archived = loadable(() => import('pages/archived'), opts); const Guide = loadable(() => import('pages/guide'), opts); const Ccr = loadable(() => import('pages/ccr'), opts); const Auth = loadable(() => import('pages/auth')); @@ -140,6 +141,16 @@ const routeConfigs: RouteConfig[] = [ }, onlyLoggedIn: true, }, + { + // Proposal archive page + route: { + path: '/proposals/:id/archive', + component: Archived, + }, + template: { + title: 'Archived', + }, + }, { // Proposal detail page route: { diff --git a/frontend/client/api/api.ts b/frontend/client/api/api.ts index 0fd5ae2c..6d706c0a 100644 --- a/frontend/client/api/api.ts +++ b/frontend/client/api/api.ts @@ -44,6 +44,15 @@ export function getProposal(proposalId: number | string): Promise<{ data: Propos }); } +export function getArchivedProposal( + proposalId: number | string, +): Promise<{ data: Proposal }> { + return axios.get(`/api/v1/proposals/${proposalId}/archive`).then(res => { + res.data = formatProposalFromGet(res.data); + return res; + }); +} + export function followProposal(proposalId: number, isFollow: boolean) { return axios.put(`/api/v1/proposals/${proposalId}/follow`, { isFollow }); } @@ -74,6 +83,10 @@ export function getProposalUpdates(proposalId: number | string) { return axios.get(`/api/v1/proposals/${proposalId}/updates`); } +export function getProposalRevisions(proposalId: number | string) { + return axios.get(`/api/v1/proposals/${proposalId}/revisions`); +} + export function getProposalContributions(proposalId: number | string) { return axios.get(`/api/v1/proposals/${proposalId}/contributions`); } @@ -96,6 +109,7 @@ export function getUser(address: string): Promise<{ data: User }> { withFunded: true, withPending: true, withArbitrated: true, + withRejectedPermanently: true, }, }) .then(res => { @@ -237,7 +251,7 @@ export function postProposalDraft(rfpId?: number): Promise<{ data: ProposalDraft return axios.post('/api/v1/proposals/drafts', { rfpId }); } -export function deleteProposalDraft(proposalId: number): Promise { +export function deleteProposal(proposalId: number): Promise { return axios.delete(`/api/v1/proposals/${proposalId}`); } @@ -262,6 +276,24 @@ export async function putProposalSubmitForApproval( }); } +export async function postProposalMakeLiveDraft( + proposalId: number, +): Promise<{ data: Proposal }> { + return axios.post(`/api/v1/proposals/${proposalId}/draft`).then(res => { + res.data = formatProposalFromGet(res.data); + return res; + }); +} + +export async function putProposalSubmitLiveDraft( + proposal: ProposalDraft, +): Promise<{ data: Proposal }> { + return axios.put(`/api/v1/proposals/${proposal.proposalId}/publish/live`).then(res => { + res.data = formatProposalFromGet(res.data); + return res; + }); +} + export async function putProposalPublish( proposalId: number, ): Promise<{ data: Proposal }> { @@ -271,6 +303,15 @@ export async function putProposalPublish( }); } +export async function putMarkProposalRequestedChangesAsResolved( + proposalId: number, +): Promise<{ data: Proposal }> { + return axios.put(`/api/v1/proposals/${proposalId}/resolve`).then(res => { + res.data = formatProposalFromGet(res.data); + return res; + }); +} + export async function deleteProposalRFPLink(proposalId: number): Promise { return axios.delete(`/api/v1/proposals/${proposalId}/rfp`); } @@ -310,6 +351,12 @@ export async function rejectProposalPayout( }); } +export function getProposalInvites( + proposalId: number, +): Promise<{ data: { invites: TeamInvite[], team: User[] } }> { + return axios.get(`/api/v1/proposals/${proposalId}/invites`); +} + export function postProposalInvite( proposalId: number, address: string, diff --git a/frontend/client/api/constants.ts b/frontend/client/api/constants.ts index cc1a22ae..77d60521 100644 --- a/frontend/client/api/constants.ts +++ b/frontend/client/api/constants.ts @@ -59,20 +59,40 @@ export enum PROPOSAL_STAGE { CANCELED = 'CANCELED', } +export enum CUSTOM_FILTERS { + STATUS_DISCUSSION = 'STATUS_DISCUSSION', + ACCEPTED_WITH_FUNDING = 'ACCEPTED_WITH_FUNDING', + ACCEPTED_WITHOUT_FUNDING = 'ACCEPTED_WITHOUT_FUNDING', +} + interface StageUI { label: string; color: string; } -export const STAGE_UI: { [key in PROPOSAL_STAGE]: StageUI } = { +export type PROPOSAL_FILTERS = PROPOSAL_STAGE | CUSTOM_FILTERS; + +export const STAGE_UI: { [key in PROPOSAL_FILTERS]: StageUI } = { PREVIEW: { label: 'Preview', color: '#8e44ad', }, + STATUS_DISCUSSION: { + label: 'Open for Public Review', + color: '#8e44ad', + }, FUNDING_REQUIRED: { label: 'Funding required', color: '#8e44ad', }, + ACCEPTED_WITH_FUNDING: { + label: 'Funded by ZF', + color: '#8e44ad', + }, + ACCEPTED_WITHOUT_FUNDING: { + label: 'Not Funded by ZF', + color: '#8e44ad', + }, WIP: { label: 'In progress', color: '#2980b9', diff --git a/frontend/client/components/Archived/index.less b/frontend/client/components/Archived/index.less new file mode 100644 index 00000000..22cb4677 --- /dev/null +++ b/frontend/client/components/Archived/index.less @@ -0,0 +1,5 @@ +@import '~styles/variables.less'; + +.Archived { + padding-bottom: 8rem; +} diff --git a/frontend/client/components/Archived/index.tsx b/frontend/client/components/Archived/index.tsx new file mode 100644 index 00000000..8d9a2948 --- /dev/null +++ b/frontend/client/components/Archived/index.tsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { ProposalDetail } from 'components/Proposal'; +import Exception from 'components/ExceptionPage'; +import Loader from 'components/Loader'; +import { makeProposalPreviewFromArchived } from 'modules/create/utils'; +import { STATUS, Proposal } from 'types'; +import { getArchivedProposal } from 'api/api'; +import './index.less'; + +interface Props { + proposalId: number; +} + +interface State { + proposal?: Proposal; + errorCode?: '403' | '404' | '500'; + loading: boolean; +} + +export class ArchivedProposal extends React.Component { + state: State = { + loading: false, + }; + + async componentWillMount() { + const { proposalId } = this.props; + const { proposal } = this.state; + + if (!proposal || proposal.proposalId !== proposalId) { + this.setState({ loading: true, errorCode: undefined }); + try { + const { data } = await getArchivedProposal(proposalId); + this.setState({ proposal: data }); + } catch (e) { + this.setState({ errorCode: '404' }); + } + this.setState({ loading: false }); + } + } + + render() { + const { proposalId } = this.props; + const { proposal, errorCode } = this.state; + const wrongProposal = proposal && proposal.proposalId !== this.props.proposalId; + const badProposal = proposal && !wrongProposal && proposal.status !== STATUS.ARCHIVED; + + if (errorCode || badProposal) { + return ; + } + + if (!proposal || wrongProposal) { + return ; + } + + const proposalDetail = makeProposalPreviewFromArchived(proposal); + return ( +
+ null) as any} + updateProposal={(() => null) as any} + detail={proposalDetail} + isFetchingDetail={false} + detailError={null} + history={(() => null) as any} + location={(() => null) as any} + match={(() => null) as any} + isPreview + /> +
+ ); + } +} + +export default ArchivedProposal; diff --git a/frontend/client/components/CCRFlow/Basics.tsx b/frontend/client/components/CCRFlow/Basics.tsx index b9083d62..a9bd07f3 100644 --- a/frontend/client/components/CCRFlow/Basics.tsx +++ b/frontend/client/components/CCRFlow/Basics.tsx @@ -64,7 +64,7 @@ class CCRFlowBasics extends React.Component { > { const { data } = await getCCR(id); this.setState({ ccr: data }); } catch (e) { - this.setState({ error: e.message || e.toString()}) + this.setState({ error: e.message || e.toString() }); } this.setState({ loading: false }); } @@ -60,7 +60,12 @@ class CCRFlowPreview extends React.Component { if (error) { return (
- +
); } @@ -99,6 +104,16 @@ class CCRFlowPreview extends React.Component { ), type: 'error', }, + [CCRSTATUS.REJECTED_PERMANENTLY]: { + blurb: ( + <> + Your proposal has has been rejected permanently and is only visible to the + team. Visit your profile's rejected tab{' '} + for more information. + + ), + type: 'error', + }, [CCRSTATUS.LIVE]: { blurb: ( <> diff --git a/frontend/client/components/CreateFlow/Basics.tsx b/frontend/client/components/CreateFlow/Basics.tsx index e6b2280b..b4803adc 100644 --- a/frontend/client/components/CreateFlow/Basics.tsx +++ b/frontend/client/components/CreateFlow/Basics.tsx @@ -146,7 +146,7 @@ class CreateFlowBasics extends React.Component { > { } render() { - const { submittedProposal, submitError, goBack } = this.props; + const { + submittedProposal, + submittedLiveDraft, + submitError, + submitErrorLiveDraft, + goBack, + form, + } = this.props; - const ready = submittedProposal; + const isLiveDraft = form && form.status === STATUS.LIVE_DRAFT; + const error = isLiveDraft ? submitErrorLiveDraft : submitError; + const ready = isLiveDraft ? submittedLiveDraft : submittedProposal; + + const updatedId = submittedLiveDraft ? submittedLiveDraft.proposalId : ''; let content; - if (submitError) { + if (error) { content = (

- Something went wrong during creation + Something went wrong during {isLiveDraft ? 'updating' : 'creation'}

{submitError}
Click here to go back to the form and try again. @@ -53,9 +68,18 @@ class CreateFinal extends React.Component {
- Your proposal has been submitted! Check your{' '} - profile's pending tab to check its - status. + {isLiveDraft ? ( + <> + Your proposal has been updated!{' '} + Click here to see it live. + + ) : ( + <> + Your proposal has been submitted! Check your{' '} + profile's pending tab to check + its status. + + )}
@@ -68,8 +92,13 @@ class CreateFinal extends React.Component { } private submit = () => { - if (this.props.form) { - this.props.submitProposal(this.props.form); + const { form } = this.props; + if (form) { + if (form.status === STATUS.LIVE_DRAFT) { + this.props.submitLiveDraft(form); + } else { + this.props.submitProposal(form); + } } }; } @@ -79,8 +108,11 @@ export default connect( form: state.create.form, submittedProposal: state.create.submittedProposal, submitError: state.create.submitError, + submittedLiveDraft: state.create.submittedLiveDraft, + submitErrorLiveDraft: state.create.submitErrorLiveDraft, }), { submitProposal: createActions.submitProposal, + submitLiveDraft: createActions.submitLiveDraft, }, )(CreateFinal); diff --git a/frontend/client/components/CreateFlow/Preview.tsx b/frontend/client/components/CreateFlow/Preview.tsx index 8b5441b0..ca359760 100644 --- a/frontend/client/components/CreateFlow/Preview.tsx +++ b/frontend/client/components/CreateFlow/Preview.tsx @@ -22,9 +22,13 @@ class CreateFlowPreview extends React.Component { user={null} proposalId={0} fetchProposal={(() => null) as any} + updateProposal={(() => null) as any} detail={proposal} isFetchingDetail={false} detailError={null} + history={(() => null) as any} + location={(() => null) as any} + match={(() => null) as any} isPreview />
diff --git a/frontend/client/components/CreateFlow/SubmitWarningModal.tsx b/frontend/client/components/CreateFlow/SubmitWarningModal.tsx index 84eb4f46..90057431 100644 --- a/frontend/client/components/CreateFlow/SubmitWarningModal.tsx +++ b/frontend/client/components/CreateFlow/SubmitWarningModal.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Modal, Alert } from 'antd'; import { getCreateWarnings } from 'modules/create/utils'; -import { ProposalDraft } from 'types'; +import { ProposalDraft, STATUS } from 'types'; import './SubmitWarningModal.less'; interface Props { @@ -15,6 +15,7 @@ export default class SubmitWarningModal extends React.Component { render() { const { proposal, isVisible, handleClose, handleSubmit } = this.props; const warnings = proposal ? getCreateWarnings(proposal) : []; + const isLiveDraft = proposal && proposal.status === STATUS.LIVE_DRAFT; return ( { } /> )} -

- Are you sure you're ready to submit your proposal for approval? Once you’ve - done so, you won't be able to edit it. -

+ {isLiveDraft ? ( +

Are you sure you're ready to submit your edit?

+ ) : ( +

+ Are you sure you're ready to submit your proposal for approval? Once you’ve + done so, you won't be able to edit it until it's been reviewed by an admin. +

+ )}
); diff --git a/frontend/client/components/CreateFlow/Team.tsx b/frontend/client/components/CreateFlow/Team.tsx index 103496d0..7a701ddd 100644 --- a/frontend/client/components/CreateFlow/Team.tsx +++ b/frontend/client/components/CreateFlow/Team.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { connect } from 'react-redux'; import { Icon, Form, Input, Button, Popconfirm, message } from 'antd'; -import { User, TeamInvite, ProposalDraft } from 'types'; +import { ProposalDraft, STATUS } from 'types'; import TeamMemberComponent from './TeamMember'; import { postProposalInvite, deleteProposalInvite } from 'api/api'; import { isValidEmail } from 'utils/validators'; @@ -9,13 +9,12 @@ import { AppState } from 'store/reducers'; import './Team.less'; interface State { - team: User[]; - invites: TeamInvite[]; address: string; } interface StateProps { authUser: AppState['auth']['user']; + form: ProposalDraft; } interface OwnProps { @@ -28,8 +27,6 @@ type Props = OwnProps & StateProps; const MAX_TEAM_SIZE = 6; const DEFAULT_STATE: State = { - team: [], - invites: [], address: '', }; @@ -40,22 +37,31 @@ class CreateFlowTeam extends React.Component { ...DEFAULT_STATE, ...(props.initialState || {}), }; + } + componentWillMount() { + const { + form: { team }, + authUser, + updateForm, + } = this.props; // Auth'd user is always first member of a team - if (props.authUser && !this.state.team.length) { - this.state.team[0] = { - ...props.authUser, - }; + if (authUser && !team.length) { + updateForm({ + team: [{ ...authUser }], + }); } } render() { - const { team, invites, address } = this.state; + const { address } = this.state; + const { team, invites } = this.props.form; const inviteError = address && !isValidEmail(address) && 'That doesn’t look like a valid email address'; const maxedOut = invites.length >= MAX_TEAM_SIZE - 1; const inviteDisabled = !!inviteError || !address || maxedOut; const pendingInvites = invites.filter(inv => inv.accepted === null); + const isEdit = this.props.form.status === STATUS.LIVE_DRAFT; return (
@@ -81,7 +87,11 @@ class CreateFlowTeam extends React.Component {
)}
-

Add an optional team member

+

+ {!isEdit + ? 'Add an optional team member' + : 'Your team will be locked in unless you choose to edit the proposal again'} +

{ help={ inviteError || (maxedOut && 'You’ve invited the maximum number of teammates') || - 'They will be notified and will have to accept the invitation before being added' + 'They will be notified immediately and will have to accept the invitation before being added' } > { ev.preventDefault(); postProposalInvite(this.props.proposalId, this.state.address) .then(res => { - const invites = [...this.state.invites, res.data]; + const invites = [...this.props.form.invites, res.data]; this.setState({ - invites, address: '', }); this.props.updateForm({ invites }); @@ -141,8 +150,7 @@ class CreateFlowTeam extends React.Component { private removeInvitation = (invId: number) => { deleteProposalInvite(this.props.proposalId, invId) .then(() => { - const invites = this.state.invites.filter(inv => inv.id !== invId); - this.setState({ invites }); + const invites = this.props.form.invites.filter(inv => inv.id !== invId); this.props.updateForm({ invites }); }) .catch((err: Error) => { @@ -154,6 +162,7 @@ class CreateFlowTeam extends React.Component { const withConnect = connect(state => ({ authUser: state.auth.user, + form: state.create.form as ProposalDraft, })); export default withConnect(CreateFlowTeam); diff --git a/frontend/client/components/CreateFlow/index.tsx b/frontend/client/components/CreateFlow/index.tsx index 5d9e61ea..5fc2de90 100644 --- a/frontend/client/components/CreateFlow/index.tsx +++ b/frontend/client/components/CreateFlow/index.tsx @@ -6,6 +6,7 @@ import qs from 'query-string'; import { withRouter, RouteComponentProps } from 'react-router'; import { History } from 'history'; import { debounce } from 'underscore'; +import { isEqual } from 'lodash'; import Basics from './Basics'; import Team from './Team'; import Details from './Details'; @@ -21,6 +22,7 @@ import { createActions } from 'modules/create'; import { ProposalDraft } from 'types'; import { getCreateErrors } from 'modules/create/utils'; import ls from 'local-storage'; +import { getProposalInvites } from 'api/api'; import { AppState } from 'store/reducers'; @@ -126,11 +128,15 @@ interface State { isSubmitting: boolean; isExplaining: boolean; isExample: boolean; + isPolling: boolean; } +const TEAM_CHANGE_POLL_INTERVAL = 5000; + class CreateFlow extends React.Component { private historyUnlisten: () => void; private debouncedUpdateForm: (form: Partial) => void; + private pollInterval: ReturnType | undefined; constructor(props: Props) { super(props); @@ -149,15 +155,27 @@ class CreateFlow extends React.Component { isExample: false, isShowingSubmitWarning: false, isExplaining: !noExplain, + isPolling: false, }; this.debouncedUpdateForm = debounce(this.updateForm, 800); this.historyUnlisten = this.props.history.listen(this.handlePop); } + componentWillMount() { + if (!this.pollInterval) { + this.pollInterval = setInterval(this.pollForTeamChanges, TEAM_CHANGE_POLL_INTERVAL); + } + } + componentWillUnmount() { if (this.historyUnlisten) { this.historyUnlisten(); } + + if (this.pollInterval) { + clearInterval(this.pollInterval); + this.pollInterval = undefined; + } } render() { @@ -337,7 +355,7 @@ class CreateFlow extends React.Component { } }; - private openPublishWarning = () => { + private openPublishWarning = async () => { this.setState({ isShowingSubmitWarning: true }); }; @@ -358,6 +376,26 @@ class CreateFlow extends React.Component { }); }, 50); }; + + private pollForTeamChanges = async () => { + const { form } = this.props; + + if (this.state.isPolling) return; + if (form) { + this.setState({ isPolling: true }); + try { + const { + data: { invites, team }, + } = await getProposalInvites(form.proposalId); + + if (!isEqual(form.invites, invites) || !isEqual(form.team, team)) { + this.updateForm({ invites, team }); + } + // tslint:disable-next-line:no-empty + } catch {} + this.setState({ isPolling: false }); + } + }; } const withConnect = connect( diff --git a/frontend/client/components/DraftList/index.tsx b/frontend/client/components/DraftList/index.tsx index e5cc38e6..1a033184 100644 --- a/frontend/client/components/DraftList/index.tsx +++ b/frontend/client/components/DraftList/index.tsx @@ -91,9 +91,18 @@ class DraftList extends React.Component { } render() { - const { drafts, isCreatingDraft, isFetchingDrafts, isVerified } = this.props; + const { + drafts: allDrafts, + isCreatingDraft, + isFetchingDrafts, + isVerified, + } = this.props; const { deletingId } = this.state; + const drafts = allDrafts + ? allDrafts.filter(draft => draft.status !== STATUS.LIVE_DRAFT) + : allDrafts; + if (!isVerified) { return (
diff --git a/frontend/client/components/LinkableTabs.tsx b/frontend/client/components/LinkableTabs.tsx index 0c790122..af5b9cca 100644 --- a/frontend/client/components/LinkableTabs.tsx +++ b/frontend/client/components/LinkableTabs.tsx @@ -7,6 +7,7 @@ import { TabsProps } from 'antd/lib/tabs'; interface OwnProps extends TabsProps { scrollToTabs?: boolean; + ignoredKeys?: string[]; } type Props = OwnProps & RouteComponentProps; @@ -20,8 +21,11 @@ class LinkableTabs extends React.Component { super(props); let { defaultActiveKey } = props; + const { ignoredKeys } = props; const tab = this.getTabFromUrl(props.location); - if (tab) { + const shouldSkip = tab && ignoredKeys && ignoredKeys.includes(tab); + + if (tab && !shouldSkip) { defaultActiveKey = tab; } this.state = { defaultActiveKey }; diff --git a/frontend/client/components/Profile/ProfilePending.tsx b/frontend/client/components/Profile/ProfilePending.tsx index f453d4ae..f8c85bb5 100644 --- a/frontend/client/components/Profile/ProfilePending.tsx +++ b/frontend/client/components/Profile/ProfilePending.tsx @@ -46,7 +46,7 @@ class ProfilePending extends React.Component { }, [STATUS.REJECTED]: { color: 'red', - tag: 'Changes requested', + tag: 'Changes Requested', blurb: ( <>
This proposal has changes requested:
@@ -81,7 +81,7 @@ class ProfilePending extends React.Component {
- {title} {st[status].tag} Proposal + {title} {st[status].tag}
{st[status].blurb} @@ -122,8 +122,8 @@ class ProfilePending extends React.Component { message.success('Proposal deleted.'); } catch (e) { message.error(e.message || e.toString()); - this.setState({ isDeleting: false }); } + this.setState({ isDeleting: false }); }; } diff --git a/frontend/client/components/Profile/ProfilePendingCCR.tsx b/frontend/client/components/Profile/ProfilePendingCCR.tsx index bb8d8446..f3b211b3 100644 --- a/frontend/client/components/Profile/ProfilePendingCCR.tsx +++ b/frontend/client/components/Profile/ProfilePendingCCR.tsx @@ -2,7 +2,7 @@ import React, { ReactNode } from 'react'; import { Link } from 'react-router-dom'; import { Button, Popconfirm, message, Tag } from 'antd'; import { CCRSTATUS, STATUS, UserCCR } from 'types'; -import { deletePendingRequest } from 'modules/users/actions'; +import { deletePendingRequest, fetchUser } from 'modules/users/actions'; import { connect } from 'react-redux'; import { AppState } from 'store/reducers'; import './ProfilePending.less'; @@ -17,6 +17,7 @@ interface StateProps { interface DispatchProps { deletePendingRequest: typeof deletePendingRequest; + fetchUser: typeof fetchUser; } type Props = OwnProps & StateProps & DispatchProps; @@ -35,7 +36,6 @@ class ProfilePendingCCR extends React.Component { const { isDeleting } = this.state; const isDisableActions = isDeleting; - const st = { [STATUS.REJECTED]: { color: 'red', @@ -50,7 +50,7 @@ class ProfilePendingCCR extends React.Component { }, [STATUS.PENDING]: { color: 'purple', - tag: 'Pending Request', + tag: 'Pending', blurb: (
You will receive an email when this request has completed the review process. @@ -102,6 +102,7 @@ class ProfilePendingCCR extends React.Component { try { await this.props.deletePendingRequest(user.userid, ccrId); message.success('Request deleted.'); + await this.props.fetchUser(String(user.userid)); } catch (e) { message.error(e.message || e.toString()); } @@ -115,5 +116,6 @@ export default connect( }), { deletePendingRequest, + fetchUser, }, )(ProfilePendingCCR); diff --git a/frontend/client/components/Profile/ProfileProposal.tsx b/frontend/client/components/Profile/ProfileProposal.tsx index b858e94d..853cbfe4 100644 --- a/frontend/client/components/Profile/ProfileProposal.tsx +++ b/frontend/client/components/Profile/ProfileProposal.tsx @@ -1,11 +1,11 @@ import React from 'react'; import { Link } from 'react-router-dom'; -import { UserProposal } from 'types'; +import { UserProposal, STATUS } from 'types'; import './ProfileProposal.less'; import UserRow from 'components/UserRow'; import UnitDisplay from 'components/UnitDisplay'; import { Tag } from 'antd'; -import { formatUsd } from 'utils/formatters' +import { formatUsd } from 'utils/formatters'; interface OwnProps { proposal: UserProposal; @@ -22,24 +22,39 @@ export default class Profile extends React.Component { target, isVersionTwo, acceptedWithFunding, + status, + changesRequestedDiscussionReason } = this.props.proposal; // pulled from `variables.less` - const infoColor = '#1890ff' - const secondaryColor = '#2D2A26' + const infoColor = '#1890ff'; + const secondaryColor = '#2D2A26'; - const tagColor = acceptedWithFunding - ? secondaryColor - : infoColor - const tagMessage = acceptedWithFunding - ? 'Funded by ZF' - : 'Open for Contributions' + const isOpenForDiscussion = status === STATUS.DISCUSSION; + const discussionColor = changesRequestedDiscussionReason ? 'red' : infoColor + const discussionTag = changesRequestedDiscussionReason ? 'Changes Requested' : 'Open for Public Review' + + let tagColor = infoColor + let tagMessage = 'Open for Contributions' + + if (acceptedWithFunding) { + tagColor = secondaryColor + tagMessage = 'Funded by ZF' + } else if (isOpenForDiscussion) { + tagColor = discussionColor + tagMessage = discussionTag + } return (
- {title} {isVersionTwo && ({tagMessage})} + {title}{' '} + {isVersionTwo && ( + + {tagMessage} + + )}
{brief}
{!isVersionTwo && ( @@ -50,9 +65,7 @@ export default class Profile extends React.Component {
)} {isVersionTwo && ( -
- {formatUsd(target.toString())} -
+
{formatUsd(target.toString())}
)}
diff --git a/frontend/client/components/Profile/ProfileRejectedPermanentlyCCR.tsx b/frontend/client/components/Profile/ProfileRejectedPermanentlyCCR.tsx new file mode 100644 index 00000000..819db5c8 --- /dev/null +++ b/frontend/client/components/Profile/ProfileRejectedPermanentlyCCR.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Button, Popconfirm, message } from 'antd'; +import { UserCCR } from 'types'; +import { deletePendingRequest, fetchUser } from 'modules/users/actions'; +import { connect } from 'react-redux'; +import { AppState } from 'store/reducers'; +import './ProfilePending.less'; + +interface OwnProps { + ccr: UserCCR; +} + +interface StateProps { + user: AppState['auth']['user']; +} + +interface DispatchProps { + deletePendingRequest: typeof deletePendingRequest; + fetchUser: typeof fetchUser; +} + +type Props = OwnProps & StateProps & DispatchProps; + +interface State { + isDeleting: boolean; +} + +class ProfilePendingCCR extends React.Component { + state: State = { + isDeleting: false, + }; + + render() { + const { status, title, ccrId, rejectReason } = this.props.ccr; + const { isDeleting } = this.state; + + const isDisableActions = isDeleting; + + return ( +
+
+ + {title} + +
+
This request has been rejected permanently:
+ {rejectReason} +
You may not re-submit it for approval.
+
+
+
+ this.handleDelete()} + > + + +
+
+ ); + } + + private handleDelete = async () => { + const { + user, + ccr: { ccrId }, + } = this.props; + if (!user) return; + this.setState({ isDeleting: true }); + try { + await this.props.deletePendingRequest(user.userid, ccrId); + message.success('Request deleted.'); + await this.props.fetchUser(String(user.userid)); + } catch (e) { + message.error(e.message || e.toString()); + } + this.setState({ isDeleting: false }); + }; +} + +export default connect( + state => ({ + user: state.auth.user, + }), + { + deletePendingRequest, + fetchUser, + }, +)(ProfilePendingCCR); diff --git a/frontend/client/components/Profile/ProfileRejectedPermanentlyList.tsx b/frontend/client/components/Profile/ProfileRejectedPermanentlyList.tsx new file mode 100644 index 00000000..217e13fb --- /dev/null +++ b/frontend/client/components/Profile/ProfileRejectedPermanentlyList.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { UserProposal, UserCCR } from 'types'; +import ProfileRejectedPermanentlyProposal from './ProfileRejectedPermanentlyProposal'; +import ProfileRejectedPermanentlyCCR from './ProfileRejectedPermanentlyCCR'; + +interface OwnProps { + proposals: UserProposal[]; + requests: UserCCR[]; +} + +type Props = OwnProps; + +class ProfilePendingList extends React.Component { + render() { + const { proposals, requests } = this.props; + return ( + <> + {proposals.map(p => ( + + ))} + {requests.map(r => ( + + ))} + + ); + } +} + +export default ProfilePendingList; diff --git a/frontend/client/components/Profile/ProfileRejectedPermanentlyProposal.tsx b/frontend/client/components/Profile/ProfileRejectedPermanentlyProposal.tsx new file mode 100644 index 00000000..34425c53 --- /dev/null +++ b/frontend/client/components/Profile/ProfileRejectedPermanentlyProposal.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Button, Popconfirm, message } from 'antd'; +import { UserProposal } from 'types'; +import { deletePendingProposal } from 'modules/users/actions'; +import { connect } from 'react-redux'; +import { AppState } from 'store/reducers'; +import './ProfilePending.less'; + +interface OwnProps { + proposal: UserProposal; +} + +interface StateProps { + user: AppState['auth']['user']; +} + +interface DispatchProps { + deletePendingProposal: typeof deletePendingProposal; +} + +type Props = OwnProps & StateProps & DispatchProps; + +interface State { + isDeleting: boolean; +} + +class ProfilePending extends React.Component { + state: State = { + isDeleting: false, + }; + + render() { + const { status, title, proposalId, rejectReason } = this.props.proposal; + const { isDeleting } = this.state; + + const isDisableActions = isDeleting; + + return ( +
+
+ + {title} + +
+
This proposal has been rejected permanently:
+ {rejectReason} +
You may not re-submit it for approval.
+
+
+
+ this.handleDelete()} + > + + +
+
+ ); + } + + private handleDelete = async () => { + const { + user, + proposal: { proposalId }, + } = this.props; + if (!user) return; + this.setState({ isDeleting: true }); + try { + await this.props.deletePendingProposal(user.userid, proposalId); + message.success('Proposal deleted.'); + } catch (e) { + message.error(e.message || e.toString()); + } + this.setState({ isDeleting: false }); + }; +} + +export default connect( + state => ({ + user: state.auth.user, + }), + { + deletePendingProposal, + }, +)(ProfilePending); diff --git a/frontend/client/components/Profile/index.tsx b/frontend/client/components/Profile/index.tsx index 7050d7ec..e1e65848 100644 --- a/frontend/client/components/Profile/index.tsx +++ b/frontend/client/components/Profile/index.tsx @@ -15,6 +15,7 @@ import HeaderDetails from 'components/HeaderDetails'; import ProfileUser from './ProfileUser'; import ProfileEdit from './ProfileEdit'; import ProfilePendingList from './ProfilePendingList'; +import ProfileRejectedPermanentlyList from './ProfileRejectedPermanentlyList'; import ProfileProposal from './ProfileProposal'; import ProfileContribution from './ProfileContribution'; import ProfileComment from './ProfileComment'; @@ -93,6 +94,8 @@ class Profile extends React.Component { proposals, pendingProposals, pendingRequests, + rejectedPermanentlyProposals, + rejectedPermanentlyRequests, requests, contributions, comments, @@ -109,6 +112,35 @@ class Profile extends React.Component { const noneCommented = comments.length === 0; const noneArbitrated = arbitrated.length === 0; const noneInvites = user.hasFetchedInvites && invites.length === 0; + const rejectedPermanentlyCount = + rejectedPermanentlyProposals.length + rejectedPermanentlyRequests.length; + const noneRejectedPermanently = rejectedPermanentlyCount === 0; + + // do not allow a tab to be linked to if it won't be visible in the ui + const skippedTabs = [ + ...(noneFunded ? ['funded'] : []), + ...(noneRejectedPermanently ? ['rejected'] : []), + ]; + + const privateMsg = 'Note: This tab is private to your account'; + const publicMsg = 'Note: This tab is public to ZF Grants'; + + const renderTabMsg = (msg: string) => + isAuthedUser && ( +
+ {msg} +
+ ); return (
@@ -130,7 +162,10 @@ class Profile extends React.Component { />
- + {isAuthedUser && ( { )} key="pending" > + {renderTabMsg(privateMsg)}
{noProposalsPending && noRequestsPending && ( @@ -159,6 +195,7 @@ class Profile extends React.Component { tab={TabTitle('Created', proposals.length + requests.length)} key="created" > + {renderTabMsg(publicMsg)}
{noProposalsCreated && noRequestsCreated && ( @@ -176,26 +213,23 @@ class Profile extends React.Component { ))}
- -
- {noneFunded && ( - - )} - {contributions.map(c => ( - - ))} -
-
+ {!noneFunded && ( + + {renderTabMsg(publicMsg)} +
+ {contributions.map(c => ( + + ))} +
+
+ )} + {renderTabMsg(publicMsg)}
{noneCommented && ( { key="invites" disabled={!user.hasFetchedInvites} > + {renderTabMsg(privateMsg)}
{noneInvites && ( { tab={TabTitle('Arbitrations', arbitrated.length)} key="arbitrations" > + {renderTabMsg(privateMsg)} {noneArbitrated && ( { ))} )} + {isAuthedUser && + !noneRejectedPermanently && ( + + {renderTabMsg(privateMsg)} +
+ +
+
+ )}
diff --git a/frontend/client/components/Proposal/CampaignBlock/index.tsx b/frontend/client/components/Proposal/CampaignBlock/index.tsx index fd446ce0..78c0b7f5 100644 --- a/frontend/client/components/Proposal/CampaignBlock/index.tsx +++ b/frontend/client/components/Proposal/CampaignBlock/index.tsx @@ -61,6 +61,8 @@ export class ProposalCampaignBlock extends React.Component { const isFundingOver = deadline ? isRaiseGoalReached || deadline < Date.now() || isFrozen : null; + const isOpenForDiscussion = proposal.status === STATUS.DISCUSSION; + const isArchived = proposal.status === STATUS.ARCHIVED; // Get bounty from RFP. If it exceeds proposal target, show bounty as full amount let bounty; @@ -137,12 +139,21 @@ export class ProposalCampaignBlock extends React.Component { )} {isVersionTwo && - !isAcceptedWithFunding && ( + !isAcceptedWithFunding && + !isOpenForDiscussion && + !isArchived && (
Open for Community Donations
)} + {isVersionTwo && + (isOpenForDiscussion || isArchived) && ( +
+ Open for Public Review +
+ )} + {!isVersionTwo && proposal.contributionMatching > 0 && (
diff --git a/frontend/client/components/Proposal/CancelModal.tsx b/frontend/client/components/Proposal/CancelModal.tsx index e0375fb1..e67d20ec 100644 --- a/frontend/client/components/Proposal/CancelModal.tsx +++ b/frontend/client/components/Proposal/CancelModal.tsx @@ -19,7 +19,7 @@ export default class CancelModal extends React.Component { return ( Cancel proposal} + title={<>Cancel Proposal} visible={isVisible} okText="OK" cancelText="Cancel" diff --git a/frontend/client/components/Proposal/Milestones/index.tsx b/frontend/client/components/Proposal/Milestones/index.tsx index 32ef7e8e..850cb260 100644 --- a/frontend/client/components/Proposal/Milestones/index.tsx +++ b/frontend/client/components/Proposal/Milestones/index.tsx @@ -12,6 +12,7 @@ import { ProposalMilestone, MILESTONE_STAGE, PROPOSAL_ARBITER_STATUS, + STATUS, } from 'types'; import { PROPOSAL_STAGE } from 'api/constants'; import UnitDisplay from 'components/UnitDisplay'; @@ -47,6 +48,7 @@ const fmtDateFromNow = (n: undefined | number) => (n && moment(n * 1000).fromNow interface OwnProps { proposal: ProposalDetail; + isPreview?: boolean; } interface DispatchProps { @@ -153,7 +155,7 @@ class ProposalMilestones extends React.Component { } render() { - const { proposal, requestPayout, acceptPayout, rejectPayout } = this.props; + const { proposal, requestPayout, acceptPayout, rejectPayout, isPreview } = this.props; const { rejectReason, showRejectModal } = this.state; if (!proposal) { return ; @@ -165,8 +167,11 @@ class ProposalMilestones extends React.Component { isVersionTwo, acceptedWithFunding, } = proposal; + const isOpenForDiscussion = proposal.status === STATUS.DISCUSSION; const milestoneCount = milestones.length; - const milestonesDisabled = isVersionTwo ? !acceptedWithFunding : false; + const milestonesDisabled = isVersionTwo + ? !acceptedWithFunding && !isOpenForDiscussion && !isPreview + : false; // arbiter reject modal const rejectModal = ( @@ -337,7 +342,9 @@ interface MilestoneProps extends MSProps { const Milestone: React.SFC = p => { const estimatedDate = p.dateEstimated ? moment(p.dateEstimated * 1000).format('MMMM YYYY') - : 'N/A'; + : p.daysEstimated + ? `${p.daysEstimated} days` + : 'N/A'; const reward = p.isVersionTwo ? ( formatUsd(p.amount as string, true, 2) ) : ( diff --git a/frontend/client/components/Proposal/Revisions/index.less b/frontend/client/components/Proposal/Revisions/index.less new file mode 100644 index 00000000..cf917f37 --- /dev/null +++ b/frontend/client/components/Proposal/Revisions/index.less @@ -0,0 +1,70 @@ +.ProposalRevision { + padding-left: 0.2rem; + padding-right: 0.2rem; + max-width: 880px; + + &-revision { + padding: 1rem; + position: relative; + margin-bottom: 2rem; + border-radius: 8px; + transition: box-shadow 100ms ease; + + &:hover { + box-shadow: 0 0 3px rgba(#000, 0.15); + } + + &-title { + font-size: 1.8em; + margin-bottom: 0.2rem; + } + + &-date { + font-size: 0.9rem; + opacity: 0.5; + margin-top: -0.2rem; + margin-bottom: 1rem; + } + + &-body { + font-size: 1rem; + margin-bottom: 1rem; + + &-list { + display: flex; + flex-direction: row; + flex-grow: 1; + padding-bottom: 0.1rem; + + &-icon { + opacity: 0.5; + padding-right: 1rem + } + } + } + + &-controls { + display: flex; + align-items: center; + + &-button { + font-size: 0.7rem; + + &:after { + content: ''; + display: inline-block; + margin: 0 0.5rem; + vertical-align: middle; + width: 2px; + height: 2px; + border-radius: 100%; + background: #AAA; + } + + &:last-child:after { + display: none; + } + } + } + } +} diff --git a/frontend/client/components/Proposal/Revisions/index.tsx b/frontend/client/components/Proposal/Revisions/index.tsx new file mode 100644 index 00000000..21a840a7 --- /dev/null +++ b/frontend/client/components/Proposal/Revisions/index.tsx @@ -0,0 +1,185 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { connect } from 'react-redux'; +import moment from 'moment'; +import Placeholder from 'components/Placeholder'; +import { AppState } from 'store/reducers'; +import { Proposal, Revision, RevisionChange, REVISION_CHANGE_TYPES } from 'types'; +import { fetchProposalRevisions } from 'modules/proposals/actions'; +import { + getProposalRevisions, + getIsFetchingRevisions, + getRevisionsError, +} from 'modules/proposals/selectors'; +import { Icon } from 'antd'; +import './index.less'; + +interface OwnProps { + proposalId: Proposal['proposalId']; +} + +interface StateProps { + revisions: ReturnType; + isFetchingRevisions: ReturnType; + revisionsError: ReturnType; +} + +interface DispatchProps { + fetchProposalRevisions: typeof fetchProposalRevisions; +} + +type Props = DispatchProps & OwnProps & StateProps; + +export class ProposalRevision extends React.Component { + componentDidMount() { + if (this.props.proposalId) { + this.props.fetchProposalRevisions(this.props.proposalId); + } + } + + componentWillReceiveProps(nextProps: Props) { + if (nextProps.proposalId && nextProps.proposalId !== this.props.proposalId) { + this.props.fetchProposalRevisions(nextProps.proposalId); + } + } + + render() { + const { revisions, isFetchingRevisions, revisionsError } = this.props; + let content = null; + + if (isFetchingRevisions) { + content = ; + } else if (revisionsError) { + content = ; + } else if (revisions) { + if (revisions.length >= 2) { + revisions.reverse(); + content = revisions.map((revision, index) => ( +
+ {index === revisions.length - 1 ? ( + <> +

Original Proposal

+
+ + View archived + +
+ + ) : ( + <> +

+ {moment(revision.dateCreated * 1000).format('MMMM Do, YYYY')} +

+
+ {`Revision ${revision.revisionIndex}`} +
+
+ {this.renderRevisionBody(revision)} +
+
+ {index !== 0 && ( + + View archived + + )} +
+ + )} +
+ )); + } else { + content = ( + + ); + } + } + + return
{content}
; + } + + renderRevisionBody = (revision: Revision) => { + return ( +
+ {revision.changes.map((change, index) => ( +
+
+ {this.renderChangeIcon(change)} +
+
{this.renderChangeMsg(change)}
+
+ ))} +
+ ); + }; + + renderChangeIcon = (change: RevisionChange) => { + if (change.type === 'MILESTONE_ADD') { + return ; + } + + if (change.type === 'MILESTONE_REMOVE') { + return ; + } + + return ; + }; + + renderChangeMsg = (change: RevisionChange) => { + const msMsg = + change.milestoneIndex !== undefined + ? `Milestone ${change.milestoneIndex + 1}` + : 'Milestone'; + + switch (change.type) { + case REVISION_CHANGE_TYPES.PROPOSAL_EDIT_BRIEF: + return 'Proposal brief edited'; + case REVISION_CHANGE_TYPES.PROPOSAL_EDIT_CONTENT: + return 'Proposal content edited'; + case REVISION_CHANGE_TYPES.PROPOSAL_EDIT_TARGET: + return 'Proposal target edited'; + case REVISION_CHANGE_TYPES.PROPOSAL_EDIT_TITLE: + return 'Proposal title edited'; + case REVISION_CHANGE_TYPES.MILESTONE_ADD: + return `${msMsg} added`; + case REVISION_CHANGE_TYPES.MILESTONE_REMOVE: + return `${msMsg} removed`; + case REVISION_CHANGE_TYPES.MILESTONE_EDIT_AMOUNT: + return `${msMsg} amount edited`; + case REVISION_CHANGE_TYPES.MILESTONE_EDIT_DAYS: + return `${msMsg} estimated days edited`; + case REVISION_CHANGE_TYPES.MILESTONE_EDIT_IMMEDIATE_PAYOUT: + return `${msMsg} immediate payout edited`; + case REVISION_CHANGE_TYPES.MILESTONE_EDIT_PERCENT: + return `${msMsg} payout percent edited`; + case REVISION_CHANGE_TYPES.MILESTONE_EDIT_CONTENT: + return `${msMsg} content edited`; + case REVISION_CHANGE_TYPES.MILESTONE_EDIT_TITLE: + return `${msMsg} title edited`; + default: + return ''; + } + }; +} + +export default connect( + (state: AppState, ownProps: OwnProps) => ({ + revisions: getProposalRevisions(state, ownProps.proposalId), + isFetchingRevisions: getIsFetchingRevisions(state), + revisionsError: getRevisionsError(state), + }), + { + fetchProposalRevisions, + }, +)(ProposalRevision); diff --git a/frontend/client/components/Proposal/index.tsx b/frontend/client/components/Proposal/index.tsx index bd34e65c..3f7f72b5 100644 --- a/frontend/client/components/Proposal/index.tsx +++ b/frontend/client/components/Proposal/index.tsx @@ -9,7 +9,7 @@ import { proposalActions } from 'modules/proposals'; import { bindActionCreators, Dispatch } from 'redux'; import { AppState } from 'store/reducers'; import { STATUS } from 'types'; -import { Tabs, Icon, Dropdown, Menu, Button, Alert } from 'antd'; +import { Tabs, Icon, Dropdown, Menu, Button, Alert, message } from 'antd'; import { AlertProps } from 'antd/lib/alert'; import ExceptionPage from 'components/ExceptionPage'; import HeaderDetails from 'components/HeaderDetails'; @@ -20,15 +20,21 @@ import RFPBlock from './RFPBlock'; import Milestones from './Milestones'; import CommentsTab from './Comments'; import UpdatesTab from './Updates'; +import RevisionsTab from './Revisions'; import ContributorsTab from './Contributors'; import UpdateModal from './UpdateModal'; import CancelModal from './CancelModal'; import classnames from 'classnames'; -import { withRouter } from 'react-router'; +import { withRouter, RouteComponentProps } from 'react-router'; import SocialShare from 'components/SocialShare'; import Follow from 'components/Follow'; import Like from 'components/Like'; import { TipJarProposalSettingsModal } from 'components/TipJar'; +import { TUpdateProposal } from 'modules/proposals/actions'; +import { + putMarkProposalRequestedChangesAsResolved, + postProposalMakeLiveDraft, +} from 'api/api'; import './index.less'; interface OwnProps { @@ -45,9 +51,10 @@ interface StateProps { interface DispatchProps { fetchProposal: proposalActions.TFetchProposal; + updateProposal: TUpdateProposal; } -type Props = StateProps & DispatchProps & OwnProps; +type Props = StateProps & DispatchProps & OwnProps & RouteComponentProps; interface State { isBodyExpanded: boolean; @@ -113,25 +120,66 @@ export class ProposalDetail extends React.Component { const isTrustee = !!proposal.team.find(tm => tm.userid === (user && user.userid)); const isLive = proposal.status === STATUS.LIVE; + const isOpenForDiscussion = proposal.status === STATUS.DISCUSSION; const milestonesDisabled = proposal.isVersionTwo ? !proposal.acceptedWithFunding : false; - const defaultTab = !milestonesDisabled || !isLive ? 'milestones' : 'discussions'; + const defaultTab = + (!milestonesDisabled || !isLive) && !isOpenForDiscussion + ? 'milestones' + : 'discussions'; const adminMenu = ( + + Edit Proposal + Manage Tipping Post an Update - - Cancel proposal + + Cancel Proposal ); + const createDiscussionBannerConfig = () => { + if (proposal.isTeamMember && proposal.changesRequestedDiscussionReason) { + return { + [STATUS.DISCUSSION]: { + blurb: ( +
+

+ Your proposal is still open for public review, but it has changes + requested by an administrator: +

+

+ "{proposal.changesRequestedDiscussionReason}" +

+

+ Edit your proposal through the Actions dropdown below. + When you're ready,{' '} + click here to mark + these changes as resolved. +

+
+ ), + type: 'error', + }, + }; + } + return {}; + }; + // BANNER const statusBanner = { [STATUS.PENDING]: { @@ -143,6 +191,7 @@ export class ProposalDetail extends React.Component { ), type: 'warning', }, + [STATUS.APPROVED]: { blurb: ( <> @@ -163,6 +212,17 @@ export class ProposalDetail extends React.Component { ), type: 'error', }, + [STATUS.REJECTED_PERMANENTLY]: { + blurb: ( + <> + Your proposal has has been rejected permanently and is only visible to the + team. Visit your{' '} + profile's rejected tab for more + information. + + ), + type: 'error', + }, [STATUS.STAKING]: { blurb: ( <> @@ -173,13 +233,21 @@ export class ProposalDetail extends React.Component { ), type: 'warning', }, + ...createDiscussionBannerConfig(), } as { [key in STATUS]: { blurb: ReactNode; type: AlertProps['type'] } }; let banner = statusBanner[proposal.status]; if (isPreview) { - banner = { - blurb: 'This is a preview of your proposal. It has not yet been published.', - type: 'info', - }; + if (proposal.status === STATUS.ARCHIVED) { + banner = { + blurb: 'This is an archived proposal revision.', + type: 'info', + }; + } else { + banner = { + blurb: 'This is a preview of your proposal. It has not yet been published.', + type: 'info', + }; + } } return ( @@ -191,21 +259,21 @@ export class ProposalDetail extends React.Component {
)}
- {isLive && ( + {(isLive || isOpenForDiscussion) && (
)}

{proposal ? proposal.title :  }

- {isLive && ( + {(isLive || isOpenForDiscussion) && (
{isTrustee && ( {
- +
- + + + + {!proposal.isVersionTwo && ( @@ -331,6 +410,39 @@ export class ProposalDetail extends React.Component { private openCancelModal = () => this.setState({ isCancelOpen: true }); private closeCancelModal = () => this.setState({ isCancelOpen: false }); + + private handleResolveChangesRequested = async () => { + const { detail } = this.props; + if (!detail) { + return; + } + const { data } = await putMarkProposalRequestedChangesAsResolved(detail.proposalId); + this.props.updateProposal(data); + message.success('Changes marked as resolved'); + }; + + private handleEditProposal = async () => { + const { detail: proposal } = this.props; + if (!proposal) { + return; + } + + let liveDraftId = proposal.liveDraftId; + + if (!liveDraftId) { + try { + const { data: liveDraft } = await postProposalMakeLiveDraft(proposal.proposalId); + this.props.updateProposal(liveDraft); + liveDraftId = String(liveDraft.proposalId); + } catch { + message.error('Edit request failed'); + } + } + + if (liveDraftId) { + this.props.history.push({ pathname: `/proposals/${liveDraftId}/edit` }); + } + }; } function mapStateToProps(state: AppState, _: OwnProps) { diff --git a/frontend/client/components/Proposals/Filters/index.tsx b/frontend/client/components/Proposals/Filters/index.tsx index 2e127fee..a3324c20 100644 --- a/frontend/client/components/Proposals/Filters/index.tsx +++ b/frontend/client/components/Proposals/Filters/index.tsx @@ -1,49 +1,78 @@ import React from 'react'; import { Select, Radio, Card } from 'antd'; +import qs from 'query-string'; +import { withRouter, RouteComponentProps } from 'react-router'; import { RadioChangeEvent } from 'antd/lib/radio'; import { SelectValue } from 'antd/lib/select'; -import { PROPOSAL_SORT, SORT_LABELS, PROPOSAL_STAGE, STAGE_UI } from 'api/constants'; +import { + PROPOSAL_SORT, + SORT_LABELS, + PROPOSAL_STAGE, + STAGE_UI, + CUSTOM_FILTERS, +} from 'api/constants'; import { typedKeys } from 'utils/ts'; import { ProposalPage } from 'types'; -interface Props { +interface OwnProps { sort: ProposalPage['sort']; filters: ProposalPage['filters']; handleChangeSort(sort: ProposalPage['sort']): void; handleChangeFilters(filters: ProposalPage['filters']): void; } -export default class ProposalFilters extends React.Component { +type Props = OwnProps & RouteComponentProps; + +const filterToActual: { [key: string]: string } = { + with_funding: 'ACCEPTED_WITH_FUNDING', + without_funding: 'ACCEPTED_WITHOUT_FUNDING', + public_review: 'STATUS_DISCUSSION', + in_progress: 'WIP', + completed: 'COMPLETED', +}; + +const actualToFilter: { [key: string]: string } = { + ACCEPTED_WITH_FUNDING: 'with_funding', + ACCEPTED_WITHOUT_FUNDING: 'without_funding', + STATUS_DISCUSSION: 'public_review', + WIP: 'in_progress', + COMPLETED: 'completed', +}; + +class ProposalFilters extends React.Component { + componentDidMount() { + const urlFilter = this.getFilterFromUrl(this.props.location); + if (!urlFilter) return; + + const translatedFilter = filterToActual[urlFilter.toLowerCase()]; + if (!translatedFilter) return; + + const activeFilter = this.getActiveFilter(); + + if (translatedFilter !== activeFilter) { + this.handleStageChange({ target: { value: translatedFilter } } as RadioChangeEvent); + } + } + render() { const { sort, filters } = this.props; + const combinedFilters = [...filters.stage, ...filters.custom]; + return (
- - - - -
- Reset}> -

Proposal stage

All
- {typedKeys(PROPOSAL_STAGE) + {typedKeys(STAGE_UI) .filter( s => ![ @@ -58,7 +87,7 @@ export default class ProposalFilters extends React.Component { {STAGE_UI[s].label} @@ -66,18 +95,61 @@ export default class ProposalFilters extends React.Component {
))} +
+ + +
); } + private getFilterFromUrl( + location: RouteComponentProps['location'], + ): string | undefined { + const args = qs.parse(location.search); + return args.filter; + } + + private getActiveFilter(): string { + const { filters } = this.props; + const combinedFilters = [...filters.stage, ...filters.custom]; + + return combinedFilters.length ? combinedFilters[0].toUpperCase() : 'ALL'; + } + private handleStageChange = (ev: RadioChangeEvent) => { - let stage = [] as PROPOSAL_STAGE[]; - if (ev.target.value !== 'ALL') { - stage = [ev.target.value as PROPOSAL_STAGE]; + let stage: PROPOSAL_STAGE[] = []; + let custom: CUSTOM_FILTERS[] = []; + const { value } = ev.target; + if (value !== 'ALL') { + if (Object.values(PROPOSAL_STAGE).includes(value)) { + stage = [value]; + } + + if (Object.values(CUSTOM_FILTERS).includes(value)) { + custom = [value]; + } + + const targetFilter = actualToFilter[value]; + if (targetFilter) { + this.props.history.push(`/proposals/?filter=${targetFilter}`); + } + } else { + // if a filter is set, remove it + if (this.props.location.pathname === '/proposals/') { + this.props.history.push('/proposals'); + } } this.props.handleChangeFilters({ ...this.props.filters, stage, + custom, }); }; @@ -92,6 +164,9 @@ export default class ProposalFilters extends React.Component { this.props.handleChangeFilters({ category: [], stage: [], + custom: [], }); }; } + +export default withRouter(ProposalFilters); diff --git a/frontend/client/components/Proposals/ProposalCard/index.tsx b/frontend/client/components/Proposals/ProposalCard/index.tsx index edd9d879..c965b021 100644 --- a/frontend/client/components/Proposals/ProposalCard/index.tsx +++ b/frontend/client/components/Proposals/ProposalCard/index.tsx @@ -1,8 +1,8 @@ -import React from 'react'; +import React, { CSSProperties } from 'react'; import { Redirect } from 'react-router-dom'; import classnames from 'classnames'; -import { Progress } from 'antd'; -import { Proposal } from 'types'; +import { Progress, Tag } from 'antd'; +import { Proposal, STATUS } from 'types'; import Card from 'components/Card'; import UserAvatar from 'components/UserAvatar'; import UnitDisplay from 'components/UnitDisplay'; @@ -27,10 +27,58 @@ export class ProposalCard extends React.Component { isVersionTwo, funded, percentFunded, + acceptedWithFunding, + status, } = this.props; + // pulled from `variables.less` + const infoColor = '#1890ff'; + const secondaryColor = '#2D2A26'; + + let tagColor = ''; + let tagMessage = ''; + + if (isVersionTwo && status === STATUS.DISCUSSION) { + tagColor = infoColor; + tagMessage = 'Open for Public Review'; + } + + if (isVersionTwo && status === STATUS.LIVE) { + if (acceptedWithFunding) { + tagColor = secondaryColor; + tagMessage = 'Funded by ZF'; + } else { + tagColor = infoColor; + tagMessage = 'Not Funded'; + } + } + + const tagStyle: CSSProperties = { + marginRight: 0, + lineHeight: '1.25rem', + height: '1.35rem', + fontSize: '0.75rem', + ...(!tagMessage ? { opacity: 0 } : {}), + }; + + const cardTitle = ( +
+
{title}
+ +
+ {[...team].reverse().map((u, idx) => ( + + ))} +
+
+ ); + return ( - + {contributionMatching > 0 && (
@@ -76,15 +124,11 @@ export class ProposalCard extends React.Component { {team[0].displayName}{' '} {team.length > 1 && +{team.length - 1} other}
-
- {[...team].reverse().map((u, idx) => ( - - ))} -
+ {isVersionTwo && ( + + {tagMessage} + + )}
{proposalAddress}
diff --git a/frontend/client/components/Proposals/ProposalCard/style.less b/frontend/client/components/Proposals/ProposalCard/style.less index 56b12fbd..9b23b003 100644 --- a/frontend/client/components/Proposals/ProposalCard/style.less +++ b/frontend/client/components/Proposals/ProposalCard/style.less @@ -1,6 +1,11 @@ @import '~styles/variables.less'; .ProposalCard { + &-title { + display: flex; + justify-content: space-between; + } + &-ribbon { position: absolute; top: 0; @@ -93,6 +98,8 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + margin-bottom: 1.157rem; + margin-top: 1.157rem; small { opacity: 0.6; diff --git a/frontend/client/components/Settings/Account/TipJarViewKey.tsx b/frontend/client/components/Settings/Account/TipJarViewKey.tsx index 1b44cf9c..337d557c 100644 --- a/frontend/client/components/Settings/Account/TipJarViewKey.tsx +++ b/frontend/client/components/Settings/Account/TipJarViewKey.tsx @@ -48,9 +48,14 @@ export default class TipJarViewKey extends React.Component { render() { const { isSaving, tipJarViewKey, tipJarViewKeySet } = this.state; const { isFetching, errorFetching, userSettings } = this.props; + + // @ts-ignore const viewKeyChanged = tipJarViewKey !== tipJarViewKeySet; const viewKeyDisabled = !(userSettings && userSettings.tipJarAddress); + const viewKeyButtonDisabled = true + // tipJarViewKey === null || isSaving || !!status || errorFetching || !viewKeyChanged; + // TODO: add view key validation // let status: 'validating' | 'error' | undefined; @@ -64,9 +69,9 @@ export default class TipJarViewKey extends React.Component { return ( - + { type="primary" htmlType="submit" size="large" - disabled={ - tipJarViewKey === null || - isSaving || - !!status || - errorFetching || - !viewKeyChanged - } + disabled={viewKeyButtonDisabled} loading={isSaving} block > diff --git a/frontend/client/components/TipJar/TipJarProposalSettingsModal.tsx b/frontend/client/components/TipJar/TipJarProposalSettingsModal.tsx index eb3e331f..23bec0dc 100644 --- a/frontend/client/components/TipJar/TipJarProposalSettingsModal.tsx +++ b/frontend/client/components/TipJar/TipJarProposalSettingsModal.tsx @@ -68,9 +68,9 @@ class TipJarProposalSettingsModalBase extends React.Component { render() { const { address, - viewKey, + // viewKey, setAddress, - setViewKey, + // setViewKey, isSavingAddress, isSavingViewKey, } = this.state; @@ -87,14 +87,14 @@ class TipJarProposalSettingsModalBase extends React.Component { } const addressHasChanged = address !== setAddress; - const viewKeyHasChanged = viewKey !== setViewKey; + // const viewKeyHasChanged = viewKey !== setViewKey; const addressInputDisabled = isSavingAddress; - const viewKeyInputDisabled = isSavingViewKey || !setAddress; + const viewKeyInputDisabled = true // isSavingViewKey || !setAddress; const addressButtonDisabled = !addressHasChanged || isSavingAddress || !addressIsValid; - const viewKeyButtonDisabled = !viewKeyHasChanged || isSavingViewKey || !setAddress; + const viewKeyButtonDisabled = true // !viewKeyHasChanged || isSavingViewKey || !setAddress; const content = ( <> @@ -126,9 +126,9 @@ class TipJarProposalSettingsModalBase extends React.Component { - + , ): SagaIterator { try { + yield put(fetchCCRDrafts()); + yield take([types.FETCH_CCR_DRAFTS_FULFILLED]); + const ccrId = action.payload; let draft: Yielded = yield select(getDraftById, ccrId); if (!draft) { diff --git a/frontend/client/modules/create/actions.ts b/frontend/client/modules/create/actions.ts index a34e4d77..2d7f649c 100644 --- a/frontend/client/modules/create/actions.ts +++ b/frontend/client/modules/create/actions.ts @@ -4,6 +4,7 @@ import types, { CreateDraftOptions } from './types'; import { putProposal, putProposalSubmitForApproval, + putProposalSubmitLiveDraft, deleteProposalRFPLink, } from 'api/api'; @@ -73,6 +74,26 @@ export function submitProposal(form: ProposalDraft) { }; } +export function submitLiveDraft(form: ProposalDraft) { + return async (dispatch: Dispatch) => { + dispatch({ type: types.SUBMIT_LIVE_DRAFT_PENDING }); + try { + await putProposal(form); + const res = await putProposalSubmitLiveDraft(form); + dispatch({ + type: types.SUBMIT_LIVE_DRAFT_FULFILLED, + payload: res.data, + }); + } catch (err) { + dispatch({ + type: types.SUBMIT_LIVE_DRAFT_REJECTED, + payload: err.message || err.toString(), + error: true, + }); + } + }; +} + export function unlinkProposalRFP(proposalId: number) { return async (dispatch: Dispatch) => { dispatch({ type: types.UNLINK_PROPOSAL_RFP_PENDING }); diff --git a/frontend/client/modules/create/reducers.ts b/frontend/client/modules/create/reducers.ts index a670c1c2..a3ec626a 100644 --- a/frontend/client/modules/create/reducers.ts +++ b/frontend/client/modules/create/reducers.ts @@ -25,6 +25,10 @@ export interface CreateState { isSubmitting: boolean; submitError: string | null; + submittedLiveDraft: Proposal | null; + isSubmittingLiveDraft: boolean; + submitErrorLiveDraft: string | null; + publishedProposal: Proposal | null; isPublishing: boolean; publishError: string | null; @@ -57,6 +61,10 @@ export const INITIAL_STATE: CreateState = { isSubmitting: false, submitError: null, + submittedLiveDraft: null, + isSubmittingLiveDraft: false, + submitErrorLiveDraft: null, + publishedProposal: null, isPublishing: false, publishError: null, @@ -197,6 +205,26 @@ export default function createReducer( isSubmitting: false, }; + case types.SUBMIT_LIVE_DRAFT_PENDING: + return { + ...state, + submittedLiveDraft: null, + isSubmittingLiveDraft: true, + submitErrorLiveDraft: null, + }; + case types.SUBMIT_LIVE_DRAFT_FULFILLED: + return { + ...state, + submittedLiveDraft: action.payload, + isSubmittingLiveDraft: false, + }; + case types.SUBMIT_LIVE_DRAFT_REJECTED: + return { + ...state, + submitErrorLiveDraft: action.payload, + isSubmittingLiveDraft: false, + }; + case types.UNLINK_PROPOSAL_RFP_PENDING: return { ...state, diff --git a/frontend/client/modules/create/sagas.ts b/frontend/client/modules/create/sagas.ts index 8eceb621..1dc9fa57 100644 --- a/frontend/client/modules/create/sagas.ts +++ b/frontend/client/modules/create/sagas.ts @@ -5,7 +5,7 @@ import { postProposalDraft, getProposalDrafts, putProposal, - deleteProposalDraft, + deleteProposal, getProposal, } from 'api/api'; import { getDrafts, getDraftById, getFormState } from './selectors'; @@ -104,7 +104,7 @@ export function* handleFetchAndCreateDrafts( export function* handleDeleteDraft(action: ReturnType): SagaIterator { try { - yield call(deleteProposalDraft, action.payload); + yield call(deleteProposal, action.payload); put({ type: types.DELETE_DRAFT_FULFILLED }); } catch (err) { yield put({ @@ -121,6 +121,9 @@ export function* handleInitializeForm( action: ReturnType, ): SagaIterator { try { + yield put(fetchDrafts()); + yield take([types.FETCH_DRAFTS_FULFILLED]); + const proposalId = action.payload; let draft: Yielded = yield select(getDraftById, proposalId); if (!draft) { diff --git a/frontend/client/modules/create/types.ts b/frontend/client/modules/create/types.ts index 72b63563..cf7f5ea2 100644 --- a/frontend/client/modules/create/types.ts +++ b/frontend/client/modules/create/types.ts @@ -33,6 +33,11 @@ enum CreateTypes { SUBMIT_PROPOSAL_FULFILLED = 'SUBMIT_PROPOSAL_FULFILLED', SUBMIT_PROPOSAL_REJECTED = 'SUBMIT_PROPOSAL_REJECTED', + SUBMIT_LIVE_DRAFT = 'SUBMIT_LIVE_DRAFT', + SUBMIT_LIVE_DRAFT_PENDING = 'SUBMIT_LIVE_DRAFT_PENDING', + SUBMIT_LIVE_DRAFT_FULFILLED = 'SUBMIT_LIVE_DRAFT_FULFILLED', + SUBMIT_LIVE_DRAFT_REJECTED = 'SUBMIT_LIVE_DRAFT_REJECTED', + UNLINK_PROPOSAL_RFP = 'UNLINK_PROPOSAL_RFP', UNLINK_PROPOSAL_RFP_PENDING = 'UNLINK_PROPOSAL_RFP_PENDING', UNLINK_PROPOSAL_RFP_FULFILLED = 'UNLINK_PROPOSAL_RFP_FULFILLED', diff --git a/frontend/client/modules/create/utils.ts b/frontend/client/modules/create/utils.ts index 5995982b..60c5bc8d 100644 --- a/frontend/client/modules/create/utils.ts +++ b/frontend/client/modules/create/utils.ts @@ -5,6 +5,7 @@ import { PROPOSAL_ARBITER_STATUS, CCRDraft, RFP, + Proposal, } from 'types'; import { User, CCR } from 'types'; import { @@ -248,6 +249,9 @@ export function makeProposalPreviewFromDraft(draft: ProposalDraft): ProposalDeta arbiter: { status: PROPOSAL_ARBITER_STATUS.ACCEPTED, }, + changesRequestedDiscussion: null, + changesRequestedDiscussionReason: null, + liveDraftId: null, tipJarAddress: null, tipJarViewKey: null, acceptedWithFunding: false, @@ -295,3 +299,10 @@ export function makeRfpPreviewFromCcrDraft(draft: CCRDraft): RFP { title, }; } + +export function makeProposalPreviewFromArchived(proposal: Proposal): ProposalDetail { + return { + ...proposal, + ...PROPOSAL_DETAIL_INITIAL_STATE, + }; +} diff --git a/frontend/client/modules/proposals/actions.ts b/frontend/client/modules/proposals/actions.ts index d73682d0..5e4ec013 100644 --- a/frontend/client/modules/proposals/actions.ts +++ b/frontend/client/modules/proposals/actions.ts @@ -4,6 +4,7 @@ import { getProposal, getProposalComments, getProposalUpdates, + getProposalRevisions, reportProposalComment as apiReportProposalComment, getProposalContributions, postProposalComment as apiPostProposalComment, @@ -171,6 +172,18 @@ export function fetchProposalUpdates(proposalId: Proposal['proposalId']) { }; } +export function fetchProposalRevisions(proposalId: Proposal['proposalId']) { + return (dispatch: Dispatch) => { + dispatch({ + type: types.PROPOSAL_REVISIONS, + payload: getProposalRevisions(proposalId).then(res => ({ + proposalId, + revisions: res.data, + })), + }); + }; +} + export function fetchProposalContributions(proposalId: Proposal['proposalId']) { return (dispatch: Dispatch) => { dispatch({ diff --git a/frontend/client/modules/proposals/reducers.ts b/frontend/client/modules/proposals/reducers.ts index d3316241..573031dc 100644 --- a/frontend/client/modules/proposals/reducers.ts +++ b/frontend/client/modules/proposals/reducers.ts @@ -4,6 +4,7 @@ import { pendingMoreablePage, fulfilledMoreablePage } from 'utils/helpers'; import { Proposal, ProposalUpdates, + ProposalRevisions, Comment, ProposalContributions, LoadableProposalPage, @@ -33,6 +34,10 @@ export interface ProposalState { updatesError: null | string; isFetchingUpdates: boolean; + proposalRevisions: { [id: string]: ProposalRevisions }; + revisionsError: null | string; + isFetchingRevisions: boolean; + proposalContributions: { [id: string]: ProposalContributions }; fetchContributionsError: null | string; isFetchingContributions: boolean; @@ -63,6 +68,7 @@ export const INITIAL_STATE: ProposalState = { filters: { category: [], stage: [], + custom: [], }, items: [], hasFetched: false, @@ -95,6 +101,10 @@ export const INITIAL_STATE: ProposalState = { updatesError: null, isFetchingUpdates: false, + proposalRevisions: {}, + revisionsError: null, + isFetchingRevisions: false, + proposalContributions: {}, fetchContributionsError: null, isFetchingContributions: false, @@ -117,6 +127,17 @@ function addUpdates(state: ProposalState, payload: ProposalUpdates) { }; } +function addRevisions(state: ProposalState, payload: ProposalRevisions) { + return { + ...state, + proposalRevisions: { + ...state.proposalRevisions, + [payload.proposalId]: payload, + }, + isFetchingRevisions: false, + }; +} + function addContributions(state: ProposalState, payload: ProposalContributions) { return { ...state, @@ -393,6 +414,21 @@ export default (state = INITIAL_STATE, action: any) => { isFetchingUpdates: false, }; + case types.PROPOSAL_REVISIONS_PENDING: + return { + ...state, + revisionsError: null, + isFetchingRevisions: true, + }; + case types.PROPOSAL_REVISIONS_FULFILLED: + return addRevisions(state, payload); + case types.PROPOSAL_REVISIONS_REJECTED: + return { + ...state, + revisionsError: (payload && payload.message) || payload.toString(), + isFetchingRevisions: false, + }; + case types.PROPOSAL_CONTRIBUTIONS_PENDING: return { ...state, diff --git a/frontend/client/modules/proposals/selectors.tsx b/frontend/client/modules/proposals/selectors.tsx index d4513375..d7f78045 100644 --- a/frontend/client/modules/proposals/selectors.tsx +++ b/frontend/client/modules/proposals/selectors.tsx @@ -2,6 +2,7 @@ import { AppState } from 'store/reducers'; import { Proposal, ProposalUpdates, + ProposalRevisions, ProposalContributions, ProposalPageParams, PageParams, @@ -31,6 +32,30 @@ export function getUpdatesError(state: AppState) { return state.proposal.updatesError; } +export function getProposalRevisions( + state: AppState, + proposalId: Proposal['proposalId'], +): ProposalRevisions['revisions'] | null { + const pr = state.proposal.proposalRevisions[proposalId]; + return pr ? pr.revisions : null; +} + +export function getProposalRevisionCount( + state: AppState, + proposalId: Proposal['proposalId'], +): number | null { + const pr = state.proposal.proposalRevisions[proposalId]; + return pr ? pr.revisions.length : null; +} + +export function getIsFetchingRevisions(state: AppState) { + return state.proposal.isFetchingRevisions; +} + +export function getRevisionsError(state: AppState) { + return state.proposal.revisionsError; +} + export function getProposalContributions( state: AppState, proposalId: Proposal['proposalId'], diff --git a/frontend/client/modules/proposals/types.ts b/frontend/client/modules/proposals/types.ts index b2cc1f90..2d14753b 100644 --- a/frontend/client/modules/proposals/types.ts +++ b/frontend/client/modules/proposals/types.ts @@ -19,6 +19,11 @@ enum proposalTypes { PROPOSAL_UPDATES_REJECTED = 'PROPOSAL_UPDATES_REJECTED', PROPOSAL_UPDATES_PENDING = 'PROPOSAL_UPDATES_PENDING', + PROPOSAL_REVISIONS = 'PROPOSAL_REVISIONS', + PROPOSAL_REVISIONS_FULFILLED = 'PROPOSAL_REVISIONS_FULFILLED', + PROPOSAL_REVISIONS_REJECTED = 'PROPOSAL_REVISIONS_REJECTED', + PROPOSAL_REVISIONS_PENDING = 'PROPOSAL_REVISIONS_PENDING', + PROPOSAL_CONTRIBUTIONS = 'PROPOSAL_CONTRIBUTIONS', PROPOSAL_CONTRIBUTIONS_FULFILLED = 'PROPOSAL_CONTRIBUTIONS_FULFILLED', PROPOSAL_CONTRIBUTIONS_REJECTED = 'PROPOSAL_CONTRIBUTIONS_REJECTED', diff --git a/frontend/client/modules/users/actions.ts b/frontend/client/modules/users/actions.ts index 1c762ca4..2f3328ff 100644 --- a/frontend/client/modules/users/actions.ts +++ b/frontend/client/modules/users/actions.ts @@ -6,7 +6,7 @@ import { fetchUserInvites as apiFetchUserInvites, putInviteResponse, deleteProposalContribution, - deleteProposalDraft, + deleteProposal, putProposalPublish, deleteCCR, } from 'api/api'; @@ -113,7 +113,7 @@ export function deletePendingProposal(userId: number, proposalId: number) { return async (dispatch: Dispatch) => { await dispatch({ type: types.USER_DELETE_PROPOSAL, - payload: deleteProposalDraft(proposalId).then(_ => ({ userId, proposalId })), + payload: deleteProposal(proposalId).then(_ => ({ userId, proposalId })), }); }; } diff --git a/frontend/client/modules/users/reducers.ts b/frontend/client/modules/users/reducers.ts index 8fe5b0eb..a100e029 100644 --- a/frontend/client/modules/users/reducers.ts +++ b/frontend/client/modules/users/reducers.ts @@ -23,6 +23,8 @@ export interface UserState extends User { updateError: string | null; pendingProposals: UserProposal[]; pendingRequests: UserCCR[]; + rejectedPermanentlyProposals: UserProposal[]; + rejectedPermanentlyRequests: UserCCR[]; arbitrated: UserProposalArbiter[]; proposals: UserProposal[]; requests: UserCCR[]; @@ -57,6 +59,8 @@ export const INITIAL_USER_STATE: UserState = { updateError: null, pendingProposals: [], pendingRequests: [], + rejectedPermanentlyProposals: [], + rejectedPermanentlyRequests: [], arbitrated: [], proposals: [], requests: [], @@ -155,7 +159,7 @@ export default (state = INITIAL_STATE, action: any) => { }); // proposal delete case types.USER_DELETE_PROPOSAL_FULFILLED: - return removePendingProposal(state, payload.userId, payload.proposalId); + return removeProposal(state, payload.userId, payload.proposalId); // proposal publish case types.USER_PUBLISH_PROPOSAL_FULFILLED: return updatePublishedProposal(state, payload.userId, payload.proposal); @@ -180,7 +184,7 @@ function updateUserState( }; } -function removePendingProposal( +function removeProposal( state: UsersState, userId: string | number, proposalId: number, @@ -188,8 +192,12 @@ function removePendingProposal( const pendingProposals = state.map[userId].pendingProposals.filter( p => p.proposalId !== proposalId, ); + const rejectedPermanentlyProposals = state.map[ + userId + ].rejectedPermanentlyProposals.filter(p => p.proposalId !== proposalId); const userUpdates = { pendingProposals, + rejectedPermanentlyProposals, }; return updateUserState(state, userId, userUpdates); } @@ -199,11 +207,11 @@ function updatePublishedProposal( userId: string | number, proposal: UserProposal, ) { - const withoutPending = removePendingProposal(state, userId, proposal.proposalId); + const withoutProposal = removeProposal(state, userId, proposal.proposalId); const userUpdates = { proposals: [proposal, ...state.map[userId].proposals], }; - return updateUserState(withoutPending, userId, userUpdates); + return updateUserState(withoutProposal, userId, userUpdates); } function updateTeamInvite( diff --git a/frontend/client/pages/archived.tsx b/frontend/client/pages/archived.tsx new file mode 100644 index 00000000..44853e3b --- /dev/null +++ b/frontend/client/pages/archived.tsx @@ -0,0 +1,16 @@ +import React, { Component } from 'react'; +import Archived from 'components/Archived'; +import { extractIdFromSlug } from 'utils/api'; + +import { withRouter, RouteComponentProps } from 'react-router'; + +type RouteProps = RouteComponentProps; + +class ProposalPage extends Component { + render() { + const proposalId = extractIdFromSlug(this.props.match.params.id); + return ; + } +} + +export default withRouter(ProposalPage); diff --git a/frontend/client/utils/api.ts b/frontend/client/utils/api.ts index 5508986b..9f18f8df 100644 --- a/frontend/client/utils/api.ts +++ b/frontend/client/utils/api.ts @@ -11,6 +11,7 @@ import { import { UserState } from 'modules/users/reducers'; import { AppState } from 'store/reducers'; import { toZat, toUsd } from './units'; +import { CUSTOM_FILTERS } from 'api/constants'; export function formatUserForPost(user: User) { return { @@ -34,6 +35,9 @@ export function formatUserFromGet(user: UserState) { if (user.pendingProposals) { user.pendingProposals = user.pendingProposals.map(bnUserProp); } + if (user.rejectedPermanentlyProposals) { + user.rejectedPermanentlyProposals = user.rejectedPermanentlyProposals.map(bnUserProp); + } if (user.arbitrated) { user.arbitrated = user.arbitrated.map(a => { a.proposal = bnUserProp(a.proposal); @@ -60,6 +64,7 @@ export function formatProposalPageParamsForGet(params: ProposalPageParams): Page filters: [ ...params.filters.category.map(c => 'CAT_' + c), ...params.filters.stage.map(s => 'STAGE_' + s), + ...params.filters.custom, ], } as PageParams; } @@ -71,6 +76,7 @@ export function formatProposalPageFromGet(page: any): ProposalPage { page.filters = { category: swf('CAT_', page.filters), stage: swf('STAGE_', page.filters), + custom: page.filters.filter((f: string) => Object.keys(CUSTOM_FILTERS).includes(f)), }; // reverse map const serverSortToClient = Object.entries(proposalsSortMap).find( @@ -168,7 +174,7 @@ export function extractIdFromSlug(slug: string) { export function massageSerializedState(state: AppState) { // proposal detail if (state.proposal.detail) { - const { isVersionTwo } = state.proposal.detail + const { isVersionTwo } = state.proposal.detail; const base = isVersionTwo ? 10 : 16; state.proposal.detail.target = new BN( @@ -183,9 +189,7 @@ export function massageSerializedState(state: AppState) { .contributionBounty as any) as string); state.proposal.detail.milestones = state.proposal.detail.milestones.map(m => ({ ...m, - amount: isVersionTwo - ? m.amount - : new BN((m.amount as any) as string, 16), + amount: isVersionTwo ? m.amount : new BN((m.amount as any) as string, 16), })); if (state.proposal.detail.rfp && state.proposal.detail.rfp.bounty) { state.proposal.detail.rfp.bounty = new BN( @@ -204,9 +208,7 @@ export function massageSerializedState(state: AppState) { contributionBounty: new BN((p.contributionMatching as any) as string, base), milestones: p.milestones.map(m => ({ ...m, - amount: p.isVersionTwo - ? m.amount - : new BN((m.amount as any) as string, 16), + amount: p.isVersionTwo ? m.amount : new BN((m.amount as any) as string, 16), })), }; }); diff --git a/frontend/client/utils/validators.ts b/frontend/client/utils/validators.ts index 9ed97bbe..b38d02b9 100644 --- a/frontend/client/utils/validators.ts +++ b/frontend/client/utils/validators.ts @@ -31,12 +31,9 @@ export function getAmountErrorUsd(amount: number, max: number = Infinity, min?: return null; } - // Covers the edge case where whole decimals (eg. 100.00) is valid in getAmountErrorUsd export function getAmountErrorUsdFromString(amount: string) { - return amount.indexOf('.') !== -1 - ? 'Amount must be a whole number' - : null + return amount.indexOf('.') !== -1 ? 'Amount must be a whole number' : null; } export function getAmountErrorFromString(amount: string, max?: number, min?: number) { @@ -71,6 +68,9 @@ export function isValidSproutAddress(address: string): boolean { } export function isValidSaplingAddress(address: string): boolean { + if (address.substring(0, 3) !== 'zs1') { + return false; + } if (/^z(s)?(reg)?(testsapling)?[a-zA-Z0-9]{76}$/.test(address)) { return true; } diff --git a/frontend/package.json b/frontend/package.json index 3242b2f0..d88ed577 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -102,7 +102,7 @@ "file-loader": "^2.0.0", "find-root": "^1.1.0", "font-awesome": "^4.7.0", - "fork-ts-checker-webpack-plugin": "^0.4.2", + "fork-ts-checker-webpack-plugin": "^0.4.15", "fs-extra": "^7.0.0", "global": "4.3.2", "history": "4.7.2", @@ -125,7 +125,7 @@ "markdown-loader": "^4.0.0", "mini-css-extract-plugin": "^0.8.0", "moment": "^2.22.2", - "node-sass": "^4.9.2", + "node-sass": "^4.13.1", "nodemon": "^1.18.4", "prettier": "^1.13.4", "prettier-package-json": "^1.6.0", @@ -163,7 +163,7 @@ "uglifyjs-webpack-plugin": "1.3.0", "underscore": "^1.9.1", "url-loader": "^1.1.1", - "webpack": "^4.19.0", + "webpack": "^4.42.0", "webpack-bundle-analyzer": "^3.3.2", "webpack-cli": "^3.1.0", "webpack-dev-server": "3.2.1", @@ -173,7 +173,10 @@ "webpack-stats-plugin": "^0.2.1", "winston": "^3.1.0", "write-file-webpack-plugin": "^4.4.0", - "xss": "1.0.3" + "xss": "1.0.3", + "acorn": "^6.4.1", + "minimist": "^1.2.3", + "kind-of": "^6.0.3" }, "devDependencies": { "@storybook/react": "4.0.0-alpha.22", diff --git a/frontend/stories/Proposal.story.tsx b/frontend/stories/Proposal.story.tsx index 1a96239e..19695831 100644 --- a/frontend/stories/Proposal.story.tsx +++ b/frontend/stories/Proposal.story.tsx @@ -4,8 +4,8 @@ import { storiesOf } from '@storybook/react'; import { ProposalCampaignBlock } from 'components/Proposal/CampaignBlock'; import 'styles/style.less'; -import 'components/Proposal/style.less'; -import 'components/Proposal/Governance/style.less'; +import 'components/Proposal/index.less'; +// import 'components/Proposal/Governance/style.less'; import { generateProposal } from './props'; const user = { diff --git a/frontend/stories/ProposalCard.story.tsx b/frontend/stories/ProposalCard.story.tsx index a620e739..e25ecc29 100644 --- a/frontend/stories/ProposalCard.story.tsx +++ b/frontend/stories/ProposalCard.story.tsx @@ -4,8 +4,8 @@ import { storiesOf } from '@storybook/react'; import { ProposalCard } from 'components/Proposals/ProposalCard'; import 'styles/style.less'; -import 'components/Proposal/style.less'; -import 'components/Proposal/Governance/style.less'; +import 'components/Proposal/index.less'; +// import 'components/Proposal/Governance/style.less'; import { generateProposal } from './props'; const propsNoFunding = generateProposal({ diff --git a/frontend/stories/ProposalMilestones.story.tsx b/frontend/stories/ProposalMilestones.story.tsx index 96be4161..001625fe 100644 --- a/frontend/stories/ProposalMilestones.story.tsx +++ b/frontend/stories/ProposalMilestones.story.tsx @@ -3,16 +3,21 @@ import { storiesOf } from '@storybook/react'; import { Provider } from 'react-redux'; import { configureStore } from 'store/configure'; -import { combineInitialState } from 'store/reducers'; +import { combineInitialState as __combineInitialState } from 'store/reducers'; import Milestones from 'components/Proposal/Milestones'; import { MILESTONE_STAGE } from 'types'; const { IDLE, ACCEPTED, PAID, REJECTED } = MILESTONE_STAGE; import 'styles/style.less'; -import 'components/Proposal/style.less'; -import 'components/Proposal/Governance/style.less'; +import 'components/Proposal/index.less'; +// import 'components/Proposal/Governance/style.less'; import { generateProposal } from './props'; +const combineInitialState = { + web3: {}, + ...__combineInitialState, +}; + const msWaiting = { stage: IDLE }; const msPaid = { stage: PAID }; const msActive = { stage: ACCEPTED }; diff --git a/frontend/stories/RevisionTab.story.tsx b/frontend/stories/RevisionTab.story.tsx new file mode 100644 index 00000000..e4394dc8 --- /dev/null +++ b/frontend/stories/RevisionTab.story.tsx @@ -0,0 +1,139 @@ +import * as React from 'react'; +import { storiesOf } from '@storybook/react'; + +import { ProposalRevision } from 'components/Proposal/Revisions'; +import { Revision, RevisionChange, REVISION_CHANGE_TYPES } from 'types'; + +const { + MILESTONE_ADD, + MILESTONE_REMOVE, + MILESTONE_EDIT_TITLE, + MILESTONE_EDIT_AMOUNT, + MILESTONE_EDIT_CONTENT, + MILESTONE_EDIT_DAYS, + MILESTONE_EDIT_IMMEDIATE_PAYOUT, + MILESTONE_EDIT_PERCENT, + PROPOSAL_EDIT_BRIEF, + PROPOSAL_EDIT_CONTENT, + PROPOSAL_EDIT_TARGET, + PROPOSAL_EDIT_TITLE, +} = REVISION_CHANGE_TYPES; + +const minute = 1000 * 60; +const hour = minute * 60; +const day = 24 * hour; +const week = day * 7; + +const now = Date.now(); + +const oneWeekAgo = now - week; +const twoDaysAgo = now - 2 * day; +const oneHourAgo = now - hour; + +const fakeUser: any = { + displayName: 'Alice', +}; + +const revision1Changes: RevisionChange[] = [ + { + type: PROPOSAL_EDIT_TITLE, + }, + { + type: MILESTONE_EDIT_TITLE, + milestoneIndex: 2, + }, + { + type: MILESTONE_EDIT_DAYS, + milestoneIndex: 2, + }, + { + type: MILESTONE_REMOVE, + milestoneIndex: 3, + }, +]; + +const revision2Changes: RevisionChange[] = [ + { + type: PROPOSAL_EDIT_BRIEF, + }, + { + type: PROPOSAL_EDIT_CONTENT, + }, + { + type: PROPOSAL_EDIT_TARGET, + }, + { + type: MILESTONE_EDIT_PERCENT, + milestoneIndex: 1, + }, + { + type: MILESTONE_EDIT_PERCENT, + milestoneIndex: 2, + }, +]; + +const revision3Changes: RevisionChange[] = [ + { + type: MILESTONE_EDIT_AMOUNT, + milestoneIndex: 0, + }, + { + type: MILESTONE_EDIT_CONTENT, + milestoneIndex: 0, + }, + { + type: MILESTONE_EDIT_IMMEDIATE_PAYOUT, + milestoneIndex: 0, + }, + { + type: MILESTONE_ADD, + milestoneIndex: 3, + }, +]; + +const revision1: Revision = { + revisionId: '0', + revisionIndex: 0, + author: fakeUser, + dateCreated: oneWeekAgo / 1000, + changes: revision1Changes, + proposalArchiveId: '0', + proposalId: '0', +}; + +const revision2: Revision = { + author: fakeUser, + dateCreated: twoDaysAgo / 1000, + changes: revision2Changes, + revisionId: '0', + revisionIndex: 1, + proposalArchiveId: '0', + proposalId: '0', +}; + +const revision3: Revision = { + author: fakeUser, + dateCreated: oneHourAgo / 1000, + changes: revision3Changes, + revisionId: '0', + revisionIndex: 2, + proposalArchiveId: '0', + proposalId: '0', +}; + +const revisions: Revision[] = [revision1, revision2, revision3]; + +// tslint:disable-next-line +const stubbed: any = () => {}; + +storiesOf('RevisionTab', module).add('basic', () => ( +
+ +
+)); diff --git a/frontend/stories/props.tsx b/frontend/stories/props.tsx index f874462a..a40fe285 100644 --- a/frontend/stories/props.tsx +++ b/frontend/stories/props.tsx @@ -165,6 +165,9 @@ export function generateProposal({ followersCount: 0, authedLiked: false, likesCount: 0, + changesRequestedDiscussion: null, + changesRequestedDiscussionReason: null, + liveDraftId: null, tipJarAddress: null, tipJarViewKey: null, arbiter: { diff --git a/frontend/types/ccr.ts b/frontend/types/ccr.ts index 6b9aab0d..0464dde8 100644 --- a/frontend/types/ccr.ts +++ b/frontend/types/ccr.ts @@ -6,6 +6,7 @@ export enum CCRSTATUS { PENDING = 'PENDING', APPROVED = 'APPROVED', REJECTED = 'REJECTED', + REJECTED_PERMANENTLY = 'REJECTED_PERMANENTLY', LIVE = 'LIVE', DELETED = 'DELETED', } diff --git a/frontend/types/index.ts b/frontend/types/index.ts index 04cd6cc5..7d40c0db 100644 --- a/frontend/types/index.ts +++ b/frontend/types/index.ts @@ -10,3 +10,4 @@ export * from './email'; export * from './rfp'; export * from './pagination'; export * from './ccr'; +export * from './revision'; diff --git a/frontend/types/pagination.ts b/frontend/types/pagination.ts index 722e30c5..0f0046ee 100644 --- a/frontend/types/pagination.ts +++ b/frontend/types/pagination.ts @@ -1,5 +1,10 @@ import { Proposal } from './proposal'; -import { PROPOSAL_SORT, PROPOSAL_CATEGORY, PROPOSAL_STAGE } from 'api/constants'; +import { + PROPOSAL_SORT, + PROPOSAL_CATEGORY, + PROPOSAL_STAGE, + CUSTOM_FILTERS, +} from 'api/constants'; export interface Page { page: number; @@ -29,6 +34,7 @@ export interface ProposalPage extends Omit { filters: { stage: PROPOSAL_STAGE[]; category: PROPOSAL_CATEGORY[]; + custom: CUSTOM_FILTERS[]; }; } diff --git a/frontend/types/proposal.ts b/frontend/types/proposal.ts index 42907545..ca81af18 100644 --- a/frontend/types/proposal.ts +++ b/frontend/types/proposal.ts @@ -1,6 +1,13 @@ import { Zat, Usd } from 'utils/units'; import { PROPOSAL_STAGE } from 'api/constants'; -import { CreateMilestone, Update, User, Comment, ContributionWithUser } from 'types'; +import { + CreateMilestone, + Update, + Revision, + User, + Comment, + ContributionWithUser, +} from 'types'; import { ProposalMilestone } from './milestone'; import { RFP } from './rfp'; @@ -69,6 +76,9 @@ export interface Proposal extends Omit { authedLiked: boolean; likesCount: number; tipJarViewKey: string | null; + changesRequestedDiscussion: boolean | null; + changesRequestedDiscussionReason: string | null; + liveDraftId: string | null; isTeamMember?: boolean; // FE derived isArbiter?: boolean; // FE derived } @@ -88,6 +98,11 @@ export interface ProposalUpdates { updates: Update[]; } +export interface ProposalRevisions { + proposalId: Proposal['proposalId']; + revisions: Revision[]; +} + export interface ProposalContributions { proposalId: Proposal['proposalId']; top: ContributionWithUser[]; @@ -106,6 +121,7 @@ export interface UserProposal { datePublished: number; team: User[]; rejectReason: string; + changesRequestedDiscussionReason: string | null; acceptedWithFunding: boolean | null; isVersionTwo: boolean; } @@ -113,10 +129,14 @@ export interface UserProposal { // NOTE: sync with backend/grant/proposal/models.py STATUSES export enum STATUS { DRAFT = 'DRAFT', + LIVE_DRAFT = 'LIVE_DRAFT', + ARCHIVED = 'ARCHIVED', STAKING = 'STAKING', PENDING = 'PENDING', + DISCUSSION = 'DISCUSSION', APPROVED = 'APPROVED', REJECTED = 'REJECTED', + REJECTED_PERMANENTLY = 'REJECTED_PERMANENTLY', LIVE = 'LIVE', DELETED = 'DELETED', } diff --git a/frontend/types/revision.ts b/frontend/types/revision.ts new file mode 100644 index 00000000..52712a62 --- /dev/null +++ b/frontend/types/revision.ts @@ -0,0 +1,31 @@ +import { User } from 'types'; + +export enum REVISION_CHANGE_TYPES { + PROPOSAL_EDIT_BRIEF = 'PROPOSAL_EDIT_BRIEF', + PROPOSAL_EDIT_CONTENT = 'PROPOSAL_EDIT_CONTENT', + PROPOSAL_EDIT_TARGET = 'PROPOSAL_EDIT_TARGET', + PROPOSAL_EDIT_TITLE = 'PROPOSAL_EDIT_TITLE', + MILESTONE_ADD = 'MILESTONE_ADD', + MILESTONE_REMOVE = 'MILESTONE_REMOVE', + MILESTONE_EDIT_AMOUNT = 'MILESTONE_EDIT_AMOUNT', + MILESTONE_EDIT_DAYS = 'MILESTONE_EDIT_DAYS', + MILESTONE_EDIT_IMMEDIATE_PAYOUT = 'MILESTONE_EDIT_IMMEDIATE_PAYOUT', + MILESTONE_EDIT_PERCENT = 'MILESTONE_EDIT_PERCENT', + MILESTONE_EDIT_CONTENT = 'MILESTONE_EDIT_CONTENT', + MILESTONE_EDIT_TITLE = 'MILESTONE_EDIT_TITLE', +} + +export interface RevisionChange { + type: REVISION_CHANGE_TYPES; + milestoneIndex?: number; +} + +export interface Revision { + revisionId: string; + dateCreated: number; + author: User; + proposalId: string; + proposalArchiveId: string; + changes: RevisionChange[]; + revisionIndex: number; +} diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 04cae4db..a0dc00ce 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2078,38 +2078,87 @@ "@webassemblyjs/wast-parser" "1.7.6" mamacro "^0.0.3" +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/floating-point-hex-parser@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.6.tgz#7cb37d51a05c3fe09b464ae7e711d1ab3837801f" +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + "@webassemblyjs/helper-api-error@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.6.tgz#99b7e30e66f550a2638299a109dda84a622070ef" +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + "@webassemblyjs/helper-buffer@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.6.tgz#ba0648be12bbe560c25c997e175c2018df39ca3e" +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + "@webassemblyjs/helper-code-frame@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.6.tgz#5a94d21b0057b69a7403fca0c253c3aaca95b1a5" dependencies: "@webassemblyjs/wast-printer" "1.7.6" +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + "@webassemblyjs/helper-fsm@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.6.tgz#ae1741c6f6121213c7a0b587fb964fac492d3e49" +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + "@webassemblyjs/helper-module-context@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.6.tgz#116d19a51a6cebc8900ad53ca34ff8269c668c23" dependencies: mamacro "^0.0.3" +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + "@webassemblyjs/helper-wasm-bytecode@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.6.tgz#98e515eaee611aa6834eb5f6a7f8f5b29fefb6f1" +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + "@webassemblyjs/helper-wasm-section@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.6.tgz#783835867bdd686df7a95377ab64f51a275e8333" @@ -2119,22 +2168,51 @@ "@webassemblyjs/helper-wasm-bytecode" "1.7.6" "@webassemblyjs/wasm-gen" "1.7.6" +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/ieee754@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.6.tgz#c34fc058f2f831fae0632a8bb9803cf2d3462eb1" dependencies: "@xtuc/ieee754" "^1.2.0" +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + "@webassemblyjs/leb128@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.6.tgz#197f75376a29f6ed6ace15898a310d871d92f03b" dependencies: "@xtuc/long" "4.2.1" +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + "@webassemblyjs/utf8@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.6.tgz#eb62c66f906af2be70de0302e29055d25188797d" +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + "@webassemblyjs/wasm-edit@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.6.tgz#fa41929160cd7d676d4c28ecef420eed5b3733c5" @@ -2148,6 +2226,20 @@ "@webassemblyjs/wasm-parser" "1.7.6" "@webassemblyjs/wast-printer" "1.7.6" +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + "@webassemblyjs/wasm-gen@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.6.tgz#695ac38861ab3d72bf763c8c75e5f087ffabc322" @@ -2158,6 +2250,17 @@ "@webassemblyjs/leb128" "1.7.6" "@webassemblyjs/utf8" "1.7.6" +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + "@webassemblyjs/wasm-opt@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.6.tgz#fbafa78e27e1a75ab759a4b658ff3d50b4636c21" @@ -2167,6 +2270,16 @@ "@webassemblyjs/wasm-gen" "1.7.6" "@webassemblyjs/wasm-parser" "1.7.6" +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wasm-parser@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.6.tgz#84eafeeff405ad6f4c4b5777d6a28ae54eed51fe" @@ -2178,6 +2291,18 @@ "@webassemblyjs/leb128" "1.7.6" "@webassemblyjs/utf8" "1.7.6" +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + "@webassemblyjs/wast-parser@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.6.tgz#ca4d20b1516e017c91981773bd7e819d6bd9c6a7" @@ -2190,6 +2315,18 @@ "@xtuc/long" "4.2.1" mamacro "^0.0.3" +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + "@webassemblyjs/wast-printer@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.6.tgz#a6002c526ac5fa230fe2c6d2f1bdbf4aead43a5e" @@ -2198,6 +2335,15 @@ "@webassemblyjs/wast-parser" "1.7.6" "@xtuc/long" "4.2.1" +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2206,6 +2352,11 @@ version "4.2.1" resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" @@ -2213,6 +2364,7 @@ abab@^2.0.0: abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abs-svg-path@~0.1.1: version "0.1.1" @@ -2259,6 +2411,16 @@ acorn@^6.0.1, acorn@^6.0.7: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== +acorn@^6.2.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + +acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + add-dom-event-listener@1.x: version "1.0.2" resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz#8faed2c41008721cf111da1d30d995b85be42bed" @@ -2304,23 +2466,10 @@ ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" -ajv@^5.1.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.4.0.tgz#32d1cf08dbc80c432f426f12e10b2511f6b46474" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" +ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== ajv@^6.1.0: version "6.5.3" @@ -2331,6 +2480,16 @@ ajv@^6.1.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.2, ajv@^6.5.5: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + 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" @@ -2342,6 +2501,7 @@ align-text@^0.1.1, align-text@^0.1.3: amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ansi-align@^2.0.0: version "2.0.0" @@ -2368,14 +2528,17 @@ ansi-html@0.0.7: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -2486,6 +2649,7 @@ any-observable@^0.3.0: anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" @@ -2501,6 +2665,7 @@ aproba@^1.0.3, aproba@^1.1.1: 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" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -2520,6 +2685,7 @@ arr-diff@^2.0.0: arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" @@ -2528,6 +2694,7 @@ arr-flatten@^1.0.1, arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-equal@^1.0.0: version "1.0.0" @@ -2540,6 +2707,7 @@ array-filter@~0.0.0: array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: version "1.1.1" @@ -2585,6 +2753,7 @@ array-unique@^0.2.1: array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= array.prototype.flat@^1.2.1: version "1.2.1" @@ -2619,12 +2788,16 @@ asn1.js@^4.0.0: minimalistic-assert "^1.0.0" asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: version "1.4.1" @@ -2635,6 +2808,7 @@ assert@^1.1.1: assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-types@0.11.5: version "0.11.5" @@ -2644,13 +2818,15 @@ ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-each@^1.0.0, async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= async-limiter@~1.0.0: version "1.0.0" @@ -2675,10 +2851,12 @@ async@^2.1.4, async@^2.6.0: asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== author-regex@^1.0.0: version "1.0.0" @@ -2698,14 +2876,12 @@ autoprefixer@^9.1.3: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== axios@^0.18.1: version "0.18.1" @@ -3022,6 +3198,7 @@ base64-js@^1.0.2: base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -3040,8 +3217,9 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" @@ -3058,13 +3236,26 @@ big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + bignumber.js@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" binary-extensions@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" bizcharts-plugin-slider@^2.1.1-beta.1: version "2.1.1-beta.1" @@ -3087,6 +3278,7 @@ bizcharts@^3.4.2: block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" @@ -3094,6 +3286,11 @@ bluebird@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bmp-js@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.1.tgz#5ad0147099d13a9f38aa7b99af1d6e78666ed37f" @@ -3187,9 +3384,10 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0, braces@^2.3.1: +braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -3323,7 +3521,7 @@ buffer@^5.2.0: base64-js "^1.0.2" ieee754 "^1.1.4" -builtin-modules@^1.0.0, builtin-modules@^1.1.1: +builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -3353,9 +3551,31 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.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" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -3390,6 +3610,7 @@ camel-case@3.0.x: camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" @@ -3401,10 +3622,12 @@ camelcase@^1.0.2: camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" @@ -3433,6 +3656,7 @@ case-sensitive-paths-webpack-plugin@^2.1.2: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= center-align@^0.1.1: version "0.1.3" @@ -3495,7 +3719,7 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4: +chokidar@^2.0.0, chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" dependencies: @@ -3514,16 +3738,47 @@ chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4: optionalDependencies: fsevents "^1.2.2" -chownr@^1.0.1, chownr@^1.1.1: +chokidar@^2.0.4: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chrome-trace-event@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" dependencies: tslib "^1.9.0" +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + ci-info@^1.3.0, ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" @@ -3538,6 +3793,7 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -3596,6 +3852,7 @@ cliui@^2.1.0: cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -3639,10 +3896,6 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - coa@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af" @@ -3652,10 +3905,12 @@ coa@~2.0.1: code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -3703,15 +3958,10 @@ colorspace@1.1.x: color "3.0.x" text-hex "1.0.x" -combined-stream@1.0.6, combined-stream@~1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" @@ -3723,6 +3973,11 @@ commander@2.17.x, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" @@ -3742,8 +3997,9 @@ component-classes@1.x, component-classes@^1.2.5, component-classes@^1.2.6: component-indexof "0.0.3" component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== component-indexof@0.0.3: version "0.0.3" @@ -3832,6 +4088,7 @@ console-browserify@^1.1.0: console-control-strings@^1.0.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" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@^1.0.0: version "1.0.0" @@ -3893,6 +4150,7 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= copy-to-clipboard@^3: version "3.0.8" @@ -3928,6 +4186,7 @@ core-js@^2.5.7: core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cors@^2.8.4: version "2.8.4" @@ -4033,6 +4292,7 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: cross-spawn@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= dependencies: lru-cache "^4.0.1" which "^1.2.9" @@ -4178,6 +4438,7 @@ csstype@^2.2.0: currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" @@ -4319,6 +4580,7 @@ dagre@~0.8.2: dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" @@ -4338,7 +4600,7 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -4377,6 +4639,7 @@ decamelize@^2.0.0: decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= dedent@^0.7.0: version "0.7.0" @@ -4393,6 +4656,7 @@ deep-equal@^1.0.1, deep-equal@~1.0.1: deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.3" @@ -4416,18 +4680,21 @@ define-properties@^1.1.2: define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" @@ -4450,10 +4717,12 @@ del@^3.0.0: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@1.1.1, depd@~1.1.1: version "1.1.1" @@ -4480,10 +4749,6 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - detect-node@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" @@ -4681,10 +4946,12 @@ duplexify@^3.4.2, duplexify@^3.6.0: stream-shift "^1.0.0" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" ee-first@1.1.1: version "1.1.1" @@ -4728,6 +4995,11 @@ emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + enabled@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" @@ -4794,13 +5066,7 @@ errno@^0.1.3: dependencies: prr "~0.0.0" -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" dependencies: @@ -4880,6 +5146,14 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -4903,10 +5177,15 @@ esutils@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" -esutils@^2.0.0, esutils@^2.0.2: +esutils@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -5021,6 +5300,7 @@ expand-brackets@^0.1.4: expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -5097,23 +5377,22 @@ express@^4.16.2, express@^4.16.3: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -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, external-editor@^2.1.0: version "2.2.0" @@ -5140,6 +5419,7 @@ extglob@^0.3.1: extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -5159,18 +5439,25 @@ extract-zip@^1.6.5: mkdirp "0.5.1" yauzl "2.4.1" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= -fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + fast-glob@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf" @@ -5183,8 +5470,9 @@ fast-glob@^2.0.2: micromatch "^3.1.10" fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: version "2.0.6" @@ -5265,6 +5553,11 @@ fecha@^2.3.3, fecha@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -5300,6 +5593,11 @@ file-type@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + file-url@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/file-url/-/file-url-2.0.2.tgz#e951784d79095127d3713029ab063f40818ca2ae" @@ -5329,6 +5627,7 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -5370,6 +5669,15 @@ find-cache-dir@^2.0.0: make-dir "^1.0.0" pkg-dir "^3.0.0" +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-file-up@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-1.0.2.tgz#4d53664bc128cf793901497f4b13558d979755ca" @@ -5470,36 +5778,29 @@ foreach@^2.0.5: forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -fork-ts-checker-webpack-plugin@^0.4.2: - version "0.4.9" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.4.9.tgz#78607899d4411fdc6faeca5b4db7654c9d8d28a2" +fork-ts-checker-webpack-plugin@^0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.4.15.tgz#7cd9f94f3dd58cd1fe8f953f876e72090eda3f6d" + integrity sha512-qNYuygh2GxXehBvQZ5rI5YlQFn+7ZV6kmkyD9Sgs33dWl73NZdUOB5aCp8v0EXJn176AhPrZP8YCMT3h01fs+g== dependencies: babel-code-frame "^6.22.0" chalk "^2.4.1" chokidar "^2.0.4" - lodash.endswith "^4.2.1" - lodash.isfunction "^3.0.8" - lodash.isstring "^4.0.1" - lodash.startswith "^4.2.1" + lodash "^4.17.11" + micromatch "^3.1.10" minimatch "^3.0.4" resolve "^1.5.0" tapable "^1.0.0" -form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - form-data@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + 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" + combined-stream "^1.0.6" mime-types "^2.1.12" forwarded@~0.1.2: @@ -5509,6 +5810,7 @@ forwarded@~0.1.2: fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" @@ -5547,12 +5849,6 @@ fs-extra@^7.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - dependencies: - minipass "^2.2.1" - fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -5567,14 +5863,15 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" +fsevents@^1.2.2, fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + bindings "^1.5.0" + nan "^2.12.1" -fstream@^1.0.0, fstream@^1.0.2: +fstream@^1.0.0, fstream@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== @@ -5603,6 +5900,7 @@ fuse.js@^3.0.1, fuse.js@^3.2.1: gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -5616,6 +5914,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" @@ -5623,13 +5922,10 @@ generate-page-webpack-plugin@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/generate-page-webpack-plugin/-/generate-page-webpack-plugin-1.1.1.tgz#82208fb599f45d70940cbd6327a7a46e77c5ee2c" -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - -get-caller-file@^1.0.2: +get-caller-file@^1.0.1, get-caller-file@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== get-own-enumerable-property-symbols@^2.0.1: version "2.0.1" @@ -5638,6 +5934,7 @@ get-own-enumerable-property-symbols@^2.0.1: get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stdin@^6.0.0: version "6.0.0" @@ -5664,10 +5961,12 @@ get-stream@^4.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" @@ -5687,6 +5986,7 @@ glob-parent@^2.0.0: glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -5695,19 +5995,10 @@ glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1, glob@~7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob@^7.0.0, glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5727,10 +6018,9 @@ glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5816,11 +6106,12 @@ globby@^7.1.1: slash "^1.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.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9" + integrity sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g== dependencies: glob "~7.1.1" - lodash "~4.17.10" + lodash "~4.17.12" minimatch "~3.0.2" got@^6.7.1: @@ -5839,7 +6130,12 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.2.2" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== @@ -5923,24 +6219,20 @@ handle-thing@^2.0.0: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" +har-validator@~5.1.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 "^5.1.0" - har-schema "^2.0.0" - -har-validator@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" - dependencies: - ajv "^5.3.0" + ajv "^6.5.5" har-schema "^2.0.0" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" @@ -5955,10 +6247,12 @@ has-symbols@^1.0.0: has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -5967,6 +6261,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -5975,10 +6270,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -6097,8 +6394,9 @@ hoopy@^0.1.2: resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== hpack.js@^2.1.6: version "2.1.6" @@ -6214,6 +6512,7 @@ http-proxy@^1.16.2, http-proxy@^1.17.0, http-proxy@^1.8.1: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -6284,9 +6583,10 @@ iconv-lite@0.4.19, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@^0.4.17, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -6316,12 +6616,6 @@ ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - dependencies: - minimatch "^3.0.4" - ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -6379,10 +6673,12 @@ imurmurhash@^0.1.4: in-publish@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" @@ -6394,6 +6690,11 @@ 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: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -6521,6 +6822,7 @@ inversify@^4.10.0: invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= invert-kv@^2.0.0: version "2.0.0" @@ -6550,18 +6852,21 @@ ipaddr.js@^1.9.0: is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-arrayish@^0.3.1: version "0.3.2" @@ -6570,6 +6875,7 @@ is-arrayish@^0.3.1: is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" @@ -6582,12 +6888,6 @@ is-buffer@^2.0.2: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -6607,12 +6907,14 @@ is-ci@^1.1.0: is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" @@ -6623,6 +6925,7 @@ is-date-object@^1.0.1: is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -6631,6 +6934,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -6657,10 +6961,12 @@ is-equal-shallow@^0.1.3: is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" @@ -6671,22 +6977,24 @@ is-extglob@^1.0.0: 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" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 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" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== 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" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" 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" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-function@^1.0.1, is-function@~1.0.0: version "1.0.1" @@ -6701,12 +7009,14 @@ is-glob@^2.0.0, is-glob@^2.0.1: is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" @@ -6734,6 +7044,7 @@ is-number@^2.1.0: is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" @@ -6775,6 +7086,7 @@ is-plain-obj@^1.0.0: is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" @@ -6823,14 +7135,17 @@ is-symbol@^1.0.1: is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" @@ -6843,10 +7158,12 @@ isarray@0.0.1, isarray@~0.0.1: isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= ismobilejs@^0.5.1: version "0.5.1" @@ -6855,12 +7172,14 @@ ismobilejs@^0.5.1: isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isomorphic-fetch@^2.1.1: version "2.2.1" @@ -6872,6 +7191,7 @@ isomorphic-fetch@^2.1.1: isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul-lib-coverage@^1.2.1: version "1.2.1" @@ -6947,8 +7267,9 @@ jpeg-js@^0.3.4: resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.4.tgz#dc2ba501ee3d58b7bb893c5d1fab47294917e7e7" js-base64@^2.1.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" + version "2.5.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" + integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== js-cookie@^2.2.0: version "2.2.0" @@ -6977,6 +7298,7 @@ js-yaml@3.12.0, js-yaml@3.13.1, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^12.0.0: version "12.0.0" @@ -7024,10 +7346,6 @@ 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-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" - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -7035,10 +7353,12 @@ json-schema-traverse@^0.4.1: json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json2module@^0.0.3: version "0.0.3" @@ -7066,6 +7386,13 @@ json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.0.1.tgz#3d6d0d1066039eb50984e66a7840e4f4b7a2c660" @@ -7101,6 +7428,7 @@ jsontoxml@^1.0.0: jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -7132,22 +7460,26 @@ kind-of@^2.0.1: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -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.0, kind-of@^6.0.2, 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" @@ -7178,6 +7510,7 @@ lazy-cache@^1.0.3: lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" @@ -7312,6 +7645,7 @@ load-bmfont@^1.2.3, load-bmfont@^1.3.1, load-bmfont@^1.4.0: 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" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -7323,6 +7657,11 @@ loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + loader-utils@1.1.0, loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" @@ -7331,6 +7670,15 @@ loader-utils@1.1.0, loader-utils@^1.0.2, loader-utils@^1.1.0: emojis-list "^2.0.0" json5 "^0.5.0" +loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + local-storage@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/local-storage/-/local-storage-2.0.0.tgz#748b7d041b197f46f3ec7393640851c175b64db8" @@ -7370,18 +7718,10 @@ lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" -lodash.clonedeep@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - lodash.debounce@^4.0.0, lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -7395,10 +7735,6 @@ lodash.defaultsdeep@^4.6.1: resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== -lodash.endswith@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" - lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -7411,18 +7747,10 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" -lodash.isfunction@^3.0.8: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" - lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - lodash.keys@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -7431,10 +7759,6 @@ lodash.keys@^3.1.2: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash.mergewith@^4.6.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" - lodash.mergewith@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" @@ -7452,15 +7776,11 @@ lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" -lodash.startswith@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.startswith/-/lodash.startswith-4.2.1.tgz#c598c4adce188a27e53145731cdc6c0e7177600c" - lodash.throttle@^4.0.0, lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.16.5, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10: +"lodash@>=3.5 <5", lodash@^4.11.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.16.5, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0: version "4.17.13" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93" integrity sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA== @@ -7470,7 +7790,7 @@ lodash@^3.9.1: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.17.15: +lodash@^4.0.0, lodash@^4.17.15, lodash@~4.17.12: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -7542,6 +7862,7 @@ lowercase-keys@^1.0.0: lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -7553,6 +7874,13 @@ lru-cache@^4.1.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru_map@0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -7568,6 +7896,14 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" @@ -7581,14 +7917,17 @@ map-age-cleaner@^0.1.1: map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" @@ -7652,6 +7991,7 @@ memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -7727,6 +8067,11 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + "mime-db@>= 1.34.0 < 2": version "1.36.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" @@ -7739,18 +8084,27 @@ miller-rabin@^4.0.0: mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= mime-db@~1.35.0: version "1.35.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" + integrity sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg== -mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17: +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime-types@~2.1.15, mime-types@~2.1.16: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: mime-db "~1.30.0" -mime-types@~2.1.18, mime-types@~2.1.19: +mime-types@~2.1.18: version "2.1.19" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" dependencies: @@ -7822,19 +8176,19 @@ 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.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - minimatch@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: brace-expansion "^1.0.0" +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -7844,23 +8198,15 @@ 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" +minimist@^1.2.2: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minimist@~0.0.1: version "0.0.10" resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -minipass@^2.2.1, minipass@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" - dependencies: - minipass "^2.2.1" - mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" @@ -7876,9 +8222,26 @@ mississippi@^2.0.0: stream-each "^1.1.0" through2 "^2.0.0" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -7893,6 +8256,7 @@ mixin-object@^2.0.1: mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" @@ -7914,6 +8278,7 @@ move-concurrently@^1.0.1: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.1, ms@^2.1.1: version "2.1.1" @@ -7947,17 +8312,15 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - -nan@^2.9.2: - version "2.11.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" +nan@^2.12.1, nan@^2.13.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -7971,14 +8334,6 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" @@ -7987,6 +8342,11 @@ neo-async@^2.5.0: version "2.5.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" +neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + nice-try@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" @@ -8017,6 +8377,7 @@ node-forge@0.7.5: node-gyp@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -8059,34 +8420,49 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + node-modules-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - node-releases@^1.0.0-alpha.11: version "1.0.0-alpha.11" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" dependencies: semver "^5.3.0" -node-sass@^4.9.2: - version "4.9.3" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" +node-sass@^4.13.1: + version "4.13.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3" + integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -8095,15 +8471,13 @@ node-sass@^4.9.2: get-stdin "^4.0.1" glob "^7.0.3" in-publish "^2.0.0" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.3.2" - lodash.mergewith "^4.6.0" + lodash "^4.17.15" meow "^3.7.0" mkdirp "^0.5.1" - nan "^2.10.0" + nan "^2.13.2" node-gyp "^3.8.0" npmlog "^4.0.0" - request "2.87.0" + request "^2.88.0" sass-graph "^2.2.4" stdout-stream "^1.4.0" "true-case-path" "^1.0.2" @@ -8126,16 +8500,10 @@ nodemon@^1.18.4: "nopt@2 || 3": version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - nopt@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -8143,11 +8511,12 @@ nopt@~1.0.10: abbrev "1" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + 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" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" @@ -8157,6 +8526,11 @@ normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" @@ -8171,17 +8545,6 @@ normalize-url@1.9.1: query-string "^4.1.0" sort-keys "^1.0.0" -npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - -npm-packlist@^1.1.6: - version "1.1.12" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-path@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" @@ -8202,7 +8565,7 @@ npm-which@^3.0.1: npm-path "^2.0.2" which "^1.2.10" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -8224,6 +8587,7 @@ num2fraction@^1.2.2: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= numeral@^2.0.6: version "2.0.6" @@ -8238,13 +8602,10 @@ nzh@^1.0.3: resolved "https://registry.yarnpkg.com/nzh/-/nzh-1.0.4.tgz#bded5492cd7148fa5fe1c809fa61932a899769c5" integrity sha512-A1qQSJTctuzmNlAAqV8AcvcOcsGn0iBbRn2Jhw4KkEFCDkXd5YV7SkfPQ6fw6fGVtJzo6++sGS/W1JZizRmCNQ== -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.x, object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -8253,6 +8614,7 @@ object-assign@4.x, object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -8269,6 +8631,7 @@ object-keys@^1.0.8: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" @@ -8307,6 +8670,7 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" @@ -8431,10 +8795,12 @@ os-browserify@^0.3.0: os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= dependencies: lcid "^1.0.0" @@ -8457,10 +8823,12 @@ os-locale@^3.0.0: os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4: +osenv@0: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -8594,6 +8962,7 @@ parse-headers@^2.0.0: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" @@ -8635,18 +9004,26 @@ parseurl@~1.3.2: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" @@ -8667,9 +9044,10 @@ path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-parse@^1.0.5, path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-to-regexp@0.1.7: version "0.1.7" @@ -8688,6 +9066,7 @@ path-to-regexp@^2.4.0: path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -8716,6 +9095,7 @@ pend@~1.2.0: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= phantomjs-prebuilt@^2.1.14: version "2.1.16" @@ -8738,20 +9118,28 @@ phin@^2.9.1: pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pirates@^4.0.0: version "4.0.0" @@ -8816,6 +9204,7 @@ portfinder@^1.0.9: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-flexbugs-fixes@^4.1.0: version "4.1.0" @@ -8929,13 +9318,19 @@ private@^0.1.6, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: +process-nextick-args@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.10: version "0.11.10" @@ -9000,10 +9395,12 @@ prr@~1.0.1: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: - version "1.1.29" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" +psl@^1.1.24, psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== pstree.remy@^1.1.2: version "1.1.2" @@ -9048,8 +9445,9 @@ punycode@1.3.2: punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -9068,13 +9466,14 @@ qrcode.react@^0.9.2: prop-types "^15.6.0" qr.js "0.0.0" -qs@6.5.1, qs@~6.5.1: +qs@6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" qs@6.5.2, qs@^6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== qs@^6.6.0: version "6.6.0" @@ -9602,7 +10001,7 @@ rc-util@^4.0.4, rc-util@^4.1.0, rc-util@^4.1.1, rc-util@^4.3.0, rc-util@^4.4.0, prop-types "^15.5.10" shallowequal "^0.2.2" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" dependencies: @@ -9953,6 +10352,7 @@ read-chunk@^1.0.1: 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" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -9960,6 +10360,7 @@ read-pkg-up@^1.0.1: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -9973,7 +10374,7 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.3.5, readable-stream@^2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.4, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: @@ -9985,7 +10386,7 @@ read-pkg@^4.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.3.3: +readable-stream@^2.0.0, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -9997,6 +10398,19 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.0.6: version "3.2.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.2.0.tgz#de17f229864c120a9f56945756e4f32c4045245d" @@ -10006,9 +10420,10 @@ readable-stream@^3.0.6: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.0.0: +readdirp@^2.0.0, readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" micromatch "^3.1.10" @@ -10064,6 +10479,7 @@ recursive-readdir@2.2.2: redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" @@ -10151,6 +10567,7 @@ regex-cache@^0.4.2: regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" @@ -10224,6 +10641,7 @@ relateurl@0.2.x: remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= render-fragment@^0.1.1: version "0.1.1" @@ -10232,6 +10650,7 @@ render-fragment@^0.1.1: repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" @@ -10240,6 +10659,7 @@ repeat-string@^1.5.2, repeat-string@^1.6.1: repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" @@ -10267,32 +10687,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2.87.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.65.0, request@^2.81.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: +request@^2.65.0, request@^2.81.0, request@^2.83.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" dependencies: @@ -10317,9 +10712,36 @@ request@^2.65.0, request@^2.81.0, request@^2.83.0, request@^2.87.0, request@^2.8 tunnel-agent "^0.6.0" uuid "^3.3.2" +request@^2.87.0: + 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 sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^2.0.1: version "2.0.2" @@ -10328,6 +10750,7 @@ require-from-string@^2.0.1: require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= requires-port@^1.0.0: version "1.0.0" @@ -10382,13 +10805,21 @@ resolve-pathname@^2.2.0: resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: path-parse "^1.0.5" +resolve@^1.10.0, resolve@^1.5.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + resolve@~1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" @@ -10418,6 +10849,7 @@ resumer@~0.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== right-align@^0.1.1: version "0.1.3" @@ -10425,7 +10857,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -10502,21 +10934,28 @@ rxjs@^6.1.0: dependencies: tslib "^1.9.0" -safe-buffer@5.1.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1: +safe-buffer@5.1.1, safe-buffer@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10524,6 +10963,7 @@ safe-regex@^1.1.0: sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= dependencies: glob "^7.0.0" lodash "^4.0.0" @@ -10558,6 +10998,7 @@ schema-utils@^1.0.0: scss-tokenizer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= dependencies: js-base64 "^2.1.8" source-map "^0.4.2" @@ -10586,21 +11027,27 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" +"semver@2 || 3 || 4 || 5", semver@^5.3.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^5.0.1, semver@^5.5.1: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" -semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: +semver@^5.0.3, semver@^5.1.0, semver@^5.5.0, semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" +semver@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= send@0.16.2: version "0.16.2" @@ -10624,6 +11071,11 @@ serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + serve-favicon@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" @@ -10658,19 +11110,12 @@ serve-static@1.13.2: set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -10755,6 +11200,7 @@ showdown@^1.8.6: 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" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= simple-statistics@~6.1.0: version "6.1.1" @@ -10781,6 +11227,7 @@ slice-ansi@0.0.4: snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -10789,12 +11236,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -10866,10 +11315,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" @@ -10888,9 +11338,18 @@ source-map-support@^0.5.9: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + 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" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.1.32: version "0.1.32" @@ -10901,6 +11360,7 @@ source-map@0.1.32: source-map@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" @@ -10912,19 +11372,31 @@ 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" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== spdy-transport@^3.0.0: version "3.0.0" @@ -10952,6 +11424,7 @@ spdy@^4.0.0: split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" @@ -10980,6 +11453,13 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + stable@~0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -10995,6 +11475,7 @@ staged-git-files@1.1.1: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -11014,8 +11495,9 @@ stats-webpack-plugin@^0.7.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" @@ -11085,6 +11567,7 @@ string-hash@1.1.3: string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -11093,6 +11576,7 @@ string-width@^1.0.1, string-width@^1.0.2: "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -11134,6 +11618,7 @@ string.prototype.trim@~1.1.2: string_decoder@^1.0.0, string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== dependencies: safe-buffer "~5.1.0" @@ -11147,6 +11632,7 @@ string_decoder@^1.1.1: string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" @@ -11161,18 +11647,21 @@ stringify-object@^3.2.2: strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@4.0.0, strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" @@ -11183,12 +11672,14 @@ strip-eof@^1.0.0: strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" 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" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= style-loader@^0.23.0: version "0.23.0" @@ -11200,6 +11691,7 @@ style-loader@^0.23.0: supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^5.2.0, supports-color@^5.3.0: version "5.5.0" @@ -11273,9 +11765,10 @@ symbol.prototype.description@^1.0.0: dependencies: has-symbols "^1.0.0" -tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tapable@^1.1.0: version "1.1.0" @@ -11300,31 +11793,44 @@ tape@^4.5.1: through "~2.3.8" tar@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== dependencies: block-stream "*" - fstream "^1.0.2" + fstream "^1.0.12" inherits "2" -tar@^4: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" dependencies: execa "^0.7.0" +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" + integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + test-exclude@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" @@ -11420,12 +11926,14 @@ to-ico@^1.1.5: to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -11433,6 +11941,7 @@ to-regex-range@^2.1.0: to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" @@ -11462,11 +11971,13 @@ tough-cookie@>=2.3.3, tough-cookie@^2.4.3, tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" -tough-cookie@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" +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: - punycode "^1.4.1" + psl "^1.1.28" + punycode "^2.1.1" tr46@^1.0.1: version "1.0.1" @@ -11477,6 +11988,7 @@ tr46@^1.0.1: trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-right@^1.0.1: version "1.0.1" @@ -11491,10 +12003,11 @@ triple-beam@^1.2.0, triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" "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" + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== dependencies: - glob "^6.0.4" + glob "^7.1.2" tryer@^1.0.0: version "1.0.1" @@ -11594,12 +12107,14 @@ tty-browserify@0.0.0: tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" @@ -11707,13 +12222,14 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" unique-filename@^1.1.0: version "1.1.0" @@ -11721,6 +12237,13 @@ unique-filename@^1.1.0: dependencies: unique-slug "^2.0.0" +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.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" @@ -11758,6 +12281,7 @@ unquote@~1.1.1: unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -11766,9 +12290,10 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" +upath@^1.0.5, upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== update-notifier@^2.3.0: version "2.5.0" @@ -11798,6 +12323,7 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-join@^4.0.0: version "4.0.0" @@ -11840,6 +12366,7 @@ url@^0.11.0: use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== utif@^2.0.1: version "2.0.1" @@ -11850,6 +12377,7 @@ utif@^2.0.1: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" @@ -11864,28 +12392,37 @@ util@0.10.3, util@^0.10.3: dependencies: inherits "2.0.1" +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" -uuid@^3.0.1, uuid@^3.3.2: +uuid@^3.0.1: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" -uuid@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" +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.2" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" value-equal@^0.4.0: version "0.4.0" @@ -11919,6 +12456,7 @@ venn.js@~0.2.20: verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -11941,6 +12479,11 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + void-elements@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" @@ -11969,9 +12512,10 @@ warning@^4.0.1, warning@^4.0.2, warning@~4.0.2: dependencies: loose-envify "^1.0.0" -watchpack@^1.5.0: +watchpack@^1.5.0, watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" @@ -12143,6 +12687,14 @@ webpack-sources@^1.2.0: source-list-map "^2.0.0" source-map "~0.6.1" +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + webpack-stats-plugin@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/webpack-stats-plugin/-/webpack-stats-plugin-0.2.1.tgz#1f5bac13fc25d62cbb5fd0ff646757dc802b8595" @@ -12176,34 +12728,34 @@ webpack@^4.17.1: watchpack "^1.5.0" webpack-sources "^1.2.0" -webpack@^4.19.0: - version "4.19.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.19.0.tgz#252296c8af2d21c0994911007defdb3913a7bc66" +webpack@^4.42.0: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/helper-module-context" "1.7.6" - "@webassemblyjs/wasm-edit" "1.7.6" - "@webassemblyjs/wasm-parser" "1.7.6" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" + eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.1.0" - uglifyjs-webpack-plugin "^1.2.4" - watchpack "^1.5.0" - webpack-sources "^1.2.0" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" websocket-driver@>=0.5.1: version "0.7.0" @@ -12241,6 +12793,7 @@ whatwg-url@^7.0.0: which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= which-module@^2.0.0: version "2.0.0" @@ -12249,12 +12802,14 @@ which-module@^2.0.0: which@1, which@^1.2.10, which@^1.2.14, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" @@ -12311,9 +12866,17 @@ worker-farm@^1.5.2: dependencies: errno "~0.1.7" +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -12399,6 +12962,7 @@ xtend@^4.0.0, xtend@~4.0.1: y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" @@ -12407,10 +12971,12 @@ y18n@^3.2.1: yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yargs-parser@^10.1.0: version "10.1.0" @@ -12427,6 +12993,7 @@ yargs-parser@^4.2.0: yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= dependencies: camelcase "^3.0.0" @@ -12491,6 +13058,7 @@ yargs@^6.5.0: yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= dependencies: camelcase "^3.0.0" cliui "^3.2.0"