mirror of
https://github.com/nodejs/node.git
synced 2025-05-04 22:16:16 +00:00

Having an experimental feature behind a flag makes change if we are expecting significant breaking changes to its API. Since the Worker API has been essentially stable since its initial introduction, and no noticeable doubt about possibly not keeping the feature around has been voiced, removing the flag and thereby reducing the barrier to experimentation, and consequently receiving feedback on the implementation, seems like a good idea. PR-URL: https://github.com/nodejs/node/pull/25361 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Yuta Hiroto <hello@hiroppy.me> Reviewed-By: Shingo Inoue <leko.noor@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Masashi Hirano <shisama07@gmail.com> Reviewed-By: Weijia Wang <starkwang@126.com> Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
156 lines
4.0 KiB
JavaScript
156 lines
4.0 KiB
JavaScript
'use strict';
|
|
|
|
const { validateString } = require('internal/validators');
|
|
|
|
const {
|
|
CHAR_LINE_FEED,
|
|
CHAR_CARRIAGE_RETURN,
|
|
CHAR_EXCLAMATION_MARK,
|
|
CHAR_HASH,
|
|
} = require('internal/constants');
|
|
|
|
// Invoke with makeRequireFunction(module) where |module| is the Module object
|
|
// to use as the context for the require() function.
|
|
function makeRequireFunction(mod) {
|
|
const Module = mod.constructor;
|
|
|
|
function require(path) {
|
|
try {
|
|
exports.requireDepth += 1;
|
|
return mod.require(path);
|
|
} finally {
|
|
exports.requireDepth -= 1;
|
|
}
|
|
}
|
|
|
|
function resolve(request, options) {
|
|
validateString(request, 'request');
|
|
return Module._resolveFilename(request, mod, false, options);
|
|
}
|
|
|
|
require.resolve = resolve;
|
|
|
|
function paths(request) {
|
|
validateString(request, 'request');
|
|
return Module._resolveLookupPaths(request, mod, true);
|
|
}
|
|
|
|
resolve.paths = paths;
|
|
|
|
require.main = process.mainModule;
|
|
|
|
// Enable support to add extra extension types.
|
|
require.extensions = Module._extensions;
|
|
|
|
require.cache = Module._cache;
|
|
|
|
return require;
|
|
}
|
|
|
|
/**
|
|
* Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
|
|
* because the buffer-to-string conversion in `fs.readFileSync()`
|
|
* translates it to FEFF, the UTF-16 BOM.
|
|
*/
|
|
function stripBOM(content) {
|
|
if (content.charCodeAt(0) === 0xFEFF) {
|
|
content = content.slice(1);
|
|
}
|
|
return content;
|
|
}
|
|
|
|
/**
|
|
* Find end of shebang line and slice it off
|
|
*/
|
|
function stripShebang(content) {
|
|
// Remove shebang
|
|
var contLen = content.length;
|
|
if (contLen >= 2) {
|
|
if (content.charCodeAt(0) === CHAR_HASH &&
|
|
content.charCodeAt(1) === CHAR_EXCLAMATION_MARK) {
|
|
if (contLen === 2) {
|
|
// Exact match
|
|
content = '';
|
|
} else {
|
|
// Find end of shebang line and slice it off
|
|
var i = 2;
|
|
for (; i < contLen; ++i) {
|
|
var code = content.charCodeAt(i);
|
|
if (code === CHAR_LINE_FEED || code === CHAR_CARRIAGE_RETURN)
|
|
break;
|
|
}
|
|
if (i === contLen)
|
|
content = '';
|
|
else {
|
|
// Note that this actually includes the newline character(s) in the
|
|
// new output. This duplicates the behavior of the regular expression
|
|
// that was previously used to replace the shebang line
|
|
content = content.slice(i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return content;
|
|
}
|
|
|
|
const builtinLibs = [
|
|
'assert', 'async_hooks', 'buffer', 'child_process', 'cluster', 'crypto',
|
|
'dgram', 'dns', 'domain', 'events', 'fs', 'http', 'http2', 'https', 'net',
|
|
'os', 'path', 'perf_hooks', 'punycode', 'querystring', 'readline', 'repl',
|
|
'stream', 'string_decoder', 'tls', 'trace_events', 'tty', 'url', 'util',
|
|
'v8', 'vm', 'worker_threads', 'zlib'
|
|
];
|
|
|
|
if (typeof internalBinding('inspector').open === 'function') {
|
|
builtinLibs.push('inspector');
|
|
builtinLibs.sort();
|
|
}
|
|
|
|
function addBuiltinLibsToObject(object) {
|
|
// Make built-in modules available directly (loaded lazily).
|
|
builtinLibs.forEach((name) => {
|
|
// Goals of this mechanism are:
|
|
// - Lazy loading of built-in modules
|
|
// - Having all built-in modules available as non-enumerable properties
|
|
// - Allowing the user to re-assign these variables as if there were no
|
|
// pre-existing globals with the same name.
|
|
|
|
const setReal = (val) => {
|
|
// Deleting the property before re-assigning it disables the
|
|
// getter/setter mechanism.
|
|
delete object[name];
|
|
object[name] = val;
|
|
};
|
|
|
|
Object.defineProperty(object, name, {
|
|
get: () => {
|
|
const lib = require(name);
|
|
|
|
// Disable the current getter/setter and set up a new
|
|
// non-enumerable property.
|
|
delete object[name];
|
|
Object.defineProperty(object, name, {
|
|
get: () => lib,
|
|
set: setReal,
|
|
configurable: true,
|
|
enumerable: false
|
|
});
|
|
|
|
return lib;
|
|
},
|
|
set: setReal,
|
|
configurable: true,
|
|
enumerable: false
|
|
});
|
|
});
|
|
}
|
|
|
|
module.exports = exports = {
|
|
addBuiltinLibsToObject,
|
|
builtinLibs,
|
|
makeRequireFunction,
|
|
requireDepth: 0,
|
|
stripBOM,
|
|
stripShebang
|
|
};
|