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>
인터페이스를 가져와서 팩트에 선언된 속성에 대한 규칙 세트를 만들어야 합니다.
규칙은 사실에 선언된 데이터의 구조를 따릅니다. 각 속성에 대해 규칙이 실행됩니다.
규칙 생성 함수는 2개의 인수를 제공합니다. 첫 번째 인수는 attributes
이고 두 번째 인수는 events
.
각 테스트마다 논리식을 사용하여 원하는 동작을 수행할 수도 있고, when
및 then
이벤트를 사용하여 테스트하고 결과에 따라 동작을 수행할 수도 있습니다. 이는 동적 테스트에 적합한 옵션입니다.
인스턴스를 생성하고 규칙을 등록한 후, 파라미터로 정의된 규칙을 전달하면 간단히 run 메소드를 실행할 수 있습니다. 테스트가 끝날 때 테스트 흐름을 방해하는 오류가 없으면 부울 값이 반환됩니다.
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
보다 이벤트가 하나만 있습니다. 수행된 테스트의 부울 결과와 함께 Promise를 반환합니다.
// Type: when(test: boolean): Promise<boolean>
// Acceptable: ['boolean']
Grule은 아직 많은 기능이 없는 초기 버전이지만 자유롭게 제안을 보내거나 PR을 열 수 있습니다.