summaryrefslogtreecommitdiff
path: root/lib/internal/util/embedding.js
blob: e2e67202477bc79226f08edab845a2af53d7c097 (plain)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
'use strict';
const { codes: { ERR_UNKNOWN_BUILTIN_MODULE } } = require('internal/errors');
const { BuiltinModule: { normalizeRequirableId } } = require('internal/bootstrap/realm');
const { Module, wrapSafe } = require('internal/modules/cjs/loader');

// This is roughly the same as:
//
// const mod = new Module(filename);
// mod._compile(contents, filename);
//
// but the code has been duplicated because currently there is no way to set the
// value of require.main to module.
//
// TODO(RaisinTen): Find a way to deduplicate this.

function embedderRunCjs(contents) {
  const filename = process.execPath;
  const compiledWrapper = wrapSafe(filename, contents);

  const customModule = new Module(filename, null);
  customModule.filename = filename;
  customModule.paths = Module._nodeModulePaths(customModule.path);

  const customExports = customModule.exports;

  embedderRequire.main = customModule;

  const customFilename = customModule.filename;

  const customDirname = customModule.path;

  return compiledWrapper(
    customExports,
    embedderRequire,
    customModule,
    customFilename,
    customDirname);
}

function embedderRequire(id) {
  const normalizedId = normalizeRequirableId(id);
  if (!normalizedId) {
    throw new ERR_UNKNOWN_BUILTIN_MODULE(id);
  }
  return require(normalizedId);
}

module.exports = { embedderRequire, embedderRunCjs };