Skip to content

Commit bde09eb

Browse files
Merge pull request #9 from TotalTechGeek/feat/preserve-source-object
Make the compiler return the original object in permissive mode, and …
2 parents 64c49ed + 7b4dc9c commit bde09eb

File tree

3 files changed

+29
-14
lines changed

3 files changed

+29
-14
lines changed

compiler.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@ import asyncIterators from './async_iterators.js'
3636
* @param {*} x
3737
* @returns
3838
*/
39-
function isPrimitive (x) {
39+
function isPrimitive (x, preserveObject) {
4040
if (typeof x === 'number' && (x === Infinity || x === -Infinity || Number.isNaN(x))) return false
4141
return (
4242
x === null ||
4343
x === undefined ||
44-
['Number', 'String', 'Boolean', 'Object'].includes(x.constructor.name)
44+
['Number', 'String', 'Boolean'].includes(x.constructor.name) ||
45+
(!preserveObject && x.constructor.name === 'Object')
4546
)
4647
}
4748

@@ -245,8 +246,8 @@ function buildString (method, buildState = {}) {
245246
values = [],
246247
engine
247248
} = buildState
248-
function pushValue (value) {
249-
if (isPrimitive(value)) return JSON.stringify(value)
249+
function pushValue (value, preserveObject = false) {
250+
if (isPrimitive(value, preserveObject)) return JSON.stringify(value)
250251
values.push(value)
251252
return `values[${values.length - 1}]`
252253
}
@@ -273,7 +274,7 @@ function buildString (method, buildState = {}) {
273274
if (method && typeof method === 'object') {
274275
if (!engine.methods[func]) {
275276
// If we are in permissive mode, we will just return the object.
276-
if (engine.options.permissive) return pushValue(method)
277+
if (engine.options.permissive) return pushValue(method, true)
277278
throw new Error(`Method '${func}' was not found in the Logic Engine.`)
278279
}
279280
functions[func] = functions[func] || 2
@@ -284,7 +285,7 @@ function buildString (method, buildState = {}) {
284285
isDeterministic(method, engine, buildState)
285286
) {
286287
if (isDeepSync(method, engine)) {
287-
return pushValue((engine.fallback || engine).run(method))
288+
return pushValue((engine.fallback || engine).run(method), true)
288289
} else if (!buildState.avoidInlineAsync) {
289290
processing.push(engine.run(method).then((i) => pushValue(i)))
290291
return `__%%%${processing.length - 1}%%%__`

general.test.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const permissiveEngines = [
1616
new AsyncLogicEngine(undefined, { yieldSupported: true, permissive: true })
1717
]
1818

19-
async function testEngineAsync (engine, rule, data, expected) {
19+
async function testEngineAsync (engine, rule, data, expected, matcher = 'deepStrictEqual') {
2020
// run
2121
if (expected === Error) {
2222
try {
@@ -25,7 +25,7 @@ async function testEngineAsync (engine, rule, data, expected) {
2525
} catch (e) {}
2626
} else {
2727
const result = await engine.run(rule, data)
28-
assert.deepStrictEqual(result, expected)
28+
assert[matcher](result, expected)
2929
}
3030

3131
// build
@@ -38,13 +38,13 @@ async function testEngineAsync (engine, rule, data, expected) {
3838
} else {
3939
const built = await engine.build(rule)
4040
const builtResult = await built(data)
41-
assert.deepStrictEqual(builtResult, expected)
41+
assert[matcher](builtResult, expected)
4242
}
4343
}
4444

45-
function testEngine (engine, rule, data, expected) {
45+
function testEngine (engine, rule, data, expected, matcher = 'deepStrictEqual') {
4646
if (engine instanceof AsyncLogicEngine) {
47-
return testEngineAsync(engine, rule, data, expected)
47+
return testEngineAsync(engine, rule, data, expected, matcher)
4848
}
4949

5050
// run
@@ -55,7 +55,7 @@ function testEngine (engine, rule, data, expected) {
5555
} catch (e) {}
5656
} else {
5757
const result = engine.run(rule, data)
58-
assert.deepStrictEqual(result, expected)
58+
assert[matcher](result, expected)
5959
}
6060

6161
// build
@@ -68,7 +68,7 @@ function testEngine (engine, rule, data, expected) {
6868
} else {
6969
const built = engine.build(rule)
7070
const builtResult = built(data)
71-
assert.deepStrictEqual(builtResult, expected)
71+
assert[matcher](builtResult, expected)
7272
}
7373
}
7474

@@ -84,6 +84,20 @@ describe('Various Test Cases', () => {
8484
await testEngine(engine, {
8585
if: [true, { unknown: true, unknown2: 2 }, 5]
8686
}, {}, { unknown: true, unknown2: 2 })
87+
88+
const obj = { unknown: true, unknown2: 2 }
89+
90+
// test with deterministic function returning a passively preserved element.
91+
await testEngine(engine, {
92+
if: [true, obj, 5]
93+
}, {}, obj, 'equal')
94+
95+
// test with a non-deterministic function returning a passively preserved element.
96+
await testEngine(engine, {
97+
if: [{ var: 'data' }, obj, 5]
98+
}, {
99+
data: true
100+
}, obj, 'equal')
87101
}
88102
})
89103
})

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "json-logic-engine",
3-
"version": "1.2.2",
3+
"version": "1.2.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)