aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc
diff options
context:
space:
mode:
Diffstat (limited to 'src/javascript/jsc')
-rw-r--r--src/javascript/jsc/javascript.zig40
-rw-r--r--src/javascript/jsc/node_env_buf_map.zig31
2 files changed, 42 insertions, 29 deletions
diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig
index 521d56486..777fc4b57 100644
--- a/src/javascript/jsc/javascript.zig
+++ b/src/javascript/jsc/javascript.zig
@@ -274,14 +274,14 @@ pub const VirtualMachine = struct {
inline fn _fetch(
global: *JSGlobalObject,
- specifier: string,
+ _specifier: string,
source: string,
log: *logger.Log,
) !ResolvedSource {
std.debug.assert(VirtualMachine.vm_loaded);
std.debug.assert(VirtualMachine.vm.global == global);
- if (vm.node_modules != null and strings.eql(vm.bundler.linker.nodeModuleBundleImportPath(), specifier)) {
+ if (vm.node_modules != null and strings.eql(vm.bundler.linker.nodeModuleBundleImportPath(), _specifier)) {
// We kind of need an abstraction around this.
// Basically we should subclass JSC::SourceCode with:
// - hash
@@ -300,7 +300,7 @@ pub const VirtualMachine = struct {
&vm.bundler.fs.fs,
) orelse 0),
};
- } else if (strings.eqlComptime(specifier, Runtime.Runtime.Imports.Name)) {
+ } else if (strings.eqlComptime(_specifier, Runtime.Runtime.Imports.Name)) {
return ResolvedSource{
.source_code = ZigString.init(Runtime.Runtime.sourceContent()),
.specifier = ZigString.init(Runtime.Runtime.Imports.Name),
@@ -313,8 +313,10 @@ pub const VirtualMachine = struct {
};
}
- const result = vm.bundler.resolve_results.get(specifier) orelse return error.MissingResolveResult;
- const path = result.path_pair.primary;
+ const specifier = normalizeSpecifier(_specifier);
+ std.debug.assert(std.fs.path.isAbsolute(specifier)); // if this crashes, it means the resolver was skipped.
+
+ const path = Fs.Path.init(specifier);
const loader = vm.bundler.options.loaders.get(path.name.ext) orelse .file;
switch (loader) {
@@ -344,7 +346,7 @@ pub const VirtualMachine = struct {
vm.bundler.allocator,
path,
loader,
- result.dirname_fd,
+ 0,
fd,
hash,
) orelse {
@@ -416,17 +418,11 @@ pub const VirtualMachine = struct {
return;
}
- const result: Resolver.Result = vm.bundler.resolve_results.get(specifier) orelse brk: {
- // We don't want to write to the hash table if there's an error
- // That's why we don't use getOrPut here
- const res = try vm.bundler.resolver.resolve(
- Fs.PathName.init(source).dirWithTrailingSlash(),
- specifier,
- .stmt,
- );
- try vm.bundler.resolve_results.put(res.path_pair.primary.text, res);
- break :brk res;
- };
+ const result = try vm.bundler.resolver.resolve(
+ Fs.PathName.init(source).dirWithTrailingSlash(),
+ specifier,
+ .stmt,
+ );
ret.result = result;
if (vm.node_modules != null and result.isLikelyNodeModule()) {
@@ -507,7 +503,17 @@ pub const VirtualMachine = struct {
res.* = ErrorableZigString.ok(ZigString.init(result.path));
}
+ pub fn normalizeSpecifier(slice: string) string {
+ if (slice.len == 0) return slice;
+ if (VirtualMachine.vm.bundler.options.origin.len > 0) {
+ if (strings.startsWith(slice, VirtualMachine.vm.bundler.options.origin)) {
+ return slice[VirtualMachine.vm.bundler.options.origin.len..];
+ }
+ }
+
+ return slice;
+ }
threadlocal var errors_stack: [256]*c_void = undefined;
pub fn fetch(ret: *ErrorableResolvedSource, global: *JSGlobalObject, specifier: ZigString, source: ZigString) callconv(.C) void {
var log = logger.Log.init(vm.bundler.allocator);
diff --git a/src/javascript/jsc/node_env_buf_map.zig b/src/javascript/jsc/node_env_buf_map.zig
index 7625ee6a1..73bc025b6 100644
--- a/src/javascript/jsc/node_env_buf_map.zig
+++ b/src/javascript/jsc/node_env_buf_map.zig
@@ -31,18 +31,25 @@ pub const NodeEnvBufMap = struct {
std.mem.copy(u8, bufkeybuf["process.env.".len..], key);
var key_slice = bufkeybuf[0 .. key.len + "process.env.".len];
var value_slice = value;
- const max_value_slice_len = std.math.min(value.len, bufkeybuf.len - key_slice.len);
- if (value_slice[0] != '"' and value_slice[value.len - 1] != '"') {
- value_slice = bufkeybuf[key_slice.len..][0 .. max_value_slice_len + 2];
- value_slice[0] = '"';
- std.mem.copy(u8, value_slice[1..], value[0..max_value_slice_len]);
- value_slice[value_slice.len - 1] = '"';
- } else if (value_slice[0] != '"') {
- value_slice[0] = '"';
- std.mem.copy(u8, value_slice[1..], value[0..max_value_slice_len]);
- } else if (value_slice[value.len - 1] != '"') {
- std.mem.copy(u8, value_slice[1..], value[0..max_value_slice_len]);
- value_slice[value_slice.len - 1] = '"';
+ if (value_slice.len > 0) {
+ const max_value_slice_len = std.math.min(value.len, bufkeybuf.len - key_slice.len);
+ if (key_slice.len < bufkeybuf.len and value_slice[0] != '"' and value_slice[value.len - 1] != '"') {
+ value_slice = bufkeybuf[key_slice.len..];
+ if (value_slice.len > 0) {
+ value_slice = value_slice[0 .. max_value_slice_len + 2];
+ value_slice[0] = '"';
+ std.mem.copy(u8, value_slice[1..], value[0..max_value_slice_len]);
+ value_slice[value_slice.len - 1] = '"';
+ } else {
+ value_slice.len = 0;
+ }
+ } else if (value_slice[0] != '"') {
+ value_slice[0] = '"';
+ std.mem.copy(u8, value_slice[1..], value[0..max_value_slice_len]);
+ } else if (value_slice[value.len - 1] != '"') {
+ std.mem.copy(u8, value_slice[1..], value[0..max_value_slice_len]);
+ value_slice[value_slice.len - 1] = '"';
+ }
}
return this.backing.put(key_slice, value_slice);