Skip to content

Commit

Permalink
fix issue related to node-dev reloading
Browse files Browse the repository at this point in the history
- instead of throwing an error (which will block node-dev to reload the failing script), let's print the exception and let the exception propagate
- exception should be printed only once
- improve error message
- `settings` object is created only once
- remove `node.d.ts` dependency - this should be supplied by the user
  • Loading branch information
ph2734 committed Jan 6, 2013
1 parent b3e19bf commit 5f9b40a
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 119 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,14 @@ use different methods for different modules
### sample.ts
Given that there are two files, `foomodule.js` and `barmodule.ts` at the same directory as sample.ts

///<reference path='node.d.ts'/>

// Load a JavaScript module with standard Node.JS require
var foomodule = require('./foomodule.js');

// Load a TypeScript module with TypeScript module syntax
import barmodule = module('barmodule');

```
Note that the second one essentially gets compiled to a `require` call just like the first one. However,
`import ... module` syntax makes it possible to use TyepScript compile time validation features (like type checking).

Expand Down
115 changes: 55 additions & 60 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,38 @@ var io = require("./io");

var tsTempFile = null;
['TMPDIR', 'TMP', 'TEMP'].forEach(function(td) {
if (!tsTempFile && process.env[td])
tsTempFile = process.env[td];
if(!tsTempFile && process.env[td]) tsTempFile = process.env[td];
});
tsTempFile = path.join((tsTempFile || "/tmp"), "typescript-require-" + Date.now() + ".js");

var contents = [
"(function() {",
fs.readFileSync(require.resolve("typescript"), "utf8"),
"module.exports = TypeScript;",
"}).call({});"
].join("");
var contents = ["(function() {", fs.readFileSync(require.resolve("typescript"), "utf8"), "module.exports = TypeScript;", "}).call({});"].join("");

fs.writeFileSync(tsTempFile, contents, "utf8");

var TypeScript = module.exports.TypeScript = require(tsTempFile);
TypeScript.moduleGenTarget = TypeScript.ModuleGenTarget.Synchronous;

fs.unlinkSync(tsTempFile);


//setting up the compiler
var settings = new TypeScript.CompilationSettings();
settings.codeGenTarget = TypeScript.CodeGenTarget.ES5;
settings.moduleGenTarget = TypeScript.ModuleGenTarget.Synchronous;
settings.resolve = true;

var env = new TypeScript.CompilationEnvironment(settings, io);

require.extensions['.ts'] = function(module) {

var js = '';

var output = {
Write: function(value) { js += value; },
WriteLine: function(value) { js += value + "\n"; },
Write: function(value) {
js += value;
},
WriteLine: function(value) {
js += value + "\n";
},
Close: function() {}
};

Expand All @@ -37,78 +45,65 @@ require.extensions['.ts'] = function(module) {
WriteLine: function(value) {},
Close: function() {}
};

var settings = new TypeScript.CompilationSettings();
settings.codeGenTarget = TypeScript.CodeGenTarget.ES5;
settings.moduleGenTarget = TypeScript.ModuleGenTarget.Synchronous;
settings.resolve = true;

var env = new TypeScript.CompilationEnvironment(settings, io);
var resolver = new TypeScript.CodeResolver(env);
var compiler = new TypeScript.TypeScriptCompiler(null, new TypeScript.NullLogger(), settings);
compiler.parser.errorRecovery = true;
var units = [{
fileName: path.join(__dirname, "./typings/lib.d.ts")
}];

var moduleFilename = TypeScript.switchToForwardSlashes(module.filename);

var units = [
{ fileName: path.join(__dirname, "./typings/lib.d.ts") }
//{ fileName: path.join(__dirname, "./typings/node.d.ts") }
];
var resolver = new TypeScript.CodeResolver(env);

resolver.resolveCode(moduleFilename, "", false, {
postResolution: function(file, code) {
if (!units.some(function(u) { return u.fileName == code.path }))
units.push({ fileName: code.path, code: code.content });
if(!units.some(function(u) {
return u.fileName == code.path
})) units.push({
fileName: code.path,
code: code.content
});
},
postResolutionError: function(file, message) {
throw new Error('TypeScript Error: ' + message + '\n File: ' + file);
}
});

var compiler = new TypeScript.TypeScriptCompiler(null, new TypeScript.NullLogger(), settings);
compiler.parser.errorRecovery = true;

var isErrorPrinted = false;

compiler.setErrorCallback(function(start, len, message, block) {
var code = units[block].code;

var line = [
code.substr(0, start).split('\n').slice(-1)[0].replace(/^\s+/, ""),
code.substr(start, len),
code.substr(start + len).split('\n').slice(0, 1)[0].replace(/\s+$/, "")
];

var underline = [
line[0].replace(/./g, '-'),
line[1].replace(/./g, '^'),
line[2].replace(/./g, '-'),
];

var error = new Error('TypeScript Error: ' + message);
error.stack = [
'TypeScript Error: ' + message,
'File: ' + units[block].fileName,
'Start: ' + start + ', Length: ' + len,
'',
'Line: ' + line.join(""),
'------' + underline.join("")
].join('\n')

throw error;

if(isErrorPrinted == false && units[block].fileName == moduleFilename) {
var code = units[block].code;
var cursor = code.substr(0, start).split('\n');
var line = [
cursor.slice(-1)[0].replace(/^\s+/, ""), code.substr(start, len), code.substr(start + len).split('\n').slice(0, 1)[0].replace(/\s+$/, "")];

var underline = [
line[0].replace(/./g, '-'), line[1].replace(/./g, '^'), line[2].replace(/./g, '-'), ];

var error = new Error('TypeScript Error: ' + message);
error.stack = ['TypeScript Error: ' + message, 'File: ' + units[block].fileName, '', 'Line '+cursor.length +': '+ line.join(""), '------' + underline.join("")].join('\n');

console.error('\n' + error.stack);

isErrorPrinted = true;
}
});

units.forEach(function(u) {
if (!u.code)
u.code = fs.readFileSync(u.fileName, "utf8");
if(!u.code) u.code = fs.readFileSync(u.fileName, "utf8");

compiler.addUnit(u.code, u.fileName, false);
});

compiler.typeCheck();

compiler.emit(function(fn) {
if (fn == moduleFilename.replace(/\.ts$/, ".js"))
return output;
else
return nulloutput;
count = 0;
if(fn == moduleFilename.replace(/\.ts$/, ".js")) return output;
else return nulloutput;
});

module._compile(js, moduleFilename);
};
};
1 change: 1 addition & 0 deletions sample/funcs.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
///<reference path='node.d.ts'/>
import tsmodule = module("tsmodule");
var jsmodule = require("./jsmodule.js");

Expand Down
Loading

0 comments on commit 5f9b40a

Please sign in to comment.