Commit Graph
91 Commits
Author SHA1 Message Date
stefan-gorules 39916c9d18 feat: date input (#529)
* feat: declared dates as date values

- graph format:date/date-time inputs and policy date properties arrive as
  dates that keep their original text for output, string() and string
  functions
- d() keeps the instant of offset/Z strings, resolves DST gaps and accepts
  ISO forms without offset, compact, slash-separated, YYYY-MM and YYYY
- dates compare with date strings in ==, !=, <, >, in and contains, and
  concatenate with strings; deprecated date helpers accept dates
- string(date), type() reports date, and date-to-string at string inputs

* fix: close review gaps in date inputs

- parse new date formats by exact shape; keep master formats first and
  guard DST-gap and extreme-year overflows
- text-carrying dates act as strings for object keys, in-object, index,
  slice, concatenation and bool
- deprecated helpers fall back to the date instant; time() accepts dates
- schema-less child inputs receive date text; dates satisfy string
  parameters and slicing in the type checker
- convert policy input before validation so dates are parsed once;
  share rewrite helpers between graph and policy conversion

* fix: align date text, unions, references and child inputs

- every valid date exposes a text form (original or RFC3339), so string
  functions and slicing on computed dates match the type checker
- date and string types merge to string; reference ids typed as dates
  resolve through their text
- input nodes convert declared dates and hand every other converted date
  back as its original text, following combinators only for structure
- date format checks no longer allocate
2026-09-29 09:59:44 +02:00
stefan-gorules ffdfd807d1 feat: implement slots instead of natural language (#527)
* feat: implement slots instead of natural language

Replace the natural-language projection (`nl`) with engine-owned slot
completion: for a cursor position the engine classifies the slot being
edited (operand, operator, literal, member access, ...) and returns typed
options, literal facts and the expected type, for policies and graphs.

- zen-expression: new `slot` module (classification, literals, operators)
  and a lenient lexer mode for incomplete input; `nl` removed
- Intellisense: typed diagnostic codes with arguments, richer inspect for
  hover, dedicated parser error variants (messages unchanged)
- Engine: `Workspace::cursor_scope`, `slot`, `facts`; `rename_from` and
  `references_from`; editor spans in UTF-16 units; renames reach imported
  policies, `$nodes` reads, child graphs and output column heads; no `$root`
  completion in policies
- Node bindings: `slot`, `facts`, `cursorScope`, `slotBatch` replace
  `nl`, `nlTokenize`, `nlEncodeString`, `nlTokenizeBatch`

No change to expression evaluation: the VM, compiler, functions and the
default lexer path are untouched, and parser error messages keep their text.

* fix: harden slot classification, scopes and graph expectations

- restore master execution order; slot scopes hide writes of the edited
  block and its dependents instead of relying on block ranking
- token-start editing gated by slot state; operator, list and operand
  spans no longer splice into neighbouring tokens
- interval-aware bracket pairing for half-open and reversed intervals
- lenient lexer recovers from unknown characters (slots only)
- graph expected type follows switch and pass-through nodes and merges
  compatible output schemas
- sibling inference caps distinct values and analyses lazily
- deterministic overload return type display

* fix: order policy blocks by entity reads through closures and relationships

- record reads for `#.field` in closures so entity fields read through
  lists become dependencies
- link reads through derived lists (filter/map results) to the entity
  fields they carry and order the list after those fields
- evaluate entity blocks on single relationships, and demand entity
  paths for plain reads through relationships
- slot scopes keep the top-level variable when hiding written fields
2026-09-28 21:47:40 +02:00
stefan-gorules 0b6c6a709a fix: nested scopes and any cascade (#513) 2026-08-20 17:39:45 +02:00
stefan-gorules 792e77a82e fix: panic hardening (#509) 2026-08-19 12:04:15 +02:00
stefan-gorules 32f7fb875c fix: end of week boundary (#508) 2026-08-19 11:15:21 +02:00
stefan-gorules 13722740a1 fix: number out of range panics (#506) 2026-08-19 11:01:36 +02:00
stefan-gorules ed0c286d9f fix: v1 behaviour hardening (#502) 2026-08-07 10:30:43 +02:00
stefan-gorules fe43b4c1d7 perf: general performance improvements (#500)
* perf: general performance improvements

* remove unsafe usages, further improve perf

* perf: add table indexing
2026-08-04 11:12:37 +02:00
stefan-gorules 1cb74e6f59 feat: add date natural language (#493)
* feat: add date natural language

* add coverage for date methods
2026-07-22 15:55:43 +02:00
stefan-gorules 63b560c526 feat: workspace lints and type fixes (#492)
* feat: workspace lints and type fixes

* fix fmt
2026-07-22 11:17:49 +02:00
stefan-gorules 8d1910cc4e feat: graph workspace and static analysis (#483) 2026-07-16 23:42:13 +02:00
stefan-gorules 9a11ae4f48 feat: policy table output type (#481) 2026-07-10 10:13:47 +02:00
stefan-gorules b4b59eb7c5 feat: policy dictionary (#479)
* feat: policy dictionary

* remove enum references

* improve tests

* reset index.js and package.json
2026-07-08 13:21:03 +02:00
stefan-gorules 6858c1bd04 feat: natural language (#477)
* feat: natural language

* fix cargo fmt
2026-07-07 13:12:46 +02:00
stefan-gorules 602d214b96 feat: expression static analysis (#449)
* feat: expression static analysis

* fix: cargo fmt

* fix: python workflow

* fix: python workflow

* fix: python workflow

* fix: ignore miri test bound by clock

* fix: memory leaks
2026-06-22 15:48:05 +02:00
stefan-gorules 53f3b5a430 feat: merge function (#438)
* feat: merge function

* add mergeDeep function

* default merge to return empty object instead of empty array
2026-03-15 14:44:32 +01:00
stefan-gorules 6beecb423f fix: simplify compilation (#429)
* fix: simplify compilation

* improve opcodecache structure
2026-02-11 16:07:34 +01:00
stefan-gorules 73d5d5c6cb feat: function scope alias (#426)
* feat: function scope alias

* fix types
2026-01-19 10:44:16 +01:00
bcrevar-gorulesandStefan 7bfebd90fe feat: precompile decision content (#401)
* precompile first

* test

* add Opcode cache through Option<T>

* Compiled support for decisionTable,
default compile of new DecisionContent for node.js and py bindings

* format

* DecisionContent refactored to model module

* fmt

* added back BaseDecisionContent

* tests and benchmark

---------

Co-authored-by: Stefan <stefan@gorules.io>
2025-11-21 14:44:24 +01:00
stefan-gorulesandIvan Miletic 922a262e98 feat: wasm support (#404)
* feat: wasm support

* add http callback

* streamline structs

* fix: wasm workflow

* fix: wasi path

* fix: wasm

* fix: wasm path

* fix: clang dev

* fix: libclang static

* fix: build

* fix: node

* fix: wasm

* fix: wasm wasi

* fix: npm dirs

* fix: node workflow

* fix: testing

* fix: test

* update version

* fix: targets

* fix: wasm fix

* fix: commit files

---------

Co-authored-by: Ivan Miletic <vnmiletic@gmail.com>
2025-11-13 12:36:59 +01:00
stefan-gorules 91509821be feat: refactor engine (#390)
* temp: refactor engine

* temp

* implement remaining nodes

* resolve snapshot tests

* improve decision graph implementation

* implement changes in bindings

* implement changes in bindings

* fix function impl gaps

* update cargo.toml

* fix issues with trace
2025-09-04 18:54:32 +02:00
stefan-gorulesandbojancrevar 80fe4021c2 feat: compact trace (#384)
* feat: compact trace

* align with changes

* add deserialization

* add tests and deserializer

* fix bindings

* first draft

* mock time; update snapshots

* fix

* Node.js test fix

* fix merge

* fix utc override

* fix cross-env

* fix workflow

* fix

---------

Co-authored-by: bojancrevar <bojan.crevar@gorules.io>
2025-08-25 12:33:07 +02:00
bcrevar-gorulesandStefan 4a59f222db feat: add snapshot tests (#385)
* first draft

* mock time; update snapshots

* fix

* Node.js test fix

---------

Co-authored-by: Stefan <stefan@gorules.io>
2025-08-20 16:30:28 +02:00
stefan-gorules 09f59e9bb2 fix: timezone caching (#371) 2025-07-04 10:05:35 +02:00
stefan-gorules f2fcb95ad9 feat: assignment (#366)
* feat: assignment

* add tests
2025-06-18 10:43:01 +02:00
stefan-gorules bdf51dec11 fix: safe division (#365)
* fix: safe division

* add test
2025-06-16 09:47:35 +02:00
stefan-gorules 815729aca4 fix: update rounding strategy (#361)
* fix: update rounding strategy

* add test
2025-06-03 12:04:47 +02:00
stefan-gorules a911a623cb fix: align date diff with dayjs (#360) 2025-06-03 09:48:57 +02:00
stefan-gorules c9d11f12dd fix: normalize number during serialization (#359) 2025-06-02 14:47:16 +02:00
stefan-gorules 173d7bcb79 feat: improve stack resiliency (#357) 2025-05-27 17:46:00 +02:00
stefan-gorules 29ce060ac7 feat: number scientific notation (#355)
* feat: number scientific notation

* add tests
2025-05-23 11:46:33 +02:00
stefan-gorules 34de232d3a feat: dates min/max (#353) 2025-05-23 11:18:50 +02:00
stefan-gorules 71b949b1e1 fix: number fn type (#354) 2025-05-23 11:18:23 +02:00
stefan-gorules 157859ca37 fix: lossy exponent fallback (#352) 2025-05-21 11:46:44 +02:00
stefan-gorules e09f2ede5e fix: date method signature (#351) 2025-05-20 00:36:07 +02:00
stefan-gorules d179552b3c feat: trunc function and decimal places for round (optional) (#349) 2025-05-14 08:21:29 +02:00
stefan-gorules 6027f5a6a1 fix: date endOf for a year and isAfter comparison for units (#348)
* fix: date endOf for a year and isAfter comparison for units

* fix test

* improve impl
2025-05-14 01:27:58 +02:00
stefan-gorules de6d13e1c7 feat: date v2 (#345)
* feat: date v2

* implement more date functions

* improve type safety

* add more methods for dates

* update utc to tz and add support

* add unary node behaviour for date methods

* add tests; fix errors in bindings

* add date operators

* fix types

* change set date signature

* update nightly
2025-05-12 22:39:08 +02:00
stefan-gorules 6535d44e03 feat: expression function system (#340)
* feat: expression function system

* cleanup

* improve parser

* revert test changes

* add more tests

* minor fixes
2025-04-28 00:40:32 +02:00
stefan-gorules 36c32814b8 feat: interval iterator (#336) 2025-04-24 12:00:15 +02:00
stefan-gorules f81d1188f6 fix: correctly throw an error when closed bracket is missing in function call (#337) 2025-04-24 11:59:38 +02:00
stefan-gorules d7624311f6 fix: py validate methods (#316)
* fix: py validate methods

* fix
2025-02-15 21:46:55 +01:00
Jake Potrebic 94e1da239a feat: add validation methods to python bindings (#305)
* add validation methods to python bindings

* centralize validation logic

* rename functions

* format
2025-02-15 20:41:18 +01:00
stefan-gorules ae40aff163 feat: compiled bytecode (#307)
* feat: compiled bytecode

* optimize bytecode

* add compiled expression struct

* add fetch fast and better abstraction

* fix

* rename evaluate_with for Expression<Unary>
2025-02-10 10:07:24 +01:00
stefan-gorules df2a44f8b3 fix: unary closure expression (#301) 2025-01-20 14:08:13 +01:00
kyle-mwnz 49814e1aa0 feat: add trim function to string data type (#279)
* feat: add trim function to string data type

* Linting

* Extra test
2024-11-28 10:15:22 +01:00
stefan-gorules 92879f9c05 feat: bump rquickjs, fix loop cache for decisionTable (#274)
* fix: loop cache

* update rquickjs

* bump version
2024-11-19 13:38:17 +01:00
stefan-gorulesandIvan Miletic 47812143a0 feat: passthrough nodes (#261)
* feat: passthrough nodes

* update bindings

* update model

* update exclusion

* fix merge strategy

* fix

* fix merge

* add tests

* fix walk

* fix merge

* fix

* fix: add tests

* fix types

---------

Co-authored-by: Ivan Miletic <vnmiletic@gmail.com>
2024-10-23 15:59:31 +02:00
stefan-gorules 5a37ef319d fix: improve type errors (#259) 2024-10-13 21:08:57 +02:00
stefan-gorules 7b861d0642 feat: deserialize variable type (#256) 2024-10-10 11:20:51 +02:00