json-expression-eval
Version:
json serializable rule engine / boolean expression evaluator
82 lines (58 loc) • 3.19 kB
Markdown
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Build & Test Commands
- `pnpm install` - Install dependencies
- `pnpm run build` - Lint and compile TypeScript
- `pnpm run compile` - Compile TypeScript only
- `pnpm run test` - Run linting, type tests, and coverage tests
- `pnpm run test:unit` - Run unit tests only
- `pnpm run test:cover` - Run unit tests with coverage
- `pnpm run test:tsd` - Run TypeScript definition tests
- `pnpm run lint` - Run ESLint
- `pnpm run ci` - Full CI pipeline (lint, compile, type tests, coverage)
Run a single test:
```sh
pnpm run test:unit -- --grep "test name pattern"
```
## Architecture
### Two Evaluation Systems
1. **Expression Evaluator** (`src/lib/evaluator.ts`): Evaluates boolean expressions against a context
- `evaluate()` - Returns boolean result
- `evaluateWithReason()` - Returns `{result, reason}` where reason is the minimal expression that caused the result. For `and`/`or`, reason is always wrapped in array form (e.g., `{or: [reason]}`)
- `validate()` - Validates expression structure against a full context
2. **Rule Engine** (`src/lib/engine.ts`): Evaluates rules with conditions and consequences
- Rules have a condition (expression) and consequence (message + custom payload)
- Can also use rule functions that combine condition checking and consequence in one
### Type System (Critical)
The type system uses `ts-toolbelt` for advanced type manipulation. Generic parameters follow this pattern:
```typescript
<Context, FunctionsTable, Ignore, CustomRunOptions>
```
- **Context**: The object being evaluated against
- **FunctionsTable**: Custom functions available in expressions
- **Ignore**: Types to exclude from path extraction (e.g., `Moment`) to avoid TypeScript exhaustion
- **CustomRunOptions**: User-defined options passed to functions
Key types in `src/types/`:
- `Expression` - Union type of all valid expression forms (and/or/not/property comparisons/functions)
- `ValidationContext` - Context with all optional properties required (for validation)
- `EvaluationResult` - Result of `evaluateWithReason()` with boolean and minimal expression
### Expression Operators
Logical: `and`, `or`, `not`
Comparison: `eq`, `neq`, `gt`, `gte`, `lt`, `lte`, `between`, `inq`, `nin`, `regexp`, `regexpi`, `exists`
Right-hand side can be: literal value, `{ref: "path"}` to reference context, or math operation `{op, lhs, rhs}`.
## Code Style
- 4-space indentation, single quotes, semicolons required
- Lines ~120 characters max
- 100% code coverage required
- Type tests use TSD in `src/test/types/`
- Linting via ESLint (flat config in `eslint.config.mjs`)
- Testing via Vitest
## Node.js Support
Supports Node.js ^20, ^22, or ^24
## CI/CD
- CI runs on **Ubuntu, macOS, and Windows**
- Tests run across all supported Node.js versions
- Primary checks (Snyk, coverage, type tests) run on Ubuntu + Node 24
## Cross-Platform Notes
- Avoid shell-specific glob patterns in npm scripts (let tools handle glob expansion internally)
- Use forward slashes in paths within config files (ESLint, TypeScript handle this cross-platform)