From 51056c4b580f88d0dcba7e18ef8b452d34e100ca Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Fri, 7 Jan 2022 00:16:52 +0000 Subject: [PATCH 1/3] fix: Converter callbacks should have caller as context. --- .../ui/core/bindable/bindable-expressions.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/core/ui/core/bindable/bindable-expressions.ts b/packages/core/ui/core/bindable/bindable-expressions.ts index e3a903119a..785ff7ba49 100644 --- a/packages/core/ui/core/bindable/bindable-expressions.ts +++ b/packages/core/ui/core/bindable/bindable-expressions.ts @@ -82,20 +82,23 @@ const expressionParsers = { object = getContext(expression.callee.name, model, changedModel); property = expression.callee?.name; } + const callback = expression.callee.optional ? object?.[property] : object[property]; + if (isNullOrUndefined(callback)) { + throw new Error('Cannot perform a call using a null or undefined property'); + } + const isConverter = isObject(callback) && (isFunction(callback.toModel) || isFunction(callback.toView)); + if (!isFunction(callback) && !isConverter) { + throw new Error('Cannot perform a call using a non-callable property'); + } const parsedArgs = []; for (let argument of expression.arguments) { let value = convertExpressionToValue(argument, model, isBackConvert, changedModel); argument.type == 'SpreadElement' ? parsedArgs.push(...value) : parsedArgs.push(value); } - - if (isNullOrUndefined(callback) || (!isFunction(callback) && !isConverter)) { - throw new Error('Cannot perform a call using a non-function property'); - } - - return isConverter ? getConverter(callback, parsedArgs, isBackConvert) : callback.apply(object, parsedArgs); + return isConverter ? getConverter(callback, object, parsedArgs, isBackConvert) : callback.apply(object, parsedArgs); }, 'ChainExpression': (expression: ASTExpression, model, isBackConvert: boolean, changedModel) => { return convertExpressionToValue(expression.expression, model, isBackConvert, changedModel); @@ -177,9 +180,9 @@ function getContext(key, model, changedModel) { return key in changedModel ? changedModel : model; } -function getConverter(context, args, isBackConvert: boolean) { +function getConverter(converterSchema, context, args, isBackConvert: boolean) { const converter = { callback: null, context, args }; - let callback = isBackConvert ? context.toModel : context.toView; + let callback = isBackConvert ? converterSchema.toModel : converterSchema.toView; if (callback == null) { callback = Function.prototype; } From c89b662d864c03d08d21934e77fe4d3ec685ff27 Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Fri, 7 Jan 2022 20:52:03 +0000 Subject: [PATCH 2/3] fix: Check `global` context for indentifiers too. --- packages/core/ui/core/bindable/bindable-expressions.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/core/ui/core/bindable/bindable-expressions.ts b/packages/core/ui/core/bindable/bindable-expressions.ts index 785ff7ba49..90072fe66b 100644 --- a/packages/core/ui/core/bindable/bindable-expressions.ts +++ b/packages/core/ui/core/bindable/bindable-expressions.ts @@ -177,7 +177,11 @@ const expressionParsers = { }; function getContext(key, model, changedModel) { - return key in changedModel ? changedModel : model; + let context = key in changedModel ? changedModel : model; + if (!context && key in global) { + context = global; + } + return context; } function getConverter(converterSchema, context, args, isBackConvert: boolean) { From 9c5b74168cf56ab691f1b1b40ecfd12a30ed5dfd Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Fri, 7 Jan 2022 21:21:35 +0000 Subject: [PATCH 3/3] fix: Bad context check for `Identifier` expressions. --- packages/core/ui/core/bindable/bindable-expressions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/ui/core/bindable/bindable-expressions.ts b/packages/core/ui/core/bindable/bindable-expressions.ts index 90072fe66b..c1450e05dc 100644 --- a/packages/core/ui/core/bindable/bindable-expressions.ts +++ b/packages/core/ui/core/bindable/bindable-expressions.ts @@ -178,7 +178,7 @@ const expressionParsers = { function getContext(key, model, changedModel) { let context = key in changedModel ? changedModel : model; - if (!context && key in global) { + if (!(key in context)) { context = global; } return context;