JSModuleDef *js_module_loader(JSContext *ctx,
const char *module_name, void *opaque,
JSValueConst attributes)
{
JSModuleDef *m;
size_t buf_len;
uint8_t *buf;
// Load file contents
buf = js_load_file(ctx, &buf_len, module_name);
if (!buf) {
JS_ThrowReferenceError(ctx, "could not load module '%s'", module_name);
return NULL;
}
// Check if it's JSON module
if (js_module_test_json(ctx, attributes)) {
JSValue val = JS_ParseJSON(ctx, (const char *)buf, buf_len, module_name);
js_free(ctx, buf);
if (JS_IsException(val))
return NULL;
m = JS_NewCModule(ctx, module_name, NULL);
if (!m) {
JS_FreeValue(ctx, val);
return NULL;
}
JS_SetModuleExport(ctx, m, "default", val);
return m;
}
// Compile as JavaScript module
JSValue func_val = JS_Eval(ctx, (char *)buf, buf_len, module_name,
JS_EVAL_TYPE_MODULE | JS_EVAL_FLAG_COMPILE_ONLY);
js_free(ctx, buf);
if (JS_IsException(func_val))
return NULL;
js_module_set_import_meta(ctx, func_val, TRUE, FALSE);
return JS_VALUE_GET_PTR(func_val);
}