src/shared.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
const { URL } = require('url')

const httpVerbs = [
    'GET',
    'HEAD',
    'POST',
    'PUT',
    'DELETE',
    'CONNECT',
    'OPTIONS',
    'TRACE',
    'PATCH'
]

const requestRegex = new RegExp(`(${httpVerbs.join('|')})\\s(.*)`, 'i')
const replacementRegex = /(?:\\?)\$([a-zA-Z\.\d\-\_\:]+)/g
const dynamicValueRegex = /\$\[(\w+\((?:.|[\n\r])*?\))\]/g

const UpperCaseKeys = function (obj) {
    let result = {}
    Object.entries(obj).forEach(([k, v]) => (result[k.toUpperCase()] = v))
    return result
}

const isEmptyObject = (obj) =>
    Object.keys(obj).length === 0 && obj.constructor === Object

const removeOptionalKeys = function (obj, optionalValues) {
    let result = {}

    Object.entries(obj).forEach(([key, value]) => {
        if (optionalValues.includes(key) && isEmptyObject(value)) {
            return
        }

        result[key] = value
    })

    return result
}

const toKebabCase = function (str) {
    return str
        .trim()
        .replace(/([a-z])([A-Z])/g, '$1-$2')
        .toLowerCase()
}

const replaceInObject = function (obj, fn) {
    if (obj === null) {
        return null
    }

    switch (typeof obj) {
        case 'undefined':
            return {}
        case 'string':
            return fn(obj)
        case 'object':
            obj = Object.assign({}, obj)
            Object.entries(obj).forEach(
                ([key, value]) => (obj[key] = replaceInObject(value, fn))
            )
        default:
            return obj
    }
}

const moduleVersion = () => parseInt(require('../package.json').version, 10)

const isUrl = function (str) {
    try {
        new URL(str)
        return true
    } catch (e) {
        return false
    }
}

const expandPath = (url, path) => {
    if (isUrl(path)) {
        return path
    }

    return url.replace(/\/+$/, '') + '/' + path.replace(/^\/+/, '')
}

module.exports = {
    requestRegex,
    replacementRegex,
    dynamicValueRegex,
    UpperCaseKeys,
    removeOptionalKeys,
    toKebabCase,
    replaceInObject,
    moduleVersion,
    isUrl,
    expandPath
}