aboutsummaryrefslogtreecommitdiff
path: root/src/env_loader.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/env_loader.zig')
-rw-r--r--src/env_loader.zig38
1 files changed, 26 insertions, 12 deletions
diff --git a/src/env_loader.zig b/src/env_loader.zig
index ca7d8ccb3..7b8b04b62 100644
--- a/src/env_loader.zig
+++ b/src/env_loader.zig
@@ -33,8 +33,6 @@ pub const Lexer = struct {
has_newline_before: bool = true,
was_quoted: bool = false,
- is_process_env: bool = false,
-
pub inline fn codepoint(this: *const Lexer) CodePoint {
return this.cursor.c;
}
@@ -121,6 +119,7 @@ pub const Lexer = struct {
var start = lexer.current;
var last_non_space: usize = start;
var any_spaces = false;
+
while (true) {
switch (lexer.codepoint()) {
'\\' => {
@@ -191,11 +190,9 @@ pub const Lexer = struct {
)];
},
' ' => {
- if (!lexer.is_process_env) {
- any_spaces = true;
- while (lexer.codepoint() == ' ') lexer.step();
- continue;
- }
+ any_spaces = true;
+ while (lexer.codepoint() == ' ') lexer.step();
+ continue;
},
else => {},
}
@@ -232,7 +229,7 @@ pub const Lexer = struct {
// const RE_INI_KEY_VAL = /^\s*([\w.-]+)\s*=\s*(.*)?\s*$/
// const RE_NEWLINES = /\\n/g
// const NEWLINES_MATCH = /\r\n|\n|\r/
- pub fn next(this: *Lexer) ?Variable {
+ pub fn next(this: *Lexer, comptime is_process_env: bool) ?Variable {
if (this.end == 0) this.step();
const start = this.start;
@@ -289,6 +286,22 @@ pub const Lexer = struct {
if (key.len == 0) return null;
this.step();
+ // we don't need to do special parsing on process-level environment variable values
+ // if they're quoted, we should keep them quoted.
+ // https://github.com/Jarred-Sumner/bun/issues/40
+ if (comptime is_process_env) {
+ const current = this.current;
+ // TODO: remove this loop
+ // it's not as simple as just setting to the end of the string
+ while (this.codepoint() != -1) : (this.step()) {}
+ return Variable{
+ .key = key,
+ .value = this.source.contents[current..],
+ // nested values are unsupported in process environment variables
+ .has_nested_value = false,
+ };
+ }
+
this.has_nested_value = false;
inner: while (true) {
switch (this.codepoint()) {
@@ -576,7 +589,7 @@ pub const Loader = struct {
// mostly for tests
pub fn loadFromString(this: *Loader, str: string, comptime overwrite: bool) void {
var source = logger.Source.initPathString("test", str);
- Parser.parse(&source, this.allocator, this.map, overwrite, true);
+ Parser.parse(&source, this.allocator, this.map, overwrite, false);
std.mem.doNotOptimizeAway(&source);
}
@@ -716,16 +729,15 @@ pub const Parser = struct {
allocator: *std.mem.Allocator,
map: *Map,
comptime override: bool,
- is_process: bool,
+ comptime is_process: bool,
) void {
var lexer = Lexer.init(source);
- lexer.is_process_env = is_process;
var fbs = std.io.fixedBufferStream(&temporary_nested_value_buffer);
var writer = fbs.writer();
var temp_variable_i: u16 = 0;
var total_alloc_len: usize = 0;
- while (lexer.next()) |variable| {
+ while (lexer.next(is_process)) |variable| {
if (variable.has_nested_value) {
writer.context.reset();
@@ -912,6 +924,8 @@ test "DotEnv Process" {
try expectString(loader.map.get("USER").?, process.get("USER").?);
try expect(loader.map.get("USER").?.len > 0);
+ try expectString(loader.map.get("HOME").?, process.get("HOME").?);
+ try expect(loader.map.get("HOME").?.len > 0);
}
test "DotEnv Loader - copyForDefine" {