All files / test/ctp/adapter/payshield mask.ts

9.23% Statements 6/65
100% Branches 1/1
0% Functions 0/1
9.23% Lines 6/65

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 661x 1x 1x 1x 2x                                                                                                                       1x  
import {library} from '@feasibleone/blong';
 
export default library(
    () =>
        function mask(
            message: string,
            data: Record<string, string>,
            {
                pattern,
                maskedKeys,
                maskSymbol,
            }: {
                pattern: {
                    name: string;
                    type: 'string' | unknown;
                    binhex: unknown;
                    binary: unknown;
                    z: unknown;
                }[];
                maskedKeys: string[];
                maskSymbol: string;
            },
        ) {
            return (maskedKeys || [])
                .filter(key => pattern.find(element => element.name === key))
                .map(key => {
                    const patternElement = pattern.find(v => key === v.name);
                    switch (patternElement!.type) {
                        case 'string':
                            if (patternElement!.binhex) {
                                return (
                                    (data[key] && {
                                        key,
                                        value: Buffer.from(data[key], 'hex').toString(),
                                        replaceValue: maskSymbol.repeat(data[key].length * 2),
                                    }) ||
                                    false
                                );
                            } else if (patternElement!.binary) {
                                return false;
                            } else if (patternElement!.z) {
                                return false;
                            } else {
                                return (
                                    (data[key] && {
                                        key,
                                        value: data[key],
                                        replaceValue: maskSymbol.repeat(data[key].length),
                                    }) ||
                                    false
                                );
                            }
                        default:
                            return false;
                    }
                })
                .filter(Boolean)
                .reduce(
                    (buf, maskThis) =>
                        maskThis ? buf.split(maskThis.value).join(maskThis.replaceValue) : buf,
                    message,
                )
                .toUpperCase();
        },
);