From fcf49ded6a48464cb7217828cb71bf897108a80b Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Wed, 1 Mar 2023 19:23:18 +0100
Subject: [PATCH] feat: new equal command

---
 application/source/data/transformer.mjs     | 90 +++++++++++++++------
 development/test/cases/data/transformer.mjs | 20 +++++
 2 files changed, 84 insertions(+), 26 deletions(-)

diff --git a/application/source/data/transformer.mjs b/application/source/data/transformer.mjs
index 2e3d2e2c1..b4b6138e0 100644
--- a/application/source/data/transformer.mjs
+++ b/application/source/data/transformer.mjs
@@ -186,33 +186,33 @@ function transform(value) {
         case "tolowercase":
             validateString(value);
             return value.toLowerCase();
-            
+
         case "contains":
             if (isString(value)) {
-                return value.includes(args[0]);    
+                return value.includes(args[0]);
             }
-            
+
             if (isArray(value)) {
                 return value.includes(args[0]);
             }
-            
+
             if (isObject(value)) {
                 return value.hasOwnProperty(args[0]);
             }
-            
+
+            return false;
+
+        case "has-entries":
+        case "hasentries":
+            if (isObject(value)) {
+                return Object.keys(value).length > 0;
+            }
+
+            if (isArray(value)) {
+                return value.length > 0;
+            }
+
             return false;
-            
-            case "has-entries":
-            case "hasentries":
-                if (isObject(value)) {
-                    return Object.keys(value).length > 0;
-                }
-                
-                if (isArray(value)) {
-                    return value.length > 0;
-                }
-                
-                return false;
 
         case "isundefined":
         case "is-undefined":
@@ -576,7 +576,45 @@ function transform(value) {
 
             return map.get(value);
 
-        case "money":    
+        case "equals":
+
+            if (args.length === 0) {
+                throw new Error("missing value parameter");
+            }
+
+            validatePrimitive(value);
+
+            const equalsValue = args.shift();
+
+            /**
+             * The history of “typeof null”
+             * https://2ality.com/2013/10/typeof-null.html
+             * In JavaScript, typeof null is 'object', which incorrectly suggests
+             * that null is an object.
+             */
+            if (value === null) {
+                if (equalsValue === "null") {
+                    return true;
+                }
+                return false;
+            }
+
+            const typeOfValue = typeof value;
+
+            switch (typeOfValue) {
+                case "string":
+                    return value === equalsValue;
+                case "number":
+                    return value === parseFloat(equalsValue);
+                case "boolean":
+                    return value === (equalsValue === "true" || equalsValue === "on");
+                case "undefined":
+                    return equalsValue === "undefined";
+                default:
+                    throw new Error("type not supported");
+            }
+
+        case "money":
         case "currency":
 
             try {
@@ -584,24 +622,24 @@ function transform(value) {
             } catch (e) {
                 throw new Error("unsupported locale or missing format (" + e.message + ")");
             }
-            
+
             const currency = value.substring(0, 3);
-            if(!currency) {
+            if (!currency) {
                 throw new Error("missing currency parameter");
             }
-            
+
             const maximumFractionDigits = args?.[0] || 2;
             const roundingIncrement = args?.[1] || 5;
-            
+
             const nf = new Intl.NumberFormat(locale, {
                 style: "currency",
                 currency: currency,
                 maximumFractionDigits: maximumFractionDigits,
                 roundingIncrement: roundingIncrement,
             });
-            
+
             return nf.format(value.substring(3));
-            
+
         case "timestamp":
             date = new Date(value);
             timestamp = date.getTime();
@@ -637,7 +675,7 @@ function transform(value) {
             } catch (e) {
                 throw new Error("unsupported locale or missing format (" + e.message + ")");
             }
-            
+
         case "date":
             date = new Date(value);
             if (isNaN(date.getTime())) {
@@ -651,7 +689,7 @@ function transform(value) {
             } catch (e) {
                 throw new Error("unsupported locale or missing format (" + e.message + ")");
             }
-            
+
 
         case "year":
             date = new Date(value);
diff --git a/development/test/cases/data/transformer.mjs b/development/test/cases/data/transformer.mjs
index fa8168777..559bea5de 100644
--- a/development/test/cases/data/transformer.mjs
+++ b/development/test/cases/data/transformer.mjs
@@ -28,6 +28,26 @@ describe('Transformer', function () {
     describe('Transformer.run()', function () {
 
         [
+            ['equals:a', "a", true],
+            ['equals:a', "b", false],
+            ['equals:3', 3, true],
+            ['equals:3', 6, false],
+            ['equals:on', true, true],
+            ['equals:true', true, true],
+            ['equals:on', false, false],
+            ['equals:true', false, false],
+            ['equals:off', false, true],
+            ['equals:false', false, true],
+            ['equals:off', false, true],
+            ['equals:false', true, false],
+            ['equals:3', 3, true],
+            ['equals:3', 6, false],
+            ['equals:undefined', undefined, true],
+            ['equals:undefined', 3, false],
+            ['equals:null', null, true],
+            ['equals:null', 3, false],
+            ['equals:3', 6, false],
+            ['currency', "EUR0", "0,00 €"],
             ['currency:1:2', "EUR14.25", "14,2 €"],
             ['currency', "EUR14.25", "14,25 €"],
             ['datetime', "2023-02-14 14:12:10", "14.2.2023, 14:12:10"],
-- 
GitLab