Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81146 views
1
// Generated by CoffeeScript 1.6.3
2
(function() {
3
var CoffeeScript, addHistory, addMultilineHandler, fs, merge, nodeREPL, path, prettyErrorMessage, replDefaults, vm, _ref;
4
5
fs = require('fs');
6
7
path = require('path');
8
9
vm = require('vm');
10
11
nodeREPL = require('repl');
12
13
CoffeeScript = require('./coffee-script');
14
15
_ref = require('./helpers'), merge = _ref.merge, prettyErrorMessage = _ref.prettyErrorMessage;
16
17
replDefaults = {
18
prompt: 'coffee> ',
19
historyFile: process.env.HOME ? path.join(process.env.HOME, '.coffee_history') : void 0,
20
historyMaxInputSize: 10240,
21
"eval": function(input, context, filename, cb) {
22
var Assign, Block, Literal, Value, ast, err, js, _ref1;
23
input = input.replace(/\uFF00/g, '\n');
24
input = input.replace(/^\(([\s\S]*)\n\)$/m, '$1');
25
_ref1 = require('./nodes'), Block = _ref1.Block, Assign = _ref1.Assign, Value = _ref1.Value, Literal = _ref1.Literal;
26
try {
27
ast = CoffeeScript.nodes(input);
28
ast = new Block([new Assign(new Value(new Literal('_')), ast, '=')]);
29
js = ast.compile({
30
bare: true,
31
locals: Object.keys(context)
32
});
33
return cb(null, vm.runInContext(js, context, filename));
34
} catch (_error) {
35
err = _error;
36
return cb(prettyErrorMessage(err, filename, input, true));
37
}
38
}
39
};
40
41
addMultilineHandler = function(repl) {
42
var inputStream, multiline, nodeLineListener, outputStream, rli;
43
rli = repl.rli, inputStream = repl.inputStream, outputStream = repl.outputStream;
44
multiline = {
45
enabled: false,
46
initialPrompt: repl.prompt.replace(/^[^> ]*/, function(x) {
47
return x.replace(/./g, '-');
48
}),
49
prompt: repl.prompt.replace(/^[^> ]*>?/, function(x) {
50
return x.replace(/./g, '.');
51
}),
52
buffer: ''
53
};
54
nodeLineListener = rli.listeners('line')[0];
55
rli.removeListener('line', nodeLineListener);
56
rli.on('line', function(cmd) {
57
if (multiline.enabled) {
58
multiline.buffer += "" + cmd + "\n";
59
rli.setPrompt(multiline.prompt);
60
rli.prompt(true);
61
} else {
62
nodeLineListener(cmd);
63
}
64
});
65
return inputStream.on('keypress', function(char, key) {
66
if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) {
67
return;
68
}
69
if (multiline.enabled) {
70
if (!multiline.buffer.match(/\n/)) {
71
multiline.enabled = !multiline.enabled;
72
rli.setPrompt(repl.prompt);
73
rli.prompt(true);
74
return;
75
}
76
if ((rli.line != null) && !rli.line.match(/^\s*$/)) {
77
return;
78
}
79
multiline.enabled = !multiline.enabled;
80
rli.line = '';
81
rli.cursor = 0;
82
rli.output.cursorTo(0);
83
rli.output.clearLine(1);
84
multiline.buffer = multiline.buffer.replace(/\n/g, '\uFF00');
85
rli.emit('line', multiline.buffer);
86
multiline.buffer = '';
87
} else {
88
multiline.enabled = !multiline.enabled;
89
rli.setPrompt(multiline.initialPrompt);
90
rli.prompt(true);
91
}
92
});
93
};
94
95
addHistory = function(repl, filename, maxSize) {
96
var buffer, fd, lastLine, readFd, size, stat;
97
lastLine = null;
98
try {
99
stat = fs.statSync(filename);
100
size = Math.min(maxSize, stat.size);
101
readFd = fs.openSync(filename, 'r');
102
buffer = new Buffer(size);
103
fs.readSync(readFd, buffer, 0, size, stat.size - size);
104
repl.rli.history = buffer.toString().split('\n').reverse();
105
if (stat.size > maxSize) {
106
repl.rli.history.pop();
107
}
108
if (repl.rli.history[0] === '') {
109
repl.rli.history.shift();
110
}
111
repl.rli.historyIndex = -1;
112
lastLine = repl.rli.history[0];
113
} catch (_error) {}
114
fd = fs.openSync(filename, 'a');
115
repl.rli.addListener('line', function(code) {
116
if (code && code.length && code !== '.history' && lastLine !== code) {
117
fs.write(fd, "" + code + "\n");
118
return lastLine = code;
119
}
120
});
121
repl.rli.on('exit', function() {
122
return fs.close(fd);
123
});
124
return repl.commands['.history'] = {
125
help: 'Show command history',
126
action: function() {
127
repl.outputStream.write("" + (repl.rli.history.slice(0).reverse().join('\n')) + "\n");
128
return repl.displayPrompt();
129
}
130
};
131
};
132
133
module.exports = {
134
start: function(opts) {
135
var build, major, minor, repl, _ref1;
136
if (opts == null) {
137
opts = {};
138
}
139
_ref1 = process.versions.node.split('.').map(function(n) {
140
return parseInt(n);
141
}), major = _ref1[0], minor = _ref1[1], build = _ref1[2];
142
if (major === 0 && minor < 8) {
143
console.warn("Node 0.8.0+ required for CoffeeScript REPL");
144
process.exit(1);
145
}
146
opts = merge(replDefaults, opts);
147
repl = nodeREPL.start(opts);
148
repl.on('exit', function() {
149
return repl.outputStream.write('\n');
150
});
151
addMultilineHandler(repl);
152
if (opts.historyFile) {
153
addHistory(repl, opts.historyFile, opts.historyMaxInputSize);
154
}
155
return repl;
156
}
157
};
158
159
}).call(this);
160
161