aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/api/router.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/javascript/jsc/api/router.zig')
-rw-r--r--src/javascript/jsc/api/router.zig80
1 files changed, 33 insertions, 47 deletions
diff --git a/src/javascript/jsc/api/router.zig b/src/javascript/jsc/api/router.zig
index 84dad71ef..6e6fea896 100644
--- a/src/javascript/jsc/api/router.zig
+++ b/src/javascript/jsc/api/router.zig
@@ -4,10 +4,12 @@ const Api = @import("../../../api/schema.zig").Api;
const FilesystemRouter = @import("../../../router.zig");
const http = @import("../../../http.zig");
const JavaScript = @import("../javascript.zig");
-
+usingnamespace @import("../bindings/bindings.zig");
usingnamespace @import("../webcore/response.zig");
const Router = @This();
+const VirtualMachine = JavaScript.VirtualMachine;
+
route: *const FilesystemRouter.Match,
file_path_str: js.JSStringRef = null,
pathname_str: js.JSStringRef = null,
@@ -20,16 +22,13 @@ pub fn importRoute(
arguments: []const js.JSValueRef,
exception: js.ExceptionRef,
) js.JSObjectRef {
- return JavaScript.VirtualMachine.instance.require(
- ctx,
- std.fs.path.dirname(this.route.file_path).?,
- this.route.file_path,
- exception,
- );
+ const prom = JSModuleLoader.loadAndEvaluateModule(VirtualMachine.vm.global, ZigString.init(this.route.file_path));
+ VirtualMachine.vm.global.vm().drainMicrotasks();
+ return prom.result(VirtualMachine.vm.global.vm()).asRef();
}
pub fn match(
- obj: *c_void,
+ obj: void,
ctx: js.JSContextRef,
function: js.JSObjectRef,
thisObject: js.JSObjectRef,
@@ -96,10 +95,10 @@ fn createRouteObject(ctx: js.JSContextRef, req: *const http.RequestContext, exce
.route = route,
};
- return Class.new(ctx, router);
+ return Instance.make(ctx, router);
}
-const match_type_definition = &[_]d.ts{
+pub const match_type_definition = &[_]d.ts{
.{
.tsdoc = "Match a {@link https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent FetchEvent} to a `Route` from the local filesystem. Returns `null` if there is no match.",
.args = &[_]d.ts.arg{
@@ -132,29 +131,6 @@ const match_type_definition = &[_]d.ts{
},
};
-pub const Class = NewClass(
- c_void,
- .{
- .name = "Router",
- .read_only = true,
- .ts = .{
- .module = .{
- .path = "speedy.js/router",
- .tsdoc = "Filesystem Router supporting dynamic routes, exact routes, catch-all routes, and optional catch-all routes. Implemented in native code and only available with Speedy.js.",
- },
- },
- },
- .{
- .match = .{
- .rfn = match,
- .ts = match_type_definition,
- },
- },
- .{
- .Route = Instance.GetClass(c_void){},
- },
-);
-
pub const Instance = NewClass(
Router,
.{
@@ -249,16 +225,11 @@ pub fn getFilePath(
prop: js.JSStringRef,
exception: js.ExceptionRef,
) js.JSValueRef {
- if (this.file_path_str == null) {
- this.file_path_str = js.JSStringCreateWithUTF8CString(this.route.file_path.ptr);
- }
-
- return js.JSValueMakeString(ctx, this.file_path_str);
+ return ZigString.init(this.route.file_path).toValue(VirtualMachine.vm.global).asRef();
}
pub fn finalize(
this: *Router,
- ctx: js.JSObjectRef,
) void {
// this.deinit();
}
@@ -270,11 +241,7 @@ pub fn getPathname(
prop: js.JSStringRef,
exception: js.ExceptionRef,
) js.JSValueRef {
- if (this.pathname_str == null) {
- this.pathname_str = js.JSStringCreateWithUTF8CString(this.route.pathname.ptr);
- }
-
- return js.JSValueMakeString(ctx, this.pathname_str);
+ return ZigString.init(this.route.pathname).toValue(VirtualMachine.vm.global).asRef();
}
pub fn getRoute(
@@ -284,9 +251,28 @@ pub fn getRoute(
prop: js.JSStringRef,
exception: js.ExceptionRef,
) js.JSValueRef {
- return js.JSValueMakeString(ctx, Properties.Refs.default);
+ return ZigString.init(this.route.name).toValue(VirtualMachine.vm.global).asRef();
}
+const KindEnum = struct {
+ pub const exact = "exact";
+ pub const catch_all = "catch-all";
+ pub const optional_catch_all = "optional-catch-all";
+ pub const dynamic = "dynamic";
+
+ pub fn init(name: string) ZigString {
+ if (strings.contains(name, "[[...")) {
+ return ZigString.init(optional_catch_all);
+ } else if (strings.contains(name, "[...")) {
+ return ZigString.init(catch_all);
+ } else if (strings.contains(name, "[")) {
+ return ZigString.init(dynamic);
+ } else {
+ return ZigString.init(exact);
+ }
+ }
+};
+
pub fn getKind(
this: *Router,
ctx: js.JSContextRef,
@@ -294,7 +280,7 @@ pub fn getKind(
prop: js.JSStringRef,
exception: js.ExceptionRef,
) js.JSValueRef {
- return js.JSValueMakeString(ctx, Properties.Refs.default);
+ return KindEnum.init(this.route.name).toValue(VirtualMachine.vm.global).asRef();
}
pub fn getQuery(
@@ -304,5 +290,5 @@ pub fn getQuery(
prop: js.JSStringRef,
exception: js.ExceptionRef,
) js.JSValueRef {
- return js.JSValueMakeString(ctx, Properties.Refs.default);
+ return ZigString.init(this.route.query_string).toValue(VirtualMachine.vm.global).asRef();
}