تم تصميمه باستخدام ❤︎ بواسطة Hiukky
Grule هي آلية بسيطة لاختبار الشروط مقابل القيم باستخدام مخطط JSON. هدفها الرئيسي هو العمل كآلية Rete وحل جميع العمليات بطريقة أدائية وبسيطة.
npm i grule
yarn add grule
لإعداد نظام القواعد الخاص بك، ما عليك سوى اتباع الخطوات التالية.
لإنشاء نسخة اختبارية، ستحتاج إلى الكثير من الحقائق لتشغيل المحرك.
// 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 )
بعد إنشاء مثيل للمحرك، وتحميل الحقائق مسبقًا، فإن الخطوة التالية هي تسجيل القواعد. لتسجيل القواعد، يجب عليك استيراد واجهة IRules <T>
وإنشاء مجموعة من القواعد للسمات المعلنة في الحقائق.
تتبع القواعد هيكل البيانات المعلنة في الحقائق. سيتم تنفيذ قاعدة لكل سمة.
توفر وظيفة إنشاء القاعدة وسيطتين، الأولى هي attributes
والثانية events
.
يمكنك استخدام تعبير منطقي لكل اختبار وتنفيذ الإجراء الذي تريده، أو يمكنك استخدام الحدث when
then
لاختبار الإجراء وتنفيذه بناءً على النتيجة. يعد هذا خيارًا جيدًا للاختبار الديناميكي.
بعد إنشاء مثيل وتسجيل القواعد، يمكنك ببساطة تنفيذ طريقة التشغيل عن طريق تمرير القواعد المحددة كمعلمة. في نهاية الاختبارات، إذا لم يكن هناك خطأ يقاطع تدفق الاختبارات، فسيتم إرجاع قيمة منطقية.
true
لقد مرت جميع الظروف.false
واحد أو فشل كل الشروط. // ... 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 )
يمكنك أيضًا تبسيط التدفق السابق بطريقة أنظف. (مثال على الكود النهائي)
// 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' ] ) ,
} ) )
تحتوي كل سمة على 9 طرق متاحة للاختبارات.
// 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 حاليًا على حدث واحد فقط من when
. تقوم بإرجاع وعد بنتيجة منطقية من الاختبار الذي تم إجراؤه.
// Type: when(test: boolean): Promise<boolean>
// Acceptable: ['boolean']
Grule هو في إصدار أولي دون العديد من الميزات حتى الآن، ولكن لا تتردد في إرسال اقتراحك أو فتح العلاقات العامة.