@loaders.gl/worker-utils
Version:
Utilities for running tasks on worker threads
70 lines (59 loc) • 2.25 kB
text/typescript
// Fork of https://github.com/floatdrop/require-from-string/blob/master/index.js
// Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com> (github.com/floatdrop)
// MIT license
// this file is not visible to webpack (it is excluded in the package.json "browser" field).
import Module from 'module';
import path from 'path';
// Node.js Dynamically require from file
// Relative names are resolved relative to cwd
// This indirect function is provided because webpack will try to bundle `module.require`.
// this file is not visible to webpack (it is excluded in the package.json "browser" field).
export async function requireFromFile(filename: string): Promise<any> {
if (filename.startsWith('http')) {
const response = await fetch(filename);
const code = await response.text();
return requireFromString(code);
}
if (!filename.startsWith('/')) {
filename = `${process.cwd()}/${filename}`;
}
return require(filename);
}
// Dynamically require from string
// - `code` - Required - Type: string - Module code.
// - `filename` - Type: string - Default: '' - Optional filename.
// - `options.appendPaths` Type: Array List of paths, that will be appended to module paths.
// Useful, when you want to be able require modules from these paths.
// - `options.prependPaths` Type: Array Same as appendPaths, but paths will be prepended.
export function requireFromString(
code: string,
filename = '',
options?: {
prependPaths?: string[];
appendPaths?: string[];
}
): any {
if (typeof filename === 'object') {
options = filename;
filename = '';
}
if (typeof code !== 'string') {
throw new Error(`code must be a string, not ${typeof code}`);
}
// @ts-ignore
const paths = Module._nodeModulePaths(path.dirname(filename));
const parent = module.parent;
// @ts-ignore
const newModule = new Module(filename, parent);
newModule.filename = filename;
newModule.paths = ([] as string[])
.concat(options?.prependPaths || [])
.concat(paths)
.concat(options?.appendPaths || []);
// @ts-ignore
newModule._compile(code, filename);
if (parent && parent.children) {
parent.children.splice(parent.children.indexOf(newModule), 1);
}
return newModule.exports;
}