@@ -11,6 +11,7 @@ import {
1111import asyncIterators from './async_iterators.js'
1212import { coerceArray } from './utilities/coerceArray.js'
1313import { countArguments } from './utilities/countArguments.js'
14+ import { downgrade , precoerceNumber } from './utilities/downgrade.js'
1415
1516/**
1617 * Provides a simple way to compile logic into a function that can be run.
@@ -87,7 +88,7 @@ export function isDeterministic (method, engine, buildState) {
8788 if ( lower === undefined ) return true
8889 if ( ! engine . methods [ func ] ) throw new Error ( `Method '${ func } ' was not found in the Logic Engine.` )
8990
90- if ( engine . methods [ func ] . traverse === false ) {
91+ if ( engine . methods [ func ] . lazy ) {
9192 return typeof engine . methods [ func ] . deterministic === 'function'
9293 ? engine . methods [ func ] . deterministic ( lower , buildState )
9394 : engine . methods [ func ] . deterministic
@@ -118,7 +119,7 @@ function isDeepSync (method, engine) {
118119 const lower = method [ func ]
119120 if ( ! isSync ( engine . methods [ func ] ) ) return false
120121
121- if ( engine . methods [ func ] . traverse === false ) {
122+ if ( engine . methods [ func ] . lazy ) {
122123 if ( typeof engine . methods [ func ] [ Sync ] === 'function' && engine . methods [ func ] [ Sync ] ( method , { engine } ) ) return true
123124 return false
124125 }
@@ -193,7 +194,7 @@ function buildString (method, buildState = {}) {
193194 }
194195
195196 let lower = method [ func ]
196- if ( ! lower || typeof lower !== 'object' ) lower = [ lower ]
197+ if ( ( ! lower || typeof lower !== 'object' ) && ( ! engine . methods [ func ] . lazy ) ) lower = [ lower ]
197198
198199 if ( engine . methods [ func ] && engine . methods [ func ] . compile ) {
199200 let str = engine . methods [ func ] . compile ( lower , buildState )
@@ -219,7 +220,7 @@ function buildString (method, buildState = {}) {
219220 const argCount = countArguments ( asyncDetected ? engine . methods [ func ] . asyncMethod : engine . methods [ func ] . method )
220221 const argumentsNeeded = argumentsDict [ argCount - 1 ] || argumentsDict [ 2 ]
221222
222- if ( engine . methods [ func ] && ( typeof engine . methods [ func ] . traverse === 'undefined' ? true : engine . methods [ func ] . traverse ) ) {
223+ if ( engine . methods [ func ] && ! engine . methods [ func ] . lazy ) {
223224 return makeAsync ( `engine.methods["${ func } "]${ asyncDetected ? '.asyncMethod' : '.method' } (${ coerce } (` + buildString ( lower , buildState ) + ')' + argumentsNeeded + ')' )
224225 } else {
225226 notTraversed . push ( lower )
@@ -307,12 +308,12 @@ function processBuiltString (method, str, buildState) {
307308 str = str . replace ( `__%%%${ x } %%%__` , item )
308309 } )
309310
310- const final = `(values, methods, notTraversed, asyncIterators, engine, above, coerceArray) => ${ buildState . asyncDetected ? 'async' : '' } (context ${ buildState . extraArguments ? ',' + buildState . extraArguments : '' } ) => { let prev; const result = ${ str } ; return result }`
311+ const final = `(values, methods, notTraversed, asyncIterators, engine, above, coerceArray, downgrade, precoerceNumber ) => ${ buildState . asyncDetected ? 'async' : '' } (context ${ buildState . extraArguments ? ',' + buildState . extraArguments : '' } ) => { ${ str . includes ( 'prev' ) ? ' let prev;' : '' } const result = ${ str } ; return result }`
311312 // console.log(str)
312313 // console.log(final)
313314 // eslint-disable-next-line no-eval
314315 return Object . assign (
315- ( typeof globalThis !== 'undefined' ? globalThis : global ) . eval ( final ) ( values , methods , notTraversed , asyncIterators , engine , above , coerceArray ) , {
316+ ( typeof globalThis !== 'undefined' ? globalThis : global ) . eval ( final ) ( values , methods , notTraversed , asyncIterators , engine , above , coerceArray , downgrade , precoerceNumber ) , {
316317 [ Sync ] : ! buildState . asyncDetected ,
317318 aboveDetected : typeof str === 'string' && str . includes ( ', above' )
318319 } )
0 commit comments