aboutsummaryrefslogtreecommitdiff
path: root/packages/bun-polyfills/src/global/importmeta.ts
blob: 6776fb668de1289745ee79692db3905fd456dc67 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { createRequire } from 'node:module';

// Without an ESM loader, this polyfill is impossible to apply automatically,
// due to the per-module nature of import.meta. In order to use this polyfill,
// you must import it in every module that uses import.meta, and call it with
// the import.meta object as the argument. When the polyfills are integrated
// with bun build, this could be done automatically by the build process at
// the top of every module file bundled.

export default function polyfillImportMeta(metaIn: ImportMeta) {
    const require2 = createRequire(metaIn.url);
    const metapath = fileURLToPath(metaIn.url);
    const meta: ImportMeta = {
        url: metaIn.url,
        main: metapath === process.argv[1],
        path: metapath,
        dir: path.dirname(metapath),
        file: path.basename(metapath),
        require: require2,
        async resolve(id: string, parent?: string) {
            return this.resolveSync(id, parent);
        },
        resolveSync(id: string, parent?: string) {
            return require2.resolve(id, {
                paths: typeof parent === 'string' ? [
                    path.resolve(parent.startsWith('file://') ? fileURLToPath(parent) : parent, '..')
                ] : undefined,
            });
        },
    };
    Object.assign(metaIn, meta);
}