Skip to content

Commit

Permalink
Followed symlinks
Browse files Browse the repository at this point in the history
  • Loading branch information
cartant committed Aug 4, 2016
1 parent a574058 commit cb794f2
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 26 deletions.
95 changes: 70 additions & 25 deletions lib/Host.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,13 @@
var commondir = require('commondir');
var events = require('events');
var fs = require('fs');
var realpath = require('fs.realpath')
var log = require('util').debuglog(require('../package').name);
var os = require('os');
var path = require('path');
var util = require('util');

module.exports = function (ts) {
function replaceFileExtension(file, extension) {
return file.replace(/\.\w+$/i, extension);
}

function Host(currentDirectory, outputDirectory, languageVersion) {
this.currentDirectory = this.getCanonicalFileName(path.resolve(currentDirectory));
this.outputDirectory = this.getCanonicalFileName(path.resolve(outputDirectory));
Expand Down Expand Up @@ -49,7 +46,7 @@ module.exports = function (ts) {
filename
)
));
var canonical = this._currentCanonical(filename);
var canonical = this._toCurrentCanonical(filename);
log('Parsing %s', canonical);

var text;
Expand Down Expand Up @@ -94,7 +91,7 @@ module.exports = function (ts) {
if (filename === '__lib.d.ts') {
return this.libDefault;
}
var canonical = this._currentCanonical(filename);
var canonical = this._toCurrentCanonical(filename);
if (this.files[canonical]) {
return this.files[canonical].ts;
}
Expand All @@ -108,9 +105,19 @@ module.exports = function (ts) {
};

Host.prototype.writeFile = function (filename, data) {
var canonical = this._currentCanonical(filename);
log('Cache write %s', canonical);
this.output[canonical] = data;

var outputCanonical = this._toCurrentCanonical(filename);
log('Cache write %s', outputCanonical);
this.output[outputCanonical] = data;

var sourceCanonical = this._toSourceCanonical(outputCanonical);
var sourceFollowed = this._follow(path.dirname(sourceCanonical)) + '/' + path.basename(sourceCanonical);

if (sourceFollowed !== sourceCanonical) {
outputCanonical = this._toOutputCanonical(sourceFollowed);
log('Cache write (followed) %s', outputCanonical);
this.output[outputCanonical] = data;
}
};

Host.prototype.getCurrentDirectory = function () {
Expand Down Expand Up @@ -138,13 +145,6 @@ module.exports = function (ts) {
return ts.sys.readFile(filename);
};

Host.prototype._currentCanonical = function (filename) {
return this.getCanonicalFileName(path.resolve(
this.currentDirectory,
filename
));
}

Host.prototype._rootDir = function () {
var dirs = [];
for (var filename in this.files) {
Expand All @@ -169,25 +169,70 @@ module.exports = function (ts) {
return rootFilenames;
}

Host.prototype._output = function (filename, extension) {
Host.prototype._output = function (filename) {

var outputCanonical = this._toOutputCanonical(filename);
log('Cache read %s', outputCanonical);

var output = this.output[outputCanonical];
if (!output) {
log('Cache miss on %s', outputCanonical);
}
return output;
}

Host.prototype._toCurrentCanonical = function (filename) {
return this.getCanonicalFileName(path.resolve(
this.currentDirectory,
filename
));
}

Host.prototype._toOutputCanonical = function (filename) {

var inputCanonical = this._currentCanonical(filename);
var sourceCanonical = this._toCurrentCanonical(filename);
var outputRelative = path.relative(
this._rootDir(),
replaceFileExtension(inputCanonical, extension)
sourceCanonical
);
var outputCanonical = this.getCanonicalFileName(path.resolve(
this.outputDirectory,
outputRelative
));
log('Cache read %s', outputCanonical);
return outputCanonical;
}

var output = this.output[outputCanonical];
if (!output) {
log('Cache miss on %s', outputCanonical);
}
return output;
Host.prototype._toSourceCanonical = function (filename) {

var outputCanonical = this._toCurrentCanonical(filename);
var outputRelative = path.relative(
this.outputDirectory,
outputCanonical
);
var sourceCanonical = this.getCanonicalFileName(path.resolve(
this._rootDir(),
outputRelative
));
return sourceCanonical;
}

Host.prototype._follow = function (filename) {

filename = this._toCurrentCanonical(filename);
var parts = [];

while (!/^(\/|\w:\/|\w:\\)$/i.test(filename)) {

var stats = fs.lstatSync(filename);
if (stats.isSymbolicLink()) {
filename = realpath.realpathSync(filename);
} else {
parts.unshift(path.basename(filename));
filename = path.dirname(filename);
}
}
return ts.normalizeSlashes(filename + parts.join('/'));
};

return Host;
};
6 changes: 5 additions & 1 deletion lib/Tsifier.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ module.exports = function (ts) {
return (/\.d\.ts$/i).test(file);
}

function replaceFileExtension(file, extension) {
return file.replace(/\.\w+$/i, extension);
}

function fileExists(file) {
try {
var stats = fs.lstatSync(file);
Expand Down Expand Up @@ -274,7 +278,7 @@ module.exports = function (ts) {
Tsifier.prototype.getCompiledFile = function (inputFile, alreadyMissedCache) {
var self = this;
var outputExtension = (self.opts.jsx === ts.JsxEmit.Preserve && isTsx(inputFile)) ? '.jsx' : '.js';
var output = self.host._output(inputFile, outputExtension);
var output = self.host._output(replaceFileExtension(inputFile, outputExtension));

if (!output) {
if (alreadyMissedCache)
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"eslint": "^2.7.0",
"event-stream": "^3.3.1",
"fs-extra": "^0.28.0",
"fs.realpath": "^1.0.0",
"node-foo": "^0.2.3",
"semver": "^5.1.0",
"source-map": "^0.5.3",
Expand Down

0 comments on commit cb794f2

Please sign in to comment.