export const readableDate = (s: string) => { const ts = new Date(s); const date = ts.toLocaleDateString(); const time = ts.toLocaleTimeString([], { hour: "numeric", minute: "2-digit", }); return `${time} on ${date}`; }; export const capitalize = (s: string) => { return s.charAt(0).toUpperCase() + s.substring(1).toLowerCase(); }; const LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm; export const dotenv_parse = (src: string): Record => { // Parser src into an Object const obj = {} as Record; // Convert buffer to string let lines = src.toString(); // Convert line breaks to same format lines = lines.replace(/\r\n?/gm, "\n"); let match; while ((match = LINE.exec(lines)) != null) { const key = match[1]; // Default undefined or null to empty string let value = match[2] || ""; // Remove whitespace value = value.trim(); // Check if double quoted const maybeQuote = value[0]; // Remove surrounding quotes value = value.replace(/^(['"`])([\s\S]*)\1$/gm, "$2"); // Expand newlines if double quoted if (maybeQuote === '"') { value = value.replace(/\\n/g, "\n"); value = value.replace(/\\r/g, "\r"); } // Add to object obj[key] = value; } return obj; };