Specification pattern library written in typescript.
import { createSpec } from 'spoeck';
const dragon = {
color: 'blue',
element: 'ice',
age: 1000,
};
const dragonIsBlue = createSpec({
name: 'dragonIsBlue',
desc: 'Dragon is blue',
isSatisfiedBy: (dragon: Dragon) => dragon.color === 'blue'
});
const result = dragonIsBlue.isSatisfiedBy(dragon);
const result.value
const result ={
name: 'dragonIsBlue',
desc: 'Dragon is blue',
value: true,
details: [
{ name: 'dragonIsBlue', desc: 'Dragon is blue', value: true },
],
};
const dragonIsBlueIceYoung = dragonIsBlue
.and(dragonIsIce, 'dragonIsBlueIce')
.and(dragonIsYoung, 'dragonIsBlueIceYoung');
const compositeRuleResult = {
name: 'dragonIsBlueIceYoung',
desc: 'Dragon is blue AND (Dragon is ice) AND (NOT (Dragon is old))',
value: false,
details: [
{ name: 'dragonIsBlue', desc: 'Dragon is blue', value: true },
{ name: 'dragonIsIce', desc: 'Dragon is ice', value: true },
{ name: 'dragonIsYoung', desc: 'NOT (Dragon is old)', value: false },
],
}
import { createSpec } from 'spoeck';
const dragon = {
color: 'blue',
element: 'ice',
age: 1000,
};
const dragonIsBlue = createSpec({
name: 'dragonIsBlue',
desc: 'Dragon is blue',
isSatisfiedBy: (dragon: Dragon) => entity.color === 'blue'
});
const dragonIsIce = createSpec({
name: 'dragonIsIce',
desc: 'Dragon is ice',
isSatisfiedBy: (dragon: Dragon) => entity.element === 'ice'
});
const dragonIsBlueANDIce = dragonIsBlue.and(dragonIsIce, 'dragonIsBlueANDIce');
const result = dragonIsBlueANDIce.isSatisfiedBy(dragon);
result.value;
const dragonIsBlueORIce = dragonIsBlue.or(dragonIsIce, 'dragonIsBlueORIce');
const result = dragonIsBlueORIce.isSatisfiedBy(dragon);
result.value;
const dragonIsBlueXORIce = dragonIsBlue.xor(dragonIsIce, 'dragonIsBlueXORIce');
const result = dragonIsBlueXORIce.isSatisfiedBy(dragon);
result.value;
const dragonIsBlueAndNotIce = dragonIsBlue.and(dragonIsIce.not('dragonIsNotIce'), 'dragonIsBlueAndNotIce');
const result = dragonIsBlueAndNotIce.isSatisfiedBy(dragon);
result.value;