forked from tbranyen/lodash-template-loader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloader.js
145 lines (116 loc) · 4.33 KB
/
loader.js
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* Lo-Dash Template Loader v0.1.5
* Copyright 2013, Tim Branyen (@tbranyen).
* loader.js may be freely distributed under the MIT license.
*/
(function(global) {
"use strict";
// Cache used to map configuration options between load and write.
var buildMap = {};
// Alias the correct `nodeRequire` method.
var nodeRequire = typeof requirejs === "function" && requirejs.nodeRequire;
// Define the plugin using the CommonJS syntax.
define(function(require, exports) {
var _ = require("lodash");
exports.version = "0.1.5";
// Invoked by the AMD builder, passed the path to resolve, the require
// function, done callback, and the configuration options.
exports.load = function(name, req, load, config) {
var isDojo;
// Dojo provides access to the config object through the req function.
if (!config) {
config = require.rawConfig;
isDojo = true;
}
var contents = "";
var settings = configure(config);
// Only use root if baseUrl and root differ: toUrl() will choke on
// virtual path config
var root = settings.root.replace(/(\/$)/,'') !==
config.baseUrl.replace(/(\/$)/,'') ? settings.root:'';
var prefix = isDojo ? "/" : root;
var url = require.toUrl(prefix + name + settings.ext);
// Builds with r.js require Node.js to be installed.
if (config.isBuild) {
// If in Node, get access to the filesystem.
var fs = nodeRequire("fs");
try {
// First try reading the filepath as-is.
contents = String(fs.readFileSync(url));
} catch(ex) {
// If it failed, it's most likely because of a leading `/` and not an
// absolute path. Remove the leading slash and try again.
if (url[0] === "/") {
url = url.slice(1);
}
// Try reading again with the leading `/`.
contents = String(fs.readFileSync(url));
}
// Read in the file synchronously, as RequireJS expects, and return the
// contents. Process as a Lo-Dash template.
buildMap[name] = _.template(contents);
return load();
}
// Create a basic XHR.
var xhr = new XMLHttpRequest();
// Wait for it to load.
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
// Process as a Lo-Dash template and cache.
buildMap[name] = _.template(xhr.responseText);
// Return the compiled template.
load(buildMap[name]);
}
};
// Initiate the fetch.
xhr.open("GET", url, true);
xhr.send(null);
};
// Also invoked by the AMD builder, this writes out a compatible define
// call that will work with loaders such as almond.js that cannot read
// the configuration data.
exports.write = function(pluginName, moduleName, write) {
var template = buildMap[moduleName].source;
// Write out the actual definition
write(strDefine(pluginName, moduleName, template));
};
// This is for curl.js/cram.js build-time support.
exports.compile = function(pluginName, moduleName, req, io, config) {
configure(config);
// Ask cram to fetch the template file (resId) and pass it to `write`.
io.read(moduleName, write, io.error);
function write(template) {
// Write-out define(id,function(){return{/* template */}});
io.write(strDefine(pluginName, moduleName, template));
}
};
// Crafts the written definition form of the module during a build.
function strDefine(pluginName, moduleName, template) {
return [
"define('", pluginName, "!", moduleName, "', ", "[], ",
[
"function() {",
"return ", template, ";",
"}"
].join(""),
");\n"
].join("");
}
function configure(config) {
// Default settings point to the project root and using html files.
var settings = _.extend({
ext: ".html",
root: config.baseUrl,
templateSettings: {}
}, config.lodashLoader);
// Ensure the root has been properly configured with a trailing slash,
// unless it's an empty string or undefined, in which case work off the
// baseUrl.
if (settings.root && settings.root[settings.root.length-1] !== "/") {
settings.root += "/";
}
// Set the custom passed in template settings.
_.extend(_.templateSettings, settings.templateSettings);
return settings;
}
});
})(typeof global === "object" ? global : this);