1'use strict'; 2const { 3 prepareMainThreadExecution, 4 markBootstrapComplete, 5} = require('internal/process/pre_execution'); 6const { getSingleExecutableCode } = internalBinding('sea'); 7const { emitExperimentalWarning } = require('internal/util'); 8const { Module, wrapSafe } = require('internal/modules/cjs/loader'); 9const { codes: { ERR_UNKNOWN_BUILTIN_MODULE } } = require('internal/errors'); 10const { BuiltinModule: { normalizeRequirableId } } = require('internal/bootstrap/realm'); 11 12prepareMainThreadExecution(false, true); 13markBootstrapComplete(); 14 15emitExperimentalWarning('Single executable application'); 16 17// This is roughly the same as: 18// 19// const mod = new Module(filename); 20// mod._compile(contents, filename); 21// 22// but the code has been duplicated because currently there is no way to set the 23// value of require.main to module. 24// 25// TODO(RaisinTen): Find a way to deduplicate this. 26 27const filename = process.execPath; 28const contents = getSingleExecutableCode(); 29const compiledWrapper = wrapSafe(filename, contents); 30 31const customModule = new Module(filename, null); 32customModule.filename = filename; 33customModule.paths = Module._nodeModulePaths(customModule.path); 34 35const customExports = customModule.exports; 36 37function customRequire(id) { 38 const normalizedId = normalizeRequirableId(id); 39 if (!normalizedId) { 40 throw new ERR_UNKNOWN_BUILTIN_MODULE(id); 41 } 42 43 return require(normalizedId); 44} 45 46customRequire.main = customModule; 47 48const customFilename = customModule.filename; 49 50const customDirname = customModule.path; 51 52compiledWrapper( 53 customExports, 54 customRequire, 55 customModule, 56 customFilename, 57 customDirname); 58