Utils.js

/** @module Utils */

/**
 *  S3 is NOT a DB
 *  Simple interface to using Amazon S3 as a database.
 *
 *  Copyright 2023, Marc S. Brooks (https://mbrooks.info)
 *  Licensed under the MIT license:
 *  http://www.opensource.org/licenses/mit-license.php
 */

'use strict';

// Local reference.
const Utils = this;

/**
 * Compare two arrays of strings.
 *
 * @param {Array} arr1
 *   Array one.
 *
 * @param {Array} arr2
 *   Array two.
 *
 * @return {Boolean}
 *
 * @example
 * const result = Utils.compareArrays(
 *   ['foo','bar','biz'],
 *   ['bar','qux','baz']
 * );
 * // false
 */
exports.compareArrays = function(arr1, arr2) {
  if (Array.isArray(arr1) && Array.isArray(arr2) && arr1.length === arr2.length) {
    arr1.sort();
    arr2.sort();

    return arr1.every((item, index) => item === arr2[index]);
  }

  return false;
};

/**
 * Generate a pseudo-random string.
 *
 * @param {Number} len
 *   Character length (default: 32).
 *
 * @return {String|undefined}
 *
 * @example
 * const result = Utils.genRandomStr(10);
 */
exports.genRandomStr = function(len = 32) {
  let chars = 'abcdefghjkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789'
    .split('');

  // Perform (Durstenfeld) shuffle.
  for (let i = chars.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    const tmp = chars[i];

    chars[i] = chars[j];
    chars[j] = tmp;
  }

  chars = chars.join('');

  let str = '';

  // Trim string to length.
  for (let i = 0; i < len; i++) {
    str += chars.charAt(Math.floor(Math.random() * chars.length));
  }

  return str || undefined;
};

/**
 * Check if value is an Object instance.
 *
 * @param {Object}
 *   Object to check.
 *
 * @return {Boolean}
 *
 * @example
 * const result = Utils.isObject({foo: 'bar'});
 * // true
 */
exports.isObject = function(value) {
  return typeof value === 'object' && Object.prototype.toString.call(value) === '[object Object]';
};

/**
 * Return Pascal Case formatted string.
 *
 * @param {String} valueChanged(newValue) {
 *   String value to convert.
 *
 * @return {String}
 *
 * @example
 * const result = Utils.pascalCase('foo-bar_BizBaz);
 * // FooBarBizBaz
 */
exports.pascalCase = function(value) {
  value = value.replace(/[^a-z-_ ]/gi, '-');

  let parts = value.split(/[-_ ]/g);

  parts = parts.map(str => {
    return (/^[A-Z]+$/.test(str))
      ? str.toLowerCase() : str;
  });

  parts = parts.map(str => {
    return str.charAt(0).toUpperCase() + str.slice(1);
  });

  return parts.join('');
};