mirror of
https://github.com/denoland/std.git
synced 2024-11-21 20:50:22 +00:00
49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
// This module is browser compatible.
|
|
|
|
/**
|
|
* Stringify an object into a valid `.env` file format.
|
|
*
|
|
* @example Usage
|
|
* ```ts
|
|
* import { stringify } from "@std/dotenv/stringify";
|
|
* import { assertEquals } from "@std/assert";
|
|
*
|
|
* const object = { GREETING: "hello world" };
|
|
* assertEquals(stringify(object), "GREETING='hello world'");
|
|
* ```
|
|
*
|
|
* @param object object to be stringified
|
|
* @returns string of object
|
|
*/
|
|
export function stringify(object: Record<string, string>): string {
|
|
const lines: string[] = [];
|
|
for (const [key, value] of Object.entries(object)) {
|
|
let quote;
|
|
|
|
let escapedValue = value ?? "";
|
|
if (key.startsWith("#")) {
|
|
// deno-lint-ignore no-console
|
|
console.warn(
|
|
`key starts with a '#' indicates a comment and is ignored: '${key}'`,
|
|
);
|
|
continue;
|
|
} else if (escapedValue.includes("\n") || escapedValue.includes("'")) {
|
|
// escape inner new lines
|
|
escapedValue = escapedValue.replaceAll("\n", "\\n");
|
|
quote = `"`;
|
|
} else if (escapedValue.match(/\W/)) {
|
|
quote = "'";
|
|
}
|
|
|
|
if (quote) {
|
|
// escape inner quotes
|
|
escapedValue = escapedValue.replaceAll(quote, `\\${quote}`);
|
|
escapedValue = `${quote}${escapedValue}${quote}`;
|
|
}
|
|
const line = `${key}=${escapedValue}`;
|
|
lines.push(line);
|
|
}
|
|
return lines.join("\n");
|
|
}
|