diff --git a/quickjs.c b/quickjs.c
index 5098719..04c9941 100644
@@ -27258,6 +27258,40 @@ void JS_SetModuleLoaderFunc(JSRuntime *rt,
rt->module_loader_opaque = opaque;
}
+#ifdef CONFIG_MODULE_EXPORTS
+/* Hooks into module loading functions */
+JSValueConst JS_GetModuleExport(JSContext *ctx, JSModuleDef *m, const char *export_name) {
+ JSExportEntry *me;
+ JSAtom name;
+ name = JS_NewAtom(ctx, export_name);
+ if (name == JS_ATOM_NULL)
+ goto fail;
+ me = find_export_entry(ctx, m, name);
+ JS_FreeAtom(ctx, name);
+ if (!me)
+ goto fail;
+ return JS_DupValue(ctx, me->u.local.var_ref->value);
+ fail:
+ return JS_UNDEFINED;
+}
+int JS_GetModuleExportEntriesCount(JSModuleDef *m) {
+ return m->export_entries_count;
+}
+
+JSValue JS_GetModuleExportEntry(JSContext *ctx, JSModuleDef *m, int idx) {
+ if (idx >= m->export_entries_count || idx < 0)
+ return JS_UNDEFINED;
+ return JS_DupValue(ctx, m->export_entries[idx].u.local.var_ref->value);
+}
+
+JSAtom JS_GetModuleExportEntryName(JSContext *ctx, JSModuleDef *m, int idx) {
+ if (idx >= m->export_entries_count || idx < 0)
+ return JS_ATOM_NULL;
+ return JS_DupAtom(ctx, m->export_entries[idx].export_name);
+}
+#endif
+
+
/* default module filename normalizer */
static char *js_default_module_normalize_name(JSContext *ctx,
const char *base_name,
diff --git a/quickjs.h b/quickjs.h
index c482686..3d6e8c9 100644
@@ -1040,6 +1040,14 @@ int JS_SetModuleExport(JSContext *ctx, JSModuleDef *m, const char *export_name,
int JS_SetModuleExportList(JSContext *ctx, JSModuleDef *m,
const JSCFunctionListEntry *tab, int len);
+#ifdef CONFIG_MODULE_EXPORTS
+JSValueConst JS_GetModuleExport(JSContext *ctx, JSModuleDef *m, const char *export_name);
+int JS_GetModuleExportEntriesCount(JSModuleDef *m);
+JSValue JS_GetModuleExportEntry(JSContext *ctx, JSModuleDef *m, int idx);
+JSAtom JS_GetModuleExportEntryName(JSContext *ctx, JSModuleDef *m, int idx);
+#endif
+
+
#undef js_unlikely
#undef js_force_inline