All files / src/components/m-converter.vue index.vue

20% Statements 9/45
5.88% Branches 2/34
12.5% Functions 1/8
23.68% Lines 9/38

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      7x     7x   7x   7x                 159x 159x   159x                                                                                          
<script>
export default {
    props: {
        converter: { type: [String, Object], default: undefined },
    },
    data() {
        let currentConverter = {};
        let types = []
        if (this.converter) {
            if (this.converter instanceof Object)
                currentConverter = this.converter;
            else if (this.converter.startsWith('join')) {
                const m = this.converter.match(/^join(\.number)?(:.+)?$/);
                if (!m)
                    throw new Error('converter format error');
                const number = !!m[1];
                const sep = m[2] ? m[2].slice(1) : ',';
                currentConverter = {
                    get(values) {
                        if (Array.isArray(values)) {
                            types = values.map(v => typeof v)
                            return values.join(sep);
    I                    }
                    },
                    set(value) {
                        if (Array.isArray(value))
                            return value;
                        const values = value ? value.split(sep) : [];
                        return number ? values.map((i) => +i) : values.map((v, i) => {
                            const type = types[i]
                            if (type === 'string') {
                                return v.toString()
                            } else if (type === 'number') {
                                return +v
                            } else if (type === 'undefined') {
                                return
                            } else if (type === 'boolean') {
                                return v === 'true'
                            } else {
                                return v
                            }
                        });
                    },
                };
            } else if (this.converter === 'json') {
                currentConverter = {
                    get(values) {
                        return JSON.stringify(values);
                    },
                    set(value) {
                        if (Array.isArray(value))
                            return value;
                        try {
                            return JSON.parse(value || '[]');
                        } catch (err) {
                            return [];
                        }
                    },
                };
            }
        }
        return {
            currentConverter,
        };
    },
};
</script>