jsonlogic-hs-0.1.0.0: jsonlogic-hs.cabal
cabal-version: 3.0
name: jsonlogic-hs
version: 0.1.0.0
synopsis: JsonLogic rule engine, checked against the JavaScript reference
description:
jsonlogic-hs is a native Haskell implementation of JsonLogic
(<https://jsonlogic.com>), a small, closed rule language that is itself
JSON, so rules can be stored, shared between systems, and evaluated
against data without running arbitrary code.
It follows the JavaScript reference implementation, json-logic-js 2.0.5:
all 278 cases of the classic shared suite pass, and in lenient arity mode
it gives the reference's own answers on a committed catalogue of about
27,000 deliberately awkward rules (type coercion, UTF-16 strings, signed
zero, NaN, infinities, undefined, numeric edge cases, odd arities, and
every rule of the community suite), with a 140,000-case tier and thousands
of random rules checked against the reference in CI. The few deliberate
differences are listed in docs/COMPATIBILITY.md.
Rules are compiled once and run many times. Evaluation is pure and bounded:
rule depth, evaluation steps, string length and array length all have
configurable limits, so rules from an untrusted source cannot run
unbounded work or exhaust memory. Every error carries the JSON Pointer of
the rule node that failed. Arity checking is strict by default and can be
switched to the reference's lenient behaviour. Custom operators are
supplied by the caller, and dataUse reports which parts of the data a rule
can read.
The supported API is the "JsonLogic" module; docs/TUTORIAL.md walks through
it. The "JsonLogic.Core" modules are exposed for advanced use and may
change before 1.0.
category: Data, JSON
license: MIT
license-file: LICENSE
author: Sabrinathan Nair
maintainer: 259497327+Bombay-Boyz@users.noreply.github.com
copyright: (c) 2026 Sabrinathan Nair
homepage: https://github.com/Bombay-Boyz/jsonlogic-hs
bug-reports: https://github.com/Bombay-Boyz/jsonlogic-hs/issues
build-type: Simple
tested-with: GHC ==9.6.7 || ==9.8.4 || ==9.10.3 || ==9.12.4 || ==9.14.1
extra-doc-files: CHANGELOG.md
README.md
docs/ARCHITECTURE.md
docs/COMPATIBILITY.md
docs/CONFORMANCE.md
docs/LIMITS.md
docs/STABILITY.md
docs/TUTORIAL.md
extra-source-files: test/tests.json
test/outliers.jsonl
test/community/LICENSE
test/community/README.md
test/community/*.json
test/community/arithmetic/*.json
test/community/array/*.json
test/community/comparison/*.json
test/community/control/*.json
test/community/string/*.json
differential/README.md
differential/oracle.js
differential/outliers.js
differential/package.json
differential/package-lock.json
-- Treat warnings as errors during development and CI, but not in released
-- builds: new GHC versions add warnings that would otherwise break
-- downstream installs (`cabal check` rejects an unconditional -Werror).
-- Enabled for our own builds through cabal.project.
flag werror
description: Treat warnings as errors (enable in dev/CI, off for releases).
default: False
manual: True
-- The differential test needs Node.js to run, so it is a development tool:
-- off by default so that installing the package never builds it.
flag differential
description: Build the differential-test executable (needs Node.js to run).
default: False
manual: True
-- Benchmarks are a development tool too.
flag bench
description: Build the benchmark executable.
default: False
manual: True
-- Standard 5.1: the warning flags, shared so every component is held to the
-- same bar.
common warnings
default-language: Haskell2010
ghc-options: -Wall
-Wcompat
-Widentities
-Wincomplete-record-updates
-Wincomplete-uni-patterns
-Wmissing-export-lists
-Wpartial-fields
-Wredundant-constraints
-Wunused-imports
-Wunused-local-binds
-Wunused-matches
-Wunused-top-binds
if flag(werror)
ghc-options: -Werror
-- The supported API is the JsonLogic module. JsonLogic.Core.* is exposed for
-- advanced use and for the test suites, and may change before 1.0.
library
import: warnings
hs-source-dirs: src
exposed-modules: JsonLogic
JsonLogic.Core.Analysis
JsonLogic.Core.Config
JsonLogic.Core.Custom
JsonLogic.Core.Errors
JsonLogic.Core.Eval
JsonLogic.Core.Location
JsonLogic.Core.Number
JsonLogic.Core.Operator
JsonLogic.Core.Parse
JsonLogic.Core.Rule
JsonLogic.Core.Ryu
JsonLogic.Core.Utf16
JsonLogic.Core.Value
build-depends: base >=4.18 && <4.23
, aeson >=2.1 && <2.4
, containers >=0.6 && <0.9
, data-fix >=0.3 && <0.4
, scientific >=0.3 && <0.4
, text >=2.0 && <2.3
, vector >=0.12.3 && <0.14
test-suite jsonlogic-hs-test
import: warnings
type: exitcode-stdio-1.0
hs-source-dirs: test
main-is: Spec.hs
other-modules: AnalysisSpec
CompatSpec
EvalSpec
Gen
LimitsSpec
LocationSpec
NumberSpec
ParseSpec
Support
ValueSpec
-- a runaway allocation fails the test instead of swapping the machine
ghc-options: -rtsopts "-with-rtsopts=-M2g"
build-depends: base >=4.18 && <4.23
, aeson >=2.1 && <2.4
, bytestring >=0.11 && <0.13
, data-fix >=0.3 && <0.4
, hspec >=2.10 && <2.12
, QuickCheck >=2.14 && <2.20
, text >=2.0 && <2.3
, vector >=0.12.3 && <0.14
, jsonlogic-hs
-- Runs the classic JsonLogic suite (test/tests.json) and fails if any case
-- does not pass. Run it with:
-- cabal test jsonlogic-hs-conformance --test-show-details=direct
test-suite jsonlogic-hs-conformance
import: warnings
type: exitcode-stdio-1.0
hs-source-dirs: conformance
main-is: Conformance.hs
build-depends: base >=4.18 && <4.23
, aeson >=2.1 && <2.4
, bytestring >=0.11 && <0.13
, directory >=1.3 && <1.4
, jsonlogic-hs
-- Replays the committed outlier fixture (test/outliers.jsonl), the
-- reference implementation's own answers to about 27,000 awkward cases.
-- Needs neither Node nor a network. Pass a path to replay another tier:
-- cabal run jsonlogic-hs-outliers -- /path/to/full.jsonl
test-suite jsonlogic-hs-outliers
import: warnings
type: exitcode-stdio-1.0
hs-source-dirs: outliers
main-is: Outliers.hs
build-depends: base >=4.18 && <4.23
, aeson >=2.1 && <2.4
, bytestring >=0.11 && <0.13
, containers >=0.6 && <0.9
, directory >=1.3 && <1.4
, scientific >=0.3 && <0.4
, text >=2.0 && <2.3
, jsonlogic-hs
-- Every example in docs/TUTORIAL.md, checked against the library.
test-suite jsonlogic-hs-tutorial
import: warnings
type: exitcode-stdio-1.0
hs-source-dirs: tutorial
main-is: Tutorial.hs
build-depends: base >=4.18 && <4.23
, aeson >=2.1 && <2.4
, bytestring >=0.11 && <0.13
, text >=2.0 && <2.3
, jsonlogic-hs
-- Scores the library on the community suite (test/community, from
-- json-logic/compat-tables) and fails if the score differs from
-- test/community/expected.json. See test/community/README.md.
test-suite jsonlogic-hs-community
import: warnings
type: exitcode-stdio-1.0
hs-source-dirs: community
main-is: Community.hs
build-depends: base >=4.18 && <4.23
, aeson >=2.1 && <2.4
, bytestring >=0.11 && <0.13
, directory >=1.3 && <1.4
, text >=2.0 && <2.3
, vector >=0.12.3 && <0.14
, jsonlogic-hs
-- Differential test against the real JavaScript implementation. Needs
-- Node.js, so it is a flag-gated executable and not part of `cabal test`.
-- See differential/README.md.
executable jsonlogic-hs-differential
import: warnings
if !flag(differential)
buildable: False
hs-source-dirs: differential
main-is: Differential.hs
build-depends: base >=4.18 && <4.23
, aeson >=2.1 && <2.4
, bytestring >=0.11 && <0.13
, directory >=1.3 && <1.4
, process >=1.6 && <1.7
, QuickCheck >=2.14 && <2.20
, scientific >=0.3 && <0.4
, text >=2.0 && <2.3
, jsonlogic-hs
-- Benchmarks. See docs/LIMITS.md and bench/Bench.hs.
executable jsonlogic-hs-bench
import: warnings
if !flag(bench)
buildable: False
hs-source-dirs: bench
main-is: Bench.hs
-- -T makes the RTS keep allocation statistics, which tasty-bench reports
ghc-options: -rtsopts "-with-rtsopts=-T"
build-depends: base >=4.18 && <4.23
, aeson >=2.1 && <2.4
, bytestring >=0.11 && <0.13
, tasty-bench >=0.3 && <0.5
, text >=2.0 && <2.3
, jsonlogic-hs
source-repository head
type: git
location: https://github.com/Bombay-Boyz/jsonlogic-hs.git