Home Reference Source Test

lib/interp/require.js

const { TopEnv } = require("./environment.js");
const { Parser } = require("../parser/parse.js");

TopEnv["require"] = {
  fun: file => {
    if (!(file in TopEnv["require"].cache)) {
      const tree = Parser.parseFromFile(file);
      const env = Object.create(TopEnv);

      tree.evaluate(env);

      const module = { exports: env["module"].exports };

      TopEnv["require"].cache[file] = module;
    }

    return TopEnv["require"].cache[file].exports;
  },
  n_args: n => n === 1
};

TopEnv["require"].cache = Object.create(null);
TopEnv["module"] = {
  exports: {}
};

TopEnv["__addTopEnvProperties__"] = {
  fun: ModuleTopEnv => {
    for (const property in ModuleTopEnv) {
      TopEnv[property] = ModuleTopEnv[property];
    }
  },
  n_args: n => n === 1
};

// This function can import a npm module. The module will be saved on "var_name"
TopEnv["use"] = {
  fun: module_name => {
    const ModuleTopEnv = require(module_name).TopEnv;

    return ModuleTopEnv;
  },
  n_args: n => n === 1
};