Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 28 additions & 16 deletions core/wasmJs/src/node/nodeModulesWasmJs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,36 @@

package kotlinx.io.node


internal fun requireExists(): Boolean = js("typeof require === 'function'")

internal fun requireModule(mod: String): JsAny? = js("""{
try {
let m = require(mod);
if (m) return m;
return null;
} catch (e) {
return null;
}
}""")
@JsFun("""
(globalThis.module = (typeof process !== 'undefined') && (process.release.name === 'node') ?
await import('node:module') : void 0, () => {})
""")
internal external fun persistModule()

@JsFun("""() => {
const importMeta = import.meta;
return globalThis.module.default.createRequire(importMeta.url);
}
""")
internal external fun getRequire(): JsAny

private val require = persistModule().let { getRequire() }

@JsFun("""
(require, mod) => {
try {
let m = require(mod);
if (m) return m;
return null;
} catch (e) {
return null;
}
}
""")
internal external fun requireModule(require: JsAny, mod: String): JsAny?

internal fun loadModule(name: String): JsAny {
if (!requireExists()) {
throw UnsupportedOperationException("Module $name could not be loaded")
}
val mod = requireModule(name) ?: throw UnsupportedOperationException("Module '$name' could not be imported")
val mod = requireModule(require, name) ?: throw UnsupportedOperationException("Module '$name' could not be imported")
return mod
}

Expand Down