Skip to content

Commit

Permalink
Add support for single- and double-quoted string values
Browse files Browse the repository at this point in the history
  • Loading branch information
LeoBakerHytch committed Nov 8, 2022
1 parent 80cdc9a commit df366c7
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 4 deletions.
16 changes: 15 additions & 1 deletion lib/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,21 @@ export function parse(dotEnv: string): Env {
if (!match) continue;

const variableName = match[1];
parsed[variableName] = match[2];

// Adapted from https://github.com/motdotla/dotenv/blob/463952012640a919a82be0de11f473c1224b498a/lib/main.js
let value = match[2].trim() || '';
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');
}

parsed[variableName] = value;
}

return parsed;
Expand Down
84 changes: 81 additions & 3 deletions tests/parse.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,59 @@ describe('parse', () => {
});
});

it('should parse large number values', () => {
it('should parse string values with leading and trailing whitespace removed', () => {
expect(parse(ok3)).toEqual({
STRING_LEADING_WHITESPACE: 'Lorem ipsum',
STRING_TRAILING_WHITESPACE: 'Lorem ipsum',
STRING_SURROUNDING_WHITESPACE: 'Lorem ipsum',
});
});

it('should parse single and double quoted string values', () => {
expect(parse(ok4)).toEqual({
STRING_SINGLE_QUOTED: 'Lorem ipsum',
STRING_DOUBLE_QUOTED: 'Lorem ipsum',
});
});

it('should preserve leading or trailing whitespace within quoted string values', () => {
expect(parse(ok5)).toEqual({
STRING_SINGLE_QUOTED_WHITESPACE: ' Lorem ipsum ',
STRING_DOUBLE_QUOTED_WHITESPACE: ' Lorem ipsum ',
});
});

it('should remove whitespace outside quoted string values', () => {
expect(parse(ok6)).toEqual({
STRING_QUOTED_LEADING_WHITESPACE: 'Lorem ipsum',
STRING_QUOTED_TRAILING_WHITESPACE: 'Lorem ipsum',
STRING_QUOTED_SURROUNDING_WHITESPACE: 'Lorem ipsum',
});
});

it('should replace escaped newlines / carriage returns with their literal value inside double quotes', () => {
expect(parse(ok7)).toEqual({
STRING_DOUBLE_QUOTED_NEWLINE: 'Lorem\nipsum',
STRING_DOUBLE_QUOTED_CARRIAGE_RETURN: 'Lorem\ripsum',
});
});

it('should parse empty strings', () => {
expect(parse(ok8)).toEqual({
EMPTY_STRING: '',
EMPTY_SINGLE_QUOTED_STRING: '',
EMPTY_DOUBLE_QUOTED_STRING: '',
});
});

it('should parse large number values', () => {
expect(parse(ok9)).toEqual({
LARGE_NUMBER: '123456789012345',
});
});

it('should parse lowercase identifiers', () => {
expect(parse(ok4)).toEqual({
expect(parse(ok10)).toEqual({
lowercase_identifier: 'true',
});
});
Expand Down Expand Up @@ -51,10 +96,43 @@ STRING_WITH_WHITESPACE=Lorem ipsum
`;

const ok3 = `
LARGE_NUMBER=123456789012345
STRING_LEADING_WHITESPACE= Lorem ipsum
STRING_TRAILING_WHITESPACE=Lorem ipsum
STRING_SURROUNDING_WHITESPACE= Lorem ipsum
`;

const ok4 = `
STRING_SINGLE_QUOTED='Lorem ipsum'
STRING_DOUBLE_QUOTED="Lorem ipsum"
`;

const ok5 = `
STRING_SINGLE_QUOTED_WHITESPACE=' Lorem ipsum '
STRING_DOUBLE_QUOTED_WHITESPACE=" Lorem ipsum "
`;

const ok6 = `
STRING_QUOTED_LEADING_WHITESPACE= 'Lorem ipsum'
STRING_QUOTED_TRAILING_WHITESPACE='Lorem ipsum'
STRING_QUOTED_SURROUNDING_WHITESPACE= 'Lorem ipsum'
`;

const ok7 = `
STRING_DOUBLE_QUOTED_NEWLINE="Lorem\\nipsum"
STRING_DOUBLE_QUOTED_CARRIAGE_RETURN="Lorem\\ripsum"
`;

const ok8 = `
EMPTY_STRING=
EMPTY_SINGLE_QUOTED_STRING=''
EMPTY_DOUBLE_QUOTED_STRING=""
`;

const ok9 = `
LARGE_NUMBER=123456789012345
`;

const ok10 = `
lowercase_identifier=true
`;

Expand Down

0 comments on commit df366c7

Please sign in to comment.