From f2eb7fe4d53c5fe608374d03db20754f1887b62b Mon Sep 17 00:00:00 2001 From: fernandoam14 Date: Thu, 13 May 2021 19:49:03 -0300 Subject: [PATCH 01/23] OntoUML 2.0 to Alloy Transformation --- src/libs/ontouml2alloy/class_functions.ts | 252 +++++++++++++ .../ontouml2alloy/generalization_functions.ts | 14 + .../generalization_set_functions.ts | 37 ++ src/libs/ontouml2alloy/index.ts | 6 + src/libs/ontouml2alloy/ontouml2alloy.ts | 331 +++++++++++++++++ src/libs/ontouml2alloy/property_functions.ts | 295 +++++++++++++++ src/libs/ontouml2alloy/relation_functions.ts | 335 ++++++++++++++++++ src/libs/ontouml2alloy/util.ts | 95 +++++ 8 files changed, 1365 insertions(+) create mode 100644 src/libs/ontouml2alloy/class_functions.ts create mode 100644 src/libs/ontouml2alloy/generalization_functions.ts create mode 100644 src/libs/ontouml2alloy/generalization_set_functions.ts create mode 100644 src/libs/ontouml2alloy/index.ts create mode 100644 src/libs/ontouml2alloy/ontouml2alloy.ts create mode 100644 src/libs/ontouml2alloy/property_functions.ts create mode 100644 src/libs/ontouml2alloy/relation_functions.ts create mode 100644 src/libs/ontouml2alloy/util.ts diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts new file mode 100644 index 00000000..48e8f3ee --- /dev/null +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -0,0 +1,252 @@ +import { Class, ClassStereotype, Relation } from '@libs/ontouml'; +import { RelationStereotype } from '@libs/ontouml/model/stereotypes'; +import { Ontouml2Alloy } from '.'; +import { getNameNoSpaces, isTopLevel, getValidAlias } from './util'; + +export function transformClass(transformer: Ontouml2Alloy, _class: Class) { + if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION])) { + return; + } + + if (_class.hasDatatypeStereotype()) { + transformDatatypeClass(transformer, _class); + return; + } + + if (_class.hasEnumerationStereotype()) { + transformEnumerationClass(transformer, _class); + return; + } + + if (_class.isRestrictedToEndurant()) { + transformEndurantClass(transformer, _class); + } + + if (_class.hasRelatorStereotype()) { + transformRelatorConstraint(transformer, _class); + } + + if (_class.isAbstract) { + transformAbstractClass(transformer, _class); + } + + transformWeakSupplementationConstraint(transformer, _class); + transformDisjointNaturesConstraint(transformer, _class); +} + +function transformAbstractClass(transformer: Ontouml2Alloy, _class: Class) { + const className = getNameNoSpaces(_class); + const subtypes = _class.getChildren().map(subtype => 'w.' + getNameNoSpaces(subtype)); + + if (subtypes.length) { + transformer.addFact( + 'fact abstractClass {\n' + + ' all w: World | w.' + className + ' = ' + subtypes.join('+') + '\n' + + '}' + ); + } +} + +function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { + const className = getNameNoSpaces(_class); + let nature = ''; + + if (_class.isRestrictedToSubstantial()) { + nature = 'Object'; + } else if (_class.isRestrictedToMoment()) { + nature = 'Aspect'; + } else { + nature = 'Endurant'; + } + + transformer.addWorldFieldDeclaration( + className + ': set exists:>' + nature + ); + + if (isTopLevel(_class, transformer.model.getAllGeneralizations())) { + if (_class.hasRigidStereotype()) { + transformer.addFact( + 'fact rigid {\n' + + ' rigidity[' + className + ',' + nature + ',exists]\n' + + '}' + ); + } else if (_class.hasAntiRigidStereotype()) { + transformer.addFact( + 'fact antirigid {\n' + + ' antirigidity[' + className + ',' + nature + ',exists]\n' + + '}' + ); + } + } +} + +function transformDatatypeClass(transformer: Ontouml2Alloy, _class: Class) { + const datatypeName = getNameNoSpaces(_class); + transformer.addDatatype([datatypeName, []]); +} + +function transformEnumerationClass(transformer: Ontouml2Alloy, _class: Class) { + const enumName = getNameNoSpaces(_class); + const literals = _class.literals.map(literal => getNameNoSpaces(literal)); + + if (literals.length) { + transformer.addEnum( + 'enum ' + enumName + ' {\n' + + ' ' + literals.join(', ') + + '}' + ); + } +} + +function transformRelatorConstraint(transformer: Ontouml2Alloy, _class: Class) { + const mediations = [] + for (const mediation of transformer.model.getAllRelationsByStereotype(RelationStereotype.MEDIATION)) { + if (mediation.getSource() == _class) { + const mediated = mediation.getTargetEnd(); + let mediatedName = ''; + + if (mediated.getName()) { + mediatedName = getNameNoSpaces(mediated); + } else { + mediatedName = getNameNoSpaces(mediation.getTarget()); + } + + const mediatedAlias = getValidAlias(mediated, mediatedName, transformer.aliases); + mediations.push(mediatedAlias + '[x,w]'); + } + } + + if (mediations.length) { + const relatorName = getNameNoSpaces(_class); + transformer.addFact( + 'fact relatorConstraint {\n' + + ' all w: World, x: w.' + relatorName + ' | #(' + mediations.join('+') + ')>=2\n' + + '}' + ); + } +} + +function transformWeakSupplementationConstraint(transformer: Ontouml2Alloy, _class: Class) { + let parts = []; + + for (const rel of transformer.model.getAllRelations()) { + if (rel.isPartWholeRelation() || rel.hasComponentOfStereotype() || rel.hasMemberOfStereotype() + || rel.hasSubCollectionOfStereotype() || rel.hasSubQuantityOfStereotype()) { + if (rel.getSource() === _class) { + const part = rel.getTargetEnd(); + let partName = ''; + + if (part.getName()) { + partName = getNameNoSpaces(part); + } else { + partName = getNameNoSpaces((part.container as Relation).getTarget()); + } + + const partAlias = getValidAlias(part, partName, transformer.aliases); + parts.push(partAlias + '[x,w]'); + } + } + } + + if (parts.length) { + const wholeName = getNameNoSpaces(_class); + + transformer.addFact( + 'fact weakSupplementationConstraint {\n' + + ' all w: World, x: w.' + wholeName + ' | #(' + parts.join('+') + ')>=2\n' + + '}' + ); + } +} + +function transformDisjointNaturesConstraint(transformer: Ontouml2Alloy, _class: Class) { + if (!isTopLevel(_class, transformer.model.getAllGeneralizations())) { + return; + } + + let differentNaturedClasses = []; + for (const otherClass of transformer.model.getAllClasses()) { + if (isTopLevel(otherClass, transformer.model.getAllGeneralizations()) + && !otherClass.restrictedToContainedIn(_class.restrictedTo)) { + + differentNaturedClasses.push(getNameNoSpaces(otherClass)); + } + } + + if (differentNaturedClasses.length) { + const className = getNameNoSpaces(_class); + if (differentNaturedClasses.length == 1) { + transformer.addWorldFieldFact( + 'disjoint[' + className + ',' + differentNaturedClasses[0] + ']' + ); + } else { + transformer.addWorldFieldFact( + 'disjoint[' + className + ',(' + differentNaturedClasses.join('+') + ')]' + ); + } + } +} + +export function transformAdditionalClassConstraints(transformer: Ontouml2Alloy) { + let objectClasses = []; + let aspectClasses = []; + + for (const _class of transformer.model.getAllClasses()) { + if (_class.isRestrictedToEndurant() && isTopLevel(_class, transformer.model.getAllGeneralizations())) { + const className = getNameNoSpaces(_class); + + if (_class.isRestrictedToSubstantial()) { + objectClasses.push(className); + } else if (_class.isRestrictedToMoment()) { + aspectClasses.push(className); + } else { + objectClasses.push(className); + aspectClasses.push(className); + } + } + } + + if (objectClasses.length) { + transformer.addWorldFieldFact( + 'exists:>Object in ' + objectClasses.join('+') + ); + } + + if (aspectClasses.length) { + transformer.addWorldFieldFact( + 'exists:>Aspect in ' + aspectClasses.join('+') + ); + } +} + +export function transformAdditionalDatatypeConstraints(transformer: Ontouml2Alloy) { + const datatypes = transformer.model.getClassesWithDatatypeStereotype(); + + if (datatypes.length) { + const topLevelDatatypes = [] + for (const datatype of datatypes) { + if (isTopLevel(datatype, transformer.model.getAllGeneralizations())) { + topLevelDatatypes.push(datatype); + } + } + + const datatypesNames = datatypes.map(datatype => getNameNoSpaces(datatype)); + + if (topLevelDatatypes.length >= 2) { + const topLevelDatatypesNames = topLevelDatatypes.map(datatype => getNameNoSpaces(datatype)); + + transformer.addFact( + 'fact additionalDatatypeFacts {\n' + + ' Datatype = ' + datatypesNames.join('+') + '\n' + + ' disjoint[' + topLevelDatatypesNames.join(',') + ']\n' + + '}' + ); + } else { + transformer.addFact( + 'fact additionalDatatypeFacts {\n' + + ' Datatype = ' + datatypesNames.join('+') + '\n' + + '}' + ); + } + } +} diff --git a/src/libs/ontouml2alloy/generalization_functions.ts b/src/libs/ontouml2alloy/generalization_functions.ts new file mode 100644 index 00000000..9586a7f3 --- /dev/null +++ b/src/libs/ontouml2alloy/generalization_functions.ts @@ -0,0 +1,14 @@ +import { Generalization } from '@libs/ontouml'; +import { Ontouml2Alloy } from './'; +import { getNameNoSpaces } from './util'; + +export function transformGeneralization(transformer: Ontouml2Alloy, gen: Generalization) { + const specificName = getNameNoSpaces(gen.specific); + const generalName = getNameNoSpaces(gen.general) + + transformer.addFact( + 'fact generalization {\n' + + ' ' + specificName + ' in ' + generalName + '\n' + + '}' + ); +} diff --git a/src/libs/ontouml2alloy/generalization_set_functions.ts b/src/libs/ontouml2alloy/generalization_set_functions.ts new file mode 100644 index 00000000..9b9c3034 --- /dev/null +++ b/src/libs/ontouml2alloy/generalization_set_functions.ts @@ -0,0 +1,37 @@ +import { Generalization, GeneralizationSet, OntoumlType } from '@libs/ontouml'; +import { Ontouml2Alloy } from './'; +import { getNameNoSpaces } from './util'; + +export function transformGeneralizationSet(transformer: Ontouml2Alloy, genSet: GeneralizationSet) { + if (!genSet.generalizations || genSet.generalizations.length === 0 || (!genSet.isComplete && !genSet.isDisjoint)) { + return; + } + + const classChildren = (genSet.generalizations as Generalization[]) + .map(gen => gen.specific) + .filter(child => child.type === OntoumlType.CLASS_TYPE); + const onlyClassChildren = classChildren.length === genSet.generalizations.length; + + if (!onlyClassChildren) { + return; + } + + const classParents = genSet.generalizations.map((gen: Generalization) => gen.getGeneralClass()); + const onlyClassParent = classParents.length === genSet.generalizations.length; + const parent = genSet.getGeneralClass(); + const uniqueParent = !!parent; + + if (!uniqueParent || !onlyClassParent) { + return; + } + + const children = (genSet.generalizations as Generalization[]) + .map(gen => getNameNoSpaces(gen.specific)); + + let fact = 'fact generalizationSet {\n'; + if (genSet.isDisjoint) fact += ' disjoint[' + children.join(',') + ']\n'; + if (genSet.isComplete) fact += ' ' + getNameNoSpaces(parent) + ' = ' + children.join('+') + '\n'; + fact += '}'; + + transformer.addFact(fact); +} diff --git a/src/libs/ontouml2alloy/index.ts b/src/libs/ontouml2alloy/index.ts new file mode 100644 index 00000000..4d81fe82 --- /dev/null +++ b/src/libs/ontouml2alloy/index.ts @@ -0,0 +1,6 @@ +export * from './property_functions'; +export * from './class_functions'; +export * from './generalization_functions'; +export * from './generalization_set_functions'; +export * from './relation_functions'; +export * from './ontouml2alloy'; \ No newline at end of file diff --git a/src/libs/ontouml2alloy/ontouml2alloy.ts b/src/libs/ontouml2alloy/ontouml2alloy.ts new file mode 100644 index 00000000..14fd7517 --- /dev/null +++ b/src/libs/ontouml2alloy/ontouml2alloy.ts @@ -0,0 +1,331 @@ +import { OntoumlElement, Project, Package } from '@libs/ontouml'; +import { + transformProperty, + transformClass, + transformAdditionalClassConstraints, + transformAdditionalDatatypeConstraints, + transformCharacterizationConstraint, + transformGeneralization, + transformGeneralizationSet, + transformRelation +} from './'; +import { Service, ServiceIssue } from '..'; + +export class Ontouml2Alloy implements Service { + model: Package; + alloyCode: string[]; // [mainModule, worldStructureModule, ontologicalPropertiesModule] + datatypes: [string, string[]][]; // [datatypeName, datatypeProperties] + enums: string[]; + worldFieldDeclarations: string[]; + worldFieldFacts: string[]; + facts: string[]; + relationPropertiesFacts: string[]; + funs: string[]; + visible: string[]; + aliases: [OntoumlElement, string][]; // [element, alias] + + constructor(input: Project | Package, options?: null) { + if (input instanceof Project) { + this.model = input.model; + } else if (input instanceof Package) { + this.model = input; + } + this.alloyCode = ['', '', '']; + this.datatypes = []; + this.enums = []; + this.worldFieldDeclarations = []; + this.worldFieldFacts = []; + this.facts = []; + this.relationPropertiesFacts = []; + this.funs = []; + this.visible = ['exists']; + this.aliases = []; + } + + getAlloyCode(): string[] { + return this.alloyCode; + } + + addDatatype(datatype: [string, string[]]) { + this.datatypes.push(datatype); + } + + addEnum(_enum: string) { + this.enums.push(_enum); + } + + addWorldFieldDeclaration(declaration: string) { + this.worldFieldDeclarations.push(declaration); + } + + addWorldFieldFact(fact: string) { + this.worldFieldFacts.push(fact); + } + + addFact(fact: string) { + this.facts.push(fact); + } + + addRelationPropertiesFact(relationPropertiesFact: string) { + this.relationPropertiesFacts.push(relationPropertiesFact); + } + + addFun(fun: string) { + this.funs.push(fun); + } + + addVisible(term: string) { + this.visible.push(term); + } + + transform() { + this.transformClasses(); + this.transformGeneralizations(); + this.transformGeneralizationSets(); + this.transformProperties(); + this.transformRelations(); + + // removes possible duplicate facts and funs + this.worldFieldFacts = [...new Set(this.worldFieldFacts)]; + this.facts = [...new Set(this.facts)]; + this.relationPropertiesFacts = [...new Set(this.relationPropertiesFacts)]; + this.funs = [...new Set(this.funs)]; + + this.writePreamble(); + this.writeDatatypes(); + this.writeEnums(); + this.writeWorldSignature(); + this.writeFacts(); + this.writeFuns(); + this.writeRuns(); + + this.writeWorldStructureModule(); + this.writeOntologicalPropertiesModule(); + } + + writePreamble() { + this.alloyCode[0] += + 'module main\n\n' + + 'open world_structure[World]\n' + + 'open ontological_properties[World]\n' + + 'open util/relation\n' + + 'open util/sequniv\n' + + 'open util/ternary\n\n' + + 'abstract sig Endurant {}\n\n' + + 'sig Object extends Endurant {}\n\n' + + 'sig Aspect extends Endurant {}\n\n' + + 'sig Datatype {}\n\n'; + } + + writeDatatypes() { + for (const datatype of this.datatypes) { + const datatypeName = datatype[0]; + const datatypeProperties = [... new Set(datatype[1])]; + + if (datatypeProperties.length) { + this.alloyCode[0] += + 'sig ' + datatypeName + ' in Datatype {\n' + + ' ' + datatypeProperties.join(',\n ') + '\n' + + '}\n\n' + } else { + this.alloyCode[0] += + 'sig ' + datatypeName + ' in Datatype {}\n\n' + } + } + } + + writeEnums() { + if (this.enums.length) { + this.alloyCode[0] += + this.enums.join('\n\n') + + '\n\n'; + } + } + + writeWorldSignature() { + this.alloyCode[0] += + 'abstract sig World {\n' + + ' exists: some Endurant,\n' + + ' ' + this.worldFieldDeclarations.join(',\n ') + '\n' + + '}'; + if(this.worldFieldFacts.length) { + this.alloyCode[0] += + ' {\n' + + ' '+ this.worldFieldFacts.join('\n ') + '\n' + + '}'; + } + this.alloyCode[0] += '\n\n'; + } + + writeFacts() { + this.alloyCode[0] += + 'fact additionalFacts {\n' + + ' continuous_existence[exists]\n' + + ' elements_existence[Endurant,exists]\n' + + '}\n\n'; + + if (this.relationPropertiesFacts.length) { + this.alloyCode[0] += + 'fact relationProperties {\n' + + ' '+ this.relationPropertiesFacts.join('\n ') + '\n' + + '}\n\n' + } + + if (this.facts.length) { + this.alloyCode[0] += + this.facts.join('\n\n') + + '\n\n'; + } + } + + writeFuns() { + this.alloyCode[0] += + 'fun visible : World->univ {\n' + + ' ' + this.visible.join('+') + '\n' + + '}\n\n'; + + if (this.funs.length) { + this.alloyCode[0] += + this.funs.join('\n\n') + + '\n\n'; + } + } + + writeRuns() { + this.alloyCode[0] += + '-- Suggested run predicates\n' + + 'run singleWorld for 10 but 1 World, 7 Int\n' + + 'run linearWorlds for 10 but 3 World, 7 Int\n' + + 'run multipleWorlds for 10 but 4 World, 7 Int\n' + + 'run singleWorld for 20 but 1 World, 7 Int\n' + + 'run linearWorlds for 20 but 3 World, 7 Int\n' + + 'run multipleWorlds for 20 but 4 World, 7 Int\n'; + } + + writeWorldStructureModule() { + this.alloyCode[1] += + 'module world_structure[World]\n\n' + + 'some abstract sig TemporalWorld extends World {\n' + + ' next: set TemporalWorld -- Immediate next moments\n' + + '} {\n' + + ' this not in this.^(@next) -- There are no temporal cicles\n' + + ' lone ((@next).this) -- A world can be the immediate next momment of at maximum one world\n' + + '}\n\n' + + 'one sig CurrentWorld extends TemporalWorld {} {\n' + + ' next in FutureWorld\n' + + '}\n\n' + + 'sig PastWorld extends TemporalWorld {} {\n' + + ' next in (PastWorld + CounterfactualWorld + CurrentWorld)\n' + + ' CurrentWorld in this.^@next -- All past worlds can reach the current moment\n' + + '}\n\n' + + 'sig FutureWorld extends TemporalWorld {} {\n' + + ' next in FutureWorld\n' + + ' this in CurrentWorld.^@next -- All future worlds can be reached by the current moment\n' + + '}\n\n' + + 'sig CounterfactualWorld extends TemporalWorld {} {\n' + + ' next in CounterfactualWorld\n' + + ' this in PastWorld.^@next -- All past worlds can reach the counterfactual moment\n' + + '}\n\n' + + '-- Elements cannot die and come to life later\n' + + 'pred continuous_existence [exists: World->univ] {\n' + + ' all w : World, x: (@next.w).exists | (x not in w.exists) => (x not in (( w. ^next).exists))\n' + + '}\n\n' + + '-- All elements must exists in at least one world\n' + + 'pred elements_existence [elements: univ, exists: World->univ] {\n' + + ' all x: elements | some w: World | x in w.exists\n' + + '}\n\n' + + '-- Run predicate for a single World\n' + + 'pred singleWorld {\n' + + ' #World=1\n' + + '}\n\n' + + '-- Run predicate for linear Worlds (Past, Current, Future)\n' + + 'pred linearWorlds {\n' + + ' #World=3 and #PastWorld=1 and #FutureWorld=1\n' + + '}\n\n' + + '-- Run predicate for multiple Worlds (Past, Counterfactual, Current, Future)\n' + + 'pred multipleWorlds {\n' + + ' #World=4 and #PastWorld=1 and #CounterfactualWorld=1 and #FutureWorld=1\n' + + '}\n'; + } + + writeOntologicalPropertiesModule() { + this.alloyCode[2] += + 'module ontological_properties[World]\n\n' + + '-- This predicate states that a class is rigid\n' + + 'pred rigidity [Class: univ->univ, Nature: univ, exists: univ->univ] {\n' + + ' all w1: World, p: univ | p in w1.exists and p in w1.Class implies\n' + + ' all w2: World | w1!=w2 and p in w2.exists implies p in w2.Class\n' + + '}\n\n' + + '-- This predicate states that a class is anti-rigid\n' + + 'pred antirigidity [Class: set univ->univ, Nature: univ, exists: univ->univ] {\n' + + ' all x: Nature | #World>=2 implies (some disj w1,w2: World |\n' + + ' x in w1.exists and x in w1.Class and x in w2.exists and x not in w2.Class)\n' + + '}\n\n' + + '-- This predicate makes the source relation end immutable\n' + + 'pred immutable_source [Target: World->univ, rel: univ->univ->univ] {\n' + + ' all w1: World, x: univ | x in w1.Target implies\n' + + ' all w2: World | x in w2.Target implies (w1.rel).x=(w2.rel).x\n' + + '}\n\n' + + '-- This predicate makes the target relation end immutable\n' + + 'pred immutable_target [Source: World->univ, rel: univ->univ->univ] {\n' + + ' all w1: World, x: univ | x in w1.Source implies\n' + + ' all w2: World | x in w2.Source implies x.(w1.rel)=x.(w2.rel)\n' + + '}\n'; + } + + transformClasses() { + const classes = this.model.getAllClasses(); + + for (const _class of classes) { + transformClass(this, _class); + } + + transformAdditionalClassConstraints(this); + transformAdditionalDatatypeConstraints(this); + + return true; + } + + transformGeneralizations() { + const generalizations = this.model.getAllGeneralizations(); + + for (const gen of generalizations) { + transformGeneralization(this, gen); + } + } + + transformGeneralizationSets() { + const generalizationSets = this.model.getAllGeneralizationSets(); + + for (const genSet of generalizationSets) { + transformGeneralizationSet(this, genSet); + } + } + + transformRelations() { + const relations = this.model.getAllRelations(); + + for (const relation of relations) { + transformRelation(this, relation); + } + + transformCharacterizationConstraint(this); + } + + transformProperties() { + const properties = this.model.getAllProperties(); + + for (const property of properties) { + transformProperty(this, property); + } + } + + run(): { result: any; issues?: ServiceIssue[] } { + this.transform(); + + return { + result: this.getAlloyCode(), // [mainModule, worldStructureModule, ontologicalPropertiesModule] + issues: undefined + }; + } +} diff --git a/src/libs/ontouml2alloy/property_functions.ts b/src/libs/ontouml2alloy/property_functions.ts new file mode 100644 index 00000000..025d1cab --- /dev/null +++ b/src/libs/ontouml2alloy/property_functions.ts @@ -0,0 +1,295 @@ +import { Property, Class, Relation } from '@libs/ontouml'; +import { Ontouml2Alloy } from '.'; +import { + getNameNoSpaces, + getCardinalityKeyword, + isCustomCardinality, + getCustomCardinality, + getValidAlias, + isMaterialConnectedToDerivation, + holdsBetweenDatatypes, + getCorrespondingDatatype +} from './util'; + +export function transformProperty(transformer: Ontouml2Alloy, property: Property) { + if (property.container instanceof Class && property.container.hasDatatypeStereotype()) { + transformDatatypeAttribute(transformer, property); + return; + } else if (property.container instanceof Relation && holdsBetweenDatatypes(property.container)) { + return; + } + + if (property.isAttribute()) { + if (property.isOrdered) { + transformOrderedAttribute(transformer, property); + } else { + transformGeneralAttribute(transformer, property); + } + } else if (property.isRelationEnd()) { + if (property.container instanceof Relation && property.container.hasDerivationStereotype()) { + return; + } + + if (property.container instanceof Relation && property.container.getSourceEnd() === property) { + transformRelationSourceEnd(transformer, property); + } else { + transformRelationTargetEnd(transformer, property); + } + } +} + +function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Property) { + const attributeName = getNameNoSpaces(attribute); + const ownerClassName = getNameNoSpaces(attribute.container); + const datatypeName = getNameNoSpaces(attribute.propertyType); + const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); + + transformer.addWorldFieldDeclaration( + attributeName + ': set ' + ownerClassName + ' set -> set Int set -> set ' + datatypeName + ); + + transformer.addFact( + 'fact ordering {\n' + + ' all w: World, x: w.' + ownerClassName + ' | isSeq[x.(w.' + attributeName + ')]\n' + + ' all w: World, x: w.' + ownerClassName + ', y: w.' + ownerClassName + ' | lone x.((w.' + attributeName + ').y)\n' + + '}' + ); + + transformer.addFun( + 'fun ' + funAlias + ' [x: World.' + ownerClassName + ', w: World] : set ' + datatypeName + ' {\n' + + ' x.(w.' + attributeName + ')\n' + + '}' + ); + + if (attribute.isReadOnly) { + transformer.addRelationPropertiesFact( + 'immutable_target[' + ownerClassName + ',' + attributeName + ']' + ); + } +} + +function transformGeneralAttribute(transformer: Ontouml2Alloy, attribute: Property) { + const attributeName = getNameNoSpaces(attribute); + const ownerClassName = getNameNoSpaces(attribute.container); + const datatypeName = getNameNoSpaces(attribute.propertyType); + const cardinality = getCardinalityKeyword(attribute.cardinality); + const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); + + transformer.addWorldFieldDeclaration( + (attributeName + ': set ' + ownerClassName + ' set -> ' + cardinality + ' ' + datatypeName).replace(/\s{2,}/g, ' ') + ); + + transformer.addFun( + 'fun ' + funAlias + ' [x: World.' + ownerClassName + ', w: World] : set ' + datatypeName + ' {\n' + + ' x.(w.' + attributeName + ')\n' + + '}' + ); + + if (attribute.isReadOnly) { + transformer.addRelationPropertiesFact( + 'immutable_target[' + ownerClassName + ',' + attributeName + ']' + ); + } + + if (isCustomCardinality(attribute.cardinality)) { + const [lowerBound, upperBound] = getCustomCardinality(attribute.cardinality); + + if (lowerBound && upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]>=' + lowerBound + ' and #' + funAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } else if (lowerBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]>=' + lowerBound + '\n' + + '}' + ); + } else if (upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } + } + + transformer.addVisible( + 'select13[' + attributeName +']' + ); +} + +function transformRelationSourceEnd(transformer: Ontouml2Alloy, sourceEnd: Property) { + let relationName = ''; + + if (sourceEnd.container.getName()) { + relationName = getNameNoSpaces(sourceEnd.container); + } else { + relationName = getValidAlias(sourceEnd.container, 'relation', transformer.aliases); + } + + const sourceName = getNameNoSpaces((sourceEnd.container as Relation).getSource()); + let sourceEndName = ''; + + if (sourceEnd.getName()) { + sourceEndName = getNameNoSpaces(sourceEnd); + } else { + sourceEndName = sourceName; + } + + const oppositeName = getNameNoSpaces((sourceEnd.container as Relation).getTarget()); + const sourceEndAlias = getValidAlias(sourceEnd, sourceEndName, transformer.aliases); + + if (isMaterialConnectedToDerivation(sourceEnd.container as Relation, transformer.model.getAllRelations()) + || sourceEnd.isOrdered || sourceEnd.getOppositeEnd().isOrdered) { + transformer.addFun( + 'fun ' + sourceEndAlias + ' [x: World.' + oppositeName + ', w: World] : set World.' + sourceName + ' {\n' + + ' (select13[w.' + relationName + ']).x\n' + + '}' + ); + } else { + transformer.addFun( + 'fun ' + sourceEndAlias + ' [x: World.' + oppositeName + ', w: World] : set World.' + sourceName + ' {\n' + + ' (w.' + relationName + ').x\n' + + '}' + ); + } + + if (sourceEnd.isReadOnly) { + transformer.addRelationPropertiesFact( + 'immutable_source[' + oppositeName + ',' + relationName + ']' + ); + } + + if (isCustomCardinality(sourceEnd.cardinality) + || isMaterialConnectedToDerivation((sourceEnd.container as Relation), transformer.model.getAllRelations())) { + + const [lowerBound, upperBound] = getCustomCardinality(sourceEnd.cardinality); + + if (lowerBound && upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + sourceEndAlias + '[x,w]>=' + lowerBound + ' and #' + sourceEndAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } else if (lowerBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + sourceEndAlias + '[x,w]>=' + lowerBound + '\n' + + '}' + ); + } else if (upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + sourceEndAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } + } +} + +function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Property) { + let relationName = ''; + + if (targetEnd.container.getName()) { + relationName = getNameNoSpaces(targetEnd.container); + } else { + relationName = getValidAlias(targetEnd.container, 'relation', transformer.aliases); + } + + const targetName = getNameNoSpaces((targetEnd.container as Relation).getTarget()); + let targetEndName = ''; + + if (targetEnd.getName()) { + targetEndName = getNameNoSpaces(targetEnd); + } else { + targetEndName = targetName; + } + + const oppositeName = getNameNoSpaces((targetEnd.container as Relation).getSource()); + const targetEndAlias = getValidAlias(targetEnd, targetEndName, transformer.aliases); + + if (isMaterialConnectedToDerivation(targetEnd.container as Relation, transformer.model.getAllRelations()) + || targetEnd.isOrdered || targetEnd.getOppositeEnd().isOrdered) { + transformer.addFun( + 'fun ' + targetEndAlias + ' [x: World.' + oppositeName + ', w: World] : set World.' + targetName + ' {\n' + + ' x.(select13[w.' + relationName + '])\n' + + '}' + ); + } else { + transformer.addFun( + 'fun ' + targetEndAlias + ' [x: World.' + oppositeName + ', w: World] : set World.' + targetName + ' {\n' + + ' x.(w.' + relationName + ')\n' + + '}' + ); + } + + if (targetEnd.isReadOnly || (targetEnd.container as Relation).hasMediationStereotype() + || (targetEnd.container as Relation).hasCharacterizationStereotype()) { + + transformer.addRelationPropertiesFact( + 'immutable_target[' + oppositeName + ',' + relationName + ']' + ); + } + + if (isCustomCardinality(targetEnd.cardinality) + || isMaterialConnectedToDerivation((targetEnd.container as Relation), transformer.model.getAllRelations())) { + + const [lowerBound, upperBound] = getCustomCardinality(targetEnd.cardinality); + + if (lowerBound && upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + targetEndAlias + '[x,w]>=' + lowerBound + ' and #' + targetEndAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } else if (lowerBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + targetEndAlias + '[x,w]>=' + lowerBound + '\n' + + '}' + ); + } else if (upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + targetEndAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } + } +} + +function transformDatatypeAttribute(transformer: Ontouml2Alloy, attribute: Property) { + const attributeName = getNameNoSpaces(attribute); + const ownerDatatypeName = getNameNoSpaces(attribute.container); + const ownerDatatype = getCorrespondingDatatype(ownerDatatypeName, transformer.datatypes); + const cardinality = getCardinalityKeyword(attribute.cardinality); + const datatypeName = getNameNoSpaces(attribute.propertyType); + + ownerDatatype[1].push((attributeName + ': ' + cardinality + ' ' + datatypeName).replace(/\s{2,}/g, ' ')); + + if (isCustomCardinality(attribute.cardinality)) { + const [lowerBound, upperBound] = getCustomCardinality(attribute.cardinality); + + if (lowerBound && upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all x: ' + ownerDatatype[0] + ' | #x.' + attributeName + '>=' + lowerBound + ' and #x.' + attributeName + '<=' + upperBound + '\n' + + '}' + ); + } else if (lowerBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all x: ' + ownerDatatype[0] + ' | #x.' + attributeName + '>=' + lowerBound + '\n' + + '}' + ); + } else if (upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all x: ' + ownerDatatype[0] + ' | #x.' + attributeName + '<=' + upperBound + '\n' + + '}' + ); + } + } +} diff --git a/src/libs/ontouml2alloy/relation_functions.ts b/src/libs/ontouml2alloy/relation_functions.ts new file mode 100644 index 00000000..bbfcf126 --- /dev/null +++ b/src/libs/ontouml2alloy/relation_functions.ts @@ -0,0 +1,335 @@ +import { ClassStereotype, Relation, RelationStereotype } from '@libs/ontouml'; +import { Ontouml2Alloy } from './'; +import { + getNameNoSpaces, + getCardinalityKeyword, + getValidAlias, + getCustomCardinality, + holdsBetweenDatatypes, + getCorrespondingDatatype +} from './util'; + +export function transformRelation(transformer: Ontouml2Alloy, relation: Relation) { + if (holdsBetweenDatatypes(relation)) { + transformDatatypeRelation(transformer, relation); + return; + } + + if (relation.hasDerivationStereotype()) { + transformDerivationRelation(transformer, relation); + return; + } + + if (relation.hasMediationStereotype()) { + transformMediationRelation(transformer, relation); + return; + } + + if (relation.hasMaterialStereotype()) { + transformMaterialRelation(transformer, relation); + return; + } + + if (relation.isPartWholeRelation() || relation.hasComponentOfStereotype() || relation.hasMemberOfStereotype() + || relation.hasSubCollectionOfStereotype() || relation.hasSubQuantityOfStereotype()) { + + transformPartWholeRelation(transformer, relation); + return; + } + + transformGeneralRelation(transformer, relation); +} + +function transformOrderedRelation(transformer: Ontouml2Alloy, relation: Relation) { + let relationName = ''; + + if (relation.getName()) { + relationName = getNameNoSpaces(relation); + } else { + relationName = getValidAlias(relation, 'relation', transformer.aliases); + } + + const sourceName = getNameNoSpaces(relation.getSource()); + const targetName = getNameNoSpaces(relation.getTarget()); + + transformer.addWorldFieldDeclaration( + relationName + ': set ' + sourceName + ' set -> set Int set -> set ' + targetName + ); + + transformer.addFact( + 'fact ordering {\n' + + ' all w: World, x: w.' + sourceName + ' | isSeq[x.(w.' + relationName + ')]\n' + + ' all w: World, x: w.' + sourceName + ', y: w.' + sourceName + ' | lone x.((w.' + relationName + ').y)\n' + + '}' + ); +} + +function transformGeneralRelation(transformer: Ontouml2Alloy, relation: Relation) { + let relationName = ''; + + if (relation.getName()) { + relationName = getNameNoSpaces(relation); + } else { + relationName = getValidAlias(relation, 'relation', transformer.aliases); + } + + const sourceName = getNameNoSpaces(relation.getSource()); + const targetName = getNameNoSpaces(relation.getTarget()); + const sourceCardinality = getCardinalityKeyword(relation.getSourceEnd().cardinality); + const targetCardinality = getCardinalityKeyword(relation.getTargetEnd().cardinality); + + transformer.addWorldFieldDeclaration( + (relationName + ': set ' + sourceName + ' ' + sourceCardinality + ' -> ' + targetCardinality + ' ' + targetName).replace(/\s{2,}/g, ' ') + ); +} + +function transformMediationRelation(transformer: Ontouml2Alloy, relation: Relation) { + let relationName = ''; + + if (relation.getName()) { + relationName = getNameNoSpaces(relation); + } else { + relationName = getValidAlias(relation, 'relation', transformer.aliases); + } + + const sourceName = getNameNoSpaces(relation.getSource()); + + transformer.addFact( + 'fact acyclic {\n' + + ' all w: World | acyclic[w.' + relationName + ',w.' + sourceName + ']\n' + + '}' + ); + + transformGeneralRelation(transformer, relation); +} + +function transformMaterialRelation(transformer: Ontouml2Alloy, relation: Relation) { + for (const rel of transformer.model.getAllRelations()) { + if (rel.hasDerivationStereotype() && rel.getDerivingRelation() === relation + && rel.getDerivedClassStereotype() === ClassStereotype.RELATOR) { + + let materialName = ''; + + if (relation.getName()) { + materialName = getNameNoSpaces(relation); + } else { + materialName = getValidAlias(relation, 'relation', transformer.aliases); + } + + const sourceName = getNameNoSpaces(relation.getSource()); + const targetName = getNameNoSpaces(relation.getTarget()); + const relatorName = getNameNoSpaces(rel.getDerivedClass()); + + transformer.addWorldFieldDeclaration( + materialName + ': set ' + sourceName + ' -> ' + relatorName + ' -> ' + targetName + ); + return; + } + } + + if (relation.getSourceEnd().isOrdered || relation.getTargetEnd().isOrdered) { + transformOrderedRelation(transformer, relation); + } else { + transformGeneralRelation(transformer, relation); + } +} + +function transformDerivationRelation(transformer: Ontouml2Alloy, relation: Relation) { + //TODO: take Comparatives, External Dependence into account + + if (relation.getDerivingRelationStereotype() === RelationStereotype.MATERIAL + && relation.getDerivedClassStereotype() === ClassStereotype.RELATOR) { + + const material = relation.getDerivingRelation(); + const relator = relation.getDerivedClass(); + const materialSource = material.getSource(); + const materialTarget = material.getTarget(); + + let mediation1 = null; + let mediation2 = null; + + for (const rel of transformer.model.getAllRelations()) { + if (mediation1 === null + && (rel.getSource() === materialSource && rel.getTarget() === relator + || rel.getTarget() === materialSource && rel.getSource() === relator)) { + + mediation1 = rel; + + } else if (mediation2 === null + && (rel.getSource() === materialTarget && rel.getTarget() === relator + || rel.getTarget() === materialTarget && rel.getSource() === relator)) { + + mediation2 = rel; + } + } + + let materialName = ''; + if (material.getName()) { + materialName = getNameNoSpaces(material); + } else { + materialName = getValidAlias(material, 'relation', transformer.aliases); + } + + let mediation1Name = ''; + if (mediation1.getName()) { + mediation1Name = getNameNoSpaces(mediation1); + } else { + mediation1Name = getValidAlias(mediation1, 'relation', transformer.aliases); + } + + let mediation2Name = ''; + if (mediation2.getName()) { + mediation2Name = getNameNoSpaces(mediation2); + } else { + mediation2Name = getValidAlias(mediation2, 'relation', transformer.aliases); + } + + const relatorName = getNameNoSpaces(relator); + const materialSourceName = getNameNoSpaces(materialSource); + const materialTargetName = getNameNoSpaces(materialTarget); + + transformer.addFact( + 'fact derivation {\n' + + ' all w: World, x: w.' + materialSourceName + ', y: w.' + materialTargetName + ', r: w.' + relatorName + ' | \n' + + ' x -> r -> y in w.' + materialName + ' iff x in r.(w.' + mediation1Name + ') and y in r.(w.' + mediation2Name + ')\n' + + '}' + ); + } +} + +function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relation) { + let relationName = ''; + + if (relation.getName()) { + relationName = getNameNoSpaces(relation); + } else { + relationName = getValidAlias(relation, 'relation', transformer.aliases); + } + + const wholeName = getNameNoSpaces(relation.getSource()); + const partName = getNameNoSpaces(relation.getTarget()); + + const wholeEnd = relation.getSourceEnd(); + let wholeEndName = ''; + if (wholeEnd.getName()) { + wholeEndName = getNameNoSpaces(wholeEnd); + } else { + wholeEndName = getNameNoSpaces(relation.getSource()); + } + + const wholeEndAlias = getValidAlias(wholeEnd, wholeEndName, transformer.aliases); + + if (wholeEnd.isAggregationEnd() && wholeEnd.isComposite()) { + let otherWholeEnds = [] + for (const prop of transformer.model.getAllProperties()) { + if (prop.isAggregationEnd() && prop !== wholeEnd) { + const otherWholeEnd = relation.getSourceEnd(); + let otherWholeEndName = ''; + if (otherWholeEnd.getName()) { + otherWholeEndName = getNameNoSpaces(otherWholeEnd); + } else { + otherWholeEndName = getNameNoSpaces((otherWholeEnd.container as Relation).getSource()); + } + + const otherWholeEndAlias = getValidAlias(otherWholeEnd, otherWholeEndName, transformer.aliases); + otherWholeEnds.push(otherWholeEndAlias + '[x,w]'); + } + } + + otherWholeEnds = [...new Set(otherWholeEnds)]; + if (otherWholeEnds.length) { + transformer.addFact( + 'fact composition {\n' + + ' all w: World, x : w.' + partName + ' | lone ' + wholeEndAlias + '[x,w]\n' + + ' all w: World, x : w.' + partName + ' | some ' + wholeEndAlias + '[x,w] implies no (' + otherWholeEnds.join('+') + ')' + + '}' + ); + } else { + transformer.addFact( + 'fact composition {\n' + + ' all w: World, x : w.' + partName + ' | lone ' + wholeEndAlias + '[x,w]\n' + + '}' + ); + } + } + + transformer.addFact( + 'fact acyclic {\n' + + ' all w: World | acyclic[w.' + relationName + ',w.' + wholeName + ']\n' + + '}' + ); + + transformGeneralRelation(transformer, relation); +} + +function transformDatatypeRelation(transformer: Ontouml2Alloy, relation: Relation) { + const sourceName = getNameNoSpaces(relation.getSource()); + const targetName = getNameNoSpaces(relation.getTarget()); + const sourceDatatype = getCorrespondingDatatype(sourceName, transformer.datatypes); + + let relationName = ''; + + if (relation.getName()) { + relationName = getNameNoSpaces(relation); + } else { + relationName = getValidAlias(relation, 'relation', transformer.aliases); + } + + sourceDatatype[1].push(relationName + ': '+ targetName); + + const [sourceLowerBound, sourceUpperBound] = getCustomCardinality(relation.getSourceEnd().cardinality); + const [targetLowerBound, targetUpperBound] = getCustomCardinality(relation.getTargetEnd().cardinality); + let sourceFact = ''; + let targetFact = ''; + + if (targetLowerBound && targetUpperBound) { + sourceFact = + 'all x: ' + sourceName + ' | #x.' + relationName + '>=' + targetLowerBound + ' and #x.' + relationName + '<=' + targetUpperBound; + } else if (targetLowerBound) { + sourceFact = + 'all x: ' + sourceName + ' | #x.' + relationName + '>=' + targetLowerBound; + } else if (targetUpperBound) { + sourceFact = + 'all x: ' + sourceName + ' | #x.' + relationName + '<=' + targetUpperBound; + } + + if (sourceLowerBound && sourceUpperBound) { + targetFact = + 'all x: ' + targetName + ' | #' + relationName + '.x>=' + sourceLowerBound + ' and #' + relationName + '.x<=' + sourceUpperBound; + } else if (sourceLowerBound) { + targetFact = + 'all x: ' + targetName + ' | #' + relationName + '.x>=' + sourceLowerBound; + } else if (sourceUpperBound) { + targetFact = + 'all x: ' + targetName + ' | #' + relationName + '.x<=' + sourceUpperBound; + } + + transformer.addFact( + 'fact datatypesMultiplicity {\n' + + ' ' + sourceFact + '\n' + + ' ' + targetFact + '\n' + + '}' + ); +} + +export function transformCharacterizationConstraint(transformer: Ontouml2Alloy) { + let characterizations = transformer.model.getAllRelationsByStereotype(RelationStereotype.CHARACTERIZATION) + .map(characterization => { + if (characterization.getName()) { + return 'w.' + getNameNoSpaces(characterization); + } else { + return 'w.' + getValidAlias(characterization, 'relation', transformer.aliases); + } + }); + if (characterizations.length) { + let intrinsicMoments = [... new Set([...transformer.model.getClassesRestrictedToIntrinsicMode(), ...transformer.model.getClassesRestrictedToQuality()])] + .map(moment => 'w.' + getNameNoSpaces(moment)); + if (intrinsicMoments.length) { + transformer.addFact( + 'fact acyclicCharacterizations {\n' + + ' all w: World | acyclic[(' + characterizations.join('+') + '),(' + intrinsicMoments.join('+') + ')]\n' + + '}' + ); + } + } +} diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts new file mode 100644 index 00000000..d4e32e78 --- /dev/null +++ b/src/libs/ontouml2alloy/util.ts @@ -0,0 +1,95 @@ +import { OntoumlElement, Class, ClassStereotype, Relation, Generalization, Cardinality } from '@libs/ontouml'; + +export function getNameNoSpaces(element: OntoumlElement) { + return element.getName().replace(/\s/g, ''); +} + +export function isTopLevel(_class: Class, generalizations: Generalization[]) { + for (const gen of generalizations) { + if (gen.involvesClasses() && gen.getSpecificClass() == _class) { + return false; + } + } + return true; +} + +export function getCardinalityKeyword(cardinality: Cardinality) { + if (cardinality.isBounded()) { + if (cardinality.isZeroToOne()) { + return 'lone'; + } else if (cardinality.isOneToOne()) { + return 'one'; + } else if (cardinality.isZeroToMany()) { + return 'set'; + } else if (cardinality.isOneToMany()) { + return 'some'; + } + } + return ''; +} + +export function isCustomCardinality(cardinality: Cardinality) { + if (cardinality.isZeroToOne() || cardinality.isOneToOne() || cardinality.isZeroToMany() || cardinality.isOneToMany()) { + return false; + } + return true; +} + +export function getCustomCardinality(cardinality: Cardinality) { + let lowerBound = null; + let upperBound = null; + + if (!cardinality.isLowerBoundValid()) { // ! is being used because this method is returning the opposite of what it should + lowerBound = cardinality.lowerBound + } + + if (!cardinality.isUpperBoundValid()) { // ! is being used because this method is returning the opposite of what it should + upperBound = cardinality.upperBound + } + + return [lowerBound, upperBound]; +} + +export function getValidAlias(element: OntoumlElement, name: string, aliases: [OntoumlElement, string][]) { + const foundAlias = aliases.find((a) => { return a[0] === element; }) + if (foundAlias) { + return foundAlias[1]; + } else { + let i = 1; + while (aliases.some((a) => { return a[1] === name + i; })) { + i++; + } + aliases.push([element, name + i]); + return name + i; + } +} + +export function isMaterialConnectedToDerivation(material: Relation, relations: Relation[]) { + if (material.hasMaterialStereotype()) { + for (const rel of relations) { + if (rel.hasDerivationStereotype() && rel.getDerivingRelation() === material + && rel.getDerivedClassStereotype() === ClassStereotype.RELATOR) { + return true; + } + } + } + return false; +} + +export function holdsBetweenDatatypes(relation: Relation) { + if (relation.getSourceStereotype() === ClassStereotype.DATATYPE + && relation.getTargetStereotype() === ClassStereotype.DATATYPE) { + + return true; + } + return false; +} + +export function getCorrespondingDatatype(datatypeName: string, datatypes: [string, string[]][]) { + for (const datatype of datatypes) { + if (datatype[0] === datatypeName) { + return datatype; + } + } + return null; +} From 41bf42b1ada449f28021fbf0b04b729feeb792ff Mon Sep 17 00:00:00 2001 From: fernandoam14 Date: Sat, 15 May 2021 22:59:48 -0300 Subject: [PATCH 02/23] Run result modified to three fields --- src/libs/ontouml2alloy/ontouml2alloy.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libs/ontouml2alloy/ontouml2alloy.ts b/src/libs/ontouml2alloy/ontouml2alloy.ts index 14fd7517..411fab2d 100644 --- a/src/libs/ontouml2alloy/ontouml2alloy.ts +++ b/src/libs/ontouml2alloy/ontouml2alloy.ts @@ -324,8 +324,12 @@ export class Ontouml2Alloy implements Service { this.transform(); return { - result: this.getAlloyCode(), // [mainModule, worldStructureModule, ontologicalPropertiesModule] - issues: undefined + result: { + mainModule: this.getAlloyCode()[0], + worldStructureModule: this.getAlloyCode()[1], + ontologicalPropertiesModule: this.getAlloyCode()[2] + }, + issues: undefined }; } } From 955086b3a7c0b20e6e982dbe1bc71df9c025b014 Mon Sep 17 00:00:00 2001 From: Asen Date: Thu, 23 Mar 2023 14:07:57 +0100 Subject: [PATCH 03/23] Added folder for ontouml2alloy tests --- .../ontouml2alloy/class_functions.test.ts | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 __tests__/libs/ontouml2alloy/class_functions.test.ts diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts new file mode 100644 index 00000000..1b55d85e --- /dev/null +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -0,0 +1,128 @@ +import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; +import { Class, ClassStereotype, Relation, Package, Project, Property, OntoumlType, AggregationKind, stereotypeUtils, OntologicalNature} from '@libs/ontouml'; +import { transformClass } from '@libs/ontouml2alloy/class_functions'; + +import { MultilingualText } from '@libs/ontouml'; + +// describe('transformEndurantClass', () => { +// test('should transform endurant class into Alloy field declaration', () => { +// // Create a new Ontouml2Alloy instance and a Class instance +// const transformer = new Ontouml2Alloy(); +// const classInstance = new Class('Person'); + +// // Set the classInstance as restricted to Substantial +// classInstance.setRestrictedToSubstantial(true); + +// // Call the transformEndurantClass function with the transformer and the classInstance +// transformEndurantClass(transformer, classInstance); + +// // Check that the transformer now contains the expected Alloy field declaration +// expect(transformer.getFacts()).toContain('Person: set exists:>Object'); +// }); +// }); + +describe('Class Functions', () => { + + describe('transformClass function', () => { + + let project: Project; + let model: Package; + let transformer: Ontouml2Alloy; + + const eventClass = new Class({ name: new MultilingualText('Event'), stereotype: ClassStereotype.EVENT}); + const situationClass = new Class({ name: new MultilingualText('Situation'), stereotype: ClassStereotype.SITUATION }); + const datatypeClass = new Class({ name: new MultilingualText('DataType'), stereotype: ClassStereotype.DATATYPE }); + const enumerationClass = new Class({ name: new MultilingualText('Enumeration'), stereotype: ClassStereotype.ENUMERATION }); + const endurantClass = new Class({ name: new MultilingualText('Endurant'), isAbstract: false }); + const relatorClass = new Class({ name: new MultilingualText('Relator'), stereotype: ClassStereotype.RELATOR }); + const abstractClass = new Class({ name: new MultilingualText('AbstractClass'), isAbstract: true }); + + beforeEach(() => { + project = new Project(); + model = project.createModel(); + + transformer = new Ontouml2Alloy(model); //necessary to use the transform func + }); + + it('returns early if the class has stereotype EVENT or SITUATION', () => { + const resultEvent = transformClass(transformer, eventClass); + const resultSituation = transformClass(transformer, situationClass); + expect(resultEvent).toBeUndefined(); + expect(resultSituation).toBeUndefined(); + }); + + // afterEach(() => { + // // code to run after each test case + // }); + + // beforeAll(() => { + // // code to run before all test cases + // }); + + // afterAll(() => { + // // code to run after all test cases + // }); + + // it('should do X when Y is provided', () => { + // // Arrange + // //const input = ...; // the input value for the function or class method + // //const expectedOutput = ...; // the expected output of the function or class method + + // // Act + // //const actualOutput = ...; // call the function or class method with the input value + + // // Assert + // //expect(actualOutput).toEqual(expectedOutput); + // }); + + // it('should throw an error when Z is provided', () => { + // // Arrange + // //const input = ...; // the input value for the function or class method that should throw an error + + // // Assert + // //expect(() => ...).toThrow(); // call the function or class method with the input value and expect it to throw an error + // }); + + it('transforms datatype classes', () => { + + }); + + it('transforms enumeration classes', () => { + + }); + + + it('transforms endurant class', () => { + + endurantClass.addName('Person'); + endurantClass.stereotype = ClassStereotype.KIND; + // console.log(endurantClass.getAllowedStereotypes()); + console.log(endurantClass.getName()); + console.log(endurantClass.getAllContents()); + console.log(endurantClass.toJSON()); + + stereotypeUtils.isEndurantClassStereotype + transformClass(transformer, endurantClass); + transformer.transform(); + + const expectedFacts = [ + 'fact rigid {\n' + + ' rigidity[Person,Endurant,exists]\n' + + '}', + ]; + + console.log(transformer.getAlloyCode()[0]); + expect(transformer.getAlloyCode()[0]).toContain(expectedFacts); + + }); + + + + + + + + }); +}); + + \ No newline at end of file From 2adee5ae72aa25c6c872a636eba79711a65001cc Mon Sep 17 00:00:00 2001 From: Asen Date: Fri, 24 Mar 2023 23:15:41 +0100 Subject: [PATCH 04/23] Added helper class; added/fixed test cases --- .../ontouml2alloy/class_functions.test.ts | 96 +- package-lock.json | 13558 +++++++++------- package.json | 4 +- src/libs/ontouml2alloy/class_functions.ts | 7 +- src/libs/ontouml2alloy/helper.ts | 16 + src/libs/ontouml2alloy/ontouml2alloy.ts | 31 + 6 files changed, 7850 insertions(+), 5862 deletions(-) create mode 100644 src/libs/ontouml2alloy/helper.ts diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index 1b55d85e..3287b50c 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -1,25 +1,10 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; +import { generateAlloy } from '@libs/ontouml2alloy/helper'; import { Class, ClassStereotype, Relation, Package, Project, Property, OntoumlType, AggregationKind, stereotypeUtils, OntologicalNature} from '@libs/ontouml'; import { transformClass } from '@libs/ontouml2alloy/class_functions'; import { MultilingualText } from '@libs/ontouml'; -// describe('transformEndurantClass', () => { -// test('should transform endurant class into Alloy field declaration', () => { -// // Create a new Ontouml2Alloy instance and a Class instance -// const transformer = new Ontouml2Alloy(); -// const classInstance = new Class('Person'); - -// // Set the classInstance as restricted to Substantial -// classInstance.setRestrictedToSubstantial(true); - -// // Call the transformEndurantClass function with the transformer and the classInstance -// transformEndurantClass(transformer, classInstance); - -// // Check that the transformer now contains the expected Alloy field declaration -// expect(transformer.getFacts()).toContain('Person: set exists:>Object'); -// }); -// }); describe('Class Functions', () => { @@ -29,26 +14,28 @@ describe('Class Functions', () => { let model: Package; let transformer: Ontouml2Alloy; - const eventClass = new Class({ name: new MultilingualText('Event'), stereotype: ClassStereotype.EVENT}); - const situationClass = new Class({ name: new MultilingualText('Situation'), stereotype: ClassStereotype.SITUATION }); - const datatypeClass = new Class({ name: new MultilingualText('DataType'), stereotype: ClassStereotype.DATATYPE }); - const enumerationClass = new Class({ name: new MultilingualText('Enumeration'), stereotype: ClassStereotype.ENUMERATION }); - const endurantClass = new Class({ name: new MultilingualText('Endurant'), isAbstract: false }); - const relatorClass = new Class({ name: new MultilingualText('Relator'), stereotype: ClassStereotype.RELATOR }); - const abstractClass = new Class({ name: new MultilingualText('AbstractClass'), isAbstract: true }); + // const eventClass = new Class({ name: new MultilingualText('Event'), stereotype: ClassStereotype.EVENT}); + // const situationClass = new Class({ name: new MultilingualText('Situation'), stereotype: ClassStereotype.SITUATION }); + // const datatypeClass = new Class({ name: new MultilingualText('DataType'), stereotype: ClassStereotype.DATATYPE }); + // const enumerationClass = new Class({ name: new MultilingualText('Enumeration'), stereotype: ClassStereotype.ENUMERATION }); + // const endurantClass = new Class({ name: new MultilingualText('Endurant'), isAbstract: false }); + // const relatorClass = new Class({ name: new MultilingualText('Relator'), stereotype: ClassStereotype.RELATOR }); + // const abstractClass = new Class({ name: new MultilingualText('AbstractClass'), isAbstract: true }); beforeEach(() => { project = new Project(); model = project.createModel(); - - transformer = new Ontouml2Alloy(model); //necessary to use the transform func }); - it('returns early if the class has stereotype EVENT or SITUATION', () => { - const resultEvent = transformClass(transformer, eventClass); - const resultSituation = transformClass(transformer, situationClass); - expect(resultEvent).toBeUndefined(); - expect(resultSituation).toBeUndefined(); + it('should return early if the class has stereotype EVENT or SITUATION', () => { + // model.createKind('Happy Person'); + const event = model.createEvent('Birthday'); + expect(generateAlloy(model)).not.toContain('Birthday'); + model.removeContent(event); + + model.createSituation('Hazard') + expect(generateAlloy(model)).not.toContain('Hazard'); + // expect(transformer.getAlloyCode()[0]).toContain('HappyPerson: set exists:>Object'); }); // afterEach(() => { @@ -83,9 +70,18 @@ describe('Class Functions', () => { // //expect(() => ...).toThrow(); // call the function or class method with the input value and expect it to throw an error // }); - it('transforms datatype classes', () => { - - }); + it('should transform datatype classes', () => { + const _number = model.createDatatype('Number'); + const complexDatatype = model.createDatatype('Date'); + complexDatatype.createAttribute(_number, 'day'); + complexDatatype.createAttribute(_number, 'month'); + complexDatatype.createAttribute(_number, 'year'); + const result = generateAlloy(model); + expect(result).toContain('sig Date in Datatype {'); + expect(result).toContain('day: Number'); + expect(result).toContain('month: Number'); + expect(result).toContain('year: Number'); + }); //default multiplicy is "one" so "day: one Number" or "day: Number" should be the same it('transforms enumeration classes', () => { @@ -94,25 +90,25 @@ describe('Class Functions', () => { it('transforms endurant class', () => { - endurantClass.addName('Person'); - endurantClass.stereotype = ClassStereotype.KIND; - // console.log(endurantClass.getAllowedStereotypes()); - console.log(endurantClass.getName()); - console.log(endurantClass.getAllContents()); - console.log(endurantClass.toJSON()); + // endurantClass.addName('Person'); + // endurantClass.stereotype = ClassStereotype.KIND; + // // console.log(endurantClass.getAllowedStereotypes()); + // console.log(endurantClass.getName()); + // console.log(endurantClass.getAllContents()); + // console.log(endurantClass.toJSON()); - stereotypeUtils.isEndurantClassStereotype - transformClass(transformer, endurantClass); - transformer.transform(); + // stereotypeUtils.isEndurantClassStereotype + // transformClass(transformer, endurantClass); + // transformer.transform(); - const expectedFacts = [ - 'fact rigid {\n' + - ' rigidity[Person,Endurant,exists]\n' + - '}', - ]; - - console.log(transformer.getAlloyCode()[0]); - expect(transformer.getAlloyCode()[0]).toContain(expectedFacts); + // const expectedFacts = [ + // 'fact rigid {\n' + + // ' rigidity[Person,Endurant,exists]\n' + + // '}', + // ]; + + // console.log(transformer.getAlloyCode()[0]); + // expect(transformer.getAlloyCode()[0]).toContain(expectedFacts); }); diff --git a/package-lock.json b/package-lock.json index 8f354530..cedf951a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,69 @@ { "name": "ontouml-js", "version": "0.4.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/cli": { + "packages": { + "": { + "name": "ontouml-js", + "version": "0.4.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.13", + "@types/n3": "^1.4.4", + "ajv": "^7.1.1", + "esm": "^3.2.25", + "language-tags": "^1.0.5", + "lodash": "^4.17.21", + "n3": "^1.8.0", + "ontouml-schema": "^0.2.4", + "tslib": "~1.10.0", + "uniqid": "^5.3.0", + "validate.io-uri": "^1.0.0" + }, + "devDependencies": { + "@babel/cli": "^7.12.16", + "@babel/core": "^7.12.16", + "@babel/plugin-proposal-class-properties": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.16", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/preset-typescript": "^7.12.16", + "@babel/register": "^7.12.13", + "@types/jest": "^24.9.1", + "@types/lodash": "^4.14.168", + "@types/node": "^10.17.51", + "babel-jest": "^24.9.0", + "babel-loader": "^8.2.2", + "babel-plugin-module-resolver": "^4.1.0", + "dotenv": "^8.2.0", + "husky": "^3.1.0", + "jest": "^24.9.0", + "module-alias": "^2.2.2", + "nodemon": "^1.19.4", + "npm-run-all": "^4.1.5", + "onchange": "^6.1.1", + "prettier": "^2.2.1", + "rimraf": "^3.0.2", + "ts-jest": "^24.3.0", + "ts-node": "^8.10.2", + "tslint": "^5.20.1", + "tslint-config-prettier": "^1.18.0", + "tslint-microsoft-contrib": "^6.2.0", + "tsutils": "^3.20.0", + "typedoc": "^0.20.28", + "typescript": "^4.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@babel/cli": { "version": "7.12.16", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.12.16.tgz", "integrity": "sha512-cKWkNCxbpjSuYLbdeJs4kOnyW1E2D65pu7SodXDOkzahIN/wSgT8geIqf6+pJTgCo47zrOMGcJTmjSFe5WKYwQ==", "dev": true, - "requires": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", - "chokidar": "^3.4.0", + "dependencies": { "commander": "^4.0.1", "convert-source-map": "^1.1.0", "fs-readdir-recursive": "^1.1.0", @@ -21,145 +73,196 @@ "slash": "^2.0.0", "source-map": "^0.5.0" }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/cli/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@babel/cli/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@babel/cli/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@babel/cli/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/@babel/cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@babel/cli/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@babel/cli/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@babel/cli/node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@babel/cli/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@babel/cli/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@babel/cli/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@babel/cli/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "@babel/code-frame": { + "node_modules/@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, - "requires": { + "dependencies": { "@babel/highlight": "^7.0.0" } }, - "@babel/compat-data": { + "node_modules/@babel/compat-data": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.13.tgz", "integrity": "sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==", "dev": true }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.12.16", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.16.tgz", "integrity": "sha512-t/hHIB504wWceOeaOoONOhu+gX+hpjfeN6YRBT209X/4sibZQfSF1I0HFRRlBe97UZZosGx5XwUg1ZgNbelmNw==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.12.15", "@babel/helper-module-transforms": "^7.12.13", @@ -176,2712 +279,3884 @@ "semver": "^5.4.1", "source-map": "^0.5.0" }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.12.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", - "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", - "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@babel/generator": { + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/generator": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.7.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, - "@babel/helper-annotate-as-pure": { + "node_modules/@babel/helper-annotate-as-pure": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.12.13" - }, + } + }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/helper-builder-binary-assignment-operator-visitor": { + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-explode-assignable-expression": "^7.12.13", "@babel/types": "^7.12.13" - }, + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/helper-compilation-targets": { + "node_modules/@babel/helper-compilation-targets": { "version": "7.12.16", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.16.tgz", "integrity": "sha512-dBHNEEaZx7F3KoUYqagIhRIeqyyuI65xMndMZ3WwGwEBI609I4TleYQHcrS627vbKyNTXqShoN+fvYD9HuQxAg==", "dev": true, - "requires": { + "dependencies": { "@babel/compat-data": "^7.12.13", "@babel/helper-validator-option": "^7.12.16", "browserslist": "^4.14.5", "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-create-class-features-plugin": { + "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.12.16", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.16.tgz", "integrity": "sha512-KbSEj8l9zYkMVHpQqM3wJNxS1d9h3U9vm/uE5tpjMbaj3lTp+0noe3KPsV5dSD9jxKnf9jO9Ip9FX5PKNZCKow==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-function-name": "^7.12.13", "@babel/helper-member-expression-to-functions": "^7.12.16", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/helper-replace-supers": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13" }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.16.tgz", - "integrity": "sha512-jAcQ1biDYZBdaAxB4yg46/XirgX7jBDiMHDbwYQOgtViLBXGxJpZQ24jutmBqAIB/q+AwB6j+NbBXjKxEY8vqg==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" + "dependencies": { + "@babel/highlight": "^7.12.13" } }, - "@babel/helper-explode-assignable-expression": { + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-function-name": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz", - "integrity": "sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw==", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, - "requires": { - "@babel/types": "^7.12.13" - }, "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "dependencies": { + "@babel/types": "^7.12.13" } }, - "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, - "requires": { - "@babel/types": "^7.7.4" + "dependencies": { + "@babel/types": "^7.12.13" } }, - "@babel/helper-hoist-variables": { + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/highlight": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz", - "integrity": "sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw==", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "dev": true, - "requires": { - "@babel/types": "^7.12.13" - }, "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@babel/helper-member-expression-to-functions": { + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/parser": { "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz", - "integrity": "sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ==", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", "dev": true, - "requires": { - "@babel/types": "^7.12.13" + "bin": { + "parser": "bin/babel-parser.js" }, - "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "engines": { + "node": ">=6.0.0" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/template": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", - "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, - "requires": { - "@babel/types": "^7.12.13" - }, "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/types": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", - "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13", - "@babel/helper-simple-access": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13", - "lodash": "^4.17.19" - }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.12.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", - "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", - "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.16.tgz", + "integrity": "sha512-jAcQ1biDYZBdaAxB4yg46/XirgX7jBDiMHDbwYQOgtViLBXGxJpZQ24jutmBqAIB/q+AwB6j+NbBXjKxEY8vqg==", "dev": true, - "requires": { - "@babel/types": "^7.12.13" - }, "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz", - "integrity": "sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA==", - "dev": true, - "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.12.13", - "@babel/types": "^7.12.13" + "regexpu-core": "^4.7.1" }, - "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-replace-supers": { + "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", - "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz", + "integrity": "sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw==", "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" - }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.12.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", - "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", - "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/helper-simple-access": { + "node_modules/@babel/helper-explode-assignable-expression/node_modules/@babel/types": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", - "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/types": "^7.12.13" - }, "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "node_modules/@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, "dependencies": { - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-get-function-arity": { "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.7.4" } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.16.tgz", - "integrity": "sha512-uCgsDBPUQDvzr11ePPo4TVEocxj8RXjUVSC/Y8N1YpVAI/XDdUwGJu78xmlGhTxj2ntaWM7n9LQdRtyhOzT2YQ==", - "dev": true - }, - "@babel/helper-wrap-function": { + "node_modules/@babel/helper-hoist-variables": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz", - "integrity": "sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw==", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz", + "integrity": "sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw==", "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" - }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.12.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", - "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", - "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/helpers": { + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", - "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" - }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.12.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", - "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", - "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz", + "integrity": "sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ==", "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" + "dependencies": { + "@babel/types": "^7.12.13" } }, - "@babel/parser": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", - "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz", - "integrity": "sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-remap-async-to-generator": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-proposal-class-properties": { + "node_modules/@babel/helper-module-imports": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz", - "integrity": "sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA==", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.16.tgz", - "integrity": "sha512-yiDkYFapVxNOCcBfLnsb/qdsliroM+vc3LHiZwS4gh7pFjo5Xq3BDhYBNn3H3ao+hWPvqeeTdU+s+FIvokov+w==", + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-proposal-export-namespace-from": { + "node_modules/@babel/helper-module-transforms": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "lodash": "^4.17.19" } }, - "@babel/plugin-proposal-json-strings": { + "node_modules/@babel/helper-module-transforms/node_modules/@babel/code-frame": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz", - "integrity": "sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg==", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-json-strings": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/highlight": "^7.12.13" } }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz", - "integrity": "sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ==", + "node_modules/@babel/helper-module-transforms/node_modules/@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-function-name": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz", - "integrity": "sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q==", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-proposal-numeric-separator": { + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-get-function-arity": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-proposal-object-rest-spread": { + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz", - "integrity": "sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg==", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-proposal-optional-catch-binding": { + "node_modules/@babel/helper-module-transforms/node_modules/@babel/highlight": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz", - "integrity": "sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg==", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@babel/plugin-proposal-optional-chaining": { + "node_modules/@babel/helper-module-transforms/node_modules/@babel/parser": { "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.16.tgz", - "integrity": "sha512-O3ohPwOhkwji5Mckb7F/PJpJVJY3DpPsrt/F0Bk40+QMk9QpAIqeGusHWqu/mYqsM8oBa6TziL/2mbERWsUZjg==", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "bin": { + "parser": "bin/babel-parser.js" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "engines": { + "node": ">=6.0.0" } }, - "@babel/plugin-proposal-private-methods": { + "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz", - "integrity": "sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-proposal-unicode-property-regex": { + "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" } }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/helper-module-transforms/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/helper-module-transforms/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz", + "integrity": "sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/highlight": "^7.12.13" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "dependencies": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-syntax-top-level-await": { + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-split-export-declaration": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-syntax-typescript": { + "node_modules/@babel/helper-replace-supers/node_modules/@babel/highlight": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz", - "integrity": "sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "bin": { + "parser": "bin/babel-parser.js" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "engines": { + "node": ">=6.0.0" } }, - "@babel/plugin-transform-async-to-generator": { + "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz", - "integrity": "sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-remap-async-to-generator": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-block-scoped-functions": { + "node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" } }, - "@babel/plugin-transform-block-scoping": { + "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-transform-classes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz", - "integrity": "sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA==", + "node_modules/@babel/helper-replace-supers/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "globals": "^11.1.0" - }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@babel/plugin-transform-computed-properties": { + "node_modules/@babel/helper-replace-supers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helper-simple-access": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz", - "integrity": "sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA==", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-destructuring": { + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz", - "integrity": "sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.1" } }, - "@babel/plugin-transform-duplicate-keys": { + "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.7.4" } }, - "@babel/plugin-transform-for-of": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz", - "integrity": "sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.16.tgz", + "integrity": "sha512-uCgsDBPUQDvzr11ePPo4TVEocxj8RXjUVSC/Y8N1YpVAI/XDdUwGJu78xmlGhTxj2ntaWM7n9LQdRtyhOzT2YQ==", + "dev": true }, - "@babel/plugin-transform-function-name": { + "node_modules/@babel/helper-wrap-function": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz", + "integrity": "sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw==", "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-literals": { + "node_modules/@babel/helper-wrap-function/node_modules/@babel/code-frame": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/highlight": "^7.12.13" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "@babel/plugin-transform-modules-amd": { + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-function-name": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz", - "integrity": "sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA==", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-modules-commonjs": { + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-get-function-arity": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz", - "integrity": "sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-simple-access": "^7.12.13", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-modules-systemjs": { + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-split-export-declaration": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz", - "integrity": "sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA==", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.12.13", - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-modules-umd": { + "node_modules/@babel/helper-wrap-function/node_modules/@babel/highlight": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz", - "integrity": "sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w==", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/plugin-transform-new-target": { + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-object-super": { + "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" } }, - "@babel/plugin-transform-parameters": { + "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz", - "integrity": "sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "node_modules/@babel/helper-wrap-function/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@babel/plugin-transform-regenerator": { + "node_modules/@babel/helper-wrap-function/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helpers": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", - "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", + "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-reserved-words": { + "node_modules/@babel/helpers/node_modules/@babel/code-frame": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/highlight": "^7.12.13" } }, - "@babel/plugin-transform-runtime": { + "node_modules/@babel/helpers/node_modules/@babel/generator": { "version": "7.12.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.15.tgz", - "integrity": "sha512-OwptMSRnRWJo+tJ9v9wgAf72ydXWfYSXWhnQjZing8nGZSDFqU1MBleKM3+DriKkcbv7RagA8gVeB0A1PNlNow==", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "semver": "^5.5.1" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "@babel/plugin-transform-shorthand-properties": { + "node_modules/@babel/helpers/node_modules/@babel/helper-function-name": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-spread": { + "node_modules/@babel/helpers/node_modules/@babel/helper-get-function-arity": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz", - "integrity": "sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg==", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-sticky-regex": { + "node_modules/@babel/helpers/node_modules/@babel/helper-split-export-declaration": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-template-literals": { + "node_modules/@babel/helpers/node_modules/@babel/highlight": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz", - "integrity": "sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg==", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "node_modules/@babel/helpers/node_modules/@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "bin": { + "parser": "bin/babel-parser.js" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "engines": { + "node": ">=6.0.0" } }, - "@babel/plugin-transform-typescript": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.16.tgz", - "integrity": "sha512-88hep+B6dtDOiEqtRzwHp2TYO+CN8nbAV3eh5OpBGPsedug9J6y1JwLKzXRIGGQZDC8NlpxpQMIIxcfIW96Wgw==", + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.16", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-typescript": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-unicode-escapes": { + "node_modules/@babel/helpers/node_modules/@babel/traverse": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" } }, - "@babel/plugin-transform-unicode-regex": { + "node_modules/@babel/helpers/node_modules/@babel/types": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helpers/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@babel/preset-env": { + "node_modules/@babel/helpers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "dependencies": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", + "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz", + "integrity": "sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-remap-async-to-generator": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz", + "integrity": "sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.16.tgz", - "integrity": "sha512-BXCAXy8RE/TzX416pD2hsVdkWo0G+tYd16pwnRV4Sc0fRwTLRS/Ssv8G5RLXUGQv7g4FG7TXkdDJxCjQ5I+Zjg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.16.tgz", + "integrity": "sha512-yiDkYFapVxNOCcBfLnsb/qdsliroM+vc3LHiZwS4gh7pFjo5Xq3BDhYBNn3H3ao+hWPvqeeTdU+s+FIvokov+w==", "dev": true, - "requires": { - "@babel/compat-data": "^7.12.13", - "@babel/helper-compilation-targets": "^7.12.16", - "@babel/helper-module-imports": "^7.12.13", + "dependencies": { "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-validator-option": "^7.12.16", - "@babel/plugin-proposal-async-generator-functions": "^7.12.13", - "@babel/plugin-proposal-class-properties": "^7.12.13", - "@babel/plugin-proposal-dynamic-import": "^7.12.16", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.12.13", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.13", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.12.13", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.13", - "@babel/plugin-proposal-optional-chaining": "^7.12.16", - "@babel/plugin-proposal-private-methods": "^7.12.13", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.12.13", - "@babel/plugin-transform-async-to-generator": "^7.12.13", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.12.13", - "@babel/plugin-transform-computed-properties": "^7.12.13", - "@babel/plugin-transform-destructuring": "^7.12.13", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.12.13", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.12.13", - "@babel/plugin-transform-modules-commonjs": "^7.12.13", - "@babel/plugin-transform-modules-systemjs": "^7.12.13", - "@babel/plugin-transform-modules-umd": "^7.12.13", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.12.13", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.12.13", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.12.13", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.12.13", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.13", - "core-js-compat": "^3.8.0", - "semver": "^5.5.0" + "@babel/plugin-syntax-dynamic-import": "^7.8.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "node_modules/@babel/plugin-proposal-export-namespace-from/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz", + "integrity": "sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-json-strings": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/preset-typescript": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.16.tgz", - "integrity": "sha512-IrYNrpDSuQfNHeqh7gsJsO35xTGyAyGkI1VxOpBEADFtxCqZ77a1RHbJqM3YJhroj7qMkNMkNtcw0lqeZUrzow==", + "node_modules/@babel/plugin-proposal-json-strings/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz", + "integrity": "sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-validator-option": "^7.12.16", - "@babel/plugin-transform-typescript": "^7.12.16" + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz", + "integrity": "sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/register": { + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator/node_modules/@babel/helper-plugin-utils": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.12.13.tgz", - "integrity": "sha512-fnCeRXj970S9seY+973oPALQg61TRvAaW0nRDe1f4ytKqM3fZgsNXewTZWmqZedg74LFIRpg/11dsrPZZvYs2g==", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "lodash": "^4.17.19", - "make-dir": "^2.1.0", - "pirates": "^4.0.0", - "source-map-support": "^0.5.16" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz", + "integrity": "sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-object-rest-spread/node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz", + "integrity": "sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.16.tgz", + "integrity": "sha512-O3ohPwOhkwji5Mckb7F/PJpJVJY3DpPsrt/F0Bk40+QMk9QpAIqeGusHWqu/mYqsM8oBa6TziL/2mbERWsUZjg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz", + "integrity": "sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", + "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz", + "integrity": "sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz", + "integrity": "sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-remap-async-to-generator": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz", + "integrity": "sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz", + "integrity": "sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz", + "integrity": "sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz", + "integrity": "sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz", + "integrity": "sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz", + "integrity": "sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz", + "integrity": "sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.12.13", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz", + "integrity": "sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-new-target/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz", + "integrity": "sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", + "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.15.tgz", + "integrity": "sha512-OwptMSRnRWJo+tJ9v9wgAf72ydXWfYSXWhnQjZing8nGZSDFqU1MBleKM3+DriKkcbv7RagA8gVeB0A1PNlNow==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "semver": "^5.5.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz", + "integrity": "sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz", + "integrity": "sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.16.tgz", + "integrity": "sha512-88hep+B6dtDOiEqtRzwHp2TYO+CN8nbAV3eh5OpBGPsedug9J6y1JwLKzXRIGGQZDC8NlpxpQMIIxcfIW96Wgw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.16", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-typescript": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/preset-env": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.16.tgz", + "integrity": "sha512-BXCAXy8RE/TzX416pD2hsVdkWo0G+tYd16pwnRV4Sc0fRwTLRS/Ssv8G5RLXUGQv7g4FG7TXkdDJxCjQ5I+Zjg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.12.13", + "@babel/helper-compilation-targets": "^7.12.16", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-validator-option": "^7.12.16", + "@babel/plugin-proposal-async-generator-functions": "^7.12.13", + "@babel/plugin-proposal-class-properties": "^7.12.13", + "@babel/plugin-proposal-dynamic-import": "^7.12.16", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.12.13", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.13", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.12.13", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.16", + "@babel/plugin-proposal-private-methods": "^7.12.13", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.12.13", + "@babel/plugin-transform-async-to-generator": "^7.12.13", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.12.13", + "@babel/plugin-transform-computed-properties": "^7.12.13", + "@babel/plugin-transform-destructuring": "^7.12.13", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.12.13", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.12.13", + "@babel/plugin-transform-modules-commonjs": "^7.12.13", + "@babel/plugin-transform-modules-systemjs": "^7.12.13", + "@babel/plugin-transform-modules-umd": "^7.12.13", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.12.13", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.12.13", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.12.13", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.12.13", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.13", + "core-js-compat": "^3.8.0", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.16.tgz", + "integrity": "sha512-IrYNrpDSuQfNHeqh7gsJsO35xTGyAyGkI1VxOpBEADFtxCqZ77a1RHbJqM3YJhroj7qMkNMkNtcw0lqeZUrzow==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-validator-option": "^7.12.16", + "@babel/plugin-transform-typescript": "^7.12.16" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "node_modules/@babel/register": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.12.13.tgz", + "integrity": "sha512-fnCeRXj970S9seY+973oPALQg61TRvAaW0nRDe1f4ytKqM3fZgsNXewTZWmqZedg74LFIRpg/11dsrPZZvYs2g==", + "dev": true, + "dependencies": { + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.19", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.13.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.7.tgz", + "integrity": "sha512-h+ilqoX998mRVM5FtB5ijRuHUDVt5l3yfoOi2uh18Z/O3hvyaHQ39NpxVkCIG5yFs+mLq/ewFp8Bss6zmWv6ZA==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@blakeembrey/deque": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@blakeembrey/deque/-/deque-1.0.5.tgz", + "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==" + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "dependencies": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "dependencies": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/core/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, + "dependencies": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, + "dependencies": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "dependencies": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, + "dependencies": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", + "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz", + "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", + "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz", + "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==", + "dev": true, + "dependencies": { + "jest-diff": "^24.3.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "dev": true + }, + "node_modules/@types/n3": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@types/n3/-/n3-1.4.4.tgz", + "integrity": "sha512-xsWfwyDh0uAH0CXvwqe9vb2UEDafMjRez/pB7yZwbWpd9Olw2wdxaL32FtdHjmmFE6b9i+j249JfRyZnvWkoqg==", + "dependencies": { + "@types/node": "*", + "@types/rdf-js": "*" + } + }, + "node_modules/@types/node": { + "version": "10.17.51", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz", + "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/rdf-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/rdf-js/-/rdf-js-4.0.0.tgz", + "integrity": "sha512-2uaR7ks0380MqzUWGOPOOk9yZIr/6MOaCcaj3ntKgd2PqNocgi8j5kSHIJTDe+5ABtTHqKMSE0v0UqrsT8ibgQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", + "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.1.tgz", + "integrity": "sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "dependencies": { + "string-width": "^2.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "dev": true, + "dependencies": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "dev": true, + "dependencies": { + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-plugin-module-resolver": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz", + "integrity": "sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==", + "dev": true, + "dependencies": { + "find-babel-config": "^1.2.0", + "glob": "^7.1.6", + "pkg-up": "^3.1.0", + "reselect": "^4.0.0", + "resolve": "^1.13.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "dependencies": { + "resolve": "1.1.7" } }, - "@babel/runtime": { - "version": "7.13.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.7.tgz", - "integrity": "sha512-h+ilqoX998mRVM5FtB5ijRuHUDVt5l3yfoOi2uh18Z/O3hvyaHQ39NpxVkCIG5yFs+mLq/ewFp8Bss6zmWv6ZA==", - "requires": { - "regenerator-runtime": "^0.13.4" - } + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true }, - "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "node_modules/browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "dependencies": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" } }, - "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" } }, - "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" + "dependencies": { + "node-int64": "^0.4.0" } }, - "@blakeembrey/deque": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@blakeembrey/deque/-/deque-1.0.5.tgz", - "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==" + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, - "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" + "engines": { + "node": ">=0.10.0" } }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" + "engines": { + "node": ">=4" } }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "engines": { + "node": ">=6" } }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" + "engines": { + "node": ">=4" } }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "node_modules/caniuse-lite": { + "version": "1.0.30001187", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz", + "integrity": "sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA==", + "dev": true + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "node_modules/capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", - "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", "dev": true, - "optional": true, - "requires": { + "dependencies": { "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", @@ -2893,2307 +4168,1896 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" } }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "@types/babel__generator": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz", - "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==", + "node_modules/cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "engines": { + "node": ">=0.10.0" } }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, - "requires": { - "@babel/types": "^7.3.0" + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" } }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@types/jest": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz", - "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "jest-diff": "^24.3.0" + "dependencies": { + "color-name": "1.1.3" } }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "node_modules/colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, - "@types/n3": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@types/n3/-/n3-1.4.4.tgz", - "integrity": "sha512-xsWfwyDh0uAH0CXvwqe9vb2UEDafMjRez/pB7yZwbWpd9Olw2wdxaL32FtdHjmmFE6b9i+j249JfRyZnvWkoqg==", - "requires": { - "@types/node": "*", - "@types/rdf-js": "*" + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" } }, - "@types/node": { - "version": "10.17.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz", - "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg==" + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "@types/rdf-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/rdf-js/-/rdf-js-4.0.0.tgz", - "integrity": "sha512-2uaR7ks0380MqzUWGOPOOk9yZIr/6MOaCcaj3ntKgd2PqNocgi8j5kSHIJTDe+5ABtTHqKMSE0v0UqrsT8ibgQ==", - "requires": { - "@types/node": "*" + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dev": true, + "dependencies": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "node_modules/configstore/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "@types/yargs": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", - "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true, - "requires": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=0.10.0" } }, - "@types/yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", + "node_modules/core-js-compat": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", + "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.1", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", - "dev": true + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true + "node_modules/cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "dependencies": { + "cssom": "0.3.x" + } }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "dependencies": { + "assert-plus": "^1.0.0" }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" } }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } }, - "ajv": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.1.tgz", - "integrity": "sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true, - "requires": { - "string-width": "^2.0.0" + "engines": { + "node": ">=0.10" } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, - "requires": { - "color-convert": "^1.9.0" + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" } }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "node_modules/define-property/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "node_modules/define-property/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + "node_modules/define-property/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "node_modules/define-property/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, - "requires": { - "safer-buffer": "~2.1.0" + "engines": { + "node": ">=0.10.0" } }, - "assert-plus": { + "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "node_modules/detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true + "node_modules/diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true, + "engines": { + "node": ">= 6" + } }, - "async-limiter": { + "node_modules/domexception": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "dependencies": { + "webidl-conversions": "^4.0.2" + } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.664", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.664.tgz", + "integrity": "sha512-yb8LrTQXQnh9yhnaIHLk6CYugF/An50T20+X0h++hjjhVfgSp1DGoMSYycF8/aD5eiqS4QwaNhiduFvK8rifRg==", "dev": true }, - "aws4": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", - "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" + "engines": { + "node": ">= 4" } }, - "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, "dependencies": { - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "once": "^1.4.0" } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { - "object.assign": "^4.1.0" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "node_modules/es-abstract": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.2.tgz", + "integrity": "sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "babel-plugin-module-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz", - "integrity": "sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "requires": { - "find-babel-config": "^1.2.0", - "glob": "^7.1.6", - "pkg-up": "^3.1.0", - "reselect": "^4.0.0", - "resolve": "^1.13.1" + "engines": { + "node": ">=6" } }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" + "engines": { + "node": ">=0.8.0" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "node_modules/escodegen/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true, - "requires": { - "tweetnacl": "^0.14.3" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=4.0" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "engines": { + "node": ">=0.10.0" } }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "node_modules/exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, - "requires": { - "resolve": "1.1.7" + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "engines": { + "node": ">= 0.8.0" } }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, - "requires": { - "node-int64": "^0.4.0" + "dependencies": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + }, + "engines": { + "node": ">= 6" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, - "requires": { - "callsites": "^2.0.0" - }, "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } + "engines": [ + "node >=0.6.0" + ] }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "caniuse-lite": { - "version": "1.0.30001187", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz", - "integrity": "sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "capture-exit": { + "node_modules/fb-watchman": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "dev": true, - "requires": { - "rsvp": "^4.8.4" + "dependencies": { + "bser": "^2.0.0" } }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "node_modules/find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "dependencies": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "node_modules/find-babel-config/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "bin": { + "json5": "lib/cli.js" } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true, - "requires": { - "color-name": "1.1.3" + "engines": { + "node": ">=0.10.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "requires": { - "delayed-stream": "~1.0.0" + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "configstore": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", - "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "node_modules/fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "bundleDependencies": [ + "node-pre-gyp" + ], + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", "dev": true, - "requires": { - "dot-prop": "^4.2.1", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - } + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "engines": { + "node": ">=4.0" } }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "node_modules/fsevents/node_modules/abbrev": { + "version": "1.1.1", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/ansi-regex": { + "version": "2.1.1", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "node_modules/fsevents/node_modules/aproba": { + "version": "1.2.0", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "inBundle": true, + "optional": true }, - "core-js-compat": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", - "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", + "node_modules/fsevents/node_modules/are-we-there-yet": { + "version": "1.1.5", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, - "requires": { - "browserslist": "^4.16.1", - "semver": "7.0.0" - }, + "inBundle": true, + "optional": true, "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "node_modules/fsevents/node_modules/balanced-match": { + "version": "1.0.0", + "integrity": "sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==", + "dev": true, + "inBundle": true, + "optional": true }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "node_modules/fsevents/node_modules/brace-expansion": { + "version": "1.1.11", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, + "inBundle": true, + "optional": true, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "node_modules/fsevents/node_modules/chownr": { + "version": "1.1.1", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } + "inBundle": true, + "optional": true }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/fsevents/node_modules/code-point-at": { + "version": "1.1.0", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true + "node_modules/fsevents/node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "inBundle": true, + "optional": true }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true + "node_modules/fsevents/node_modules/console-control-strings": { + "version": "1.1.0", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "inBundle": true, + "optional": true }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "node_modules/fsevents/node_modules/core-util-is": { + "version": "1.0.2", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true, - "requires": { - "cssom": "0.3.x" + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/debug": { + "version": "4.1.1", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/fsevents/node_modules/deep-extend": { + "version": "0.6.0", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "requires": { - "assert-plus": "^1.0.0" + "inBundle": true, + "optional": true, + "engines": { + "node": ">=4.0.0" } }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "node_modules/fsevents/node_modules/delegates": { + "version": "1.0.0", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/detect-libc": { + "version": "1.0.3", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "inBundle": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" }, - "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } + "engines": { + "node": ">=0.10" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/fsevents/node_modules/fs-minipass": { + "version": "1.2.5", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, - "requires": { - "ms": "2.0.0" + "inBundle": true, + "optional": true, + "dependencies": { + "minipass": "^2.2.1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "node_modules/fsevents/node_modules/fs.realpath": { + "version": "1.0.0", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "inBundle": true, + "optional": true }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "node_modules/fsevents/node_modules/gauge": { + "version": "2.7.4", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "node_modules/fsevents/node_modules/glob": { + "version": "7.1.3", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "node_modules/fsevents/node_modules/has-unicode": { + "version": "2.0.1", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "inBundle": true, + "optional": true }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "node_modules/fsevents/node_modules/iconv-lite": { + "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": { - "object-keys": "^1.0.12" + "inBundle": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/fsevents/node_modules/ignore-walk": { + "version": "3.0.1", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - }, + "inBundle": true, + "optional": true, "dependencies": { - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "minimatch": "^3.0.4" + } + }, + "node_modules/fsevents/node_modules/inflight": { + "version": "1.0.6", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "delayed-stream": { + "node_modules/fsevents/node_modules/inherits": { + "version": "2.0.3", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true + "node_modules/fsevents/node_modules/isarray": { + "version": "1.0.0", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "inBundle": true, + "optional": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "node_modules/fsevents/node_modules/minimatch": { + "version": "3.0.4", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", - "dev": true + "node_modules/fsevents/node_modules/minimist": { + "version": "0.0.8", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true, + "inBundle": true, + "optional": true }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "node_modules/fsevents/node_modules/minipass": { + "version": "2.3.5", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" + "inBundle": true, + "optional": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "node_modules/fsevents/node_modules/minizlib": { + "version": "1.2.1", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, - "requires": { - "is-obj": "^1.0.0" + "inBundle": true, + "optional": true, + "dependencies": { + "minipass": "^2.2.1" } }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true + "node_modules/fsevents/node_modules/mkdirp": { + "version": "0.5.1", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "node_modules/fsevents/node_modules/ms": { + "version": "2.1.1", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "inBundle": true, + "optional": true }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "node_modules/fsevents/node_modules/needle": { + "version": "2.3.0", + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "inBundle": true, + "optional": true, + "dependencies": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" } }, - "electron-to-chromium": { - "version": "1.3.664", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.664.tgz", - "integrity": "sha512-yb8LrTQXQnh9yhnaIHLk6CYugF/An50T20+X0h++hjjhVfgSp1DGoMSYycF8/aD5eiqS4QwaNhiduFvK8rifRg==", - "dev": true + "node_modules/fsevents/node_modules/node-pre-gyp": { + "version": "0.12.0", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "node_modules/fsevents/node_modules/nopt": { + "version": "4.0.1", + "integrity": "sha512-+5XZFpQZEY0cg5JaxLwGxDlKNKYxuXwGt8/Oi3UXm5/4ymrJve9d2CURituxv3rSrVCGZj4m1U1JlHTdcKt2Ng==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "node_modules/fsevents/node_modules/npm-bundled": { + "version": "1.0.6", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true, + "inBundle": true, + "optional": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/fsevents/node_modules/npm-packlist": { + "version": "1.4.1", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "dev": true, - "requires": { - "once": "^1.4.0" + "inBundle": true, + "optional": true, + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/fsevents/node_modules/npmlog": { + "version": "4.1.2", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, - "requires": { - "is-arrayish": "^0.2.1" + "inBundle": true, + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, - "es-abstract": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.2.tgz", - "integrity": "sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==", + "node_modules/fsevents/node_modules/number-is-nan": { + "version": "1.0.1", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/fsevents/node_modules/object-assign": { + "version": "4.1.1", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", - "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "node_modules/fsevents/node_modules/once": { + "version": "1.4.0", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, + "inBundle": true, + "optional": true, "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } + "wrappy": "1" } }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "node_modules/fsevents/node_modules/os-homedir": { + "version": "1.0.2", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true + "node_modules/fsevents/node_modules/os-tmpdir": { + "version": "1.0.2", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "node_modules/fsevents/node_modules/osenv": { + "version": "0.1.5", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, + "inBundle": true, + "optional": true, "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "node_modules/fsevents/node_modules/path-is-absolute": { + "version": "1.0.1", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "node_modules/fsevents/node_modules/process-nextick-args": { + "version": "2.0.0", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/rc": { + "version": "1.2.8", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "node_modules/fsevents/node_modules/rc/node_modules/minimist": { + "version": "1.2.0", + "integrity": "sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==", + "dev": true, + "inBundle": true, + "optional": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/fsevents/node_modules/readable-stream": { + "version": "2.3.6", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, - "requires": { - "is-extendable": "^0.1.0" + "inBundle": true, + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, + "node_modules/fsevents/node_modules/rimraf": { + "version": "2.6.3", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "inBundle": true, + "optional": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "node_modules/fsevents/node_modules/safe-buffer": { + "version": "5.1.2", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "inBundle": true, + "optional": true }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "node_modules/fsevents/node_modules/safer-buffer": { + "version": "2.1.2", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "inBundle": true, + "optional": true }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "node_modules/fsevents/node_modules/sax": { + "version": "1.2.4", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "inBundle": true, + "optional": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "node_modules/fsevents/node_modules/semver": { + "version": "5.7.0", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true, + "inBundle": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } }, - "fb-watchman": { + "node_modules/fsevents/node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, - "requires": { - "bser": "^2.0.0" - } + "inBundle": true, + "optional": true }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "node_modules/fsevents/node_modules/signal-exit": { + "version": "3.0.2", + "integrity": "sha512-meQNNykwecVxdu1RlYMKpQx4+wefIYpmxi6gexo/KAbwquJrBUrBmKYJrE8KFkVQAAVWEnwNdu21PgrD77J3xA==", "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } + "inBundle": true, + "optional": true }, - "find-babel-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", - "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "node_modules/fsevents/node_modules/string_decoder": { + "version": "1.1.1", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "requires": { - "json5": "^0.5.1", - "path-exists": "^3.0.0" - }, + "inBundle": true, + "optional": true, "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - } + "safe-buffer": "~5.1.0" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "node_modules/fsevents/node_modules/string-width": { + "version": "1.0.2", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "inBundle": true, + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/fsevents/node_modules/strip-ansi": { + "version": "3.0.1", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, - "requires": { - "locate-path": "^3.0.0" + "inBundle": true, + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/fsevents/node_modules/strip-json-comments": { + "version": "2.0.1", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/fsevents/node_modules/tar": { + "version": "4.4.8", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, - "requires": { - "map-cache": "^0.2.2" + "inBundle": true, + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "engines": { + "node": ">=4.5" } }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/fsevents/node_modules/util-deprecate": { + "version": "1.0.2", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "inBundle": true, + "optional": true }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "node_modules/fsevents/node_modules/wide-align": { + "version": "1.1.3", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, + "inBundle": true, "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true - } + "string-width": "^1.0.2 || 2" } }, - "function-bind": { + "node_modules/fsevents/node_modules/wrappy": { + "version": "1.0.2", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/yallist": { + "version": "3.0.3", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-intrinsic": { + "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "get-stdin": { + "node_modules/get-stdin": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "get-stream": { + "node_modules/get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "get-value": { + "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "getpass": { + "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, - "requires": { + "dependencies": { "assert-plus": "^1.0.0" } }, - "glob": { + "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, - "requires": { + "dependencies": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" - }, + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "global-dirs": { + "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, - "requires": { + "dependencies": { "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" } }, - "globals": { + "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "got": { + "node_modules/got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, - "requires": { + "dependencies": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", "get-stream": "^3.0.0", @@ -5205,168 +6069,213 @@ "timed-out": "^4.0.0", "unzip-response": "^2.0.1", "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, - "growly": { + "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, - "handlebars": { + "node_modules/handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.0", "source-map": "^0.6.1", - "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "har-schema": { + "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "har-validator": { + "node_modules/har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "deprecated": "this library is no longer supported", "dev": true, - "requires": { + "dependencies": { "ajv": "^6.5.5", "har-schema": "^2.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "has": { + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "has-flag": { + "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "has-symbols": { + "node_modules/has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-value": { + "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, - "requires": { + "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "has-values": { + "node_modules/has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, - "requires": { + "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "hosted-git-info": { + "node_modules/hosted-git-info": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", "dev": true }, - "html-encoding-sniffer": { + "node_modules/html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, - "requires": { + "dependencies": { "whatwg-encoding": "^1.0.1" } }, - "html-escaper": { + "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-signature": { + "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, - "requires": { + "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "husky": { + "node_modules/husky": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/husky/-/husky-3.1.0.tgz", "integrity": "sha512-FJkPoHHB+6s4a+jwPqBudBDvYZsoQW5/HBuMSehC8qDiCe50kpcxeqFoDSlow+9I6wg47YxBoT3WxaURlrDIIQ==", "dev": true, - "requires": { + "hasInstallScript": true, + "dependencies": { "chalk": "^2.4.2", "ci-info": "^2.0.0", "cosmiconfig": "^5.2.1", @@ -5379,440 +6288,587 @@ "run-node": "^1.0.0", "slash": "^3.0.0" }, + "bin": { + "husky-run": "run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=8.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/husky" + } + }, + "node_modules/husky/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "ignore": { + "node_modules/ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "engines": { + "node": ">= 4" + } }, - "ignore-by-default": { + "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "import-fresh": { + "node_modules/import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, - "requires": { + "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "import-lazy": { + "node_modules/import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "import-local": { + "node_modules/import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, - "requires": { + "dependencies": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { + "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "interpret": { + "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "invariant": { + "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, - "requires": { + "dependencies": { "loose-envify": "^1.0.0" } }, - "is-accessor-descriptor": { + "node_modules/is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^6.0.0" }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-buffer": { + "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { + "node_modules/is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "is-ci": { + "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, - "requires": { + "dependencies": { "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "is-data-descriptor": { + "node_modules/is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^6.0.0" }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "is-date-object": { + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "is-descriptor": { + "node_modules/is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, - "requires": { + "dependencies": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "is-directory": { + "node_modules/is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-extendable": { + "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "is-generator-fn": { + "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-installed-globally": { + "node_modules/is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, - "requires": { + "dependencies": { "global-dirs": "^0.1.0", "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "is-npm": { + "node_modules/is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-number": { + "node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-obj": { + "node_modules/is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-path-inside": { + "node_modules/is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, - "requires": { + "dependencies": { "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-plain-object": { + "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-redirect": { + "node_modules/is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-regex": { + "node_modules/is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, - "requires": { + "dependencies": { "has": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" } }, - "is-retry-allowed": { + "node_modules/is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-stream": { + "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-symbol": { + "node_modules/is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, - "requires": { + "dependencies": { "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-typedarray": { + "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-windows": { + "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-wsl": { + "node_modules/is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "isobject": { + "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "isstream": { + "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-lib-coverage": { + "node_modules/istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "istanbul-lib-instrument": { + "node_modules/istanbul-lib-instrument": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, - "requires": { + "dependencies": { "@babel/generator": "^7.4.0", "@babel/parser": "^7.4.3", "@babel/template": "^7.4.0", @@ -5821,141 +6877,146 @@ "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "istanbul-lib-report": { + "node_modules/istanbul-lib-report": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, - "requires": { + "dependencies": { "istanbul-lib-coverage": "^2.0.5", "make-dir": "^2.1.0", "supports-color": "^6.1.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "istanbul-lib-source-maps": { + "node_modules/istanbul-lib-source-maps": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^2.0.5", "make-dir": "^2.1.0", "rimraf": "^2.6.3", "source-map": "^0.6.1" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "ms": "^2.1.1" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "istanbul-reports": { + "node_modules/istanbul-reports": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "dev": true, - "requires": { + "dependencies": { "html-escaper": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "jest": { + "node_modules/jest": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, - "requires": { + "dependencies": { "import-local": "^2.0.0", "jest-cli": "^24.9.0" }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dev": true, - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 6" } }, - "jest-changed-files": { + "node_modules/jest-changed-files": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-config": { + "node_modules/jest-config": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.1.0", "@jest/test-sequencer": "^24.9.0", "@jest/types": "^24.9.0", @@ -5973,85 +7034,105 @@ "micromatch": "^3.1.10", "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-diff": { + "node_modules/jest-diff": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.0.1", "diff-sequences": "^24.9.0", "jest-get-type": "^24.9.0", "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-docblock": { + "node_modules/jest-docblock": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, - "requires": { + "dependencies": { "detect-newline": "^2.1.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-each": { + "node_modules/jest-each": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.9.0", "chalk": "^2.0.1", "jest-get-type": "^24.9.0", "jest-util": "^24.9.0", "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-environment-jsdom": { + "node_modules/jest-environment-jsdom": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^24.9.0", "@jest/fake-timers": "^24.9.0", "@jest/types": "^24.9.0", "jest-mock": "^24.9.0", "jest-util": "^24.9.0", "jsdom": "^11.5.1" + }, + "engines": { + "node": ">= 6" } }, - "jest-environment-node": { + "node_modules/jest-environment-node": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^24.9.0", "@jest/fake-timers": "^24.9.0", "@jest/types": "^24.9.0", "jest-mock": "^24.9.0", "jest-util": "^24.9.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-get-type": { + "node_modules/jest-get-type": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6" + } }, - "jest-haste-map": { + "node_modules/jest-haste-map": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.9.0", "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", "jest-serializer": "^24.9.0", @@ -6060,14 +7141,20 @@ "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" + }, + "engines": { + "node": ">= 6" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" } }, - "jest-jasmine2": { + "node_modules/jest-jasmine2": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, - "requires": { + "dependencies": { "@babel/traverse": "^7.1.0", "@jest/environment": "^24.9.0", "@jest/test-result": "^24.9.0", @@ -6084,36 +7171,45 @@ "jest-util": "^24.9.0", "pretty-format": "^24.9.0", "throat": "^4.0.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-leak-detector": { + "node_modules/jest-leak-detector": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, - "requires": { + "dependencies": { "jest-get-type": "^24.9.0", "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-matcher-utils": { + "node_modules/jest-matcher-utils": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.0.1", "jest-diff": "^24.9.0", "jest-get-type": "^24.9.0", "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-message-util": { + "node_modules/jest-message-util": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "@jest/test-result": "^24.9.0", "@jest/types": "^24.9.0", @@ -6122,59 +7218,85 @@ "micromatch": "^3.1.10", "slash": "^2.0.0", "stack-utils": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "jest-mock": { + "node_modules/jest-mock": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.9.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-pnp-resolver": { + "node_modules/jest-pnp-resolver": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } }, - "jest-regex-util": { + "node_modules/jest-regex-util": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6" + } }, - "jest-resolve": { + "node_modules/jest-resolve": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", "realpath-native": "^1.1.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-resolve-dependencies": { + "node_modules/jest-resolve-dependencies": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", "jest-snapshot": "^24.9.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-runner": { + "node_modules/jest-runner": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^24.7.1", "@jest/environment": "^24.9.0", "@jest/test-result": "^24.9.0", @@ -6194,14 +7316,17 @@ "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-runtime": { + "node_modules/jest-runtime": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^24.7.1", "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", @@ -6225,20 +7350,29 @@ "slash": "^2.0.0", "strip-bom": "^3.0.0", "yargs": "^13.3.0" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 6" } }, - "jest-serializer": { + "node_modules/jest-serializer": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6" + } }, - "jest-snapshot": { + "node_modules/jest-snapshot": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.0.0", "@jest/types": "^24.9.0", "chalk": "^2.0.1", @@ -6253,21 +7387,25 @@ "pretty-format": "^24.9.0", "semver": "^6.2.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "jest-util": { + "node_modules/jest-util": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^24.9.0", "@jest/fake-timers": "^24.9.0", "@jest/source-map": "^24.9.0", @@ -6281,21 +7419,25 @@ "slash": "^2.0.0", "source-map": "^0.6.0" }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-util/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "jest-validate": { + "node_modules/jest-validate": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.9.0", "camelcase": "^5.3.1", "chalk": "^2.0.1", @@ -6303,21 +7445,25 @@ "leven": "^3.1.0", "pretty-format": "^24.9.0" }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" } }, - "jest-watcher": { + "node_modules/jest-watcher": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, - "requires": { + "dependencies": { "@jest/test-result": "^24.9.0", "@jest/types": "^24.9.0", "@types/yargs": "^13.0.0", @@ -6325,47 +7471,81 @@ "chalk": "^2.0.1", "jest-util": "^24.9.0", "string-length": "^2.0.0" + }, + "engines": { + "node": ">= 6" } }, - "jest-worker": { + "node_modules/jest-worker": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "dev": true, - "requires": { + "dependencies": { "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "dev": true, + "dependencies": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 6" } }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "jsbn": { + "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "jsdom": { + "node_modules/jsdom": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "dev": true, - "requires": { + "dependencies": { "abab": "^2.0.0", "acorn": "^5.5.3", "acorn-globals": "^4.1.0", @@ -6394,311 +7574,375 @@ "xml-name-validator": "^3.0.0" } }, - "jsesc": { + "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } }, - "json-parse-better-errors": { + "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { + "node_modules/json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "json-stringify-safe": { + "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json5": { + "node_modules/json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.5" }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "jsonfile": { + "node_modules/json5/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "requires": { - "graceful-fs": "^4.1.6", + "dependencies": { "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "jsprim": { + "node_modules/jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, - "kind-of": { + "node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, - "requires": { + "dependencies": { "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "kleur": { + "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "language-subtag-registry": { + "node_modules/language-subtag-registry": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==" }, - "language-tags": { + "node_modules/language-tags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "requires": { + "dependencies": { "language-subtag-registry": "~0.3.2" } }, - "latest-version": { + "node_modules/latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, - "requires": { + "dependencies": { "package-json": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "left-pad": { + "node_modules/left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "deprecated": "use String.prototype.padStart()", "dev": true }, - "leven": { + "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "levn": { + "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "lines-and-columns": { + "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "load-json-file": { + "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "loader-utils": { + "node_modules/loader-utils": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "dev": true, - "requires": { + "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "locate-path": { + "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "lodash": { + "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.memoize": { + "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, - "lodash.sortby": { + "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "loose-envify": { + "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, - "requires": { + "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "lowercase-keys": { + "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "lru-cache": { + "node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, - "requires": { + "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" - }, - "dependencies": { - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } } }, - "lunr": { + "node_modules/lru-cache/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/lunr": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true }, - "make-dir": { + "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "requires": { + "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" } }, - "make-error": { + "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "makeerror": { + "node_modules/makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, - "requires": { + "dependencies": { "tmpl": "1.0.x" } }, - "map-cache": { + "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "map-visit": { + "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, - "requires": { + "dependencies": { "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "marked": { + "node_modules/marked": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.0.tgz", "integrity": "sha512-NqRSh2+LlN2NInpqTQnS614Y/3NkVMFFU6sJlRFEpxJ/LHuK/qJECH7/fXZjk4VZstPW/Pevjil/VtSONsLc7Q==", - "dev": true + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } }, - "memorystream": { + "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10.0" + } }, - "merge-stream": { + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "micromatch": { + "node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, - "requires": { + "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", @@ -6713,150 +7957,183 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "mime-db": { + "node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime-db": { "version": "1.42.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.25", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", "dev": true, - "requires": { + "dependencies": { "mime-db": "1.42.0" + }, + "engines": { + "node": ">= 0.6" } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mixin-deep": { + "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, - "requires": { + "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "mkdirp": { + "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "module-alias": { + "node_modules/module-alias": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", "dev": true }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "n3": { + "node_modules/n3": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/n3/-/n3-1.8.0.tgz", "integrity": "sha512-/PEmoB3UJrG6aXGZenDHFBJtmPp2rtfB2YLzAm2dU9stInD+ztvy4fKv5fv2ggsrSlpu7BYDTsz/c6S391uuEg==", - "requires": { + "dependencies": { "queue-microtask": "^1.1.2", "readable-stream": "^3.6.0" }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/n3/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "nan": { + "node_modules/nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true, "optional": true }, - "nanomatch": { + "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, - "requires": { + "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", @@ -6869,80 +8146,96 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "neo-async": { + "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nice-try": { + "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-int64": { + "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node-modules-regexp": { + "node_modules/node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node-notifier": { + "node_modules/node-notifier": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, - "requires": { + "dependencies": { "growly": "^1.3.0", "is-wsl": "^1.1.0", "semver": "^5.5.0", @@ -6950,18 +8243,19 @@ "which": "^1.3.0" } }, - "node-releases": { + "node_modules/node-releases": { "version": "1.1.70", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", "dev": true }, - "nodemon": { + "node_modules/nodemon": { "version": "1.19.4", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", "dev": true, - "requires": { + "hasInstallScript": true, + "dependencies": { "chokidar": "^2.1.8", "debug": "^3.2.6", "ignore-by-default": "^1.0.1", @@ -6973,56 +8267,70 @@ "undefsafe": "^2.0.2", "update-notifier": "^2.5.0" }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ms": "^2.1.1" } }, - "nopt": { + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", "dev": true, - "requires": { + "dependencies": { "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" } }, - "normalize-package-data": { + "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "requires": { + "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-all": { + "node_modules/npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", "cross-spawn": "^6.0.5", @@ -7032,106 +8340,144 @@ "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, - "requires": { + "dependencies": { "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "nwsapi": { + "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, - "oauth-sign": { + "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "object-copy": { + "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, - "requires": { + "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" } }, - "object-inspect": { + "node_modules/object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-keys": { + "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "object-visit": { + "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.assign": { + "node_modules/object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.getownpropertydescriptors": { + "node_modules/object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, - "requires": { + "dependencies": { "define-properties": "^1.1.2", "es-abstract": "^1.5.1" + }, + "engines": { + "node": ">= 0.8" } }, - "object.pick": { + "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "onchange": { + "node_modules/onchange": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/onchange/-/onchange-6.1.1.tgz", "integrity": "sha512-G60OULp9Hi2dixPKYn/lfs7C8oDgFcneAhZ/4nPnvzd+Ar94q3FN0UG/t1zqXI15StSLvt7NlRqylamTSGhc4A==", - "requires": { + "dependencies": { "@blakeembrey/deque": "^1.0.3", "arrify": "^2.0.0", "chokidar": "^3.0.0", @@ -7141,560 +8487,753 @@ "supports-color": "^7.0.0", "tree-kill": "^1.2.2" }, + "bin": { + "onchange": "cli.js" + } + }, + "node_modules/onchange/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/onchange/node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/onchange/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/onchange/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/onchange/node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/onchange/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/onchange/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/onchange/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/onchange/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/onchange/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "onigasm": { + "node_modules/onigasm": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", "dev": true, - "requires": { + "dependencies": { "lru-cache": "^5.1.1" - }, + } + }, + "node_modules/onigasm/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - } + "yallist": "^3.0.2" } }, - "ontouml-schema": { + "node_modules/ontouml-schema": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/ontouml-schema/-/ontouml-schema-0.2.4.tgz", "integrity": "sha512-7EviIXV5KcX++Xl7hPGY4Qtyy64tiDAHpHuuAccnw90dX8mkj8lpaShJVYwodtaC2R2vNGGMDMwSqvFCb3NXTw==", - "requires": { + "dependencies": { "ajv": "^6.10.0", "onchange": "^6.1.0", "prettier": "^1.19.1" - }, + } + }, + "node_modules/ontouml-schema/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" - } + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ontouml-schema/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/ontouml-schema/node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" } }, - "opencollective-postinstall": { + "node_modules/opencollective-postinstall": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", - "dev": true + "dev": true, + "bin": { + "opencollective-postinstall": "index.js" + } }, - "optionator": { + "node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, - "requires": { + "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, - "p-each-series": { + "node_modules/p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "dev": true, - "requires": { + "dependencies": { "p-reduce": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "p-finally": { + "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "p-limit": { + "node_modules/p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, - "requires": { + "dependencies": { "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "p-locate": { + "node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "p-reduce": { + "node_modules/p-reduce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "package-json": { + "node_modules/package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, - "requires": { + "dependencies": { "got": "^6.7.1", "registry-auth-token": "^3.0.1", "registry-url": "^3.0.3", "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" } }, - "parse-json": { + "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "requires": { + "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "parse5": { + "node_modules/parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, - "pascalcase": { + "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-dirname": { + "node_modules/path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, - "path-exists": { + "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-is-inside": { + "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, - "path-key": { + "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-type": { + "node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, - "requires": { + "dependencies": { "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "performance-now": { + "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pidtree": { + "node_modules/pidtree": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", - "dev": true + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } }, - "pify": { + "node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "pirates": { + "node_modules/pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, - "requires": { + "dependencies": { "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, - "requires": { + "dependencies": { "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "pkg-up": { + "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "dev": true, - "requires": { + "dependencies": { "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "please-upgrade-node": { + "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, - "requires": { + "dependencies": { "semver-compare": "^1.0.0" } }, - "pn": { + "node_modules/pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, - "posix-character-classes": { + "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "prelude-ls": { + "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "prepend-http": { + "node_modules/prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "prettier": { + "node_modules/prettier": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "dev": true + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } }, - "pretty-format": { + "node_modules/pretty-format": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" + }, + "engines": { + "node": ">= 6" } }, - "process-nextick-args": { + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "progress": { + "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "prompts": { + "node_modules/prompts": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", "dev": true, - "requires": { + "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.3" + }, + "engines": { + "node": ">= 6" } }, - "pseudomap": { + "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, - "psl": { + "node_modules/psl": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.5.0.tgz", "integrity": "sha512-4vqUjKi2huMu1OJiLhi3jN6jeeKvMZdI1tYgi/njW5zV52jNLgSAZSdN16m9bJFe61/cT8ulmw4qFitV9QRsEA==", "dev": true }, - "pstree.remy": { + "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "pump": { + "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, - "requires": { + "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "punycode": { + "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } }, - "qs": { + "node_modules/qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6" + } }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==" + "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "rc": { + "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "requires": { + "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "react-is": { + "node_modules/react-is": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", "dev": true }, - "read-pkg": { + "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, - "requires": { + "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "read-pkg-up": { + "node_modules/read-pkg-up": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, - "requires": { + "dependencies": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "readable-stream": { + "node_modules/readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, - "requires": { + "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", @@ -7702,185 +9241,219 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } } }, - "readdirp": { + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" } }, - "realpath-native": { + "node_modules/realpath-native": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, - "requires": { + "dependencies": { "util.promisify": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "rechoir": { + "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, - "requires": { + "dependencies": { "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "regenerate": { + "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, - "regenerate-unicode-properties": { + "node_modules/regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, - "requires": { + "dependencies": { "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" } }, - "regenerator-runtime": { + "node_modules/regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, - "regenerator-transform": { + "node_modules/regenerator-transform": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dev": true, - "requires": { + "dependencies": { "@babel/runtime": "^7.8.4" } }, - "regex-not": { + "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "regexpu-core": { + "node_modules/regexpu-core": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, - "requires": { + "dependencies": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", "regjsgen": "^0.5.1", "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" } }, - "registry-auth-token": { + "node_modules/registry-auth-token": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, - "requires": { + "dependencies": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" } }, - "registry-url": { + "node_modules/registry-url": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, - "requires": { + "dependencies": { "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "regjsgen": { + "node_modules/regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, - "regjsparser": { + "node_modules/regjsparser": { "version": "0.6.7", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", "dev": true, - "requires": { + "dependencies": { "jsesc": "~0.5.0" }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" } }, - "remove-trailing-separator": { + "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "repeat-element": { + "node_modules/repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "repeat-string": { + "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "request": { + "node_modules/request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, - "requires": { + "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", @@ -7902,152 +9475,204 @@ "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } + "engines": { + "node": ">= 4" } }, - "request-promise-core": { + "node_modules/request-promise-core": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, - "requires": { + "dependencies": { "lodash": "^4.17.15" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "request-promise-native": { + "node_modules/request-promise-native": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", "dev": true, - "requires": { + "dependencies": { "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "dependencies": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-from-string": { + "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "reselect": { + "node_modules/reselect": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==", "dev": true }, - "resolve": { + "node_modules/resolve": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", "dev": true, - "requires": { + "dependencies": { "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "resolve-url": { + "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, - "ret": { + "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12" + } }, - "rimraf": { + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "rsvp": { + "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } }, - "run-node": { + "node_modules/run-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", - "dev": true + "dev": true, + "bin": { + "run-node": "run-node" + }, + "engines": { + "node": ">=4" + } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true }, - "safe-regex": { + "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, - "requires": { + "dependencies": { "ret": "~0.1.10" } }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sane": { + "node_modules/sane": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", "dev": true, - "requires": { + "dependencies": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", "capture-exit": "^2.0.0", @@ -8057,156 +9682,195 @@ "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "sax": { + "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, - "schema-utils": { + "node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, - "requires": { + "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "semver": { + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver" + } }, - "semver-compare": { + "node_modules/semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, - "semver-diff": { + "node_modules/semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, - "requires": { + "dependencies": { "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" } }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-value": { + "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "shell-quote": { + "node_modules/shell-quote": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", "dev": true }, - "shelljs": { + "node_modules/shelljs": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" } }, - "shellwords": { + "node_modules/shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, - "shiki": { + "node_modules/shiki": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.2.tgz", "integrity": "sha512-BjUCxVbxMnvjs8jC4b+BQ808vwjJ9Q8NtLqPwXShZ307HdXiDFYP968ORSVfaTNNSWYDBYdMnVKJ0fYNsoZUBA==", "dev": true, - "requires": { + "dependencies": { "onigasm": "^2.2.5", "vscode-textmate": "^5.2.0" } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "sisteransi": { + "node_modules/sisteransi": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", "dev": true }, - "slash": { + "node_modules/slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "snapdragon": { + "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, - "requires": { + "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", @@ -8216,58 +9880,73 @@ "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-node": { + "node_modules/snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-util": { + "node_modules/snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "source-map": { + "node_modules/snapdragon/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-resolve": { + "node_modules/source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, - "requires": { + "dependencies": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", @@ -8275,104 +9954,113 @@ "urix": "^0.1.0" } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, - "source-map-url": { + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true }, - "spdx-correct": { + "node_modules/spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, - "requires": { + "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-exceptions": { + "node_modules/spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, - "spdx-expression-parse": { + "node_modules/spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, - "requires": { + "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-license-ids": { + "node_modules/spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, - "split-string": { + "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { + "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, - "requires": { + "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", @@ -8382,346 +10070,437 @@ "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" } }, - "stack-utils": { + "node_modules/stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "static-extend": { + "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, - "requires": { + "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "stealthy-require": { + "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "string-length": { + "node_modules/string-length": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "dev": true, - "requires": { + "dependencies": { "astral-regex": "^1.0.0", "strip-ansi": "^4.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "string-width": { + "node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, - "requires": { + "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "string.prototype.padend": { + "node_modules/string.prototype.padend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", "dev": true, - "requires": { + "dependencies": { "define-properties": "^1.1.2", "es-abstract": "^1.4.3", "function-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "string.prototype.trimleft": { + "node_modules/string.prototype.trimleft": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", "dev": true, - "requires": { + "dependencies": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" } }, - "string.prototype.trimright": { + "node_modules/string.prototype.trimright": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", "dev": true, - "requires": { + "dependencies": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } + "engines": { + "node": ">= 0.4" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "strip-eof": { + "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "symbol-tree": { + "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "node_modules/term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "dependencies": { + "execa": "^0.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/term-size/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, - "requires": { - "execa": "^0.7.0" - }, "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "test-exclude": { + "node_modules/test-exclude": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3", "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", "require-main-filename": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "throat": { + "node_modules/throat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, - "timed-out": { + "node_modules/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "tmpl": { + "node_modules/tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "to-object-path": { + "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex": { + "node_modules/to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "engines": { + "node": ">=0.10.0" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, - "requires": { + "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "touch": { + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, - "requires": { + "dependencies": { "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" } }, - "tough-cookie": { + "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, - "requires": { + "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "tr46": { + "node_modules/tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "tree-kill": { + "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } }, - "ts-jest": { + "node_modules/ts-jest": { "version": "24.3.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.3.0.tgz", "integrity": "sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==", "dev": true, - "requires": { + "dependencies": { "bs-logger": "0.x", "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", @@ -8733,66 +10512,89 @@ "semver": "^5.5", "yargs-parser": "10.x" }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "jest": ">=24 <25" + } + }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, "dependencies": { - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "camelcase": "^4.1.0" } }, - "ts-node": { + "node_modules/ts-node": { "version": "8.10.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", "dev": true, - "requires": { + "dependencies": { "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.17", "yn": "3.1.1" }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ts-node/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-node/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "tslib": { + "node_modules/tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, - "tslint": { + "node_modules/tslint": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", @@ -8807,108 +10609,147 @@ "tslib": "^1.8.0", "tsutils": "^2.29.0" }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" } }, - "tslint-config-prettier": { + "node_modules/tslint-config-prettier": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "dev": true + "dev": true, + "bin": { + "tslint-config-prettier-check": "bin/check.js" + }, + "engines": { + "node": ">=4.0.0" + } }, - "tslint-microsoft-contrib": { + "node_modules/tslint-microsoft-contrib": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-6.2.0.tgz", "integrity": "sha512-6tfi/2tHqV/3CL77pULBcK+foty11Rr0idRDxKnteTaKm6gWF9qmaCNU17HVssOuwlYNyOmd9Jsmjd+1t3a3qw==", "dev": true, - "requires": { + "dependencies": { "tsutils": "^2.27.2 <2.29.0" }, + "peerDependencies": { + "tslint": "^5.1.0", + "typescript": "^2.1.0 || ^3.0.0" + } + }, + "node_modules/tslint-microsoft-contrib/node_modules/tsutils": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", + "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", + "dev": true, "dependencies": { - "tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tslint/node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, - "tsutils": { + "node_modules/tsutils": { "version": "3.20.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", "dev": true, - "requires": { + "dependencies": { "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "tunnel-agent": { + "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" } }, - "tweetnacl": { + "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "type-check": { + "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "typedoc": { + "node_modules/typedoc": { "version": "0.20.28", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.28.tgz", "integrity": "sha512-8j0T8u9FuyDkoe+M/3cyoaGJSVgXCY9KwVoo7TLUnmQuzXwqH+wkScY530ZEdK6G39UZ2LFTYPIrL5eykWjx6A==", "dev": true, - "requires": { + "dependencies": { "colors": "^1.4.0", "fs-extra": "^9.1.0", "handlebars": "^4.7.7", @@ -8920,154 +10761,215 @@ "shelljs": "^0.8.4", "shiki": "^0.9.2", "typedoc-default-themes": "^0.12.7" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 10.8.0" + }, + "peerDependencies": { + "typescript": "3.9.x || 4.0.x || 4.1.x" } }, - "typedoc-default-themes": { + "node_modules/typedoc-default-themes": { "version": "0.12.7", "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.7.tgz", "integrity": "sha512-0XAuGEqID+gon1+fhi4LycOEFM+5Mvm2PjwaiVZNAzU7pn3G2DEpsoXnFOPlLDnHY6ZW0BY0nO7ur9fHOFkBLQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "typescript": { + "node_modules/typescript": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", - "dev": true + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } }, - "uglify-js": { + "node_modules/uglify-js": { "version": "3.12.8", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.8.tgz", "integrity": "sha512-fvBeuXOsvqjecUtF/l1dwsrrf5y2BCUk9AOJGzGcm6tE7vegku5u/YvqjyDaAGr422PLoLnrxg3EnRvTqsdC1w==", "dev": true, - "optional": true + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } }, - "undefsafe": { + "node_modules/undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", "dev": true, - "requires": { + "dependencies": { "debug": "^2.2.0" } }, - "unicode-canonical-property-names-ecmascript": { + "node_modules/unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "unicode-match-property-ecmascript": { + "node_modules/unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, - "requires": { + "dependencies": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" } }, - "unicode-match-property-value-ecmascript": { + "node_modules/unicode-match-property-value-ecmascript": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "unicode-property-aliases-ecmascript": { + "node_modules/unicode-property-aliases-ecmascript": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "union-value": { + "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, - "requires": { + "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "uniqid": { + "node_modules/uniqid": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.3.0.tgz", "integrity": "sha512-Jq8EzvAT8/CcLu8tzoSiylnzPkNhJJKpnMT964Dj1jI4pG4sKYP9aFVByNTp8KzMvYlW1Um63PCDqtOoujNzrA==" }, - "unique-string": { + "node_modules/unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, - "requires": { + "dependencies": { "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "universalify": { + "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 10.0.0" + } }, - "unset-value": { + "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, - "requires": { + "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "unzip-response": { + "node_modules/unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "upath": { + "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } }, - "update-notifier": { + "node_modules/update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, - "requires": { + "dependencies": { "boxen": "^1.2.1", "chalk": "^2.0.1", "configstore": "^3.0.0", @@ -9079,280 +10981,315 @@ "semver-diff": "^2.0.0", "xdg-basedir": "^3.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "node_modules/update-notifier/node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, "dependencies": { - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - } + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "urix": { + "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "url-parse-lax": { + "node_modules/url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, - "requires": { + "dependencies": { "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "use": { + "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "util.promisify": { + "node_modules/util.promisify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, - "requires": { + "dependencies": { "define-properties": "^1.1.2", "object.getownpropertydescriptors": "^2.0.3" } }, - "uuid": { + "node_modules/uuid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } }, - "validate-npm-package-license": { + "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "requires": { + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "validate.io-string": { + "node_modules/validate.io-string": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/validate.io-string/-/validate.io-string-1.0.2.tgz", "integrity": "sha1-ur86Uoso5LnoAX4ygfx2ABrm3C8=" }, - "validate.io-uri": { + "node_modules/validate.io-uri": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/validate.io-uri/-/validate.io-uri-1.0.0.tgz", "integrity": "sha1-1HLVCDUksQn6f4fM8MX4gBqvHag=", - "requires": { + "dependencies": { "validate.io-string": "^1.0.2" } }, - "verror": { + "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "vscode-textmate": { + "node_modules/vscode-textmate": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", "dev": true }, - "w3c-hr-time": { + "node_modules/w3c-hr-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, - "requires": { + "dependencies": { "browser-process-hrtime": "^0.1.2" } }, - "walker": { + "node_modules/walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, - "requires": { + "dependencies": { "makeerror": "1.0.x" } }, - "webidl-conversions": { + "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, - "whatwg-encoding": { + "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, - "requires": { + "dependencies": { "iconv-lite": "0.4.24" } }, - "whatwg-mimetype": { + "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "dev": true, - "requires": { + "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, - "which": { + "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "which-module": { + "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "widest-line": { + "node_modules/widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, - "requires": { + "dependencies": { "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" } }, - "word-wrap": { + "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "wordwrap": { + "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, - "ws": { + "node_modules/ws": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", "dev": true, - "requires": { + "dependencies": { "async-limiter": "~1.0.0" } }, - "xdg-basedir": { + "node_modules/xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "xml-name-validator": { + "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "y18n": { + "node_modules/y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yallist": { + "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "yargs": { + "node_modules/yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, - "requires": { + "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", @@ -9363,44 +11300,49 @@ "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.1" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" - }, + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" } }, - "yn": { + "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } } } } diff --git a/package.json b/package.json index 2e3cff13..07b155ef 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,11 @@ ], "scripts": { "start": "npm-run-all -p format:watch start:watch", - "start:watch": "TS_NODE_FILES=true nodemon index.ts", + "start:watch": "cross-env TS_NODE_FILES=true nodemon index.ts", "format": "prettier --write '**/*.ts' '**/*.json'", "format:watch": "onchange '**/*.ts' '**/*.json' -- prettier --write {{changed}}", "clean": "rimraf coverage dist tmp", - "build": "rm -rf ./dist && npm run build:js", + "build": "rimraf ./dist && npm run build:js", "build:js": "babel src --out-dir dist --extensions \".ts,.tsx\" --source-maps inline", "build:watch": "TS_NODE_FILES=true tsc -w -p tsconfig.release.json", "tsdoc": "typedoc --out tsdoc src/index.ts", diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index 48e8f3ee..79b954de 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -3,8 +3,8 @@ import { RelationStereotype } from '@libs/ontouml/model/stereotypes'; import { Ontouml2Alloy } from '.'; import { getNameNoSpaces, isTopLevel, getValidAlias } from './util'; -export function transformClass(transformer: Ontouml2Alloy, _class: Class) { - if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION])) { +export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //This line defines a function named transformClass that takes two parameters: transformer (of type Ontouml2Alloy) and _class (of type Class). + if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION])) { //This line checks if the given class _class has any of the stereotypes EVENT or SITUATION. If it does, the function immediately returns without doing anything. return; } @@ -21,6 +21,9 @@ export function transformClass(transformer: Ontouml2Alloy, _class: Class) { if (_class.isRestrictedToEndurant()) { transformEndurantClass(transformer, _class); } + /* + This line checks if the given class _class is a restricted endurant. If it is, the transformEndurantClass function is called with the transformer and _class parameters. + */ if (_class.hasRelatorStereotype()) { transformRelatorConstraint(transformer, _class); diff --git a/src/libs/ontouml2alloy/helper.ts b/src/libs/ontouml2alloy/helper.ts new file mode 100644 index 00000000..dadc3c12 --- /dev/null +++ b/src/libs/ontouml2alloy/helper.ts @@ -0,0 +1,16 @@ +import { Package, Project } from '@libs/ontouml'; +import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; + +//returns the main module of a generated Alloy transformation +export function generateAlloy(modelOrProject: Package | Project): string { + // const optionsWithDefaults = { + // baseIri: 'https://example.com', + // format: 'N-Triple', + // ...options + // }; + const ontouml2alloy = new Ontouml2Alloy(modelOrProject); + + ontouml2alloy.transform(); + + return ontouml2alloy.getAlloyCode()[0]; + } \ No newline at end of file diff --git a/src/libs/ontouml2alloy/ontouml2alloy.ts b/src/libs/ontouml2alloy/ontouml2alloy.ts index 411fab2d..8a63aeef 100644 --- a/src/libs/ontouml2alloy/ontouml2alloy.ts +++ b/src/libs/ontouml2alloy/ontouml2alloy.ts @@ -24,6 +24,13 @@ export class Ontouml2Alloy implements Service { visible: string[]; aliases: [OntoumlElement, string][]; // [element, alias] + /* + Lines 13-33 define a class Ontouml2Alloy that implements Service. The class has a constructor + with an input parameter that can be either a Project or a Package object. The class has many properties + that are used to store the different parts of the Alloy code generated during the transformation process. + The transform() method is the main method of the class that orchestrates the transformation process. + */ + constructor(input: Project | Package, options?: null) { if (input instanceof Project) { this.model = input.model; @@ -46,6 +53,14 @@ export class Ontouml2Alloy implements Service { return this.alloyCode; } + getFacts(): string[] { + return this.facts; + } //getter to test + + getDatatype() : [string, string[]][]{ + return this.datatypes; + } //getter to test + addDatatype(datatype: [string, string[]]) { this.datatypes.push(datatype); } @@ -103,6 +118,11 @@ export class Ontouml2Alloy implements Service { this.writeOntologicalPropertiesModule(); } + /* + Lines 81-105 define a method transform() that calls the different transformation functions, + removes duplicate facts and functions, and writes the generated Alloy code to the alloyCode property. + */ + writePreamble() { this.alloyCode[0] += 'module main\n\n' + @@ -285,6 +305,11 @@ export class Ontouml2Alloy implements Service { return true; } + /* + This method retrieves all the classes present in the model and applies a transformation + to each of them using the transformClass() function. After that, it applies transformations to + additional class constraints and datatype constraints. Finally, it returns true. + */ transformGeneralizations() { const generalizations = this.model.getAllGeneralizations(); @@ -332,4 +357,10 @@ export class Ontouml2Alloy implements Service { issues: undefined }; } + /* + After performing all the necessary transformations, the run method is called, which calls the + transform method and returns the resulting Alloy code in an object with three properties: mainModule, + worldStructureModule, and ontologicalPropertiesModule. The issues property is currently set to undefined, + but it could be used to report any issues or errors that occur during the transformation process. + */ } From 868cfaeb9ae49e12cbcee4e64d9d1ca6a995b33f Mon Sep 17 00:00:00 2001 From: Asen Date: Mon, 27 Mar 2023 16:40:02 +0200 Subject: [PATCH 05/23] Added new test cases --- .../ontouml2alloy/class_functions.test.ts | 175 +++++++++++++++--- 1 file changed, 150 insertions(+), 25 deletions(-) diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index 3287b50c..7aa8265a 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -27,7 +27,7 @@ describe('Class Functions', () => { model = project.createModel(); }); - it('should return early if the class has stereotype EVENT or SITUATION', () => { + it('should return early if the class is an <> or <>', () => { // model.createKind('Happy Person'); const event = model.createEvent('Birthday'); expect(generateAlloy(model)).not.toContain('Birthday'); @@ -36,7 +36,7 @@ describe('Class Functions', () => { model.createSituation('Hazard') expect(generateAlloy(model)).not.toContain('Hazard'); // expect(transformer.getAlloyCode()[0]).toContain('HappyPerson: set exists:>Object'); - }); + }); // afterEach(() => { // // code to run after each test case @@ -70,7 +70,7 @@ describe('Class Functions', () => { // //expect(() => ...).toThrow(); // call the function or class method with the input value and expect it to throw an error // }); - it('should transform datatype classes', () => { + it('should transform <> class with attributes (complex datatype)', () => { const _number = model.createDatatype('Number'); const complexDatatype = model.createDatatype('Date'); complexDatatype.createAttribute(_number, 'day'); @@ -83,39 +83,164 @@ describe('Class Functions', () => { expect(result).toContain('year: Number'); }); //default multiplicy is "one" so "day: one Number" or "day: Number" should be the same - it('transforms enumeration classes', () => { - - }); + it('should NOT transform «datatype» class without attributes (primitive datatype)', () => { + const model = new Package(); + model.createDatatype('Date'); + const result = generateAlloy(model); + expect(result).not.toContain('sig Date in Datatype {'); + }); //should there be such a requirement? - it('transforms endurant class', () => { + it('should transform <> class with attributes', () => { + const status = model.createEnumeration('Status'); + status.createLiteral('Active'); + status.createLiteral('Inactive'); - // endurantClass.addName('Person'); - // endurantClass.stereotype = ClassStereotype.KIND; - // // console.log(endurantClass.getAllowedStereotypes()); - // console.log(endurantClass.getName()); - // console.log(endurantClass.getAllContents()); - // console.log(endurantClass.toJSON()); + const result = generateAlloy(model) + expect(result).toContain('enum Status {') + expect(result).toContain('Active, Inactive}') + }); - // stereotypeUtils.isEndurantClassStereotype - // transformClass(transformer, endurantClass); - // transformer.transform(); - - // const expectedFacts = [ - // 'fact rigid {\n' + - // ' rigidity[Person,Endurant,exists]\n' + - // '}', - // ]; - // console.log(transformer.getAlloyCode()[0]); - // expect(transformer.getAlloyCode()[0]).toContain(expectedFacts); + it('should transform <> class', () => { + model.createKind('Person'); + const expectedFacts = + 'fact rigid {\n' + + ' rigidity[Person,Object,exists]\n' + + '}' + ; + expect(generateAlloy(model)).toContain(expectedFacts); + // console.log(generateAlloy(model)); + //"exists:>Object in Group" ? + }); + + it('should transform <> class { isExtensional=false }', () => { + model.createCollective('Group', false); + const result = generateAlloy(model); + const expectedFacts = + 'fact rigid {\n' + + ' rigidity[Group,Object,exists]\n' + + '}' + ; + expect(result).toContain(expectedFacts); + }); + + it('should transform «collective» class { isExtensional=true }', () => { + model.createCollective('FixedGroup', true); + const result = generateAlloy(model); + + }); + + it('should transform «quantity» class', () => { + model.createQuantity('Wine'); + const result = generateAlloy(model); + const expectedFacts = + 'fact rigid {\n' + + ' rigidity[Wine,Object,exists]\n' + + '}' + ; + expect(result).toContain(expectedFacts); + }); - }); + it('should transform «relator» class', () => { + model.createRelator('Marriage'); + const result = generateAlloy(model); + const expectedFacts = + 'fact rigid {\n' + + ' rigidity[Marriage,Aspect,exists]\n' + + '}' + ; + expect(result).toContain(expectedFacts); + }); //that's it, I guess? + + it('should transform «role» class', () => { + model.createRole('Student'); + const result = generateAlloy(model); + const expectedFacts = + 'fact antirigid {\n' + + ' antirigidity[Student,Object,exists]\n' + + '}' + ; + expect(result).toContain(expectedFacts); + }); + it('should transform «phase» class', () => { + model.createPhase('Child'); + const result = generateAlloy(model); + const expectedFacts = + 'fact antirigid {\n' + + ' antirigidity[Child,Object,exists]\n' + + '}' + ; + expect(result).toContain(expectedFacts); + }); + + it('should transform «abstract» class', () => { + const model = new Package(); + model.createAbstract('Goal'); + + const result = generateAlloy(model); + expect(result).toContain(''); // to be figured out what needs to happen + }); + it('should transform «mode» class { allowed=[intrinsic-mode] }', () => { + model.createIntrinsicMode('Skill'); + const result = generateAlloy(model); + const expectedFacts = + 'fact rigid {\n' + + ' rigidity[Skill,Aspect,exists]\n' + + '}' + ; + expect(result).toContain(expectedFacts); + + }); + + it('should transform «mode» class { allowed=[extrinsic-mode] }', () => { + model.createExtrinsicMode('Love'); + const result = generateAlloy(model); + const expectedFacts = + 'fact rigid {\n' + + ' rigidity[Love,Aspect,exists]\n' + + '}' + ; + expect(result).toContain(expectedFacts); + }); + + it('should transform «mode» class { allowed=[intrinsic-mode, extrinsic-mode] }', () => { + // const _class = OntoumlFactory.createMode('Belief'); + model.createClass('Belief', ClassStereotype.MODE, [OntologicalNature.intrinsic_mode, OntologicalNature.extrinsic_mode]); + const result = generateAlloy(model); + const expectedFacts = + 'fact rigid {\n' + + ' rigidity[Belief,Aspect,exists]\n' + + '}' + ; + expect(result).toContain(expectedFacts); + }); + it('should transform «roleMixin» class', () => { + model.createRoleMixin('Customer'); + const result = generateAlloy(model); + + expect(result).toContain(''); + }); + + it('should transform «phaseMixin» class', () => { + model.createPhaseMixin('Infant'); + const result = generateAlloy(model); + + expect(result).toContain(''); + }); + + it('should transform «mixin» class', () => { + model.createMixin('Seatable'); + const result = generateAlloy(model); + + expect(result).toContain(''); + }); + //what is expected with the mixins? }); From 88eb8f557fd150e90047884c8a2a721683dd99f0 Mon Sep 17 00:00:00 2001 From: Asen Date: Tue, 28 Mar 2023 18:37:26 +0200 Subject: [PATCH 06/23] More test cases added --- .../ontouml2alloy/class_functions.test.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index 7aa8265a..0dd24c80 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -243,6 +243,39 @@ describe('Class Functions', () => { //what is expected with the mixins? + it('should handle if class has a space in name', () => { + model.createKind('Happy Person'); + const unwantedFacts = + 'fact rigid {\n' + + ' rigidity[Happy Person,Object,exists]\n' + + '}' + ; + const expectedFacts = + 'fact rigid {\n' + + ' rigidity[HappyPerson,Object,exists]\n' + + '}' + ; + const result = generateAlloy(model); + expect(result).not.toContain(unwantedFacts); + expect(result).toContain(expectedFacts); + }); + + it('should handle if class has forbidden characters in name', () => { //!, #, *, /, \ + model.createKind('Happy!Person'); + const unwantedFacts = + 'fact rigid {\n' + + ' rigidity[Happy!Person,Object,exists]\n' + + '}' + ; + const result = generateAlloy(model); + expect(result).not.toContain(unwantedFacts); + //idea for how to handle this + // expect(result).toContain(expectedFacts); + }); + + + + }); }); From f8b1c47264fa08ffd84355933d3038514237c35c Mon Sep 17 00:00:00 2001 From: Asen Date: Wed, 5 Apr 2023 14:19:48 +0200 Subject: [PATCH 07/23] class_functions fixing, added helper functions to helper.ts --- .../ontouml2alloy/class_functions.test.ts | 101 ++++++++---------- .../generalization_functions.test.ts | 6 ++ src/libs/ontouml2alloy/helper.ts | 22 +++- .../ontouml2alloy/ontouml-js.code-workspace | 8 ++ 4 files changed, 80 insertions(+), 57 deletions(-) create mode 100644 __tests__/libs/ontouml2alloy/generalization_functions.test.ts create mode 100644 src/libs/ontouml2alloy/ontouml-js.code-workspace diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index 0dd24c80..c8467689 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -1,41 +1,29 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; -import { generateAlloy } from '@libs/ontouml2alloy/helper'; +import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from '@libs/ontouml2alloy/helper'; import { Class, ClassStereotype, Relation, Package, Project, Property, OntoumlType, AggregationKind, stereotypeUtils, OntologicalNature} from '@libs/ontouml'; -import { transformClass } from '@libs/ontouml2alloy/class_functions'; - -import { MultilingualText } from '@libs/ontouml'; +import { resolve } from 'dns'; describe('Class Functions', () => { describe('transformClass function', () => { - let project: Project; let model: Package; let transformer: Ontouml2Alloy; - // const eventClass = new Class({ name: new MultilingualText('Event'), stereotype: ClassStereotype.EVENT}); - // const situationClass = new Class({ name: new MultilingualText('Situation'), stereotype: ClassStereotype.SITUATION }); - // const datatypeClass = new Class({ name: new MultilingualText('DataType'), stereotype: ClassStereotype.DATATYPE }); - // const enumerationClass = new Class({ name: new MultilingualText('Enumeration'), stereotype: ClassStereotype.ENUMERATION }); - // const endurantClass = new Class({ name: new MultilingualText('Endurant'), isAbstract: false }); - // const relatorClass = new Class({ name: new MultilingualText('Relator'), stereotype: ClassStereotype.RELATOR }); - // const abstractClass = new Class({ name: new MultilingualText('AbstractClass'), isAbstract: true }); - beforeEach(() => { project = new Project(); model = project.createModel(); }); - it('should return early if the class is an <> or <>', () => { - // model.createKind('Happy Person'); + it('should ignore classes if they are an <>', () => { const event = model.createEvent('Birthday'); expect(generateAlloy(model)).not.toContain('Birthday'); - model.removeContent(event); + }); + it('should ignore classes if they are a <>', () => { model.createSituation('Hazard') expect(generateAlloy(model)).not.toContain('Hazard'); - // expect(transformer.getAlloyCode()[0]).toContain('HappyPerson: set exists:>Object'); }); // afterEach(() => { @@ -69,27 +57,27 @@ describe('Class Functions', () => { // // Assert // //expect(() => ...).toThrow(); // call the function or class method with the input value and expect it to throw an error // }); - + + //add it('should transform <> class with attributes (complex datatype)', () => { const _number = model.createDatatype('Number'); const complexDatatype = model.createDatatype('Date'); complexDatatype.createAttribute(_number, 'day'); - complexDatatype.createAttribute(_number, 'month'); - complexDatatype.createAttribute(_number, 'year'); + const result = generateAlloy(model); - expect(result).toContain('sig Date in Datatype {'); - expect(result).toContain('day: Number'); - expect(result).toContain('month: Number'); - expect(result).toContain('year: Number'); + const factLines = ['Datatype = Number+Date','disjoint[Number,Date]']; + + expect(result).toContain('sig Date in Datatype {\n day: Number\n}'); + expect(result).toContain(generateFact('additionalDatatypeFacts',factLines)); }); //default multiplicy is "one" so "day: one Number" or "day: Number" should be the same - it('should NOT transform «datatype» class without attributes (primitive datatype)', () => { + it('should transform <> class without attributes (primitive datatype)', () => { const model = new Package(); model.createDatatype('Date'); const result = generateAlloy(model); - - expect(result).not.toContain('sig Date in Datatype {'); - }); //should there be such a requirement? + expect(result).toContain('sig Date in Datatype {'); + expect(result).toContain(generateFact('additionalDatatypeFacts',['Datatype = Date'])) + }); it('should transform <> class with attributes', () => { const status = model.createEnumeration('Status'); @@ -97,39 +85,38 @@ describe('Class Functions', () => { status.createLiteral('Inactive'); const result = generateAlloy(model) - expect(result).toContain('enum Status {') - expect(result).toContain('Active, Inactive}') + expect(result).toContain('enum Status {\n Active, Inactive}') }); it('should transform <> class', () => { model.createKind('Person'); - const expectedFacts = - 'fact rigid {\n' + - ' rigidity[Person,Object,exists]\n' + - '}' - ; - expect(generateAlloy(model)).toContain(expectedFacts); - // console.log(generateAlloy(model)); - //"exists:>Object in Group" ? + const result = generateAlloy(model); + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])); + expect(result).toContain(generateWorldAttribute('Person','Object')); + expect(result).toContain(generateWorldFact('Person','Object')); //to change + console.log(result); }); - it('should transform <> class { isExtensional=false }', () => { + it('should generate rigid fact for transforming <> class', () => { model.createCollective('Group', false); const result = generateAlloy(model); - const expectedFacts = - 'fact rigid {\n' + - ' rigidity[Group,Object,exists]\n' + - '}' - ; - expect(result).toContain(expectedFacts); + expect(result).toContain(generateFact('rigid',['rigidity[Group,Object,exists]'])); }); + //change member -> same thing -> isExtensional - false - it('should transform «collective» class { isExtensional=true }', () => { - model.createCollective('FixedGroup', true); - const result = generateAlloy(model); + // it('should generate fact to handle {isExtensional = True} for transforming <> class', () => { + // model.createCollective('FixedGroup', true); + // const result = generateAlloy(model); - }); + // }); //TODO + + + // it('should generate fact to handle {isExtensional = False} for transforming <> class', () => { + // model.createCollective('FixedGroup', true); + // const result = generateAlloy(model); + + // }); it('should transform «quantity» class', () => { model.createQuantity('Wine'); @@ -175,14 +162,15 @@ describe('Class Functions', () => { expect(result).toContain(expectedFacts); }); - it('should transform «abstract» class', () => { - const model = new Package(); - model.createAbstract('Goal'); + // it('should transform «abstract» class', () => { + // const model = new Package(); + // model.createAbstract('Goal'); - const result = generateAlloy(model); + // const result = generateAlloy(model); + + // expect(result).toContain(''); + // }); //TODO - expect(result).toContain(''); // to be figured out what needs to happen - }); it('should transform «mode» class { allowed=[intrinsic-mode] }', () => { model.createIntrinsicMode('Skill'); @@ -221,10 +209,11 @@ describe('Class Functions', () => { }); it('should transform «roleMixin» class', () => { - model.createRoleMixin('Customer'); + model.createRoleMixin('Customer',); const result = generateAlloy(model); expect(result).toContain(''); + console.log(result); }); it('should transform «phaseMixin» class', () => { diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts new file mode 100644 index 00000000..97323600 --- /dev/null +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -0,0 +1,6 @@ +import { Generalization } from '@libs/ontouml'; +import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; +import { getNameNoSpaces } from '@libs/ontouml2alloy/util'; +import { generateAlloy } from '@libs/ontouml2alloy/helper'; +import { Package } from '@libs/ontouml'; + diff --git a/src/libs/ontouml2alloy/helper.ts b/src/libs/ontouml2alloy/helper.ts index dadc3c12..ccca8997 100644 --- a/src/libs/ontouml2alloy/helper.ts +++ b/src/libs/ontouml2alloy/helper.ts @@ -1,5 +1,6 @@ import { Package, Project } from '@libs/ontouml'; import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; +import { String } from 'lodash'; //returns the main module of a generated Alloy transformation export function generateAlloy(modelOrProject: Package | Project): string { @@ -13,4 +14,23 @@ export function generateAlloy(modelOrProject: Package | Project): string { ontouml2alloy.transform(); return ontouml2alloy.getAlloyCode()[0]; - } \ No newline at end of file + } + +export function generateFact(factName: string, factLines: string[]): string { + let result = `fact ${factName} {\n`; + for (const line of factLines) { + result += ` ${line}\n`; + } + result += '}'; + return result; + } + +export function generateWorldAttribute(className: string, classNature: string): string{ + let result = className + ': set exists:>' + classNature; + return result; +} + +export function generateWorldFact(className: string, classNature: string): string{ + let result = '{\n exists:>' + classNature + ' in ' + className + '\n}'; + return result; +} //change for multiple diff --git a/src/libs/ontouml2alloy/ontouml-js.code-workspace b/src/libs/ontouml2alloy/ontouml-js.code-workspace new file mode 100644 index 00000000..04616194 --- /dev/null +++ b/src/libs/ontouml2alloy/ontouml-js.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "../../.." + } + ], + "settings": {} +} \ No newline at end of file From 6161315cf0a18f039edadb27cab3a1d0c7ec8fb7 Mon Sep 17 00:00:00 2001 From: Asen Date: Wed, 5 Apr 2023 23:49:34 +0200 Subject: [PATCH 08/23] new helper function & class_functions adaptation --- .../ontouml2alloy/class_functions.test.ts | 148 ++++++++---------- src/libs/ontouml2alloy/helper.ts | 10 +- 2 files changed, 76 insertions(+), 82 deletions(-) diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index c8467689..c6d248cf 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -94,14 +94,15 @@ describe('Class Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])); expect(result).toContain(generateWorldAttribute('Person','Object')); - expect(result).toContain(generateWorldFact('Person','Object')); //to change - console.log(result); + expect(result).toContain(generateWorldFact('Person','Object')); }); it('should generate rigid fact for transforming <> class', () => { model.createCollective('Group', false); const result = generateAlloy(model); - expect(result).toContain(generateFact('rigid',['rigidity[Group,Object,exists]'])); + expect(result).toContain(generateWorldAttribute('Group','Object')) + // expect(result).toContain(generateWorldFact('Group','Object')); + // expect(result).toContain(generateFact('rigid',['rigidity[Group,Object,exists]'])); }); //change member -> same thing -> isExtensional - false @@ -121,45 +122,48 @@ describe('Class Functions', () => { it('should transform «quantity» class', () => { model.createQuantity('Wine'); const result = generateAlloy(model); - const expectedFacts = - 'fact rigid {\n' + - ' rigidity[Wine,Object,exists]\n' + - '}' - ; - expect(result).toContain(expectedFacts); + + expect(result).toContain(generateFact('rigid',['rigidity[Wine,Object,exists]'])); + expect(result).toContain(generateWorldAttribute('Wine','Object')); + expect(result).toContain(generateWorldFact('Wine','Object')); + //this what is supposed to happen? + }); + + it('should transform <> class', () => { + model.createQuality('Strong'); + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Strong,Aspect,exists]'])); + expect(result).toContain(generateWorldAttribute('Strong','Aspect')); + expect(result).toContain(generateWorldFact('Strong','Aspect')); + }); it('should transform «relator» class', () => { model.createRelator('Marriage'); const result = generateAlloy(model); - const expectedFacts = - 'fact rigid {\n' + - ' rigidity[Marriage,Aspect,exists]\n' + - '}' - ; - expect(result).toContain(expectedFacts); + + expect(result).toContain(generateFact('rigid',['rigidity[Marriage,Aspect,exists]'])); + expect(result).toContain(generateWorldAttribute('Marriage','Aspect')); + expect(result).toContain(generateWorldFact('Marriage','Aspect')); }); //that's it, I guess? it('should transform «role» class', () => { model.createRole('Student'); const result = generateAlloy(model); - const expectedFacts = - 'fact antirigid {\n' + - ' antirigidity[Student,Object,exists]\n' + - '}' - ; - expect(result).toContain(expectedFacts); + + expect(result).toContain(generateFact('antirigid',['antirigidity[Student,Object,exists]'])); + expect(result).toContain(generateWorldAttribute('Student','Object')); + expect(result).toContain(generateWorldFact('Student','Object')); }); it('should transform «phase» class', () => { model.createPhase('Child'); const result = generateAlloy(model); - const expectedFacts = - 'fact antirigid {\n' + - ' antirigidity[Child,Object,exists]\n' + - '}' - ; - expect(result).toContain(expectedFacts); + + expect(result).toContain(generateFact('antirigid',['antirigidity[Child,Object,exists]'])); + expect(result).toContain(generateWorldAttribute('Child','Object')); + expect(result).toContain(generateWorldFact('Child','Object')); }); // it('should transform «abstract» class', () => { @@ -175,89 +179,71 @@ describe('Class Functions', () => { it('should transform «mode» class { allowed=[intrinsic-mode] }', () => { model.createIntrinsicMode('Skill'); const result = generateAlloy(model); - const expectedFacts = - 'fact rigid {\n' + - ' rigidity[Skill,Aspect,exists]\n' + - '}' - ; - expect(result).toContain(expectedFacts); - + expect(result).toContain(generateFact('rigid',['rigidity[Skill,Aspect,exists]'])); + expect(result).toContain(generateWorldAttribute('Skill','Aspect')); + expect(result).toContain(generateWorldFact('Skill','Aspect')); }); it('should transform «mode» class { allowed=[extrinsic-mode] }', () => { model.createExtrinsicMode('Love'); const result = generateAlloy(model); - const expectedFacts = - 'fact rigid {\n' + - ' rigidity[Love,Aspect,exists]\n' + - '}' - ; - expect(result).toContain(expectedFacts); + + expect(result).toContain(generateFact('rigid',['rigidity[Love,Aspect,exists]'])); + expect(result).toContain(generateWorldAttribute('Love','Aspect')); + expect(result).toContain(generateWorldFact('Love','Aspect')); }); it('should transform «mode» class { allowed=[intrinsic-mode, extrinsic-mode] }', () => { // const _class = OntoumlFactory.createMode('Belief'); model.createClass('Belief', ClassStereotype.MODE, [OntologicalNature.intrinsic_mode, OntologicalNature.extrinsic_mode]); const result = generateAlloy(model); - const expectedFacts = - 'fact rigid {\n' + - ' rigidity[Belief,Aspect,exists]\n' + - '}' - ; - expect(result).toContain(expectedFacts); + + expect(result).toContain(generateFact('rigid',['rigidity[Belief,Aspect,exists]'])); + expect(result).toContain(generateWorldAttribute('Belief','Aspect')); + expect(result).toContain(generateWorldFact('Belief','Aspect')); }); - it('should transform «roleMixin» class', () => { - model.createRoleMixin('Customer',); - const result = generateAlloy(model); + // it('should transform «roleMixin» class', () => { + // model.createRoleMixin('Customer',); + // const result = generateAlloy(model); - expect(result).toContain(''); - console.log(result); - }); + // expect(result).toContain(''); + // console.log(result); + // });//diff between roleMIxin and role? - it('should transform «phaseMixin» class', () => { - model.createPhaseMixin('Infant'); - const result = generateAlloy(model); + // it('should transform «phaseMixin» class', () => { + // model.createPhaseMixin('Infant'); + // const result = generateAlloy(model); - expect(result).toContain(''); - }); + // expect(result).toContain(''); + // });//diff between phaseMixin and phase - it('should transform «mixin» class', () => { - model.createMixin('Seatable'); - const result = generateAlloy(model); + // it('should transform «mixin» class', () => { + // model.createMixin('Seatable'); + // const result = generateAlloy(model); - expect(result).toContain(''); - }); - //what is expected with the mixins? + // expect(result).toContain(''); + // }); + //what is expected with the mixins, semirigid? it('should handle if class has a space in name', () => { model.createKind('Happy Person'); - const unwantedFacts = - 'fact rigid {\n' + - ' rigidity[Happy Person,Object,exists]\n' + - '}' - ; - const expectedFacts = - 'fact rigid {\n' + - ' rigidity[HappyPerson,Object,exists]\n' + - '}' - ; + const result = generateAlloy(model); - expect(result).not.toContain(unwantedFacts); - expect(result).toContain(expectedFacts); + expect(result).not.toContain(generateFact('rigid',['rigidity[Happy Person,Object,exists]'])); + expect(result).toContain(generateFact('rigid',['rigidity[HappyPerson,Object,exists]'])); + + expect(result).toContain(generateWorldAttribute('HappyPerson','Object')); + expect(result).toContain(generateWorldFact('HappyPerson','Object')); }); it('should handle if class has forbidden characters in name', () => { //!, #, *, /, \ model.createKind('Happy!Person'); - const unwantedFacts = - 'fact rigid {\n' + - ' rigidity[Happy!Person,Object,exists]\n' + - '}' - ; const result = generateAlloy(model); - expect(result).not.toContain(unwantedFacts); + + expect(result).not.toContain(generateFact('rigid',['rigidity[Happy!Person,Object,exists]'])); //idea for how to handle this // expect(result).toContain(expectedFacts); }); diff --git a/src/libs/ontouml2alloy/helper.ts b/src/libs/ontouml2alloy/helper.ts index ccca8997..f79d7691 100644 --- a/src/libs/ontouml2alloy/helper.ts +++ b/src/libs/ontouml2alloy/helper.ts @@ -33,4 +33,12 @@ export function generateWorldAttribute(className: string, classNature: string): export function generateWorldFact(className: string, classNature: string): string{ let result = '{\n exists:>' + classNature + ' in ' + className + '\n}'; return result; -} //change for multiple +} + +export function generateWorldFacts(factLines: string[]){ + let result = '{\n'; + for (const line of factLines){ + result += ` ${line}\n`; + } + +}//subject to change From 8821619fe26a413d95f926e59ff39c9c21df8e20 Mon Sep 17 00:00:00 2001 From: Asen Date: Sun, 9 Apr 2023 20:47:28 +0200 Subject: [PATCH 09/23] empty name_normalization.test.ts,adapt other tests --- .../ontouml2alloy/class_functions.test.ts | 25 +++++-- .../generalization_functions.test.ts | 73 ++++++++++++++++++- .../libs/ontouml2alloy/helpers.ts | 15 ++-- .../ontouml2alloy/name_normalization.test.ts | 27 +++++++ src/libs/ontouml2alloy/ontouml2alloy.ts | 2 +- src/libs/ontouml2alloy/util.ts | 2 +- 6 files changed, 123 insertions(+), 21 deletions(-) rename src/libs/ontouml2alloy/helper.ts => __tests__/libs/ontouml2alloy/helpers.ts (71%) create mode 100644 __tests__/libs/ontouml2alloy/name_normalization.test.ts diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index c6d248cf..d2530afe 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -1,5 +1,5 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; -import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from '@libs/ontouml2alloy/helper'; +import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from '__tests__/libs/ontouml2alloy/helpers'; import { Class, ClassStereotype, Relation, Package, Project, Property, OntoumlType, AggregationKind, stereotypeUtils, OntologicalNature} from '@libs/ontouml'; import { resolve } from 'dns'; @@ -72,7 +72,6 @@ describe('Class Functions', () => { }); //default multiplicy is "one" so "day: one Number" or "day: Number" should be the same it('should transform <> class without attributes (primitive datatype)', () => { - const model = new Package(); model.createDatatype('Date'); const result = generateAlloy(model); expect(result).toContain('sig Date in Datatype {'); @@ -104,6 +103,11 @@ describe('Class Functions', () => { // expect(result).toContain(generateWorldFact('Group','Object')); // expect(result).toContain(generateFact('rigid',['rigidity[Group,Object,exists]'])); }); + + it('should generate rigid fact for X', () => { + + + }) //change member -> same thing -> isExtensional - false // it('should generate fact to handle {isExtensional = True} for transforming <> class', () => { @@ -126,7 +130,6 @@ describe('Class Functions', () => { expect(result).toContain(generateFact('rigid',['rigidity[Wine,Object,exists]'])); expect(result).toContain(generateWorldAttribute('Wine','Object')); expect(result).toContain(generateWorldFact('Wine','Object')); - //this what is supposed to happen? }); it('should transform <> class', () => { @@ -173,8 +176,9 @@ describe('Class Functions', () => { // const result = generateAlloy(model); // expect(result).toContain(''); - // }); //TODO + // }); //make it a datatype + model.createClass() it('should transform «mode» class { allowed=[intrinsic-mode] }', () => { model.createIntrinsicMode('Skill'); @@ -242,13 +246,20 @@ describe('Class Functions', () => { it('should handle if class has forbidden characters in name', () => { //!, #, *, /, \ model.createKind('Happy!Person'); const result = generateAlloy(model); - + expect(result).not.toContain(generateFact('rigid',['rigidity[Happy!Person,Object,exists]'])); - //idea for how to handle this + //idea for how to handle this - remove char and add a number // expect(result).toContain(expectedFacts); }); - + //Happy Person & HappyPerson + //check two attributes same name + //check reserved keywords + //add a map to keep track of transformed classes + //class with no name + //class with name just spaces/special characters + + //test behaviour if subkind but no parentclass }); diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index 97323600..1cc85f46 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -1,6 +1,75 @@ import { Generalization } from '@libs/ontouml'; import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; import { getNameNoSpaces } from '@libs/ontouml2alloy/util'; -import { generateAlloy } from '@libs/ontouml2alloy/helper'; -import { Package } from '@libs/ontouml'; +import { generateAlloy, generateFact, generateWorldAttribute } from '__tests__/libs/ontouml2alloy/helpers'; +import { Package, Project } from '@libs/ontouml'; +describe('Generalization functions', () => { + + describe ('transformGeneralization function',() => { + + let project: Project; + let model: Package; + + beforeEach(() => { + project = new Project(); + model = project.createModel(); + }); + + + it('Between classes', () => { + + const parent = model.createKind('Person'); + const child = model.createSubkind('Man'); + model.createGeneralization(parent, child); + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) + expect(result).toContain(generateWorldAttribute('Person','Object')); + + expect(result).toContain(generateFact('generalization',['Man in Person'])); + //expect(result).toContain(generateWorldAttribute('Man','Object')); + + //what is expected to happen when transforming a subkind? -> refer to class_functions.test.ts + console.log(result) + }); //subkind of diff things + //create rigid fact & etc for subkind + + // it('Between classes without stereotypes', () => { + // const model = new Package(); + // const parent = model.createClass('Person'); + // const child = model.createClass('Man'); + // model.createGeneralization(parent, child); + + // const owl = generateAlloy(model); + // expect(owl).toContain('<:Man> <:Person>'); + // }); + + // it('Between relations', () => { + // const model = new Package(); + // const _class = model.createKind('Person'); + // const parent = model.createMaterialRelation(_class, _class, 'likes'); + // const child = model.createMaterialRelation(_class, _class, 'loves'); + // model.createGeneralization(parent, child); + + // const owl = generateAlloy(model); + // expect(owl).toContain('<:loves> <:likes>'); + // }); + + // it('Between relations without stereotypes', () => { + // const model = new Package(); + // const _class = model.createKind('Person'); + // const parent = model.createBinaryRelation(_class, _class, 'likes'); + // const child = model.createBinaryRelation(_class, _class, 'loves'); + // model.createGeneralization(parent, child); + + // const owl = generateAlloy(model); + // expect(owl).toContain('<:loves> <:likes>'); + // }); + + + + }) + + }); + \ No newline at end of file diff --git a/src/libs/ontouml2alloy/helper.ts b/__tests__/libs/ontouml2alloy/helpers.ts similarity index 71% rename from src/libs/ontouml2alloy/helper.ts rename to __tests__/libs/ontouml2alloy/helpers.ts index f79d7691..b56fcb38 100644 --- a/src/libs/ontouml2alloy/helper.ts +++ b/__tests__/libs/ontouml2alloy/helpers.ts @@ -4,11 +4,7 @@ import { String } from 'lodash'; //returns the main module of a generated Alloy transformation export function generateAlloy(modelOrProject: Package | Project): string { - // const optionsWithDefaults = { - // baseIri: 'https://example.com', - // format: 'N-Triple', - // ...options - // }; + const ontouml2alloy = new Ontouml2Alloy(modelOrProject); ontouml2alloy.transform(); @@ -26,19 +22,18 @@ export function generateFact(factName: string, factLines: string[]): string { } export function generateWorldAttribute(className: string, classNature: string): string{ - let result = className + ': set exists:>' + classNature; - return result; + return className + ': set exists:>' + classNature; } export function generateWorldFact(className: string, classNature: string): string{ - let result = '{\n exists:>' + classNature + ' in ' + className + '\n}'; - return result; + return '{\n exists:>' + classNature + ' in ' + className + '\n}'; } -export function generateWorldFacts(factLines: string[]){ +export function generateWorldFacts(factLines: string[]): string{ let result = '{\n'; for (const line of factLines){ result += ` ${line}\n`; } + return result; }//subject to change diff --git a/__tests__/libs/ontouml2alloy/name_normalization.test.ts b/__tests__/libs/ontouml2alloy/name_normalization.test.ts new file mode 100644 index 00000000..c844fd26 --- /dev/null +++ b/__tests__/libs/ontouml2alloy/name_normalization.test.ts @@ -0,0 +1,27 @@ +import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; +import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from '__tests__/libs/ontouml2alloy/helpers'; +import { Package, Project } from '@libs/ontouml'; + +describe('Original name is kept when there are no forbidden characters' , () => { + + // it('Person -> Person', () => { + // const normalized = normalizeName('Person'); + // expect(normalized).toBe('Person'); + // }); + + // it('PERSON -> PERSON', () => { + // const normalized = normalizeName('PERSON'); + // expect(normalized).toBe('PERSON'); + // }); + + // it('person -> person', () => { + // const normalized = normalizeName('person'); + // expect(normalized).toBe('person'); + // }); + + // it('PeRsoN -> PeRsoN', () => { + // const normalized = normalizeName('PeRsoN'); + // expect(normalized).toBe('PeRsoN'); + // }); + +}) \ No newline at end of file diff --git a/src/libs/ontouml2alloy/ontouml2alloy.ts b/src/libs/ontouml2alloy/ontouml2alloy.ts index 8a63aeef..cb577abd 100644 --- a/src/libs/ontouml2alloy/ontouml2alloy.ts +++ b/src/libs/ontouml2alloy/ontouml2alloy.ts @@ -356,7 +356,7 @@ export class Ontouml2Alloy implements Service { }, issues: undefined }; - } + }//method to check prerequisites for trasnforming a class /* After performing all the necessary transformations, the run method is called, which calls the transform method and returns the resulting Alloy code in an object with three properties: mainModule, diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index d4e32e78..0c33d455 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -2,7 +2,7 @@ import { OntoumlElement, Class, ClassStereotype, Relation, Generalization, Cardi export function getNameNoSpaces(element: OntoumlElement) { return element.getName().replace(/\s/g, ''); -} +}//normalizeName export function isTopLevel(_class: Class, generalizations: Generalization[]) { for (const gen of generalizations) { From 46be965affa1ab4ebdcfee9cc68bafb534721557 Mon Sep 17 00:00:00 2001 From: Asen Date: Thu, 13 Apr 2023 20:30:34 +0200 Subject: [PATCH 10/23] new test for name name_normalization, in dev --- .../alloy_name_normalization.test.ts | 106 ++++++++++++++++++ .../ontouml2alloy/class_functions.test.ts | 34 ++++-- .../generalization_functions.test.ts | 4 +- src/libs/ontouml2alloy/class_functions.ts | 36 +++--- .../ontouml2alloy/generalization_functions.ts | 6 +- .../generalization_set_functions.ts | 6 +- src/libs/ontouml2alloy/property_functions.ts | 36 +++--- src/libs/ontouml2alloy/relation_functions.ts | 62 +++++----- src/libs/ontouml2alloy/util.ts | 33 +++++- 9 files changed, 237 insertions(+), 86 deletions(-) create mode 100644 __tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts diff --git a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts new file mode 100644 index 00000000..31753226 --- /dev/null +++ b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts @@ -0,0 +1,106 @@ +import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; +import { Class, OntoumlElement, Package, Project } from '@libs/ontouml'; +import { normalizeName } from '@libs/ontouml2alloy/util'; + +describe('Original name is kept when there are no issues' , () => { + + let element: OntoumlElement; + element = new Class(); + + it('Person -> Person', () => { + element.addName('Person'); + const normalized = normalizeName(element); + expect(normalized).toBe('Person'); + }); + + it('PERSON -> PERSON', () => { + element.addName('PERSON'); + const normalized = normalizeName(element); + expect(normalized).toBe('PERSON'); + }); + + it('person -> person', () => { + element.addName('person'); + const normalized = normalizeName(element); + expect(normalized).toBe('person'); + }); + + it('PeRsoN -> PeRsoN', () => { + element.addName('PeRsoN'); + const normalized = normalizeName(element); + expect(normalized).toBe('PeRsoN'); + }); + +}) + +describe("Names are normalized properly", () => { + + let element: OntoumlElement; + element = new Class(); + + // it('should normalize an empty name', () => { + // element.addName(''); + // const normalized = normalizeName(element); + // expect(normalized).toBe(''); + // }); + + const reservedKeywords = [ + 'abstract', 'all', 'and', 'as', 'assert', + 'but', 'check', 'disj', 'else', 'exactly', + 'extends', 'fact', 'for', 'fun', 'iden', + 'iff', 'implies', 'in', 'Int', 'let', + 'lone', 'module', 'no', 'none', 'not', + 'one', 'open', 'or', 'pred', 'run', + 'set', 'sig', 'some', 'sum', 'univ' + ]; + //normalization of reserved keywords: abstract -> _abstract + reservedKeywords.forEach(keyword => { + it(`should normalize the reserved keyword "${keyword}"`, () => { + element.addName(keyword); + const normalized = normalizeName(element); + expect(normalized).toBe(`_${keyword}`); //what to do + }); + }); + + const forbiddenCharacters = [ + ' ', '!', '@', '#', '$', '%', '&', + '*', '(', ')', '-', '+', '=', '{', + '}', '[', ']', '|', '\\', ';', ':', + ',', '.', '<', '>', '/', '?' + ]; + + forbiddenCharacters.forEach(char => { + it(`should remove the forbidden character "${char}" from the name`, () => { + element.addName(`Happy${char}Person`); + const normalized = normalizeName(element); + expect(normalized).toBe('HappyPerson'); + }); + }); + + + + it('should normalize a class with no name', () => { + element.addName(''); + const normalized = normalizeName(element); + expect(normalized).toBe('_unnamed'); //what to do + }); + + it('temp', () => { + let project = new Project(); + let model = project.createModel(); + let ontouml2alloy = new Ontouml2Alloy(model); + + model.createKind('Person'); + model.createKind('Person'); + ontouml2alloy.transform(); + console.log(ontouml2alloy.getAliases()); + console.log(ontouml2alloy.facts); + }) + + // it('should add a class to a map to keep track of transformed classes', () => { + // const className = 'Person'; + // element.addName(className); + // const normalized = normalizeName(element); + // }); + +}); diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index d2530afe..d4ee5ba2 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -1,5 +1,5 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; -import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from '__tests__/libs/ontouml2alloy/helpers'; +import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from './helpers'; import { Class, ClassStereotype, Relation, Package, Project, Property, OntoumlType, AggregationKind, stereotypeUtils, OntologicalNature} from '@libs/ontouml'; import { resolve } from 'dns'; @@ -17,7 +17,7 @@ describe('Class Functions', () => { }); it('should ignore classes if they are an <>', () => { - const event = model.createEvent('Birthday'); + model.createEvent('Birthday'); expect(generateAlloy(model)).not.toContain('Birthday'); }); @@ -25,6 +25,12 @@ describe('Class Functions', () => { model.createSituation('Hazard') expect(generateAlloy(model)).not.toContain('Hazard'); }); + + it('should ignore classes if they are a <>', () => { + model.createType('PaymentMethod') + expect(generateAlloy(model)).not.toContain('PaymentMethod'); + + }) // afterEach(() => { // // code to run after each test case @@ -104,10 +110,6 @@ describe('Class Functions', () => { // expect(result).toContain(generateFact('rigid',['rigidity[Group,Object,exists]'])); }); - it('should generate rigid fact for X', () => { - - - }) //change member -> same thing -> isExtensional - false // it('should generate fact to handle {isExtensional = True} for transforming <> class', () => { @@ -149,7 +151,7 @@ describe('Class Functions', () => { expect(result).toContain(generateFact('rigid',['rigidity[Marriage,Aspect,exists]'])); expect(result).toContain(generateWorldAttribute('Marriage','Aspect')); expect(result).toContain(generateWorldFact('Marriage','Aspect')); - }); //that's it, I guess? + }); it('should transform «role» class', () => { model.createRole('Student'); @@ -178,7 +180,7 @@ describe('Class Functions', () => { // expect(result).toContain(''); // }); //make it a datatype - model.createClass() + // model.createClass() it('should transform «mode» class { allowed=[intrinsic-mode] }', () => { model.createIntrinsicMode('Skill'); @@ -252,6 +254,22 @@ describe('Class Functions', () => { // expect(result).toContain(expectedFacts); }); + it ('should handle if 2 classes have the same name', () => { + + model.createKind('Person'); + model.createKind('Person'); + + console.log(generateAlloy(model)); + }) + + //what should happen if a model, only containing a <> is transformed + it ('should handle if 2 classes have the same name', () => { + + model.createSubkind('Worker'); + + console.log(generateAlloy(model)); + }) + //Happy Person & HappyPerson //check two attributes same name //check reserved keywords diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index 1cc85f46..88c5746d 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -1,7 +1,7 @@ import { Generalization } from '@libs/ontouml'; import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; -import { getNameNoSpaces } from '@libs/ontouml2alloy/util'; -import { generateAlloy, generateFact, generateWorldAttribute } from '__tests__/libs/ontouml2alloy/helpers'; +import { normalizeName } from '@libs/ontouml2alloy/util'; +import { generateAlloy, generateFact, generateWorldAttribute } from './helpers'; import { Package, Project } from '@libs/ontouml'; describe('Generalization functions', () => { diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index 79b954de..c9813a70 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -1,7 +1,7 @@ import { Class, ClassStereotype, Relation } from '@libs/ontouml'; import { RelationStereotype } from '@libs/ontouml/model/stereotypes'; import { Ontouml2Alloy } from '.'; -import { getNameNoSpaces, isTopLevel, getValidAlias } from './util'; +import { normalizeName, isTopLevel, getValidAlias } from './util'; export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //This line defines a function named transformClass that takes two parameters: transformer (of type Ontouml2Alloy) and _class (of type Class). if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION])) { //This line checks if the given class _class has any of the stereotypes EVENT or SITUATION. If it does, the function immediately returns without doing anything. @@ -38,8 +38,8 @@ export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //Th } function transformAbstractClass(transformer: Ontouml2Alloy, _class: Class) { - const className = getNameNoSpaces(_class); - const subtypes = _class.getChildren().map(subtype => 'w.' + getNameNoSpaces(subtype)); + const className = normalizeName(_class); + const subtypes = _class.getChildren().map(subtype => 'w.' + normalizeName(subtype)); if (subtypes.length) { transformer.addFact( @@ -51,7 +51,7 @@ function transformAbstractClass(transformer: Ontouml2Alloy, _class: Class) { } function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { - const className = getNameNoSpaces(_class); + const className = normalizeName(_class); let nature = ''; if (_class.isRestrictedToSubstantial()) { @@ -84,13 +84,13 @@ function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { } function transformDatatypeClass(transformer: Ontouml2Alloy, _class: Class) { - const datatypeName = getNameNoSpaces(_class); + const datatypeName = normalizeName(_class); transformer.addDatatype([datatypeName, []]); } function transformEnumerationClass(transformer: Ontouml2Alloy, _class: Class) { - const enumName = getNameNoSpaces(_class); - const literals = _class.literals.map(literal => getNameNoSpaces(literal)); + const enumName = normalizeName(_class); + const literals = _class.literals.map(literal => normalizeName(literal)); if (literals.length) { transformer.addEnum( @@ -109,9 +109,9 @@ function transformRelatorConstraint(transformer: Ontouml2Alloy, _class: Class) { let mediatedName = ''; if (mediated.getName()) { - mediatedName = getNameNoSpaces(mediated); + mediatedName = normalizeName(mediated); } else { - mediatedName = getNameNoSpaces(mediation.getTarget()); + mediatedName = normalizeName(mediation.getTarget()); } const mediatedAlias = getValidAlias(mediated, mediatedName, transformer.aliases); @@ -120,7 +120,7 @@ function transformRelatorConstraint(transformer: Ontouml2Alloy, _class: Class) { } if (mediations.length) { - const relatorName = getNameNoSpaces(_class); + const relatorName = normalizeName(_class); transformer.addFact( 'fact relatorConstraint {\n' + ' all w: World, x: w.' + relatorName + ' | #(' + mediations.join('+') + ')>=2\n' + @@ -140,9 +140,9 @@ function transformWeakSupplementationConstraint(transformer: Ontouml2Alloy, _cla let partName = ''; if (part.getName()) { - partName = getNameNoSpaces(part); + partName = normalizeName(part); } else { - partName = getNameNoSpaces((part.container as Relation).getTarget()); + partName = normalizeName((part.container as Relation).getTarget()); } const partAlias = getValidAlias(part, partName, transformer.aliases); @@ -152,7 +152,7 @@ function transformWeakSupplementationConstraint(transformer: Ontouml2Alloy, _cla } if (parts.length) { - const wholeName = getNameNoSpaces(_class); + const wholeName = normalizeName(_class); transformer.addFact( 'fact weakSupplementationConstraint {\n' + @@ -172,12 +172,12 @@ function transformDisjointNaturesConstraint(transformer: Ontouml2Alloy, _class: if (isTopLevel(otherClass, transformer.model.getAllGeneralizations()) && !otherClass.restrictedToContainedIn(_class.restrictedTo)) { - differentNaturedClasses.push(getNameNoSpaces(otherClass)); + differentNaturedClasses.push(normalizeName(otherClass)); } } if (differentNaturedClasses.length) { - const className = getNameNoSpaces(_class); + const className = normalizeName(_class); if (differentNaturedClasses.length == 1) { transformer.addWorldFieldFact( 'disjoint[' + className + ',' + differentNaturedClasses[0] + ']' @@ -196,7 +196,7 @@ export function transformAdditionalClassConstraints(transformer: Ontouml2Alloy) for (const _class of transformer.model.getAllClasses()) { if (_class.isRestrictedToEndurant() && isTopLevel(_class, transformer.model.getAllGeneralizations())) { - const className = getNameNoSpaces(_class); + const className = normalizeName(_class); if (_class.isRestrictedToSubstantial()) { objectClasses.push(className); @@ -233,10 +233,10 @@ export function transformAdditionalDatatypeConstraints(transformer: Ontouml2Allo } } - const datatypesNames = datatypes.map(datatype => getNameNoSpaces(datatype)); + const datatypesNames = datatypes.map(datatype => normalizeName(datatype)); if (topLevelDatatypes.length >= 2) { - const topLevelDatatypesNames = topLevelDatatypes.map(datatype => getNameNoSpaces(datatype)); + const topLevelDatatypesNames = topLevelDatatypes.map(datatype => normalizeName(datatype)); transformer.addFact( 'fact additionalDatatypeFacts {\n' + diff --git a/src/libs/ontouml2alloy/generalization_functions.ts b/src/libs/ontouml2alloy/generalization_functions.ts index 9586a7f3..7e66e15b 100644 --- a/src/libs/ontouml2alloy/generalization_functions.ts +++ b/src/libs/ontouml2alloy/generalization_functions.ts @@ -1,10 +1,10 @@ import { Generalization } from '@libs/ontouml'; import { Ontouml2Alloy } from './'; -import { getNameNoSpaces } from './util'; +import { normalizeName } from './util'; export function transformGeneralization(transformer: Ontouml2Alloy, gen: Generalization) { - const specificName = getNameNoSpaces(gen.specific); - const generalName = getNameNoSpaces(gen.general) + const specificName = normalizeName(gen.specific); + const generalName = normalizeName(gen.general) transformer.addFact( 'fact generalization {\n' + diff --git a/src/libs/ontouml2alloy/generalization_set_functions.ts b/src/libs/ontouml2alloy/generalization_set_functions.ts index 9b9c3034..907b0b51 100644 --- a/src/libs/ontouml2alloy/generalization_set_functions.ts +++ b/src/libs/ontouml2alloy/generalization_set_functions.ts @@ -1,6 +1,6 @@ import { Generalization, GeneralizationSet, OntoumlType } from '@libs/ontouml'; import { Ontouml2Alloy } from './'; -import { getNameNoSpaces } from './util'; +import { normalizeName } from './util'; export function transformGeneralizationSet(transformer: Ontouml2Alloy, genSet: GeneralizationSet) { if (!genSet.generalizations || genSet.generalizations.length === 0 || (!genSet.isComplete && !genSet.isDisjoint)) { @@ -26,11 +26,11 @@ export function transformGeneralizationSet(transformer: Ontouml2Alloy, genSet: G } const children = (genSet.generalizations as Generalization[]) - .map(gen => getNameNoSpaces(gen.specific)); + .map(gen => normalizeName(gen.specific)); let fact = 'fact generalizationSet {\n'; if (genSet.isDisjoint) fact += ' disjoint[' + children.join(',') + ']\n'; - if (genSet.isComplete) fact += ' ' + getNameNoSpaces(parent) + ' = ' + children.join('+') + '\n'; + if (genSet.isComplete) fact += ' ' + normalizeName(parent) + ' = ' + children.join('+') + '\n'; fact += '}'; transformer.addFact(fact); diff --git a/src/libs/ontouml2alloy/property_functions.ts b/src/libs/ontouml2alloy/property_functions.ts index 025d1cab..c5da5edf 100644 --- a/src/libs/ontouml2alloy/property_functions.ts +++ b/src/libs/ontouml2alloy/property_functions.ts @@ -1,7 +1,7 @@ import { Property, Class, Relation } from '@libs/ontouml'; import { Ontouml2Alloy } from '.'; import { - getNameNoSpaces, + normalizeName, getCardinalityKeyword, isCustomCardinality, getCustomCardinality, @@ -39,9 +39,9 @@ export function transformProperty(transformer: Ontouml2Alloy, property: Property } function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Property) { - const attributeName = getNameNoSpaces(attribute); - const ownerClassName = getNameNoSpaces(attribute.container); - const datatypeName = getNameNoSpaces(attribute.propertyType); + const attributeName = normalizeName(attribute); + const ownerClassName = normalizeName(attribute.container); + const datatypeName = normalizeName(attribute.propertyType); const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); transformer.addWorldFieldDeclaration( @@ -69,9 +69,9 @@ function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Proper } function transformGeneralAttribute(transformer: Ontouml2Alloy, attribute: Property) { - const attributeName = getNameNoSpaces(attribute); - const ownerClassName = getNameNoSpaces(attribute.container); - const datatypeName = getNameNoSpaces(attribute.propertyType); + const attributeName = normalizeName(attribute); + const ownerClassName = normalizeName(attribute.container); + const datatypeName = normalizeName(attribute.propertyType); const cardinality = getCardinalityKeyword(attribute.cardinality); const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); @@ -124,21 +124,21 @@ function transformRelationSourceEnd(transformer: Ontouml2Alloy, sourceEnd: Prope let relationName = ''; if (sourceEnd.container.getName()) { - relationName = getNameNoSpaces(sourceEnd.container); + relationName = normalizeName(sourceEnd.container); } else { relationName = getValidAlias(sourceEnd.container, 'relation', transformer.aliases); } - const sourceName = getNameNoSpaces((sourceEnd.container as Relation).getSource()); + const sourceName = normalizeName((sourceEnd.container as Relation).getSource()); let sourceEndName = ''; if (sourceEnd.getName()) { - sourceEndName = getNameNoSpaces(sourceEnd); + sourceEndName = normalizeName(sourceEnd); } else { sourceEndName = sourceName; } - const oppositeName = getNameNoSpaces((sourceEnd.container as Relation).getTarget()); + const oppositeName = normalizeName((sourceEnd.container as Relation).getTarget()); const sourceEndAlias = getValidAlias(sourceEnd, sourceEndName, transformer.aliases); if (isMaterialConnectedToDerivation(sourceEnd.container as Relation, transformer.model.getAllRelations()) @@ -193,21 +193,21 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope let relationName = ''; if (targetEnd.container.getName()) { - relationName = getNameNoSpaces(targetEnd.container); + relationName = normalizeName(targetEnd.container); } else { relationName = getValidAlias(targetEnd.container, 'relation', transformer.aliases); } - const targetName = getNameNoSpaces((targetEnd.container as Relation).getTarget()); + const targetName = normalizeName((targetEnd.container as Relation).getTarget()); let targetEndName = ''; if (targetEnd.getName()) { - targetEndName = getNameNoSpaces(targetEnd); + targetEndName = normalizeName(targetEnd); } else { targetEndName = targetName; } - const oppositeName = getNameNoSpaces((targetEnd.container as Relation).getSource()); + const oppositeName = normalizeName((targetEnd.container as Relation).getSource()); const targetEndAlias = getValidAlias(targetEnd, targetEndName, transformer.aliases); if (isMaterialConnectedToDerivation(targetEnd.container as Relation, transformer.model.getAllRelations()) @@ -261,11 +261,11 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope } function transformDatatypeAttribute(transformer: Ontouml2Alloy, attribute: Property) { - const attributeName = getNameNoSpaces(attribute); - const ownerDatatypeName = getNameNoSpaces(attribute.container); + const attributeName = normalizeName(attribute); + const ownerDatatypeName = normalizeName(attribute.container); const ownerDatatype = getCorrespondingDatatype(ownerDatatypeName, transformer.datatypes); const cardinality = getCardinalityKeyword(attribute.cardinality); - const datatypeName = getNameNoSpaces(attribute.propertyType); + const datatypeName = normalizeName(attribute.propertyType); ownerDatatype[1].push((attributeName + ': ' + cardinality + ' ' + datatypeName).replace(/\s{2,}/g, ' ')); diff --git a/src/libs/ontouml2alloy/relation_functions.ts b/src/libs/ontouml2alloy/relation_functions.ts index bbfcf126..a2d06d07 100644 --- a/src/libs/ontouml2alloy/relation_functions.ts +++ b/src/libs/ontouml2alloy/relation_functions.ts @@ -1,7 +1,7 @@ import { ClassStereotype, Relation, RelationStereotype } from '@libs/ontouml'; import { Ontouml2Alloy } from './'; import { - getNameNoSpaces, + normalizeName, getCardinalityKeyword, getValidAlias, getCustomCardinality, @@ -44,13 +44,13 @@ function transformOrderedRelation(transformer: Ontouml2Alloy, relation: Relation let relationName = ''; if (relation.getName()) { - relationName = getNameNoSpaces(relation); + relationName = normalizeName(relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = getNameNoSpaces(relation.getSource()); - const targetName = getNameNoSpaces(relation.getTarget()); + const sourceName = normalizeName(relation.getSource()); + const targetName = normalizeName(relation.getTarget()); transformer.addWorldFieldDeclaration( relationName + ': set ' + sourceName + ' set -> set Int set -> set ' + targetName @@ -68,13 +68,13 @@ function transformGeneralRelation(transformer: Ontouml2Alloy, relation: Relation let relationName = ''; if (relation.getName()) { - relationName = getNameNoSpaces(relation); + relationName = normalizeName(relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = getNameNoSpaces(relation.getSource()); - const targetName = getNameNoSpaces(relation.getTarget()); + const sourceName = normalizeName(relation.getSource()); + const targetName = normalizeName(relation.getTarget()); const sourceCardinality = getCardinalityKeyword(relation.getSourceEnd().cardinality); const targetCardinality = getCardinalityKeyword(relation.getTargetEnd().cardinality); @@ -87,12 +87,12 @@ function transformMediationRelation(transformer: Ontouml2Alloy, relation: Relati let relationName = ''; if (relation.getName()) { - relationName = getNameNoSpaces(relation); + relationName = normalizeName(relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = getNameNoSpaces(relation.getSource()); + const sourceName = normalizeName(relation.getSource()); transformer.addFact( 'fact acyclic {\n' + @@ -111,14 +111,14 @@ function transformMaterialRelation(transformer: Ontouml2Alloy, relation: Relatio let materialName = ''; if (relation.getName()) { - materialName = getNameNoSpaces(relation); + materialName = normalizeName(relation); } else { materialName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = getNameNoSpaces(relation.getSource()); - const targetName = getNameNoSpaces(relation.getTarget()); - const relatorName = getNameNoSpaces(rel.getDerivedClass()); + const sourceName = normalizeName(relation.getSource()); + const targetName = normalizeName(relation.getTarget()); + const relatorName = normalizeName(rel.getDerivedClass()); transformer.addWorldFieldDeclaration( materialName + ': set ' + sourceName + ' -> ' + relatorName + ' -> ' + targetName @@ -165,28 +165,28 @@ function transformDerivationRelation(transformer: Ontouml2Alloy, relation: Relat let materialName = ''; if (material.getName()) { - materialName = getNameNoSpaces(material); + materialName = normalizeName(material); } else { materialName = getValidAlias(material, 'relation', transformer.aliases); } let mediation1Name = ''; if (mediation1.getName()) { - mediation1Name = getNameNoSpaces(mediation1); + mediation1Name = normalizeName(mediation1); } else { mediation1Name = getValidAlias(mediation1, 'relation', transformer.aliases); } let mediation2Name = ''; if (mediation2.getName()) { - mediation2Name = getNameNoSpaces(mediation2); + mediation2Name = normalizeName(mediation2); } else { mediation2Name = getValidAlias(mediation2, 'relation', transformer.aliases); } - const relatorName = getNameNoSpaces(relator); - const materialSourceName = getNameNoSpaces(materialSource); - const materialTargetName = getNameNoSpaces(materialTarget); + const relatorName = normalizeName(relator); + const materialSourceName = normalizeName(materialSource); + const materialTargetName = normalizeName(materialTarget); transformer.addFact( 'fact derivation {\n' + @@ -201,20 +201,20 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati let relationName = ''; if (relation.getName()) { - relationName = getNameNoSpaces(relation); + relationName = normalizeName(relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const wholeName = getNameNoSpaces(relation.getSource()); - const partName = getNameNoSpaces(relation.getTarget()); + const wholeName = normalizeName(relation.getSource()); + const partName = normalizeName(relation.getTarget()); const wholeEnd = relation.getSourceEnd(); let wholeEndName = ''; if (wholeEnd.getName()) { - wholeEndName = getNameNoSpaces(wholeEnd); + wholeEndName = normalizeName(wholeEnd); } else { - wholeEndName = getNameNoSpaces(relation.getSource()); + wholeEndName = normalizeName(relation.getSource()); } const wholeEndAlias = getValidAlias(wholeEnd, wholeEndName, transformer.aliases); @@ -226,9 +226,9 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati const otherWholeEnd = relation.getSourceEnd(); let otherWholeEndName = ''; if (otherWholeEnd.getName()) { - otherWholeEndName = getNameNoSpaces(otherWholeEnd); + otherWholeEndName = normalizeName(otherWholeEnd); } else { - otherWholeEndName = getNameNoSpaces((otherWholeEnd.container as Relation).getSource()); + otherWholeEndName = normalizeName((otherWholeEnd.container as Relation).getSource()); } const otherWholeEndAlias = getValidAlias(otherWholeEnd, otherWholeEndName, transformer.aliases); @@ -263,14 +263,14 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati } function transformDatatypeRelation(transformer: Ontouml2Alloy, relation: Relation) { - const sourceName = getNameNoSpaces(relation.getSource()); - const targetName = getNameNoSpaces(relation.getTarget()); + const sourceName = normalizeName(relation.getSource()); + const targetName = normalizeName(relation.getTarget()); const sourceDatatype = getCorrespondingDatatype(sourceName, transformer.datatypes); let relationName = ''; if (relation.getName()) { - relationName = getNameNoSpaces(relation); + relationName = normalizeName(relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } @@ -316,14 +316,14 @@ export function transformCharacterizationConstraint(transformer: Ontouml2Alloy) let characterizations = transformer.model.getAllRelationsByStereotype(RelationStereotype.CHARACTERIZATION) .map(characterization => { if (characterization.getName()) { - return 'w.' + getNameNoSpaces(characterization); + return 'w.' + normalizeName(characterization); } else { return 'w.' + getValidAlias(characterization, 'relation', transformer.aliases); } }); if (characterizations.length) { let intrinsicMoments = [... new Set([...transformer.model.getClassesRestrictedToIntrinsicMode(), ...transformer.model.getClassesRestrictedToQuality()])] - .map(moment => 'w.' + getNameNoSpaces(moment)); + .map(moment => 'w.' + normalizeName(moment)); if (intrinsicMoments.length) { transformer.addFact( 'fact acyclicCharacterizations {\n' + diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index 0c33d455..c1336c40 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -1,8 +1,35 @@ import { OntoumlElement, Class, ClassStereotype, Relation, Generalization, Cardinality } from '@libs/ontouml'; -export function getNameNoSpaces(element: OntoumlElement) { - return element.getName().replace(/\s/g, ''); -}//normalizeName +export function normalizeName(element: OntoumlElement) { + const reservedKeywords = [ + 'abstract', 'all', 'and', 'as', 'assert', + 'but', 'check', 'disj', 'else', 'exactly', + 'extends', 'fact', 'for', 'fun', 'iden', + 'iff', 'implies', 'in', 'Int', 'let', + 'lone', 'module', 'no', 'none', 'not', + 'one', 'open', 'or', 'pred', 'run', + 'set', 'sig', 'some', 'sum', 'univ' + ]; + + const forbiddenCharacters = [ + ' ', '!', '@', '#', '$', '%', '&', + '*', '(', ')', '-', '+', '=', '{', + '}', '[', ']', '|', '\\', ';', ':', + ',', '.', '<', '>', '/', '?' + ]; + + let normalizedName = element.getName(); + + // Replace forbidden characters with an empty string + forbiddenCharacters.forEach(char => { + normalizedName = normalizedName.replace(new RegExp(`\\${char}`, 'g'), ''); + }); + + + return normalizedName; + // return element.getName().replace(/\s/g, ''); +} + export function isTopLevel(_class: Class, generalizations: Generalization[]) { for (const gen of generalizations) { From ed8c011e400a79f5363ab081e58b0533e0a6f6ee Mon Sep 17 00:00:00 2001 From: Asen Date: Fri, 14 Apr 2023 00:20:40 +0200 Subject: [PATCH 11/23] normalize_name function & testing --- .../alloy_name_normalization.test.ts | 179 +++++++++--------- .../ontouml2alloy/name_normalization.test.ts | 27 --- src/libs/ontouml2alloy/class_functions.ts | 34 ++-- .../ontouml2alloy/generalization_functions.ts | 4 +- .../generalization_set_functions.ts | 4 +- src/libs/ontouml2alloy/ontouml2alloy.ts | 8 +- src/libs/ontouml2alloy/property_functions.ts | 34 ++-- src/libs/ontouml2alloy/relation_functions.ts | 60 +++--- src/libs/ontouml2alloy/util.ts | 28 ++- 9 files changed, 191 insertions(+), 187 deletions(-) delete mode 100644 __tests__/libs/ontouml2alloy/name_normalization.test.ts diff --git a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts index 31753226..42cbab94 100644 --- a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts +++ b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts @@ -1,106 +1,109 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; import { Class, OntoumlElement, Package, Project } from '@libs/ontouml'; import { normalizeName } from '@libs/ontouml2alloy/util'; +import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from './helpers'; -describe('Original name is kept when there are no issues' , () => { + +describe('Name normalization' , () => { let element: OntoumlElement; element = new Class(); - - it('Person -> Person', () => { - element.addName('Person'); - const normalized = normalizeName(element); - expect(normalized).toBe('Person'); - }); + let project: Project; + let model: Package; + let transformer: Ontouml2Alloy; + + beforeEach(() => { + project = new Project(); + model = project.createModel(); + transformer = new Ontouml2Alloy(model); + }); - it('PERSON -> PERSON', () => { - element.addName('PERSON'); - const normalized = normalizeName(element); - expect(normalized).toBe('PERSON'); - }); + describe('Original name is kept when there are no issues' , () => { - it('person -> person', () => { - element.addName('person'); - const normalized = normalizeName(element); - expect(normalized).toBe('person'); - }); + it('Person -> Person', () => { + element.addName('Person'); + const normalized = normalizeName(transformer, element); + expect(normalized).toBe('Person'); + }); + + it('PERSON -> PERSON', () => { + element.addName('PERSON'); + const normalized = normalizeName(transformer, element); + expect(normalized).toBe('PERSON'); + }); + + it('person -> person', () => { + element.addName('person'); + const normalized = normalizeName(transformer, element); + expect(normalized).toBe('person'); + }); + + it('PeRsoN -> PeRsoN', () => { + element.addName('PeRsoN'); + const normalized = normalizeName(transformer, element); + expect(normalized).toBe('PeRsoN'); + }); - it('PeRsoN -> PeRsoN', () => { - element.addName('PeRsoN'); - const normalized = normalizeName(element); - expect(normalized).toBe('PeRsoN'); - }); - -}) - -describe("Names are normalized properly", () => { - - let element: OntoumlElement; - element = new Class(); - - // it('should normalize an empty name', () => { - // element.addName(''); - // const normalized = normalizeName(element); - // expect(normalized).toBe(''); - // }); - - const reservedKeywords = [ - 'abstract', 'all', 'and', 'as', 'assert', - 'but', 'check', 'disj', 'else', 'exactly', - 'extends', 'fact', 'for', 'fun', 'iden', - 'iff', 'implies', 'in', 'Int', 'let', - 'lone', 'module', 'no', 'none', 'not', - 'one', 'open', 'or', 'pred', 'run', - 'set', 'sig', 'some', 'sum', 'univ' - ]; - //normalization of reserved keywords: abstract -> _abstract - reservedKeywords.forEach(keyword => { - it(`should normalize the reserved keyword "${keyword}"`, () => { - element.addName(keyword); - const normalized = normalizeName(element); - expect(normalized).toBe(`_${keyword}`); //what to do + }) + + describe("Names are normalized properly", () => { + + const reservedKeywords = [ + 'abstract', 'all', 'and', 'as', 'assert', + 'but', 'check', 'disj', 'else', 'exactly', + 'extends', 'fact', 'for', 'fun', 'iden', + 'iff', 'implies', 'in', 'Int', 'let', + 'lone', 'module', 'no', 'none', 'not', + 'one', 'open', 'or', 'pred', 'run', + 'set', 'sig', 'some', 'sum', 'univ' + ]; + //normalization of reserved keywords: abstract -> abstract_set + reservedKeywords.forEach(keyword => { + it(`should normalize the reserved keyword "${keyword}"`, () => { + element.addName(keyword); + const normalized = normalizeName(transformer, element); + expect(normalized).toBe(`${keyword}_set`); + }); }); - }); - - const forbiddenCharacters = [ - ' ', '!', '@', '#', '$', '%', '&', - '*', '(', ')', '-', '+', '=', '{', - '}', '[', ']', '|', '\\', ';', ':', - ',', '.', '<', '>', '/', '?' - ]; - - forbiddenCharacters.forEach(char => { - it(`should remove the forbidden character "${char}" from the name`, () => { - element.addName(`Happy${char}Person`); - const normalized = normalizeName(element); - expect(normalized).toBe('HappyPerson'); + + const forbiddenCharacters = [ + ' ', '!', '@', '#', '$', '%', '&', + '*', '(', ')', '-', '+', '=', '{', + '}', '[', ']', '|', '\\', ';', ':', + ',', '.', '<', '>', '/', '?' + ]; + + forbiddenCharacters.forEach(char => { + it(`should remove the forbidden character "${char}" from the name`, () => { + element.addName(`Happy${char}Person`); + const normalized = normalizeName(transformer, element); + expect(normalized).toBe('HappyPerson'); + }); }); - }); - - - it('should normalize a class with no name', () => { - element.addName(''); - const normalized = normalizeName(element); - expect(normalized).toBe('_unnamed'); //what to do + + // it('should normalize a class with no name', () => { + // element.addName(''); + // const normalized = normalizeName(transformer, element); + // expect(normalized).toBe('unnamed'); + // }); //what to do + + it('should normalize two classes with same name', () => { + model.createKind('Person'); + model.createKind('Person'); + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])); + expect(result).toContain(generateFact('rigid',['rigidity[Person1,Object,exists]'])); + expect(result).toContain(generateWorldAttribute('Person','Object')); + expect(result).toContain(generateWorldAttribute('Person1','Object')); + expect(result).toContain(generateWorldFact('Person+Person1','Object')); + }) + }); - it('temp', () => { - let project = new Project(); - let model = project.createModel(); - let ontouml2alloy = new Ontouml2Alloy(model); - model.createKind('Person'); - model.createKind('Person'); - ontouml2alloy.transform(); - console.log(ontouml2alloy.getAliases()); - console.log(ontouml2alloy.facts); - }) - // it('should add a class to a map to keep track of transformed classes', () => { - // const className = 'Person'; - // element.addName(className); - // const normalized = normalizeName(element); - // }); +}) + -}); diff --git a/__tests__/libs/ontouml2alloy/name_normalization.test.ts b/__tests__/libs/ontouml2alloy/name_normalization.test.ts deleted file mode 100644 index c844fd26..00000000 --- a/__tests__/libs/ontouml2alloy/name_normalization.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; -import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from '__tests__/libs/ontouml2alloy/helpers'; -import { Package, Project } from '@libs/ontouml'; - -describe('Original name is kept when there are no forbidden characters' , () => { - - // it('Person -> Person', () => { - // const normalized = normalizeName('Person'); - // expect(normalized).toBe('Person'); - // }); - - // it('PERSON -> PERSON', () => { - // const normalized = normalizeName('PERSON'); - // expect(normalized).toBe('PERSON'); - // }); - - // it('person -> person', () => { - // const normalized = normalizeName('person'); - // expect(normalized).toBe('person'); - // }); - - // it('PeRsoN -> PeRsoN', () => { - // const normalized = normalizeName('PeRsoN'); - // expect(normalized).toBe('PeRsoN'); - // }); - -}) \ No newline at end of file diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index c9813a70..7ff2b7aa 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -38,8 +38,8 @@ export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //Th } function transformAbstractClass(transformer: Ontouml2Alloy, _class: Class) { - const className = normalizeName(_class); - const subtypes = _class.getChildren().map(subtype => 'w.' + normalizeName(subtype)); + const className = normalizeName(transformer, _class); + const subtypes = _class.getChildren().map(subtype => 'w.' + normalizeName(transformer, subtype)); if (subtypes.length) { transformer.addFact( @@ -51,7 +51,7 @@ function transformAbstractClass(transformer: Ontouml2Alloy, _class: Class) { } function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { - const className = normalizeName(_class); + const className = normalizeName(transformer, _class); let nature = ''; if (_class.isRestrictedToSubstantial()) { @@ -84,13 +84,13 @@ function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { } function transformDatatypeClass(transformer: Ontouml2Alloy, _class: Class) { - const datatypeName = normalizeName(_class); + const datatypeName = normalizeName(transformer, _class); transformer.addDatatype([datatypeName, []]); } function transformEnumerationClass(transformer: Ontouml2Alloy, _class: Class) { - const enumName = normalizeName(_class); - const literals = _class.literals.map(literal => normalizeName(literal)); + const enumName = normalizeName(transformer, _class); + const literals = _class.literals.map(literal => normalizeName(transformer, literal)); if (literals.length) { transformer.addEnum( @@ -109,9 +109,9 @@ function transformRelatorConstraint(transformer: Ontouml2Alloy, _class: Class) { let mediatedName = ''; if (mediated.getName()) { - mediatedName = normalizeName(mediated); + mediatedName = normalizeName(transformer, mediated); } else { - mediatedName = normalizeName(mediation.getTarget()); + mediatedName = normalizeName(transformer, mediation.getTarget()); } const mediatedAlias = getValidAlias(mediated, mediatedName, transformer.aliases); @@ -120,7 +120,7 @@ function transformRelatorConstraint(transformer: Ontouml2Alloy, _class: Class) { } if (mediations.length) { - const relatorName = normalizeName(_class); + const relatorName = normalizeName(transformer, _class); transformer.addFact( 'fact relatorConstraint {\n' + ' all w: World, x: w.' + relatorName + ' | #(' + mediations.join('+') + ')>=2\n' + @@ -140,9 +140,9 @@ function transformWeakSupplementationConstraint(transformer: Ontouml2Alloy, _cla let partName = ''; if (part.getName()) { - partName = normalizeName(part); + partName = normalizeName(transformer, part); } else { - partName = normalizeName((part.container as Relation).getTarget()); + partName = normalizeName(transformer, (part.container as Relation).getTarget()); } const partAlias = getValidAlias(part, partName, transformer.aliases); @@ -152,7 +152,7 @@ function transformWeakSupplementationConstraint(transformer: Ontouml2Alloy, _cla } if (parts.length) { - const wholeName = normalizeName(_class); + const wholeName = normalizeName(transformer, _class); transformer.addFact( 'fact weakSupplementationConstraint {\n' + @@ -172,12 +172,12 @@ function transformDisjointNaturesConstraint(transformer: Ontouml2Alloy, _class: if (isTopLevel(otherClass, transformer.model.getAllGeneralizations()) && !otherClass.restrictedToContainedIn(_class.restrictedTo)) { - differentNaturedClasses.push(normalizeName(otherClass)); + differentNaturedClasses.push(normalizeName(transformer, otherClass)); } } if (differentNaturedClasses.length) { - const className = normalizeName(_class); + const className = normalizeName(transformer, _class); if (differentNaturedClasses.length == 1) { transformer.addWorldFieldFact( 'disjoint[' + className + ',' + differentNaturedClasses[0] + ']' @@ -196,7 +196,7 @@ export function transformAdditionalClassConstraints(transformer: Ontouml2Alloy) for (const _class of transformer.model.getAllClasses()) { if (_class.isRestrictedToEndurant() && isTopLevel(_class, transformer.model.getAllGeneralizations())) { - const className = normalizeName(_class); + const className = normalizeName(transformer, _class); if (_class.isRestrictedToSubstantial()) { objectClasses.push(className); @@ -233,10 +233,10 @@ export function transformAdditionalDatatypeConstraints(transformer: Ontouml2Allo } } - const datatypesNames = datatypes.map(datatype => normalizeName(datatype)); + const datatypesNames = datatypes.map(datatype => normalizeName(transformer, datatype)); if (topLevelDatatypes.length >= 2) { - const topLevelDatatypesNames = topLevelDatatypes.map(datatype => normalizeName(datatype)); + const topLevelDatatypesNames = topLevelDatatypes.map(datatype => normalizeName(transformer, datatype)); transformer.addFact( 'fact additionalDatatypeFacts {\n' + diff --git a/src/libs/ontouml2alloy/generalization_functions.ts b/src/libs/ontouml2alloy/generalization_functions.ts index 7e66e15b..c77daf36 100644 --- a/src/libs/ontouml2alloy/generalization_functions.ts +++ b/src/libs/ontouml2alloy/generalization_functions.ts @@ -3,8 +3,8 @@ import { Ontouml2Alloy } from './'; import { normalizeName } from './util'; export function transformGeneralization(transformer: Ontouml2Alloy, gen: Generalization) { - const specificName = normalizeName(gen.specific); - const generalName = normalizeName(gen.general) + const specificName = normalizeName(transformer, gen.specific); + const generalName = normalizeName(transformer, gen.general) transformer.addFact( 'fact generalization {\n' + diff --git a/src/libs/ontouml2alloy/generalization_set_functions.ts b/src/libs/ontouml2alloy/generalization_set_functions.ts index 907b0b51..30a3165f 100644 --- a/src/libs/ontouml2alloy/generalization_set_functions.ts +++ b/src/libs/ontouml2alloy/generalization_set_functions.ts @@ -26,11 +26,11 @@ export function transformGeneralizationSet(transformer: Ontouml2Alloy, genSet: G } const children = (genSet.generalizations as Generalization[]) - .map(gen => normalizeName(gen.specific)); + .map(gen => normalizeName(transformer, gen.specific)); let fact = 'fact generalizationSet {\n'; if (genSet.isDisjoint) fact += ' disjoint[' + children.join(',') + ']\n'; - if (genSet.isComplete) fact += ' ' + normalizeName(parent) + ' = ' + children.join('+') + '\n'; + if (genSet.isComplete) fact += ' ' + normalizeName(transformer, parent) + ' = ' + children.join('+') + '\n'; fact += '}'; transformer.addFact(fact); diff --git a/src/libs/ontouml2alloy/ontouml2alloy.ts b/src/libs/ontouml2alloy/ontouml2alloy.ts index cb577abd..6400c829 100644 --- a/src/libs/ontouml2alloy/ontouml2alloy.ts +++ b/src/libs/ontouml2alloy/ontouml2alloy.ts @@ -22,7 +22,8 @@ export class Ontouml2Alloy implements Service { relationPropertiesFacts: string[]; funs: string[]; visible: string[]; - aliases: [OntoumlElement, string][]; // [element, alias] + aliases: [OntoumlElement, string][]; //[element, alias]; used in transformRelatorConstraint + normalizedNames: { [key: string]: string }; //added, OntoumlElement ID, normalizedName /* Lines 13-33 define a class Ontouml2Alloy that implements Service. The class has a constructor @@ -47,6 +48,7 @@ export class Ontouml2Alloy implements Service { this.funs = []; this.visible = ['exists']; this.aliases = []; + this.normalizedNames = {} //added } getAlloyCode(): string[] { @@ -61,6 +63,10 @@ export class Ontouml2Alloy implements Service { return this.datatypes; } //getter to test + getAliases(){ + return this.aliases; + } + addDatatype(datatype: [string, string[]]) { this.datatypes.push(datatype); } diff --git a/src/libs/ontouml2alloy/property_functions.ts b/src/libs/ontouml2alloy/property_functions.ts index c5da5edf..afeb2bfc 100644 --- a/src/libs/ontouml2alloy/property_functions.ts +++ b/src/libs/ontouml2alloy/property_functions.ts @@ -39,9 +39,9 @@ export function transformProperty(transformer: Ontouml2Alloy, property: Property } function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Property) { - const attributeName = normalizeName(attribute); - const ownerClassName = normalizeName(attribute.container); - const datatypeName = normalizeName(attribute.propertyType); + const attributeName = normalizeName(transformer, attribute); + const ownerClassName = normalizeName(transformer, attribute.container); + const datatypeName = normalizeName(transformer, attribute.propertyType); const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); transformer.addWorldFieldDeclaration( @@ -69,9 +69,9 @@ function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Proper } function transformGeneralAttribute(transformer: Ontouml2Alloy, attribute: Property) { - const attributeName = normalizeName(attribute); - const ownerClassName = normalizeName(attribute.container); - const datatypeName = normalizeName(attribute.propertyType); + const attributeName = normalizeName(transformer, attribute); + const ownerClassName = normalizeName(transformer, attribute.container); + const datatypeName = normalizeName(transformer, attribute.propertyType); const cardinality = getCardinalityKeyword(attribute.cardinality); const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); @@ -124,21 +124,21 @@ function transformRelationSourceEnd(transformer: Ontouml2Alloy, sourceEnd: Prope let relationName = ''; if (sourceEnd.container.getName()) { - relationName = normalizeName(sourceEnd.container); + relationName = normalizeName(transformer, sourceEnd.container); } else { relationName = getValidAlias(sourceEnd.container, 'relation', transformer.aliases); } - const sourceName = normalizeName((sourceEnd.container as Relation).getSource()); + const sourceName = normalizeName(transformer, (sourceEnd.container as Relation).getSource()); let sourceEndName = ''; if (sourceEnd.getName()) { - sourceEndName = normalizeName(sourceEnd); + sourceEndName = normalizeName(transformer, sourceEnd); } else { sourceEndName = sourceName; } - const oppositeName = normalizeName((sourceEnd.container as Relation).getTarget()); + const oppositeName = normalizeName(transformer, (sourceEnd.container as Relation).getTarget()); const sourceEndAlias = getValidAlias(sourceEnd, sourceEndName, transformer.aliases); if (isMaterialConnectedToDerivation(sourceEnd.container as Relation, transformer.model.getAllRelations()) @@ -193,21 +193,21 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope let relationName = ''; if (targetEnd.container.getName()) { - relationName = normalizeName(targetEnd.container); + relationName = normalizeName(transformer, targetEnd.container); } else { relationName = getValidAlias(targetEnd.container, 'relation', transformer.aliases); } - const targetName = normalizeName((targetEnd.container as Relation).getTarget()); + const targetName = normalizeName(transformer, (targetEnd.container as Relation).getTarget()); let targetEndName = ''; if (targetEnd.getName()) { - targetEndName = normalizeName(targetEnd); + targetEndName = normalizeName(transformer, targetEnd); } else { targetEndName = targetName; } - const oppositeName = normalizeName((targetEnd.container as Relation).getSource()); + const oppositeName = normalizeName(transformer, (targetEnd.container as Relation).getSource()); const targetEndAlias = getValidAlias(targetEnd, targetEndName, transformer.aliases); if (isMaterialConnectedToDerivation(targetEnd.container as Relation, transformer.model.getAllRelations()) @@ -261,11 +261,11 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope } function transformDatatypeAttribute(transformer: Ontouml2Alloy, attribute: Property) { - const attributeName = normalizeName(attribute); - const ownerDatatypeName = normalizeName(attribute.container); + const attributeName = normalizeName(transformer, attribute); + const ownerDatatypeName = normalizeName(transformer, attribute.container); const ownerDatatype = getCorrespondingDatatype(ownerDatatypeName, transformer.datatypes); const cardinality = getCardinalityKeyword(attribute.cardinality); - const datatypeName = normalizeName(attribute.propertyType); + const datatypeName = normalizeName(transformer, attribute.propertyType); ownerDatatype[1].push((attributeName + ': ' + cardinality + ' ' + datatypeName).replace(/\s{2,}/g, ' ')); diff --git a/src/libs/ontouml2alloy/relation_functions.ts b/src/libs/ontouml2alloy/relation_functions.ts index a2d06d07..5620ae1f 100644 --- a/src/libs/ontouml2alloy/relation_functions.ts +++ b/src/libs/ontouml2alloy/relation_functions.ts @@ -44,13 +44,13 @@ function transformOrderedRelation(transformer: Ontouml2Alloy, relation: Relation let relationName = ''; if (relation.getName()) { - relationName = normalizeName(relation); + relationName = normalizeName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = normalizeName(relation.getSource()); - const targetName = normalizeName(relation.getTarget()); + const sourceName = normalizeName(transformer, relation.getSource()); + const targetName = normalizeName(transformer, relation.getTarget()); transformer.addWorldFieldDeclaration( relationName + ': set ' + sourceName + ' set -> set Int set -> set ' + targetName @@ -68,13 +68,13 @@ function transformGeneralRelation(transformer: Ontouml2Alloy, relation: Relation let relationName = ''; if (relation.getName()) { - relationName = normalizeName(relation); + relationName = normalizeName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = normalizeName(relation.getSource()); - const targetName = normalizeName(relation.getTarget()); + const sourceName = normalizeName(transformer, relation.getSource()); + const targetName = normalizeName(transformer, relation.getTarget()); const sourceCardinality = getCardinalityKeyword(relation.getSourceEnd().cardinality); const targetCardinality = getCardinalityKeyword(relation.getTargetEnd().cardinality); @@ -87,12 +87,12 @@ function transformMediationRelation(transformer: Ontouml2Alloy, relation: Relati let relationName = ''; if (relation.getName()) { - relationName = normalizeName(relation); + relationName = normalizeName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = normalizeName(relation.getSource()); + const sourceName = normalizeName(transformer, relation.getSource()); transformer.addFact( 'fact acyclic {\n' + @@ -111,14 +111,14 @@ function transformMaterialRelation(transformer: Ontouml2Alloy, relation: Relatio let materialName = ''; if (relation.getName()) { - materialName = normalizeName(relation); + materialName = normalizeName(transformer, relation); } else { materialName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = normalizeName(relation.getSource()); - const targetName = normalizeName(relation.getTarget()); - const relatorName = normalizeName(rel.getDerivedClass()); + const sourceName = normalizeName(transformer, relation.getSource()); + const targetName = normalizeName(transformer, relation.getTarget()); + const relatorName = normalizeName(transformer, rel.getDerivedClass()); transformer.addWorldFieldDeclaration( materialName + ': set ' + sourceName + ' -> ' + relatorName + ' -> ' + targetName @@ -165,28 +165,28 @@ function transformDerivationRelation(transformer: Ontouml2Alloy, relation: Relat let materialName = ''; if (material.getName()) { - materialName = normalizeName(material); + materialName = normalizeName(transformer, material); } else { materialName = getValidAlias(material, 'relation', transformer.aliases); } let mediation1Name = ''; if (mediation1.getName()) { - mediation1Name = normalizeName(mediation1); + mediation1Name = normalizeName(transformer, mediation1); } else { mediation1Name = getValidAlias(mediation1, 'relation', transformer.aliases); } let mediation2Name = ''; if (mediation2.getName()) { - mediation2Name = normalizeName(mediation2); + mediation2Name = normalizeName(transformer, mediation2); } else { mediation2Name = getValidAlias(mediation2, 'relation', transformer.aliases); } - const relatorName = normalizeName(relator); - const materialSourceName = normalizeName(materialSource); - const materialTargetName = normalizeName(materialTarget); + const relatorName = normalizeName(transformer, relator); + const materialSourceName = normalizeName(transformer, materialSource); + const materialTargetName = normalizeName(transformer, materialTarget); transformer.addFact( 'fact derivation {\n' + @@ -201,20 +201,20 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati let relationName = ''; if (relation.getName()) { - relationName = normalizeName(relation); + relationName = normalizeName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const wholeName = normalizeName(relation.getSource()); - const partName = normalizeName(relation.getTarget()); + const wholeName = normalizeName(transformer, relation.getSource()); + const partName = normalizeName(transformer, relation.getTarget()); const wholeEnd = relation.getSourceEnd(); let wholeEndName = ''; if (wholeEnd.getName()) { - wholeEndName = normalizeName(wholeEnd); + wholeEndName = normalizeName(transformer, wholeEnd); } else { - wholeEndName = normalizeName(relation.getSource()); + wholeEndName = normalizeName(transformer, relation.getSource()); } const wholeEndAlias = getValidAlias(wholeEnd, wholeEndName, transformer.aliases); @@ -226,9 +226,9 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati const otherWholeEnd = relation.getSourceEnd(); let otherWholeEndName = ''; if (otherWholeEnd.getName()) { - otherWholeEndName = normalizeName(otherWholeEnd); + otherWholeEndName = normalizeName(transformer, otherWholeEnd); } else { - otherWholeEndName = normalizeName((otherWholeEnd.container as Relation).getSource()); + otherWholeEndName = normalizeName(transformer, (otherWholeEnd.container as Relation).getSource()); } const otherWholeEndAlias = getValidAlias(otherWholeEnd, otherWholeEndName, transformer.aliases); @@ -263,14 +263,14 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati } function transformDatatypeRelation(transformer: Ontouml2Alloy, relation: Relation) { - const sourceName = normalizeName(relation.getSource()); - const targetName = normalizeName(relation.getTarget()); + const sourceName = normalizeName(transformer, relation.getSource()); + const targetName = normalizeName(transformer, relation.getTarget()); const sourceDatatype = getCorrespondingDatatype(sourceName, transformer.datatypes); let relationName = ''; if (relation.getName()) { - relationName = normalizeName(relation); + relationName = normalizeName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } @@ -316,14 +316,14 @@ export function transformCharacterizationConstraint(transformer: Ontouml2Alloy) let characterizations = transformer.model.getAllRelationsByStereotype(RelationStereotype.CHARACTERIZATION) .map(characterization => { if (characterization.getName()) { - return 'w.' + normalizeName(characterization); + return 'w.' + normalizeName(transformer, characterization); } else { return 'w.' + getValidAlias(characterization, 'relation', transformer.aliases); } }); if (characterizations.length) { let intrinsicMoments = [... new Set([...transformer.model.getClassesRestrictedToIntrinsicMode(), ...transformer.model.getClassesRestrictedToQuality()])] - .map(moment => 'w.' + normalizeName(moment)); + .map(moment => 'w.' + normalizeName(transformer, moment)); if (intrinsicMoments.length) { transformer.addFact( 'fact acyclicCharacterizations {\n' + diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index c1336c40..3a20875c 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -1,6 +1,12 @@ import { OntoumlElement, Class, ClassStereotype, Relation, Generalization, Cardinality } from '@libs/ontouml'; +import { Ontouml2Alloy } from '.'; + +export function normalizeName(transformer: Ontouml2Alloy, element: OntoumlElement) { + + if(element.id in transformer.normalizedNames){ + return transformer.normalizedNames[element.id]; + } -export function normalizeName(element: OntoumlElement) { const reservedKeywords = [ 'abstract', 'all', 'and', 'as', 'assert', 'but', 'check', 'disj', 'else', 'exactly', @@ -25,9 +31,25 @@ export function normalizeName(element: OntoumlElement) { normalizedName = normalizedName.replace(new RegExp(`\\${char}`, 'g'), ''); }); - + // Check if the normalized name is a reserved keyword + if (reservedKeywords.includes(normalizedName)) { + normalizedName += '_set'; + } + + const id = element.id; + + if(Object.values(transformer.normalizedNames).length != 0){ + const existingNames = Object.values(transformer.normalizedNames); + let index = 1; + while (existingNames.includes(normalizedName)) { + normalizedName = `${normalizedName}${index}`; + index++; + } + } + + transformer.normalizedNames[id] = normalizedName; + return normalizedName; - // return element.getName().replace(/\s/g, ''); } From de8f43fde0fee6d95cfe0e1de6cbcd4bb4b6653a Mon Sep 17 00:00:00 2001 From: Asen Date: Thu, 27 Apr 2023 03:19:07 +0200 Subject: [PATCH 12/23] name_norm update & many other updates, fixes,TODOs --- .../alloy_name_normalization.test.ts | 53 +++- .../ontouml2alloy/class_functions.test.ts | 68 +---- .../generalization_functions.test.ts | 63 ++--- .../generalization_set_functions.test.ts | 243 ++++++++++++++++++ __tests__/libs/ontouml2alloy/helpers.ts | 2 +- src/libs/ontouml2alloy/class_functions.ts | 4 +- src/libs/ontouml2alloy/util.ts | 21 +- 7 files changed, 348 insertions(+), 106 deletions(-) create mode 100644 __tests__/libs/ontouml2alloy/generalization_set_functions.test.ts diff --git a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts index 42cbab94..faeefe9c 100644 --- a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts +++ b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts @@ -1,13 +1,13 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; -import { Class, OntoumlElement, Package, Project } from '@libs/ontouml'; +import { Class, OntoumlElement, Package, Project, Relation } from '@libs/ontouml'; import { normalizeName } from '@libs/ontouml2alloy/util'; import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from './helpers'; +import { OntoumlType } from '@libs/ontouml'; describe('Name normalization' , () => { let element: OntoumlElement; - element = new Class(); let project: Project; let model: Package; let transformer: Ontouml2Alloy; @@ -16,6 +16,7 @@ describe('Name normalization' , () => { project = new Project(); model = project.createModel(); transformer = new Ontouml2Alloy(model); + element = new Class(); }); describe('Original name is kept when there are no issues' , () => { @@ -46,7 +47,7 @@ describe('Name normalization' , () => { }) - describe("Names are normalized properly", () => { + describe("Inappropriate names are normalized properly", () => { const reservedKeywords = [ 'abstract', 'all', 'and', 'as', 'assert', @@ -57,12 +58,12 @@ describe('Name normalization' , () => { 'one', 'open', 'or', 'pred', 'run', 'set', 'sig', 'some', 'sum', 'univ' ]; - //normalization of reserved keywords: abstract -> abstract_set + //normalization of reserved keywords: abstract -> abstract_OntoumlElementType reservedKeywords.forEach(keyword => { it(`should normalize the reserved keyword "${keyword}"`, () => { element.addName(keyword); const normalized = normalizeName(transformer, element); - expect(normalized).toBe(`${keyword}_set`); + expect(normalized).toBe(`${keyword}_${(element.type).toLowerCase()}`); }); }); @@ -80,13 +81,34 @@ describe('Name normalization' , () => { expect(normalized).toBe('HappyPerson'); }); }); - - - // it('should normalize a class with no name', () => { - // element.addName(''); - // const normalized = normalizeName(transformer, element); - // expect(normalized).toBe('unnamed'); - // }); //what to do + + //normalization of empty name: '' -> Unnamed_OntoumlElementType; + //TODO check if this is the desired behavior + it('should normalize a class with no name', () => { + element.addName(''); + const normalized = normalizeName(transformer, element); + expect(normalized).toBe('Unnamed_class'); + }); + + it('should normalize a relation with no name', () => { + element = new Relation(); + element.addName(''); + const normalized = normalizeName(transformer, element); + expect(normalized).toBe('Unnamed_relation'); + }); + + //TODO check if this is the desired behavior + it('should normalize two classes with no name/only forbidden characters', () => { + model.createKind(''); + model.createKind('!!!'); + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Unnamed_class,Object,exists]'])); + expect(result).toContain(generateFact('rigid',['rigidity[Unnamed_class1,Object,exists]'])); + expect(result).toContain(generateWorldAttribute('Unnamed_class','Object')); + expect(result).toContain(generateWorldAttribute('Unnamed_class1','Object')); + expect(result).toContain(generateWorldFact('Unnamed_class+Unnamed_class1','Object')); + }); it('should normalize two classes with same name', () => { model.createKind('Person'); @@ -99,6 +121,13 @@ describe('Name normalization' , () => { expect(result).toContain(generateWorldAttribute('Person1','Object')); expect(result).toContain(generateWorldFact('Person+Person1','Object')); }) + + //TODO check if this is the desired behavior + it('should normalize a class starting with a number', () => { + element.addName('123Person'); + const normalized = normalizeName(transformer, element); + expect(normalized).toBe('class_123Person'); + }); }); diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index d4ee5ba2..f671e517 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -1,8 +1,6 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from './helpers'; import { Class, ClassStereotype, Relation, Package, Project, Property, OntoumlType, AggregationKind, stereotypeUtils, OntologicalNature} from '@libs/ontouml'; -import { resolve } from 'dns'; - describe('Class Functions', () => { @@ -171,17 +169,17 @@ describe('Class Functions', () => { expect(result).toContain(generateWorldFact('Child','Object')); }); - // it('should transform «abstract» class', () => { - // const model = new Package(); - // model.createAbstract('Goal'); + //TODO - what is an <> class? There is no such a type of class in ontouml? + // it('should transform «abstract» class', () => { + // const model = new Package(); + // model.createAbstract('Goal'); - // const result = generateAlloy(model); - - // expect(result).toContain(''); - // }); //make it a datatype + // const result = generateAlloy(model); - // model.createClass() + // expect(result).toContain('penis'); + // }); //make it a datatype + //TODO figure out if there should/needs to be a difference between the below 3 cases it('should transform «mode» class { allowed=[intrinsic-mode] }', () => { model.createIntrinsicMode('Skill'); const result = generateAlloy(model); @@ -233,51 +231,11 @@ describe('Class Functions', () => { // }); //what is expected with the mixins, semirigid? - - it('should handle if class has a space in name', () => { - model.createKind('Happy Person'); - - const result = generateAlloy(model); - expect(result).not.toContain(generateFact('rigid',['rigidity[Happy Person,Object,exists]'])); - expect(result).toContain(generateFact('rigid',['rigidity[HappyPerson,Object,exists]'])); - - expect(result).toContain(generateWorldAttribute('HappyPerson','Object')); - expect(result).toContain(generateWorldFact('HappyPerson','Object')); - }); - - it('should handle if class has forbidden characters in name', () => { //!, #, *, /, \ - model.createKind('Happy!Person'); - const result = generateAlloy(model); - - expect(result).not.toContain(generateFact('rigid',['rigidity[Happy!Person,Object,exists]'])); - //idea for how to handle this - remove char and add a number - // expect(result).toContain(expectedFacts); - }); - - it ('should handle if 2 classes have the same name', () => { - - model.createKind('Person'); - model.createKind('Person'); - - console.log(generateAlloy(model)); - }) - - //what should happen if a model, only containing a <> is transformed - it ('should handle if 2 classes have the same name', () => { - - model.createSubkind('Worker'); - - console.log(generateAlloy(model)); - }) - - //Happy Person & HappyPerson - //check two attributes same name - //check reserved keywords - //add a map to keep track of transformed classes - //class with no name - //class with name just spaces/special characters - - //test behaviour if subkind but no parentclass + //TODO - check what is desired transformation of category since it's supposed to be an abstract class? + // it('should transform «category» class', () => { + // model.createCategory('Animal'); + // const result = generateAlloy(model); + // }); }); diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index 88c5746d..54ee2ca0 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -6,6 +6,7 @@ import { Package, Project } from '@libs/ontouml'; describe('Generalization functions', () => { + describe ('transformGeneralization function',() => { let project: Project; @@ -28,44 +29,44 @@ describe('Generalization functions', () => { expect(result).toContain(generateWorldAttribute('Person','Object')); expect(result).toContain(generateFact('generalization',['Man in Person'])); - //expect(result).toContain(generateWorldAttribute('Man','Object')); - //what is expected to happen when transforming a subkind? -> refer to class_functions.test.ts - console.log(result) - }); //subkind of diff things - //create rigid fact & etc for subkind + expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) + expect(result).toContain(generateWorldAttribute('Man','Object')); //expected? -Yes + + }); - // it('Between classes without stereotypes', () => { - // const model = new Package(); - // const parent = model.createClass('Person'); - // const child = model.createClass('Man'); - // model.createGeneralization(parent, child); + it('Between classes without stereotypes', () => { + const model = new Package(); + const parent = model.createClass('Person'); + const child = model.createClass('Man'); + model.createGeneralization(parent, child); - // const owl = generateAlloy(model); - // expect(owl).toContain('<:Man> <:Person>'); - // }); + const result = generateAlloy(model); + console.log(result); + //what is expected?; should it be allowed to have such a model? - NO + }); - // it('Between relations', () => { - // const model = new Package(); - // const _class = model.createKind('Person'); - // const parent = model.createMaterialRelation(_class, _class, 'likes'); - // const child = model.createMaterialRelation(_class, _class, 'loves'); - // model.createGeneralization(parent, child); + it('Between relations', () => { + const model = new Package(); + const _class = model.createKind('Person'); + const parent = model.createMaterialRelation(_class, _class, 'likes'); + const child = model.createMaterialRelation(_class, _class, 'loves'); + model.createGeneralization(parent, child); - // const owl = generateAlloy(model); - // expect(owl).toContain('<:loves> <:likes>'); - // }); + const result = generateAlloy(model); + console.log(result); + }); - // it('Between relations without stereotypes', () => { - // const model = new Package(); - // const _class = model.createKind('Person'); - // const parent = model.createBinaryRelation(_class, _class, 'likes'); - // const child = model.createBinaryRelation(_class, _class, 'loves'); - // model.createGeneralization(parent, child); + it('Between relations without stereotypes', () => { + const model = new Package(); + const _class = model.createKind('Person'); + const parent = model.createBinaryRelation(_class, _class, 'likes'); + const child = model.createBinaryRelation(_class, _class, 'loves'); + model.createGeneralization(parent, child); - // const owl = generateAlloy(model); - // expect(owl).toContain('<:loves> <:likes>'); - // }); + const owl = generateAlloy(model); + console.log(owl); + }); diff --git a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts new file mode 100644 index 00000000..f521d6ac --- /dev/null +++ b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts @@ -0,0 +1,243 @@ +import { transformGeneralizationSet, Ontouml2Alloy } from '@libs/ontouml2alloy'; +import { Package, Project } from '@libs/ontouml'; +import { generateAlloy, generateFact, generateWorldAttribute } from './helpers'; +import { Generalization } from '@libs/ontouml'; + + +describe('Generalization Set Functions', () => { + + describe('Should add disjointness and completeness constraints from a GS involving only rigid children classes...', () => { + + let project: Project; + let model: Package; + + beforeEach(() => { + project = new Project(); + model = project.createModel(); + }); + + describe ('«kind» Person <|- «subkind» Man, «subkind» Woman', () => { + + let gen1: Generalization; + let gen2: Generalization; + + beforeEach(() => { + const parent = model.createKind('Person'); + const child1 = model.createSubkind('Man'); + const child2 = model.createSubkind('Woman'); + + gen1 = model.createGeneralization(parent, child1); + gen2 = model.createGeneralization(parent, child2); + }); + + it('disjoint - true, complete - true' , () => { + + model.createGeneralizationSet( + [gen1, gen2], + true, // isDisjoint + true, // isComplete + ); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) + expect(result).toContain(generateWorldAttribute('Person','Object')); + + expect(result).toContain(generateFact('generalization',['Man in Person'])); + expect(result).toContain(generateFact('generalization',['Woman in Person'])); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]','Person = Man+Woman'])); + + expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) + expect(result).toContain(generateFact('rigid',['rigidity[Woman,Object,exists]'])) + + expect(result).toContain(generateWorldAttribute('Man','Object')); + expect(result).toContain(generateWorldAttribute('Woman','Object')); + }); + + it('disjoint - false, complete - false', () => { + model.createGeneralizationSet( + [gen1, gen2], + false, // isDisjoint + false, // isComplete + ); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) + expect(result).toContain(generateWorldAttribute('Person','Object')); + + expect(result).toContain(generateFact('generalization',['Man in Person'])); + expect(result).toContain(generateFact('generalization',['Woman in Person'])); + expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Man,Woman]','Person = Man+Woman'])); + + expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) + expect(result).toContain(generateFact('rigid',['rigidity[Woman,Object,exists]'])) + + expect(result).toContain(generateWorldAttribute('Man','Object')); + expect(result).toContain(generateWorldAttribute('Woman','Object')); + }); + + it('disjoint - true, complete - false', () => { + + model.createGeneralizationSet( + [gen1, gen2], + true, // isDisjoint + false, // isComplete + ); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) + expect(result).toContain(generateWorldAttribute('Person','Object')); + + expect(result).toContain(generateFact('generalization',['Man in Person'])); + expect(result).toContain(generateFact('generalization',['Woman in Person'])); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]'])); + expect(result).not.toContain(generateFact('generalizationSet',['Person = Man+Woman'])); + + expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) + expect(result).toContain(generateFact('rigid',['rigidity[Woman,Object,exists]'])) + + expect(result).toContain(generateWorldAttribute('Man','Object')); + expect(result).toContain(generateWorldAttribute('Woman','Object')); + }); + it('«kind» Person <|- «subkind» Man, «subkind Woman, disjoint - false, complete - true', () => { + + model.createGeneralizationSet( + [gen1, gen2], + false, // isDisjoint + true, // isComplete + ); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) + expect(result).toContain(generateWorldAttribute('Person','Object')); + + expect(result).toContain(generateFact('generalization',['Man in Person'])); + expect(result).toContain(generateFact('generalization',['Woman in Person'])); + expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Man,Woman]'])); + expect(result).toContain(generateFact('generalizationSet',['Person = Man+Woman'])); + + expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) + expect(result).toContain(generateFact('rigid',['rigidity[Woman,Object,exists]'])) + + expect(result).toContain(generateWorldAttribute('Man','Object')); + expect(result).toContain(generateWorldAttribute('Woman','Object')); + }); + }); + + it('«category» Agent <|- «kind» Person, «kind» Organization', () => { + const parent = model.createCategory('Agent'); + const child1 = model.createKind('Person'); + const child2 = model.createKind('Organization'); + model.createKind('Animal'); + const gen1 = model.createGeneralization(parent, child1); + const gen2 = model.createGeneralization(parent, child2); + model.createGeneralizationSet([gen1, gen2], true, false); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Agent,Object,exists]'])) + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) + expect(result).toContain(generateFact('rigid',['rigidity[Organization,Object,exists]'])) + expect(result).toContain(generateFact('rigid',['rigidity[Animal,Object,exists]'])) + + expect(result).toContain(generateWorldAttribute('Agent','Object')); + expect(result).toContain(generateWorldAttribute('Person','Object')); + expect(result).toContain(generateWorldAttribute('Organization','Object')); + expect(result).toContain(generateWorldAttribute('Animal','Object')); + + expect(result).toContain(generateFact('generalization',['Person in Agent'])); + expect(result).toContain(generateFact('generalization',['Organization in Agent'])); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Person,Organization]'])); + expect(result).not.toContain(generateFact('generalizationSet',['Agent = Person+Organization'])); + + expect(result).toContain(generateFact('abstractClass',['all w: World | w.Agent = w.Person+w.Organization'])); + }); + + //TODO - interesting case, event classes are not transformed but a generalization & generalization_set is created + it('«event» Ceremony <|- «event» Wedding, «event» Graduation', () => { + const model = new Package(); + const parent = model.createEvent('Ceremony'); + const child1 = model.createEvent('Wedding'); + const child2 = model.createEvent('Graduation'); + const gen1 = model.createGeneralization(parent, child1); + const gen2 = model.createGeneralization(parent, child2); + model.createGeneralizationSet([gen1, gen2], true, false); + + const result = generateAlloy(model); + expect(result).not.toContain(generateFact('generalization',[' Wedding in Ceremony'])); + }); + + it('«datatype» Color <|- «datatype» ColorInRgb, «datatype» ColorInHsv', () => { + const model = new Package(); + const parent = model.createDatatype('Color'); + const child1 = model.createDatatype('ColorInRgb'); + const child2 = model.createDatatype('ColorInHsv'); + const gen1 = model.createGeneralization(parent, child1); + const gen2 = model.createGeneralization(parent, child2); + model.createGeneralizationSet([gen1, gen2], true, false); + + const result = generateAlloy(model); + + expect(result).toContain('sig Color in Datatype {}'); + expect(result).toContain('sig ColorInRgb in Datatype {}'); + expect(result).toContain('sig ColorInHsv in Datatype {}'); + + expect(result).toContain(generateFact('additionalDatatypeFacts', ['Datatype = Color+ColorInRgb+ColorInHsv'])); + + expect(result).toContain(generateFact('generalization', ['ColorInRgb in Color'])); + expect(result).toContain(generateFact('generalization', ['ColorInHsv in Color'])); + + expect(result).toContain(generateFact('generalizationSet', ['disjoint[ColorInRgb,ColorInHsv]'])); + }); + + + }); + + describe('Should NOT add disjointness constraint from a disjoint GS involving an antirigid or a semirigid class...', () => { + // it('«kind» Person <|- «phase» Child, «phase» Adult ', () => { + // const model = new Package(); + // const parent = model.createKind('Person'); + // const child1 = model.createPhase('Child'); + // const child2 = model.createPhase('Adult'); + // const gen1 = model.createGeneralization(parent, child1); + // const gen2 = model.createGeneralization(parent, child2); + // model.createPartition([gen1, gen2]); + + // const owl = generateGufo(model); + // expect(owl).not.toContain('[ ] (<:Child> <:Adult>) .'); + // expect(owl).not.toContain('[ ] (<:Adult> <:Child>) .'); + // }); + + // it('«category» Agent <|- «roleMixin» Customer, «roleMixin» Provider', () => { + // const model = new Package(); + // const parent = model.createCategory('Agent'); + // const child1 = model.createRoleMixin('Customer'); + // const child2 = model.createRoleMixin('Provider'); + // const gen1 = model.createGeneralization(parent, child1); + // const gen2 = model.createGeneralization(parent, child2); + // model.createPartition([gen1, gen2]); + + // const owl = generateGufo(model); + // expect(owl).not.toContain('[ ] (<:Customer> <:Provider>) .'); + // expect(owl).not.toContain('[ ] (<:Provider> <:Customer>) .'); + // }); + + // it('«mixin» Insurable <|- «mixin» ExpensiveObject, «category» RareObject', () => { + // const model = new Package(); + // const parent = model.createMixin('Insurable'); + // const child1 = model.createMixin('ExpensiveObject'); + // const child2 = model.createCategory('RareObject'); + // const gen1 = model.createGeneralization(parent, child1); + // const gen2 = model.createGeneralization(parent, child2); + // model.createPartition([gen1, gen2]); + + // const owl = generateGufo(model); + // expect(owl).not.toContain('[ ] (<:ExpensiveObject> <:RareObject>) .'); + // expect(owl).not.toContain('[ ] (<:RareObject> <:ExpensiveObject>) .'); + // }); + }); + +}); diff --git a/__tests__/libs/ontouml2alloy/helpers.ts b/__tests__/libs/ontouml2alloy/helpers.ts index b56fcb38..b69dc075 100644 --- a/__tests__/libs/ontouml2alloy/helpers.ts +++ b/__tests__/libs/ontouml2alloy/helpers.ts @@ -36,4 +36,4 @@ export function generateWorldFacts(factLines: string[]): string{ } return result; -}//subject to change +} diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index 7ff2b7aa..be44a54b 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -66,7 +66,7 @@ function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { className + ': set exists:>' + nature ); - if (isTopLevel(_class, transformer.model.getAllGeneralizations())) { + //if (isTopLevel(_class, transformer.model.getAllGeneralizations())) { //TODO see if something else breaks bcz of this if (_class.hasRigidStereotype()) { transformer.addFact( 'fact rigid {\n' + @@ -80,7 +80,7 @@ function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { '}' ); } - } +// } } function transformDatatypeClass(transformer: Ontouml2Alloy, _class: Class) { diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index 3a20875c..22a6d80d 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -1,6 +1,7 @@ import { OntoumlElement, Class, ClassStereotype, Relation, Generalization, Cardinality } from '@libs/ontouml'; import { Ontouml2Alloy } from '.'; +//TODO multi-language support export function normalizeName(transformer: Ontouml2Alloy, element: OntoumlElement) { if(element.id in transformer.normalizedNames){ @@ -26,18 +27,28 @@ export function normalizeName(transformer: Ontouml2Alloy, element: OntoumlElemen let normalizedName = element.getName(); - // Replace forbidden characters with an empty string + //Replace forbidden characters with an empty string forbiddenCharacters.forEach(char => { normalizedName = normalizedName.replace(new RegExp(`\\${char}`, 'g'), ''); }); - // Check if the normalized name is a reserved keyword - if (reservedKeywords.includes(normalizedName)) { - normalizedName += '_set'; + //Check if the name is an empty string, if so, replace it with 'Unnamed' + if(normalizedName == ''){ + normalizedName = 'Unnamed'; } - const id = element.id; + //Check if the normalized name is a reserved keyword or 'Unnamed', if so, add the type of ontouml element to the name + if (reservedKeywords.includes(normalizedName) || normalizedName == 'Unnamed' ) { + normalizedName += `_${(element.type).toLowerCase()}`; + } + //Check if the normalized name starts with a number, and change it if so + if (normalizedName.match(/^[0-9]/)) { + normalizedName = `${(element.type).toLowerCase()}_${normalizedName}`; + } + + //Check if the normalized name is already in use, and change it if so + const id = element.id; if(Object.values(transformer.normalizedNames).length != 0){ const existingNames = Object.values(transformer.normalizedNames); let index = 1; From 66cf2754077ffa452cb304286cf226ace75ecfff Mon Sep 17 00:00:00 2001 From: Asen Date: Thu, 27 Apr 2023 20:11:06 +0200 Subject: [PATCH 13/23] update generalization_set_functions --- .../generalization_set_functions.test.ts | 120 +++++++++++++----- 1 file changed, 85 insertions(+), 35 deletions(-) diff --git a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts index f521d6ac..bf896d47 100644 --- a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts @@ -6,17 +6,18 @@ import { Generalization } from '@libs/ontouml'; describe('Generalization Set Functions', () => { - describe('Should add disjointness and completeness constraints from a GS involving only rigid children classes...', () => { - - let project: Project; - let model: Package; + let project: Project; + let model: Package; - beforeEach(() => { - project = new Project(); - model = project.createModel(); - }); + beforeEach(() => { + project = new Project(); + model = project.createModel(); + }); + + describe('Should add disjointness constraint from a disjoint GS involving only rigid children classes', () => { - describe ('«kind» Person <|- «subkind» Man, «subkind» Woman', () => { + + describe ('«kind» Person <|- «subkind» Man, «subkind» Woman, all options', () => { let gen1: Generalization; let gen2: Generalization; @@ -101,7 +102,8 @@ describe('Generalization Set Functions', () => { expect(result).toContain(generateWorldAttribute('Man','Object')); expect(result).toContain(generateWorldAttribute('Woman','Object')); }); - it('«kind» Person <|- «subkind» Man, «subkind Woman, disjoint - false, complete - true', () => { + + it('disjoint - false, complete - true', () => { model.createGeneralizationSet( [gen1, gen2], @@ -196,37 +198,59 @@ describe('Generalization Set Functions', () => { }); + //TODO why should there not be a disjoint constraint? describe('Should NOT add disjointness constraint from a disjoint GS involving an antirigid or a semirigid class...', () => { - // it('«kind» Person <|- «phase» Child, «phase» Adult ', () => { - // const model = new Package(); - // const parent = model.createKind('Person'); - // const child1 = model.createPhase('Child'); - // const child2 = model.createPhase('Adult'); - // const gen1 = model.createGeneralization(parent, child1); - // const gen2 = model.createGeneralization(parent, child2); - // model.createPartition([gen1, gen2]); + it('«kind» Person <|- «phase» Child, «phase» Adult ', () => { + const parent = model.createKind('Person'); + const child1 = model.createPhase('Child'); + const child2 = model.createPhase('Adult'); + const gen1 = model.createGeneralization(parent, child1); + const gen2 = model.createGeneralization(parent, child2); + model.createPartition([gen1, gen2]); - // const owl = generateGufo(model); - // expect(owl).not.toContain('[ ] (<:Child> <:Adult>) .'); - // expect(owl).not.toContain('[ ] (<:Adult> <:Child>) .'); - // }); + const result = generateAlloy(model); + expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Child,Adult]','Person = Child+Adult'])); - // it('«category» Agent <|- «roleMixin» Customer, «roleMixin» Provider', () => { - // const model = new Package(); - // const parent = model.createCategory('Agent'); - // const child1 = model.createRoleMixin('Customer'); - // const child2 = model.createRoleMixin('Provider'); - // const gen1 = model.createGeneralization(parent, child1); - // const gen2 = model.createGeneralization(parent, child2); - // model.createPartition([gen1, gen2]); + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) + expect(result).toContain(generateFact('antirigid',['antirigidity[Child,Object,exists]'])) + expect(result).toContain(generateFact('antirigid',['antirigidity[Adult,Object,exists]'])) - // const owl = generateGufo(model); - // expect(owl).not.toContain('[ ] (<:Customer> <:Provider>) .'); - // expect(owl).not.toContain('[ ] (<:Provider> <:Customer>) .'); - // }); + expect(result).toContain(generateWorldAttribute('Person','Object')); + expect(result).toContain(generateWorldAttribute('Child','Object')); + expect(result).toContain(generateWorldAttribute('Adult','Object')); + + expect(result).toContain(generateFact('generalization',['Child in Person'])); + expect(result).toContain(generateFact('generalization',['Adult in Person'])); + }); + it('«category» Agent <|- «roleMixin» Customer, «roleMixin» Provider', () => { + const parent = model.createCategory('Agent'); + const child1 = model.createRoleMixin('Customer'); + const child2 = model.createRoleMixin('Provider'); + const gen1 = model.createGeneralization(parent, child1); + const gen2 = model.createGeneralization(parent, child2); + model.createPartition([gen1, gen2]); + + const result = generateAlloy(model); + expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Customer,Provider]','Agent = Customer+Provider'])); + + expect(result).toContain(generateFact('rigid',['rigidity[Agent,Object,exists]'])); + expect(result).toContain(generateFact('antirigid',['antirigidity[Customer,Object,exists]'])); + expect(result).toContain(generateFact('antirigid',['antirigidity[Provider,Object,exists]'])); + + expect(result).toContain(generateFact('abstractClass',['all w: World | w.Agent = w.Customer+w.Provider'])); + + expect(result).toContain(generateWorldAttribute('Agent','Object')); + expect(result).toContain(generateWorldAttribute('Customer','Object')); + expect(result).toContain(generateWorldAttribute('Provider','Object')); + + expect(result).toContain(generateFact('generalization',['Customer in Agent'])); + expect(result).toContain(generateFact('generalization',['Provider in Agent'])); + + }); + + //mixin, semirigid not handled // it('«mixin» Insurable <|- «mixin» ExpensiveObject, «category» RareObject', () => { - // const model = new Package(); // const parent = model.createMixin('Insurable'); // const child1 = model.createMixin('ExpensiveObject'); // const child2 = model.createCategory('RareObject'); @@ -240,4 +264,30 @@ describe('Generalization Set Functions', () => { // }); }); + describe('Should add an equivalence constraint from a complete GS...', () => { + it('«kind» Person <|- «phase» Child, «phase» Adult ', () => { + const parent = model.createKind('Person'); + const child1 = model.createPhase('Child'); + const child2 = model.createPhase('Adult'); + const gen1 = model.createGeneralization(parent, child1); + const gen2 = model.createGeneralization(parent, child2); + model.createPartition([gen1, gen2]); + + const result = generateAlloy(model); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Child,Adult]','Person = Child+Adult'])); + + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) + expect(result).toContain(generateFact('antirigid',['antirigidity[Child,Object,exists]'])) + expect(result).toContain(generateFact('antirigid',['antirigidity[Adult,Object,exists]'])) + + expect(result).toContain(generateWorldAttribute('Person','Object')); + expect(result).toContain(generateWorldAttribute('Child','Object')); + expect(result).toContain(generateWorldAttribute('Adult','Object')); + + expect(result).toContain(generateFact('generalization',['Child in Person'])); + expect(result).toContain(generateFact('generalization',['Adult in Person'])); + + }); + }); + }); From 065ac10fc3111c62c0fb6fab5c2d79fbd4d7942b Mon Sep 17 00:00:00 2001 From: Asen Date: Thu, 4 May 2023 01:03:54 +0200 Subject: [PATCH 14/23] generalization & gen_set & helpers update --- .../generalization_functions.test.ts | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index 54ee2ca0..86eab052 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -1,12 +1,11 @@ import { Generalization } from '@libs/ontouml'; import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; import { normalizeName } from '@libs/ontouml2alloy/util'; -import { generateAlloy, generateFact, generateWorldAttribute } from './helpers'; +import { generateAlloy, generateFact, generateWorldAttribute, generateFun, generateWorldFact } from './helpers'; import { Package, Project } from '@libs/ontouml'; describe('Generalization functions', () => { - describe ('transformGeneralization function',() => { let project: Project; @@ -19,7 +18,6 @@ describe('Generalization functions', () => { it('Between classes', () => { - const parent = model.createKind('Person'); const child = model.createSubkind('Man'); model.createGeneralization(parent, child); @@ -31,12 +29,11 @@ describe('Generalization functions', () => { expect(result).toContain(generateFact('generalization',['Man in Person'])); expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) - expect(result).toContain(generateWorldAttribute('Man','Object')); //expected? -Yes - + expect(result).toContain(generateWorldAttribute('Man','Object')); }); + //TODO discuss again if there should be such a test/handling such a situation it('Between classes without stereotypes', () => { - const model = new Package(); const parent = model.createClass('Person'); const child = model.createClass('Man'); model.createGeneralization(parent, child); @@ -46,26 +43,49 @@ describe('Generalization functions', () => { //what is expected?; should it be allowed to have such a model? - NO }); + it('Between datatypes', () => { + const parent = model.createDatatype('Color'); + const child1 = model.createDatatype('ColorInRgb'); + model.createGeneralization(parent, child1); + + let result = generateAlloy(model); + + expect(result).toContain(generateFact('generalization',['ColorInRgb in Color'])); + expect(result).toContain('sig Color in Datatype {}'); + expect(result).toContain('sig ColorInRgb in Datatype {}'); + expect(result).toContain(generateFact('additionalDatatypeFacts',['Datatype = Color+ColorInRgb'])) + + }); + it('Between relations', () => { - const model = new Package(); const _class = model.createKind('Person'); const parent = model.createMaterialRelation(_class, _class, 'likes'); const child = model.createMaterialRelation(_class, _class, 'loves'); model.createGeneralization(parent, child); const result = generateAlloy(model); - console.log(result); + expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])); + expect(result).toContain(generateWorldAttribute('Person','Object')); + expect(result).toContain(generateWorldFact('Person','Object')); + + expect(result).toContain(generateFact('generalization',['loves in likes'])); + + expect(result).toContain(generateFun('Person1', 'Person', `(w.likes).x`)); + expect(result).toContain(generateFun('Person2', 'Person', `x.(w.likes)`)); + expect(result).toContain(generateFun('Person3', 'Person', `(w.loves).x`)); + expect(result).toContain(generateFun('Person4', 'Person', `x.(w.loves)`)); + }); + //TODO check if this is desired behaviour; should there be no difference with previous casee? it('Between relations without stereotypes', () => { - const model = new Package(); const _class = model.createKind('Person'); const parent = model.createBinaryRelation(_class, _class, 'likes'); const child = model.createBinaryRelation(_class, _class, 'loves'); model.createGeneralization(parent, child); - const owl = generateAlloy(model); - console.log(owl); + const result = generateAlloy(model); + console.log(result); }); From c8d5a325f0c6235ee3a7cab75a7dfc29d8eff169 Mon Sep 17 00:00:00 2001 From: Asen Date: Tue, 9 May 2023 00:29:33 +0200 Subject: [PATCH 15/23] trim model implementation & testing --- src/libs/ontouml2alloy/util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index 22a6d80d..237605cc 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -56,7 +56,7 @@ export function normalizeName(transformer: Ontouml2Alloy, element: OntoumlElemen normalizedName = `${normalizedName}${index}`; index++; } - } + }//TODO made functional with filter for efficiency transformer.normalizedNames[id] = normalizedName; From 00c411b7f28f2215a924851a7529dd7333b32133 Mon Sep 17 00:00:00 2001 From: Asen Date: Tue, 9 May 2023 00:30:21 +0200 Subject: [PATCH 16/23] trim model implementation & testing --- .../alloy_name_normalization.test.ts | 5 +- .../generalization_functions.test.ts | 13 - .../generalization_set_functions.test.ts | 31 --- __tests__/libs/ontouml2alloy/helpers.ts | 10 + .../ontouml2alloy/remove_unsupported.test.ts | 245 ++++++++++++++++++ src/libs/ontouml/model/model_element.ts | 6 + src/libs/ontouml2alloy/class_functions.ts | 6 +- src/libs/ontouml2alloy/ontouml2alloy.ts | 103 +++++++- 8 files changed, 363 insertions(+), 56 deletions(-) create mode 100644 __tests__/libs/ontouml2alloy/remove_unsupported.test.ts diff --git a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts index faeefe9c..2b3a49f4 100644 --- a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts +++ b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts @@ -49,6 +49,7 @@ describe('Name normalization' , () => { describe("Inappropriate names are normalized properly", () => { + //TODO export reservedKeywords, forbiddenCharacters from util.ts const reservedKeywords = [ 'abstract', 'all', 'and', 'as', 'assert', 'but', 'check', 'disj', 'else', 'exactly', @@ -83,7 +84,6 @@ describe('Name normalization' , () => { }); //normalization of empty name: '' -> Unnamed_OntoumlElementType; - //TODO check if this is the desired behavior it('should normalize a class with no name', () => { element.addName(''); const normalized = normalizeName(transformer, element); @@ -97,7 +97,7 @@ describe('Name normalization' , () => { expect(normalized).toBe('Unnamed_relation'); }); - //TODO check if this is the desired behavior + //TODO change it it('should normalize two classes with no name/only forbidden characters', () => { model.createKind(''); model.createKind('!!!'); @@ -122,7 +122,6 @@ describe('Name normalization' , () => { expect(result).toContain(generateWorldFact('Person+Person1','Object')); }) - //TODO check if this is the desired behavior it('should normalize a class starting with a number', () => { element.addName('123Person'); const normalized = normalizeName(transformer, element); diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index 86eab052..a67cb0b2 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -16,7 +16,6 @@ describe('Generalization functions', () => { model = project.createModel(); }); - it('Between classes', () => { const parent = model.createKind('Person'); const child = model.createSubkind('Man'); @@ -77,18 +76,6 @@ describe('Generalization functions', () => { }); - //TODO check if this is desired behaviour; should there be no difference with previous casee? - it('Between relations without stereotypes', () => { - const _class = model.createKind('Person'); - const parent = model.createBinaryRelation(_class, _class, 'likes'); - const child = model.createBinaryRelation(_class, _class, 'loves'); - model.createGeneralization(parent, child); - - const result = generateAlloy(model); - console.log(result); - }); - - }) diff --git a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts index bf896d47..8a02b98a 100644 --- a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts @@ -128,39 +128,9 @@ describe('Generalization Set Functions', () => { expect(result).toContain(generateWorldAttribute('Woman','Object')); }); }); - - it('«category» Agent <|- «kind» Person, «kind» Organization', () => { - const parent = model.createCategory('Agent'); - const child1 = model.createKind('Person'); - const child2 = model.createKind('Organization'); - model.createKind('Animal'); - const gen1 = model.createGeneralization(parent, child1); - const gen2 = model.createGeneralization(parent, child2); - model.createGeneralizationSet([gen1, gen2], true, false); - - const result = generateAlloy(model); - - expect(result).toContain(generateFact('rigid',['rigidity[Agent,Object,exists]'])) - expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) - expect(result).toContain(generateFact('rigid',['rigidity[Organization,Object,exists]'])) - expect(result).toContain(generateFact('rigid',['rigidity[Animal,Object,exists]'])) - - expect(result).toContain(generateWorldAttribute('Agent','Object')); - expect(result).toContain(generateWorldAttribute('Person','Object')); - expect(result).toContain(generateWorldAttribute('Organization','Object')); - expect(result).toContain(generateWorldAttribute('Animal','Object')); - - expect(result).toContain(generateFact('generalization',['Person in Agent'])); - expect(result).toContain(generateFact('generalization',['Organization in Agent'])); - expect(result).toContain(generateFact('generalizationSet',['disjoint[Person,Organization]'])); - expect(result).not.toContain(generateFact('generalizationSet',['Agent = Person+Organization'])); - - expect(result).toContain(generateFact('abstractClass',['all w: World | w.Agent = w.Person+w.Organization'])); - }); //TODO - interesting case, event classes are not transformed but a generalization & generalization_set is created it('«event» Ceremony <|- «event» Wedding, «event» Graduation', () => { - const model = new Package(); const parent = model.createEvent('Ceremony'); const child1 = model.createEvent('Wedding'); const child2 = model.createEvent('Graduation'); @@ -173,7 +143,6 @@ describe('Generalization Set Functions', () => { }); it('«datatype» Color <|- «datatype» ColorInRgb, «datatype» ColorInHsv', () => { - const model = new Package(); const parent = model.createDatatype('Color'); const child1 = model.createDatatype('ColorInRgb'); const child2 = model.createDatatype('ColorInHsv'); diff --git a/__tests__/libs/ontouml2alloy/helpers.ts b/__tests__/libs/ontouml2alloy/helpers.ts index b69dc075..e76b4ace 100644 --- a/__tests__/libs/ontouml2alloy/helpers.ts +++ b/__tests__/libs/ontouml2alloy/helpers.ts @@ -21,6 +21,15 @@ export function generateFact(factName: string, factLines: string[]): string { return result; } + //TODO check if functions are always like this + export function generateFun(funName: string, entityType: string, expression: string): string { + let result = `fun ${funName} [x: World.${entityType}, w: World] : set World.${entityType} {\n`; + result += ` ${expression}\n`; + result += '}\n\n'; + return result; + } + + export function generateWorldAttribute(className: string, classNature: string): string{ return className + ': set exists:>' + classNature; } @@ -37,3 +46,4 @@ export function generateWorldFacts(factLines: string[]): string{ return result; } + diff --git a/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts b/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts new file mode 100644 index 00000000..e126cae9 --- /dev/null +++ b/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts @@ -0,0 +1,245 @@ +import { Class, OntoumlElement, Package, Project, Property, Relation } from '@libs/ontouml'; +import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from './helpers' +import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; + + +describe("removeUnsupportedElements function", () => { + + let project: Project; + let model: Package; + + beforeEach(() => { + project = new Project(); + model = project.createModel(); + }); + + it('removes <> & connected generalizations, attributes', () => { + + // Add unsupported elements to the model + const parent = model.createEvent('Ceremony'); + const child1 = model.createEvent('Wedding'); + const child2 = model.createEvent('Graduation'); + const address = model.createDatatype('Address'); + const place = parent.createAttribute(address, 'Enschede'); + const gen1 = model.createGeneralization(parent, child1); + const gen2 = model.createGeneralization(parent, child2); + const genSet = model.createGeneralizationSet([gen1, gen2], true, false); + + // Add supported elements to the model + const supportedClass = model.createKind('Person'); + const text = model.createDatatype('Text'); + const surname = supportedClass.createAttribute(text, 'surname'); + + // Call the removeUnsupportedElements function (indirectly) + const ontouml2alloy = new Ontouml2Alloy(model); + const { result, issues } = ontouml2alloy.run(); + + // Check if unsupported elements are removed + expect(model.getAllClasses()).not.toContain(parent); + expect(model.getAllClasses()).not.toContain(child1); + expect(model.getAllClasses()).not.toContain(child2); + expect(model.getAllRelations()).not.toContain(gen1); + expect(model.getAllRelations()).not.toContain(gen2); + expect(model.getAllGeneralizationSets()).not.toContain(genSet); + expect(model.getAllAttributes()).not.toContain(place); + + // Check if supported elements are retained + expect(model.getAllClasses()).toContain(supportedClass); + expect(model.getAllAttributes()).toContain(surname); + + // Check if issues are returned properly + expect(issues).toBeDefined(); + expect(issues.length).toBe(7); + expect(issues.map(issue => issue.id)).toContain(parent.id); + expect(issues.map(issue => issue.id)).toContain(child1.id); + expect(issues.map(issue => issue.id)).toContain(child2.id); + expect(issues.map(issue => issue.id)).toContain(place.id); + expect(issues.map(issue => issue.id)).toContain(gen1.id); + expect(issues.map(issue => issue.id)).toContain(gen2.id); + expect(issues.map(issue => issue.id)).toContain(genSet.id); + + //Printing of 'issues' for debugging purposes + // issues.forEach((issue, index) => { + // console.log(`Issue #${index + 1}:\nDescription: ${issue.description}\nData: ${JSON.stringify(issue.data.name, null, 2)}\n`); + // }); + }); + + it('removes relations connected to unsupported classes', () => { + const unsupportedSource = model.createEvent('Ceremony'); + const unsupportedTarget = model.createType('PartyType'); + const supportedSource = model.createKind('Person'); + const supportedTarget = model.createKind('Party'); + + const relation1 = model.createMaterialRelation(unsupportedSource, supportedTarget, 'R1'); + const relation2 = model.createMaterialRelation(supportedSource, unsupportedTarget, 'R2'); + const relation3 = model.createMaterialRelation(supportedSource, supportedTarget, 'R3'); + + const ontouml2alloy = new Ontouml2Alloy(model); + const { result, issues } = ontouml2alloy.run(); + + expect(model.getAllRelations()).not.toContain(relation1); + expect(model.getAllRelations()).not.toContain(relation2); + expect(model.getAllRelations()).toContain(relation3); + + expect(issues).toBeDefined(); + expect(issues.length).toBe(4); + expect(issues.map(issue => issue.id)).toContain(relation1.id); + expect(issues.map(issue => issue.id)).toContain(relation2.id); + }); + + it('removes generalizations consisting of unsupported elements', () => { + const unsupportedSpecific = model.createSituation('Meeting'); + const unsupportedGeneral = model.createSituation('Event'); + const supportedSpecific = model.createKind('Person'); + const supportedGeneral = model.createKind('Party'); + + const generalization1 = model.createGeneralization(unsupportedSpecific, supportedGeneral); + const generalization2 = model.createGeneralization(supportedSpecific, unsupportedGeneral); + const generalization3 = model.createGeneralization(supportedSpecific, supportedGeneral); + + const ontouml2alloy = new Ontouml2Alloy(model); + const { result, issues } = ontouml2alloy.run(); + + expect(model.getAllGeneralizations()).not.toContain(generalization1); + expect(model.getAllGeneralizations()).not.toContain(generalization2); + expect(model.getAllGeneralizations()).toContain(generalization3); + + expect(issues).toBeDefined(); + expect(issues.length).toBe(4); + expect(issues.map(issue => issue.id)).toContain(generalization1.id); + expect(issues.map(issue => issue.id)).toContain(generalization2.id); + }); + + it('removes generalization sets containing unsupported elements', () => { + const unsupportedSpecific = model.createSituation('Meeting'); + const unsupportedGeneral = model.createSituation('Event'); + const supportedSpecific = model.createKind('Person'); + const supportedGeneral = model.createKind('Party'); + + const gen1 = model.createGeneralization(unsupportedSpecific, supportedGeneral); + const gen2 = model.createGeneralization(supportedSpecific, unsupportedGeneral); + const gen3 = model.createGeneralization(supportedSpecific, supportedGeneral); + const gen4 = model.createGeneralization(supportedSpecific, supportedGeneral); + + const genSet1 = model.createGeneralizationSet([gen1, gen3], true, false); + const genSet2 = model.createGeneralizationSet([gen2, gen4], true, false); + const genSet3 = model.createGeneralizationSet([gen3, gen4], true, false); + + const ontouml2alloy = new Ontouml2Alloy(model); + const { result, issues } = ontouml2alloy.run(); + + expect(model.getAllGeneralizationSets()).not.toContain(genSet1); + expect(model.getAllGeneralizationSets()).not.toContain(genSet2); + expect(model.getAllGeneralizationSets()).toContain(genSet3); + + expect(issues).toBeDefined(); + expect(issues.length).toBe(6); + expect(issues.map(issue => issue.id)).toContain(genSet1.id); + expect(issues.map(issue => issue.id)).toContain(genSet2.id); + }); + + it('removes generalization sets with categorizers having unsupported stereotypes', () => { + const supportedSpecific = model.createKind('Person'); + const supportedGeneral = model.createKind('Party'); + const unsupportedCategorizer = model.createType('CategoryType'); + + const gen1 = model.createGeneralization(supportedSpecific, supportedGeneral); + const gen2 = model.createGeneralization(supportedSpecific, supportedGeneral); + + const genSet1 = model.createGeneralizationSet([gen1, gen2], true, false, unsupportedCategorizer); + const genSet2 = model.createGeneralizationSet([gen1, gen2], true, false); + + const ontouml2alloy = new Ontouml2Alloy(model); + const { result, issues } = ontouml2alloy.run(); + + expect(model.getAllGeneralizationSets()).not.toContain(genSet1); + expect(model.getAllGeneralizationSets()).toContain(genSet2); + + expect(issues).toBeDefined(); + expect(issues.length).toBe(2); + expect(issues.map(issue => issue.id)).toContain(genSet1.id); + }); + + it('removes <> classes and retains others', () => { + const typeClass = model.createType('PartyType'); + const kindClass = model.createKind('Person'); + + const ontouml2alloy = new Ontouml2Alloy(model); + const { result, issues } = ontouml2alloy.run(); + + expect(model.getAllClasses()).not.toContain(typeClass); + expect(model.getAllClasses()).toContain(kindClass); + + expect(issues).toBeDefined(); + expect(issues.length).toBe(1); + expect(issues.map(issue => issue.id)).toContain(typeClass.id); + }); + + it('removes <> classes and retains others', () => { + const situationClass = model.createSituation('Meeting'); + const kindClass = model.createKind('Person'); + + const ontouml2alloy = new Ontouml2Alloy(model); + const { result, issues } = ontouml2alloy.run(); + + expect(model.getAllClasses()).not.toContain(situationClass); + expect(model.getAllClasses()).toContain(kindClass); + + expect(issues).toBeDefined(); + expect(issues.length).toBe(1); + expect(issues.map(issue => issue.id)).toContain(situationClass.id); + }); + + it('removes attributes of unsupported classes', () => { + const unsupportedClass = model.createEvent('Ceremony'); + const supportedClass = model.createKind('Person'); + + const datatype = model.createDatatype('Text'); + const unsupportedAttribute = unsupportedClass.createAttribute(datatype, 'name'); + const supportedAttribute = supportedClass.createAttribute(datatype, 'surname'); + + const ontouml2alloy = new Ontouml2Alloy(model); + const { result, issues } = ontouml2alloy.run(); + + expect(model.getAllAttributes()).not.toContain(unsupportedAttribute); + expect(model.getAllAttributes()).toContain(supportedAttribute); + + expect(issues).toBeDefined(); + expect(issues.length).toBe(2); + expect(issues.map(issue => issue.id)).toContain(unsupportedAttribute.id); + }); + + it('removes relation-ends connected to unsupported elements', () => { + const unsupportedSource = model.createEvent('Ceremony'); + const unsupportedTarget = model.createType('PartyType'); + const supportedSource = model.createKind('Person'); + const supportedTarget = model.createKind('Party'); + + const relation1 = model.createMaterialRelation(unsupportedSource, supportedTarget, 'R1'); + const relation2 = model.createMaterialRelation(supportedSource, unsupportedTarget, 'R2'); + const relation3 = model.createMaterialRelation(supportedSource, supportedTarget, 'R3'); + + const sourceEnd1 = relation1.getSourceEnd(); + const targetEnd1 = relation1.getTargetEnd(); + const sourceEnd2 = relation2.getSourceEnd(); + const targetEnd2 = relation2.getTargetEnd(); + const sourceEnd3 = relation3.getSourceEnd(); + const targetEnd3 = relation3.getTargetEnd(); + + const ontouml2alloy = new Ontouml2Alloy(model); + const { result, issues } = ontouml2alloy.run(); + + expect(model.getAllProperties()).not.toContain(sourceEnd1); + expect(model.getAllProperties()).not.toContain(targetEnd1); + expect(model.getAllProperties()).not.toContain(sourceEnd2); + expect(model.getAllProperties()).not.toContain(targetEnd2); + expect(model.getAllProperties()).toContain(sourceEnd3); + expect(model.getAllProperties()).toContain(targetEnd3); + + //TODO discuss whether it's necessary to generate an issue for relation-ends + }); + + + + +}); diff --git a/src/libs/ontouml/model/model_element.ts b/src/libs/ontouml/model/model_element.ts index 963ffc45..00cf746c 100644 --- a/src/libs/ontouml/model/model_element.ts +++ b/src/libs/ontouml/model/model_element.ts @@ -65,4 +65,10 @@ export abstract class ModelElement extends OntoumlElement { return null; } } + + removeSelf(): void { + if (this.container && this.container instanceof Package) { + (this.container as Package).removeContent(this); + } + } } diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index be44a54b..f3ef4f15 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -4,9 +4,9 @@ import { Ontouml2Alloy } from '.'; import { normalizeName, isTopLevel, getValidAlias } from './util'; export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //This line defines a function named transformClass that takes two parameters: transformer (of type Ontouml2Alloy) and _class (of type Class). - if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION])) { //This line checks if the given class _class has any of the stereotypes EVENT or SITUATION. If it does, the function immediately returns without doing anything. + if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION,ClassStereotype.TYPE])) { //This line checks if the given class _class has any of the stereotypes EVENT or SITUATION. If it does, the function immediately returns without doing anything. return; - } + }//TODO trim if (_class.hasDatatypeStereotype()) { transformDatatypeClass(transformer, _class); @@ -66,7 +66,6 @@ function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { className + ': set exists:>' + nature ); - //if (isTopLevel(_class, transformer.model.getAllGeneralizations())) { //TODO see if something else breaks bcz of this if (_class.hasRigidStereotype()) { transformer.addFact( 'fact rigid {\n' + @@ -80,7 +79,6 @@ function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { '}' ); } -// } } function transformDatatypeClass(transformer: Ontouml2Alloy, _class: Class) { diff --git a/src/libs/ontouml2alloy/ontouml2alloy.ts b/src/libs/ontouml2alloy/ontouml2alloy.ts index 6400c829..a3665ed8 100644 --- a/src/libs/ontouml2alloy/ontouml2alloy.ts +++ b/src/libs/ontouml2alloy/ontouml2alloy.ts @@ -1,4 +1,4 @@ -import { OntoumlElement, Project, Package } from '@libs/ontouml'; +import { OntoumlElement, Project, Package, Decoratable, Stereotype } from '@libs/ontouml'; import { transformProperty, transformClass, @@ -9,7 +9,8 @@ import { transformGeneralizationSet, transformRelation } from './'; -import { Service, ServiceIssue } from '..'; +import { Service, ServiceIssue, ServiceIssueSeverity } from '..'; +import { type } from 'os'; export class Ontouml2Alloy implements Service { model: Package; @@ -23,7 +24,8 @@ export class Ontouml2Alloy implements Service { funs: string[]; visible: string[]; aliases: [OntoumlElement, string][]; //[element, alias]; used in transformRelatorConstraint - normalizedNames: { [key: string]: string }; //added, OntoumlElement ID, normalizedName + normalizedNames: { [key: string]: string }; //added; OntoumlElement ID, normalizedName + removedElements: ServiceIssue[]; //added, to store removed elements /* Lines 13-33 define a class Ontouml2Alloy that implements Service. The class has a constructor @@ -49,6 +51,7 @@ export class Ontouml2Alloy implements Service { this.visible = ['exists']; this.aliases = []; this.normalizedNames = {} //added + this.removedElements = [] //added } getAlloyCode(): string[] { @@ -100,6 +103,8 @@ export class Ontouml2Alloy implements Service { } transform() { + this.removeUnsupportedElements(); + this.transformClasses(); this.transformGeneralizations(); this.transformGeneralizationSets(); @@ -124,6 +129,93 @@ export class Ontouml2Alloy implements Service { this.writeOntologicalPropertiesModule(); } + hasUnsupportedStereotype(decoratable: Decoratable) { + return decoratable.hasAnyStereotype(['event', 'situation' ,'type']); + } + + removeUnsupportedElements() { + const classes = this.model.getAllClasses(); + const relations = this.model.getAllRelations(); + const generalizations = this.model.getAllGeneralizations(); + const generalizationSets = this.model.getAllGeneralizationSets(); + + // Remove classes with unsupported stereotypes + for (const _class of classes) { + if (this.hasUnsupportedStereotype(_class)) { + + // Remove properties of the class + for (const property of _class.properties) { + property.removeSelf(); + this.generateRemovalIssue(property, `Attribute '${property.getName()}' of the class '${_class.getName()}' was removed due to the class having an unsupported stereotype.`); + } + + _class.removeSelf(); + this.generateRemovalIssue(_class, `Class '${_class.getName()}' was removed due to having an unsupported stereotype.`); + } + } + + // Remove relations connected to unsupported classes + for (const relation of relations) { + const source = relation.getSource(); + const target = relation.getTarget(); + + if (source && this.hasUnsupportedStereotype(source)) { + source.removeSelf(); + relation.removeSelf(); + this.generateRemovalIssue(relation, `Relation '${relation.getName()}' was removed due to being connected to an unsupported class '${source.getName()}'.`); + } else if (target && this.hasUnsupportedStereotype(target)) { + relation.removeSelf(); + this.generateRemovalIssue(relation, `Relation '${relation.getName()}' was removed due to being connected to an unsupported class '${target.getName()}'.`); + } + + } + + // Remove generalizations consisting of unsupported elements + for (const generalization of generalizations) { + const source = generalization.specific; + const target = generalization.general; + + if ((source && this.hasUnsupportedStereotype(source)) || (target && this.hasUnsupportedStereotype(target))) { + generalization.removeSelf(); + const genName = generalization.getName() || `${source.getName()} -> ${target.getName()}`; + this.generateRemovalIssue(generalization, `Generalization '${genName}' was removed due to having an unsupported element.`); + } + } + + // Remove generalization sets containing unsupported elements + for (const generalizationSet of generalizationSets) { + let categorizerUnsupported = generalizationSet.categorizer && this.hasUnsupportedStereotype(generalizationSet.categorizer); + if (generalizationSet.generalizations.some(gen => this.hasUnsupportedStereotype(gen.specific) || this.hasUnsupportedStereotype(gen.general)) || categorizerUnsupported) { + generalizationSet.removeSelf(); + const genSetNames = generalizationSet.generalizations.map(gen => gen.getName() || `${gen.specific.getName()} -> ${gen.general.getName()}`).join(', '); + const genSetName = generalizationSet.getName() || `{${genSetNames}}`; + + let removalDescription; + if (categorizerUnsupported) { + removalDescription = `Generalization Set '${genSetName}' was removed due to having an unsupported categorizer '${generalizationSet.categorizer.getName()}'.`; + } else { + removalDescription = `Generalization Set '${genSetName}' was removed due to containing an unsupported element.`; + } + + this.generateRemovalIssue(generalizationSet, removalDescription); + } + } + + } + + generateRemovalIssue(element: OntoumlElement, description: string) { + const issue: ServiceIssue = { + id: element.id, + code: 'UNSUPPORTED_ELEMENT_REMOVED', + severity: ServiceIssueSeverity.WARNING, + title: 'Unsupported Element Removed', + description: description, + data: element + }; + this.removedElements.push(issue); + } + + /* Lines 81-105 define a method transform() that calls the different transformation functions, removes duplicate facts and functions, and writes the generated Alloy code to the alloyCode property. @@ -318,7 +410,8 @@ export class Ontouml2Alloy implements Service { */ transformGeneralizations() { - const generalizations = this.model.getAllGeneralizations(); + let generalizations = this.model.getAllGeneralizations(); + for (const gen of generalizations) { transformGeneralization(this, gen); @@ -360,7 +453,7 @@ export class Ontouml2Alloy implements Service { worldStructureModule: this.getAlloyCode()[1], ontologicalPropertiesModule: this.getAlloyCode()[2] }, - issues: undefined + issues: this.removedElements.length > 0 ? this.removedElements : undefined }; }//method to check prerequisites for trasnforming a class /* From 0f81e3d161dbc9e16b41d57bcac20ef6110f3cdd Mon Sep 17 00:00:00 2001 From: Asen Date: Tue, 9 May 2023 16:20:17 +0200 Subject: [PATCH 17/23] remove unnecessary checks --- .../alloy_name_normalization.test.ts | 35 ++---- .../generalization_functions.test.ts | 29 ++--- .../generalization_set_functions.test.ts | 105 ++---------------- src/libs/ontouml2alloy/class_functions.ts | 2 +- src/libs/ontouml2alloy/util.ts | 34 +++--- 5 files changed, 46 insertions(+), 159 deletions(-) diff --git a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts index 2b3a49f4..29a360ed 100644 --- a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts +++ b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts @@ -3,6 +3,7 @@ import { Class, OntoumlElement, Package, Project, Relation } from '@libs/ontouml import { normalizeName } from '@libs/ontouml2alloy/util'; import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from './helpers'; import { OntoumlType } from '@libs/ontouml'; +import { reservedKeywords, forbiddenCharacters } from '@libs/ontouml2alloy/util'; describe('Name normalization' , () => { @@ -48,17 +49,7 @@ describe('Name normalization' , () => { }) describe("Inappropriate names are normalized properly", () => { - - //TODO export reservedKeywords, forbiddenCharacters from util.ts - const reservedKeywords = [ - 'abstract', 'all', 'and', 'as', 'assert', - 'but', 'check', 'disj', 'else', 'exactly', - 'extends', 'fact', 'for', 'fun', 'iden', - 'iff', 'implies', 'in', 'Int', 'let', - 'lone', 'module', 'no', 'none', 'not', - 'one', 'open', 'or', 'pred', 'run', - 'set', 'sig', 'some', 'sum', 'univ' - ]; + //normalization of reserved keywords: abstract -> abstract_OntoumlElementType reservedKeywords.forEach(keyword => { it(`should normalize the reserved keyword "${keyword}"`, () => { @@ -68,13 +59,6 @@ describe('Name normalization' , () => { }); }); - const forbiddenCharacters = [ - ' ', '!', '@', '#', '$', '%', '&', - '*', '(', ')', '-', '+', '=', '{', - '}', '[', ']', '|', '\\', ';', ':', - ',', '.', '<', '>', '/', '?' - ]; - forbiddenCharacters.forEach(char => { it(`should remove the forbidden character "${char}" from the name`, () => { element.addName(`Happy${char}Person`); @@ -97,17 +81,14 @@ describe('Name normalization' , () => { expect(normalized).toBe('Unnamed_relation'); }); - //TODO change it it('should normalize two classes with no name/only forbidden characters', () => { - model.createKind(''); - model.createKind('!!!'); - const result = generateAlloy(model); + const element1 = model.createKind(''); + const element2 = model.createKind('!!!'); + const normalized1 = normalizeName(transformer, element1); + const normalized2 = normalizeName(transformer, element2); - expect(result).toContain(generateFact('rigid',['rigidity[Unnamed_class,Object,exists]'])); - expect(result).toContain(generateFact('rigid',['rigidity[Unnamed_class1,Object,exists]'])); - expect(result).toContain(generateWorldAttribute('Unnamed_class','Object')); - expect(result).toContain(generateWorldAttribute('Unnamed_class1','Object')); - expect(result).toContain(generateWorldFact('Unnamed_class+Unnamed_class1','Object')); + expect(normalized1).toBe('Unnamed_class'); + expect(normalized2).toBe('Unnamed_class1'); }); it('should normalize two classes with same name', () => { diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index a67cb0b2..6239973a 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -22,13 +22,20 @@ describe('Generalization functions', () => { model.createGeneralization(parent, child); const result = generateAlloy(model); - expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) - expect(result).toContain(generateWorldAttribute('Person','Object')); - expect(result).toContain(generateFact('generalization',['Man in Person'])); + }); - expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) - expect(result).toContain(generateWorldAttribute('Man','Object')); + it('Between multiple classes', () => { + const grandparent = model.createKind('LivingBeing'); + const parent = model.createSubkind('Person'); + const child = model.createSubkind('Man'); + model.createGeneralization(grandparent, parent); + model.createGeneralization(parent, child); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('generalization', ['Person in LivingBeing'])); + expect(result).toContain(generateFact('generalization', ['Man in Person'])); }); //TODO discuss again if there should be such a test/handling such a situation @@ -50,8 +57,6 @@ describe('Generalization functions', () => { let result = generateAlloy(model); expect(result).toContain(generateFact('generalization',['ColorInRgb in Color'])); - expect(result).toContain('sig Color in Datatype {}'); - expect(result).toContain('sig ColorInRgb in Datatype {}'); expect(result).toContain(generateFact('additionalDatatypeFacts',['Datatype = Color+ColorInRgb'])) }); @@ -63,19 +68,9 @@ describe('Generalization functions', () => { model.createGeneralization(parent, child); const result = generateAlloy(model); - expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])); - expect(result).toContain(generateWorldAttribute('Person','Object')); - expect(result).toContain(generateWorldFact('Person','Object')); expect(result).toContain(generateFact('generalization',['loves in likes'])); - - expect(result).toContain(generateFun('Person1', 'Person', `(w.likes).x`)); - expect(result).toContain(generateFun('Person2', 'Person', `x.(w.likes)`)); - expect(result).toContain(generateFun('Person3', 'Person', `(w.loves).x`)); - expect(result).toContain(generateFun('Person4', 'Person', `x.(w.loves)`)); - }); - }) diff --git a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts index 8a02b98a..0d3a4875 100644 --- a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts @@ -31,6 +31,7 @@ describe('Generalization Set Functions', () => { gen2 = model.createGeneralization(parent, child2); }); + //TODO consider that a subKind doesn't get an exists statement when part of a generalization, otherwise does it('disjoint - true, complete - true' , () => { model.createGeneralizationSet( @@ -41,18 +42,7 @@ describe('Generalization Set Functions', () => { const result = generateAlloy(model); - expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) - expect(result).toContain(generateWorldAttribute('Person','Object')); - - expect(result).toContain(generateFact('generalization',['Man in Person'])); - expect(result).toContain(generateFact('generalization',['Woman in Person'])); - expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]','Person = Man+Woman'])); - - expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) - expect(result).toContain(generateFact('rigid',['rigidity[Woman,Object,exists]'])) - - expect(result).toContain(generateWorldAttribute('Man','Object')); - expect(result).toContain(generateWorldAttribute('Woman','Object')); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]','Person = Man+Woman'])); }); it('disjoint - false, complete - false', () => { @@ -63,19 +53,8 @@ describe('Generalization Set Functions', () => { ); const result = generateAlloy(model); - - expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) - expect(result).toContain(generateWorldAttribute('Person','Object')); - - expect(result).toContain(generateFact('generalization',['Man in Person'])); - expect(result).toContain(generateFact('generalization',['Woman in Person'])); + expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Man,Woman]','Person = Man+Woman'])); - - expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) - expect(result).toContain(generateFact('rigid',['rigidity[Woman,Object,exists]'])) - - expect(result).toContain(generateWorldAttribute('Man','Object')); - expect(result).toContain(generateWorldAttribute('Woman','Object')); }); it('disjoint - true, complete - false', () => { @@ -87,20 +66,9 @@ describe('Generalization Set Functions', () => { ); const result = generateAlloy(model); - - expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) - expect(result).toContain(generateWorldAttribute('Person','Object')); - - expect(result).toContain(generateFact('generalization',['Man in Person'])); - expect(result).toContain(generateFact('generalization',['Woman in Person'])); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]'])); expect(result).not.toContain(generateFact('generalizationSet',['Person = Man+Woman'])); - - expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) - expect(result).toContain(generateFact('rigid',['rigidity[Woman,Object,exists]'])) - - expect(result).toContain(generateWorldAttribute('Man','Object')); - expect(result).toContain(generateWorldAttribute('Woman','Object')); }); it('disjoint - false, complete - true', () => { @@ -112,24 +80,12 @@ describe('Generalization Set Functions', () => { ); const result = generateAlloy(model); - - expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) - expect(result).toContain(generateWorldAttribute('Person','Object')); - - expect(result).toContain(generateFact('generalization',['Man in Person'])); - expect(result).toContain(generateFact('generalization',['Woman in Person'])); + expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Man,Woman]'])); expect(result).toContain(generateFact('generalizationSet',['Person = Man+Woman'])); - - expect(result).toContain(generateFact('rigid',['rigidity[Man,Object,exists]'])) - expect(result).toContain(generateFact('rigid',['rigidity[Woman,Object,exists]'])) - - expect(result).toContain(generateWorldAttribute('Man','Object')); - expect(result).toContain(generateWorldAttribute('Woman','Object')); - }); }); - //TODO - interesting case, event classes are not transformed but a generalization & generalization_set is created + //TODO - model is trimmed, should this test still exist? it('«event» Ceremony <|- «event» Wedding, «event» Graduation', () => { const parent = model.createEvent('Ceremony'); const child1 = model.createEvent('Wedding'); @@ -151,15 +107,6 @@ describe('Generalization Set Functions', () => { model.createGeneralizationSet([gen1, gen2], true, false); const result = generateAlloy(model); - - expect(result).toContain('sig Color in Datatype {}'); - expect(result).toContain('sig ColorInRgb in Datatype {}'); - expect(result).toContain('sig ColorInHsv in Datatype {}'); - - expect(result).toContain(generateFact('additionalDatatypeFacts', ['Datatype = Color+ColorInRgb+ColorInHsv'])); - - expect(result).toContain(generateFact('generalization', ['ColorInRgb in Color'])); - expect(result).toContain(generateFact('generalization', ['ColorInHsv in Color'])); expect(result).toContain(generateFact('generalizationSet', ['disjoint[ColorInRgb,ColorInHsv]'])); }); @@ -179,17 +126,6 @@ describe('Generalization Set Functions', () => { const result = generateAlloy(model); expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Child,Adult]','Person = Child+Adult'])); - - expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) - expect(result).toContain(generateFact('antirigid',['antirigidity[Child,Object,exists]'])) - expect(result).toContain(generateFact('antirigid',['antirigidity[Adult,Object,exists]'])) - - expect(result).toContain(generateWorldAttribute('Person','Object')); - expect(result).toContain(generateWorldAttribute('Child','Object')); - expect(result).toContain(generateWorldAttribute('Adult','Object')); - - expect(result).toContain(generateFact('generalization',['Child in Person'])); - expect(result).toContain(generateFact('generalization',['Adult in Person'])); }); it('«category» Agent <|- «roleMixin» Customer, «roleMixin» Provider', () => { @@ -202,23 +138,9 @@ describe('Generalization Set Functions', () => { const result = generateAlloy(model); expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Customer,Provider]','Agent = Customer+Provider'])); - - expect(result).toContain(generateFact('rigid',['rigidity[Agent,Object,exists]'])); - expect(result).toContain(generateFact('antirigid',['antirigidity[Customer,Object,exists]'])); - expect(result).toContain(generateFact('antirigid',['antirigidity[Provider,Object,exists]'])); - - expect(result).toContain(generateFact('abstractClass',['all w: World | w.Agent = w.Customer+w.Provider'])); - - expect(result).toContain(generateWorldAttribute('Agent','Object')); - expect(result).toContain(generateWorldAttribute('Customer','Object')); - expect(result).toContain(generateWorldAttribute('Provider','Object')); - - expect(result).toContain(generateFact('generalization',['Customer in Agent'])); - expect(result).toContain(generateFact('generalization',['Provider in Agent'])); - }); - //mixin, semirigid not handled + //TODO mixin, semirigid not handled // it('«mixin» Insurable <|- «mixin» ExpensiveObject, «category» RareObject', () => { // const parent = model.createMixin('Insurable'); // const child1 = model.createMixin('ExpensiveObject'); @@ -244,19 +166,8 @@ describe('Generalization Set Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('generalizationSet',['disjoint[Child,Adult]','Person = Child+Adult'])); - - expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])) - expect(result).toContain(generateFact('antirigid',['antirigidity[Child,Object,exists]'])) - expect(result).toContain(generateFact('antirigid',['antirigidity[Adult,Object,exists]'])) - - expect(result).toContain(generateWorldAttribute('Person','Object')); - expect(result).toContain(generateWorldAttribute('Child','Object')); - expect(result).toContain(generateWorldAttribute('Adult','Object')); - - expect(result).toContain(generateFact('generalization',['Child in Person'])); - expect(result).toContain(generateFact('generalization',['Adult in Person'])); - }); }); }); +}); diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index f3ef4f15..b63600fd 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -6,7 +6,7 @@ import { normalizeName, isTopLevel, getValidAlias } from './util'; export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //This line defines a function named transformClass that takes two parameters: transformer (of type Ontouml2Alloy) and _class (of type Class). if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION,ClassStereotype.TYPE])) { //This line checks if the given class _class has any of the stereotypes EVENT or SITUATION. If it does, the function immediately returns without doing anything. return; - }//TODO trim + } if (_class.hasDatatypeStereotype()) { transformDatatypeClass(transformer, _class); diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index 237605cc..064e1ed4 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -1,6 +1,23 @@ import { OntoumlElement, Class, ClassStereotype, Relation, Generalization, Cardinality } from '@libs/ontouml'; import { Ontouml2Alloy } from '.'; +export const reservedKeywords = [ + 'abstract', 'all', 'and', 'as', 'assert', + 'but', 'check', 'disj', 'else', 'exactly', + 'extends', 'fact', 'for', 'fun', 'iden', + 'iff', 'implies', 'in', 'Int', 'let', + 'lone', 'module', 'no', 'none', 'not', + 'one', 'open', 'or', 'pred', 'run', + 'set', 'sig', 'some', 'sum', 'univ' +]; + +export const forbiddenCharacters = [ + ' ', '!', '@', '#', '$', '%', '&', + '*', '(', ')', '-', '+', '=', '{', + '}', '[', ']', '|', '\\', ';', ':', + ',', '.', '<', '>', '/', '?' +]; + //TODO multi-language support export function normalizeName(transformer: Ontouml2Alloy, element: OntoumlElement) { @@ -8,23 +25,6 @@ export function normalizeName(transformer: Ontouml2Alloy, element: OntoumlElemen return transformer.normalizedNames[element.id]; } - const reservedKeywords = [ - 'abstract', 'all', 'and', 'as', 'assert', - 'but', 'check', 'disj', 'else', 'exactly', - 'extends', 'fact', 'for', 'fun', 'iden', - 'iff', 'implies', 'in', 'Int', 'let', - 'lone', 'module', 'no', 'none', 'not', - 'one', 'open', 'or', 'pred', 'run', - 'set', 'sig', 'some', 'sum', 'univ' - ]; - - const forbiddenCharacters = [ - ' ', '!', '@', '#', '$', '%', '&', - '*', '(', ')', '-', '+', '=', '{', - '}', '[', ']', '|', '\\', ';', ':', - ',', '.', '<', '>', '/', '?' - ]; - let normalizedName = element.getName(); //Replace forbidden characters with an empty string From ff309e4d7a6ff3564b08edff6afed760405cf8ed Mon Sep 17 00:00:00 2001 From: Asen Date: Wed, 17 May 2023 16:46:54 +0200 Subject: [PATCH 18/23] a lot of minor updates --- .../ontouml2alloy/class_functions.test.ts | 69 ++--- .../generalization_functions.test.ts | 25 +- .../generalization_set_functions.test.ts | 52 +--- __tests__/libs/ontouml2alloy/helpers.ts | 4 +- .../ontouml2alloy/remove_unsupported.test.ts | 238 +++++++++--------- src/libs/ontouml/model/model_element.ts | 2 +- src/libs/ontouml2alloy/class_functions.ts | 7 +- src/libs/ontouml2alloy/ontouml2alloy.ts | 39 +-- 8 files changed, 190 insertions(+), 246 deletions(-) diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index f671e517..65887c8f 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -29,40 +29,7 @@ describe('Class Functions', () => { expect(generateAlloy(model)).not.toContain('PaymentMethod'); }) - - // afterEach(() => { - // // code to run after each test case - // }); - - // beforeAll(() => { - // // code to run before all test cases - // }); - - // afterAll(() => { - // // code to run after all test cases - // }); - - // it('should do X when Y is provided', () => { - // // Arrange - // //const input = ...; // the input value for the function or class method - // //const expectedOutput = ...; // the expected output of the function or class method - - // // Act - // //const actualOutput = ...; // call the function or class method with the input value - - // // Assert - // //expect(actualOutput).toEqual(expectedOutput); - // }); - - // it('should throw an error when Z is provided', () => { - // // Arrange - // //const input = ...; // the input value for the function or class method that should throw an error - - // // Assert - // //expect(() => ...).toThrow(); // call the function or class method with the input value and expect it to throw an error - // }); - - //add + it('should transform <> class with attributes (complex datatype)', () => { const _number = model.createDatatype('Number'); const complexDatatype = model.createDatatype('Date'); @@ -91,7 +58,6 @@ describe('Class Functions', () => { expect(result).toContain('enum Status {\n Active, Inactive}') }); - it('should transform <> class', () => { model.createKind('Person'); const result = generateAlloy(model); @@ -169,17 +135,20 @@ describe('Class Functions', () => { expect(result).toContain(generateWorldFact('Child','Object')); }); - //TODO - what is an <> class? There is no such a type of class in ontouml? - // it('should transform «abstract» class', () => { - // const model = new Package(); - // model.createAbstract('Goal'); + //TODO - should transform abstract class to a datatype + it('should transform «abstract» class', () => { + let temp = model.createAbstract('Goal'); + const _number = model.createDatatype('Date'); + temp.createAttribute(_number, 'until'); - // const result = generateAlloy(model); + const result = generateAlloy(model); - // expect(result).toContain('penis'); - // }); //make it a datatype + const factLines = ['Datatype = Goal+Date','disjoint[Goal,Date]']; + expect(result).toContain('sig Goal in Datatype {\n until: Date\n}'); + expect(result).toContain(generateFact('additionalDatatypeFacts',factLines)); + }); - //TODO figure out if there should/needs to be a difference between the below 3 cases + //TODO igure out if there should/needs to be a difference between the below 3 cases it('should transform «mode» class { allowed=[intrinsic-mode] }', () => { model.createIntrinsicMode('Skill'); const result = generateAlloy(model); @@ -231,11 +200,15 @@ describe('Class Functions', () => { // }); //what is expected with the mixins, semirigid? - //TODO - check what is desired transformation of category since it's supposed to be an abstract class? - // it('should transform «category» class', () => { - // model.createCategory('Animal'); - // const result = generateAlloy(model); - // }); + //TODO - category is non-sortal so should there be something different for it? + it('should transform «category» class', () => { + model.createCategory('Animal'); + const result = generateAlloy(model); + + expect(result).toContain(generateFact('rigid',['rigidity[Animal,Object,exists]'])); + expect(result).toContain(generateWorldAttribute('Animal','Object')); + expect(result).toContain(generateWorldFact('Animal','Object')); + }); }); diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index 6239973a..77e8f6e9 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -24,30 +24,6 @@ describe('Generalization functions', () => { expect(result).toContain(generateFact('generalization',['Man in Person'])); }); - - it('Between multiple classes', () => { - const grandparent = model.createKind('LivingBeing'); - const parent = model.createSubkind('Person'); - const child = model.createSubkind('Man'); - model.createGeneralization(grandparent, parent); - model.createGeneralization(parent, child); - - const result = generateAlloy(model); - - expect(result).toContain(generateFact('generalization', ['Person in LivingBeing'])); - expect(result).toContain(generateFact('generalization', ['Man in Person'])); - }); - - //TODO discuss again if there should be such a test/handling such a situation - it('Between classes without stereotypes', () => { - const parent = model.createClass('Person'); - const child = model.createClass('Man'); - model.createGeneralization(parent, child); - - const result = generateAlloy(model); - console.log(result); - //what is expected?; should it be allowed to have such a model? - NO - }); it('Between datatypes', () => { const parent = model.createDatatype('Color'); @@ -70,6 +46,7 @@ describe('Generalization functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('generalization',['loves in likes'])); + console.log(result); }); }) diff --git a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts index 0d3a4875..5073c6f6 100644 --- a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts @@ -14,9 +14,6 @@ describe('Generalization Set Functions', () => { model = project.createModel(); }); - describe('Should add disjointness constraint from a disjoint GS involving only rigid children classes', () => { - - describe ('«kind» Person <|- «subkind» Man, «subkind» Woman, all options', () => { let gen1: Generalization; @@ -31,7 +28,7 @@ describe('Generalization Set Functions', () => { gen2 = model.createGeneralization(parent, child2); }); - //TODO consider that a subKind doesn't get an exists statement when part of a generalization, otherwise does + //TODO consider that a subKind doesn't get an exists statement when part of a generalization, otherwise does; test in subkind it('disjoint - true, complete - true' , () => { model.createGeneralizationSet( @@ -42,7 +39,8 @@ describe('Generalization Set Functions', () => { const result = generateAlloy(model); - expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]','Person = Man+Woman'])); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]','Person = Man+Woman'])); + console.log(result); }); it('disjoint - false, complete - false', () => { @@ -85,37 +83,22 @@ describe('Generalization Set Functions', () => { expect(result).toContain(generateFact('generalizationSet',['Person = Man+Woman'])); }); - //TODO - model is trimmed, should this test still exist? - it('«event» Ceremony <|- «event» Wedding, «event» Graduation', () => { - const parent = model.createEvent('Ceremony'); - const child1 = model.createEvent('Wedding'); - const child2 = model.createEvent('Graduation'); - const gen1 = model.createGeneralization(parent, child1); - const gen2 = model.createGeneralization(parent, child2); - model.createGeneralizationSet([gen1, gen2], true, false); - - const result = generateAlloy(model); - expect(result).not.toContain(generateFact('generalization',[' Wedding in Ceremony'])); - }); + }); it('«datatype» Color <|- «datatype» ColorInRgb, «datatype» ColorInHsv', () => { const parent = model.createDatatype('Color'); const child1 = model.createDatatype('ColorInRgb'); const child2 = model.createDatatype('ColorInHsv'); - const gen1 = model.createGeneralization(parent, child1); - const gen2 = model.createGeneralization(parent, child2); + const gen1 = model.createGeneralization(parent, child1, 'gen1'); + const gen2 = model.createGeneralization(parent, child2, 'gen2'); model.createGeneralizationSet([gen1, gen2], true, false); const result = generateAlloy(model); expect(result).toContain(generateFact('generalizationSet', ['disjoint[ColorInRgb,ColorInHsv]'])); }); + - - }); - - //TODO why should there not be a disjoint constraint? - describe('Should NOT add disjointness constraint from a disjoint GS involving an antirigid or a semirigid class...', () => { it('«kind» Person <|- «phase» Child, «phase» Adult ', () => { const parent = model.createKind('Person'); const child1 = model.createPhase('Child'); @@ -125,7 +108,7 @@ describe('Generalization Set Functions', () => { model.createPartition([gen1, gen2]); const result = generateAlloy(model); - expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Child,Adult]','Person = Child+Adult'])); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Child,Adult]','Person = Child+Adult'])); }); it('«category» Agent <|- «roleMixin» Customer, «roleMixin» Provider', () => { @@ -137,7 +120,7 @@ describe('Generalization Set Functions', () => { model.createPartition([gen1, gen2]); const result = generateAlloy(model); - expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Customer,Provider]','Agent = Customer+Provider'])); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Customer,Provider]','Agent = Customer+Provider'])); }); //TODO mixin, semirigid not handled @@ -154,20 +137,3 @@ describe('Generalization Set Functions', () => { // expect(owl).not.toContain('[ ] (<:RareObject> <:ExpensiveObject>) .'); // }); }); - - describe('Should add an equivalence constraint from a complete GS...', () => { - it('«kind» Person <|- «phase» Child, «phase» Adult ', () => { - const parent = model.createKind('Person'); - const child1 = model.createPhase('Child'); - const child2 = model.createPhase('Adult'); - const gen1 = model.createGeneralization(parent, child1); - const gen2 = model.createGeneralization(parent, child2); - model.createPartition([gen1, gen2]); - - const result = generateAlloy(model); - expect(result).toContain(generateFact('generalizationSet',['disjoint[Child,Adult]','Person = Child+Adult'])); - }); - }); - -}); -}); diff --git a/__tests__/libs/ontouml2alloy/helpers.ts b/__tests__/libs/ontouml2alloy/helpers.ts index e76b4ace..040a95e9 100644 --- a/__tests__/libs/ontouml2alloy/helpers.ts +++ b/__tests__/libs/ontouml2alloy/helpers.ts @@ -22,8 +22,8 @@ export function generateFact(factName: string, factLines: string[]): string { } //TODO check if functions are always like this - export function generateFun(funName: string, entityType: string, expression: string): string { - let result = `fun ${funName} [x: World.${entityType}, w: World] : set World.${entityType} {\n`; + export function generateFun(funName: string, fromEnitity: string, toEntity, expression: string): string { + let result = `fun ${funName} [x: World.${fromEnitity}, w: World] : set World.${toEntity} {\n`; result += ` ${expression}\n`; result += '}\n\n'; return result; diff --git a/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts b/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts index e126cae9..4f06bd78 100644 --- a/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts +++ b/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts @@ -1,5 +1,5 @@ import { Class, OntoumlElement, Package, Project, Property, Relation } from '@libs/ontouml'; -import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from './helpers' +import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact, generateFun } from './helpers' import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; @@ -12,57 +12,60 @@ describe("removeUnsupportedElements function", () => { project = new Project(); model = project.createModel(); }); + + //TODO deep copy of model - it('removes <> & connected generalizations, attributes', () => { - - // Add unsupported elements to the model - const parent = model.createEvent('Ceremony'); - const child1 = model.createEvent('Wedding'); - const child2 = model.createEvent('Graduation'); - const address = model.createDatatype('Address'); - const place = parent.createAttribute(address, 'Enschede'); - const gen1 = model.createGeneralization(parent, child1); - const gen2 = model.createGeneralization(parent, child2); - const genSet = model.createGeneralizationSet([gen1, gen2], true, false); - - // Add supported elements to the model - const supportedClass = model.createKind('Person'); - const text = model.createDatatype('Text'); - const surname = supportedClass.createAttribute(text, 'surname'); - - // Call the removeUnsupportedElements function (indirectly) - const ontouml2alloy = new Ontouml2Alloy(model); - const { result, issues } = ontouml2alloy.run(); - - // Check if unsupported elements are removed - expect(model.getAllClasses()).not.toContain(parent); - expect(model.getAllClasses()).not.toContain(child1); - expect(model.getAllClasses()).not.toContain(child2); - expect(model.getAllRelations()).not.toContain(gen1); - expect(model.getAllRelations()).not.toContain(gen2); - expect(model.getAllGeneralizationSets()).not.toContain(genSet); - expect(model.getAllAttributes()).not.toContain(place); + it('removes <> & connected generalizations, attributes', () => { + + // Add unsupported elements to the model + const parent = model.createEvent('Ceremony'); + const child1 = model.createEvent('Wedding'); + const child2 = model.createEvent('Graduation'); + const address = model.createDatatype('Address'); + const place = parent.createAttribute(address, 'Enschede'); + const gen1 = model.createGeneralization(parent, child1, 'gen1'); + const gen2 = model.createGeneralization(parent, child2, 'gen2'); + const genSet = model.createGeneralizationSet([gen1, gen2], true, false); + + // Add supported elements to the model + const supportedClass = model.createKind('Person'); + const text = model.createDatatype('Text'); + const surname = supportedClass.createAttribute(text, 'surname'); + + // Call the removeUnsupportedElements function (indirectly) + const ontouml2alloy = new Ontouml2Alloy(model); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; + + // Check if unsupported elements are removed + expect(result).not.toContain('Ceremony'); + expect(result).not.toContain('Wedding'); + expect(result).not.toContain('Graduation'); + expect(result).not.toContain('Enschede'); + expect(result).not.toContain(generateFact('generalization',['Wedding in Ceremony'])); + expect(result).not.toContain(generateFact('generalization',['Graduation in Ceremony'])); + expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Wedding,Graduation]'])); - // Check if supported elements are retained - expect(model.getAllClasses()).toContain(supportedClass); - expect(model.getAllAttributes()).toContain(surname); - - // Check if issues are returned properly - expect(issues).toBeDefined(); - expect(issues.length).toBe(7); - expect(issues.map(issue => issue.id)).toContain(parent.id); - expect(issues.map(issue => issue.id)).toContain(child1.id); - expect(issues.map(issue => issue.id)).toContain(child2.id); - expect(issues.map(issue => issue.id)).toContain(place.id); - expect(issues.map(issue => issue.id)).toContain(gen1.id); - expect(issues.map(issue => issue.id)).toContain(gen2.id); - expect(issues.map(issue => issue.id)).toContain(genSet.id); - - //Printing of 'issues' for debugging purposes - // issues.forEach((issue, index) => { - // console.log(`Issue #${index + 1}:\nDescription: ${issue.description}\nData: ${JSON.stringify(issue.data.name, null, 2)}\n`); - // }); - }); + // Check if supported elements are retained + expect(result).toContain('Person'); + expect(result).toContain('surname'); + + // Check if issues are returned properly + expect(issues).toBeDefined(); + expect(issues.length).toBe(7); + expect(issues.map(issue => issue.id)).toContain(parent.id); + expect(issues.map(issue => issue.id)).toContain(child1.id); + expect(issues.map(issue => issue.id)).toContain(child2.id); + expect(issues.map(issue => issue.id)).toContain(place.id); + expect(issues.map(issue => issue.id)).toContain(gen1.id); + expect(issues.map(issue => issue.id)).toContain(gen2.id); + expect(issues.map(issue => issue.id)).toContain(genSet.id); + + //Printing of 'issues' for debugging purposes + // issues.forEach((issue, index) => { + // console.log(`Issue #${index + 1}:\nDescription: ${issue.description}\nData: ${JSON.stringify(issue.data.name, null, 2)}\n`); + // }); + }); it('removes relations connected to unsupported classes', () => { const unsupportedSource = model.createEvent('Ceremony'); @@ -75,11 +78,13 @@ describe("removeUnsupportedElements function", () => { const relation3 = model.createMaterialRelation(supportedSource, supportedTarget, 'R3'); const ontouml2alloy = new Ontouml2Alloy(model); - const { result, issues } = ontouml2alloy.run(); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; - expect(model.getAllRelations()).not.toContain(relation1); - expect(model.getAllRelations()).not.toContain(relation2); - expect(model.getAllRelations()).toContain(relation3); + expect(result).not.toContain('R1'); + expect(result).not.toContain('R2'); + expect(result).toContain(generateFun('Person1', 'Party', 'Person', '(w.R3).x')); + expect(result).toContain(generateFun('Party1', 'Person', 'Party', 'x.(w.R3)')); expect(issues).toBeDefined(); expect(issues.length).toBe(4); @@ -92,18 +97,19 @@ describe("removeUnsupportedElements function", () => { const unsupportedGeneral = model.createSituation('Event'); const supportedSpecific = model.createKind('Person'); const supportedGeneral = model.createKind('Party'); - - const generalization1 = model.createGeneralization(unsupportedSpecific, supportedGeneral); - const generalization2 = model.createGeneralization(supportedSpecific, unsupportedGeneral); - const generalization3 = model.createGeneralization(supportedSpecific, supportedGeneral); - + + const generalization1 = model.createGeneralization(supportedGeneral, unsupportedSpecific); + const generalization2 = model.createGeneralization(unsupportedGeneral, supportedSpecific); + const generalization3 = model.createGeneralization(supportedGeneral, supportedSpecific); + const ontouml2alloy = new Ontouml2Alloy(model); - const { result, issues } = ontouml2alloy.run(); - - expect(model.getAllGeneralizations()).not.toContain(generalization1); - expect(model.getAllGeneralizations()).not.toContain(generalization2); - expect(model.getAllGeneralizations()).toContain(generalization3); - + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; + + expect(result).not.toContain(generateFact('generalization', ['Meeting in Party'])); + expect(result).not.toContain(generateFact('generalization', ['Person in Event'])); + expect(result).toContain(generateFact('generalization', ['Person in Party'])); + expect(issues).toBeDefined(); expect(issues.length).toBe(4); expect(issues.map(issue => issue.id)).toContain(generalization1.id); @@ -111,49 +117,58 @@ describe("removeUnsupportedElements function", () => { }); it('removes generalization sets containing unsupported elements', () => { - const unsupportedSpecific = model.createSituation('Meeting'); - const unsupportedGeneral = model.createSituation('Event'); - const supportedSpecific = model.createKind('Person'); - const supportedGeneral = model.createKind('Party'); - const gen1 = model.createGeneralization(unsupportedSpecific, supportedGeneral); - const gen2 = model.createGeneralization(supportedSpecific, unsupportedGeneral); - const gen3 = model.createGeneralization(supportedSpecific, supportedGeneral); - const gen4 = model.createGeneralization(supportedSpecific, supportedGeneral); - - const genSet1 = model.createGeneralizationSet([gen1, gen3], true, false); - const genSet2 = model.createGeneralizationSet([gen2, gen4], true, false); - const genSet3 = model.createGeneralizationSet([gen3, gen4], true, false); + const unsupportedParent = model.createEvent('Ceremony'); + const unsupportedChild1 = model.createEvent('Wedding'); + const unsupportedchild2 = model.createEvent('Graduation'); + const supportedParent = model.createKind('Person'); + const supportedChild1 = model.createSubkind('Man'); + const supportedChild2 = model.createSubkind('Woman'); + + //mix of supported and unsupported generalizations + const unsupportedGen1 = model.createGeneralization(unsupportedParent, unsupportedChild1); + const unsupportedGen2 = model.createGeneralization(supportedParent, unsupportedchild2); + const unsupportedGen3 = model.createGeneralization(unsupportedParent, supportedChild1); + const supportedGen4 = model.createGeneralization(supportedParent, supportedChild1); + const supportedGen5 = model.createGeneralization(supportedParent, supportedChild2); + + //test for mix of generalization sets with unsupported and supported generalizations + const unsupportedgenSet1 = model.createGeneralizationSet([unsupportedGen1, unsupportedGen2], true, false); + const unsupportedgenSet2 = model.createGeneralizationSet([unsupportedGen2, supportedGen4], true, false); + const unsupportedgenSet3 = model.createGeneralizationSet([unsupportedGen3, supportedGen4], true, false); + const supportedGenSet4 = model.createGeneralizationSet([supportedGen4, supportedGen5], true, false); const ontouml2alloy = new Ontouml2Alloy(model); - const { result, issues } = ontouml2alloy.run(); - - expect(model.getAllGeneralizationSets()).not.toContain(genSet1); - expect(model.getAllGeneralizationSets()).not.toContain(genSet2); - expect(model.getAllGeneralizationSets()).toContain(genSet3); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; + + expect(result).not.toContain(generateFact('generalization',[' Wedding in Ceremony'])); + expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]'])); expect(issues).toBeDefined(); - expect(issues.length).toBe(6); - expect(issues.map(issue => issue.id)).toContain(genSet1.id); - expect(issues.map(issue => issue.id)).toContain(genSet2.id); + expect(issues.length).toBe(9); + expect(issues.map(issue => issue.id)).toContain(unsupportedgenSet1.id); + expect(issues.map(issue => issue.id)).toContain(unsupportedgenSet2.id); + expect(issues.map(issue => issue.id)).toContain(unsupportedgenSet3.id); + }); it('removes generalization sets with categorizers having unsupported stereotypes', () => { - const supportedSpecific = model.createKind('Person'); - const supportedGeneral = model.createKind('Party'); + const supportedParent = model.createKind('Person'); + const supportedChild1 = model.createSubkind('Man'); + const supportedChild2 = model.createSubkind('Woman'); const unsupportedCategorizer = model.createType('CategoryType'); - const gen1 = model.createGeneralization(supportedSpecific, supportedGeneral); - const gen2 = model.createGeneralization(supportedSpecific, supportedGeneral); + const gen1 = model.createGeneralization(supportedParent,supportedChild1); + const gen2 = model.createGeneralization(supportedParent, supportedChild2); const genSet1 = model.createGeneralizationSet([gen1, gen2], true, false, unsupportedCategorizer); - const genSet2 = model.createGeneralizationSet([gen1, gen2], true, false); const ontouml2alloy = new Ontouml2Alloy(model); - const { result, issues } = ontouml2alloy.run(); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; - expect(model.getAllGeneralizationSets()).not.toContain(genSet1); - expect(model.getAllGeneralizationSets()).toContain(genSet2); + expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Man,Woman]'])); expect(issues).toBeDefined(); expect(issues.length).toBe(2); @@ -165,10 +180,11 @@ describe("removeUnsupportedElements function", () => { const kindClass = model.createKind('Person'); const ontouml2alloy = new Ontouml2Alloy(model); - const { result, issues } = ontouml2alloy.run(); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; - expect(model.getAllClasses()).not.toContain(typeClass); - expect(model.getAllClasses()).toContain(kindClass); + expect(result).not.toContain('PartyType'); + expect(result).toContain('Person'); expect(issues).toBeDefined(); expect(issues.length).toBe(1); @@ -180,35 +196,39 @@ describe("removeUnsupportedElements function", () => { const kindClass = model.createKind('Person'); const ontouml2alloy = new Ontouml2Alloy(model); - const { result, issues } = ontouml2alloy.run(); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; - expect(model.getAllClasses()).not.toContain(situationClass); - expect(model.getAllClasses()).toContain(kindClass); + expect(result).not.toContain('Meeting'); + expect(result).toContain('Person'); expect(issues).toBeDefined(); expect(issues.length).toBe(1); expect(issues.map(issue => issue.id)).toContain(situationClass.id); }); + it('removes attributes of unsupported classes', () => { const unsupportedClass = model.createEvent('Ceremony'); const supportedClass = model.createKind('Person'); - + const datatype = model.createDatatype('Text'); const unsupportedAttribute = unsupportedClass.createAttribute(datatype, 'name'); const supportedAttribute = supportedClass.createAttribute(datatype, 'surname'); - + const ontouml2alloy = new Ontouml2Alloy(model); - const { result, issues } = ontouml2alloy.run(); - - expect(model.getAllAttributes()).not.toContain(unsupportedAttribute); - expect(model.getAllAttributes()).toContain(supportedAttribute); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; + + expect(result).not.toContainEqual('name'); + expect(result).toContain('surname'); expect(issues).toBeDefined(); expect(issues.length).toBe(2); expect(issues.map(issue => issue.id)).toContain(unsupportedAttribute.id); }); + //TODO how to check relation ends? it('removes relation-ends connected to unsupported elements', () => { const unsupportedSource = model.createEvent('Ceremony'); const unsupportedTarget = model.createType('PartyType'); @@ -217,14 +237,11 @@ describe("removeUnsupportedElements function", () => { const relation1 = model.createMaterialRelation(unsupportedSource, supportedTarget, 'R1'); const relation2 = model.createMaterialRelation(supportedSource, unsupportedTarget, 'R2'); - const relation3 = model.createMaterialRelation(supportedSource, supportedTarget, 'R3'); const sourceEnd1 = relation1.getSourceEnd(); const targetEnd1 = relation1.getTargetEnd(); const sourceEnd2 = relation2.getSourceEnd(); const targetEnd2 = relation2.getTargetEnd(); - const sourceEnd3 = relation3.getSourceEnd(); - const targetEnd3 = relation3.getTargetEnd(); const ontouml2alloy = new Ontouml2Alloy(model); const { result, issues } = ontouml2alloy.run(); @@ -233,13 +250,8 @@ describe("removeUnsupportedElements function", () => { expect(model.getAllProperties()).not.toContain(targetEnd1); expect(model.getAllProperties()).not.toContain(sourceEnd2); expect(model.getAllProperties()).not.toContain(targetEnd2); - expect(model.getAllProperties()).toContain(sourceEnd3); - expect(model.getAllProperties()).toContain(targetEnd3); - - //TODO discuss whether it's necessary to generate an issue for relation-ends }); - }); diff --git a/src/libs/ontouml/model/model_element.ts b/src/libs/ontouml/model/model_element.ts index 00cf746c..0796bb82 100644 --- a/src/libs/ontouml/model/model_element.ts +++ b/src/libs/ontouml/model/model_element.ts @@ -66,7 +66,7 @@ export abstract class ModelElement extends OntoumlElement { } } - removeSelf(): void { + removeSelfFromContainer(): void { if (this.container && this.container instanceof Package) { (this.container as Package).removeContent(this); } diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index b63600fd..89dc2106 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -4,10 +4,15 @@ import { Ontouml2Alloy } from '.'; import { normalizeName, isTopLevel, getValidAlias } from './util'; export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //This line defines a function named transformClass that takes two parameters: transformer (of type Ontouml2Alloy) and _class (of type Class). - if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION,ClassStereotype.TYPE])) { //This line checks if the given class _class has any of the stereotypes EVENT or SITUATION. If it does, the function immediately returns without doing anything. + if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION,ClassStereotype.TYPE])) { //This line checks if the given class _class has any of the stereotypes EVENT, SITUATION or TYPE. If it does, the function immediately returns without doing anything. return; } + //TODO change Abstract to Datatype + if(_class.hasAbstractStereotype()){ + _class.stereotype = ClassStereotype.DATATYPE; + } + if (_class.hasDatatypeStereotype()) { transformDatatypeClass(transformer, _class); return; diff --git a/src/libs/ontouml2alloy/ontouml2alloy.ts b/src/libs/ontouml2alloy/ontouml2alloy.ts index a3665ed8..7d50548c 100644 --- a/src/libs/ontouml2alloy/ontouml2alloy.ts +++ b/src/libs/ontouml2alloy/ontouml2alloy.ts @@ -25,7 +25,7 @@ export class Ontouml2Alloy implements Service { visible: string[]; aliases: [OntoumlElement, string][]; //[element, alias]; used in transformRelatorConstraint normalizedNames: { [key: string]: string }; //added; OntoumlElement ID, normalizedName - removedElements: ServiceIssue[]; //added, to store removed elements + issues: ServiceIssue[]; //added, to store removed elements /* Lines 13-33 define a class Ontouml2Alloy that implements Service. The class has a constructor @@ -51,7 +51,7 @@ export class Ontouml2Alloy implements Service { this.visible = ['exists']; this.aliases = []; this.normalizedNames = {} //added - this.removedElements = [] //added + this.issues = [] //added } getAlloyCode(): string[] { @@ -130,7 +130,7 @@ export class Ontouml2Alloy implements Service { } hasUnsupportedStereotype(decoratable: Decoratable) { - return decoratable.hasAnyStereotype(['event', 'situation' ,'type']); + return decoratable.hasAnyStereotype(['event', 'situation' ,'type'] || decoratable == null ); } removeUnsupportedElements() { @@ -138,20 +138,31 @@ export class Ontouml2Alloy implements Service { const relations = this.model.getAllRelations(); const generalizations = this.model.getAllGeneralizations(); const generalizationSets = this.model.getAllGeneralizationSets(); - + // Remove classes with unsupported stereotypes for (const _class of classes) { + if (this.hasUnsupportedStereotype(_class)) { // Remove properties of the class for (const property of _class.properties) { - property.removeSelf(); - this.generateRemovalIssue(property, `Attribute '${property.getName()}' of the class '${_class.getName()}' was removed due to the class having an unsupported stereotype.`); + property.removeSelfFromContainer(); + const attributeName = property.getName() || 'with no name'; + this.generateRemovalIssue(property, `Attribute '${attributeName}' of the class '${_class.getName()}' was removed due to the class having an unsupported stereotype.`); } - _class.removeSelf(); + _class.removeSelfFromContainer(); this.generateRemovalIssue(_class, `Class '${_class.getName()}' was removed due to having an unsupported stereotype.`); } + + } + + // Remove attributes with undefined propertyType + for (const property of this.model.getAllAttributes()) { + if(!property.propertyType){ + property.removeSelfFromContainer(); + this.generateRemovalIssue(property, `Attribute '${property.getName()}' was removed due to undefined propertyType.`); + } } // Remove relations connected to unsupported classes @@ -160,11 +171,11 @@ export class Ontouml2Alloy implements Service { const target = relation.getTarget(); if (source && this.hasUnsupportedStereotype(source)) { - source.removeSelf(); - relation.removeSelf(); + source.removeSelfFromContainer(); + relation.removeSelfFromContainer(); this.generateRemovalIssue(relation, `Relation '${relation.getName()}' was removed due to being connected to an unsupported class '${source.getName()}'.`); } else if (target && this.hasUnsupportedStereotype(target)) { - relation.removeSelf(); + relation.removeSelfFromContainer(); this.generateRemovalIssue(relation, `Relation '${relation.getName()}' was removed due to being connected to an unsupported class '${target.getName()}'.`); } @@ -176,7 +187,7 @@ export class Ontouml2Alloy implements Service { const target = generalization.general; if ((source && this.hasUnsupportedStereotype(source)) || (target && this.hasUnsupportedStereotype(target))) { - generalization.removeSelf(); + generalization.removeSelfFromContainer(); const genName = generalization.getName() || `${source.getName()} -> ${target.getName()}`; this.generateRemovalIssue(generalization, `Generalization '${genName}' was removed due to having an unsupported element.`); } @@ -186,7 +197,7 @@ export class Ontouml2Alloy implements Service { for (const generalizationSet of generalizationSets) { let categorizerUnsupported = generalizationSet.categorizer && this.hasUnsupportedStereotype(generalizationSet.categorizer); if (generalizationSet.generalizations.some(gen => this.hasUnsupportedStereotype(gen.specific) || this.hasUnsupportedStereotype(gen.general)) || categorizerUnsupported) { - generalizationSet.removeSelf(); + generalizationSet.removeSelfFromContainer(); const genSetNames = generalizationSet.generalizations.map(gen => gen.getName() || `${gen.specific.getName()} -> ${gen.general.getName()}`).join(', '); const genSetName = generalizationSet.getName() || `{${genSetNames}}`; @@ -212,7 +223,7 @@ export class Ontouml2Alloy implements Service { description: description, data: element }; - this.removedElements.push(issue); + this.issues.push(issue); } @@ -453,7 +464,7 @@ export class Ontouml2Alloy implements Service { worldStructureModule: this.getAlloyCode()[1], ontologicalPropertiesModule: this.getAlloyCode()[2] }, - issues: this.removedElements.length > 0 ? this.removedElements : undefined + issues: this.issues.length > 0 ? this.issues : undefined }; }//method to check prerequisites for trasnforming a class /* From 85dafe6a7e4f85268e44d0661a0974ea5c4c4302 Mon Sep 17 00:00:00 2001 From: Asen Date: Thu, 1 Jun 2023 02:55:18 +0200 Subject: [PATCH 19/23] relation test, fix minor things --- .../alloy_name_normalization.test.ts | 6 +- .../ontouml2alloy/class_functions.test.ts | 34 ++- .../generalization_functions.test.ts | 2 +- .../generalization_set_functions.test.ts | 17 +- __tests__/libs/ontouml2alloy/helpers.ts | 10 +- .../ontouml2alloy/relation_functions.test.ts | 99 +++++++ .../ontouml2alloy/remove_unsupported.test.ts | 267 +++++++++--------- src/libs/ontouml2alloy/class_functions.ts | 1 - src/libs/ontouml2alloy/ontouml2alloy.ts | 5 +- 9 files changed, 267 insertions(+), 174 deletions(-) create mode 100644 __tests__/libs/ontouml2alloy/relation_functions.test.ts diff --git a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts index 29a360ed..9c4b9a50 100644 --- a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts +++ b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts @@ -1,7 +1,7 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; import { Class, OntoumlElement, Package, Project, Relation } from '@libs/ontouml'; import { normalizeName } from '@libs/ontouml2alloy/util'; -import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from './helpers'; +import { generateAlloy, generateFact, generateWorldFieldForClass, generateWorldFact } from './helpers'; import { OntoumlType } from '@libs/ontouml'; import { reservedKeywords, forbiddenCharacters } from '@libs/ontouml2alloy/util'; @@ -98,8 +98,8 @@ describe('Name normalization' , () => { expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])); expect(result).toContain(generateFact('rigid',['rigidity[Person1,Object,exists]'])); - expect(result).toContain(generateWorldAttribute('Person','Object')); - expect(result).toContain(generateWorldAttribute('Person1','Object')); + expect(result).toContain(generateWorldFieldForClass('Person','Object')); + expect(result).toContain(generateWorldFieldForClass('Person1','Object')); expect(result).toContain(generateWorldFact('Person+Person1','Object')); }) diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index 65887c8f..c6b04fda 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -1,5 +1,5 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; -import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact } from './helpers'; +import { generateAlloy, generateFact, generateWorldFieldForClass, generateWorldFact } from './helpers'; import { Class, ClassStereotype, Relation, Package, Project, Property, OntoumlType, AggregationKind, stereotypeUtils, OntologicalNature} from '@libs/ontouml'; describe('Class Functions', () => { @@ -59,17 +59,23 @@ describe('Class Functions', () => { }); it('should transform <> class', () => { - model.createKind('Person'); + const person = model.createKind('Person'); + model.createKind('Animal'); + model.createRelator('Strong'); + const entity = model.createCategory('Entity'); + model.createGeneralization( entity, person); + entity.restrictedTo = [OntologicalNature.functional_complex,OntologicalNature.relator]; const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])); - expect(result).toContain(generateWorldAttribute('Person','Object')); + expect(result).toContain(generateWorldFieldForClass('Person','Object')); expect(result).toContain(generateWorldFact('Person','Object')); + console.log(result); }); it('should generate rigid fact for transforming <> class', () => { model.createCollective('Group', false); const result = generateAlloy(model); - expect(result).toContain(generateWorldAttribute('Group','Object')) + expect(result).toContain(generateWorldFieldForClass('Group','Object')) // expect(result).toContain(generateWorldFact('Group','Object')); // expect(result).toContain(generateFact('rigid',['rigidity[Group,Object,exists]'])); }); @@ -94,7 +100,7 @@ describe('Class Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Wine,Object,exists]'])); - expect(result).toContain(generateWorldAttribute('Wine','Object')); + expect(result).toContain(generateWorldFieldForClass('Wine','Object')); expect(result).toContain(generateWorldFact('Wine','Object')); }); @@ -103,7 +109,7 @@ describe('Class Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Strong,Aspect,exists]'])); - expect(result).toContain(generateWorldAttribute('Strong','Aspect')); + expect(result).toContain(generateWorldFieldForClass('Strong','Aspect')); expect(result).toContain(generateWorldFact('Strong','Aspect')); }); @@ -113,7 +119,7 @@ describe('Class Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Marriage,Aspect,exists]'])); - expect(result).toContain(generateWorldAttribute('Marriage','Aspect')); + expect(result).toContain(generateWorldFieldForClass('Marriage','Aspect')); expect(result).toContain(generateWorldFact('Marriage','Aspect')); }); @@ -122,7 +128,7 @@ describe('Class Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('antirigid',['antirigidity[Student,Object,exists]'])); - expect(result).toContain(generateWorldAttribute('Student','Object')); + expect(result).toContain(generateWorldFieldForClass('Student','Object')); expect(result).toContain(generateWorldFact('Student','Object')); }); @@ -131,11 +137,10 @@ describe('Class Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('antirigid',['antirigidity[Child,Object,exists]'])); - expect(result).toContain(generateWorldAttribute('Child','Object')); + expect(result).toContain(generateWorldFieldForClass('Child','Object')); expect(result).toContain(generateWorldFact('Child','Object')); }); - //TODO - should transform abstract class to a datatype it('should transform «abstract» class', () => { let temp = model.createAbstract('Goal'); const _number = model.createDatatype('Date'); @@ -154,7 +159,7 @@ describe('Class Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Skill,Aspect,exists]'])); - expect(result).toContain(generateWorldAttribute('Skill','Aspect')); + expect(result).toContain(generateWorldFieldForClass('Skill','Aspect')); expect(result).toContain(generateWorldFact('Skill','Aspect')); }); @@ -163,7 +168,7 @@ describe('Class Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Love,Aspect,exists]'])); - expect(result).toContain(generateWorldAttribute('Love','Aspect')); + expect(result).toContain(generateWorldFieldForClass('Love','Aspect')); expect(result).toContain(generateWorldFact('Love','Aspect')); }); @@ -173,7 +178,7 @@ describe('Class Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Belief,Aspect,exists]'])); - expect(result).toContain(generateWorldAttribute('Belief','Aspect')); + expect(result).toContain(generateWorldFieldForClass('Belief','Aspect')); expect(result).toContain(generateWorldFact('Belief','Aspect')); }); @@ -200,13 +205,12 @@ describe('Class Functions', () => { // }); //what is expected with the mixins, semirigid? - //TODO - category is non-sortal so should there be something different for it? it('should transform «category» class', () => { model.createCategory('Animal'); const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Animal,Object,exists]'])); - expect(result).toContain(generateWorldAttribute('Animal','Object')); + expect(result).toContain(generateWorldFieldForClass('Animal','Object')); expect(result).toContain(generateWorldFact('Animal','Object')); }); diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index 77e8f6e9..796b9f87 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -1,7 +1,7 @@ import { Generalization } from '@libs/ontouml'; import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; import { normalizeName } from '@libs/ontouml2alloy/util'; -import { generateAlloy, generateFact, generateWorldAttribute, generateFun, generateWorldFact } from './helpers'; +import { generateAlloy, generateFact, generateWorldFieldForClass, generateFun, generateWorldFact } from './helpers'; import { Package, Project } from '@libs/ontouml'; describe('Generalization functions', () => { diff --git a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts index 5073c6f6..9e4cec98 100644 --- a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts @@ -1,6 +1,6 @@ import { transformGeneralizationSet, Ontouml2Alloy } from '@libs/ontouml2alloy'; import { Package, Project } from '@libs/ontouml'; -import { generateAlloy, generateFact, generateWorldAttribute } from './helpers'; +import { generateAlloy, generateFact, generateWorldFieldForClass } from './helpers'; import { Generalization } from '@libs/ontouml'; @@ -28,7 +28,6 @@ describe('Generalization Set Functions', () => { gen2 = model.createGeneralization(parent, child2); }); - //TODO consider that a subKind doesn't get an exists statement when part of a generalization, otherwise does; test in subkind it('disjoint - true, complete - true' , () => { model.createGeneralizationSet( @@ -122,18 +121,4 @@ describe('Generalization Set Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('generalizationSet',['disjoint[Customer,Provider]','Agent = Customer+Provider'])); }); - - //TODO mixin, semirigid not handled - // it('«mixin» Insurable <|- «mixin» ExpensiveObject, «category» RareObject', () => { - // const parent = model.createMixin('Insurable'); - // const child1 = model.createMixin('ExpensiveObject'); - // const child2 = model.createCategory('RareObject'); - // const gen1 = model.createGeneralization(parent, child1); - // const gen2 = model.createGeneralization(parent, child2); - // model.createPartition([gen1, gen2]); - - // const owl = generateGufo(model); - // expect(owl).not.toContain('[ ] (<:ExpensiveObject> <:RareObject>) .'); - // expect(owl).not.toContain('[ ] (<:RareObject> <:ExpensiveObject>) .'); - // }); }); diff --git a/__tests__/libs/ontouml2alloy/helpers.ts b/__tests__/libs/ontouml2alloy/helpers.ts index 040a95e9..bf13d9d9 100644 --- a/__tests__/libs/ontouml2alloy/helpers.ts +++ b/__tests__/libs/ontouml2alloy/helpers.ts @@ -28,12 +28,18 @@ export function generateFact(factName: string, factLines: string[]): string { result += '}\n\n'; return result; } - -export function generateWorldAttribute(className: string, classNature: string): string{ +export function generateWorldFieldForClass(className: string, classNature: string): string{ return className + ': set exists:>' + classNature; } +export function generateWorldFieldForRelation(relationName: string, sourceName: string, targetname: string, sourceCardinality: string, targetCardinality: string): string{ + if(targetCardinality == ''){{ + return relationName + ': ' + sourceCardinality + ' ' + sourceName + ' -> ' + targetname; + }} + return relationName + ': ' + sourceCardinality + ' ' + sourceName + ' -> ' + targetCardinality + ' ' + targetname; +} + export function generateWorldFact(className: string, classNature: string): string{ return '{\n exists:>' + classNature + ' in ' + className + '\n}'; } diff --git a/__tests__/libs/ontouml2alloy/relation_functions.test.ts b/__tests__/libs/ontouml2alloy/relation_functions.test.ts new file mode 100644 index 00000000..30c06c35 --- /dev/null +++ b/__tests__/libs/ontouml2alloy/relation_functions.test.ts @@ -0,0 +1,99 @@ +import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; +import { generateAlloy, generateFact, generateFun, generateWorldFieldForClass, generateWorldFieldForRelation, generateWorldFact } from './helpers'; +import { Class, ClassStereotype, Relation, Package, Project, Property, OntoumlType, AggregationKind, stereotypeUtils, OntologicalNature } from '@libs/ontouml'; + + +describe('relation_functions', () => { + + let project: Project; + let model: Package; + let transformer: Ontouml2Alloy; + + beforeEach(() => { + project = new Project(); + model = project.createModel(); + }); + + //TODO is this even a thing? having a relation between dataypes because it is handled in the code? is the output what is expected? + it('should transform a relation between datatypes', () => { + const sourceClass = model.createDatatype('Date'); + const targetClass = model.createDatatype('String'); + const relation = model.createBinaryRelation(sourceClass, targetClass); + + const result = generateAlloy(model); + + console.log(result); + }); + + it('should transform a derivation relation', () => { + const class1 = model.createKind('Person'); + const class2 = model.createRelator('Marriage'); + const relation = model.createMaterialRelation(class1, class1, 'married to'); + + model.createDerivationRelation(relation, class2, 'derived from'); + + const result = generateAlloy(model); + }); + + it('should transform a mediation relation', () => { + const class1 = model.createRelator('Enrollment'); + const class2 = model.createRole('Student'); + + model.createMediationRelation(class1, class2, 'involves'); + + const result = generateAlloy(model); + + expect(result).toContain(generateWorldFieldForRelation('involves', 'Enrollment', 'Student', 'set', 'one')); + expect(result).toContain(generateFact('relatorConstraint',['all w: World, x: w.Enrollment | #(Student1[x,w])>=2'])); //ensures that there are at least two 'Student' related to each 'Enrollment'. + expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.involves,w.Enrollment]'])); //ensures that 'involves' relation is acyclic for 'Enrollment', i.e., it does not loop back on itself. + expect(result).toContain(generateFun('Enrollment1','Student','Enrollment','(w.involves).x')); //part of property test? + expect(result).toContain(generateFun('Student1','Enrollment','Student','x.(w.involves)')); //part of property test? + expect(result).toContain(generateFact('relationProperties', ['immutable_target[Enrollment,involves]'])); //part of property test? + }); + + //there is no case handling this particular type of relation so dunno if it's correct + it('should transform a characterization relation', () => { + + const class1 = model.createExtrinsicMode('Love'); + const class2 = model.createKind('Person'); + + model.createCharacterizationRelation(class1, class2, 'inside'); + + const result = generateAlloy(model); + + console.log(result); + expect(result).toContain(generateWorldFieldForRelation('inside', 'Enrollment', 'Student', 'set', 'one')); + expect(result).toContain(generateFun('Enrollment1','Student','Enrollment','(w.involves).x')); //part of property test? + expect(result).toContain(generateFun('Student1','Enrollment','Student','x.(w.involves)')); //part of property test? + expect(result).toContain(generateFact('relationProperties', ['immutable_target[Enrollment,involves]'])); //part of property test? + }); + + it('should transform a material relation', () => { + const class1 = model.createKind('Book'); + const class2 = model.createKind('Author'); + const relation = model.createMaterialRelation(class1, class2, 'writtenBy'); + + const result = generateAlloy(model); + + expect(result).toContain(generateWorldFieldForRelation('writtenBy', 'Book', 'Author', 'set', '')); + expect(result).toContain(generateFun('Book1','Author','Book','(w.writtenBy).x')); //part of property test? + expect(result).toContain(generateFun('Author1','Book','Author','x.(w.writtenBy)')); //part of property test? +}); + + it('should transform a part-whole relation', () => { + const wholeClass = model.createKind('Car'); + const partClass = model.createKind('Engine'); + const relation = model.createPartWholeRelation(wholeClass, partClass, 'hasEngine'); + + const result = generateAlloy(model); + + expect(result).toContain(generateWorldFieldForRelation('hasEngine', 'Car', 'Engine', 'set', 'one')); + expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.hasEngine,w.Car]'])); + expect(result).toContain(generateFun('Car1','Engine','Car','(w.hasEngine).x')); //part of property test? + expect(result).toContain(generateFun('Engine1','Car','Engine','x.(w.hasEngine)')); //part of property test? + expect(result).toContain(generateFact('weakSupplementationConstraint', ['all w: World, x: w.Car | #(Engine1[x,w])>=2'])); //part of property test? + expect(result).toContain(generateFact('multiplicity',['all w: World, x: w.Engine | #Car1[x,w]>=2'])); //part of property test? +}); + + +}); \ No newline at end of file diff --git a/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts b/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts index 4f06bd78..e9c03b83 100644 --- a/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts +++ b/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts @@ -1,165 +1,191 @@ import { Class, OntoumlElement, Package, Project, Property, Relation } from '@libs/ontouml'; -import { generateAlloy, generateFact, generateWorldAttribute, generateWorldFact, generateFun } from './helpers' +import { generateAlloy, generateFact, generateWorldFieldForClass, generateWorldFact, generateFun } from './helpers' import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; describe("removeUnsupportedElements function", () => { - let project: Project; - let model: Package; + let project: Project; + let model: Package; - beforeEach(() => { + beforeEach(() => { project = new Project(); model = project.createModel(); }); - + //TODO deep copy of model it('removes <> & connected generalizations, attributes', () => { - - // Add unsupported elements to the model - const parent = model.createEvent('Ceremony'); - const child1 = model.createEvent('Wedding'); - const child2 = model.createEvent('Graduation'); - const address = model.createDatatype('Address'); - const place = parent.createAttribute(address, 'Enschede'); - const gen1 = model.createGeneralization(parent, child1, 'gen1'); - const gen2 = model.createGeneralization(parent, child2, 'gen2'); - const genSet = model.createGeneralizationSet([gen1, gen2], true, false); - - // Add supported elements to the model - const supportedClass = model.createKind('Person'); - const text = model.createDatatype('Text'); - const surname = supportedClass.createAttribute(text, 'surname'); - - // Call the removeUnsupportedElements function (indirectly) - const ontouml2alloy = new Ontouml2Alloy(model); - let { result, issues } = ontouml2alloy.run(); - result = ontouml2alloy.getAlloyCode()[0]; - - // Check if unsupported elements are removed - expect(result).not.toContain('Ceremony'); - expect(result).not.toContain('Wedding'); - expect(result).not.toContain('Graduation'); - expect(result).not.toContain('Enschede'); - expect(result).not.toContain(generateFact('generalization',['Wedding in Ceremony'])); - expect(result).not.toContain(generateFact('generalization',['Graduation in Ceremony'])); - expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Wedding,Graduation]'])); - - // Check if supported elements are retained - expect(result).toContain('Person'); - expect(result).toContain('surname'); - - // Check if issues are returned properly - expect(issues).toBeDefined(); - expect(issues.length).toBe(7); - expect(issues.map(issue => issue.id)).toContain(parent.id); - expect(issues.map(issue => issue.id)).toContain(child1.id); - expect(issues.map(issue => issue.id)).toContain(child2.id); - expect(issues.map(issue => issue.id)).toContain(place.id); - expect(issues.map(issue => issue.id)).toContain(gen1.id); - expect(issues.map(issue => issue.id)).toContain(gen2.id); - expect(issues.map(issue => issue.id)).toContain(genSet.id); - - //Printing of 'issues' for debugging purposes - // issues.forEach((issue, index) => { - // console.log(`Issue #${index + 1}:\nDescription: ${issue.description}\nData: ${JSON.stringify(issue.data.name, null, 2)}\n`); - // }); - }); - - it('removes relations connected to unsupported classes', () => { + + // Add unsupported elements to the model + const parent = model.createEvent('Ceremony'); + const child1 = model.createEvent('Wedding'); + const child2 = model.createEvent('Graduation'); + const address = model.createDatatype('Address'); + const place = parent.createAttribute(address, 'Enschede'); + const gen1 = model.createGeneralization(parent, child1, 'gen1'); + const gen2 = model.createGeneralization(parent, child2, 'gen2'); + const genSet = model.createGeneralizationSet([gen1, gen2], true, false); + + // Add supported elements to the model + const supportedClass = model.createKind('Person'); + const text = model.createDatatype('Text'); + const surname = supportedClass.createAttribute(text, 'surname'); + + // Call the removeUnsupportedElements function (indirectly) + const ontouml2alloy = new Ontouml2Alloy(model); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; + + // Check if unsupported elements are removed + expect(result).not.toContain('Ceremony'); + expect(result).not.toContain('Wedding'); + expect(result).not.toContain('Graduation'); + expect(result).not.toContain('Enschede'); + expect(result).not.toContain(generateFact('generalization', ['Wedding in Ceremony'])); + expect(result).not.toContain(generateFact('generalization', ['Graduation in Ceremony'])); + expect(result).not.toContain(generateFact('generalizationSet', ['disjoint[Wedding,Graduation]'])); + + // Check if supported elements are retained + expect(result).toContain('Person'); + expect(result).toContain('surname'); + + // Check if issues are returned properly + expect(issues).toBeDefined(); + expect(issues.length).toBe(7); + expect(issues.map(issue => issue.id)).toContain(parent.id); + expect(issues.map(issue => issue.id)).toContain(child1.id); + expect(issues.map(issue => issue.id)).toContain(child2.id); + expect(issues.map(issue => issue.id)).toContain(place.id); + expect(issues.map(issue => issue.id)).toContain(gen1.id); + expect(issues.map(issue => issue.id)).toContain(gen2.id); + expect(issues.map(issue => issue.id)).toContain(genSet.id); + + //Printing of 'issues' for debugging purposes + // issues.forEach((issue, index) => { + // console.log(`Issue #${index + 1}:\nDescription: ${issue.description}\nData: ${JSON.stringify(issue.data.name, null, 2)}\n`); + // }); + }); + + it('removes relations with unsupported source class', () => { const unsupportedSource = model.createEvent('Ceremony'); - const unsupportedTarget = model.createType('PartyType'); - const supportedSource = model.createKind('Person'); const supportedTarget = model.createKind('Party'); const relation1 = model.createMaterialRelation(unsupportedSource, supportedTarget, 'R1'); - const relation2 = model.createMaterialRelation(supportedSource, unsupportedTarget, 'R2'); - const relation3 = model.createMaterialRelation(supportedSource, supportedTarget, 'R3'); const ontouml2alloy = new Ontouml2Alloy(model); let { result, issues } = ontouml2alloy.run(); result = ontouml2alloy.getAlloyCode()[0]; expect(result).not.toContain('R1'); - expect(result).not.toContain('R2'); - expect(result).toContain(generateFun('Person1', 'Party', 'Person', '(w.R3).x')); - expect(result).toContain(generateFun('Party1', 'Person', 'Party', 'x.(w.R3)')); - expect(issues).toBeDefined(); - expect(issues.length).toBe(4); + expect(issues.length).toBe(2); expect(issues.map(issue => issue.id)).toContain(relation1.id); + }); + + it('removes relations with unsupported target class', () => { + const supportedSource = model.createKind('Person'); + const unsupportedTarget = model.createType('PartyType'); + + const relation2 = model.createMaterialRelation(supportedSource, unsupportedTarget, 'R2'); + + const ontouml2alloy = new Ontouml2Alloy(model); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; + + expect(result).not.toContain('R2'); + expect(issues).toBeDefined(); + expect(issues.length).toBe(2); expect(issues.map(issue => issue.id)).toContain(relation2.id); }); - it('removes generalizations consisting of unsupported elements', () => { + it('removes generalizations with unsupported specific class', () => { const unsupportedSpecific = model.createSituation('Meeting'); - const unsupportedGeneral = model.createSituation('Event'); - const supportedSpecific = model.createKind('Person'); const supportedGeneral = model.createKind('Party'); - + const generalization1 = model.createGeneralization(supportedGeneral, unsupportedSpecific); - const generalization2 = model.createGeneralization(unsupportedGeneral, supportedSpecific); - const generalization3 = model.createGeneralization(supportedGeneral, supportedSpecific); - + const ontouml2alloy = new Ontouml2Alloy(model); let { result, issues } = ontouml2alloy.run(); result = ontouml2alloy.getAlloyCode()[0]; - + expect(result).not.toContain(generateFact('generalization', ['Meeting in Party'])); - expect(result).not.toContain(generateFact('generalization', ['Person in Event'])); - expect(result).toContain(generateFact('generalization', ['Person in Party'])); - expect(issues).toBeDefined(); - expect(issues.length).toBe(4); + expect(issues.length).toBe(2); expect(issues.map(issue => issue.id)).toContain(generalization1.id); - expect(issues.map(issue => issue.id)).toContain(generalization2.id); }); - it('removes generalization sets containing unsupported elements', () => { + it('removes generalizations with unsupported general class', () => { + const supportedSpecific = model.createKind('Person'); + const unsupportedGeneral = model.createSituation('Event'); + + const generalization2 = model.createGeneralization(unsupportedGeneral, supportedSpecific); + + const ontouml2alloy = new Ontouml2Alloy(model); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; + expect(result).not.toContain(generateFact('generalization', ['Person in Event'])); + expect(issues).toBeDefined(); + expect(issues.length).toBe(2); + expect(issues.map(issue => issue.id)).toContain(generalization2.id); + }); + + it('removes generalization sets with all unsupported elements', () => { const unsupportedParent = model.createEvent('Ceremony'); const unsupportedChild1 = model.createEvent('Wedding'); - const unsupportedchild2 = model.createEvent('Graduation'); - const supportedParent = model.createKind('Person'); - const supportedChild1 = model.createSubkind('Man'); - const supportedChild2 = model.createSubkind('Woman'); + const unsupportedChild2 = model.createEvent('Graduation'); - //mix of supported and unsupported generalizations const unsupportedGen1 = model.createGeneralization(unsupportedParent, unsupportedChild1); - const unsupportedGen2 = model.createGeneralization(supportedParent, unsupportedchild2); - const unsupportedGen3 = model.createGeneralization(unsupportedParent, supportedChild1); - const supportedGen4 = model.createGeneralization(supportedParent, supportedChild1); - const supportedGen5 = model.createGeneralization(supportedParent, supportedChild2); + const unsupportedGen2 = model.createGeneralization(unsupportedParent, unsupportedChild2); - //test for mix of generalization sets with unsupported and supported generalizations - const unsupportedgenSet1 = model.createGeneralizationSet([unsupportedGen1, unsupportedGen2], true, false); - const unsupportedgenSet2 = model.createGeneralizationSet([unsupportedGen2, supportedGen4], true, false); - const unsupportedgenSet3 = model.createGeneralizationSet([unsupportedGen3, supportedGen4], true, false); - const supportedGenSet4 = model.createGeneralizationSet([supportedGen4, supportedGen5], true, false); + const unsupportedGenSet = model.createGeneralizationSet([unsupportedGen1, unsupportedGen2], true, false); const ontouml2alloy = new Ontouml2Alloy(model); let { result, issues } = ontouml2alloy.run(); result = ontouml2alloy.getAlloyCode()[0]; - - expect(result).not.toContain(generateFact('generalization',[' Wedding in Ceremony'])); - expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]'])); + + expect(result).not.toContain(generateFact('generalization', ['Wedding in Ceremony'])); + expect(result).not.toContain(generateFact('generalization', ['Graduation in Ceremony'])); + expect(result).not.toContain(generateFact('generalizationSet', ['disjoint[Wedding,Graduation]'])); + expect(issues).toBeDefined(); - expect(issues.length).toBe(9); - expect(issues.map(issue => issue.id)).toContain(unsupportedgenSet1.id); - expect(issues.map(issue => issue.id)).toContain(unsupportedgenSet2.id); - expect(issues.map(issue => issue.id)).toContain(unsupportedgenSet3.id); + expect(issues.length).toBe(6); + expect(issues.map(issue => issue.id)).toContain(unsupportedGenSet.id); + }); + + it('removes generalization sets with a mix of unsupported and supported elements', () => { + const supportedParent = model.createKind('Person'); + const unsupportedChild = model.createEvent('Graduation'); + const supportedChild = model.createSubkind('Man'); + + const unsupportedGen = model.createGeneralization(supportedParent, unsupportedChild); + const supportedGen = model.createGeneralization(supportedParent, supportedChild); + + const mixedGenSet = model.createGeneralizationSet([unsupportedGen, supportedGen], true, false); + const ontouml2alloy = new Ontouml2Alloy(model); + let { result, issues } = ontouml2alloy.run(); + result = ontouml2alloy.getAlloyCode()[0]; + + expect(result).toContain(generateFact('generalization', ['Man in Person'])); + expect(result).not.toContain(generateFact('generalization', ['Graduation in Person'])); + expect(result).not.toContain(generateFact('generalizationSet', ['disjoint[Graduation,Man]'])); + + expect(issues).toBeDefined(); + expect(issues.length).toBe(3); + expect(issues.map(issue => issue.id)).toContain(mixedGenSet.id); }); + it('removes generalization sets with categorizers having unsupported stereotypes', () => { const supportedParent = model.createKind('Person'); const supportedChild1 = model.createSubkind('Man'); const supportedChild2 = model.createSubkind('Woman'); const unsupportedCategorizer = model.createType('CategoryType'); - const gen1 = model.createGeneralization(supportedParent,supportedChild1); + const gen1 = model.createGeneralization(supportedParent, supportedChild1); const gen2 = model.createGeneralization(supportedParent, supportedChild2); const genSet1 = model.createGeneralizationSet([gen1, gen2], true, false, unsupportedCategorizer); @@ -168,12 +194,12 @@ describe("removeUnsupportedElements function", () => { let { result, issues } = ontouml2alloy.run(); result = ontouml2alloy.getAlloyCode()[0]; - expect(result).not.toContain(generateFact('generalizationSet',['disjoint[Man,Woman]'])); + expect(result).not.toContain(generateFact('generalizationSet', ['disjoint[Man,Woman]'])); expect(issues).toBeDefined(); expect(issues.length).toBe(2); expect(issues.map(issue => issue.id)).toContain(genSet1.id); - }); + }); it('removes <> classes and retains others', () => { const typeClass = model.createType('PartyType'); @@ -207,19 +233,18 @@ describe("removeUnsupportedElements function", () => { expect(issues.map(issue => issue.id)).toContain(situationClass.id); }); - it('removes attributes of unsupported classes', () => { const unsupportedClass = model.createEvent('Ceremony'); const supportedClass = model.createKind('Person'); - + const datatype = model.createDatatype('Text'); const unsupportedAttribute = unsupportedClass.createAttribute(datatype, 'name'); const supportedAttribute = supportedClass.createAttribute(datatype, 'surname'); - + const ontouml2alloy = new Ontouml2Alloy(model); let { result, issues } = ontouml2alloy.run(); result = ontouml2alloy.getAlloyCode()[0]; - + expect(result).not.toContainEqual('name'); expect(result).toContain('surname'); @@ -228,30 +253,4 @@ describe("removeUnsupportedElements function", () => { expect(issues.map(issue => issue.id)).toContain(unsupportedAttribute.id); }); - //TODO how to check relation ends? - it('removes relation-ends connected to unsupported elements', () => { - const unsupportedSource = model.createEvent('Ceremony'); - const unsupportedTarget = model.createType('PartyType'); - const supportedSource = model.createKind('Person'); - const supportedTarget = model.createKind('Party'); - - const relation1 = model.createMaterialRelation(unsupportedSource, supportedTarget, 'R1'); - const relation2 = model.createMaterialRelation(supportedSource, unsupportedTarget, 'R2'); - - const sourceEnd1 = relation1.getSourceEnd(); - const targetEnd1 = relation1.getTargetEnd(); - const sourceEnd2 = relation2.getSourceEnd(); - const targetEnd2 = relation2.getTargetEnd(); - - const ontouml2alloy = new Ontouml2Alloy(model); - const { result, issues } = ontouml2alloy.run(); - - expect(model.getAllProperties()).not.toContain(sourceEnd1); - expect(model.getAllProperties()).not.toContain(targetEnd1); - expect(model.getAllProperties()).not.toContain(sourceEnd2); - expect(model.getAllProperties()).not.toContain(targetEnd2); - }); - - - }); diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index 89dc2106..77bc30d9 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -8,7 +8,6 @@ export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //Th return; } - //TODO change Abstract to Datatype if(_class.hasAbstractStereotype()){ _class.stereotype = ClassStereotype.DATATYPE; } diff --git a/src/libs/ontouml2alloy/ontouml2alloy.ts b/src/libs/ontouml2alloy/ontouml2alloy.ts index 7d50548c..f841365d 100644 --- a/src/libs/ontouml2alloy/ontouml2alloy.ts +++ b/src/libs/ontouml2alloy/ontouml2alloy.ts @@ -159,9 +159,9 @@ export class Ontouml2Alloy implements Service { // Remove attributes with undefined propertyType for (const property of this.model.getAllAttributes()) { - if(!property.propertyType){ + if(!property.propertyType || this.hasUnsupportedStereotype(property.propertyType)){ property.removeSelfFromContainer(); - this.generateRemovalIssue(property, `Attribute '${property.getName()}' was removed due to undefined propertyType.`); + this.generateRemovalIssue(property, `Attribute '${property.getName()}' was removed due to undefined/unsupported propertyType.`); } } @@ -195,6 +195,7 @@ export class Ontouml2Alloy implements Service { // Remove generalization sets containing unsupported elements for (const generalizationSet of generalizationSets) { + //TODO remove categorizer let categorizerUnsupported = generalizationSet.categorizer && this.hasUnsupportedStereotype(generalizationSet.categorizer); if (generalizationSet.generalizations.some(gen => this.hasUnsupportedStereotype(gen.specific) || this.hasUnsupportedStereotype(gen.general)) || categorizerUnsupported) { generalizationSet.removeSelfFromContainer(); From 0b4ba79ea1d3c4360207bc250273d5620d155754 Mon Sep 17 00:00:00 2001 From: Asen Date: Sun, 18 Jun 2023 16:01:47 +0200 Subject: [PATCH 20/23] update naming + tests --- .../alloy_name_normalization.test.ts | 39 ++++++++---- .../generalization_functions.test.ts | 2 +- __tests__/libs/ontouml2alloy/helpers.ts | 1 - .../ontouml2alloy/relation_functions.test.ts | 34 +++++++++- src/libs/ontouml2alloy/class_functions.ts | 46 +++++++------- .../ontouml2alloy/generalization_functions.ts | 6 +- .../generalization_set_functions.ts | 6 +- src/libs/ontouml2alloy/property_functions.ts | 36 +++++------ src/libs/ontouml2alloy/relation_functions.ts | 63 ++++++++++--------- src/libs/ontouml2alloy/util.ts | 9 ++- 10 files changed, 146 insertions(+), 96 deletions(-) diff --git a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts index 9c4b9a50..2a97f505 100644 --- a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts +++ b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts @@ -1,6 +1,6 @@ import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; import { Class, OntoumlElement, Package, Project, Relation } from '@libs/ontouml'; -import { normalizeName } from '@libs/ontouml2alloy/util'; +import { getNormalizedName } from '@libs/ontouml2alloy/util'; import { generateAlloy, generateFact, generateWorldFieldForClass, generateWorldFact } from './helpers'; import { OntoumlType } from '@libs/ontouml'; import { reservedKeywords, forbiddenCharacters } from '@libs/ontouml2alloy/util'; @@ -24,25 +24,25 @@ describe('Name normalization' , () => { it('Person -> Person', () => { element.addName('Person'); - const normalized = normalizeName(transformer, element); + const normalized = getNormalizedName(transformer, element); expect(normalized).toBe('Person'); }); it('PERSON -> PERSON', () => { element.addName('PERSON'); - const normalized = normalizeName(transformer, element); + const normalized = getNormalizedName(transformer, element); expect(normalized).toBe('PERSON'); }); it('person -> person', () => { element.addName('person'); - const normalized = normalizeName(transformer, element); + const normalized = getNormalizedName(transformer, element); expect(normalized).toBe('person'); }); it('PeRsoN -> PeRsoN', () => { element.addName('PeRsoN'); - const normalized = normalizeName(transformer, element); + const normalized = getNormalizedName(transformer, element); expect(normalized).toBe('PeRsoN'); }); @@ -54,7 +54,7 @@ describe('Name normalization' , () => { reservedKeywords.forEach(keyword => { it(`should normalize the reserved keyword "${keyword}"`, () => { element.addName(keyword); - const normalized = normalizeName(transformer, element); + const normalized = getNormalizedName(transformer, element); expect(normalized).toBe(`${keyword}_${(element.type).toLowerCase()}`); }); }); @@ -62,7 +62,7 @@ describe('Name normalization' , () => { forbiddenCharacters.forEach(char => { it(`should remove the forbidden character "${char}" from the name`, () => { element.addName(`Happy${char}Person`); - const normalized = normalizeName(transformer, element); + const normalized = getNormalizedName(transformer, element); expect(normalized).toBe('HappyPerson'); }); }); @@ -70,22 +70,22 @@ describe('Name normalization' , () => { //normalization of empty name: '' -> Unnamed_OntoumlElementType; it('should normalize a class with no name', () => { element.addName(''); - const normalized = normalizeName(transformer, element); + const normalized = getNormalizedName(transformer, element); expect(normalized).toBe('Unnamed_class'); }); it('should normalize a relation with no name', () => { element = new Relation(); element.addName(''); - const normalized = normalizeName(transformer, element); + const normalized = getNormalizedName(transformer, element); expect(normalized).toBe('Unnamed_relation'); }); it('should normalize two classes with no name/only forbidden characters', () => { const element1 = model.createKind(''); const element2 = model.createKind('!!!'); - const normalized1 = normalizeName(transformer, element1); - const normalized2 = normalizeName(transformer, element2); + const normalized1 = getNormalizedName(transformer, element1); + const normalized2 = getNormalizedName(transformer, element2); expect(normalized1).toBe('Unnamed_class'); expect(normalized2).toBe('Unnamed_class1'); @@ -105,9 +105,24 @@ describe('Name normalization' , () => { it('should normalize a class starting with a number', () => { element.addName('123Person'); - const normalized = normalizeName(transformer, element); + const normalized = getNormalizedName(transformer, element); expect(normalized).toBe('class_123Person'); }); + + it('should transform a mediation relation', () => { + const class1 = model.createRelator('Enrollment'); + const class2 = model.createRole('Student'); + + model.createMediationRelation(class1, class2, 'involves'); + + const result = generateAlloy(model); + + console.log(result); + expect(result).toContain(generateFact('relatorConstraint',['all w: World, x: w.Enrollment | #(Student1[x,w])>=2'])); //ensures that there are at least two 'Student' related to each 'Enrollment'. + expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.involves,w.Enrollment]'])); //ensures that 'involves' relation is acyclic for 'Enrollment', i.e., it does not loop back on itself. + expect(result).toContain(generateFact('relationProperties', ['immutable_target[Enrollment,involves]'])); //part of property test? + }); + }); diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index 796b9f87..6425c82e 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -1,6 +1,6 @@ import { Generalization } from '@libs/ontouml'; import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; -import { normalizeName } from '@libs/ontouml2alloy/util'; +import { getNormalizedName } from '@libs/ontouml2alloy/util'; import { generateAlloy, generateFact, generateWorldFieldForClass, generateFun, generateWorldFact } from './helpers'; import { Package, Project } from '@libs/ontouml'; diff --git a/__tests__/libs/ontouml2alloy/helpers.ts b/__tests__/libs/ontouml2alloy/helpers.ts index bf13d9d9..23b13496 100644 --- a/__tests__/libs/ontouml2alloy/helpers.ts +++ b/__tests__/libs/ontouml2alloy/helpers.ts @@ -21,7 +21,6 @@ export function generateFact(factName: string, factLines: string[]): string { return result; } - //TODO check if functions are always like this export function generateFun(funName: string, fromEnitity: string, toEntity, expression: string): string { let result = `fun ${funName} [x: World.${fromEnitity}, w: World] : set World.${toEntity} {\n`; result += ` ${expression}\n`; diff --git a/__tests__/libs/ontouml2alloy/relation_functions.test.ts b/__tests__/libs/ontouml2alloy/relation_functions.test.ts index 30c06c35..475c9cf0 100644 --- a/__tests__/libs/ontouml2alloy/relation_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/relation_functions.test.ts @@ -14,7 +14,7 @@ describe('relation_functions', () => { model = project.createModel(); }); - //TODO is this even a thing? having a relation between dataypes because it is handled in the code? is the output what is expected? + //cardinality under question it('should transform a relation between datatypes', () => { const sourceClass = model.createDatatype('Date'); const targetClass = model.createDatatype('String'); @@ -23,13 +23,16 @@ describe('relation_functions', () => { const result = generateAlloy(model); console.log(result); + expect(result).toContain('sig Date in Datatype {\n relation1: String\n}'); + expect(result).toContain(generateFact('datatypesMultiplicity',['all x: Date | #x.relation1>=0','all x: String | #relation1.x>=0'])); }); + //TODO test material relation with no derivation, material relation with derivation - the case below to check the main; another test case to test for derivation fact it('should transform a derivation relation', () => { const class1 = model.createKind('Person'); const class2 = model.createRelator('Marriage'); const relation = model.createMaterialRelation(class1, class1, 'married to'); - + model.createMediationRelation(class2, class1, 'mediates'); model.createDerivationRelation(relation, class2, 'derived from'); const result = generateAlloy(model); @@ -43,6 +46,7 @@ describe('relation_functions', () => { const result = generateAlloy(model); + console.log(result); expect(result).toContain(generateWorldFieldForRelation('involves', 'Enrollment', 'Student', 'set', 'one')); expect(result).toContain(generateFact('relatorConstraint',['all w: World, x: w.Enrollment | #(Student1[x,w])>=2'])); //ensures that there are at least two 'Student' related to each 'Enrollment'. expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.involves,w.Enrollment]'])); //ensures that 'involves' relation is acyclic for 'Enrollment', i.e., it does not loop back on itself. @@ -51,6 +55,24 @@ describe('relation_functions', () => { expect(result).toContain(generateFact('relationProperties', ['immutable_target[Enrollment,involves]'])); //part of property test? }); + it('should generate relator rule for 2 mediation relations', () => { + const class1 = model.createRelator('Enrollment'); + const class2 = model.createRole('Student'); + const class3 = model.createKind('University'); + + const rel1 = model.createMediationRelation(class1, class2, 'involvesStudent'); + rel1.getTargetEnd().setName('Student10'); + + const rel2 = model.createMediationRelation(class1, class3, 'involvesUniveristy'); + rel2.getTargetEnd().setName('University110'); + + const result = generateAlloy(model); + + console.log(result); + expect(result).toContain(generateFact('relatorConstraint',['all w: World, x: w.Enrollment | #(Student1[x,w])>=2'])); //ensures that there are at least two 'Student' related to each 'Enrollment'. + + }); + //there is no case handling this particular type of relation so dunno if it's correct it('should transform a characterization relation', () => { @@ -91,9 +113,15 @@ describe('relation_functions', () => { expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.hasEngine,w.Car]'])); expect(result).toContain(generateFun('Car1','Engine','Car','(w.hasEngine).x')); //part of property test? expect(result).toContain(generateFun('Engine1','Car','Engine','x.(w.hasEngine)')); //part of property test? - expect(result).toContain(generateFact('weakSupplementationConstraint', ['all w: World, x: w.Car | #(Engine1[x,w])>=2'])); //part of property test? + expect(result).toContain(generateFact('weakSupplementationConstraint', ['all w: World, x: w.Car | #(Engine1[x,w])>=2'])); expect(result).toContain(generateFact('multiplicity',['all w: World, x: w.Engine | #Car1[x,w]>=2'])); //part of property test? }); + it('derivation relation from comparative relation', () => { + + //there should be a fact containing this below + "all w: World, x, y: w.Person | some x.(w.CHARACTERIZATION_RELATION_NAME) and some y.(w.CHARACTERIZATION_RELATION_NAME) implies (x in y.(w.COMPARATIVE_RELATION_NAME) or y in x.(w.COMPARATIVE_RELATION_NAME))" + + }) }); \ No newline at end of file diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index 77bc30d9..6a1f3fa2 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -1,7 +1,7 @@ import { Class, ClassStereotype, Relation } from '@libs/ontouml'; import { RelationStereotype } from '@libs/ontouml/model/stereotypes'; import { Ontouml2Alloy } from '.'; -import { normalizeName, isTopLevel, getValidAlias } from './util'; +import { getNormalizedName, isTopLevel, getValidAlias } from './util'; export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //This line defines a function named transformClass that takes two parameters: transformer (of type Ontouml2Alloy) and _class (of type Class). if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION,ClassStereotype.TYPE])) { //This line checks if the given class _class has any of the stereotypes EVENT, SITUATION or TYPE. If it does, the function immediately returns without doing anything. @@ -42,8 +42,8 @@ export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //Th } function transformAbstractClass(transformer: Ontouml2Alloy, _class: Class) { - const className = normalizeName(transformer, _class); - const subtypes = _class.getChildren().map(subtype => 'w.' + normalizeName(transformer, subtype)); + const className = getNormalizedName(transformer, _class); + const subtypes = _class.getChildren().map(subtype => 'w.' + getNormalizedName(transformer, subtype)); if (subtypes.length) { transformer.addFact( @@ -55,7 +55,7 @@ function transformAbstractClass(transformer: Ontouml2Alloy, _class: Class) { } function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { - const className = normalizeName(transformer, _class); + const className = getNormalizedName(transformer, _class); let nature = ''; if (_class.isRestrictedToSubstantial()) { @@ -86,13 +86,13 @@ function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { } function transformDatatypeClass(transformer: Ontouml2Alloy, _class: Class) { - const datatypeName = normalizeName(transformer, _class); + const datatypeName = getNormalizedName(transformer, _class); transformer.addDatatype([datatypeName, []]); } function transformEnumerationClass(transformer: Ontouml2Alloy, _class: Class) { - const enumName = normalizeName(transformer, _class); - const literals = _class.literals.map(literal => normalizeName(transformer, literal)); + const enumName = getNormalizedName(transformer, _class); + const literals = _class.literals.map(literal => getNormalizedName(transformer, literal)); if (literals.length) { transformer.addEnum( @@ -110,19 +110,21 @@ function transformRelatorConstraint(transformer: Ontouml2Alloy, _class: Class) { const mediated = mediation.getTargetEnd(); let mediatedName = ''; - if (mediated.getName()) { - mediatedName = normalizeName(transformer, mediated); - } else { - mediatedName = normalizeName(transformer, mediation.getTarget()); - } + // if (mediated.getName()) { + // mediatedName = normalizeName(transformer, mediated); + // } else { + // mediatedName = normalizeName(transformer, mediation.getTarget()); + // } + - const mediatedAlias = getValidAlias(mediated, mediatedName, transformer.aliases); + const mediatedAlias = getValidAlias(mediated, getNormalizedName(transformer, mediation.getTarget()), transformer.aliases); + // const mediatedAlias = getNormalizedName(transformer, mediation.getTarget()); mediations.push(mediatedAlias + '[x,w]'); } } if (mediations.length) { - const relatorName = normalizeName(transformer, _class); + const relatorName = getNormalizedName(transformer, _class); transformer.addFact( 'fact relatorConstraint {\n' + ' all w: World, x: w.' + relatorName + ' | #(' + mediations.join('+') + ')>=2\n' + @@ -142,9 +144,9 @@ function transformWeakSupplementationConstraint(transformer: Ontouml2Alloy, _cla let partName = ''; if (part.getName()) { - partName = normalizeName(transformer, part); + partName = getNormalizedName(transformer, part); } else { - partName = normalizeName(transformer, (part.container as Relation).getTarget()); + partName = getNormalizedName(transformer, (part.container as Relation).getTarget()); } const partAlias = getValidAlias(part, partName, transformer.aliases); @@ -154,7 +156,7 @@ function transformWeakSupplementationConstraint(transformer: Ontouml2Alloy, _cla } if (parts.length) { - const wholeName = normalizeName(transformer, _class); + const wholeName = getNormalizedName(transformer, _class); transformer.addFact( 'fact weakSupplementationConstraint {\n' + @@ -174,12 +176,12 @@ function transformDisjointNaturesConstraint(transformer: Ontouml2Alloy, _class: if (isTopLevel(otherClass, transformer.model.getAllGeneralizations()) && !otherClass.restrictedToContainedIn(_class.restrictedTo)) { - differentNaturedClasses.push(normalizeName(transformer, otherClass)); + differentNaturedClasses.push(getNormalizedName(transformer, otherClass)); } } if (differentNaturedClasses.length) { - const className = normalizeName(transformer, _class); + const className = getNormalizedName(transformer, _class); if (differentNaturedClasses.length == 1) { transformer.addWorldFieldFact( 'disjoint[' + className + ',' + differentNaturedClasses[0] + ']' @@ -198,7 +200,7 @@ export function transformAdditionalClassConstraints(transformer: Ontouml2Alloy) for (const _class of transformer.model.getAllClasses()) { if (_class.isRestrictedToEndurant() && isTopLevel(_class, transformer.model.getAllGeneralizations())) { - const className = normalizeName(transformer, _class); + const className = getNormalizedName(transformer, _class); if (_class.isRestrictedToSubstantial()) { objectClasses.push(className); @@ -235,10 +237,10 @@ export function transformAdditionalDatatypeConstraints(transformer: Ontouml2Allo } } - const datatypesNames = datatypes.map(datatype => normalizeName(transformer, datatype)); + const datatypesNames = datatypes.map(datatype => getNormalizedName(transformer, datatype)); if (topLevelDatatypes.length >= 2) { - const topLevelDatatypesNames = topLevelDatatypes.map(datatype => normalizeName(transformer, datatype)); + const topLevelDatatypesNames = topLevelDatatypes.map(datatype => getNormalizedName(transformer, datatype)); transformer.addFact( 'fact additionalDatatypeFacts {\n' + diff --git a/src/libs/ontouml2alloy/generalization_functions.ts b/src/libs/ontouml2alloy/generalization_functions.ts index c77daf36..dbb39593 100644 --- a/src/libs/ontouml2alloy/generalization_functions.ts +++ b/src/libs/ontouml2alloy/generalization_functions.ts @@ -1,10 +1,10 @@ import { Generalization } from '@libs/ontouml'; import { Ontouml2Alloy } from './'; -import { normalizeName } from './util'; +import { getNormalizedName } from './util'; export function transformGeneralization(transformer: Ontouml2Alloy, gen: Generalization) { - const specificName = normalizeName(transformer, gen.specific); - const generalName = normalizeName(transformer, gen.general) + const specificName = getNormalizedName(transformer, gen.specific); + const generalName = getNormalizedName(transformer, gen.general) transformer.addFact( 'fact generalization {\n' + diff --git a/src/libs/ontouml2alloy/generalization_set_functions.ts b/src/libs/ontouml2alloy/generalization_set_functions.ts index 30a3165f..993a5166 100644 --- a/src/libs/ontouml2alloy/generalization_set_functions.ts +++ b/src/libs/ontouml2alloy/generalization_set_functions.ts @@ -1,6 +1,6 @@ import { Generalization, GeneralizationSet, OntoumlType } from '@libs/ontouml'; import { Ontouml2Alloy } from './'; -import { normalizeName } from './util'; +import { getNormalizedName } from './util'; export function transformGeneralizationSet(transformer: Ontouml2Alloy, genSet: GeneralizationSet) { if (!genSet.generalizations || genSet.generalizations.length === 0 || (!genSet.isComplete && !genSet.isDisjoint)) { @@ -26,11 +26,11 @@ export function transformGeneralizationSet(transformer: Ontouml2Alloy, genSet: G } const children = (genSet.generalizations as Generalization[]) - .map(gen => normalizeName(transformer, gen.specific)); + .map(gen => getNormalizedName(transformer, gen.specific)); let fact = 'fact generalizationSet {\n'; if (genSet.isDisjoint) fact += ' disjoint[' + children.join(',') + ']\n'; - if (genSet.isComplete) fact += ' ' + normalizeName(transformer, parent) + ' = ' + children.join('+') + '\n'; + if (genSet.isComplete) fact += ' ' + getNormalizedName(transformer, parent) + ' = ' + children.join('+') + '\n'; fact += '}'; transformer.addFact(fact); diff --git a/src/libs/ontouml2alloy/property_functions.ts b/src/libs/ontouml2alloy/property_functions.ts index afeb2bfc..a724883f 100644 --- a/src/libs/ontouml2alloy/property_functions.ts +++ b/src/libs/ontouml2alloy/property_functions.ts @@ -1,7 +1,7 @@ import { Property, Class, Relation } from '@libs/ontouml'; import { Ontouml2Alloy } from '.'; import { - normalizeName, + getNormalizedName, getCardinalityKeyword, isCustomCardinality, getCustomCardinality, @@ -39,9 +39,9 @@ export function transformProperty(transformer: Ontouml2Alloy, property: Property } function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Property) { - const attributeName = normalizeName(transformer, attribute); - const ownerClassName = normalizeName(transformer, attribute.container); - const datatypeName = normalizeName(transformer, attribute.propertyType); + const attributeName = getNormalizedName(transformer, attribute); + const ownerClassName = getNormalizedName(transformer, attribute.container); + const datatypeName = getNormalizedName(transformer, attribute.propertyType); const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); transformer.addWorldFieldDeclaration( @@ -69,9 +69,9 @@ function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Proper } function transformGeneralAttribute(transformer: Ontouml2Alloy, attribute: Property) { - const attributeName = normalizeName(transformer, attribute); - const ownerClassName = normalizeName(transformer, attribute.container); - const datatypeName = normalizeName(transformer, attribute.propertyType); + const attributeName = getNormalizedName(transformer, attribute); + const ownerClassName = getNormalizedName(transformer, attribute.container); + const datatypeName = getNormalizedName(transformer, attribute.propertyType); const cardinality = getCardinalityKeyword(attribute.cardinality); const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); @@ -124,21 +124,21 @@ function transformRelationSourceEnd(transformer: Ontouml2Alloy, sourceEnd: Prope let relationName = ''; if (sourceEnd.container.getName()) { - relationName = normalizeName(transformer, sourceEnd.container); + relationName = getNormalizedName(transformer, sourceEnd.container); } else { relationName = getValidAlias(sourceEnd.container, 'relation', transformer.aliases); } - const sourceName = normalizeName(transformer, (sourceEnd.container as Relation).getSource()); + const sourceName = getNormalizedName(transformer, (sourceEnd.container as Relation).getSource()); let sourceEndName = ''; if (sourceEnd.getName()) { - sourceEndName = normalizeName(transformer, sourceEnd); + sourceEndName = getNormalizedName(transformer, sourceEnd); } else { sourceEndName = sourceName; } - const oppositeName = normalizeName(transformer, (sourceEnd.container as Relation).getTarget()); + const oppositeName = getNormalizedName(transformer, (sourceEnd.container as Relation).getTarget()); const sourceEndAlias = getValidAlias(sourceEnd, sourceEndName, transformer.aliases); if (isMaterialConnectedToDerivation(sourceEnd.container as Relation, transformer.model.getAllRelations()) @@ -193,21 +193,21 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope let relationName = ''; if (targetEnd.container.getName()) { - relationName = normalizeName(transformer, targetEnd.container); + relationName = getNormalizedName(transformer, targetEnd.container); } else { relationName = getValidAlias(targetEnd.container, 'relation', transformer.aliases); } - const targetName = normalizeName(transformer, (targetEnd.container as Relation).getTarget()); + const targetName = getNormalizedName(transformer, (targetEnd.container as Relation).getTarget()); let targetEndName = ''; if (targetEnd.getName()) { - targetEndName = normalizeName(transformer, targetEnd); + targetEndName = getNormalizedName(transformer, targetEnd); } else { targetEndName = targetName; } - const oppositeName = normalizeName(transformer, (targetEnd.container as Relation).getSource()); + const oppositeName = getNormalizedName(transformer, (targetEnd.container as Relation).getSource()); const targetEndAlias = getValidAlias(targetEnd, targetEndName, transformer.aliases); if (isMaterialConnectedToDerivation(targetEnd.container as Relation, transformer.model.getAllRelations()) @@ -261,11 +261,11 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope } function transformDatatypeAttribute(transformer: Ontouml2Alloy, attribute: Property) { - const attributeName = normalizeName(transformer, attribute); - const ownerDatatypeName = normalizeName(transformer, attribute.container); + const attributeName = getNormalizedName(transformer, attribute); + const ownerDatatypeName = getNormalizedName(transformer, attribute.container); const ownerDatatype = getCorrespondingDatatype(ownerDatatypeName, transformer.datatypes); const cardinality = getCardinalityKeyword(attribute.cardinality); - const datatypeName = normalizeName(transformer, attribute.propertyType); + const datatypeName = getNormalizedName(transformer, attribute.propertyType); ownerDatatype[1].push((attributeName + ': ' + cardinality + ' ' + datatypeName).replace(/\s{2,}/g, ' ')); diff --git a/src/libs/ontouml2alloy/relation_functions.ts b/src/libs/ontouml2alloy/relation_functions.ts index 5620ae1f..728c210b 100644 --- a/src/libs/ontouml2alloy/relation_functions.ts +++ b/src/libs/ontouml2alloy/relation_functions.ts @@ -1,7 +1,7 @@ import { ClassStereotype, Relation, RelationStereotype } from '@libs/ontouml'; import { Ontouml2Alloy } from './'; import { - normalizeName, + getNormalizedName, getCardinalityKeyword, getValidAlias, getCustomCardinality, @@ -44,13 +44,13 @@ function transformOrderedRelation(transformer: Ontouml2Alloy, relation: Relation let relationName = ''; if (relation.getName()) { - relationName = normalizeName(transformer, relation); + relationName = getNormalizedName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = normalizeName(transformer, relation.getSource()); - const targetName = normalizeName(transformer, relation.getTarget()); + const sourceName = getNormalizedName(transformer, relation.getSource()); + const targetName = getNormalizedName(transformer, relation.getTarget()); transformer.addWorldFieldDeclaration( relationName + ': set ' + sourceName + ' set -> set Int set -> set ' + targetName @@ -68,13 +68,13 @@ function transformGeneralRelation(transformer: Ontouml2Alloy, relation: Relation let relationName = ''; if (relation.getName()) { - relationName = normalizeName(transformer, relation); + relationName = getNormalizedName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = normalizeName(transformer, relation.getSource()); - const targetName = normalizeName(transformer, relation.getTarget()); + const sourceName = getNormalizedName(transformer, relation.getSource()); + const targetName = getNormalizedName(transformer, relation.getTarget()); const sourceCardinality = getCardinalityKeyword(relation.getSourceEnd().cardinality); const targetCardinality = getCardinalityKeyword(relation.getTargetEnd().cardinality); @@ -87,12 +87,12 @@ function transformMediationRelation(transformer: Ontouml2Alloy, relation: Relati let relationName = ''; if (relation.getName()) { - relationName = normalizeName(transformer, relation); + relationName = getNormalizedName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = normalizeName(transformer, relation.getSource()); + const sourceName = getNormalizedName(transformer, relation.getSource()); transformer.addFact( 'fact acyclic {\n' + @@ -111,14 +111,14 @@ function transformMaterialRelation(transformer: Ontouml2Alloy, relation: Relatio let materialName = ''; if (relation.getName()) { - materialName = normalizeName(transformer, relation); + materialName = getNormalizedName(transformer, relation); } else { materialName = getValidAlias(relation, 'relation', transformer.aliases); } - const sourceName = normalizeName(transformer, relation.getSource()); - const targetName = normalizeName(transformer, relation.getTarget()); - const relatorName = normalizeName(transformer, rel.getDerivedClass()); + const sourceName = getNormalizedName(transformer, relation.getSource()); + const targetName = getNormalizedName(transformer, relation.getTarget()); + const relatorName = getNormalizedName(transformer, rel.getDerivedClass()); transformer.addWorldFieldDeclaration( materialName + ': set ' + sourceName + ' -> ' + relatorName + ' -> ' + targetName @@ -165,28 +165,28 @@ function transformDerivationRelation(transformer: Ontouml2Alloy, relation: Relat let materialName = ''; if (material.getName()) { - materialName = normalizeName(transformer, material); + materialName = getNormalizedName(transformer, material); } else { materialName = getValidAlias(material, 'relation', transformer.aliases); } let mediation1Name = ''; if (mediation1.getName()) { - mediation1Name = normalizeName(transformer, mediation1); + mediation1Name = getNormalizedName(transformer, mediation1); } else { mediation1Name = getValidAlias(mediation1, 'relation', transformer.aliases); } let mediation2Name = ''; if (mediation2.getName()) { - mediation2Name = normalizeName(transformer, mediation2); + mediation2Name = getNormalizedName(transformer, mediation2); } else { mediation2Name = getValidAlias(mediation2, 'relation', transformer.aliases); } - const relatorName = normalizeName(transformer, relator); - const materialSourceName = normalizeName(transformer, materialSource); - const materialTargetName = normalizeName(transformer, materialTarget); + const relatorName = getNormalizedName(transformer, relator); + const materialSourceName = getNormalizedName(transformer, materialSource); + const materialTargetName = getNormalizedName(transformer, materialTarget); transformer.addFact( 'fact derivation {\n' + @@ -201,20 +201,20 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati let relationName = ''; if (relation.getName()) { - relationName = normalizeName(transformer, relation); + relationName = getNormalizedName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } - const wholeName = normalizeName(transformer, relation.getSource()); - const partName = normalizeName(transformer, relation.getTarget()); + const wholeName = getNormalizedName(transformer, relation.getSource()); + const partName = getNormalizedName(transformer, relation.getTarget()); const wholeEnd = relation.getSourceEnd(); let wholeEndName = ''; if (wholeEnd.getName()) { - wholeEndName = normalizeName(transformer, wholeEnd); + wholeEndName = getNormalizedName(transformer, wholeEnd); } else { - wholeEndName = normalizeName(transformer, relation.getSource()); + wholeEndName = getNormalizedName(transformer, relation.getSource()); } const wholeEndAlias = getValidAlias(wholeEnd, wholeEndName, transformer.aliases); @@ -226,9 +226,9 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati const otherWholeEnd = relation.getSourceEnd(); let otherWholeEndName = ''; if (otherWholeEnd.getName()) { - otherWholeEndName = normalizeName(transformer, otherWholeEnd); + otherWholeEndName = getNormalizedName(transformer, otherWholeEnd); } else { - otherWholeEndName = normalizeName(transformer, (otherWholeEnd.container as Relation).getSource()); + otherWholeEndName = getNormalizedName(transformer, (otherWholeEnd.container as Relation).getSource()); } const otherWholeEndAlias = getValidAlias(otherWholeEnd, otherWholeEndName, transformer.aliases); @@ -263,14 +263,14 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati } function transformDatatypeRelation(transformer: Ontouml2Alloy, relation: Relation) { - const sourceName = normalizeName(transformer, relation.getSource()); - const targetName = normalizeName(transformer, relation.getTarget()); + const sourceName = getNormalizedName(transformer, relation.getSource()); + const targetName = getNormalizedName(transformer, relation.getTarget()); const sourceDatatype = getCorrespondingDatatype(sourceName, transformer.datatypes); let relationName = ''; if (relation.getName()) { - relationName = normalizeName(transformer, relation); + relationName = getNormalizedName(transformer, relation); } else { relationName = getValidAlias(relation, 'relation', transformer.aliases); } @@ -316,14 +316,15 @@ export function transformCharacterizationConstraint(transformer: Ontouml2Alloy) let characterizations = transformer.model.getAllRelationsByStereotype(RelationStereotype.CHARACTERIZATION) .map(characterization => { if (characterization.getName()) { - return 'w.' + normalizeName(transformer, characterization); + return 'w.' + getNormalizedName(transformer, characterization); } else { return 'w.' + getValidAlias(characterization, 'relation', transformer.aliases); } }); + if (characterizations.length) { let intrinsicMoments = [... new Set([...transformer.model.getClassesRestrictedToIntrinsicMode(), ...transformer.model.getClassesRestrictedToQuality()])] - .map(moment => 'w.' + normalizeName(transformer, moment)); + .map(moment => 'w.' + getNormalizedName(transformer, moment)); if (intrinsicMoments.length) { transformer.addFact( 'fact acyclicCharacterizations {\n' + diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index 064e1ed4..1e320096 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -19,7 +19,7 @@ export const forbiddenCharacters = [ ]; //TODO multi-language support -export function normalizeName(transformer: Ontouml2Alloy, element: OntoumlElement) { +export function getNormalizedName(transformer: Ontouml2Alloy, element: OntoumlElement) { if(element.id in transformer.normalizedNames){ return transformer.normalizedNames[element.id]; @@ -27,13 +27,18 @@ export function normalizeName(transformer: Ontouml2Alloy, element: OntoumlElemen let normalizedName = element.getName(); + //Check if the name is null, if so, replace it with 'Unnamed' + if(normalizedName == null) { + normalizedName = 'Unnamed'; + } + //Replace forbidden characters with an empty string forbiddenCharacters.forEach(char => { normalizedName = normalizedName.replace(new RegExp(`\\${char}`, 'g'), ''); }); //Check if the name is an empty string, if so, replace it with 'Unnamed' - if(normalizedName == ''){ + if(!normalizedName){ normalizedName = 'Unnamed'; } From b138ab3c6252d85686daf1469e32c62b9ebdd09b Mon Sep 17 00:00:00 2001 From: Asen Date: Thu, 6 Jul 2023 00:46:07 +0200 Subject: [PATCH 21/23] property_functions test, relation_functions test --- .../ontouml2alloy/class_functions.test.ts | 72 +-- .../ontouml2alloy/property_functions.test.ts | 496 ++++++++++++++++++ .../ontouml2alloy/relation_functions.test.ts | 162 +++--- src/libs/ontouml2alloy/property_functions.ts | 132 +++-- src/libs/ontouml2alloy/util.ts | 14 +- 5 files changed, 744 insertions(+), 132 deletions(-) create mode 100644 __tests__/libs/ontouml2alloy/property_functions.test.ts diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index c6b04fda..6512a4cf 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -27,7 +27,6 @@ describe('Class Functions', () => { it('should ignore classes if they are a <>', () => { model.createType('PaymentMethod') expect(generateAlloy(model)).not.toContain('PaymentMethod'); - }) it('should transform <> class with attributes (complex datatype)', () => { @@ -38,9 +37,9 @@ describe('Class Functions', () => { const result = generateAlloy(model); const factLines = ['Datatype = Number+Date','disjoint[Number,Date]']; - expect(result).toContain('sig Date in Datatype {\n day: Number\n}'); + expect(result).toContain('sig Date in Datatype {\n day: set Number\n}'); expect(result).toContain(generateFact('additionalDatatypeFacts',factLines)); - }); //default multiplicy is "one" so "day: one Number" or "day: Number" should be the same + }); it('should transform <> class without attributes (primitive datatype)', () => { model.createDatatype('Date'); @@ -60,24 +59,18 @@ describe('Class Functions', () => { it('should transform <> class', () => { const person = model.createKind('Person'); - model.createKind('Animal'); - model.createRelator('Strong'); - const entity = model.createCategory('Entity'); - model.createGeneralization( entity, person); - entity.restrictedTo = [OntologicalNature.functional_complex,OntologicalNature.relator]; const result = generateAlloy(model); expect(result).toContain(generateFact('rigid',['rigidity[Person,Object,exists]'])); expect(result).toContain(generateWorldFieldForClass('Person','Object')); expect(result).toContain(generateWorldFact('Person','Object')); - console.log(result); }); - it('should generate rigid fact for transforming <> class', () => { + it('should transform <> class', () => { model.createCollective('Group', false); const result = generateAlloy(model); expect(result).toContain(generateWorldFieldForClass('Group','Object')) - // expect(result).toContain(generateWorldFact('Group','Object')); - // expect(result).toContain(generateFact('rigid',['rigidity[Group,Object,exists]'])); + expect(result).toContain(generateWorldFact('Group','Object')); + expect(result).toContain(generateFact('rigid',['rigidity[Group,Object,exists]'])); }); //change member -> same thing -> isExtensional - false @@ -149,11 +142,12 @@ describe('Class Functions', () => { const result = generateAlloy(model); const factLines = ['Datatype = Goal+Date','disjoint[Goal,Date]']; - expect(result).toContain('sig Goal in Datatype {\n until: Date\n}'); + expect(result).toContain('sig Goal in Datatype {\n until: set Date\n}'); expect(result).toContain(generateFact('additionalDatatypeFacts',factLines)); }); - //TODO igure out if there should/needs to be a difference between the below 3 cases + //TODO figure out if there should/needs to be a difference between the below 3 cases + //TODO send email to Tiago regarding the below 3 cases it('should transform «mode» class { allowed=[intrinsic-mode] }', () => { model.createIntrinsicMode('Skill'); const result = generateAlloy(model); @@ -182,28 +176,28 @@ describe('Class Functions', () => { expect(result).toContain(generateWorldFact('Belief','Aspect')); }); - // it('should transform «roleMixin» class', () => { - // model.createRoleMixin('Customer',); - // const result = generateAlloy(model); - - // expect(result).toContain(''); - // console.log(result); - // });//diff between roleMIxin and role? - - // it('should transform «phaseMixin» class', () => { - // model.createPhaseMixin('Infant'); - // const result = generateAlloy(model); - - // expect(result).toContain(''); - // });//diff between phaseMixin and phase - - // it('should transform «mixin» class', () => { - // model.createMixin('Seatable'); - // const result = generateAlloy(model); + //role is for dynamic types, we instantiate by individuals of a single type.. + //role antirigid sortal, rolemixin antirigid sortal + + //there is no difference between the transformation of a role and a roleMixin + it('should transform «roleMixin» class', () => { + model.createRoleMixin('Customer',); + const result = generateAlloy(model); + + expect(result).toContain(generateFact('antirigid',['antirigidity[Customer,Object,exists]'])); + expect(result).toContain(generateWorldFieldForClass('Customer','Object')); + expect(result).toContain(generateWorldFact('Customer','Object')); + }); - // expect(result).toContain(''); - // }); - //what is expected with the mixins, semirigid? + //there is no difference between the transformation of a phase and a phaseMixin + it('should transform «phaseMixin» class', () => { + model.createPhaseMixin('Infant'); + const result = generateAlloy(model); + + expect(result).toContain(generateFact('antirigid',['antirigidity[Infant,Object,exists]'])); + expect(result).toContain(generateWorldFieldForClass('Infant','Object')); + expect(result).toContain(generateWorldFact('Infant','Object')); + }); it('should transform «category» class', () => { model.createCategory('Animal'); @@ -214,6 +208,14 @@ describe('Class Functions', () => { expect(result).toContain(generateWorldFact('Animal','Object')); }); + //TODO figure out how to handle mixins + // it('should transform «mixin» class', () => { + // model.createMixin('Seatable'); + // const result = generateAlloy(model); + + // expect(result).toContain(''); + // }); + }); }); diff --git a/__tests__/libs/ontouml2alloy/property_functions.test.ts b/__tests__/libs/ontouml2alloy/property_functions.test.ts new file mode 100644 index 00000000..f0fe3481 --- /dev/null +++ b/__tests__/libs/ontouml2alloy/property_functions.test.ts @@ -0,0 +1,496 @@ +import { Ontouml2Alloy } from '@libs/ontouml2alloy/index'; +import { generateAlloy, generateFact, generateFun, generateWorldFieldForClass, generateWorldFieldForRelation, generateWorldFact } from './helpers'; +import { Class, ClassStereotype, Relation, Package, Project, Property, OntoumlType, AggregationKind, stereotypeUtils, OntologicalNature } from '@libs/ontouml'; + + +describe('property_functions', () => { + + let project: Project; + let model: Package; + let transformer: Ontouml2Alloy; + + beforeEach(() => { + project = new Project(); + model = project.createModel(); + }); + + describe('datatype properties', () => { + + it('should transform an attribute of a datatype with default (zero-to-many) multiplicity', () => { + const Date = model.createDatatype('Date'); + const Integer = model.createDatatype('Integer'); + Date.createAttribute(Integer, 'day'); + + const result = generateAlloy(model); + + expect(result).toContain('sig Date in Datatype {\n day: set Integer\n}'); + }); + + it('should transform an attribute of a datatype with one-to-many multiplicity', () => { + const Invoice = model.createDatatype('Invoice'); + const InvoiceLine = model.createDatatype('InvoiceLine'); + const lines = Invoice.createAttribute(InvoiceLine, 'lines'); + lines.cardinality.setOneToMany(); + + const result = generateAlloy(model); + + expect(result).toContain('sig Invoice in Datatype {\n lines: some InvoiceLine\n}'); + }); + + it('should transform an attribute of a datatype with zero-to-one multiplicity', () => { + const User = model.createDatatype('User'); + const Name = model.createDatatype('Name'); + const middleName = User.createAttribute(Name, 'middleName'); + middleName.cardinality.setZeroToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('sig User in Datatype {\n middleName: lone Name\n}'); + }); + + it('should transform an attribute of a datatype with one-to-one multiplicity', () => { + const Person = model.createDatatype('Person'); + const Date = model.createDatatype('Date'); + const dob = Person.createAttribute(Date, 'dateOfBirth'); + // dob.cardinality.setLowerBoundFromNumber(1); + // dob.cardinality.setUpperBoundFromNumber(1); + dob.cardinality.setOneToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('sig Person in Datatype {\n dateOfBirth: one Date\n}'); + }); + + it('should transform an attribute of a datatype with custom (28..31) multiplicity', () => { + const Month = model.createDatatype('Month'); + const Day = model.createDatatype('Day'); + const days = Month.createAttribute(Day, 'days'); + days.cardinality.setLowerBoundFromNumber(28); + days.cardinality.setUpperBoundFromNumber(31); + + const result = generateAlloy(model); + + expect(result).toContain('sig Month in Datatype {\n days: Day\n}'); + expect(result).toContain(generateFact('multiplicity', ['all x: Month | #x.days>=28 and #x.days<=31'])); + }); + + it('should transform an attribute of a datatype with exact number (3..3) multiplicity)', () => { + const Triangle = model.createDatatype('Triangle'); + const Side = model.createDatatype('Side'); + const sides = Triangle.createAttribute(Side, 'sides'); + sides.cardinality.setLowerBoundFromNumber(3); + sides.cardinality.setUpperBoundFromNumber(3); + + const result = generateAlloy(model); + + expect(result).toContain('sig Triangle in Datatype {\n sides: Side\n}'); + expect(result).toContain(generateFact('multiplicity', ['all x: Triangle | #x.sides=3'])); + }); + + it('should generate "datatypesMultiplicity fact for a relation between datatypes with default cardinality', () => { + const sourceClass = model.createDatatype('Date'); + const targetClass = model.createDatatype('String'); + const relation = model.createBinaryRelation(sourceClass, targetClass); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('datatypesMultiplicity', ['all x: Date | #x.relation1>=0', 'all x: String | #relation1.x>=0'])); + }); + + it('should generate "datatypesMultiplicity fact for a relation between datatypes with custom cardinality', () => { + const Patient = model.createDatatype('Patient'); + const HealthRecord = model.createDatatype('HealthRecord'); + const hasHealthRecord = model.createBinaryRelation(Patient, HealthRecord, 'hasHealthRecord'); + + hasHealthRecord.getTargetEnd().cardinality.setLowerBoundFromNumber(1); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('datatypesMultiplicity', ['all x: Patient | #x.hasHealthRecord>=1', 'all x: HealthRecord | #hasHealthRecord.x>=0'])); + }); + + + }); + + describe('class attributes', () => { + //TODO derivation relation check + it('should generate an "immutable_target" for a read-only attribute', () => { + const person = model.createKind('Person'); + const string = model.createDatatype('String'); + const name = person.createAttribute(string, 'name'); + name.isReadOnly = true; // indicating that the name attribute is read-only + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('relationProperties', ['immutable_target[Person,name]'])); + }); + + describe('ordered attributes', () => { + + it('should generate an "ordering" fact for an ordered attribute', () => { + const playlist = model.createKind('Playlist'); + const song = model.createDatatype('Song'); + const songs = playlist.createAttribute(song, 'songs'); + songs.isOrdered = true; // indicating that the songs in the playlist are ordered + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('ordering', ['all w: World, x: w.Playlist | isSeq[x.(w.songs)]', 'all w: World, x: w.Playlist, y: w.Playlist | lone x.((w.songs).y)'])); + }); + + it('should transform an ordered attribute of a class with default (zero-to-many) multiplicity', () => { + const playlist = model.createKind('Playlist'); + const song = model.createDatatype('Song'); + const songs = playlist.createAttribute(song, 'songs'); + songs.isOrdered = true; // indicating that the songs in the playlist are ordered + + const result = generateAlloy(model); + + expect(result).toContain('songs: set Playlist set -> set Int set -> set Song'); + expect(result).toContain('fun songs1 [x: World.Playlist, w: World] : set Song {\n x.(w.songs)\n}'); + }); + + it('should transform an ordered attribute of a class with one-to-many multiplicity', () => { + const Course = model.createKind('Course'); + const Topic = model.createDatatype('Topic'); + const topics = Course.createAttribute(Topic, 'topics'); + topics.isOrdered = true; + topics.cardinality.setOneToMany(); + + const result = generateAlloy(model); + + expect(result).toContain('topics: set Course set -> set Int set -> some Topic'); + expect(result).toContain('fun topics1 [x: World.Course, w: World] : set Topic {\n x.(w.topics)\n}'); + }); + + it('should transform an ordered attribute of a class with zero-to-one multiplicity', () => { + const Project = model.createKind('Project'); + const Milestone = model.createDatatype('Milestone'); + const nextMilestone = Project.createAttribute(Milestone, 'nextMilestone'); + nextMilestone.isOrdered = true; + nextMilestone.cardinality.setZeroToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('nextMilestone: set Project set -> set Int set -> lone Milestone'); + expect(result).toContain('fun nextMilestone1 [x: World.Project, w: World] : set Milestone {\n x.(w.nextMilestone)\n}'); + }); + + it('should transform an ordered attribute of a class with one-to-one multiplicity', () => { + const Student = model.createKind('Student'); + const Task = model.createDatatype('Task'); + const currentTask = Student.createAttribute(Task, 'currentTask'); + currentTask.isOrdered = true; + currentTask.cardinality.setOneToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('currentTask: set Student set -> set Int set -> one Task'); + expect(result).toContain('fun currentTask1 [x: World.Student, w: World] : set Task {\n x.(w.currentTask)\n}'); + }); + + it('should generate a "multiplicity" fact for an ordered attribute with exact range (2..2) multiplicity', () => { + const Person = model.createKind('Person'); + const ContactInformation = model.createDatatype('ContactInformation'); + const contactInformation = Person.createAttribute(ContactInformation, 'contactInformation'); + contactInformation.isOrdered = true; + contactInformation.cardinality.setLowerBoundFromNumber(2); // setting the lower bound of the cardinality to 2 + contactInformation.cardinality.setUpperBoundFromNumber(2); // setting the upper bound of the cardinality to 2 + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Person | #contactInformation1[x,w]=2'])); + }); + + it('should generate a "multiplicity" fact for an ordered attribute with custom cardinlaity', () => { + const playlist = model.createKind('Playlist'); + const song = model.createDatatype('Song'); + const songs = playlist.createAttribute(song, 'songs'); + songs.isOrdered = true; // indicating that the songs in the playlist are ordered + + songs.cardinality.setLowerBoundFromNumber(1); + songs.cardinality.setUpperBoundFromNumber(31); //playlist needs to have between 1 and 31 songs + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Playlist | #songs1[x,w]>=1 and #songs1[x,w]<=31'])); + }); + }); + + describe('unordered attributes', () => { + + it('should transform an unordered attribute with default (zero-to-many) multiplicity', () => { + const bag = model.createKind('Bag'); + const item = model.createDatatype('Item'); + const items = bag.createAttribute(item, 'items'); + + const result = generateAlloy(model); + + expect(result).toContain('items: set Bag set -> set Item'); + expect(result).toContain('fun items1 [x: World.Bag, w: World] : set Item {\n x.(w.items)\n}') + }); + + it('should transform an unordered attribute with one-to-many multiplicity', () => { + const Family = model.createKind('Family'); + const Member = model.createKind('Member'); + const members = Family.createAttribute(Member, 'members'); + members.cardinality.setOneToMany(); + + const result = generateAlloy(model); + + expect(result).toContain('members: set Family set -> some Member'); + expect(result).toContain('fun members1 [x: World.Family, w: World] : set Member {\n x.(w.members)\n}'); + }); + + + it('should transform an unordered attribute of a class with zero-to-one multiplicity', () => { + const Person = model.createKind('Person'); + const Spouse = model.createKind('Spouse'); + const spouse = Person.createAttribute(Spouse, 'spouse'); + spouse.cardinality.setZeroToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('spouse: set Person set -> lone Spouse'); + expect(result).toContain('fun spouse1 [x: World.Person, w: World] : set Spouse {\n x.(w.spouse)\n}'); + }); + + it('should transform an unordered attribute of a class with one-to-one multiplicity', () => { + const Car = model.createKind('Car'); + const Engine = model.createKind('Engine'); + const engine = Car.createAttribute(Engine, 'engine'); + engine.cardinality.setOneToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('engine: set Car set -> one Engine'); + expect(result).toContain('fun engine1 [x: World.Car, w: World] : set Engine {\n x.(w.engine)\n}'); + }); + + it('should generate a "multiplicity" fact for an unordered attribute with exact range (2..2) multiplicity', () => { + const person = model.createKind('Person'); + const address = model.createDatatype('address'); + const homeAddress = person.createAttribute(address, 'homeAddress'); + homeAddress.cardinality.setLowerBoundFromNumber(2); // setting the lower bound of the cardinality to 2 + homeAddress.cardinality.setUpperBoundFromNumber(2); // setting the upper bound of the cardinality to 2 + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Person | #homeAddress1[x,w]=2'])); + }); + + it('should generate a "multiplicity" fact for an unordered attribute with custom (1..3) multiplicity', () => { + const person = model.createKind('Person'); + const address = model.createDatatype('address'); + const homeAddress = person.createAttribute(address, 'homeAddress'); + homeAddress.cardinality.setLowerBoundFromNumber(1); // setting the lower bound of the cardinality to 1 + homeAddress.cardinality.setUpperBoundFromNumber(3); // setting the upper bound of the cardinality to 3 + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Person | #homeAddress1[x,w]>=1 and #homeAddress1[x,w]<=3'])); + }); + + }); + + }); + + describe('relation ends', () => { + + describe('source end', () => { + + it('should transform a source end with default (zero-to-many) cardinality', () => { + const Order = model.createKind('Order'); + const Product = model.createKind('Product'); + const contains = model.createBinaryRelation(Order, Product, 'contains'); + + const result = generateAlloy(model); + + expect(result).toContain('contains: set Order set -> set Product'); + expect(result).toContain('fun Order1 [x: World.Product, w: World] : set World.Order {\n (w.contains).x\n}') + }); + + it('should transform a source end with one-to-many cardinality', () => { + const Employer = model.createKind('Employer'); + const Employee = model.createKind('Employee'); + const employs = model.createBinaryRelation(Employer, Employee, 'employs'); + employs.getSourceEnd().cardinality.setOneToMany(); + + const result = generateAlloy(model); + + expect(result).toContain('employs: set Employer some -> set Employee'); + expect(result).toContain('fun Employer1 [x: World.Employee, w: World] : set World.Employer {\n (w.employs).x\n}') + }); + + it('should transform a source end with zero-to-one cardinality', () => { + const Person = model.createKind('Person'); + const House = model.createKind('House'); + const livesIn = model.createBinaryRelation(Person, House, 'livesIn'); + livesIn.getSourceEnd().cardinality.setZeroToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('livesIn: set Person lone -> set House'); + expect(result).toContain('fun Person1 [x: World.House, w: World] : set World.Person {\n (w.livesIn).x\n}') + }); + + it('should transform a source end with one-to-one cardinality', () => { + const Husband = model.createKind('Husband'); + const Wife = model.createKind('Wife'); + const marriedTo = model.createBinaryRelation(Husband, Wife, 'marriedTo'); + marriedTo.getSourceEnd().cardinality.setOneToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('marriedTo: set Husband one -> set Wife'); + expect(result).toContain('fun Husband1 [x: World.Wife, w: World] : set World.Husband {\n (w.marriedTo).x\n}') + }); + + it('should transform a source end with exact number cardinality', () => { + const Team = model.createKind('Team'); + const Player = model.createKind('Player'); + const hasPlayers = model.createBinaryRelation(Team, Player, 'hasPlayers'); + hasPlayers.getSourceEnd().cardinality.setCardinalityFromNumbers(11, 11); + + const result = generateAlloy(model); + + expect(result).toContain('hasPlayers: set Team -> set Player'); + expect(result).toContain('fun Team1 [x: World.Player, w: World] : set World.Team {\n (w.hasPlayers).x\n}') + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Player | #Team1[x,w]=11'])); + }); + + it('should transform a source end with specific range cardinality', () => { + const Course = model.createKind('Course'); + const Student = model.createKind('Student'); + const enrolled = model.createBinaryRelation(Course, Student, 'enrolled'); + enrolled.getSourceEnd().cardinality.setCardinalityFromNumbers(1, 50); + + const result = generateAlloy(model); + + expect(result).toContain('enrolled: set Course -> set Student'); + expect(result).toContain('fun Course1 [x: World.Student, w: World] : set World.Course {\n (w.enrolled).x\n}') + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Student | #Course1[x,w]>=1 and #Course1[x,w]<=50'])); + }); + + it('should generate an "immutable_source" for a read-only source end of a relation', () => { + const Person = model.createKind('Person'); + const Car = model.createKind('Car'); + const owns = model.createBinaryRelation(Person, Car, 'owns'); + owns.getSourceEnd().isReadOnly = true; + const result = generateAlloy(model); + expect(result).toContain(generateFact('relationProperties', ['immutable_source[Car,owns]'])); + }); + + + }); + + describe('target end', () => { + + it('should transform a target end with default (zero-to-many) cardinality', () => { + const Order = model.createKind('Order'); + const Product = model.createKind('Product'); + const contains = model.createBinaryRelation(Order, Product, 'contains'); + + const result = generateAlloy(model); + + expect(result).toContain('contains: set Order set -> set Product'); + expect(result).toContain('fun Product1 [x: World.Order, w: World] : set World.Product {\n x.(w.contains)\n}'); + }); + + it('should transform a target end with one-to-many cardinality', () => { + const Employer = model.createKind('Employer'); + const Employee = model.createKind('Employee'); + const employs = model.createBinaryRelation(Employer, Employee, 'employs'); + employs.getTargetEnd().cardinality.setOneToMany(); + + const result = generateAlloy(model); + + expect(result).toContain('employs: set Employer set -> some Employee'); + expect(result).toContain('fun Employee1 [x: World.Employer, w: World] : set World.Employee {\n x.(w.employs)\n}'); + }); + + it('should transform a target end with zero-to-one cardinality', () => { + const Person = model.createKind('Person'); + const House = model.createKind('House'); + const livesIn = model.createBinaryRelation(Person, House, 'livesIn'); + livesIn.getTargetEnd().cardinality.setZeroToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('livesIn: set Person set -> lone House'); + expect(result).toContain('fun House1 [x: World.Person, w: World] : set World.House {\n x.(w.livesIn)\n}'); + }); + + it('should transform a target end with one-to-one cardinality', () => { + const Husband = model.createKind('Husband'); + const Wife = model.createKind('Wife'); + const marriedTo = model.createBinaryRelation(Husband, Wife, 'marriedTo'); + marriedTo.getTargetEnd().cardinality.setOneToOne(); + + const result = generateAlloy(model); + + expect(result).toContain('marriedTo: set Husband set -> one Wife'); + expect(result).toContain('fun Wife1 [x: World.Husband, w: World] : set World.Wife {\n x.(w.marriedTo)\n}'); + }); + + it('should transform a target end with exact number cardinality', () => { + const Team = model.createKind('Team'); + const Player = model.createKind('Player'); + const hasPlayers = model.createBinaryRelation(Team, Player, 'hasPlayers'); + hasPlayers.getTargetEnd().cardinality.setCardinalityFromNumbers(11, 11); + + const result = generateAlloy(model); + + expect(result).toContain('hasPlayers: set Team set -> Player'); //perhhaps better to have a 'set' before 'Player' + expect(result).toContain('fun Player1 [x: World.Team, w: World] : set World.Player {\n x.(w.hasPlayers)\n}'); + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Team | #Player1[x,w]=11'])); + }); + + it('should transform a target end with specific range cardinality', () => { + const Course = model.createKind('Course'); + const Student = model.createKind('Student'); + const enrolled = model.createBinaryRelation(Course, Student, 'enrolled'); + enrolled.getTargetEnd().cardinality.setCardinalityFromNumbers(1, 50); + + const result = generateAlloy(model); + + expect(result).toContain('enrolled: set Course set -> Student'); //perhaps better to have a 'set' before 'Student' + expect(result).toContain('fun Student1 [x: World.Course, w: World] : set World.Student {\n x.(w.enrolled)\n}'); + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Course | #Student1[x,w]>=1 and #Student1[x,w]<=50'])); + }); + + it('should generate an "immutable_target" for a read-only target end of a relation', () => { + const Person = model.createKind('Person'); + const Car = model.createKind('Car'); + const owns = model.createBinaryRelation(Person, Car, 'owns'); + owns.getTargetEnd().isReadOnly = true; + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('relationProperties', ['immutable_target[Person,owns]'])); + }); + + }); + + it('should generate multiplicity facts for a material relation (connected to a derivation) despite non-custom cardinality', () => { + const organization = model.createKind('Organization'); + const employee = model.createRole('Employee'); + const employment = model.createRelator('Employment'); + const materialRelation = model.createMaterialRelation(organization, employee, 'hires'); + model.createMediationRelation(employment, organization); + model.createMediationRelation(employment, employee); + model.createDerivationRelation(materialRelation, employment); + + const result = generateAlloy(model); + expect(result).toContain('hires: set Organization -> Employment -> Employee'); + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Employee | #Organization2[x,w]>=1'])); + expect(result).toContain(generateFact('multiplicity', ['all w: World, x: w.Organization | #Employee2[x,w]>=0'])); + }); + + + }); + + + + +}); \ No newline at end of file diff --git a/__tests__/libs/ontouml2alloy/relation_functions.test.ts b/__tests__/libs/ontouml2alloy/relation_functions.test.ts index 475c9cf0..9d947650 100644 --- a/__tests__/libs/ontouml2alloy/relation_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/relation_functions.test.ts @@ -14,7 +14,6 @@ describe('relation_functions', () => { model = project.createModel(); }); - //cardinality under question it('should transform a relation between datatypes', () => { const sourceClass = model.createDatatype('Date'); const targetClass = model.createDatatype('String'); @@ -22,37 +21,91 @@ describe('relation_functions', () => { const result = generateAlloy(model); - console.log(result); - expect(result).toContain('sig Date in Datatype {\n relation1: String\n}'); - expect(result).toContain(generateFact('datatypesMultiplicity',['all x: Date | #x.relation1>=0','all x: String | #relation1.x>=0'])); + expect(result).toContain('sig Date in Datatype {\n relation1: String\n}'); }); - //TODO test material relation with no derivation, material relation with derivation - the case below to check the main; another test case to test for derivation fact - it('should transform a derivation relation', () => { - const class1 = model.createKind('Person'); - const class2 = model.createRelator('Marriage'); - const relation = model.createMaterialRelation(class1, class1, 'married to'); - model.createMediationRelation(class2, class1, 'mediates'); - model.createDerivationRelation(relation, class2, 'derived from'); + it('should transform a material relation', () => { + const class1 = model.createKind('Book'); + const class2 = model.createKind('Author'); + const relation = model.createMaterialRelation(class1, class2, 'writtenBy'); + + const result = generateAlloy(model); + + expect(result).toContain('writtenBy: set Book set -> set Author'); + }); + + it('should generate a World field for a derivation relation from material relation', () => { + const organization = model.createKind('Organization'); + const employee = model.createRole('Employee'); + const employment = model.createRelator('Employment'); + const materialRelation = model.createMaterialRelation(organization, employee, 'hires'); + model.createMediationRelation(employment, organization); + model.createMediationRelation(employment, employee); + model.createDerivationRelation(materialRelation, employment); + + const result = generateAlloy(model); + expect(result).toContain('hires: set Organization -> Employment -> Employee'); + }); + + it('should generate a derivation fact for a derivation relation from material relation', () => { + const organization = model.createKind('Organization'); + const employee = model.createRole('Employee'); + const employment = model.createRelator('Employment'); + const materialRelation = model.createMaterialRelation(organization, employee, 'hires'); + model.createMediationRelation(employment, organization); + model.createMediationRelation(employment, employee); + model.createDerivationRelation(materialRelation, employment); const result = generateAlloy(model); + expect(result).toContain(generateFact('derivation',['all w: World, x: w.Organization, y: w.Employee, r: w.Employment | ',' x -> r -> y in w.hires iff x in r.(w.relation1) and y in r.(w.relation2)'])); }); - it('should transform a mediation relation', () => { + // //not handled but also not sure what's the expected output + // it('derivation relation from comparative relation', () => { + // const organization = model.createKind('Organization'); + // const employee = model.createRole('Employee'); + // const employment = model.createRelator('Employment'); + // const materialRelation = model.createComparativeRelation(organization, employee, 'hires'); + // model.createCharacterizationRelation(employment, organization); + // model.createCharacterizationRelation(employment, employee); + // model.createDerivationRelation(materialRelation, employment); + + // const result = generateAlloy(model); + // //there should be a fact containing this below + // "all w: World, x, y: w.Person | some x.(w.CHARACTERIZATION_RELATION_NAME) and some y.(w.CHARACTERIZATION_RELATION_NAME) implies (x in y.(w.COMPARATIVE_RELATION_NAME) or y in x.(w.COMPARATIVE_RELATION_NAME))" + // }) + + it('should generate World field for mediation relation', () => { const class1 = model.createRelator('Enrollment'); const class2 = model.createRole('Student'); model.createMediationRelation(class1, class2, 'involves'); const result = generateAlloy(model); - - console.log(result); - expect(result).toContain(generateWorldFieldForRelation('involves', 'Enrollment', 'Student', 'set', 'one')); - expect(result).toContain(generateFact('relatorConstraint',['all w: World, x: w.Enrollment | #(Student1[x,w])>=2'])); //ensures that there are at least two 'Student' related to each 'Enrollment'. - expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.involves,w.Enrollment]'])); //ensures that 'involves' relation is acyclic for 'Enrollment', i.e., it does not loop back on itself. - expect(result).toContain(generateFun('Enrollment1','Student','Enrollment','(w.involves).x')); //part of property test? - expect(result).toContain(generateFun('Student1','Enrollment','Student','x.(w.involves)')); //part of property test? - expect(result).toContain(generateFact('relationProperties', ['immutable_target[Enrollment,involves]'])); //part of property test? + + expect(result).toContain('involves: set Enrollment some -> one Student'); + }); + + it('should generate relator constraint for mediation relation', () => { + const class1 = model.createRelator('Enrollment'); + const class2 = model.createRole('Student'); + + model.createMediationRelation(class1, class2, 'involves'); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('relatorConstraint',['all w: World, x: w.Enrollment | #(Student1[x,w])>=2'])); + }); + + it('should ensure mediation relation is acyclic', () => { + const class1 = model.createRelator('Enrollment'); + const class2 = model.createRole('Student'); + + model.createMediationRelation(class1, class2, 'involves'); + + const result = generateAlloy(model); + + expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.involves,w.Enrollment]'])); }); it('should generate relator rule for 2 mediation relations', () => { @@ -61,67 +114,56 @@ describe('relation_functions', () => { const class3 = model.createKind('University'); const rel1 = model.createMediationRelation(class1, class2, 'involvesStudent'); - rel1.getTargetEnd().setName('Student10'); - const rel2 = model.createMediationRelation(class1, class3, 'involvesUniveristy'); - rel2.getTargetEnd().setName('University110'); const result = generateAlloy(model); - console.log(result); - expect(result).toContain(generateFact('relatorConstraint',['all w: World, x: w.Enrollment | #(Student1[x,w])>=2'])); //ensures that there are at least two 'Student' related to each 'Enrollment'. + expect(result).toContain(generateFact('relatorConstraint',['all w: World, x: w.Enrollment | #(Student1[x,w]+University1[x,w])>=2'])); }); - //there is no case handling this particular type of relation so dunno if it's correct it('should transform a characterization relation', () => { - const class1 = model.createExtrinsicMode('Love'); const class2 = model.createKind('Person'); - model.createCharacterizationRelation(class1, class2, 'inside'); const result = generateAlloy(model); - console.log(result); - expect(result).toContain(generateWorldFieldForRelation('inside', 'Enrollment', 'Student', 'set', 'one')); - expect(result).toContain(generateFun('Enrollment1','Student','Enrollment','(w.involves).x')); //part of property test? - expect(result).toContain(generateFun('Student1','Enrollment','Student','x.(w.involves)')); //part of property test? - expect(result).toContain(generateFact('relationProperties', ['immutable_target[Enrollment,involves]'])); //part of property test? + expect(result).toContain('inside: set Love one -> one Person'); }); - it('should transform a material relation', () => { - const class1 = model.createKind('Book'); - const class2 = model.createKind('Author'); - const relation = model.createMaterialRelation(class1, class2, 'writtenBy'); + + it('should generate a World field for a part-whole relation', () => { + const wholeClass = model.createKind('Car'); + const partClass = model.createKind('Engine'); + const relation = model.createPartWholeRelation(wholeClass, partClass, 'hasEngine'); + + const result = generateAlloy(model); + + expect(result).toContain(generateWorldFieldForRelation('hasEngine', 'Car', 'Engine', 'set', 'one')); + }); - const result = generateAlloy(model); + it('should generate an acyclic fact for a part-whole relation', () => { + const wholeClass = model.createKind('Car'); + const partClass = model.createKind('Engine'); + const relation = model.createPartWholeRelation(wholeClass, partClass, 'hasEngine'); + + const result = generateAlloy(model); - expect(result).toContain(generateWorldFieldForRelation('writtenBy', 'Book', 'Author', 'set', '')); - expect(result).toContain(generateFun('Book1','Author','Book','(w.writtenBy).x')); //part of property test? - expect(result).toContain(generateFun('Author1','Book','Author','x.(w.writtenBy)')); //part of property test? -}); + expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.hasEngine,w.Car]'])); + }); - it('should transform a part-whole relation', () => { - const wholeClass = model.createKind('Car'); - const partClass = model.createKind('Engine'); - const relation = model.createPartWholeRelation(wholeClass, partClass, 'hasEngine'); + it('should transform a reflexive relation', () => { + const personClass = model.createKind('Person'); + const relation = model.createBinaryRelation(personClass, personClass, 'friend'); + + const result = generateAlloy(model); + + expect(result).toContain('friend: set Person set -> set Person'); + }); + - const result = generateAlloy(model); - expect(result).toContain(generateWorldFieldForRelation('hasEngine', 'Car', 'Engine', 'set', 'one')); - expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.hasEngine,w.Car]'])); - expect(result).toContain(generateFun('Car1','Engine','Car','(w.hasEngine).x')); //part of property test? - expect(result).toContain(generateFun('Engine1','Car','Engine','x.(w.hasEngine)')); //part of property test? - expect(result).toContain(generateFact('weakSupplementationConstraint', ['all w: World, x: w.Car | #(Engine1[x,w])>=2'])); - expect(result).toContain(generateFact('multiplicity',['all w: World, x: w.Engine | #Car1[x,w]>=2'])); //part of property test? -}); - it('derivation relation from comparative relation', () => { - - //there should be a fact containing this below - "all w: World, x, y: w.Person | some x.(w.CHARACTERIZATION_RELATION_NAME) and some y.(w.CHARACTERIZATION_RELATION_NAME) implies (x in y.(w.COMPARATIVE_RELATION_NAME) or y in x.(w.COMPARATIVE_RELATION_NAME))" - - }) }); \ No newline at end of file diff --git a/src/libs/ontouml2alloy/property_functions.ts b/src/libs/ontouml2alloy/property_functions.ts index a724883f..c92ca752 100644 --- a/src/libs/ontouml2alloy/property_functions.ts +++ b/src/libs/ontouml2alloy/property_functions.ts @@ -43,9 +43,10 @@ function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Proper const ownerClassName = getNormalizedName(transformer, attribute.container); const datatypeName = getNormalizedName(transformer, attribute.propertyType); const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); + const cardinality = getCardinalityKeyword(attribute.cardinality); transformer.addWorldFieldDeclaration( - attributeName + ': set ' + ownerClassName + ' set -> set Int set -> set ' + datatypeName + (attributeName + ': set ' + ownerClassName + ' set -> set Int set -> ' + cardinality + ' ' + datatypeName).replace(/\s{2,}/g, ' ') ); transformer.addFact( @@ -66,6 +67,42 @@ function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Proper 'immutable_target[' + ownerClassName + ',' + attributeName + ']' ); } + + if (isCustomCardinality(attribute.cardinality)) { + const [lowerBound, upperBound] = getCustomCardinality(attribute.cardinality); + + if (lowerBound && upperBound) { + if (lowerBound === upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]=' + lowerBound + '\n' + + '}' + ); + } else { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]>=' + lowerBound + ' and #' + funAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } + } else if (lowerBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]>=' + lowerBound + '\n' + + '}' + ); + } else if (upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } + } + + transformer.addVisible( + 'select13[' + attributeName + ']' + ); } function transformGeneralAttribute(transformer: Ontouml2Alloy, attribute: Property) { @@ -95,11 +132,20 @@ function transformGeneralAttribute(transformer: Ontouml2Alloy, attribute: Proper const [lowerBound, upperBound] = getCustomCardinality(attribute.cardinality); if (lowerBound && upperBound) { - transformer.addFact( - 'fact multiplicity {\n' + - ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]>=' + lowerBound + ' and #' + funAlias + '[x,w]<=' + upperBound + '\n' + - '}' - ); + if (lowerBound === upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]=' + lowerBound + '\n' + + '}' + ); + } else { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + ownerClassName + ' | #' + funAlias + '[x,w]>=' + lowerBound + ' and #' + funAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } + } else if (lowerBound) { transformer.addFact( 'fact multiplicity {\n' + @@ -116,7 +162,7 @@ function transformGeneralAttribute(transformer: Ontouml2Alloy, attribute: Proper } transformer.addVisible( - 'select13[' + attributeName +']' + 'select13[' + attributeName + ']' ); } @@ -131,10 +177,10 @@ function transformRelationSourceEnd(transformer: Ontouml2Alloy, sourceEnd: Prope const sourceName = getNormalizedName(transformer, (sourceEnd.container as Relation).getSource()); let sourceEndName = ''; - + if (sourceEnd.getName()) { sourceEndName = getNormalizedName(transformer, sourceEnd); - } else { + } else { sourceEndName = sourceName; } @@ -168,11 +214,19 @@ function transformRelationSourceEnd(transformer: Ontouml2Alloy, sourceEnd: Prope const [lowerBound, upperBound] = getCustomCardinality(sourceEnd.cardinality); if (lowerBound && upperBound) { - transformer.addFact( - 'fact multiplicity {\n' + - ' all w: World, x: w.' + oppositeName + ' | #' + sourceEndAlias + '[x,w]>=' + lowerBound + ' and #' + sourceEndAlias + '[x,w]<=' + upperBound + '\n' + - '}' - ); + if (lowerBound === upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + sourceEndAlias + '[x,w]=' + lowerBound + '\n' + + '}' + ); + } else { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + sourceEndAlias + '[x,w]>=' + lowerBound + ' and #' + sourceEndAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } } else if (lowerBound) { transformer.addFact( 'fact multiplicity {\n' + @@ -197,13 +251,13 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope } else { relationName = getValidAlias(targetEnd.container, 'relation', transformer.aliases); } - + const targetName = getNormalizedName(transformer, (targetEnd.container as Relation).getTarget()); let targetEndName = ''; - + if (targetEnd.getName()) { targetEndName = getNormalizedName(transformer, targetEnd); - } else { + } else { targetEndName = targetName; } @@ -227,7 +281,7 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope if (targetEnd.isReadOnly || (targetEnd.container as Relation).hasMediationStereotype() || (targetEnd.container as Relation).hasCharacterizationStereotype()) { - + transformer.addRelationPropertiesFact( 'immutable_target[' + oppositeName + ',' + relationName + ']' ); @@ -235,15 +289,23 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope if (isCustomCardinality(targetEnd.cardinality) || isMaterialConnectedToDerivation((targetEnd.container as Relation), transformer.model.getAllRelations())) { - + const [lowerBound, upperBound] = getCustomCardinality(targetEnd.cardinality); - + if (lowerBound && upperBound) { - transformer.addFact( - 'fact multiplicity {\n' + - ' all w: World, x: w.' + oppositeName + ' | #' + targetEndAlias + '[x,w]>=' + lowerBound + ' and #' + targetEndAlias + '[x,w]<=' + upperBound + '\n' + - '}' - ); + if (lowerBound === upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + targetEndAlias + '[x,w]=' + lowerBound + '\n' + + '}' + ); + } else { + transformer.addFact( + 'fact multiplicity {\n' + + ' all w: World, x: w.' + oppositeName + ' | #' + targetEndAlias + '[x,w]>=' + lowerBound + ' and #' + targetEndAlias + '[x,w]<=' + upperBound + '\n' + + '}' + ); + } } else if (lowerBound) { transformer.addFact( 'fact multiplicity {\n' + @@ -266,18 +328,26 @@ function transformDatatypeAttribute(transformer: Ontouml2Alloy, attribute: Prope const ownerDatatype = getCorrespondingDatatype(ownerDatatypeName, transformer.datatypes); const cardinality = getCardinalityKeyword(attribute.cardinality); const datatypeName = getNormalizedName(transformer, attribute.propertyType); - + ownerDatatype[1].push((attributeName + ': ' + cardinality + ' ' + datatypeName).replace(/\s{2,}/g, ' ')); if (isCustomCardinality(attribute.cardinality)) { const [lowerBound, upperBound] = getCustomCardinality(attribute.cardinality); if (lowerBound && upperBound) { - transformer.addFact( - 'fact multiplicity {\n' + - ' all x: ' + ownerDatatype[0] + ' | #x.' + attributeName + '>=' + lowerBound + ' and #x.' + attributeName + '<=' + upperBound + '\n' + - '}' - ); + if (lowerBound === upperBound) { + transformer.addFact( + 'fact multiplicity {\n' + + ' all x: ' + ownerDatatype[0] + ' | #x.' + attributeName + '=' + lowerBound + '\n' + + '}' + ); + } else { + transformer.addFact( + 'fact multiplicity {\n' + + ' all x: ' + ownerDatatype[0] + ' | #x.' + attributeName + '>=' + lowerBound + ' and #x.' + attributeName + '<=' + upperBound + '\n' + + '}' + ); + } } else if (lowerBound) { transformer.addFact( 'fact multiplicity {\n' + diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index 1e320096..71c095f5 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -79,17 +79,19 @@ export function isTopLevel(_class: Class, generalizations: Generalization[]) { } export function getCardinalityKeyword(cardinality: Cardinality) { - if (cardinality.isBounded()) { + // if (cardinality.isBounded()) { if (cardinality.isZeroToOne()) { return 'lone'; } else if (cardinality.isOneToOne()) { return 'one'; - } else if (cardinality.isZeroToMany()) { - return 'set'; - } else if (cardinality.isOneToMany()) { + } else if (cardinality.isOneToMany()) { return 'some'; - } - } + } + else if (cardinality.isZeroToMany()) { + return 'set'; + } + //TODO see how this affects shit + // } return ''; } From 7bc7ba7de1ca68d285128c7c2059f8370f40f31f Mon Sep 17 00:00:00 2001 From: Asen Date: Thu, 6 Jul 2023 00:57:07 +0200 Subject: [PATCH 22/23] minor fix,unsupp categorizer doesn't remove genSet --- .../alloy_name_normalization.test.ts | 15 ----------- .../ontouml2alloy/class_functions.test.ts | 2 -- .../generalization_functions.test.ts | 1 - .../generalization_set_functions.test.ts | 2 -- .../ontouml2alloy/property_functions.test.ts | 2 +- .../ontouml2alloy/remove_unsupported.test.ts | 25 ----------------- src/libs/ontouml2alloy/ontouml2alloy.ts | 27 +++++++------------ src/libs/ontouml2alloy/util.ts | 3 --- 8 files changed, 11 insertions(+), 66 deletions(-) diff --git a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts index 2a97f505..33e350cc 100644 --- a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts +++ b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts @@ -108,21 +108,6 @@ describe('Name normalization' , () => { const normalized = getNormalizedName(transformer, element); expect(normalized).toBe('class_123Person'); }); - - it('should transform a mediation relation', () => { - const class1 = model.createRelator('Enrollment'); - const class2 = model.createRole('Student'); - - model.createMediationRelation(class1, class2, 'involves'); - - const result = generateAlloy(model); - - console.log(result); - expect(result).toContain(generateFact('relatorConstraint',['all w: World, x: w.Enrollment | #(Student1[x,w])>=2'])); //ensures that there are at least two 'Student' related to each 'Enrollment'. - expect(result).toContain(generateFact('acyclic',['all w: World | acyclic[w.involves,w.Enrollment]'])); //ensures that 'involves' relation is acyclic for 'Enrollment', i.e., it does not loop back on itself. - expect(result).toContain(generateFact('relationProperties', ['immutable_target[Enrollment,involves]'])); //part of property test? - }); - }); diff --git a/__tests__/libs/ontouml2alloy/class_functions.test.ts b/__tests__/libs/ontouml2alloy/class_functions.test.ts index 6512a4cf..149c0261 100644 --- a/__tests__/libs/ontouml2alloy/class_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/class_functions.test.ts @@ -146,8 +146,6 @@ describe('Class Functions', () => { expect(result).toContain(generateFact('additionalDatatypeFacts',factLines)); }); - //TODO figure out if there should/needs to be a difference between the below 3 cases - //TODO send email to Tiago regarding the below 3 cases it('should transform «mode» class { allowed=[intrinsic-mode] }', () => { model.createIntrinsicMode('Skill'); const result = generateAlloy(model); diff --git a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts index 6425c82e..dca903f3 100644 --- a/__tests__/libs/ontouml2alloy/generalization_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_functions.test.ts @@ -46,7 +46,6 @@ describe('Generalization functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('generalization',['loves in likes'])); - console.log(result); }); }) diff --git a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts index 9e4cec98..2cab5691 100644 --- a/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/generalization_set_functions.test.ts @@ -39,7 +39,6 @@ describe('Generalization Set Functions', () => { const result = generateAlloy(model); expect(result).toContain(generateFact('generalizationSet',['disjoint[Man,Woman]','Person = Man+Woman'])); - console.log(result); }); it('disjoint - false, complete - false', () => { @@ -93,7 +92,6 @@ describe('Generalization Set Functions', () => { model.createGeneralizationSet([gen1, gen2], true, false); const result = generateAlloy(model); - expect(result).toContain(generateFact('generalizationSet', ['disjoint[ColorInRgb,ColorInHsv]'])); }); diff --git a/__tests__/libs/ontouml2alloy/property_functions.test.ts b/__tests__/libs/ontouml2alloy/property_functions.test.ts index f0fe3481..2360b55d 100644 --- a/__tests__/libs/ontouml2alloy/property_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/property_functions.test.ts @@ -113,7 +113,7 @@ describe('property_functions', () => { }); describe('class attributes', () => { - //TODO derivation relation check + it('should generate an "immutable_target" for a read-only attribute', () => { const person = model.createKind('Person'); const string = model.createDatatype('String'); diff --git a/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts b/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts index e9c03b83..47a99586 100644 --- a/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts +++ b/__tests__/libs/ontouml2alloy/remove_unsupported.test.ts @@ -13,8 +13,6 @@ describe("removeUnsupportedElements function", () => { model = project.createModel(); }); - //TODO deep copy of model - it('removes <> & connected generalizations, attributes', () => { // Add unsupported elements to the model @@ -178,29 +176,6 @@ describe("removeUnsupportedElements function", () => { expect(issues.map(issue => issue.id)).toContain(mixedGenSet.id); }); - - it('removes generalization sets with categorizers having unsupported stereotypes', () => { - const supportedParent = model.createKind('Person'); - const supportedChild1 = model.createSubkind('Man'); - const supportedChild2 = model.createSubkind('Woman'); - const unsupportedCategorizer = model.createType('CategoryType'); - - const gen1 = model.createGeneralization(supportedParent, supportedChild1); - const gen2 = model.createGeneralization(supportedParent, supportedChild2); - - const genSet1 = model.createGeneralizationSet([gen1, gen2], true, false, unsupportedCategorizer); - - const ontouml2alloy = new Ontouml2Alloy(model); - let { result, issues } = ontouml2alloy.run(); - result = ontouml2alloy.getAlloyCode()[0]; - - expect(result).not.toContain(generateFact('generalizationSet', ['disjoint[Man,Woman]'])); - - expect(issues).toBeDefined(); - expect(issues.length).toBe(2); - expect(issues.map(issue => issue.id)).toContain(genSet1.id); - }); - it('removes <> classes and retains others', () => { const typeClass = model.createType('PartyType'); const kindClass = model.createKind('Person'); diff --git a/src/libs/ontouml2alloy/ontouml2alloy.ts b/src/libs/ontouml2alloy/ontouml2alloy.ts index f841365d..a7eb55c3 100644 --- a/src/libs/ontouml2alloy/ontouml2alloy.ts +++ b/src/libs/ontouml2alloy/ontouml2alloy.ts @@ -192,26 +192,19 @@ export class Ontouml2Alloy implements Service { this.generateRemovalIssue(generalization, `Generalization '${genName}' was removed due to having an unsupported element.`); } } - + // Remove generalization sets containing unsupported elements for (const generalizationSet of generalizationSets) { - //TODO remove categorizer - let categorizerUnsupported = generalizationSet.categorizer && this.hasUnsupportedStereotype(generalizationSet.categorizer); - if (generalizationSet.generalizations.some(gen => this.hasUnsupportedStereotype(gen.specific) || this.hasUnsupportedStereotype(gen.general)) || categorizerUnsupported) { - generalizationSet.removeSelfFromContainer(); - const genSetNames = generalizationSet.generalizations.map(gen => gen.getName() || `${gen.specific.getName()} -> ${gen.general.getName()}`).join(', '); - const genSetName = generalizationSet.getName() || `{${genSetNames}}`; - - let removalDescription; - if (categorizerUnsupported) { - removalDescription = `Generalization Set '${genSetName}' was removed due to having an unsupported categorizer '${generalizationSet.categorizer.getName()}'.`; - } else { - removalDescription = `Generalization Set '${genSetName}' was removed due to containing an unsupported element.`; - } - - this.generateRemovalIssue(generalizationSet, removalDescription); + if (generalizationSet.generalizations.some(gen => this.hasUnsupportedStereotype(gen.specific) || this.hasUnsupportedStereotype(gen.general))) { + generalizationSet.removeSelfFromContainer(); + const genSetNames = generalizationSet.generalizations.map(gen => gen.getName() || `${gen.specific.getName()} -> ${gen.general.getName()}`).join(', '); + const genSetName = generalizationSet.getName() || `{${genSetNames}}`; + + const removalDescription = `Generalization Set '${genSetName}' was removed due to containing an unsupported element.`; + + this.generateRemovalIssue(generalizationSet, removalDescription); } - } + } } diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index 71c095f5..37a58df9 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -79,7 +79,6 @@ export function isTopLevel(_class: Class, generalizations: Generalization[]) { } export function getCardinalityKeyword(cardinality: Cardinality) { - // if (cardinality.isBounded()) { if (cardinality.isZeroToOne()) { return 'lone'; } else if (cardinality.isOneToOne()) { @@ -90,8 +89,6 @@ export function getCardinalityKeyword(cardinality: Cardinality) { else if (cardinality.isZeroToMany()) { return 'set'; } - //TODO see how this affects shit - // } return ''; } From 1f1ea05986430327dbb00b8769f7e94b88889a25 Mon Sep 17 00:00:00 2001 From: Asen Date: Tue, 25 Jul 2023 19:37:18 +0200 Subject: [PATCH 23/23] remove improper use of getAlias --- .../alloy_name_normalization.test.ts | 18 +++- .../ontouml2alloy/property_functions.test.ts | 2 +- .../ontouml2alloy/relation_functions.test.ts | 4 +- src/libs/ontouml2alloy/class_functions.ts | 74 ++++++++-------- src/libs/ontouml2alloy/property_functions.ts | 26 ++---- src/libs/ontouml2alloy/relation_functions.ts | 85 +++---------------- src/libs/ontouml2alloy/util.ts | 14 +-- 7 files changed, 82 insertions(+), 141 deletions(-) diff --git a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts index 33e350cc..1c0062ef 100644 --- a/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts +++ b/__tests__/libs/ontouml2alloy/alloy_name_normalization.test.ts @@ -71,14 +71,24 @@ describe('Name normalization' , () => { it('should normalize a class with no name', () => { element.addName(''); const normalized = getNormalizedName(transformer, element); - expect(normalized).toBe('Unnamed_class'); + expect(normalized).toBe('class'); }); it('should normalize a relation with no name', () => { element = new Relation(); element.addName(''); const normalized = getNormalizedName(transformer, element); - expect(normalized).toBe('Unnamed_relation'); + expect(normalized).toBe('relation'); + }); + + it('should transform a relation between datatypes', () => { + const sourceClass = model.createDatatype('Date'); + const targetClass = model.createDatatype('String'); + const relation = model.createBinaryRelation(sourceClass, targetClass); + + const result = generateAlloy(model); + + expect(result).toContain('sig Date in Datatype {\n relation: String\n}'); }); it('should normalize two classes with no name/only forbidden characters', () => { @@ -87,8 +97,8 @@ describe('Name normalization' , () => { const normalized1 = getNormalizedName(transformer, element1); const normalized2 = getNormalizedName(transformer, element2); - expect(normalized1).toBe('Unnamed_class'); - expect(normalized2).toBe('Unnamed_class1'); + expect(normalized1).toBe('class'); + expect(normalized2).toBe('class1'); }); it('should normalize two classes with same name', () => { diff --git a/__tests__/libs/ontouml2alloy/property_functions.test.ts b/__tests__/libs/ontouml2alloy/property_functions.test.ts index 2360b55d..150a7d90 100644 --- a/__tests__/libs/ontouml2alloy/property_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/property_functions.test.ts @@ -94,7 +94,7 @@ describe('property_functions', () => { const result = generateAlloy(model); - expect(result).toContain(generateFact('datatypesMultiplicity', ['all x: Date | #x.relation1>=0', 'all x: String | #relation1.x>=0'])); + expect(result).toContain(generateFact('datatypesMultiplicity', ['all x: Date | #x.relation>=0', 'all x: String | #relation.x>=0'])); }); it('should generate "datatypesMultiplicity fact for a relation between datatypes with custom cardinality', () => { diff --git a/__tests__/libs/ontouml2alloy/relation_functions.test.ts b/__tests__/libs/ontouml2alloy/relation_functions.test.ts index 9d947650..963f9cc8 100644 --- a/__tests__/libs/ontouml2alloy/relation_functions.test.ts +++ b/__tests__/libs/ontouml2alloy/relation_functions.test.ts @@ -21,7 +21,7 @@ describe('relation_functions', () => { const result = generateAlloy(model); - expect(result).toContain('sig Date in Datatype {\n relation1: String\n}'); + expect(result).toContain('sig Date in Datatype {\n relation: String\n}'); }); it('should transform a material relation', () => { @@ -57,7 +57,7 @@ describe('relation_functions', () => { model.createDerivationRelation(materialRelation, employment); const result = generateAlloy(model); - expect(result).toContain(generateFact('derivation',['all w: World, x: w.Organization, y: w.Employee, r: w.Employment | ',' x -> r -> y in w.hires iff x in r.(w.relation1) and y in r.(w.relation2)'])); + expect(result).toContain(generateFact('derivation',['all w: World, x: w.Organization, y: w.Employee, r: w.Employment | ',' x -> r -> y in w.hires iff x in r.(w.relation) and y in r.(w.relation1)'])); }); // //not handled but also not sure what's the expected output diff --git a/src/libs/ontouml2alloy/class_functions.ts b/src/libs/ontouml2alloy/class_functions.ts index 6a1f3fa2..c67eef70 100644 --- a/src/libs/ontouml2alloy/class_functions.ts +++ b/src/libs/ontouml2alloy/class_functions.ts @@ -1,14 +1,14 @@ import { Class, ClassStereotype, Relation } from '@libs/ontouml'; import { RelationStereotype } from '@libs/ontouml/model/stereotypes'; import { Ontouml2Alloy } from '.'; -import { getNormalizedName, isTopLevel, getValidAlias } from './util'; +import { getNormalizedName, isTopLevel, getAlias } from './util'; export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //This line defines a function named transformClass that takes two parameters: transformer (of type Ontouml2Alloy) and _class (of type Class). - if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION,ClassStereotype.TYPE])) { //This line checks if the given class _class has any of the stereotypes EVENT, SITUATION or TYPE. If it does, the function immediately returns without doing anything. + if (_class.hasAnyStereotype([ClassStereotype.EVENT, ClassStereotype.SITUATION, ClassStereotype.TYPE])) { //This line checks if the given class _class has any of the stereotypes EVENT, SITUATION or TYPE. If it does, the function immediately returns without doing anything. return; } - if(_class.hasAbstractStereotype()){ + if (_class.hasAbstractStereotype()) { _class.stereotype = ClassStereotype.DATATYPE; } @@ -21,7 +21,7 @@ export function transformClass(transformer: Ontouml2Alloy, _class: Class) { //Th transformEnumerationClass(transformer, _class); return; } - + if (_class.isRestrictedToEndurant()) { transformEndurantClass(transformer, _class); } @@ -70,19 +70,19 @@ function transformEndurantClass(transformer: Ontouml2Alloy, _class: Class) { className + ': set exists:>' + nature ); - if (_class.hasRigidStereotype()) { - transformer.addFact( - 'fact rigid {\n' + - ' rigidity[' + className + ',' + nature + ',exists]\n' + - '}' - ); - } else if (_class.hasAntiRigidStereotype()) { - transformer.addFact( - 'fact antirigid {\n' + - ' antirigidity[' + className + ',' + nature + ',exists]\n' + - '}' - ); - } + if (_class.hasRigidStereotype()) { + transformer.addFact( + 'fact rigid {\n' + + ' rigidity[' + className + ',' + nature + ',exists]\n' + + '}' + ); + } else if (_class.hasAntiRigidStereotype()) { + transformer.addFact( + 'fact antirigid {\n' + + ' antirigidity[' + className + ',' + nature + ',exists]\n' + + '}' + ); + } } function transformDatatypeClass(transformer: Ontouml2Alloy, _class: Class) { @@ -97,7 +97,7 @@ function transformEnumerationClass(transformer: Ontouml2Alloy, _class: Class) { if (literals.length) { transformer.addEnum( 'enum ' + enumName + ' {\n' + - ' ' + literals.join(', ') + + ' ' + literals.join(', ') + '}' ); } @@ -109,16 +109,14 @@ function transformRelatorConstraint(transformer: Ontouml2Alloy, _class: Class) { if (mediation.getSource() == _class) { const mediated = mediation.getTargetEnd(); let mediatedName = ''; - - // if (mediated.getName()) { - // mediatedName = normalizeName(transformer, mediated); - // } else { - // mediatedName = normalizeName(transformer, mediation.getTarget()); - // } + if (mediated.getName()) { + mediatedName = getNormalizedName(transformer, mediated); + } else { + mediatedName = getNormalizedName(transformer, mediation.getTarget()); + } - const mediatedAlias = getValidAlias(mediated, getNormalizedName(transformer, mediation.getTarget()), transformer.aliases); - // const mediatedAlias = getNormalizedName(transformer, mediation.getTarget()); + const mediatedAlias = getAlias(mediated, mediatedName, transformer.aliases); mediations.push(mediatedAlias + '[x,w]'); } } @@ -136,24 +134,24 @@ function transformRelatorConstraint(transformer: Ontouml2Alloy, _class: Class) { function transformWeakSupplementationConstraint(transformer: Ontouml2Alloy, _class: Class) { let parts = []; - for (const rel of transformer.model.getAllRelations()) { - if (rel.isPartWholeRelation() || rel.hasComponentOfStereotype() || rel.hasMemberOfStereotype() - || rel.hasSubCollectionOfStereotype() || rel.hasSubQuantityOfStereotype()) { - if (rel.getSource() === _class) { + for (const rel of transformer.model.getAllRelations()) { + if (rel.isPartWholeRelation() || rel.hasComponentOfStereotype() || rel.hasMemberOfStereotype() + || rel.hasSubCollectionOfStereotype() || rel.hasSubQuantityOfStereotype()) { + if (rel.getSource() === _class) { const part = rel.getTargetEnd(); let partName = ''; - + if (part.getName()) { partName = getNormalizedName(transformer, part); - } else { + } else { partName = getNormalizedName(transformer, (part.container as Relation).getTarget()); } - const partAlias = getValidAlias(part, partName, transformer.aliases); - parts.push(partAlias + '[x,w]'); - } - } - } + const partAlias = getAlias(part, partName, transformer.aliases); + parts.push(partAlias + '[x,w]'); + } + } + } if (parts.length) { const wholeName = getNormalizedName(transformer, _class); @@ -223,7 +221,7 @@ export function transformAdditionalClassConstraints(transformer: Ontouml2Alloy) transformer.addWorldFieldFact( 'exists:>Aspect in ' + aspectClasses.join('+') ); - } + } } export function transformAdditionalDatatypeConstraints(transformer: Ontouml2Alloy) { diff --git a/src/libs/ontouml2alloy/property_functions.ts b/src/libs/ontouml2alloy/property_functions.ts index c92ca752..950146b3 100644 --- a/src/libs/ontouml2alloy/property_functions.ts +++ b/src/libs/ontouml2alloy/property_functions.ts @@ -5,7 +5,7 @@ import { getCardinalityKeyword, isCustomCardinality, getCustomCardinality, - getValidAlias, + getAlias, isMaterialConnectedToDerivation, holdsBetweenDatatypes, getCorrespondingDatatype @@ -42,7 +42,7 @@ function transformOrderedAttribute(transformer: Ontouml2Alloy, attribute: Proper const attributeName = getNormalizedName(transformer, attribute); const ownerClassName = getNormalizedName(transformer, attribute.container); const datatypeName = getNormalizedName(transformer, attribute.propertyType); - const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); + const funAlias = getAlias(attribute, attributeName, transformer.aliases); const cardinality = getCardinalityKeyword(attribute.cardinality); transformer.addWorldFieldDeclaration( @@ -110,7 +110,7 @@ function transformGeneralAttribute(transformer: Ontouml2Alloy, attribute: Proper const ownerClassName = getNormalizedName(transformer, attribute.container); const datatypeName = getNormalizedName(transformer, attribute.propertyType); const cardinality = getCardinalityKeyword(attribute.cardinality); - const funAlias = getValidAlias(attribute, attributeName, transformer.aliases); + const funAlias = getAlias(attribute, attributeName, transformer.aliases); transformer.addWorldFieldDeclaration( (attributeName + ': set ' + ownerClassName + ' set -> ' + cardinality + ' ' + datatypeName).replace(/\s{2,}/g, ' ') @@ -167,13 +167,7 @@ function transformGeneralAttribute(transformer: Ontouml2Alloy, attribute: Proper } function transformRelationSourceEnd(transformer: Ontouml2Alloy, sourceEnd: Property) { - let relationName = ''; - - if (sourceEnd.container.getName()) { - relationName = getNormalizedName(transformer, sourceEnd.container); - } else { - relationName = getValidAlias(sourceEnd.container, 'relation', transformer.aliases); - } + let relationName = getNormalizedName(transformer, sourceEnd.container); const sourceName = getNormalizedName(transformer, (sourceEnd.container as Relation).getSource()); let sourceEndName = ''; @@ -185,7 +179,7 @@ function transformRelationSourceEnd(transformer: Ontouml2Alloy, sourceEnd: Prope } const oppositeName = getNormalizedName(transformer, (sourceEnd.container as Relation).getTarget()); - const sourceEndAlias = getValidAlias(sourceEnd, sourceEndName, transformer.aliases); + const sourceEndAlias = getAlias(sourceEnd, sourceEndName, transformer.aliases); if (isMaterialConnectedToDerivation(sourceEnd.container as Relation, transformer.model.getAllRelations()) || sourceEnd.isOrdered || sourceEnd.getOppositeEnd().isOrdered) { @@ -244,13 +238,7 @@ function transformRelationSourceEnd(transformer: Ontouml2Alloy, sourceEnd: Prope } function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Property) { - let relationName = ''; - - if (targetEnd.container.getName()) { - relationName = getNormalizedName(transformer, targetEnd.container); - } else { - relationName = getValidAlias(targetEnd.container, 'relation', transformer.aliases); - } + let relationName = getNormalizedName(transformer, targetEnd.container); const targetName = getNormalizedName(transformer, (targetEnd.container as Relation).getTarget()); let targetEndName = ''; @@ -262,7 +250,7 @@ function transformRelationTargetEnd(transformer: Ontouml2Alloy, targetEnd: Prope } const oppositeName = getNormalizedName(transformer, (targetEnd.container as Relation).getSource()); - const targetEndAlias = getValidAlias(targetEnd, targetEndName, transformer.aliases); + const targetEndAlias = getAlias(targetEnd, targetEndName, transformer.aliases); if (isMaterialConnectedToDerivation(targetEnd.container as Relation, transformer.model.getAllRelations()) || targetEnd.isOrdered || targetEnd.getOppositeEnd().isOrdered) { diff --git a/src/libs/ontouml2alloy/relation_functions.ts b/src/libs/ontouml2alloy/relation_functions.ts index 728c210b..352e82dd 100644 --- a/src/libs/ontouml2alloy/relation_functions.ts +++ b/src/libs/ontouml2alloy/relation_functions.ts @@ -3,10 +3,10 @@ import { Ontouml2Alloy } from './'; import { getNormalizedName, getCardinalityKeyword, - getValidAlias, getCustomCardinality, holdsBetweenDatatypes, - getCorrespondingDatatype + getCorrespondingDatatype, + getAlias } from './util'; export function transformRelation(transformer: Ontouml2Alloy, relation: Relation) { @@ -41,13 +41,7 @@ export function transformRelation(transformer: Ontouml2Alloy, relation: Relation } function transformOrderedRelation(transformer: Ontouml2Alloy, relation: Relation) { - let relationName = ''; - - if (relation.getName()) { - relationName = getNormalizedName(transformer, relation); - } else { - relationName = getValidAlias(relation, 'relation', transformer.aliases); - } + let relationName = getNormalizedName(transformer, relation); const sourceName = getNormalizedName(transformer, relation.getSource()); const targetName = getNormalizedName(transformer, relation.getTarget()); @@ -65,13 +59,7 @@ function transformOrderedRelation(transformer: Ontouml2Alloy, relation: Relation } function transformGeneralRelation(transformer: Ontouml2Alloy, relation: Relation) { - let relationName = ''; - - if (relation.getName()) { - relationName = getNormalizedName(transformer, relation); - } else { - relationName = getValidAlias(relation, 'relation', transformer.aliases); - } + let relationName = getNormalizedName(transformer, relation); const sourceName = getNormalizedName(transformer, relation.getSource()); const targetName = getNormalizedName(transformer, relation.getTarget()); @@ -84,14 +72,8 @@ function transformGeneralRelation(transformer: Ontouml2Alloy, relation: Relation } function transformMediationRelation(transformer: Ontouml2Alloy, relation: Relation) { - let relationName = ''; + let relationName = getNormalizedName(transformer, relation); - if (relation.getName()) { - relationName = getNormalizedName(transformer, relation); - } else { - relationName = getValidAlias(relation, 'relation', transformer.aliases); - } - const sourceName = getNormalizedName(transformer, relation.getSource()); transformer.addFact( @@ -108,13 +90,7 @@ function transformMaterialRelation(transformer: Ontouml2Alloy, relation: Relatio if (rel.hasDerivationStereotype() && rel.getDerivingRelation() === relation && rel.getDerivedClassStereotype() === ClassStereotype.RELATOR) { - let materialName = ''; - - if (relation.getName()) { - materialName = getNormalizedName(transformer, relation); - } else { - materialName = getValidAlias(relation, 'relation', transformer.aliases); - } + let materialName = getNormalizedName(transformer, relation); const sourceName = getNormalizedName(transformer, relation.getSource()); const targetName = getNormalizedName(transformer, relation.getTarget()); @@ -163,26 +139,9 @@ function transformDerivationRelation(transformer: Ontouml2Alloy, relation: Relat } } - let materialName = ''; - if (material.getName()) { - materialName = getNormalizedName(transformer, material); - } else { - materialName = getValidAlias(material, 'relation', transformer.aliases); - } - - let mediation1Name = ''; - if (mediation1.getName()) { - mediation1Name = getNormalizedName(transformer, mediation1); - } else { - mediation1Name = getValidAlias(mediation1, 'relation', transformer.aliases); - } - - let mediation2Name = ''; - if (mediation2.getName()) { - mediation2Name = getNormalizedName(transformer, mediation2); - } else { - mediation2Name = getValidAlias(mediation2, 'relation', transformer.aliases); - } + let materialName = getNormalizedName(transformer, material); + let mediation1Name = getNormalizedName(transformer, mediation1); + let mediation2Name = getNormalizedName(transformer, mediation2); const relatorName = getNormalizedName(transformer, relator); const materialSourceName = getNormalizedName(transformer, materialSource); @@ -198,13 +157,7 @@ function transformDerivationRelation(transformer: Ontouml2Alloy, relation: Relat } function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relation) { - let relationName = ''; - - if (relation.getName()) { - relationName = getNormalizedName(transformer, relation); - } else { - relationName = getValidAlias(relation, 'relation', transformer.aliases); - } + let relationName = getNormalizedName(transformer, relation); const wholeName = getNormalizedName(transformer, relation.getSource()); const partName = getNormalizedName(transformer, relation.getTarget()); @@ -217,7 +170,7 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati wholeEndName = getNormalizedName(transformer, relation.getSource()); } - const wholeEndAlias = getValidAlias(wholeEnd, wholeEndName, transformer.aliases); + const wholeEndAlias = getAlias(wholeEnd, wholeEndName, transformer.aliases); if (wholeEnd.isAggregationEnd() && wholeEnd.isComposite()) { let otherWholeEnds = [] @@ -231,7 +184,7 @@ function transformPartWholeRelation(transformer: Ontouml2Alloy, relation: Relati otherWholeEndName = getNormalizedName(transformer, (otherWholeEnd.container as Relation).getSource()); } - const otherWholeEndAlias = getValidAlias(otherWholeEnd, otherWholeEndName, transformer.aliases); + const otherWholeEndAlias = getAlias(otherWholeEnd, otherWholeEndName, transformer.aliases); otherWholeEnds.push(otherWholeEndAlias + '[x,w]'); } } @@ -267,13 +220,7 @@ function transformDatatypeRelation(transformer: Ontouml2Alloy, relation: Relatio const targetName = getNormalizedName(transformer, relation.getTarget()); const sourceDatatype = getCorrespondingDatatype(sourceName, transformer.datatypes); - let relationName = ''; - - if (relation.getName()) { - relationName = getNormalizedName(transformer, relation); - } else { - relationName = getValidAlias(relation, 'relation', transformer.aliases); - } + let relationName = getNormalizedName(transformer, relation); sourceDatatype[1].push(relationName + ': '+ targetName); @@ -315,11 +262,7 @@ function transformDatatypeRelation(transformer: Ontouml2Alloy, relation: Relatio export function transformCharacterizationConstraint(transformer: Ontouml2Alloy) { let characterizations = transformer.model.getAllRelationsByStereotype(RelationStereotype.CHARACTERIZATION) .map(characterization => { - if (characterization.getName()) { - return 'w.' + getNormalizedName(transformer, characterization); - } else { - return 'w.' + getValidAlias(characterization, 'relation', transformer.aliases); - } + return 'w.' + getNormalizedName(transformer, characterization); }); if (characterizations.length) { diff --git a/src/libs/ontouml2alloy/util.ts b/src/libs/ontouml2alloy/util.ts index 37a58df9..1ac3854a 100644 --- a/src/libs/ontouml2alloy/util.ts +++ b/src/libs/ontouml2alloy/util.ts @@ -29,7 +29,7 @@ export function getNormalizedName(transformer: Ontouml2Alloy, element: OntoumlEl //Check if the name is null, if so, replace it with 'Unnamed' if(normalizedName == null) { - normalizedName = 'Unnamed'; + normalizedName = `${(element.type).toLowerCase()}`; } //Replace forbidden characters with an empty string @@ -37,9 +37,9 @@ export function getNormalizedName(transformer: Ontouml2Alloy, element: OntoumlEl normalizedName = normalizedName.replace(new RegExp(`\\${char}`, 'g'), ''); }); - //Check if the name is an empty string, if so, replace it with 'Unnamed' + //Check if the name is an empty string, if so, replace it with the type of the ontouml element if(!normalizedName){ - normalizedName = 'Unnamed'; + normalizedName = `${(element.type).toLowerCase()}`; } //Check if the normalized name is a reserved keyword or 'Unnamed', if so, add the type of ontouml element to the name @@ -57,10 +57,12 @@ export function getNormalizedName(transformer: Ontouml2Alloy, element: OntoumlEl if(Object.values(transformer.normalizedNames).length != 0){ const existingNames = Object.values(transformer.normalizedNames); let index = 1; - while (existingNames.includes(normalizedName)) { - normalizedName = `${normalizedName}${index}`; + let tempNormalizedName = normalizedName; + while (existingNames.includes(tempNormalizedName)) { + tempNormalizedName = `${normalizedName}${index}`; index++; } + normalizedName = tempNormalizedName; }//TODO made functional with filter for efficiency transformer.normalizedNames[id] = normalizedName; @@ -114,7 +116,7 @@ export function getCustomCardinality(cardinality: Cardinality) { return [lowerBound, upperBound]; } -export function getValidAlias(element: OntoumlElement, name: string, aliases: [OntoumlElement, string][]) { +export function getAlias(element: OntoumlElement, name: string, aliases: [OntoumlElement, string][]) { const foundAlias = aliases.find((a) => { return a[0] === element; }) if (foundAlias) { return foundAlias[1];