Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@bscotch/utility

bscotch363MIT7.2.0TypeScript support: included

Bscotch Utilities: Methods for common Node.js needs.

utility, util, string, template, crypto, path, file, bscotch, butterscotch shenanigans

readme

Bscotch Utilities

Utility and helper methods and types for common programming problems in Node.js.

Installation

Requirements

  • Node.js v16+

Installation

From npm:

npm install @bscotch/utility

Features

The following listings show a subset of the utilities found in this package.

Strings

import {
  capitalize,
  decodeFromBase64,
  encodeToBase64,
  decodeFromBase64JsonString,
  encodeToBase64JsonString,
  explode,
  nodent,
  oneline,
  undent,
} from '@bscotch/utility';

Paths

import { toPosixPath, sortedPaths, parentPaths } from '@bscotch/utility';

/*
 * [
 *  'hello',
 *  'h/another',
 *  'hello/world',
 *  'hello/world/goodbye'
 * ];
 */

// Get all paths leading to a target path
parentPaths('/hello/world/foo/bar.txt'); // =>
/*
 * [
 *  '/',
 *  '/hello',
 *  '/hello/world',
 *  '/hello/world/foo',
 *  '/hello/world/foo/bar.txt'
 * ]
 *
 */

Files

import {
  listPathsSync,
  listFoldersSync,
  listFilesSync,
  listFilesByExtensionSync,
  removeEmptyDirsSync,
} from '@bscotch/utility';

const recursive = true;

listPathsSync('.', recursive); // => paths to all files and folders in cwd
listFoldersSync('.', recursive); // => the subset of paths that are folders
listFilesSync('.', recursive); // => the subset of paths that are files
listFilesByExtensionSync('.', 'txt', recursive); // => the subset of files that end with '.txt'
listFilesByExtensionSync('.', ['txt', 'md'], recursive); // => the subset of files that end with '.txt' or '.md'
removeEmptyDirsSync('.'); // Remove all empty directories (recursively)

Waits

import {
  waitForMillis,
  waitForSeconds,
  waitForTick,
} from '@bscotch/utility';

async myAsynFunction(){
  // Wait for 1 second
  await waitForMillis(1000);
  // Wait for 1 second
  await waitForSeconds(1);
  // Wait until next tick
  await waitForTick();
}

Objects

import {
  isPlainObject,
  isPlainObjectOrArray,
  asObjectIfArray,
  flattenObjectPaths,
  objectPaths,
  getValueAtPath,
  setValueAtPath,
  objectPathsFromWildcardPath,
  transformValueByPath,
} from '@bscotch/utility';

asObjectIfArray(['hello']); // return {'0':'hello'}
const testObject = {
  hello: 'world',
  nested: {
    layer: 1,
    array: [4, 6, 7],
  },
};
flattenObjectPaths(testObject); // returns:
/**
 * {
 *  'hello':'world',
 *  'nested.layer': 1,
 *  'nested.array.0': 4,
 *  'nested.array.1': 6,
 *  'nested.array.2': 7,
 * }
 */
objectPaths(testObject); // returns keys from flattenObjectPaths(testObject)
getValueAtPath(testObject, 'nested.array.2'); // returns 7
setValueAtPath(testObject, 'new.0.field', 10); // adds 'new' field to set to [{field:10}]
objectPathsFromWildcardPath('nested.*', testObject); // returns:
// ['nested.layer','nested.array']
objectPathsFromWildcardPath('nested.array.*', testObject); // returns:
// ['nested.array.0','nested.array.1','nested.array.2]
transformValueByPath(testObject, 'nested.array.*', (n) => ++n); // Increments all array values by 1

Crypto

import {
  md5,
  sha1,
  sha256,
  createHash,
  encrypt,
  decrypt,
} from '@bscotch/utility';

let hash = md5('hello world'); // hex hash
hash = sha256('hello world', 'base64'); // Base64 hash
hash = createHash('sha1', 'hello world');

const key = '00000000000000000000000000000000';
const encrypted = encrypt('Hello World', key);
const sourceAsBuffer = decrypt(encrypted, key);

Dates

import {
  dateSort,
  dateSortDescending,
  dateDifferenceMillis,
  dateDifferenceSeconds,
  dateDifferenceMinutes,
  dateDifferenceHours,
  dateDifferenceDays,
  dateIsGreaterThan,
  dateIsInTheFuture,
  dateIsInThePast,
  dateIsLessThan,
  dateIsOlderThanMillisAgo,
  dateIsOlderThanSecondsAgo,
  dateIsOlderThanMinutesAgo,
  dateIsOlderThanHoursAgo,
  dateIsOlderThanDaysAgo,
  isDate,
  isValidDate,
  assertIsValidDate
} from '@bscotch/utility';

Arrays

import {
  arrayWrapped,
  arrayUnwrapped,
  arrayIsIncreasing,
  arraySortNumeric,
  arraySortNumericDescending,
} from '@bscotch/utility';

arrayIsIncreasing([-10, 99, 1111]); // => true

arrayWrapped('hello'); // => ["hello"]
arrayWrapped(['hello']); // => ["hello"]
arrayWrapped(undefined); // => []

arrayUnwrapped('hello'); // => "hello"
arrayUnwrapped(['hello']); // => "hello"
arrayUnwrapped(['hello', 'goodbye']); // => "hello"