aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/module.exports.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/module.exports.js')
-rw-r--r--src/bun.js/module.exports.js104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/bun.js/module.exports.js b/src/bun.js/module.exports.js
new file mode 100644
index 000000000..f0817a059
--- /dev/null
+++ b/src/bun.js/module.exports.js
@@ -0,0 +1,104 @@
+function resolve(request, args) {
+ if (typeof args === "object" && args?.paths?.length) {
+ return this.resolveSync(request, args);
+ }
+
+ return this.resolveSync(request);
+}
+
+// not implemented
+resolve.paths = () => [];
+
+function require(pathString) {
+ // this refers to an ImportMeta instance
+ const resolved = this.resolveSync(pathString);
+ if (
+ !resolved.endsWith(".node") &&
+ !resolved.endsWith(".json") &&
+ !resolved.endsWith(".toml")
+ ) {
+ throw new Error(
+ "Dynamic require() in Bun.js currently only supports .node, .json, and .toml files.\n\tConsider using ESM import() instead."
+ );
+ }
+
+ return this.require(resolved);
+}
+
+const main = {
+ get() {
+ return Bun.main;
+ },
+ set() {
+ return false;
+ },
+ configurable: false,
+};
+
+export function createRequire(filename) {
+ var filenameString = filename;
+ const isURL =
+ typeof filename === "object" && filename && filename instanceof URL;
+ if (isURL) {
+ filenameString = filename.pathname;
+ }
+
+ var lastSlash = filenameString.lastIndexOf(
+ // TODO: WINDOWS
+ // windows is more complicated here
+ // but we don't support windows yet
+ process.platform !== "win32" ? "/" : "\\"
+ );
+ var customImportMeta = {
+ ...import.meta,
+ path: filenameString,
+ file:
+ lastSlash > -1 ? filenameString.substring(lastSlash + 1) : filenameString,
+ dir: lastSlash > -1 ? filenameString.substring(0, lastSlash) : "",
+ };
+
+ if (isURL) {
+ customImportMeta.url = filename;
+ } else {
+ // lazy because URL is slow and also can throw
+ Object.defineProperty(customImportMeta, "url", {
+ get() {
+ const value = new URL("file://" + customImportMeta.path).href;
+ Object.defineProperty(customImportMeta, "url", {
+ value,
+ });
+ return value;
+ },
+ configurable: true,
+ });
+ }
+
+ var bound = require.bind(customImportMeta);
+ bound.resolve = resolve.bind(customImportMeta);
+
+ // do this one lazily
+ Object.defineProperty(bound, "main", main);
+
+ return bound;
+}
+
+// this isn't exhaustive
+export const builtinModules = ["node:path", "node:fs", "bun:ffi", "bun:sqlite"];
+
+// noop
+export function syncBuiltinESMExports() {}
+
+export function findSourceMap(path) {
+ throw new Error("findSourceMap is not implemented");
+}
+
+export function SourceMap() {
+ throw new Error("SourceMap is not implemented");
+}
+
+export default {
+ createRequire,
+ syncBuiltinESMExports,
+ findSourceMap,
+ SourceMap,
+};