2020-06-14 13:18:16 +02:00
import { last , pipe , range , take } from 'ramda'
2020-05-08 12:04:00 +02:00
import { Rule , Rules } from './types'
2020-03-26 16:03:19 +01:00
2020-06-14 13:18:16 +02:00
const splitName = ( str : string ) = > str . split ( ' . ' )
const joinName = strs = > strs . join ( ' . ' )
2020-03-26 16:03:19 +01:00
export const nameLeaf = pipe ( splitName , last )
export const encodeRuleName = name = >
2020-05-08 12:04:00 +02:00
name
2020-09-02 01:47:30 +02:00
? . replace ( /\s\.\s/g , '/' )
2020-05-08 12:04:00 +02:00
. replace ( /-/g , '\u2011' ) // replace with a insecable tiret to differenciate from space
. replace ( /\s/g , '-' )
2020-04-30 17:13:45 +02:00
export const decodeRuleName = name = >
2020-05-08 12:04:00 +02:00
name
. replace ( /\//g , ' . ' )
. replace ( /-/g , ' ' )
. replace ( /\u2011/g , '-' )
2020-03-30 19:14:03 +02:00
export function ruleParents < Names extends string > (
dottedName : Names
) : Array < Names > {
2020-04-30 17:13:45 +02:00
const fragments = splitName ( dottedName ) // dottedName ex. [CDD . événements . rupture]
2020-03-26 16:03:19 +01:00
return range ( 1 , fragments . length )
2020-03-30 19:14:03 +02:00
. map ( nbEl = > take ( nbEl , fragments ) )
2020-03-26 16:03:19 +01:00
. map ( joinName ) // -> [ [CDD . événements . rupture], [CDD . événements], [CDD
. reverse ( )
}
2020-03-30 19:14:03 +02:00
export function disambiguateRuleReference < Names extends string > (
rules : Rules < Names > ,
contextName : Names ,
partialName : string
) {
2020-03-26 16:03:19 +01:00
const possibleDottedName = [
contextName ,
. . . ruleParents ( contextName ) ,
''
] . map ( x = > ( x ? x + ' . ' + partialName : partialName ) )
const dottedName = possibleDottedName . find ( name = > name in rules )
if ( ! dottedName ) {
throw new Error ( ` La référence ' ${ partialName } ' est introuvable.
Vérifiez que l 'orthographe et l' espace de nom sont corrects ` )
}
return dottedName
}
2020-03-30 19:14:03 +02:00
export function findParentDependencies < Names extends string > (
rules : Rules < Names > ,
name : Names
) : Array < Names > {
2020-03-26 16:03:19 +01:00
// A parent dependency means that one of a rule's parents is not just a namespace holder, it is a boolean question. E.g. is it a fixed-term contract, yes / no
// When it is resolved to false, then the whole branch under it is disactivated (non applicable)
// It lets those children omit obvious and repetitive parent applicability tests
2020-03-30 19:14:03 +02:00
return ruleParents ( name )
. map ( parent = > [ parent , rules [ parent ] ] as [ Names , Rule ] )
. filter ( ( [ _ , rule ] ) = > ! ! rule )
. filter (
2020-06-08 17:43:55 +02:00
( [ _ , { question , unité , formule , type } ] ) = >
2020-03-30 19:14:03 +02:00
//Find the first "calculable" parent
( question && ! unité && ! formule ) ||
2020-06-08 17:43:55 +02:00
type === 'groupe' ||
2020-03-26 16:03:19 +01:00
( question && formule ? . [ 'une possibilité' ] !== undefined ) ||
( typeof formule === 'string' && formule . includes ( ' = ' ) ) ||
formule === 'oui' ||
formule === 'non' ||
formule ? . [ 'une de ces conditions' ] ||
formule ? . [ 'toutes ces conditions' ]
2020-03-30 19:14:03 +02:00
)
. map ( ( [ name , _ ] ) = > name )
2020-03-26 16:03:19 +01:00
}
2020-09-17 22:23:11 +01:00
export function ruleWithDedicatedDocumentationPage ( rule ) {
return (
rule . virtualRule !== true &&
rule . type !== 'groupe' &&
rule . type !== 'texte' &&
rule . type !== 'paragraphe' &&
rule . type !== 'notification'
)
}