💚 Répare les tests unitaire, les erreurs flow et les erreurs eslint

pull/439/head
Johan Girod 2019-02-01 13:31:57 +01:00
parent 14b4db355d
commit de2f41ecd4
47 changed files with 503 additions and 387 deletions

View File

@ -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

View File

@ -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",

View File

@ -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',

View File

@ -18,9 +18,9 @@ let Banner = ({ hidden = false, children }: PropTypes) =>
</div>
) : null
export default connect(
export default (connect(
(state: State, { hidden }: PropTypes) => ({
hidden: hidden || state.conversationStarted
}),
{}
)(Banner)
)(Banner): React$ComponentType<PropTypes>)

View File

@ -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) => (
<Animate.fromBottom config={config.gentle}>
<div
className="ui__ full-width"
@ -69,7 +81,8 @@ const ComparativeTargets = connect(state => {
<AutoEntrepreneur
branchIndex={0}
plafondDépassé={
plafondAutoEntrepreneurDépassé && plafondAutoEntrepreneurDépassé.message
plafondAutoEntrepreneurDépassé &&
plafondAutoEntrepreneurDépassé.message
}
/>
<AssimiléSalarié branchIndex={2} />
@ -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{' '}
<Montant

View File

@ -14,10 +14,11 @@ import { isIE } from '../utils'
import './Distribution.css'
import './PaySlip'
import RuleLink from './RuleLink'
import type { ThemeColours } from 'Components/utils/withColours'
import type { Répartition } from 'Types/ResultViewTypes.js'
type Props = ?Répartition & {
colours: { colour: string }
colours: ThemeColours
}
type State = {
branchesInViewport: Array<string>
@ -42,6 +43,7 @@ class Distribution extends Component<Props, State> {
render() {
const {
colours: { colour },
// $FlowFixMe
...distribution
} = this.props
if (!Object.values(distribution).length) {

View File

@ -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<Props> {
'written feedback submitted'
])
e.preventDefault()
// $FlowFixMe
fetch('/', {
method: 'POST',
// $FlowFixMe
@ -88,4 +86,4 @@ class FeedbackForm extends Component<Props> {
}
}
export default compose(withTracker)(FeedbackForm)
export default withTracker(FeedbackForm)

View File

@ -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,

View File

@ -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<Props, State> {
state = {
resultView: this.props.conversationStarted ? 'payslip' : 'distribution'
}
handleClickOnTab = resultView => () => {
handleClickOnTab = (resultView: ResultView) => () => {
this.setState({ resultView })
this.props.tracker.push(['trackEvent', 'results', 'selectView', resultView])
}

View File

@ -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<Props> {
render() {
return (
<>

View File

@ -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'),

View File

@ -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

View File

@ -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

View File

@ -12,6 +12,6 @@ questions à l'affiche:
situation:
indépendant: oui
micro entreprise: non
auto-entrepreneur: non
contrat salarié: non
période: année

View File

@ -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

View File

@ -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

View File

@ -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<ThemeColours> = createContext(
generateTheme()
)
type ProviderProps = {
colour: string,
colour: string
}
export const ThemeColoursProvider = ({ colour, ...props}: ProviderProps) => <ThemeColoursContext.Provider value={generateTheme(colour)} {...props}/>
export const ThemeColoursProvider = ({ colour, ...props }: ProviderProps) => (
<ThemeColoursContext.Provider value={generateTheme(colour)} {...props} />
)
export default function withThemeColours<Props: { colours: ThemeColours }>(
WrappedComponent: ComponentType<Props>
) {
WrappedComponent: React$ComponentType<Props>
): React$ComponentType<$Diff<Props, { colours: ThemeColours }>> {
class WithThemeColours extends Component<
$Diff<Props, { colours: ThemeColours }>
> {
@ -106,9 +107,7 @@ export default function withThemeColours<Props: { colours: ThemeColours }>(
render() {
return (
<ThemeColoursContext.Consumer>
{colours => (
<WrappedComponent {...this.props} colours={colours} />
)}
{colours => <WrappedComponent {...this.props} colours={colours} />}
</ThemeColoursContext.Consumer>
)
}

View File

@ -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<SitePaths> = createContext({})
export const SitePathProvider = SitePathsContext.Provider
export default function withSitePaths<Props: { sitePaths: SitePaths }>(
WrappedComponent: ComponentType<Props>
) {
WrappedComponent: React$ComponentType<Props>
): React$ComponentType<$Diff<Props, {sitePaths: SitePaths}>> {
class WithSitePaths extends Component<
$Diff<Props, { sitePaths: SitePaths }>
> {

View File

@ -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<Tracker> = createContext(defaultTracker)
export const TrackerProvider = TrackerContext.Provider
export default function withTracker<Props: { tracker: Tracker }>(
WrappedComponent: ComponentType<Props>
) {
class WithTracker extends Component<$Diff<Props, { tracker: Tracker }>> {
displayName = `withTracker(${WrappedComponent.displayName || ''})`
render() {
return (
<TrackerContext.Consumer>
{tracker => <WrappedComponent {...this.props} tracker={tracker} />}
</TrackerContext.Consumer>
)
}
export default function withTracker<Config: { tracker: Tracker }>(
Component: React$ComponentType<Config>
): React$ComponentType<$Diff<Config, { tracker: Tracker }>> {
return function ConnectTracker(props: $Diff<Config, { tracker: Tracker }>) {
return (
<TrackerContext.Consumer>
{(tracker: Tracker) => <Component {...props} tracker={tracker} />}
</TrackerContext.Consumer>
)
}
return WithTracker
}

View File

@ -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)
}

View File

@ -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)

View File

@ -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

View File

@ -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 } : {})
})
}
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 || {}
}
)

View File

@ -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)
)
)

View File

@ -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 = (

View File

@ -68,6 +68,7 @@ const hiringProgressSelector = state => {
return (100 * hiringChecklist.filter(Boolean).length) / hiringChecklist.length
}
// $FlowFixMe
export default createStructuredSelector({
companyProgress: companyProgressSelector,
estimationProgress: estimationProgressSelector,

View File

@ -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)
})
)

View File

@ -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,

View File

@ -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) => (
<Animate.fromBottom>
@ -59,7 +60,8 @@ const AfterRegistration = ({ t, companyStatusChoice, sitePaths }: Props) => (
la nomenclature nationale d'activités françaises (code « NAF »).{' '}
<span
style={
companyStatusChoice && companyStatusChoice.match(/auto-entrepreneur|EI/)
companyStatusChoice &&
companyStatusChoice.match(/auto-entrepreneur|EI/)
? { display: 'none' }
: {}
}>
@ -106,10 +108,10 @@ const AfterRegistration = ({ t, companyStatusChoice, sitePaths }: Props) => (
</Animate.fromBottom>
)
export default compose(
export default (compose(
connect(state => ({
companyStatusChoice: state.inFranceApp.companyStatusChoice
})),
withNamespaces(),
withSitePaths
)(AfterRegistration)
)(AfterRegistration): React$ComponentType<OwnProps>)

View File

@ -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(
</button>
{onSkip && <SkipButton onClick={onSkip} />}
</div>
))
)): React$ComponentType<ownProps>)

View File

@ -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
}

View File

@ -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<OwnProps>)

View File

@ -30,7 +30,7 @@ const requirementToText = (key, value) => {
return value ? <T>Gérant minoritaire</T> : <T>Gérant majoritaire</T>
}
}
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<OwnProps>)

View File

@ -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<string>
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<string, LangLink>(enSiteMap, frSiteMap.map(href => [{ href, hrefLang: 'fr' }])),
fr: zipObj<string, LangLink>(frSiteMap, enSiteMap.map(href => [{ href, hrefLang: 'en' }]))
}

View File

@ -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

View File

@ -82,7 +82,9 @@ export function softCatch<ArgType: any, ReturnType: any>(
}
}
}
export const mapOrApply = (fn, x) => (Array.isArray(x) ? x.map(fn) : fn(x))
export function mapOrApply<A, B>(fn: A=>B, x: Array<A> | A): Array<B> | B {
return Array.isArray(x) ? x.map(fn) : fn(x)
}
export const constructSitePaths = (

View File

@ -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)

View File

@ -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 })

View File

@ -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() {

View File

@ -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])

View File

@ -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)
})
})

View File

@ -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)
})
})

176
yarn.lock
View File

@ -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"