Gebaut mit ❤︎ von Hiukky
Grule ist ein minimaler Mechanismus zum Testen von Bedingungen anhand von Werten mithilfe eines JSON-Schemas. Sein Hauptziel besteht darin, als Rete-Mechanismus zu arbeiten und alle Operationen auf performatische und einfache Weise zu lösen.
npm i grule
yarn add grule
Um Ihr Regelschema einzurichten, befolgen Sie einfach die folgenden Schritte.
Um eine Testinstanz zu erstellen, benötigen Sie eine Menge Fakten, um die Engine anzutreiben.
// Import Engine
import { Grule } from 'grule'
// Create an type
type IUser = {
id : number
name : string
}
// Create metadata
const metadata : IUser = {
id : 3 ,
name : 'test' ,
}
// Create instance
const grule = new Grule < IUser > ( metadata )
Nach dem Erstellen einer Instanz der Engine und dem Vorladen mit Fakten besteht der nächste Schritt darin, die Regeln zu registrieren. Um die Regeln zu registrieren, müssen Sie die IRules <T>
-Schnittstelle importieren und einen Regelsatz für die in den Fakten deklarierten Attribute erstellen.
Die Regeln orientieren sich an der Struktur der im Sachverhalt deklarierten Daten. Für jedes Attribut wird eine Regel ausgeführt.
Die Regelerstellungsfunktion bietet zwei Argumente, das erste sind die attributes
und das zweite die events
.
Sie können für jeden Test einen logischen Ausdruck verwenden und eine gewünschte Aktion ausführen, oder Sie können das Ereignis „ when
und then
verwenden, um zu testen und eine Aktion basierend auf dem Ergebnis auszuführen. Dies ist eine gute Option für dynamische Tests.
Nachdem Sie eine Instanz erstellt und die Regeln registriert haben, können Sie einfach die Ausführungsmethode ausführen, indem Sie die als Parameter definierten Regeln übergeben. Wenn am Ende der Tests kein Fehler vorliegt, der den Testablauf unterbricht, wird ein boolescher Wert zurückgegeben.
true
alle Bedingungen sind erfüllt.false
eine oder alle Bedingungen sind fehlgeschlagen. // ... Previous code
// Create Rules
const rules : IRules < IUser > = ( { id , name } , { when } ) => ( {
id : when ( id . diff ( 1 ) ) . then ( ( ) => {
throw new Error ( 'User not allowed.' )
} ) ,
name : name . in ( [ 'foo' , 'test' ] ) ,
} )
// Enroll rules
grule . run ( rules )
Sie können den vorherigen Ablauf auch auf sauberere Weise vereinfachen. (Beispiel für endgültigen Code)
// Import Engine
import { Grule } from 'grule'
// Create an type
type IUser = {
id : number
name : string
}
// Create instance
new Grule < IUser > ( {
id : 3 ,
name : 'test' ,
} ) . run ( ( { id , name } , { when } ) => ( {
id : when ( id . diff ( 1 ) ) . then ( ( ) => {
throw new Error ( 'User not allowed.' )
} ) ,
name : name . in ( [ 'foo' , 'test' ] ) ,
} ) )
Für jedes Attribut stehen 9 Methoden für die jeweiligen Tests zur Verfügung.
// Type: less(value: ILess): boolean
// Acceptable: ['number', 'bigint']
// Type: lessOrEqual(value: ILess): boolean
// Acceptable: ['number', 'bigint']
// Type: greater(value: IGreater): boolean
// Acceptable: ['number', 'bigint']
// Type: greaterOrEqual(value: IGreater): boolean
// Acceptable: ['number', 'bigint']
// Type: equal(value: IEqual): boolean
// Acceptable: ['bigint', 'boolean', 'number', 'string', 'date']
// Type: diff(value: IEqual): boolean
// Acceptable: ['bigint', 'boolean', 'number', 'string', 'date']
// Type: in(value: In): boolean
// Acceptable: ['bigint', 'boolean', 'number', 'string', 'array']
// Type: notIn(value: In): boolean
// Acceptable: ['bigint', 'boolean', 'number', 'string', 'array']
// Type: eval(operator: IOperatorsList, arg1: A): boolean
// Acceptable: [Idle]
Grule hat derzeit nur ein Ereignis als when
. Es gibt ein Versprechen mit einem booleschen Ergebnis des durchgeführten Tests zurück.
// Type: when(test: boolean): Promise<boolean>
// Acceptable: ['boolean']
Grule ist noch in einer ersten Version ohne viele Funktionen, aber Sie können gerne Ihren Vorschlag senden oder eine PR eröffnen.