Former-commit-id: 0b8128cb3b4db02f9d33331b4c2c1b595156e6c8
This commit is contained in:
Jarred Sumner
2021-08-14 02:39:44 -07:00
parent f59892f647
commit 16c7674304
38 changed files with 3190 additions and 1797 deletions

View File

@@ -39,6 +39,8 @@ pub const Wundle = struct {
threadlocal var css_imports_buf: std.ArrayList(u8) = undefined;
threadlocal var css_imports_buf_loaded: bool = false;
threadlocal var routes_list_strings: [1024]ZigString = undefined;
pub fn onImportCSS(
resolve_result: *const Resolver.Result,
import_record: *ImportRecord,
@@ -97,7 +99,7 @@ pub const Wundle = struct {
prop: js.JSStringRef,
exception: js.ExceptionRef,
) js.JSValueRef {
return ZigString.init(VirtualMachine.vm.bundler.options.origin).toValue(VirtualMachine.vm.global).asRef();
return ZigString.init(VirtualMachine.vm.bundler.options.origin.origin).toValue(VirtualMachine.vm.global).asRef();
}
pub fn getMain(
@@ -110,6 +112,16 @@ pub const Wundle = struct {
return ZigString.init(VirtualMachine.vm.main).toValue(VirtualMachine.vm.global).asRef();
}
pub fn getAssetPrefix(
this: void,
ctx: js.JSContextRef,
thisObject: js.JSValueRef,
prop: js.JSStringRef,
exception: js.ExceptionRef,
) js.JSValueRef {
return ZigString.init(VirtualMachine.vm.bundler.options.routes.asset_prefix_path).toValue(VirtualMachine.vm.global).asRef();
}
pub fn getRoutesDir(
this: void,
ctx: js.JSContextRef,
@@ -124,20 +136,6 @@ pub const Wundle = struct {
return ZigString.init(VirtualMachine.vm.bundler.options.routes.dir).toValue(VirtualMachine.vm.global).asRef();
}
pub fn routeByName(
this: void,
ctx: js.JSContextRef,
thisObject: js.JSValueRef,
prop: js.JSStringRef,
exception: js.ExceptionRef,
) js.JSValueRef {
if (!VirtualMachine.vm.bundler.options.routes.routes_enabled) {
return js.JSValueMakeUndefined(ctx);
}
return ZigString.init(VirtualMachine.vm.bundler.options.routes.dir).toValue(VirtualMachine.vm.global).asRef();
}
pub fn getImportedStyles(
this: void,
ctx: js.JSContextRef,
@@ -155,15 +153,39 @@ pub const Wundle = struct {
return JSValue.createStringArray(VirtualMachine.vm.global, styles.ptr, styles.len).asRef();
}
pub fn getRouteFiles(
this: void,
ctx: js.JSContextRef,
function: js.JSObjectRef,
thisObject: js.JSObjectRef,
arguments: []const js.JSValueRef,
exception: js.ExceptionRef,
) js.JSValueRef {
if (VirtualMachine.vm.bundler.router == null) return js.JSValueMakeNull(ctx);
const router = &(VirtualMachine.vm.bundler.router orelse unreachable);
const list = router.getEntryPointsWithBuffer(VirtualMachine.vm.allocator, false) catch unreachable;
VirtualMachine.vm.flush_list.append(list.buffer) catch {};
defer VirtualMachine.vm.allocator.free(list.entry_points);
for (routes_list_strings[0..std.math.min(list.entry_points.len, routes_list_strings.len)]) |_, i| {
routes_list_strings[i] = ZigString.init(list.entry_points[i]);
}
const ref = JSValue.createStringArray(VirtualMachine.vm.global, &routes_list_strings, list.entry_points.len).asRef();
return ref;
}
pub fn getPublicPath(to: string, comptime Writer: type, writer: Writer) void {
const relative_path = VirtualMachine.vm.bundler.fs.relativeTo(to);
if (VirtualMachine.vm.bundler.options.origin.len > 0) {
writer.print(
"{s}/{s}",
.{
std.mem.trimRight(u8, VirtualMachine.vm.bundler.options.origin, "/"),
std.mem.trimLeft(u8, relative_path, "/"),
},
if (VirtualMachine.vm.bundler.options.origin.isAbsolute()) {
VirtualMachine.vm.bundler.options.origin.joinWrite(
Writer,
writer,
VirtualMachine.vm.bundler.options.routes.asset_prefix_path,
"",
relative_path,
"",
) catch unreachable;
} else {
writer.writeAll(std.mem.trimLeft(u8, relative_path, "/")) catch unreachable;
@@ -194,6 +216,13 @@ pub const Wundle = struct {
.@"return" = "string[]",
},
},
.getRouteFiles = .{
.rfn = Wundle.getRouteFiles,
.ts = d.ts{
.name = "getRouteFiles",
.@"return" = "string[]",
},
},
},
.{
.Route = Router.Instance.GetClass(void){},
@@ -213,6 +242,10 @@ pub const Wundle = struct {
.get = getRoutesDir,
.ts = d.ts{ .name = "routesDir", .@"return" = "string" },
},
.assetPrefix = .{
.get = getAssetPrefix,
.ts = d.ts{ .name = "assetPrefix", .@"return" = "string" },
},
},
);
};
@@ -240,6 +273,8 @@ pub const VirtualMachine = struct {
main: string = "",
process: js.JSObjectRef = null,
flush_list: std.ArrayList(string),
pub var vm_loaded = false;
pub var vm: *VirtualMachine = undefined;
@@ -274,6 +309,7 @@ pub const VirtualMachine = struct {
.console = console,
.node_modules = bundler.options.node_modules_bundle,
.log = log,
.flush_list = std.ArrayList(string).init(allocator),
};
VirtualMachine.vm.bundler.configureLinker();
@@ -305,6 +341,13 @@ pub const VirtualMachine = struct {
threadlocal var source_code_printer: js_printer.BufferPrinter = undefined;
threadlocal var source_code_printer_loaded: bool = false;
pub fn flush(this: *VirtualMachine) void {
for (this.flush_list.items) |item| {
this.allocator.free(item);
}
this.flush_list.shrinkRetainingCapacity(0);
}
inline fn _fetch(
global: *JSGlobalObject,
_specifier: string,
@@ -537,12 +580,23 @@ pub const VirtualMachine = struct {
res.* = ErrorableZigString.ok(ZigString.init(result.path));
}
pub fn normalizeSpecifier(slice: string) string {
pub fn normalizeSpecifier(slice_: string) string {
var slice = slice_;
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..];
if (strings.startsWith(slice, VirtualMachine.vm.bundler.options.origin.host)) {
slice = slice[VirtualMachine.vm.bundler.options.origin.host.len..];
}
if (VirtualMachine.vm.bundler.options.origin.path.len > 1) {
if (strings.startsWith(slice, VirtualMachine.vm.bundler.options.origin.path)) {
slice = slice[VirtualMachine.vm.bundler.options.origin.path.len..];
}
}
if (VirtualMachine.vm.bundler.options.routes.asset_prefix_path.len > 0) {
if (strings.startsWith(slice, VirtualMachine.vm.bundler.options.routes.asset_prefix_path)) {
slice = slice[VirtualMachine.vm.bundler.options.routes.asset_prefix_path.len..];
}
}
@@ -561,6 +615,15 @@ pub const VirtualMachine = struct {
return;
}
if (log.warnings > 0) {
var writer = Output.errorWriter();
for (log.msgs.items) |msg| {
if (msg.kind == .warn) {
msg.writeFormat(writer) catch {};
}
}
}
ret.result.value = result;
ret.success = true;
}