Skip to content

Commit 0578816

Browse files
Merge pull request #22 from TotalTechGeek/bug-21/Resolve-Dynamic-Key-Issue-With-Get
Resolve dynamic key issue with compiled "get" #21
2 parents 449f53b + d2d1456 commit 0578816

File tree

4 files changed

+23
-7
lines changed

4 files changed

+23
-7
lines changed

compiler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ function buildString (method, buildState = {}) {
317317
`gen["${func}"](` + buildString(method[func], buildState) + ')'
318318
)
319319
} else {
320-
if (engine.methods[func] && engine.methods[func].traverse) {
320+
if (engine.methods[func] && (typeof engine.methods[func].traverse === 'undefined' ? true : engine.methods[func].traverse)) {
321321
functions[func] = 1
322322
asyncDetected = Boolean(
323323
async && engine.methods[func] && engine.methods[func].asyncMethod

defaultMethods.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,10 @@ defaultMethods.get.compile = function (data, buildState) {
805805
obj = data[0]
806806
key = data[1]
807807
defaultValue = typeof data[2] === 'undefined' ? null : data[2]
808+
809+
// Bail out if the key is dynamic; dynamic keys are not really optimized by this block.
810+
if (key && typeof key === 'object') return false
811+
808812
key = key.toString()
809813
const pieces = key.split('.')
810814
if (!chainingSupported) {
@@ -813,11 +817,11 @@ defaultMethods.get.compile = function (data, buildState) {
813817
return `(${text}||0)[${JSON.stringify(i)}]`
814818
},
815819
`(${buildString(obj, buildState)}||0)`
816-
)}, ${JSON.stringify(defaultValue)}))`
820+
)}, ${buildString(defaultValue, buildState)}))`
817821
}
818822
return `((${buildString(obj, buildState)})${pieces
819-
.map((i) => `?.[${JSON.stringify(i)}]`)
820-
.join('')} ?? ${JSON.stringify(defaultValue)})`
823+
.map((i) => `?.[${buildString(i, buildState)}]`)
824+
.join('')} ?? ${buildString(defaultValue, buildState)})`
821825
}
822826
return false
823827
}
@@ -860,11 +864,11 @@ defaultMethods.var.compile = function (data, buildState) {
860864
return `(${text}||0)[${JSON.stringify(i)}]`
861865
},
862866
'(context||0)'
863-
)}, ${JSON.stringify(defaultValue)}))`
867+
)}, ${buildString(defaultValue, buildState)}))`
864868
}
865869
return `(context${pieces
866870
.map((i) => `?.[${JSON.stringify(i)}]`)
867-
.join('')} ?? ${JSON.stringify(defaultValue)})`
871+
.join('')} ?? ${buildString(defaultValue, buildState)})`
868872
}
869873
buildState.useContext = true
870874
return false

general.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,16 @@ describe('Various Test Cases', () => {
105105
}, obj, 'equal')
106106
}
107107
})
108+
109+
it('get operator w/ object key as string', async () => {
110+
for (const engine of [...normalEngines, ...permissiveEngines]) await testEngine(engine, { get: [{ var: 'selected' }, 'b'] }, { selected: { b: 2 } }, 2)
111+
})
112+
113+
it('get operator w/ object key as number', async () => {
114+
for (const engine of [...normalEngines, ...permissiveEngines]) await testEngine(engine, { get: [{ var: 'selected' }, 1] }, { selected: [0, 2] }, 2)
115+
})
116+
117+
it('get operator w/ object key as var', async () => {
118+
for (const engine of [...normalEngines, ...permissiveEngines]) await testEngine(engine, { get: [{ var: 'selected' }, { var: 'key' }] }, { selected: { b: 2 }, key: 'b' }, 2)
119+
})
108120
})

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.10",
3+
"version": "1.2.11",
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)