Ну вот один вариант я придумал... стрёмный, но всё же.
в package.json в скриптах повесить хук на postinstall, который пробежится по tsd.ts и исправит ссылки на
/// <reference path="../../../../typings/node/node.d.ts" />
, если они дублируют дефиниции родительского проекта.
Вот типа так:
var fs = require('fs');
var path = require('path');
function searchParentTypingPath(currentPath, moduleName, depth){
if (!depth) depth = 1;
if (depth>4) return null;
try{
var filePath = currentPath+'/typings/'+moduleName+'/'+moduleName+'.d.ts';
fs.accessSync(filePath);
return filePath;
}
catch(e){
return searchParentTypingPath(currentPath+'/..', moduleName, depth+1);
}
}
module.exports = function (tsdFilePath, verbose){
var tsdContent = fs.readFileSync(tsdFilePath).toString();
var resultContent = '';
tsdContent.split('\n').forEach(function(line){
var match = line.match(/^\/\/\/\s+<reference path="([\/a-zA-Z0-9_\-.]+)"\s*\/>/);
if (!match) {
resultContent+=line+'\n';
return;
}
var modulePath = match[1];
if (!modulePath.match(/^\w+/)) {// it's not provided by TSD
resultContent+=line+'\n';
return;
}
var moduleName = path.basename(modulePath, '.d.ts');
var parentPath = searchParentTypingPath(path.dirname(tsdFilePath)+'/../..', moduleName);
resultContent+='/// <reference path="'+(parentPath||modulePath)+'" />\n';
});
if (verbose) {
console.log(resultContent);
return resultContent;
}
fs.writeFileSync(tsdFilePath, resultContent);
};