Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80709 views
1
'use strict';
2
3
var through = require('through');
4
var rfile = require('rfile');
5
var uglify = require('uglify-js');
6
var templateSTR = rfile('./template.js');
7
8
function template(moduleName, cjs) {
9
var str = uglify.minify(
10
templateSTR.replace(/\{\{defineNamespace\}\}/g, compileNamespace(moduleName)),
11
{fromString: true}).code
12
.split('source()')
13
str[0] = str[0].trim();
14
//make sure these are undefined so as to not get confused if modules have inner UMD systems
15
str[0] += 'var define,module,exports;';
16
if (cjs) str[0] += 'module={exports:(exports={})};';
17
str[0] += '\n';
18
if (cjs) str[1] = 'return module.exports;' + str[1];
19
str[1] = '\n' + str[1];
20
return str;
21
}
22
23
exports = module.exports = function (name, cjs, src) {
24
if (typeof cjs === 'string') {
25
var tmp = cjs;
26
cjs = src;
27
src = tmp;
28
}
29
if (src) {
30
return exports.prelude(name, cjs) + src + exports.postlude(name, cjs);
31
}
32
var strm = through(write, end);
33
var first = true;
34
function write(chunk) {
35
if (first) strm.queue(exports.prelude(name, cjs));
36
first = false;
37
strm.queue(chunk);
38
}
39
function end() {
40
if (first) strm.queue(exports.prelude(name, cjs));
41
strm.queue(exports.postlude(name, cjs));
42
strm.queue(null);
43
}
44
return strm;
45
};
46
47
exports.prelude = function (moduleName, cjs) {
48
return template(moduleName, cjs)[0];
49
};
50
exports.postlude = function (moduleName, cjs) {
51
return template(moduleName, cjs)[1];
52
};
53
54
55
function camelCase(name) {
56
name = name.replace(/\-([a-z])/g, function (_, char) { return char.toUpperCase(); });
57
return name.replace(/[^a-zA-Z0-9]+/g, '')
58
}
59
60
61
function compileNamespace(name) {
62
var names = name.split('.')
63
64
// No namespaces, yield the best case 'global.NAME = VALUE'
65
if (names.length === 1) {
66
return 'g.' + camelCase(name) + ' = f()';
67
68
// Acceptable case, with reasonable compilation
69
} else if (names.length === 2) {
70
names = names.map(camelCase);
71
return '(g.' + names[0] + ' || (g.' + names[0] + ' = {})).' + names[1] + ' = f()';
72
73
// Worst case, too many namespaces to care about
74
} else {
75
var valueContainer = names.pop()
76
return names.reduce(compileNamespaceStep, ['var ref$ = g'])
77
.concat(['ref$.' + camelCase(valueContainer) + ' = f()'])
78
.join(';\n ');
79
}
80
}
81
82
function compileNamespaceStep(code, name, i, names) {
83
name = camelCase(name);
84
code.push('ref$ = (ref$.' + name + ' || (ref$.' + name + ' = {}))')
85
return code
86
}
87
88