diff --git a/application/source/data/transformer.mjs b/application/source/data/transformer.mjs index 2e3d2e2c15e008cb2c52701056ac1c1c8e1da781..b4b6138e06c9cf94add21bf4cac347f89d11e381 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 fa8168777cea91a2e85d997f041a1b0a78cf29fe..559bea5de628abf0a2078842f4b803383d277aa2 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"],