1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-07 12:13:45 +00:00
Files
browser/apps/cli/src/tools/send/util.ts

56 lines
1.9 KiB
TypeScript

/**
* Parses email addresses from various input formats and combines them with previously parsed emails.
*
* Supports: single email, JSON array, comma-separated, or space-separated lists.
* Note: Function signature follows Commander.js option parsing pattern.
*
* @param input - Email input string in any supported format
* @param previousInput - Previously parsed email addresses to append to
* @returns Combined array of email addresses
* @throws {Error} For invalid JSON, non-array JSON, invalid email addresses, or unrecognized format
*
* @example
* parseEmail("user@example.com", []) // ["user@example.com"]
* parseEmail('["user1@example.com", "user2@example.com"]', []) // ["user1@example.com", "user2@example.com"]
* parseEmail("user1@example.com, user2@example.com", []) // ["user1@example.com", "user2@example.com"]
*/
export function parseEmail(input: string, previousInput: string[]) {
let result = previousInput ?? [];
if (isEmail(input)) {
result.push(input);
} else if (input.startsWith("[")) {
const json = JSON.parse(input);
if (!Array.isArray(json)) {
throw new Error("invalid JSON");
}
result = result.concat(json);
} else if (input.includes(",")) {
result = result.concat(parseList(input, ","));
} else if (input.includes(" ")) {
result = result.concat(parseList(input, " "));
} else {
throw new Error("`input` must be a single address, a comma-separated list, or a JSON array");
}
return result;
}
function isEmail(input: string) {
return !!input && !!input.match(/^([\w._+-]+?)@([\w._+-]+?)$/);
}
function parseList(value: string, separator: string) {
const parts = value
.split(separator)
.map((v) => v.trim())
.filter((v) => !!v.length);
const invalid = parts.find((v) => !isEmail(v));
if (invalid) {
throw new Error(`Invalid email address: ${invalid}`);
}
return parts;
}