/** * @typedef Options * Configuration for `stringify`. * @property {boolean} [padLeft=true] * Whether to pad a space before a token. * @property {boolean} [padRight=false] * Whether to pad a space after a token. */ /** * @typedef {Options} StringifyOptions * Please use `StringifyOptions` instead. */ /** * Parse comma-separated tokens to an array. * * @param {string} value * Comma-separated tokens. * @returns {Array} * List of tokens. */ export function parse(value) { /** @type {Array} */ const tokens = [] const input = String(value || '') let index = input.indexOf(',') let start = 0 /** @type {boolean} */ let end = false while (!end) { if (index === -1) { index = input.length end = true } const token = input.slice(start, index).trim() if (token || !end) { tokens.push(token) } start = index + 1 index = input.indexOf(',', start) } return tokens } /** * Serialize an array of strings or numbers to comma-separated tokens. * * @param {Array} values * List of tokens. * @param {Options} [options] * Configuration for `stringify` (optional). * @returns {string} * Comma-separated tokens. */ export function stringify(values, options) { const settings = options || {} // Ensure the last empty entry is seen. const input = values[values.length - 1] === '' ? [...values, ''] : values return input .join( (settings.padRight ? ' ' : '') + ',' + (settings.padLeft === false ? '' : ' ') ) .trim() }