eternity1984/node-red-contrib-friendly-id

View on GitHub
node/lib/actions.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
const shortid = require('short-uuid')
const { nanoid, customAlphabet } = require('nanoid')
const nanodict = require('nanoid-dictionary')

/**
 *
 * @param {Object} config
 * @returns {Action}
 */
module.exports = function (config) {
  switch (config.mode) {
    case 'GENERATE-NANOID':
      return new GenerateNanoID(config)
    case 'GENERATE-SHORTID':
      return new GenerateShortID()
    case 'GENERATE-UUID4':
      return new GenerateUUID4()
    case 'DECODE':
      return new ConvertToUUID()
    case 'ENCODE':
      return new ConvertFromUUID()
  }
  return undefined
}

class Action {
  /**
     *
     * @param {String} input
     * @returns {String}
     */
  exec (input) {}

  /**
     * @returns {Boolean}
     */
  ignoreInput () {
    return false
  }
}

class GenerateUUID4 extends Action {
  exec (input) {
    return shortid().uuid()
  }

  ignoreInput () {
    return true
  }
}

class GenerateShortID extends Action {
  exec (input) {
    return shortid().new()
  }

  ignoreInput () {
    return true
  }
}

class GenerateNanoID extends Action {
  constructor (config) {
    super()
    this.config = config
    this.charsets = {
      NUMERIC: nanodict.numbers,
      LOWERCASE: nanodict.lowercase,
      UPPERCASE: nanodict.uppercase,
      ALPHANUMERIC: nanodict.numbers + nanodict.lowercase + nanodict.uppercase,
      'NO-LOOKALIKES': nanodict.nolookalikes,
      'NO-LOOKALIKES-SAFE': nanodict.nolookalikesSafe
    }
  }

  exec (input) {
    const charlen = this.config.charlen || 21
    const charset = this.config.charset || 'DEFAULT'
    const size = Number(charlen)
    if (charset in this.charsets) {
      return customAlphabet(this.charsets[charset], size)()
    } else if (charset === 'CUSTOM') {
      return customAlphabet(this.config.customs, size)()
    } else {
      // DEFAULT
      return nanoid(size)
    }
  }

  ignoreInput () {
    return true
  }
}

class ConvertToUUID extends Action {
  exec (input) {
    return shortid().toUUID(input)
  }
}

class ConvertFromUUID extends Action {
  exec (input) {
    return shortid().fromUUID(input)
  }
}