All files / src/custom-element/helpers valueConverter.ts

85.71% Statements 30/35
82.69% Branches 43/52
100% Functions 2/2
85.71% Lines 30/35

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 11221x   21x       138x   40x     138x             138x       11x   11x   11x                 127x           89x   89x       37x               89x   52x           52x           52x       75x   7x     68x   1x     67x         29x   29x   6x     23x   4x     19x           19x         21x
import getGlobalFunction from "./getGlobalFunction";
 
const valueConverter = {
 
    toProperty: (value: string, type: Function | Function[]) => {
 
        if (!Array.isArray(type)) { // Convert type to array so we can handle multiple types as well
 
            type = [type];
        }
 
        Iif (value === null &&
            type.includes(String)) { // When an attribute gets removed attributeChangedCallback gives the value of null
 
            return '';
        }
 
        // First try a function since that can create any of the objects below
        if (value !== null &&
            value[value.length - 2] === '(' && value[value.length - 1] === ')' // The function by convention must end in ()
            && type.includes(Function)) {
 
            const fcn = getGlobalFunction(value);
 
            Eif (fcn !== undefined) {
 
                return fcn;
            }
        }
 
        // if (type.includes(ElementNode)) {
 
        //     return createVirtualNode(value);
        // }
 
        if (type.includes(Object) ||
            type.includes(Array)
        ) {
 
            let o;
 
            try {
 
                o = JSON.parse(value);
            }
            catch (error) {
 
                Iif (!type.includes(String)) {
 
                    throw error; // Malformed JSON
                }
 
                // Try the other types below
            }
 
            if (o !== undefined) {
 
                Iif (!Array.isArray(o) &&
                    !type.includes(Object)) {
 
                    throw Error(`value: ${value} is not an array but there is no object type expected`);
                }
 
                Iif (Array.isArray(o) &&
                    !type.includes(Array)) {
 
                    throw Error(`value: ${value} is an array but there is no array type expected`);
                }
 
                return o;
            }
        }
 
        if (type.includes(Boolean)) {
 
            return value !== null && value !== 'false';
        }
 
        if (type.includes(Number)) {
 
            return value === null ? null : Number(value);
        }
 
        return value;
    },
 
    toAttribute: (value: any) => {
 
        const type = typeof value;
 
        if (type === 'boolean') {
 
            return value ? 'true' : 'false';
        }
 
        if (type === 'object' || Array.isArray(value)) {
 
            return value == null ? value : JSON.stringify(value);
        }
 
        Iif (value === undefined ||
            value === null) {
 
            return `${value}`; // Convert undefined and null to string
        }
 
        return value;
    }
 
};
 
export default valueConverter;