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