From de2f41ecd4d65c18d232d356036cc2b1ec22dcf2 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Fri, 1 Feb 2019 13:31:57 +0100 Subject: [PATCH] =?UTF-8?q?:green=5Fheart:=20R=C3=A9pare=20les=20tests=20u?= =?UTF-8?q?nitaire,=20les=20erreurs=20flow=20et=20les=20erreurs=20eslint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- formeJuridique.yaml | 108 +++++------ package.json | 2 +- source/actions/actions.js | 2 +- source/components/Banner.js | 4 +- source/components/ComparativeTargets.js | 35 +++- source/components/Distribution.js | 4 +- source/components/Feedback/FeedbackForm.js | 4 +- source/components/RuleLink.js | 4 +- source/components/SalaryCompactExplanation.js | 17 +- source/components/SalaryFirstExplanation.js | 16 +- source/components/conversation/TextArea.js | 8 +- .../simulationConfigs/assimilé.yaml | 2 +- .../simulationConfigs/auto-entrepreneur.yaml | 2 +- .../simulationConfigs/indépendant.yaml | 2 +- .../rémunération-dirigeant.yaml | 6 +- .../components/simulationConfigs/salarié.yaml | 2 +- source/components/utils/withColours.js | 37 ++-- source/components/utils/withSitePaths.js | 7 +- source/components/utils/withTracker.js | 29 ++- source/engine/generateQuestions.js | 37 +--- source/engine/index.js | 12 +- source/engine/traverse.js | 3 +- source/engine/treatVariable.js | 7 +- source/reducers/rootReducer.js | 1 - source/règles/base.yaml | 29 +-- source/règles/co2.yaml | 64 +++---- source/selectors/analyseSelectors.js | 7 +- source/selectors/companyStatusSelectors.js | 3 - source/selectors/ficheDePaieSelectors.js | 2 +- source/selectors/progressSelectors.js | 1 + source/selectors/regleSelectors.js | 34 +++- source/selectors/repartitionSelectors.js | 5 +- .../pages/Company/AfterRegistration.js | 28 +-- .../pages/Company/CompanyStatusNavigation.js | 4 +- .../pages/Company/Find.js | 4 +- .../pages/Company/Home.js | 7 +- .../pages/Company/PreviousAnswers.js | 6 +- .../sites/mycompanyinfrance.fr/sitePaths.js | 10 +- source/types/RegleTypes.js | 15 +- source/utils.js | 4 +- test/companyStatusSelectors.test.js | 3 +- test/conversation.test.js | 81 ++++---- test/ficheDePaieSelector.test.js | 12 +- test/generateQuestions.test.js | 12 +- test/indépendants.test.js | 22 ++- test/library.test.js | 10 +- yarn.lock | 176 ++++++++++++++---- 47 files changed, 503 insertions(+), 387 deletions(-) diff --git a/formeJuridique.yaml b/formeJuridique.yaml index c8b04d7c0..6ef9bf1e2 100644 --- a/formeJuridique.yaml +++ b/formeJuridique.yaml @@ -1,8 +1,8 @@ - nom: forme juridique - formule: - une possibilité parmi: - - micro entreprise - - micro entreprise option EIRL + formule: + une possibilité parmi: + - auto-entrepreneur + - auto-entrepreneur option EIRL - EI - EURL - EIRL @@ -14,60 +14,60 @@ - nom: EI espace: forme juridique - applicable si: - toutes ces conditions: - - régime du directeur = 'indépendant' - - nombre d'associés = 1 - non applicable si: - une de ces conditions: - - responsabilité limitée - -- nom: EIRL - espace: forme juridique - applicable si: - toutes ces conditions: - - responsabilité limitée - - régime du directeur = 'indépendant' - - nombre d'associés = 1 - -- nom: EIRL - espace: forme juridique - applicable si: - toutes ces conditions: - - responsabilité limitée - - régime du directeur = 'indépendant' - - nombre d'associés = 1 - -- nom: micro entreprise - espace: forme juridique - applicable si: - toutes ces conditions: + applicable si: + toutes ces conditions: - régime du directeur = 'indépendant' - nombre d'associés = 1 non applicable si: - une de ces conditions: + une de ces conditions: - responsabilité limitée -- nom: micro entreprise option EIRL +- nom: EIRL espace: forme juridique - applicable si: - toutes ces conditions: + applicable si: + toutes ces conditions: + - responsabilité limitée + - régime du directeur = 'indépendant' + - nombre d'associés = 1 + +- nom: EIRL + espace: forme juridique + applicable si: + toutes ces conditions: + - responsabilité limitée + - régime du directeur = 'indépendant' + - nombre d'associés = 1 + +- nom: auto-entrepreneur + espace: forme juridique + applicable si: + toutes ces conditions: + - régime du directeur = 'indépendant' + - nombre d'associés = 1 + non applicable si: + une de ces conditions: + - responsabilité limitée + +- nom: auto-entrepreneur option EIRL + espace: forme juridique + applicable si: + toutes ces conditions: - responsabilité limitée - régime du directeur = 'indépendant' - nombre d'associés = 1 - nom: SARL espace: forme juridique - applicable si: - toutes ces conditions: + applicable si: + toutes ces conditions: - responsabilité limitée - régime du directeur = 'indépendant' - nombre d'associés > 1 - nom: SARL espace: forme juridique - applicable si: - toutes ces conditions: + applicable si: + toutes ces conditions: - responsabilité limitée - régime du directeur = 'indépendant' - nombre d'associés > 1 @@ -77,8 +77,8 @@ - nom: SARL espace: forme juridique - applicable si: - toutes ces conditions: + applicable si: + toutes ces conditions: - responsabilité limitée - régime du directeur = 'indépendant' - nombre d'associés > 1 @@ -86,24 +86,24 @@ - nom: SAS espace: forme juridique - applicable si: - toutes ces conditions: + applicable si: + toutes ces conditions: - responsabilité limitée - régime du directeur = 'assimilé salarié' - nombre d'associés > 1 - nom: SASU espace: forme juridique - applicable si: - toutes ces conditions: + applicable si: + toutes ces conditions: - responsabilité limitée - régime du directeur = 'assimilé salarié' - nombre d'associés = 1 - nom: SA espace: forme juridique - applicable si: - toutes ces conditions: + applicable si: + toutes ces conditions: - responsabilité limitée - régime du directeur = 'assimilé salarié' - nombre d'associés > 1 @@ -112,11 +112,11 @@ - nom: SNC espace: forme juridique - applicable si: - toutes ces conditions: + applicable si: + toutes ces conditions: - régime du directeur = 'indépendant' - nombre d'associés > 1 - non applicable si: + non applicable si: une de ces conditions: - responsabilité limitée @@ -125,14 +125,14 @@ - nom: régime du directeur - formule: - une possibilité parmi: + formule: + une possibilité parmi: - assimilé salarié - indépendant - nom: assimilé salarié espace: régime du directeur - non applicable si: + non applicable si: toutes ces conditions: - forme juridique = 'SARL' - directeur majoritaire diff --git a/package.json b/package.json index 329f3610e..42d7ceb6a 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "eslint-plugin-react": "^7.11.1", "express": "^4.16.3", "file-loader": "^1.1.11", - "flow-bin": "^0.81.0", + "flow-bin": "^0.92.0", "flow-typed": "^2.4.0", "google-translate-api": "^2.3.0", "html-loader": "^0.5.5", diff --git a/source/actions/actions.js b/source/actions/actions.js index 648e1e155..ad9cf6505 100644 --- a/source/actions/actions.js +++ b/source/actions/actions.js @@ -7,6 +7,7 @@ import type { SetSimulationConfigAction, SetSituationBranchAction } from 'Types/ActionsTypes' +// $FlowFixMe import { reset } from 'redux-form'; import { deletePersistedSimulation } from '../storage/persistSimulation'; @@ -50,7 +51,6 @@ export const deletePreviousSimulation = () => ( export const startConversation = (priorityNamespace: ?string) => ( dispatch: StartConversationAction => void, - _: any ) => { dispatch({ type: 'START_CONVERSATION', diff --git a/source/components/Banner.js b/source/components/Banner.js index 11d6a0bc5..587dafd67 100644 --- a/source/components/Banner.js +++ b/source/components/Banner.js @@ -18,9 +18,9 @@ let Banner = ({ hidden = false, children }: PropTypes) => ) : null -export default connect( +export default (connect( (state: State, { hidden }: PropTypes) => ({ hidden: hidden || state.conversationStarted }), {} -)(Banner) +)(Banner): React$ComponentType) diff --git a/source/components/ComparativeTargets.js b/source/components/ComparativeTargets.js index 232e52934..7645a41b9 100644 --- a/source/components/ComparativeTargets.js +++ b/source/components/ComparativeTargets.js @@ -1,8 +1,8 @@ /* @flow */ import { setSituationBranch } from 'Actions/actions' import { - isAutoentrepreneur, - defineDirectorStatus + defineDirectorStatus, + isAutoentrepreneur } from 'Actions/companyStatusActions' import PeriodSwitch from 'Components/PeriodSwitch' import RuleLink from 'Components/RuleLink' @@ -21,11 +21,17 @@ import Montant from 'Ui/Montant' import { validInputEnteredSelector } from '../selectors/analyseSelectors' import './ComparativeTargets.css' import SchemeCard from './ui/SchemeCard' +import type { + Règle, + RègleAvecMontant, + RègleValeur, + RègleAvecValeur +} from 'Types/RegleTypes' const connectRègles = (situationBranchName: string) => connect( state => { - return { + return ({ revenuDisponible: validInputEnteredSelector(state) && règleAvecMontantSelector(state, { @@ -36,7 +42,10 @@ const connectRègles = (situationBranchName: string) => règleAvecValeurSelector(state, { situationBranchName })('ratio de prélèvements') - } + }: { + revenuDisponible: RègleAvecMontant, + prélèvements: RègleAvecValeur + }) }, { setSituationBranch, @@ -45,7 +54,10 @@ const connectRègles = (situationBranchName: string) => } ) -const ComparativeTargets = connect(state => { +type ComparativeTargetsProps = { + plafondAutoEntrepreneurDépassé: ?{ message: string } +} +const ComparativeTargets: React$ComponentType<{}> = connect(state => { const analyse = branchAnalyseSelector(state, { situationBranchName: 'Auto-entrepreneur' }) @@ -56,7 +68,7 @@ const ComparativeTargets = connect(state => { test.includes('base des cotisations > plafond') ) } -})(({ plafondAutoEntrepreneurDépassé }) => ( +})(({ plafondAutoEntrepreneurDépassé }: ComparativeTargetsProps) => (
{ @@ -184,9 +197,13 @@ const AutoEntrepreneur = connectRègles('Auto-entrepreneur')( } ) +type PrélèvementNoticeProps = { + prélèvements: ?RègleAvecValeur, + sitePaths: Object +} const PrélèvementNotice = withSitePaths( - ({ prélèvements, sitePaths }) => - prélèvements && ( + ({ prélèvements, sitePaths }: PrélèvementNoticeProps) => + !!prélèvements && ( <> soit{' '} @@ -42,6 +43,7 @@ class Distribution extends Component { render() { const { colours: { colour }, + // $FlowFixMe ...distribution } = this.props if (!Object.values(distribution).length) { diff --git a/source/components/Feedback/FeedbackForm.js b/source/components/Feedback/FeedbackForm.js index 104a16726..e79e6c94e 100644 --- a/source/components/Feedback/FeedbackForm.js +++ b/source/components/Feedback/FeedbackForm.js @@ -4,7 +4,6 @@ import { ScrollToElement } from 'Components/utils/Scroll' import withTracker from 'Components/utils/withTracker' import React, { Component } from 'react' import { Trans } from 'react-i18next' -import { compose } from 'redux' import type { Tracker } from 'Components/utils/withTracker' type Props = { onEnd: () => void, tracker: Tracker } @@ -19,7 +18,6 @@ class FeedbackForm extends Component { 'written feedback submitted' ]) e.preventDefault() - // $FlowFixMe fetch('/', { method: 'POST', // $FlowFixMe @@ -88,4 +86,4 @@ class FeedbackForm extends Component { } } -export default compose(withTracker)(FeedbackForm) +export default withTracker(FeedbackForm) diff --git a/source/components/RuleLink.js b/source/components/RuleLink.js index 5879429b4..2521c70b9 100644 --- a/source/components/RuleLink.js +++ b/source/components/RuleLink.js @@ -7,11 +7,13 @@ import { Link } from 'react-router-dom' import { capitalise0 } from '../utils' import './RuleLink.css' import type { Règle } from 'Types/RegleTypes' +import type { ThemeColours } from 'Components/utils/withColours' + type Props = Règle & { sitePaths: Object, style: CSSStyleDeclaration, - colours: { colour: string } + colours: ThemeColours } const RuleLink = ({ lien, diff --git a/source/components/SalaryCompactExplanation.js b/source/components/SalaryCompactExplanation.js index 400eb069d..915ad1457 100644 --- a/source/components/SalaryCompactExplanation.js +++ b/source/components/SalaryCompactExplanation.js @@ -1,16 +1,17 @@ /* @flow */ -import Distribution from 'Components/Distribution' -import PaySlip from 'Components/PaySlip' -import SearchButton from 'Components/SearchButton' -import React, { Component } from 'react' -import { Trans } from 'react-i18next' -import './SalaryCompactExplanation.css' +import Distribution from 'Components/Distribution'; +import PaySlip from 'Components/PaySlip'; +import SearchButton from 'Components/SearchButton'; +import React, { Component } from 'react'; +import { Trans } from 'react-i18next'; +import './SalaryCompactExplanation.css'; import type { Tracker } from 'Components/utils/withTracker' +type ResultView = 'distribution' | 'payslip'; type State = { - resultView: 'distribution' | 'payslip' + resultView: ResultView } type Props = { conversationStarted: boolean, @@ -27,7 +28,7 @@ export default class SalaryCompactExplanation extends Component { state = { resultView: this.props.conversationStarted ? 'payslip' : 'distribution' } - handleClickOnTab = resultView => () => { + handleClickOnTab = (resultView: ResultView) => () => { this.setState({ resultView }) this.props.tracker.push(['trackEvent', 'results', 'selectView', resultView]) } diff --git a/source/components/SalaryFirstExplanation.js b/source/components/SalaryFirstExplanation.js index c2512ff58..bb52a18ed 100644 --- a/source/components/SalaryFirstExplanation.js +++ b/source/components/SalaryFirstExplanation.js @@ -1,11 +1,17 @@ /* @flow */ -import Distribution from 'Components/Distribution' -import PaySlip from 'Components/PaySlip' -import React, { Component } from 'react' -import { Trans } from 'react-i18next' +import Distribution from 'Components/Distribution'; +import PaySlip from 'Components/PaySlip'; +import React, { Component } from 'react'; +import { Trans } from 'react-i18next'; -export default class SalaryFirstExplanation extends Component { +type Props = { + arePreviousAnswers: boolean, + conversationStarted: boolean, + startConversation: () => void, + period: 'mois' | 'année' +} +export default class SalaryFirstExplanation extends Component { render() { return ( <> diff --git a/source/components/conversation/TextArea.js b/source/components/conversation/TextArea.js index 602b1eed7..32b4f67d9 100644 --- a/source/components/conversation/TextArea.js +++ b/source/components/conversation/TextArea.js @@ -1,7 +1,7 @@ -import { compose } from 'ramda' -import React, { Component } from 'react' -import { Trans, withNamespaces } from 'react-i18next' -import { FormDecorator } from './FormDecorator' +import { compose } from 'ramda'; +import React, { Component } from 'react'; +import { Trans, withNamespaces } from 'react-i18next'; +import { FormDecorator } from './FormDecorator'; export default compose( FormDecorator('text-area'), diff --git a/source/components/simulationConfigs/assimilé.yaml b/source/components/simulationConfigs/assimilé.yaml index 3853874f4..e9b83520e 100644 --- a/source/components/simulationConfigs/assimilé.yaml +++ b/source/components/simulationConfigs/assimilé.yaml @@ -9,7 +9,7 @@ questions à l'affiche: Charges: entreprise . charges situation: - micro entreprise: non + auto-entrepreneur: non indépendant: non contrat salarié: oui contrat salarié . assimilé salarié: oui diff --git a/source/components/simulationConfigs/auto-entrepreneur.yaml b/source/components/simulationConfigs/auto-entrepreneur.yaml index 53c8ae3d3..03e135edb 100644 --- a/source/components/simulationConfigs/auto-entrepreneur.yaml +++ b/source/components/simulationConfigs/auto-entrepreneur.yaml @@ -11,7 +11,7 @@ questions à l'affiche: Commerçant, artisan, ou libéral ?: entreprise . catégorie d'activité situation: - micro entreprise: oui + auto-entrepreneur: oui indépendant: non contrat salarié: non période: année diff --git a/source/components/simulationConfigs/indépendant.yaml b/source/components/simulationConfigs/indépendant.yaml index a55522311..508984b96 100644 --- a/source/components/simulationConfigs/indépendant.yaml +++ b/source/components/simulationConfigs/indépendant.yaml @@ -12,6 +12,6 @@ questions à l'affiche: situation: indépendant: oui - micro entreprise: non + auto-entrepreneur: non contrat salarié: non période: année diff --git a/source/components/simulationConfigs/rémunération-dirigeant.yaml b/source/components/simulationConfigs/rémunération-dirigeant.yaml index b5e25b2c7..2cf9ed94b 100644 --- a/source/components/simulationConfigs/rémunération-dirigeant.yaml +++ b/source/components/simulationConfigs/rémunération-dirigeant.yaml @@ -16,17 +16,17 @@ situation: branches: - nom: Auto-entrepreneur situation: - micro entreprise: oui + auto-entrepreneur: oui indépendant: non contrat salarié: non - nom: Indépendant situation: indépendant: oui - micro entreprise: non + auto-entrepreneur: non contrat salarié: non - nom: Assimilé salarié situation: - micro entreprise: non + auto-entrepreneur: non indépendant: non contrat salarié: oui contrat salarié . assimilé salarié: oui diff --git a/source/components/simulationConfigs/salarié.yaml b/source/components/simulationConfigs/salarié.yaml index a23231b29..2a8fa9c48 100644 --- a/source/components/simulationConfigs/salarié.yaml +++ b/source/components/simulationConfigs/salarié.yaml @@ -14,5 +14,5 @@ situation: contrat salarié: oui contrat salarié . assimilé salarié: non indépendant: non - micro entreprise: non + auto-entrepreneur: non période: mois diff --git a/source/components/utils/withColours.js b/source/components/utils/withColours.js index 2c469fcc4..6b69b5cae 100644 --- a/source/components/utils/withColours.js +++ b/source/components/utils/withColours.js @@ -1,7 +1,7 @@ /* @flow */ -import convert from 'color-convert'; -import React, { Component, createContext } from 'react'; +import convert from 'color-convert' +import React, { Component, createContext } from 'react' import type { ComponentType } from 'react' export type ThemeColours = { @@ -16,9 +16,8 @@ export type ThemeColours = { lightColour: string, lighterColour: string, lightestColour: string, - darkestColour: string, -}; - + darkestColour: string +} /* Hex to RGB conversion: @@ -29,12 +28,11 @@ let cutHex = h => (h.charAt(0) == '#' ? h.substring(1, 7) : h), hexToG = h => parseInt(cutHex(h).substring(2, 4), 16), hexToB = h => parseInt(cutHex(h).substring(4, 6), 16) - /* Given a background color, should you write on it in black or white ? Taken from http://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color#comment61936401_3943023 */ - function findContrastedTextColour(color, simple) { +function findContrastedTextColour(color, simple) { let r = hexToR(color), g = hexToG(color), b = hexToB(color) @@ -44,8 +42,8 @@ let cutHex = h => (h.charAt(0) == '#' ? h.substring(1, 7) : h), return r * 0.299 + g * 0.587 + b * 0.114 > 128 ? '#000000' : '#ffffff' } // else complex formula let uicolors = [r / 255, g / 255, b / 255], - c = uicolors.map( - c => (c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)) + c = uicolors.map(c => + c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4) ), L = 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2] @@ -56,8 +54,7 @@ const lightenColour = (hex, x) => { const [h, s, l] = convert.hex.hsl(hex.split('#')[1]) return '#' + convert.hsl.hex([h, s, Math.max(2, Math.min(l + x, 98))]) } -const generateTheme = (themeColour?: ?string) : ThemeColours => { - +const generateTheme = (themeColour?: ?string): ThemeColours => { let // Use the default theme colour if the host page hasn't made a choice colour = themeColour || '#2975D1', lightColour = lightenColour(colour, 10), @@ -90,15 +87,19 @@ const generateTheme = (themeColour?: ?string) : ThemeColours => { } } -const ThemeColoursContext = createContext(generateTheme()) +const ThemeColoursContext: React$Context = createContext( + generateTheme() +) type ProviderProps = { - colour: string, + colour: string } -export const ThemeColoursProvider = ({ colour, ...props}: ProviderProps) => +export const ThemeColoursProvider = ({ colour, ...props }: ProviderProps) => ( + +) export default function withThemeColours( - WrappedComponent: ComponentType -) { + WrappedComponent: React$ComponentType +): React$ComponentType<$Diff> { class WithThemeColours extends Component< $Diff > { @@ -106,9 +107,7 @@ export default function withThemeColours( render() { return ( - {colours => ( - - )} + {colours => } ) } diff --git a/source/components/utils/withSitePaths.js b/source/components/utils/withSitePaths.js index 67e33a0e1..2e36d5204 100644 --- a/source/components/utils/withSitePaths.js +++ b/source/components/utils/withSitePaths.js @@ -1,16 +1,15 @@ /* @flow */ import React, { Component, createContext } from 'react' -import type { ComponentType } from 'react' export type SitePaths = Object -const SitePathsContext = createContext({}) +const SitePathsContext: React$Context = createContext({}) export const SitePathProvider = SitePathsContext.Provider export default function withSitePaths( - WrappedComponent: ComponentType -) { + WrappedComponent: React$ComponentType +): React$ComponentType<$Diff> { class WithSitePaths extends Component< $Diff > { diff --git a/source/components/utils/withTracker.js b/source/components/utils/withTracker.js index 73df78781..78dfda531 100644 --- a/source/components/utils/withTracker.js +++ b/source/components/utils/withTracker.js @@ -1,7 +1,6 @@ /* @flow */ -import React, { Component, createContext } from 'react' -import type { ComponentType } from 'react' +import React, { createContext } from 'react' export type Tracker = { push: ( @@ -15,21 +14,17 @@ export const defaultTracker: Tracker = { push: (console && console.log && console.log.bind(console)) || (() => {}), // eslint-disable-line no-console connectToHistory: history => history } -const TrackerContext = createContext(defaultTracker) - +const TrackerContext: React$Context = createContext(defaultTracker) export const TrackerProvider = TrackerContext.Provider -export default function withTracker( - WrappedComponent: ComponentType -) { - class WithTracker extends Component<$Diff> { - displayName = `withTracker(${WrappedComponent.displayName || ''})` - render() { - return ( - - {tracker => } - - ) - } + +export default function withTracker( + Component: React$ComponentType +): React$ComponentType<$Diff> { + return function ConnectTracker(props: $Diff) { + return ( + + {(tracker: Tracker) => } + + ) } - return WithTracker } diff --git a/source/engine/generateQuestions.js b/source/engine/generateQuestions.js index c55020045..aa367db01 100644 --- a/source/engine/generateQuestions.js +++ b/source/engine/generateQuestions.js @@ -1,31 +1,11 @@ -import formValueTypes from 'Components/conversation/formValueTypes' -import Input from 'Components/conversation/Input' -import Question from 'Components/conversation/Question' -import SelectGéo from 'Components/conversation/select/SelectGéo' -import SelectAtmp from 'Components/conversation/select/SelectTauxRisque' -import { - add, - countBy, - descend, - flatten, - fromPairs, - head, - identity, - is, - keys, - map, - mergeWith, - pair, - pick, - prop, - reduce, - sortWith, - toPairs, - unless, - values -} from 'ramda' -import React from 'react' -import { findRuleByDottedName, queryRule } from './rules' +import formValueTypes from 'Components/conversation/formValueTypes'; +import Input from 'Components/conversation/Input'; +import Question from 'Components/conversation/Question'; +import SelectGéo from 'Components/conversation/select/SelectGéo'; +import SelectAtmp from 'Components/conversation/select/SelectTauxRisque'; +import { add, countBy, descend, flatten, fromPairs, head, identity, is, keys, map, mergeWith, pair, pick, prop, reduce, sortWith, toPairs, unless, values } from 'ramda'; +import React from 'react'; +import { findRuleByDottedName, queryRule } from './rules'; /* COLLECTE DES VARIABLES MANQUANTES @@ -65,7 +45,6 @@ export let getNextSteps = missingVariablesByTarget => { ), pairs = toPairs(missingByCompound), sortedPairs = sortWith([descend(byCount), descend(byScore)], pairs) - return map(head, sortedPairs) } diff --git a/source/engine/index.js b/source/engine/index.js index 6fa8daac8..377cdb13f 100644 --- a/source/engine/index.js +++ b/source/engine/index.js @@ -1,12 +1,7 @@ // This file exports the functions of the public computing library -import { analyseMany, parseAll } from './traverse.js' -import { - rulesFr, - collectDefaults, - nestedSituationToPathMap, - enrichRule -} from './rules' -import { safeLoad } from 'js-yaml' +import { safeLoad } from 'js-yaml'; +import { collectDefaults, enrichRule, nestedSituationToPathMap, rulesFr } from './rules'; +import { analyseMany, parseAll } from './traverse.js'; // The public evaluation function takes a nested object of input values let nestedSituationToStateSelector = rules => nestedSituation => dottedName => @@ -34,7 +29,6 @@ export default { parseAll(rules), Array.isArray(targetInput) ? targetInput : [targetInput] )(nestedSituationToStateSelector(rules)(nestedSituation)) - if (config?.debug) return evaluation let values = evaluation.targets.map(t => t.nodeValue) diff --git a/source/engine/traverse.js b/source/engine/traverse.js index 7ff44db1d..7bd50c53d 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -256,7 +256,7 @@ export let treatRuleRoot = (rules, rule) => { if (level === 'bloquant' && !isInputControl) { throw new Error( - `Un contrôle ne peut être bloquant et invoquer des calculs de variables : + `Un contrôle ne peut être bloquant et invoquer des calculs de variables : ${control['si']} ${level} ` @@ -367,7 +367,6 @@ export let analyseMany = (parsedRules, targetNames) => situationGate => { // TODO: we should really make use of namespaces at this level, in particular // setRule in Rule.js needs to get smarter and pass dottedName let cache = { parseLevel: 0 } - // These controls do not trigger the evaluation of variables of the system : they are input controls // This is necessary because our evaluation implementation is not yet fast enough to not freeze slow mobile devices // They could be implemented directly at the redux-form level, but they should also be triggered by the engine used as a library diff --git a/source/engine/treatVariable.js b/source/engine/treatVariable.js index 8dd4d84a2..48f841eb8 100644 --- a/source/engine/treatVariable.js +++ b/source/engine/treatVariable.js @@ -41,6 +41,7 @@ export let treatVariable = (rules, rule, filter) => parseResult => { ) return cache[cacheName] } + const variableScore = variable.defaultValue ? 1 : 2; // SITUATION 1 : La variable est directement renseignée if (situationValue != null) return cacheAndNode(situationValue, {}) @@ -51,14 +52,14 @@ export let treatVariable = (rules, rule, filter) => parseResult => { // SITUATION 3 : La variable est une question sans condition dont la valeur n'a pas été renseignée if (situationValue == null && !variableHasFormula && !variableHasCond) - return cacheAndNode(null, { [dottedName]: 1 }) + return cacheAndNode(null, { [dottedName]: variableScore }) // SITUATION 4 : La variable est une question avec conditions if (situationValue == null && !variableHasFormula && variableHasCond) { // SITUATION 4.1 : La condition est connue et vrai if (explanation.isApplicable) return variable.question - ? cacheAndNode(null, { [dottedName]: 1 }) + ? cacheAndNode(null, { [dottedName]: variableScore }) : cacheAndNode(true, {}) // SITUATION 4.2 : La condition est connue et fausse @@ -67,7 +68,7 @@ export let treatVariable = (rules, rule, filter) => parseResult => { if (explanation.isApplicable == null) return cacheAndNode(null, { ...explanation.missingVariables, - ...(variable.question ? { [dottedName]: 1 } : {}) + ...(variable.question ? { [dottedName]: variableScore } : {}) }) } } diff --git a/source/reducers/rootReducer.js b/source/reducers/rootReducer.js index 74344a7a0..b962ca76f 100644 --- a/source/reducers/rootReducer.js +++ b/source/reducers/rootReducer.js @@ -1,7 +1,6 @@ /* @flow */ import { compose, defaultTo, isNil, lensPath, over, set, uniq, without } from 'ramda'; -// $FlowFixMe import reduceReducers from 'reduce-reducers'; import { combineReducers } from 'redux'; // $FlowFixMe diff --git a/source/règles/base.yaml b/source/règles/base.yaml index 027b7769d..6ff997a75 100644 --- a/source/règles/base.yaml +++ b/source/règles/base.yaml @@ -660,6 +660,7 @@ - nom: contrat salarié icônes: 📄 question: Activité salariée ? + par défaut: oui description: | Le contrat qui lie une entreprise (via son établissement) à un individu, qui est alors son salarié. @@ -2494,7 +2495,7 @@ formule: somme: - revenu abattu par défaut - - micro entreprise . impôt . revenu abattu + - autoentrepreneur . impôt . revenu abattu - espace: impôt nom: revenu abattu par défaut @@ -2550,7 +2551,7 @@ somme: - contrat salarié . salaire . net - indépendant . revenu net de cotisations - - micro entreprise . revenu net de cotisations + - autoentrepreneur . revenu net de cotisations - nom: revenu net d'impôt titre: Revenu net de cotisations et d'impôt @@ -2576,7 +2577,7 @@ format: euros formule: variations: - - si: micro entreprise + - si: autoentrepreneur alors: inversion numérique: avec: @@ -2591,7 +2592,7 @@ somme: - contrat salarié . rémunération . total - indépendant . revenu brut - - micro entreprise . base des cotisations + - autoentrepreneur . base des cotisations - espace: entreprise nom: charges @@ -2622,7 +2623,7 @@ - espace: entreprise nom: charges non déductibles - applicable si: micro entreprise + applicable si: autoentrepreneur formule: charges période: flexible @@ -2681,6 +2682,7 @@ nom: restauration ou hébergement - nom: indépendant + par défaut: non question: Activité à la sécurité sociale des indépendants ? - espace: indépendant @@ -2904,11 +2906,12 @@ période: flexible formule: revenu net de cotisations + prélèvements . CSG et CRDS (non déductible) -- nom: micro entreprise - icônes: μ +- nom: autoentrepreneur + icônes: 🚶 + par défaut: non question: Activité en auto-entrepreneur ? -- espace: micro entreprise +- espace: autoentrepreneur nom: base des cotisations formule: entreprise . chiffre d'affaires période: flexible @@ -2917,7 +2920,7 @@ message: Seuil de chiffre d'affaires dépassé niveau: avertissement -- espace: micro entreprise +- espace: autoentrepreneur nom: plafond période: année formule: @@ -2928,13 +2931,13 @@ alors: 70000 - sinon: 170000 -- espace: micro entreprise +- espace: autoentrepreneur nom: revenu net de cotisations titre: Revenu net d'une auto-entrepreneur formule: base des cotisations - cotisations période: flexible -- espace: micro entreprise +- espace: autoentrepreneur nom: cotisations période: flexible formule: @@ -2948,7 +2951,7 @@ alors: 22% - sinon: 12.8% -- espace: micro entreprise . impôt +- espace: autoentrepreneur . impôt nom: abattement période: flexible formule: @@ -2962,7 +2965,7 @@ alors: 50% - sinon: 71% -- espace: micro entreprise . impôt +- espace: autoentrepreneur . impôt nom: revenu abattu période: flexible formule: base des cotisations - abattement diff --git a/source/règles/co2.yaml b/source/règles/co2.yaml index 3bc49b611..af3af5c51 100644 --- a/source/règles/co2.yaml +++ b/source/règles/co2.yaml @@ -1,7 +1,7 @@ -# espace de nom implicite : douche -# non bloquant : +# espace de nom implicite : douche +# non bloquant : # - période: semaine -# bloquant : +# bloquant : # - ? - nom: douche @@ -12,7 +12,7 @@ icônes: 🍃 période: flexible unité: kgCO2eq - formule: impact par douche * douche . nombre + formule: impact par douche * douche . nombre - espace: douche nom: nombre @@ -31,49 +31,43 @@ nom: impact par litre formule: eau . impact par litre froid + chauffage . impact par litre - - espace: douche icônes: 🇱 nom: litres d'eau - formule: - durée de la douche * litres par minute + formule: durée de la douche * litres par minute - espace: douche nom: litres par minute - formule: - variations: + formule: + variations: - si: pomme de douche économe alors: 9 - sinon: 18 - références: - économise l'eau: https://www.jeconomiseleau.org/index.php/particuliers/economies-par-usage/la-douche-et-le-bain - + références: + économise l'eau: https://www.jeconomiseleau.org/index.php/particuliers/economies-par-usage/la-douche-et-le-bain - espace: douche nom: pomme de douche économe question: Utilisez-vous une pomme de douche économe ? par défaut: non - - nom: eau icônes: 💧 - espace: eau nom: impact par litre froid - unité: kgCO2eq/l + unité: kgCO2eq/l formule: 0.000132 - - nom: chauffage icônes: 🔥 - - espace: chauffage nom: type question: Comment est chauffée votre eau ? - formule: - une possibilité: - choix obligatoire: oui + formule: + une possibilité: + choix obligatoire: oui possibilités: - gaz - fioul @@ -95,21 +89,21 @@ - espace: chauffage nom: impact par kWh unité: kgCO2eq/kWh PCI - formule: - variations: + formule: + variations: - si: type = 'gaz' alors: 0.227 - si: type = 'fioul' alors: 0.324 - si: type = 'électricité' - alors: 0.059 + alors: 0.059 - notes: | - La base carbone de l'ADEME ne permet malheureusement pas de faire des liens profonds vers les chiffres utilisés. + notes: | + La base carbone de l'ADEME ne permet malheureusement pas de faire des liens profonds vers les chiffres utilisés. Pour l'électricité, nous retenons le chiffre de l'ADEME "Electricité - 2016 - usage : Eau Chaude Sanitaire - consommation". - références: - base carbone ADEME: http://www.bilans-ges.ademe.fr/fr/accueil + références: + base carbone ADEME: http://www.bilans-ges.ademe.fr/fr/accueil électricité: https://www.electricitymap.org/?page=country&solar=false&remote=true&wind=false&countryCode=FR électricité sur Décrypter l'Energie: https://decrypterlenergie.org/decryptage-quel-est-le-contenu-en-co2-du-kwh-electrique @@ -117,29 +111,27 @@ nom: énergie consommée par litre formule: 0.0325 unité: kWh - références: + références: analyse du prix d'une douche: https://www.econologie.com/forums/plomberie-et-sanitaire/prix-reel-d-un-bain-ou-d-une-douche-pour-l-eau-et-chauffage-t12727.html - - espace: chauffage nom: impact par litre - formule: impact par kWh * énergie consommée par litre + formule: impact par kWh * énergie consommée par litre # Meilleure syntaxe : nouveau mécanisme correspondance # mais où désigne-t-on ce sur quoi la correspondance se fait ? Est-ce implicite ? Ici le chauffage. -# formule: -# correspondance: - # gaz: 30 - # fioul: 50 - # électricité: 2 - +# formule: +# correspondance: +# gaz: 30 +# fioul: 50 +# électricité: 2 - espace: douche nom: durée de la douche question: Combien de temps dure votre douche en général ? format: nombre par défaut: 5 - suggestions: + suggestions: expresse: 5 moyenne: 10 lente: 20 diff --git a/source/selectors/analyseSelectors.js b/source/selectors/analyseSelectors.js index 6a4431833..03a1ccd21 100644 --- a/source/selectors/analyseSelectors.js +++ b/source/selectors/analyseSelectors.js @@ -1,3 +1,4 @@ + import { collectMissingVariablesByTarget, getNextSteps } from 'Engine/generateQuestions'; import { collectDefaults, disambiguateExampleSituation, findRuleByDottedName, formatInputs, nestedSituationToPathMap, rules as baseRulesEn, rulesFr as baseRulesFr } from 'Engine/rules'; import { analyse, analyseMany, parseAll } from 'Engine/traverse'; @@ -5,7 +6,6 @@ import { add, contains, difference, equals, head, intersection, isNil, mergeDeep import { getFormValues } from 'redux-form'; import { createSelector, createSelectorCreator, defaultMemoize } from 'reselect'; import { mapOrApply, softCatch } from '../utils'; - // create a "selector creator" that uses deep equal instead of === const createDeepEqualSelector = createSelectorCreator(defaultMemoize, equals) @@ -17,7 +17,8 @@ const createDeepEqualSelector = createSelectorCreator(defaultMemoize, equals) * */ -export let flatRulesSelector = createSelector( +export let flatRulesSelector + = createSelector( state => state.lang, (state, props) => props && props.rules, (lang, rules) => rules || (lang === 'en' ? baseRulesEn : baseRulesFr) @@ -89,7 +90,7 @@ const createSituationBrancheSelector = situationSelector => if (configSituation) { return { ...configSituation, ...situation } } - return situation + return situation || {} } ) diff --git a/source/selectors/companyStatusSelectors.js b/source/selectors/companyStatusSelectors.js index 749a831fe..5818ebf73 100644 --- a/source/selectors/companyStatusSelectors.js +++ b/source/selectors/companyStatusSelectors.js @@ -113,14 +113,11 @@ const isCompatibleStatusWith = (answers: LegalStatusRequirements) => ( statusRequirements: LegalStatusRequirements ): boolean => { const stringify = map(x => (!isNil(x) ? JSON.stringify(x) : x)) - // $FlowFixMe const answerCompatibility = Object.values( mergeWith( (answer, statusValue) => isNil(answer) || isNil(statusValue) || answer === statusValue, - // $FlowFixMe stringify(statusRequirements), - // $FlowFixMe stringify(answers) ) ) diff --git a/source/selectors/ficheDePaieSelectors.js b/source/selectors/ficheDePaieSelectors.js index e9d1b0ea4..896405433 100644 --- a/source/selectors/ficheDePaieSelectors.js +++ b/source/selectors/ficheDePaieSelectors.js @@ -115,7 +115,7 @@ const groupByBranche = (règleLocaliséeSelector: string => Règle) => ( return COTISATION_BRANCHE_ORDER.map(branche => [ règleLocaliséeSelector(branche), // $FlowFixMe - cotisationsMap[branche] + cotisathe] ]) } const analysisToCotisations = ( diff --git a/source/selectors/progressSelectors.js b/source/selectors/progressSelectors.js index e6214f7c8..7d88b9181 100644 --- a/source/selectors/progressSelectors.js +++ b/source/selectors/progressSelectors.js @@ -68,6 +68,7 @@ const hiringProgressSelector = state => { return (100 * hiringChecklist.filter(Boolean).length) / hiringChecklist.length } +// $FlowFixMe export default createStructuredSelector({ companyProgress: companyProgressSelector, estimationProgress: estimationProgressSelector, diff --git a/source/selectors/regleSelectors.js b/source/selectors/regleSelectors.js index cd6e5a1de..462652a8e 100644 --- a/source/selectors/regleSelectors.js +++ b/source/selectors/regleSelectors.js @@ -17,10 +17,15 @@ import type { RègleAvecValeur } from 'Types/RegleTypes' import type { Analysis } from 'Types/Analysis' +import type { InputSelector } from 'reselect' -export const règleLocaliséeSelector = createSelector( +export const règleLocaliséeSelector: InputSelector< + { lang: string }, + { rules?: FlatRules }, + (dottedName: string) => Règle +> = createSelector( flatRulesSelector, - (localizedFlatRules: FlatRules) => (dottedName: string): Règle => { + (localizedFlatRules: ?FlatRules) => (dottedName: string): Règle => { if (!localizedFlatRules) { throw new Error( `[LocalizedRègleSelector] Les localizedFlatRules ne doivent pas être 'undefined' ou 'null'` @@ -46,7 +51,11 @@ export const règleLocaliséeSelector = createSelector( } ) -export const règleValeurSelector = createSelector( +export const règleValeurSelector: InputSelector< + { lang: string }, + { rules?: FlatRules }, + (dottedName: string) => RègleValeur +> = createSelector( branchAnalyseSelector, validatedSituationBranchesSelector, règleLocaliséeSelector, @@ -84,7 +93,7 @@ export const règleValeurSelector = createSelector( if (typeof valeur === 'boolean') { return { type: 'boolean', valeur } } - if (rule?.API || rule?.explanation?.API) { + if (rule && (rule.API || rule.explanation?.API)) { //TODO This code is specific to the géo API return { type: 'string', valeur: valeur.nom } } @@ -94,7 +103,6 @@ export const règleValeurSelector = createSelector( (!Number.isNaN(valeur) && Number.isNaN(Number.parseFloat(valeur)) ? 'string' : 'number') - // $FlowFixMe return { type, valeur: @@ -105,7 +113,11 @@ export const règleValeurSelector = createSelector( } ) -export const règleAvecMontantSelector = createSelector( +export const règleAvecMontantSelector: InputSelector< + { lang: string }, + { rules?: FlatRules }, + (dottedName: string) => RègleAvecMontant +> = createSelector( règleValeurSelector, règleLocaliséeSelector, (règleValeur, règleLocalisée) => (dottedName: string): RègleAvecMontant => { @@ -121,13 +133,17 @@ export const règleAvecMontantSelector = createSelector( } } ) -export const règleAvecValeurSelector = createSelector( +export const règleAvecValeurSelector: InputSelector< + { lang: string }, + { rules?: FlatRules }, + (dottedName: string) => RègleAvecValeur +> = createSelector( règleValeurSelector, règleLocaliséeSelector, (règleValeur, règleLocalisée) => (dottedName: string): RègleAvecValeur => // $FlowFixMe ({ - ...règleValeur(dottedName), - ...règleLocalisée(dottedName) + ...règleLocalisée(dottedName), + ...règleValeur(dottedName) }) ) diff --git a/source/selectors/repartitionSelectors.js b/source/selectors/repartitionSelectors.js index acabe35c8..7b812c7d0 100644 --- a/source/selectors/repartitionSelectors.js +++ b/source/selectors/repartitionSelectors.js @@ -118,8 +118,7 @@ const répartition = ( ) const { salaireNet, salaireChargé, réductionsDeCotisations } = ficheDePaie let CSG - const autresCotisations = - cotisations['protection sociale . autres'] + const autresCotisations = cotisations['protection sociale . autres'] if (autresCotisations) { CSG = autresCotisations.find(({ id }) => id === 'contrat salarié . CSG') if (!CSG) @@ -130,6 +129,7 @@ const répartition = ( ) } + // $FlowFixMe let répartitionMap: { [Branche]: MontantPartagé } = map( totalCotisations, cotisations @@ -166,6 +166,7 @@ const répartition = ( } } +// $FlowFixMe export default createSelector( FicheDePaieSelectors, règleLocaliséeSelector, diff --git a/source/sites/mycompanyinfrance.fr/pages/Company/AfterRegistration.js b/source/sites/mycompanyinfrance.fr/pages/Company/AfterRegistration.js index 06fec0ea1..923f6f52d 100644 --- a/source/sites/mycompanyinfrance.fr/pages/Company/AfterRegistration.js +++ b/source/sites/mycompanyinfrance.fr/pages/Company/AfterRegistration.js @@ -1,20 +1,21 @@ /* @flow */ -import { React, T } from 'Components'; -import { ScrollToTop } from 'Components/utils/Scroll'; -import withSitePaths from 'Components/utils/withSitePaths'; -import { compose } from 'ramda'; -import { withNamespaces } from 'react-i18next'; -import { connect } from 'react-redux'; -import { Link } from 'react-router-dom'; -import Animate from 'Ui/animate'; -import siret from './siret.jpg'; +import { React, T } from 'Components' +import { ScrollToTop } from 'Components/utils/Scroll' +import withSitePaths from 'Components/utils/withSitePaths' +import { compose } from 'ramda' +import { withNamespaces } from 'react-i18next' +import { connect } from 'react-redux' +import { Link } from 'react-router-dom' +import Animate from 'Ui/animate' +import siret from './siret.jpg' import type { TFunction } from 'react-i18next' +type OwnProps = {} type Props = { companyStatusChoice: string, sitePaths: Object, t: TFunction -} +} & OwnProps const AfterRegistration = ({ t, companyStatusChoice, sitePaths }: Props) => ( @@ -59,7 +60,8 @@ const AfterRegistration = ({ t, companyStatusChoice, sitePaths }: Props) => ( la nomenclature nationale d'activités françaises (code « NAF »).{' '} @@ -106,10 +108,10 @@ const AfterRegistration = ({ t, companyStatusChoice, sitePaths }: Props) => ( ) -export default compose( +export default (compose( connect(state => ({ companyStatusChoice: state.inFranceApp.companyStatusChoice })), withNamespaces(), withSitePaths -)(AfterRegistration) +)(AfterRegistration): React$ComponentType) diff --git a/source/sites/mycompanyinfrance.fr/pages/Company/CompanyStatusNavigation.js b/source/sites/mycompanyinfrance.fr/pages/Company/CompanyStatusNavigation.js index a6a83f62c..8c70610ed 100644 --- a/source/sites/mycompanyinfrance.fr/pages/Company/CompanyStatusNavigation.js +++ b/source/sites/mycompanyinfrance.fr/pages/Company/CompanyStatusNavigation.js @@ -12,7 +12,7 @@ type ownProps = { type Props = ownProps & { goBackToPreviousQuestion: () => void } -export default connect( +export default (connect( null, { goBackToPreviousQuestion } )(({ goBackToPreviousQuestion, onSkip }: Props) => ( @@ -24,4 +24,4 @@ export default connect( {onSkip && }
-)) +)): React$ComponentType) diff --git a/source/sites/mycompanyinfrance.fr/pages/Company/Find.js b/source/sites/mycompanyinfrance.fr/pages/Company/Find.js index 8b1e7cced..8e8f7c238 100644 --- a/source/sites/mycompanyinfrance.fr/pages/Company/Find.js +++ b/source/sites/mycompanyinfrance.fr/pages/Company/Find.js @@ -1,7 +1,6 @@ /* @flow */ import { saveExistingCompanyDetails } from 'Actions/existingCompanyActions' import { React, T } from 'Components' -// $FlowFixMe import withSitePaths from 'Components/utils/withSitePaths' import { compose } from 'ramda' import Helmet from 'react-helmet' @@ -25,8 +24,7 @@ type State = { } type Props = { - // $FlowFixMe - onCompanyDetailsConfirmation: ({ [string]: string }) => void, + //onCompanyDetailsConfirmation: ({ [string]: string }) => void, history: RouterHistory } diff --git a/source/sites/mycompanyinfrance.fr/pages/Company/Home.js b/source/sites/mycompanyinfrance.fr/pages/Company/Home.js index 5235a767c..a28433a61 100644 --- a/source/sites/mycompanyinfrance.fr/pages/Company/Home.js +++ b/source/sites/mycompanyinfrance.fr/pages/Company/Home.js @@ -14,6 +14,7 @@ import type { TFunction } from 'react-i18next' import type { Match, Location } from 'react-router' +type OwnProps = {} type Props = { match: Match, nextQuestionUrl: string, @@ -22,7 +23,7 @@ type Props = { t: TFunction, location: Location, sitePaths: Object -} +} & OwnProps const CreateMyCompany = ({ match, sitePaths, @@ -90,7 +91,7 @@ const CreateMyCompany = ({ ) } -export default compose( +export default (compose( connect( state => ({ nextQuestionUrl: nextQuestionUrlSelector(state), @@ -101,4 +102,4 @@ export default compose( ), withSitePaths, withNamespaces() -)(CreateMyCompany) +)(CreateMyCompany): React$ComponentType) diff --git a/source/sites/mycompanyinfrance.fr/pages/Company/PreviousAnswers.js b/source/sites/mycompanyinfrance.fr/pages/Company/PreviousAnswers.js index 66db6d91e..4b28582ae 100644 --- a/source/sites/mycompanyinfrance.fr/pages/Company/PreviousAnswers.js +++ b/source/sites/mycompanyinfrance.fr/pages/Company/PreviousAnswers.js @@ -30,7 +30,7 @@ const requirementToText = (key, value) => { return value ? Gérant minoritaire : Gérant majoritaire } } - +type OwnProps = {} type Props = LegalStatusRequirements & { goToCompanyStatusChoice: () => void, sitePaths: Object @@ -72,10 +72,10 @@ const PreviousAnswers = ({ ) } -export default compose( +export default (compose( connect( state => state.inFranceApp.companyLegalStatus, { goToCompanyStatusChoice } ), withSitePaths -)(PreviousAnswers) +)(PreviousAnswers): React$ComponentType) diff --git a/source/sites/mycompanyinfrance.fr/sitePaths.js b/source/sites/mycompanyinfrance.fr/sitePaths.js index 22973c3c1..bf27c9a4b 100644 --- a/source/sites/mycompanyinfrance.fr/sitePaths.js +++ b/source/sites/mycompanyinfrance.fr/sitePaths.js @@ -136,14 +136,16 @@ export const generateSiteMap = (sitePaths: Object) => sitePaths ) -const enSiteMap = generateSiteMap(constructLocalizedSitePath('en')).map(path => +type LangLink = Array<{ href: string, hrefLang: 'fr' | 'en'}> +type SiteMap = Array +const enSiteMap:SiteMap = generateSiteMap(constructLocalizedSitePath('en')).map(path => (process.env.EN_SITE || '').replace('${path}', path) ) -const frSiteMap = generateSiteMap(constructLocalizedSitePath('fr')).map(path => +const frSiteMap:SiteMap = generateSiteMap(constructLocalizedSitePath('fr')).map(path => (process.env.FR_SITE || '').replace('${path}', path) ) export const hrefLangLink = { - en: zipObj(enSiteMap, frSiteMap.map(href => [{ href, hrefLang: 'fr' }])), - fr: zipObj(frSiteMap, enSiteMap.map(href => [{ href, hrefLang: 'en' }])) + en: zipObj(enSiteMap, frSiteMap.map(href => [{ href, hrefLang: 'fr' }])), + fr: zipObj(frSiteMap, enSiteMap.map(href => [{ href, hrefLang: 'en' }])) } diff --git a/source/types/RegleTypes.js b/source/types/RegleTypes.js index 3e9b90c9e..ff183e6b3 100644 --- a/source/types/RegleTypes.js +++ b/source/types/RegleTypes.js @@ -13,12 +13,9 @@ export type RègleAvecMontant = Règle & { montant: number } -export type RègleValeur = - | { - valeur: boolean, - type: 'boolean' - } - | { valeur: number, type: 'euros' } - | { valeur: number, type: 'number' } - | { valeur: string, type: 'string' } -export type RègleAvecValeur = Règle & RègleValeur +export type RègleValeur = { + valeur: boolean | number | string, + type: 'boolean' | 'number' | 'string' +} + +export type RègleAvecValeur = RègleValeur & Règle diff --git a/source/utils.js b/source/utils.js index f2f1341ec..7afa65597 100644 --- a/source/utils.js +++ b/source/utils.js @@ -82,7 +82,9 @@ export function softCatch( } } } -export const mapOrApply = (fn, x) => (Array.isArray(x) ? x.map(fn) : fn(x)) +export function mapOrApply(fn: A=>B, x: Array | A): Array | B { + return Array.isArray(x) ? x.map(fn) : fn(x) +} export const constructSitePaths = ( diff --git a/test/companyStatusSelectors.test.js b/test/companyStatusSelectors.test.js index 9cbaa34db..e0cdbf5ae 100644 --- a/test/companyStatusSelectors.test.js +++ b/test/companyStatusSelectors.test.js @@ -6,6 +6,7 @@ const state = companyLegalStatus => ({ inFranceApp: { companyLegalStatus, existingCompanyDetails: null, + companyStatusChoice: null, } }) describe('company status selectors', function() { @@ -15,7 +16,7 @@ describe('company status selectors', function() { state({ liability: 'UNLIMITED_LIABILITY', directorStatus: 'SELF_EMPLOYED', - multipleAssociates: true + multipleAssociates: true, }) ) expect(nextQuestion).to.be.equal(null) diff --git a/test/conversation.test.js b/test/conversation.test.js index 2e9c64e83..0d8337955 100644 --- a/test/conversation.test.js +++ b/test/conversation.test.js @@ -1,14 +1,9 @@ -import { expect } from 'chai' -import dedent from 'dedent-js' -import { enrichRule, rulesFr as rules } from 'Engine/rules' -import { safeLoad } from 'js-yaml' -import { assocPath, merge } from 'ramda' -import reducers from 'Reducers/rootReducer' -import { - currentQuestionSelector, - nextStepsSelector -} from '../source/selectors/analyseSelectors' - +import { expect } from 'chai'; +import { enrichRule, rulesFr as rules } from 'Engine/rules'; +import { assocPath, merge } from 'ramda'; +import reducers from 'Reducers/rootReducer'; +import salariéConfig from '../source/components/simulationConfigs/salarié.yaml'; +import { currentQuestionSelector, nextStepsSelector } from '../source/selectors/analyseSelectors'; let baseState = { conversationSteps: { foldedSteps: [] }, form: { conversation: { values: {} } } @@ -26,7 +21,7 @@ describe('conversation', function() { ], rules = rawRules.map(enrichRule), state = merge(baseState, { - targetNames: ['startHere'] + simulation: { config: { objectifs: ['startHere']}} }), currentQuestion = currentQuestionSelector(state, { rules }) @@ -50,7 +45,7 @@ describe('conversation', function() { rules = rawRules.map(enrichRule) let step1 = merge(baseState, { - targetNames: ['startHere'] + simulation: { config: { objectifs: ['startHere']}} }) let step2 = reducers( assocPath( @@ -95,32 +90,49 @@ describe('conversation', function() { }) it('should first ask for questions without defaults, then those with defaults', function() { - let rawRules = dedent` - - nom: net - formule: brut - cotisation + let rawRules = [ + { nom: 'net', + formule: 'brut - cotisation' + }, + { + nom: 'brut', + question: 'Quel est le salaire brut ?', + format: 'euro' + }, + { + nom: 'cotisation', + formule: { + multiplication: { + assiette: 'brut', + variations: [ + { + si: 'cadre', + alors: { + taux: '77%' + } + }, { + sinon: { + taux: '80%' + } - - nom: brut - format: euro + } + ] - - nom: cotisation - formule: - multiplication: - assiette: brut - variations: - - si: cadre - alors: - taux: 77% - - sinon: - taux: 80% - - nom: cadre - par défaut: non - `, - rules = safeLoad(rawRules).map(enrichRule) + } + } + }, + { + nom: 'cadre', + question: 'Est-ce un cadre ?', + 'par défaut': 'non' + } + ] + , + rules = rawRules.map(enrichRule) let step1 = merge(baseState, { - targetNames: ['net'] + simulation: { config: { objectifs: ['net']}} }) - expect(currentQuestionSelector(step1, { rules })).to.equal('brut') let step2 = reducers( @@ -141,6 +153,7 @@ describe('conversation', function() { describe('real conversation', function() { it('should not have more than X questions', function() { let state = merge(baseState, { + simulation: { config: salariéConfig } }), nextSteps = nextStepsSelector(state, { rules }) diff --git a/test/ficheDePaieSelector.test.js b/test/ficheDePaieSelector.test.js index edbac7706..544911ed6 100644 --- a/test/ficheDePaieSelector.test.js +++ b/test/ficheDePaieSelector.test.js @@ -1,9 +1,9 @@ /* @flow */ -import { expect } from 'chai' -import FicheDePaieSelectors, { - COTISATION_BRANCHE_ORDER -} from 'Selectors/ficheDePaieSelectors' +import { expect } from 'chai'; +import FicheDePaieSelectors, { COTISATION_BRANCHE_ORDER } from 'Selectors/ficheDePaieSelectors'; +// $FlowFixMe +import salariéConfig from 'Components/simulationConfigs/salarié.yaml'; let state = { form: { @@ -14,6 +14,9 @@ let state = { } } }, + simulation: { + config: salariéConfig, + }, conversationStarted: true, conversationSteps: { foldedSteps: [] @@ -25,6 +28,7 @@ let paySlip = null describe('pay slip selector', function() { beforeEach(() => { paySlip = FicheDePaieSelectors(state) + expect(paySlip).not.to.eq(null) }) it('should have cotisations grouped by branches in the proper ordering', function() { diff --git a/test/generateQuestions.test.js b/test/generateQuestions.test.js index 131cccf3f..aaaed90fc 100644 --- a/test/generateQuestions.test.js +++ b/test/generateQuestions.test.js @@ -1,10 +1,7 @@ -import { expect } from 'chai' -import { - collectMissingVariables, - getNextSteps -} from '../source/engine/generateQuestions' -import { enrichRule, rules as realRules } from '../source/engine/rules' -import { analyse, parseAll } from '../source/engine/traverse' +import { expect } from 'chai'; +import { collectMissingVariables, getNextSteps } from '../source/engine/generateQuestions'; +import { enrichRule, rules as realRules } from '../source/engine/rules'; +import { analyse, parseAll } from '../source/engine/traverse'; let stateSelector = () => null @@ -380,6 +377,7 @@ describe('nextSteps', function() { it('should ask "motif CDD" if "CDD" applies', function() { let stateSelector = name => ({ + 'contrat salarié': 'oui', 'contrat salarié . CDD': 'oui', 'contrat salarié . salaire . brut de base': '2300' }[name]) diff --git a/test/indépendants.test.js b/test/indépendants.test.js index 39de3feeb..af9024c6a 100644 --- a/test/indépendants.test.js +++ b/test/indépendants.test.js @@ -1,17 +1,19 @@ -import { expect } from 'chai' -import Syso from '../source/engine/index' -import indeps from '../source/règles/base.yaml' +import { expect } from 'chai'; +import Syso from '../source/engine/index'; describe('indeps', function() { - it('allez là', function() { + it.only('should compute income for indépendant', function() { let values = Syso.evaluate( - ['indépendants . revenu net de cotisations'], - { "chiffre d'affaires": 100000 }, - { - base: indeps - } + ['revenu disponible'], + { "entreprise . chiffre d'affaires": 70000, + 'entreprise . charges' : 2000, + indépendant: 'oui', + 'auto-entrepreneur': 'non', + 'contrat salarié': 'non', + période: 'année' + } ) - expect(values[0]).to.equal(201) + expect(values[0]).to.equal(42166) }) }) diff --git a/test/library.test.js b/test/library.test.js index 28aaff84f..455ac8c43 100644 --- a/test/library.test.js +++ b/test/library.test.js @@ -1,7 +1,7 @@ -import { expect } from 'chai' -import Syso from '../source/engine/index' -import sasuRules from '../source/règles/sasu.yaml' -import co2 from '../source/règles/co2.yaml' +import { expect } from 'chai'; +import Syso from '../source/engine/index'; +import co2 from '../source/règles/co2.yaml'; +import sasuRules from '../source/règles/sasu.yaml'; describe('library', function() { it('should evaluate one target with no input data', function() { @@ -141,6 +141,6 @@ describe('library', function() { { base: co2, debug: false } ) //console.log(JSON.stringify(value.targets[0], null, 4)) - expect(value).to.be.within(40, 41) + expect(value).to.be.within(20, 21) }) }) diff --git a/yarn.lock b/yarn.lock index 3773e05b7..ef082151a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -729,9 +729,9 @@ lodash.once "^4.1.1" "@octokit/rest@^15.2.6": - version "15.18.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.0.tgz#e6de702b57dec94c71e806f1cff0ecb9725b3054" - integrity sha512-D1dDJMbvT4dok9++vc8uwCr92ndadwfz6vHK+IklzBHKSsuLlhpv2/dzx97Y4aRlm0t74LeXKDp4j0b4M2vmQw== + version "15.18.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.1.tgz#ec7fb0f8775ef64dc095fae6635411d3fbff9b62" + integrity sha512-g2tecjp2TEtYV8bKAFvfQtu+W29HM7ektmWmw8zrMy9/XCKDEYRErR2YvvhN9+IxkLC4O3lDqYP4b6WgsL6Utw== dependencies: before-after-hook "^1.1.0" btoa-lite "^1.0.0" @@ -1036,6 +1036,7 @@ acorn@^6.0.1, acorn@^6.0.2: agent-base@4, agent-base@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: es6-promisify "^5.0.0" @@ -1043,7 +1044,12 @@ 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.0.0, ajv-keywords@^3.1.0: +ajv-keywords@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.3.0.tgz#cb6499da9b83177af8bc1732b2f0a1a1a3aacf8c" + integrity sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g== + +ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" @@ -1066,9 +1072,9 @@ ajv@^5.1.0, ajv@^5.3.0: json-schema-traverse "^0.3.0" ajv@^6.0.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" - integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww== + version "6.7.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" + integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -1247,10 +1253,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" @@ -1259,6 +1267,7 @@ ansi-styles@^2.2.1: ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" @@ -1548,6 +1557,7 @@ balanced-match@^0.4.2: 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" @@ -1572,14 +1582,14 @@ bcrypt-pbkdf@^1.0.0: tweetnacl "^0.14.3" before-after-hook@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.2.0.tgz#1079c10312cd4d4ad0d1676d37951ef8bfc3a563" - integrity sha512-wI3QtdLppHNkmM1VgRVLCrlWCKk/YexlPicYbXPs4eYdd1InrUCTFsx5bX1iUQzzMsoRXXPpM1r+p7JEJJydag== + version "1.3.2" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.3.2.tgz#7bfbf844ad670aa7a96b5a4e4e15bd74b08ed66b" + integrity sha512-zyPgY5dgbf99c0uGUjhY4w+mxqEGxPKg9RQDl34VvrVh2bM31lFN+mwR1ZHepq/KA3VCPk1gwJZL6IIJqjLy2w== big-integer@^1.6.17: - version "1.6.40" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.40.tgz#02e4cd4d6e266c4d9ece2469c05cb6439149fc78" - integrity sha512-CjhtJp0BViLzP1ZkEnoywjgtFQXS2pomKjAJtIISTCnuHILkLcAXLdFLG/nxsHc4s9kJfc+82Xpg8WNyhfACzQ== + version "1.6.41" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.41.tgz#6fb0e51bc8661129ef3832d46c939170b81ca794" + integrity sha512-d5AT9lMTYJ/ZE/4gzxb+5ttPcRWljVsvv7lF1w9KzkPhVUhBtHrjDo1J8swfZKepfLsliDhYa31zRYwcD0Yg9w== big.js@^3.1.3: version "3.2.0" @@ -1656,6 +1666,7 @@ boxen@1.3.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" @@ -1954,7 +1965,7 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" -chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: +chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: @@ -1972,6 +1983,15 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.1.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + character-entities-legacy@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz#7c6defb81648498222c9855309953d05f4d63a9c" @@ -2167,6 +2187,7 @@ coa@~1.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" @@ -2184,6 +2205,7 @@ color-convert@^1.3.0, color-convert@^1.9.0, color-convert@^1.9.2: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@^1.0.0: version "1.1.4" @@ -2220,9 +2242,9 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" colors@^1.1.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" - integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== colors@~1.1.2: version "1.1.2" @@ -2273,6 +2295,7 @@ component-emitter@^1.2.1: 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.6.0: version "1.6.0" @@ -2381,15 +2404,15 @@ core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.4.0, core-js@^2.5.7: +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.3.tgz#4b70938bdffdaf64931e66e2db158f0892289c49" + integrity sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ== + +core-js@^2.5.7: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" -core-js@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.0.tgz#1e30793e9ee5782b307e37ffa22da0eacddd84d4" - integrity sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw== - 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" @@ -2689,6 +2712,7 @@ debug@3.1.0, debug@=3.1.0: debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" @@ -2939,6 +2963,7 @@ duplexer2@~0.1.4: duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= duplexify@^3.4.2, duplexify@^3.6.0: version "3.6.1" @@ -3116,10 +3141,12 @@ es6-promise@^3.0.2: es6-promise@^4.0.3: version "4.2.5" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== es6-promisify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= dependencies: es6-promise "^4.0.3" @@ -3137,6 +3164,7 @@ escape-html@~1.0.3: escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, 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" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.11.0: version "1.11.0" @@ -3298,6 +3326,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: execa@0.10.0, execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== dependencies: cross-spawn "^6.0.0" get-stream "^3.0.0" @@ -3467,10 +3496,12 @@ fast-deep-equal@^1.0.0: 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" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 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" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: version "2.0.6" @@ -3615,10 +3646,10 @@ flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" -flow-bin@^0.81.0: - version "0.81.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.81.0.tgz#7f0a733dce1dad3cb1447c692639292dc3d60bf5" - integrity sha512-5e8oL3/5rm3G0Eet3yDCne2R/TLo5Fkn+Z5MtHd4wtz+1miLC35Sgo8XvnbTmiZ9epdTZ1q6GLmJWYh7tUlfGg== +flow-bin@^0.92.0: + version "0.92.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.92.0.tgz#f5bf3e808b17b480e067ac673829ca715a168bea" + integrity sha512-3ErXSAXZZlLV5/QPlaUDCWlDUXop1SiH32ifXL3SEiBwsmGbudCLim+HFVZfkegrn1nB4TcNSkMWtW8SnMPyAQ== flow-typed@^2.4.0: version "2.5.1" @@ -3756,6 +3787,7 @@ 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" @@ -3810,6 +3842,7 @@ gauge@~2.7.3: get-caller-file@^1.0.1: 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-func-name@^2.0.0: version "2.0.0" @@ -3826,6 +3859,7 @@ get-stdin@^6.0.0: get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" @@ -3865,9 +3899,10 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -4024,6 +4059,7 @@ has-flag@^2.0.0: has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-symbol-support-x@^1.4.1: version "1.4.2" @@ -4402,6 +4438,7 @@ indexof@0.0.1: 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" @@ -4457,6 +4494,7 @@ invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: 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" @@ -4500,6 +4538,7 @@ is-alphanumerical@^1.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-binary-path@^1.0.0: version "1.0.1" @@ -4596,12 +4635,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-function@^1.0.1: version "1.0.1" @@ -4700,6 +4741,7 @@ is-resolvable@^1.1.0: 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" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" @@ -4745,6 +4787,7 @@ 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= isemail@3.x.x: version "3.2.0" @@ -4755,6 +4798,7 @@ isemail@3.x.x: 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= isobject@^2.0.0: version "2.1.0" @@ -4919,6 +4963,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" @@ -4951,6 +4996,7 @@ jsonfile@^3.0.0: jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" @@ -5008,6 +5054,7 @@ lazy-ass@1.6.0: 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" @@ -5262,6 +5309,7 @@ lower-case@^1.1.1: lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lowlight@~1.9.1: version "1.9.2" @@ -5457,12 +5505,14 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: minimatch@3.0.4, 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.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@1.2.0, minimist@^1.1.0, minimist@^1.2.0: version "1.2.0" @@ -5531,6 +5581,7 @@ mkdirp@0.5.0: 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" @@ -5597,10 +5648,12 @@ 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" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== mute-stream@0.0.7: version "0.0.7" @@ -5663,6 +5716,7 @@ neo-async@^2.5.0: 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== nise@^1.2.0: version "1.4.5" @@ -5766,9 +5820,9 @@ nopt@^4.0.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" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + version "2.4.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.2.tgz#6b2abd85774e51f7936f1395e45acb905dc849b2" + integrity sha512-YcMnjqeoUckXTPKZSAsPjUPLxH85XotbpqK3w4RyCwdFQSU5FxxBys8buehkSfg0j9fKvV1hn7O0+8reEgkAiw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -5808,6 +5862,7 @@ npm-packlist@^1.1.6: 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" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" @@ -5837,6 +5892,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= nwsapi@^2.0.9: version "2.0.9" @@ -6036,6 +6092,7 @@ p-defer@^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" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-is-promise@^1.1.0: version "1.1.0" @@ -6203,6 +6260,7 @@ path-exists@^3.0.0: 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.2, path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" @@ -6211,6 +6269,7 @@ path-is-inside@1.0.2, path-is-inside@^1.0.1, path-is-inside@^1.0.2: 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" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.6" @@ -6274,6 +6333,7 @@ phin@^2.9.1: pify@^2.0.0, pify@^2.2.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" @@ -6282,12 +6342,14 @@ pify@^3.0.0: 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= pixelmatch@^4.0.0: version "4.0.2" @@ -6654,6 +6716,7 @@ process-nextick-args@~1.0.6: 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== process@^0.11.10: version "0.11.10" @@ -6761,6 +6824,7 @@ punycode@1.3.2: punycode@2.x.x, 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== punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1: version "1.4.1" @@ -7279,6 +7343,7 @@ regenerator-runtime@^0.10.5: regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.12.0: version "0.12.1" @@ -7459,6 +7524,7 @@ request@2.87.0: 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" @@ -7467,6 +7533,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= require-uncached@^1.0.3: version "1.0.3" @@ -7529,7 +7596,14 @@ ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.6.2: + 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.2.8, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -7576,6 +7650,7 @@ rxjs@^6.1.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: 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-eval@^0.3.0: version "0.3.0" @@ -7772,12 +7847,14 @@ shallowequal@^1.0.1, shallowequal@^1.0.2: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 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" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" @@ -7810,6 +7887,7 @@ slice-ansi@0.0.4: slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" @@ -7895,9 +7973,9 @@ space-separated-tokens@^1.0.0: trim "0.0.1" spdx-correct@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" - integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -7916,9 +7994,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" - integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" + integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -8032,6 +8110,7 @@ string-replace-to-array@^1.0.1: 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" @@ -8055,12 +8134,14 @@ string.prototype.trim@^1.1.2: string_decoder@^1.0.0, 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" 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= stringify-object@^3.2.2: version "3.3.0" @@ -8073,12 +8154,14 @@ stringify-object@^3.2.2: 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: 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" @@ -8099,6 +8182,7 @@ strip-comments@^1.0.2: strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" @@ -8136,6 +8220,7 @@ supports-color@^3.2.3: supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" @@ -8257,6 +8342,7 @@ through@^2.3.6, through@^2.3.8, through@~2.3.6: timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: version "2.0.10" @@ -8469,15 +8555,16 @@ unique-slug@^2.0.0: imurmurhash "^0.1.4" universal-user-agent@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.0.2.tgz#b0322da546100c658adcf4965110a56ed238aee6" - integrity sha512-nOwvHWLH3dBazyuzbECPA5uVFNd7AlgviXRHgR4yf48QqitIvpdncRrxMbZNMpPPEfgz30I9ubd1XmiJiqsTrg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.0.3.tgz#9f6f09f9cc33de867bb720d84c08069b14937c6c" + integrity sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g== dependencies: os-name "^3.0.0" universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -8527,6 +8614,7 @@ 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" @@ -8549,6 +8637,7 @@ url-loader@^1.0.1: 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" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= dependencies: prepend-http "^1.0.1" @@ -8582,6 +8671,7 @@ use@^3.1.0: 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: version "1.0.0" @@ -8816,6 +8906,7 @@ which-module@^2.0.0: which@^1.2.9, which@^1.3.0: 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" @@ -8972,6 +9063,7 @@ worker-farm@^1.5.2: 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" @@ -8979,6 +9071,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= write-file-atomic@^1.1.2: version "1.3.4" @@ -9055,6 +9148,7 @@ xtend@^4.0.0, xtend@^4.0.1, 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"