{"version":3,"file":"journalize.mjs","sources":["../src/apmonth.js","../src/apdate.js","../src/apmonthtab.js","../src/apdatetab.js","../src/utils.js","../src/apnumber.js","../src/aptime.js","../src/capfirst.js","../src/intcomma.js","../src/intword.js","../src/ordinalsuffix.js","../src/ordinal.js","../src/pluralize.js","../src/widont.js","../src/yesno.js"],"sourcesContent":["/**\n * Map of AP month abbreviations. Note that they are zero-indexed due to\n * JavaScript's life choices. Exported for testing purposes.\n *\n * @private\n * @type {object}\n */\nexport const AP_MONTHS = {\n  0: 'Jan.',\n  1: 'Feb.',\n  2: 'March',\n  3: 'April',\n  4: 'May',\n  5: 'June',\n  6: 'July',\n  7: 'Aug.',\n  8: 'Sept.',\n  9: 'Oct.',\n  10: 'Nov.',\n  11: 'Dec.',\n};\n\n/**\n * Returns an AP-formatted month string that corresponds with the supplied\n * Date. If an `input` is not passed, it will use the result of `new Date();`.\n *\n * @param  {Date} [date] JavaScript Date object, defaults to current date if\n *                       not passed\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * // Remember that JavaScript zero-indexes months!\n * journalize.apmonth(new Date(2016, 10, 8));\n * // returns 'Nov.'\n *\n * // Uses the current date if no parameter is passed\n * journalize.apmonth();\n * // returns 'July' (pretend it is actually July)\n */\nexport default function apmonth(date = new Date()) {\n  return AP_MONTHS[date.getMonth()];\n}\n","import apmonth from './apmonth';\n\n/**\n * Returns an AP-formatted date string that corresponds with the supplied\n * Date. If an `input` is not passed, it will use the result of `new Date();`.\n *\n * @param  {Date} [date] JavaScript Date object, defaults to current date if\n *                       not passed\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * // Remember that JavaScript zero-indexes months!\n * journalize.apdate(new Date(2016, 10, 8));\n * // returns 'Nov. 8, 2016'\n *\n * // Uses the current date if no parameter is passed\n * journalize.apdate();\n * // returns 'July 4, 2016' (pretend it is actually July 4, 2016)\n */\nexport default function apdate(date = new Date()) {\n  const month = apmonth(date);\n  const dayOfMonth = date.getDate();\n  const year = date.getFullYear();\n\n  return `${month} ${dayOfMonth}, ${year}`;\n}\n","/**\n * Map of AP month abbreviations. Note that they are zero-indexed due to\n * JavaScript's life choices. Exported for testing purposes.\n *\n * @private\n * @type {object}\n */\nexport const AP_MONTHS_TAB = {\n  0: 'Jan',\n  1: 'Feb',\n  2: 'Mar',\n  3: 'Apr',\n  4: 'May',\n  5: 'Jun',\n  6: 'Jul',\n  7: 'Aug',\n  8: 'Sep',\n  9: 'Oct',\n  10: 'Nov',\n  11: 'Dec',\n};\n\n/**\n * Returns a tabular AP-formatted month string that corresponds with the supplied\n * Date. If an `input` is not passed, it will use the result of `new Date();`.\n *\n * @param  {Date} [date] JavaScript Date object, defaults to current date if\n *                       not passed\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * // Remember that JavaScript zero-indexes months!\n * journalize.apmonth(new Date(2016, 10, 8));\n * // returns 'Nov'\n *\n * // Uses the current date if no parameter is passed\n * journalize.apmonth();\n * // returns 'Jul' (pretend it is actually July)\n */\nexport default function apmonthtab(date = new Date()) {\n  return AP_MONTHS_TAB[date.getMonth()];\n}\n","import apmonthtab from './apmonthtab';\n\n/**\n * Returns a tabular AP-formatted date string that corresponds with the supplied\n * Date. If an `input` is not passed, it will use the result of `new Date();`.\n *\n * @param  {Date} [date] JavaScript Date object, defaults to current date if\n *                       not passed\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * // Remember that JavaScript zero-indexes months!\n * journalize.apdate(new Date(2016, 10, 8));\n * // returns 'Nov 8, 2016'\n *\n * // Uses the current date if no parameter is passed\n * journalize.apdate();\n * // returns 'Jul 4, 2016' (pretend it is actually July 4, 2016)\n */\nexport default function apdatetab(date = new Date()) {\n  const month = apmonthtab(date);\n  const dayOfMonth = date.getDate();\n  const year = date.getFullYear();\n\n  return `${month} ${dayOfMonth}, ${year}`;\n}\n","/**\n * Returns true if `value` is null or undefined;\n *\n * @private\n * @param  {*}  value\n * @return {boolean}\n */\nexport function isNil(value) {\n  return value == null;\n}\n\n/**\n * Returns true if `value` is a finite number.\n *\n * Based on: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite\n *\n * @private\n * @param  {*}  value\n * @return {boolean}\n */\nexport function _isFinite(value) {\n  return typeof value === 'number' && isFinite(value);\n}\n\n/**\n * Returns true if `value` is an integer.\n *\n * Based on: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n *\n * @private\n * @param  {*}  value\n * @return {boolean}\n */\nexport function isInteger(value) {\n  return _isFinite(value) && Math.floor(value) === value;\n}\n","import { isInteger, isNil } from './utils';\n\n/**\n * List of spelled out numbers per AP style.\n * @private\n * @type {string[]}\n */\nconst AP_NUMBERS = [\n  'one',\n  'two',\n  'three',\n  'four',\n  'five',\n  'six',\n  'seven',\n  'eight',\n  'nine',\n];\n\n/**\n * Converts an integer to string representation per AP style rules. If an\n * integer is not one that would be converted, it is returned in its original\n * form.\n *\n * If a non-integer is given, it will be returned in its original form as\n * well.\n *\n * @param  {number|string} val\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.apnumber(8);\n * // returns 'eight'\n *\n * journalize.apnumber(42);\n * // returns 42\n *\n */\nexport default function apnumber(val) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  // convert `val` to a number\n  const convertedVal = +val;\n\n  // if `convertedVal` is not an integer, return `val` coerced to a string\n  if (!isInteger(convertedVal)) return val.toString();\n\n  // if `convertedVal` is not between 0 and 10, return `val` coerced to a string\n  if (convertedVal <= 0 || convertedVal >= 10) return val.toString();\n\n  return AP_NUMBERS[convertedVal - 1];\n}\n","/**\n * Returns an AP-formatted time string that corresponds with the supplied\n * Date. If an `input` is not passed, it will use the result of `new Date();`.\n *\n * @param  {Date} [date] JavaScript Date object, defaults to current date if\n *                       not passed\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * // Bright and early\n * journalize.aptime(new Date(2016, 10, 8, 6, 30));\n * // returns '6:30 a.m.'\n *\n * // It can handle `p.m.` too\n * journalize.aptime(new Date(2016, 10, 8, 16, 30));\n * // returns '4:30 p.m.'\n *\n * // Uses the current time if no parameter is passed\n * journalize.aptime();\n * // returns '6:45 p.m.' (pretend it is actually 6:45 p.m. right now)\n */\nexport default function aptime(date = new Date()) {\n  const hours = date.getHours();\n  const minutes = date.getMinutes();\n\n  const minutesAreZero = minutes === 0;\n\n  if (minutesAreZero) {\n    if (hours === 0) return 'midnight';\n    if (hours === 12) return 'noon';\n  }\n\n  let period, hour;\n\n  if (hours < 12) {\n    period = 'a.m.';\n    // account for how Date() returns 12 a.m. as 0\n    if (hours > 0) {\n      hour = hours;\n    } else {\n      hour = 12;\n    }\n  } else {\n    period = 'p.m.';\n\n    if (hours === 12) {\n      hour = hours;\n    } else {\n      hour = hours - 12;\n    }\n  }\n\n  if (minutesAreZero) {\n    return hour + ' ' + period;\n  }\n\n  const minute = minutes < 10 ? '0' + minutes : minutes;\n  return hour + ':' + minute + ' ' + period;\n}\n","import { isNil } from './utils';\n\n/**\n * Capitalizes the first character of a value and returns it.\n *\n * @param {any} val\n * @returns {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.capfirst('hello world');\n * // returns 'Hello world'\n */\nexport default function capfirst(val) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  // coerce value to a String\n  const str = String(val);\n\n  return `${str.charAt(0).toUpperCase()}${str.slice(1)}`;\n}\n","import { _isFinite, isNil } from './utils';\n\n/**\n * Converts a number to include commas, if necessary.\n *\n * Source: http://stackoverflow.com/a/2901298\n *\n * @private\n * @param  {number|string} n\n * @return {string}\n */\nfunction numberWithCommas(n) {\n  const parts = n.toString().split('.');\n  parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n  return parts.join('.');\n}\n\n/**\n * Alters a string or number to include commas. If `val` is undefined or null,\n * an empty string is returned.\n *\n * @param  {number|string} val\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.intcomma(10311);\n * // returns '10,311'\n *\n * journalize.intcomma('1234567.1234567');\n * // returns '1,234,567.1234567'\n */\nexport default function intcomma(val) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  const convertedVal = +val;\n\n  // if `convertedVal` is not a number, don't waste time converting it\n  if (!_isFinite(convertedVal)) return val.toString();\n\n  return numberWithCommas(convertedVal);\n}\n","import { isInteger, isNil } from './utils';\n\n/**\n * Array of suffixes to be used by intword.\n * @private\n * @type {string[]}\n */\nconst SUFFIXES = [\n  'million',\n  'billion',\n  'trillion',\n  'quadrillion',\n  'quintillion',\n  'sextillion',\n  'septillion',\n  'octillion',\n  'nonillion',\n  'decillion',\n];\n\n/**\n * Returns the number of digits found in a number. Accounts for exponents, too.\n *\n * @private\n * @param  {number} n\n * @return {number}\n */\nfunction getLengthOfNumber(n) {\n  return Math.ceil(Math.log(n + 1) / Math.LN10);\n}\n\n/**\n * Converts a large integer into a string representation. Only makes sense for\n * numbers at least 1 million or more.\n *\n * @param  {number|string} val\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.intword(1000000);\n * // returns '1 million'\n *\n * journalize.intword(6500000000000);\n * // returns '6.5 trillion'\n */\nexport default function intword(val) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  const convertedVal = +val;\n\n  // if `convertedVal` is not an integer, return `val`\n  if (!isInteger(convertedVal)) return val.toString();\n\n  // get the absolute value to de-sign it\n  const absConvertedVal = Math.abs(convertedVal);\n\n  // if `convertedVal` is less than 1 million, no conversion is needed\n  if (absConvertedVal < 1000000) return val.toString();\n\n  // get the number of digits in the number, and substract remainder to get\n  // exponent value\n  const numDigits = getLengthOfNumber(absConvertedVal) - 1;\n  const exponent = numDigits - (numDigits % 3);\n\n  // calculate the rounded version of `convertedVal`\n  let newVal = convertedVal / Math.pow(10, exponent);\n  newVal = Math.round(newVal * 10) / 10;\n\n  return newVal + ' ' + SUFFIXES[Math.floor(exponent / 3) - 2];\n}\n","import { isInteger, isNil } from './utils.js';\n\n/**\n * A list of suffixes for conversions.\n * @private\n * @type {string[]}\n */\nconst SUFFIXES = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'];\n\n/**\n * A list of funky English ordinals.\n * @private\n * @type {number[]}\n */\nconst ENGLISH_ORDINAL_EXCEPTIONS = [11, 12, 13];\n\n/**\n * Determines the ordinal suffix for a given integer. Handles the special\n * cases of 11, 12 and 13. If a non-integer is submitted an empty string will\n * be returned.\n *\n * @param  {number|string} val\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.ordinalsuffix(5);\n * // returns 'th'\n *\n * journalize.ordinalsuffix(13);\n * // returns 'th'\n *\n * journalize.ordinalsuffix(103);\n * // returns 'rd'\n *\n * journalize.ordinalsuffix(7);\n * // returns 'th'\n *\n * journalize.ordinalsuffix('foo');\n * // returns ''\n */\nexport default function ordinalsuffix(val) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  // ensure `val` is a number\n  const convertedVal = +val;\n\n  // if `convertedVal` is not an integer, return an empty string\n  if (!isInteger(convertedVal)) return '';\n\n  // if `convertedVal` is 11, 12 or 13, English gets weird\n  if (ENGLISH_ORDINAL_EXCEPTIONS.indexOf(convertedVal % 100) > -1) {\n    return SUFFIXES[0];\n  }\n\n  // return the appropriate suffix\n  return SUFFIXES[convertedVal % 10];\n}\n","import { isInteger, isNil } from './utils';\nimport ordinalsuffix from './ordinalsuffix';\n\n/**\n * List of spelled out ordinals per AP style.\n * @private\n * @type {string[]}\n */\nconst AP_ORDINALS = [\n  'first',\n  'second',\n  'third',\n  'fourth',\n  'fifth',\n  'sixth',\n  'seventh',\n  'eighth',\n  'ninth',\n];\n\n/**\n * Converts an integer into its ordinal form. If `spellOutOrdinals` is `true`,\n * 1 through 9 will be spelled out per AP style. Handles the special cases of\n * 11, 12 and 13, too. If a non-integer is submitted it will be returned in\n * its original form.\n *\n * @param  {number|string} val\n * @param {boolean} [spellOutOrdinals]\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.ordinal(5);\n * // returns '5th'\n *\n * journalize.ordinal(13);\n * // returns '13th'\n *\n * journalize.ordinal(103);\n * // returns '103rd'\n *\n * journalize.ordinal(7, true);\n * // returns 'seventh'\n */\nexport default function ordinal(val, spellOutOrdinals = false) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  // ensure `val` is a number\n  const convertedVal = +val;\n\n  // if `convertedVal` is not an integer, return `val`\n  if (!isInteger(convertedVal)) return val.toString();\n\n  // if `spellOutOrdinals` is true, return the spelled out versions of 1-9\n  if (spellOutOrdinals && convertedVal < 10) {\n    return AP_ORDINALS[convertedVal - 1];\n  }\n\n  // get the suffix\n  const suffix = ordinalsuffix(convertedVal);\n\n  // return the original value with the suffix\n  return convertedVal + suffix;\n}\n","/**\n * Returns a plural suffix if the value is not 1. By default, `pluralize`\n * uses \"s\" as the suffix. If a `String` is provided, `pluralize` will attempt\n * to convert it into a `Number`. If an `Array` is provided instead of a\n * number, the length of the `Array` is used to determine the suffix. An\n * alternative plural suffix can be provided as the second parameter, and if\n * necessary, an alternative singular suffix can be provided as the third.\n *\n * @param {number|string|array} value\n * @param {string} [pluralSuffix='s']\n * @param {string} [singularSuffix='']\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * // typical usage\n * 'vote' + journalize.pluralize(0); // votes\n * 'vote' + journalize.pluralize(1); // vote\n * 'vote' + journalize.pluralize(2); // votes\n *\n * // the plural suffix may be changed\n * 'class' + journalize.pluralize(0, 'es'); // classes\n * 'class' + journalize.pluralize(1, 'es'); // class\n * 'class' + journalize.pluralize(2, 'es'); // classes\n *\n * // some words also need a custom singular suffix\n * 'cand' + journalize.pluralize(0, 'ies', 'y'); // candies\n * 'cand' + journalize.pluralize(1, 'ies', 'y'); // candy\n * 'cand' + journalize.pluralize(2, 'ies', 'y'); // candies\n */\nexport default function pluralize(\n  value,\n  pluralSuffix = 's',\n  singularSuffix = ''\n) {\n  // if this is an array, base the return value on the length\n  if (Array.isArray(value)) {\n    if (value.length !== 1) {\n      return pluralSuffix;\n    } else {\n      return singularSuffix;\n    }\n  }\n\n  // otherwise we have a string or number - convert it and test if its 1\n  if (Number(value) !== 1) {\n    return pluralSuffix;\n  }\n\n  return singularSuffix;\n}\n","import { isNil } from './utils';\n\n/**\n * The non-breaking space character added to the string passed to widont.\n * Exported for testing purposes.\n *\n * @private\n * @type {string}\n */\nexport const nbsp = '\\xA0';\n\n/**\n * The regular expression to find the final space in a string for widont.\n *\n * @private\n * @type {RegExp}\n */\nconst widontRegex = new RegExp(/\\s+([^\\s]*)\\s*$/);\n\n/**\n * Prevents \"widows\" - a word by itself on a line - from appearing in strings\n * by replacing the space between the last two words with a non-breaking space\n * character.\n *\n * @param {string} val\n * @param {string} [replaceChar='\\xA0'] The character to replace the space with\n * @returns {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.widont('this is a string');\n * // returns 'this is a&nbsp;string'\n *\n * journalize.widont('this is a string', 'HELLO');\n * // returns 'this is aHELLOstring'\n *\n */\nexport default function widont(val, replaceChar = nbsp) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  // coerce value to a String\n  const str = String(val);\n\n  return str.replace(widontRegex, `${replaceChar}$1`);\n}\n","import { isNil } from './utils';\n\n/**\n * Given a mapping of arguments for `true`, `false`, and (optionally)\n * `null`/`undefined`, return a string according to the value. If `maybe` is not\n * provided, a `null` or `undefined` value will return the `no` argument.\n *\n * @param {boolean|Null|undefined} val\n * @param {string} [yes='yes']\n * @param {string} [no='no']\n * @param {string} [maybe='maybe']\n * @returns {string|boolean|Null|undefined}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.yesno(true);\n * // returns 'yes'\n * journalize.yesno(false);\n * // returns 'no'\n * journalize.yesno(null);\n * // returns 'maybe'\n *\n * journalize.yesno(true, 'yay', 'nay', 'shruggie');\n * // returns 'yay'\n * journalize.yesno(false, 'yay', 'nay', 'shruggie');\n * // returns 'nay'\n * journalize.yesno(null, 'yay', 'nay', 'shruggie');\n * // returns 'shruggie'\n */\nexport default function yesno(val, yes = 'yes', no = 'no', maybe = 'maybe') {\n  const numberOfArguments = arguments.length;\n\n  // if the user only passes the value and a `yes` argument that's too\n  // ambiguous, so we give up\n  if (numberOfArguments === 2) return val;\n  // if the user passes the value, a `yes` and a `no` argument, don't assume\n  // the default `maybe` is what they want and use `no` instead\n  if (numberOfArguments === 3) maybe = no;\n\n  // if null or undefined, use `maybe`\n  if (isNil(val)) return maybe;\n\n  // if true, use `yes`\n  if (val) {\n    return yes;\n  }\n\n  // otherwise, must be `no`\n  return no;\n}\n"],"names":["date","getMonth","apmonth","getDate","getFullYear","apmonthtab","value","isFinite","Math","floor","val","isNil","isInteger","convertedVal","toString","hour","getHours","getMinutes","minutes","minutesAreZero","hours","period","String","str","charAt","toUpperCase","slice","_isFinite","split","parts","replace","join","abs","absConvertedVal","ceil","log","LN10","numDigits","pow","exponent","newVal","round","SUFFIXES","ENGLISH_ORDINAL_EXCEPTIONS","indexOf","spellOutOrdinals","ordinalsuffix","pluralSuffix","singularSuffix","Array","isArray","length","Number","replaceChar","widontRegex","yes","no","maybe","arguments","numberOfArguments"],"mappings":"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"}