Skip to content

Commit da3b100

Browse files
committed
Improve compiler accuracy with detecting "deep sync" when traverse is set to false. Also resolve an async + deterministic compiler issue.
1 parent 1f28959 commit da3b100

File tree

4 files changed

+13
-3
lines changed

4 files changed

+13
-3
lines changed

compiler.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
import {
55
isSync,
66
// Override is required for the compiler to operate as intended.
7-
Override
7+
Override,
8+
Sync
89
} from './constants.js'
910
import declareSync from './utilities/declareSync.js'
1011

@@ -97,6 +98,12 @@ function isDeepSync (method, engine) {
9798

9899
const lower = method[func]
99100
if (!isSync(engine.methods[func])) return false
101+
102+
if (engine.methods[func].traverse === false) {
103+
if (typeof engine.methods[func][Sync] === 'function' && engine.methods[func][Sync](method, { engine })) return true
104+
return false
105+
}
106+
100107
return isDeepSync(lower, engine)
101108
}
102109

constants.js

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const EfficientTop = Symbol.for('json_logic_efficientTop')
1616
export function isSync (item) {
1717
if (typeof item === 'function') return item[Sync] === true
1818
if (Array.isArray(item)) return item.every(isSync)
19+
if (item && item.asyncMethod && !item.method) return false
1920
return true
2021
}
2122

defaultMethods.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ const defaultMethods = {
8888
'<': ([a, b, c]) => (c === undefined ? a < b : a < b && b < c),
8989
preserve: {
9090
traverse: false,
91-
method: declareSync((i) => i)
91+
method: declareSync((i) => i, true),
92+
[Sync]: () => true
9293
},
9394
if: {
9495
method: (input, context, above, engine) => {
@@ -399,6 +400,7 @@ const defaultMethods = {
399400
keys: (obj) => typeof obj === 'object' ? Object.keys(obj) : [],
400401
eachKey: {
401402
traverse: false,
403+
[Sync]: (data, buildState) => isSyncDeep(Object.values(data[Object.keys(data)[0]]), buildState.engine, buildState),
402404
method: (object, context, above, engine) => {
403405
const result = Object.keys(object).reduce((accumulator, key) => {
404406
const item = object[key]

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "json-logic-engine",
3-
"version": "2.1.2",
3+
"version": "2.1.3",
44
"description": "Construct complex rules with JSON & process them.",
55
"main": "./dist/cjs/index.js",
66
"module": "./dist/esm/index.js",

0 commit comments

Comments
 (0)