about summary refs log tree commit diff stats
path: root/src/html/script.nim
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-01-31 23:35:19 +0100
committerbptato <nincsnevem662@gmail.com>2025-02-01 00:14:03 +0100
commitfb83af595b803c1d2034a70437381c8550eae3bf (patch)
treef2c643b6c22b9aabf890f47ddeff6154e6086106 /src/html/script.nim
parent597d63922c5614da4f07bbddd4a5866c48cad555 (diff)
downloadchawan-fb83af595b803c1d2034a70437381c8550eae3bf.tar.gz
dom: basic module support
probably breaks with TLA
Diffstat (limited to 'src/html/script.nim')
-rw-r--r--src/html/script.nim24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/html/script.nim b/src/html/script.nim
index ac2924ee..84f6c553 100644
--- a/src/html/script.nim
+++ b/src/html/script.nim
@@ -1,6 +1,7 @@
 import monoucha/javascript
 import monoucha/jsopaque
 import monoucha/quickjs
+import monoucha/tojs
 import types/referrer
 import types/url
 import utils/twtstr
@@ -141,6 +142,29 @@ proc newJSModuleScript*(ctx: JSContext; source: string; baseURL: URL;
     )
   )
 
+proc setImportMeta*(ctx: JSContext; funcVal: JSValue; isMain: bool) =
+  let m = cast[JSModuleDef](JS_VALUE_GET_PTR(funcVal))
+  let moduleNameAtom = JS_GetModuleName(ctx, m)
+  let metaObj = JS_GetImportMeta(ctx, m)
+  definePropertyCWE(ctx, metaObj, "url", JS_AtomToValue(ctx, moduleNameAtom))
+  definePropertyCWE(ctx, metaObj, "main", false)
+  JS_FreeValue(ctx, metaObj)
+  JS_FreeAtom(ctx, moduleNameAtom)
+
+proc normalizeModuleName*(ctx: JSContext; base_name, name: cstringConst;
+    opaque: pointer): cstring {.cdecl.} =
+  return js_strdup(ctx, cstring(name))
+
+proc finishLoadModule*(ctx: JSContext; source, name: string): JSModuleDef =
+  let funcVal = compileModule(ctx, source, name)
+  if JS_IsException(funcVal):
+    return nil
+  ctx.setImportMeta(funcVal, false)
+  # "the module is already referenced, so we must free it"
+  # idk how this works, so for now let's just do what qjs does
+  result = cast[JSModuleDef](JS_VALUE_GET_PTR(funcVal))
+  JS_FreeValue(ctx, funcVal)
+
 proc logException*(ctx: JSContext) =
   ctx.errorImpl(ctx.getExceptionMsg())