index.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /**
  2. * @typedef Options
  3. * Configuration for `stringify`.
  4. * @property {boolean} [padLeft=true]
  5. * Whether to pad a space before a token.
  6. * @property {boolean} [padRight=false]
  7. * Whether to pad a space after a token.
  8. */
  9. /**
  10. * @typedef {Options} StringifyOptions
  11. * Please use `StringifyOptions` instead.
  12. */
  13. /**
  14. * Parse comma-separated tokens to an array.
  15. *
  16. * @param {string} value
  17. * Comma-separated tokens.
  18. * @returns {Array<string>}
  19. * List of tokens.
  20. */
  21. export function parse(value) {
  22. /** @type {Array<string>} */
  23. const tokens = []
  24. const input = String(value || '')
  25. let index = input.indexOf(',')
  26. let start = 0
  27. /** @type {boolean} */
  28. let end = false
  29. while (!end) {
  30. if (index === -1) {
  31. index = input.length
  32. end = true
  33. }
  34. const token = input.slice(start, index).trim()
  35. if (token || !end) {
  36. tokens.push(token)
  37. }
  38. start = index + 1
  39. index = input.indexOf(',', start)
  40. }
  41. return tokens
  42. }
  43. /**
  44. * Serialize an array of strings or numbers to comma-separated tokens.
  45. *
  46. * @param {Array<string|number>} values
  47. * List of tokens.
  48. * @param {Options} [options]
  49. * Configuration for `stringify` (optional).
  50. * @returns {string}
  51. * Comma-separated tokens.
  52. */
  53. export function stringify(values, options) {
  54. const settings = options || {}
  55. // Ensure the last empty entry is seen.
  56. const input = values[values.length - 1] === '' ? [...values, ''] : values
  57. return input
  58. .join(
  59. (settings.padRight ? ' ' : '') +
  60. ',' +
  61. (settings.padLeft === false ? '' : ' ')
  62. )
  63. .trim()
  64. }