@@ -206,6 +206,13 @@ const defaultMethods = {
206
206
// Adding this to spec something out, not to merge it quite yet
207
207
val : {
208
208
method : ( args , context , above ) => {
209
+ if ( Array . isArray ( args ) && args . length === 1 ) args = args [ 0 ]
210
+ if ( ! Array . isArray ( args ) ) {
211
+ if ( args === null || args === undefined ) return context
212
+ const result = context [ args ]
213
+ if ( typeof result === 'undefined' ) return null
214
+ return result
215
+ }
209
216
let result = context
210
217
let start = 0
211
218
if ( Array . isArray ( args [ 0 ] ) && args [ 0 ] . length === 1 ) {
@@ -221,7 +228,6 @@ const defaultMethods = {
221
228
}
222
229
}
223
230
}
224
-
225
231
for ( let i = start ; i < args . length ; i ++ ) {
226
232
if ( args [ i ] === null ) continue
227
233
if ( result === null || result === undefined ) return null
@@ -230,7 +236,38 @@ const defaultMethods = {
230
236
if ( typeof result === 'undefined' ) return null
231
237
return result
232
238
} ,
233
- deterministic : false
239
+ optimizeUnary : true ,
240
+ deterministic : ( data , buildState ) => {
241
+ if ( buildState . insideIterator ) {
242
+ if ( Array . isArray ( data ) && Array . isArray ( data [ 0 ] ) && Math . abs ( data [ 0 ] [ 0 ] ) >= 2 ) return false
243
+ return true
244
+ }
245
+ return false
246
+ } ,
247
+ compile : ( data , buildState ) => {
248
+ function wrapNull ( data ) {
249
+ if ( ! chainingSupported ) return buildState . compile `(((a) => a === null || a === undefined ? null : a)(${ data } ))`
250
+ return buildState . compile `(${ data } ?? null)`
251
+ }
252
+ if ( Array . isArray ( data ) && Array . isArray ( data [ 0 ] ) ) {
253
+ // A very, very specific optimization.
254
+ if ( buildState . iteratorCompile && Math . abs ( data [ 0 ] [ 0 ] || 0 ) === 1 && data [ 1 ] === 'index' ) return buildState . compile `index`
255
+ return false
256
+ }
257
+ if ( Array . isArray ( data ) && data . length === 1 ) data = data [ 0 ]
258
+ if ( data === null ) return wrapNull ( buildState . compile `context` )
259
+ if ( ! Array . isArray ( data ) ) return wrapNull ( buildState . compile `context[${ data } ]` )
260
+ if ( Array . isArray ( data ) ) {
261
+ let res = buildState . compile `context`
262
+ for ( let i = 0 ; i < data . length ; i ++ ) {
263
+ if ( data [ i ] === null ) continue
264
+ if ( chainingSupported ) res = buildState . compile `${ res } ?.[${ data [ i ] } ]`
265
+ else res = buildState . compile `(${ res } || 0)[${ data [ i ] } ]`
266
+ }
267
+ return wrapNull ( buildState . compile `(${ res } )` )
268
+ }
269
+ return false
270
+ }
234
271
} ,
235
272
var : ( key , context , above , engine ) => {
236
273
let b
0 commit comments