aboutsummaryrefslogtreecommitdiff
path: root/node_modules/montage/require/node.js
blob: 568410cfdba808775f0b8852e2af6c5f645552f4 (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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

var Require = require("./require");
var URL = require("../core/url");
var Promise = require("../core/promise").Promise;
var FS = require("fs");

var globalEval = eval;

Require.getLocation = function () {
    return URL.resolve("file:///", process.cwd() + "/");
};

var urlToPath = function (url) {
    var parsed = URL.parse(url);
    return parsed.path;
};

Require.read = function (url) {
    var deferred = Promise.defer();
    var path = urlToPath(url);
    FS.readFile(path, "utf-8", function (error, text) {
        if (error) {
            deferred.reject(new Error(error));
        } else {
            deferred.resolve(text);
        }
    });
    return deferred.promise;
};

// Compiles module text into a function.
// Can be overriden by the platform to make the engine aware of the source path. Uses sourceURL hack by default.
Require.Compiler = function (config) {
    config.scope = config.scope || {};
    var names = ["require", "exports", "module"];
    var scopeNames = Object.keys(config.scope);
    names.push.apply(names, scopeNames);
    return function(module) {
        if (module.factory)
            return module;
        if (!module.factory && module.text !== void 0) {
            var factory = globalEval(
                "(function(" + names.join(",") + "){" +
                module.text +
                "\n//*/\n})\n//@ sourceURL=" + module.location
            );
            module.factory = function (require, exports, module) {
                Array.prototype.push.apply(arguments, scopeNames.map(function (name) {
                    return config.scope[name];
                }));
                return factory.apply(this, arguments);
            };
            // new Function will have its body reevaluated at every call, hence using eval instead
            // https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope
            //module.factory = new Function("require", "exports", "module", module.text + "\n//*/\n//@ sourceURL="+module.path);
        }
        return module;
    };
};

Require.DefaultLoaderConstructor = function(config) {
    return Require.MappingsLoader(
        config,
        Require.ExtensionsLoader(
            config,
            Require.PathsLoader(
                config,
                Require.CachingLoader(
                    config,
                    Require.Loader(
                        config,
                        Require.NodeLoader(config)
                    )
                )
            )
        )
    );
};

Require.NodeLoader = function (config) {
    return function (url, module) {
        var id = url.slice(config.location.length);
        return {
            type: "native",
            exports: require(id),
            location: url
        }
    };
}

Require.main = function () {
    var require = Require.Sandbox();
    require.async(process.argv[2]).end();
};

Require.overlays = ["node", "server", "montage"];

if (require.main === module) {
    Require.main();
}