diff options
author | 2023-05-24 12:01:59 -0700 | |
---|---|---|
committer | 2023-05-24 12:01:59 -0700 | |
commit | b3d5f37598ea4ca37a863f05ade94637477f3700 (patch) | |
tree | 7469b97e44f2af3d6fa857a5bf96de267a657344 /src/bun.js/builtins/ts | |
parent | 31c967206ab0d3cb5c0e4bd636fa9668e778ec61 (diff) | |
download | bun-b3d5f37598ea4ca37a863f05ade94637477f3700.tar.gz bun-b3d5f37598ea4ca37a863f05ade94637477f3700.tar.zst bun-b3d5f37598ea4ca37a863f05ade94637477f3700.zip |
Implement `require.cache` (#3045)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'src/bun.js/builtins/ts')
-rw-r--r-- | src/bun.js/builtins/ts/ImportMetaObject.ts | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/bun.js/builtins/ts/ImportMetaObject.ts b/src/bun.js/builtins/ts/ImportMetaObject.ts index 6c66075c6..9ce53c192 100644 --- a/src/bun.js/builtins/ts/ImportMetaObject.ts +++ b/src/bun.js/builtins/ts/ImportMetaObject.ts @@ -135,6 +135,99 @@ export function internalRequire(this: ImportMetaObject, resolved) { } } +export function createRequireCache() { + class Module { + id; + parent; + filename; + children = []; + paths = []; + + constructor(filename) { + this.id = filename; + // TODO: windows + const lastSlash = filename.lastIndexOf("/"); + if (lastSlash !== -1 && filename.length > lastSlash + 1) { + this.filename = filename.substring(lastSlash + 1); + } else { + this.filename = filename; + } + } + + get loaded() { + return true; + } + + require(path) { + return $internalRequire($resolveSync(path, this.id)); + } + + get exports() { + return $requireMap.$get(this.id) ?? {}; + } + + set exports(value) { + $requireMap.$set(this.id, value); + } + } + + var moduleMap = new Map(); + + return new Proxy( + {}, + { + get(target, key: string) { + const entry = $requireMap.$get(key); + if (entry) { + var mod = moduleMap.$get(key); + if (!mod) { + mod = new Module(key); + moduleMap.$set(key, mod); + } + return mod; + } + }, + set(target, key: string, value) { + if (!moduleMap.$has(key)) { + moduleMap.$set(key, new Module(key)); + } + + $requireMap.$set(key, value?.exports); + + return true; + }, + + has(target, key: string) { + return $requireMap.$has(key); + }, + + deleteProperty(target, key: string) { + moduleMap.$delete(key); + $requireMap.$delete(key); + return Loader.registry.$delete(key); + }, + + ownKeys(target) { + return [...$requireMap.$keys()]; + }, + + // In Node, require.cache has a null prototype + getPrototypeOf(target) { + return null; + }, + + getOwnPropertyDescriptor(target, key: string) { + if ($requireMap.$has(key)) { + return { + configurable: true, + enumerable: true, + }; + } + }, + }, + ); +} + $sloppy; export function require(this: ImportMetaObject, name) { var from = this?.path ?? arguments.callee.path; |