Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

requests: #3 and #4 implementeds

* TSD allow multple definition installations by using: `tsd install lib
[lib...]`
* You can define repository url and other configuration in a config file
* Repository directory structure is mirrored in local folder.
* some bug fix
  • Loading branch information...
commit 4e79b18c27780192b23b7de6a11ea891cc248cb5 1 parent 958a82c
@Diullei Diullei authored
View
312 deploy/tsd.js
@@ -4,10 +4,10 @@
function Environment() { }
Environment.isNode = function isNode() {
return !(typeof ActiveXObject === "function");
- }
+ };
Environment.isWsh = function isWsh() {
return !Environment.isNode();
- }
+ };
return Environment;
})();
System.Environment = Environment;
@@ -122,30 +122,27 @@ var System;
(function (System) {
var Console = (function () {
function Console() { }
- Console.out = null;
Console.initialize = function initialize() {
if(System.Environment.isNode()) {
Console.out = new NodeJs.ConsoleWriter();
+ } else if(System.Environment.isWsh()) {
+ Console.out = new Wsh.ConsoleWriter();
} else {
- if(System.Environment.isWsh()) {
- Console.out = new Wsh.ConsoleWriter();
- } else {
- throw new Error('Invalid host');
- }
+ throw new Error('Invalid host');
}
- }
+ };
Console.write = function write(value) {
Console.out.write(value);
- }
+ };
Console.writeLine = function writeLine(value) {
Console.out.writeLine(value);
- }
+ };
Console.writeAsync = function writeAsync(value, callback) {
Console.out.writeAsync(value, callback);
- }
+ };
Console.writeLineAsync = function writeLineAsync(value, callback) {
Console.out.writeLineAsync(value, callback);
- }
+ };
return Console;
})();
System.Console = Console;
@@ -185,7 +182,7 @@ var NodeJs;
FileHandle.prototype.readFile = function (file) {
var buffer = this._fs.readFileSync(file);
switch(buffer[0]) {
- case 254: {
+ case 254:
if(buffer[1] == 255) {
var i = 0;
while((i + 1) < buffer.length) {
@@ -197,21 +194,15 @@ var NodeJs;
return buffer.toString("ucs2", 2);
}
break;
-
- }
- case 255: {
+ case 255:
if(buffer[1] == 254) {
return buffer.toString("ucs2", 2);
}
break;
-
- }
- case 239: {
+ case 239:
if(buffer[1] == 187) {
return buffer.toString("utf8", 3);
}
-
- }
}
return buffer.toString();
};
@@ -286,10 +277,8 @@ var Wsh;
streamObj.Position = 0;
if((bomChar.charCodeAt(0) == 254 && bomChar.charCodeAt(1) == 255) || (bomChar.charCodeAt(0) == 255 && bomChar.charCodeAt(1) == 254)) {
streamObj.Charset = 'unicode';
- } else {
- if(bomChar.charCodeAt(0) == 239 && bomChar.charCodeAt(1) == 187) {
- streamObj.Charset = 'utf-8';
- }
+ } else if(bomChar.charCodeAt(0) == 239 && bomChar.charCodeAt(1) == 187) {
+ streamObj.Charset = 'utf-8';
}
var str = streamObj.ReadText(-1);
streamObj.Close();
@@ -327,18 +316,15 @@ var System;
(function (IO) {
var FileManager = (function () {
function FileManager() { }
- FileManager.handle = null;
FileManager.initialize = function initialize() {
if(System.Environment.isNode()) {
FileManager.handle = new NodeJs.FileHandle();
+ } else if(System.Environment.isWsh()) {
+ FileManager.handle = new Wsh.FileHandle();
} else {
- if(System.Environment.isWsh()) {
- FileManager.handle = new Wsh.FileHandle();
- } else {
- throw new Error('Invalid host');
- }
+ throw new Error('Invalid host');
}
- }
+ };
return FileManager;
})();
IO.FileManager = FileManager;
@@ -357,6 +343,9 @@ var NodeJs;
WebRequest.prototype.getUrl = function (url, callback) {
System.Console.writeLine("tsd \033[32mhttp \033[35mGET\033[0m " + url);
this._request(url, function (error, response, body) {
+ if(error) {
+ System.Console.writeLine("tsd \033[31mERR!\033[0m \033[35mGET\033[0m " + url);
+ }
System.Console.writeLine("tsd \033[32mhttp \033[35m" + response.statusCode + "\033[0m " + url);
if(!error && response.statusCode == 200) {
callback(body);
@@ -402,18 +391,15 @@ var System;
(function (Web) {
var WebHandler = (function () {
function WebHandler() { }
- WebHandler.request = null;
WebHandler.initialize = function initialize() {
if(System.Environment.isNode()) {
WebHandler.request = new NodeJs.WebRequest();
+ } else if(System.Environment.isWsh()) {
+ WebHandler.request = new Wsh.WebRequest();
} else {
- if(System.Environment.isWsh()) {
- WebHandler.request = new Wsh.WebRequest();
- } else {
- throw new Error('Invalid host');
- }
+ throw new Error('Invalid host');
}
- }
+ };
return WebHandler;
})();
Web.WebHandler = WebHandler;
@@ -452,7 +438,7 @@ var DataSource;
FileSystemDataSource.prototype.all = function (callback) {
this._fs.readFile(this.repositoryPath, function (err, data) {
if(err) {
- throw err;
+ throw new Error("Error reading file repository file: " + err.message);
}
callback(JSON.parse(data));
});
@@ -625,7 +611,7 @@ var NodeJs;
var dpath = '';
for(var i = 0; i < parts.length; i++) {
dpath += parts[i] + '/';
- if(!this.directoryExists(path)) {
+ if(!this.directoryExists(dpath)) {
this._fs.mkdirSync(dpath);
}
}
@@ -645,10 +631,8 @@ var NodeJs;
var stat = _this._fs.statSync(folder + "/" + files[i]);
if(options.recursive && stat.isDirectory()) {
paths = paths.concat(filesInFolder(folder + "/" + files[i]));
- } else {
- if(stat.isFile() && (!spec || files[i].match(spec))) {
- paths.push(folder + "/" + files[i]);
- }
+ } else if(stat.isFile() && (!spec || files[i].match(spec))) {
+ paths.push(folder + "/" + files[i]);
}
}
return paths;
@@ -676,7 +660,7 @@ var Wsh;
var dpath = '';
for(var i = 0; i < parts.length; i++) {
dpath += parts[i] + '/';
- if(!this.directoryExists(path)) {
+ if(!this.directoryExists(dpath)) {
this._fso.CreateFolder(dpath);
}
}
@@ -718,24 +702,69 @@ var System;
(function (IO) {
var DirectoryManager = (function () {
function DirectoryManager() { }
- DirectoryManager.handle = null;
DirectoryManager.initialize = function initialize() {
if(System.Environment.isNode()) {
DirectoryManager.handle = new NodeJs.DirectoryHandle();
+ } else if(System.Environment.isWsh()) {
+ DirectoryManager.handle = new Wsh.DirectoryHandle();
} else {
- if(System.Environment.isWsh()) {
- DirectoryManager.handle = new Wsh.DirectoryHandle();
- } else {
- throw new Error('Invalid host');
- }
+ throw new Error('Invalid host');
}
- }
+ };
return DirectoryManager;
})();
IO.DirectoryManager = DirectoryManager;
})(System.IO || (System.IO = {}));
var IO = System.IO;
})(System || (System = {}));
+var Uri = (function () {
+ var options = {
+ strictMode: false,
+ key: [
+ "source",
+ "protocol",
+ "authority",
+ "userInfo",
+ "user",
+ "password",
+ "host",
+ "port",
+ "relative",
+ "path",
+ "directory",
+ "file",
+ "query",
+ "anchor"
+ ],
+ q: {
+ name: "queryKey",
+ parser: /(?:^|&)([^&=]*)=?([^&]*)/g
+ },
+ parser: {
+ strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
+ loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
+ }
+ };
+ function parseUri(str) {
+ var o = options, m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), uri = {
+ }, i = 14;
+ while(i--) {
+ uri[o.key[i]] = m[i] || "";
+ }
+ uri[o.q.name] = {
+ };
+ uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
+ if($1) {
+ uri[o.q.name][$1] = $2;
+ }
+ });
+ return uri;
+ }
+ ;
+ return {
+ parseUri: parseUri
+ };
+})();
var Command;
(function (Command) {
var InstallCommand = (function () {
@@ -770,13 +799,24 @@ var Command;
sw.flush();
sw.close();
};
- InstallCommand.prototype.save = function (name, version, key, content) {
- if(!System.IO.DirectoryManager.handle.directoryExists(this.cfg.localPath)) {
- System.IO.DirectoryManager.handle.createDirectory(this.cfg.localPath);
+ InstallCommand.prototype.normalizeGithubUrl = function (uri) {
+ if(uri.host == 'github.com') {
+ var parts = uri.directory.split('/');
+ var repo = parts[2];
+ var ignore = '/' + parts[1] + '/' + parts[2] + '/' + parts[3] + '/' + parts[4];
+ uri.directory = '/' + repo + uri.directory.substr(ignore.length);
+ }
+ };
+ InstallCommand.prototype.save = function (url, name, version, key, content) {
+ var uri = Uri.parseUri(url);
+ this.normalizeGithubUrl(uri);
+ if(!System.IO.DirectoryManager.handle.directoryExists(this.cfg.localPath + uri.directory)) {
+ System.IO.DirectoryManager.handle.createDirectory(this.cfg.localPath + uri.directory);
}
- var fileNameWithoutExtension = this.cfg.localPath + "/" + name + "-" + version;
+ var fileNameWithoutExtension = this.cfg.localPath + uri.directory + name + "-" + version;
+ System.Console.writeLine("");
this.saveFile(fileNameWithoutExtension + ".d.ts", content);
- System.Console.writeLine("└── " + name + "@" + version + " instaled.");
+ System.Console.writeLine("└── " + name + "@" + version + " -> " + this.cfg.localPath + uri.directory);
this.saveFile(fileNameWithoutExtension + ".d.key", key);
System.Console.writeLine(" └── " + key + ".key");
};
@@ -807,7 +847,7 @@ var Command;
} else {
var version = targetLib.versions[0];
System.Web.WebHandler.request.getUrl(version.url, function (body) {
- _this.save(targetLib.name, version.version, version.key, body);
+ _this.save(version.url, targetLib.name, version.version, version.key, body);
_this._cache.push(targetLib.name + '@' + version.version);
var deps = (targetLib.versions[0].dependencies) || [];
for(var i = 0; i < deps.length; i++) {
@@ -819,14 +859,23 @@ var Command;
};
InstallCommand.prototype.exec = function (args) {
var _this = this;
- this.dataSource.all(function (libs) {
- System.Console.writeLine("");
- var targetLib = _this.find(args[3], libs);
+ var targetLib;
+ var tryInstall = function (libs, lib) {
+ targetLib = _this.find(lib, libs);
if(targetLib) {
_this.install(targetLib, targetLib.versions[0].version, libs);
} else {
System.Console.writeLine("Lib not found.");
}
+ };
+ this.dataSource.all(function (libs) {
+ var index = 3;
+ var lib = args[index];
+ while(lib) {
+ tryInstall(libs, lib);
+ index++;
+ lib = args[index];
+ }
});
};
InstallCommand.prototype.toString = function () {
@@ -856,28 +905,33 @@ var Command;
var _this = this;
this.dataSource.all(function (libs) {
var libList = [];
- var files = System.IO.DirectoryManager.handle.getAllFiles(_this.cfg.localPath);
+ var files = [];
+ try {
+ files = System.IO.DirectoryManager.handle.getAllFiles(_this.cfg.localPath, /.d\.key$/g, {
+ recursive: true
+ });
+ } catch (e) {
+ System.Console.writeLine('Empty directory.');
+ }
for(var i = 0; i < files.length; i++) {
var file = files[i].substr(_this.cfg.localPath.length + 1);
- if(file.substr(file.length - 5) == 'd.key') {
- var name = file.substr(0, file.lastIndexOf('-'));
- var version = file.substr(name.length + 1, file.length - name.length - 7);
- var key = System.IO.FileManager.handle.readFile(files[i]);
- var flg = false;
- for(var j = 0; j < libs.length; j++) {
- var lib = libs[j];
- if(name == lib.name) {
- if(version == lib.versions[0].version) {
- if(key != lib.versions[0].key) {
- System.Console.writeLine(' ' + (System.Environment.isNode() ? '\033[36m' : '') + name + (System.Environment.isNode() ? '\033[0m' : '') + ' - ' + (System.Environment.isNode() ? '\033[33m' : '') + 'A new version is available!' + (System.Environment.isNode() ? '\033[0m' : ''));
- flg = true;
- }
+ var name = file.substr(0, file.lastIndexOf('-'));
+ var version = file.substr(name.length + 1, file.length - name.length - 7);
+ var key = System.IO.FileManager.handle.readFile(files[i]);
+ var flg = false;
+ for(var j = 0; j < libs.length; j++) {
+ var lib = libs[j];
+ if(name == lib.name) {
+ if(version == lib.versions[0].version) {
+ if(key != lib.versions[0].key) {
+ System.Console.writeLine(' ' + (System.Environment.isNode() ? '\033[36m' : '') + '> ' + name + ' d.ts' + (System.Environment.isNode() ? '\033[0m' : '') + ' - ' + (System.Environment.isNode() ? '\033[33m' : '') + 'A new version is available!' + (System.Environment.isNode() ? '\033[0m' : ''));
+ flg = true;
}
}
}
- if(!flg) {
- System.Console.writeLine(' ' + (System.Environment.isNode() ? '\033[36m' : '') + name + (System.Environment.isNode() ? '\033[0m' : '') + ' - ' + 'Is the latest version.');
- }
+ }
+ if(!flg) {
+ System.Console.writeLine(' ' + (System.Environment.isNode() ? '\033[36m' : '') + '> ' + name + ' d.ts' + (System.Environment.isNode() ? '\033[0m' : '') + ' - ' + 'Is the latest version.');
}
}
});
@@ -889,6 +943,68 @@ var Command;
})();
Command.UpdateCommand = UpdateCommand;
})(Command || (Command = {}));
+var RepositoryTypeEnum;
+(function (RepositoryTypeEnum) {
+ RepositoryTypeEnum._map = [];
+ RepositoryTypeEnum._map[0] = "FileSystem";
+ RepositoryTypeEnum.FileSystem = 0;
+ RepositoryTypeEnum._map[1] = "Web";
+ RepositoryTypeEnum.Web = 1;
+})(RepositoryTypeEnum || (RepositoryTypeEnum = {}));
+var Config = (function () {
+ function Config() { }
+ Config.FILE_NAME = 'tsd-config.json';
+ Config.isNull = function isNull(cfg, key, alternativeValue) {
+ return cfg[key] ? cfg[key] : alternativeValue;
+ };
+ Config.tryGetConfigFile = function tryGetConfigFile() {
+ var cfg = {
+ };
+ try {
+ cfg = JSON.parse(System.IO.FileManager.handle.readFile(Config.FILE_NAME));
+ } catch (e) {
+ }
+ return cfg;
+ };
+ Config.prototype.load = function () {
+ var cfg = Config.tryGetConfigFile();
+ this.localPath = Config.isNull(cfg, 'localPath', 'd.ts');
+ this.repositoryType = Config.isNull(cfg, 'repositoryType', RepositoryTypeEnum.Web);
+ this.uri = Config.isNull(cfg, 'uri', "https://github.com/Diullei/tsd/raw/master/deploy/repository.json");
+ };
+ return Config;
+})();
+var Command;
+(function (Command) {
+ var CreateLocalConfigCommand = (function () {
+ function CreateLocalConfigCommand() {
+ this.shortcut = "ncfg";
+ this.usage = "Create a local config file.";
+ }
+ CreateLocalConfigCommand.prototype.accept = function (args) {
+ return args[2] == this.shortcut;
+ };
+ CreateLocalConfigCommand.prototype.saveConfigFile = function () {
+ var sw = System.IO.FileManager.handle.createFile(Config.FILE_NAME);
+ sw.write('{\n' + ' "localPath": "d.ts",\n' + ' "repositoryType": "1",\n' + ' "uri": "https://github.com/Diullei/tsd/raw/master/deploy/repository.json"\n' + '}');
+ sw.flush();
+ sw.close();
+ };
+ CreateLocalConfigCommand.prototype.exec = function (args) {
+ if(System.IO.FileManager.handle.fileExists(Config.FILE_NAME)) {
+ throw new Error("There is already a configuration file in this folder.");
+ } else {
+ this.saveConfigFile();
+ }
+ System.Console.writeLine("configuration file created successfully.");
+ };
+ CreateLocalConfigCommand.prototype.toString = function () {
+ return this.shortcut + " " + this.usage;
+ };
+ return CreateLocalConfigCommand;
+ })();
+ Command.CreateLocalConfigCommand = CreateLocalConfigCommand;
+})(Command || (Command = {}));
var CommandLineProcessor = (function () {
function CommandLineProcessor(dataSource, cfg) {
this.dataSource = dataSource;
@@ -899,6 +1015,7 @@ var CommandLineProcessor = (function () {
this.commands.push(new Command.SearchCommand(this.dataSource));
this.commands.push(new Command.InstallCommand(this.dataSource, this.cfg));
this.commands.push(new Command.UpdateCommand(this.dataSource, this.cfg));
+ this.commands.push(new Command.CreateLocalConfigCommand());
}
CommandLineProcessor.prototype.printUsage = function () {
System.Console.out.autoFlush = false;
@@ -933,28 +1050,6 @@ var CommandLineProcessor = (function () {
};
return CommandLineProcessor;
})();
-var RepositoryTypeEnum;
-(function (RepositoryTypeEnum) {
- RepositoryTypeEnum._map = [];
- RepositoryTypeEnum._map[0] = "FileSystem";
- RepositoryTypeEnum.FileSystem = 0;
- RepositoryTypeEnum._map[1] = "Web";
- RepositoryTypeEnum.Web = 1;
-})(RepositoryTypeEnum || (RepositoryTypeEnum = {}));
-var Config = (function () {
- function Config() { }
- Config.prototype.load = function () {
- try {
- var cfgStr = System.IO.FileManager.handle.readFile('tsd-config.json');
- var cfg = JSON.parse(cfgStr);
- this.localPath = cfg.localPath;
- } catch (e) {
- console.log(e);
- this.localPath = "d.ts";
- }
- };
- return Config;
-})();
var DataSource;
(function (DataSource) {
var DataSourceFactory = (function () {
@@ -962,19 +1057,16 @@ var DataSource;
DataSourceFactory.factory = function factory(cfg) {
if(cfg.repositoryType == RepositoryTypeEnum.FileSystem) {
return new DataSource.FileSystemDataSource(cfg.uri);
+ } else if(cfg.repositoryType == RepositoryTypeEnum.Web) {
+ return new DataSource.WebDataSource(cfg.uri);
} else {
- if(cfg.repositoryType == RepositoryTypeEnum.Web) {
- return new DataSource.WebDataSource(cfg.uri);
- } else {
- throw Error('Invalid dataSource.');
- }
+ throw Error('Invalid dataSource.');
}
- }
+ };
return DataSourceFactory;
})();
DataSource.DataSourceFactory = DataSourceFactory;
})(DataSource || (DataSource = {}));
-var VERSION = "0.2.3";
var Main = (function () {
function Main() { }
Main.prototype.init = function () {
@@ -987,8 +1079,6 @@ var Main = (function () {
try {
var cfg = new Config();
cfg.load();
- cfg.repositoryType = RepositoryTypeEnum.Web;
- cfg.uri = "https://github.com/Diullei/tsd/raw/master/deploy/repository.json";
var ds = DataSource.DataSourceFactory.factory(cfg);
var cp = new CommandLineProcessor(ds, cfg);
cp.execute(args);
View
1  deploy/version.txt
@@ -1 +0,0 @@
-0.2.3
View
41 src/Command/CreateLocalConfigCommand.ts
@@ -0,0 +1,41 @@
+///<reference path='ICommand.ts'/>
+///<reference path='../Config.ts'/>
+///<reference path='../System/IO/FileManager.ts'/>
+
+module Command {
+
+ export class CreateLocalConfigCommand implements ICommand {
+
+ public shortcut: string = "ncfg";
+ public usage: string = "Create a local config file.";
+ private args: Array;
+
+ public accept(args: Array): bool {
+ return args[2] == this.shortcut;
+ }
+
+ private saveConfigFile(): void {
+ var sw = System.IO.FileManager.handle.createFile(Config.FILE_NAME);
+ sw.write('{\n'
+ + ' "localPath": "d.ts",\n'
+ + ' "repositoryType": "1",\n'
+ + ' "uri": "https://github.com/Diullei/tsd/raw/master/deploy/repository.json"\n'
+ + '}');
+ sw.flush();
+ sw.close();
+ }
+
+ public exec(args: Array): void {
+ if (System.IO.FileManager.handle.fileExists(Config.FILE_NAME)) {
+ throw new Error("There is already a configuration file in this folder.");
+ } else {
+ this.saveConfigFile();
+ }
+ System.Console.writeLine("configuration file created successfully.");
+ }
+
+ public toString(): string {
+ return this.shortcut + " " + this.usage;
+ }
+ }
+}
View
46 src/Command/InstallCommand.ts
@@ -2,6 +2,8 @@
///<reference path='../System/Web/WebRequest.ts'/>
///<reference path='../System/IO/FileManager.ts'/>
///<reference path='../System/IO/DirectoryManager.ts'/>
+///<reference path='../System/Console.ts'/>
+///<reference path='../System/Uri.ts'/>
module Command {
@@ -43,15 +45,28 @@ module Command {
sw.close();
}
- private save(name: string, version: string, key: string, content: string): void {
- if(!System.IO.DirectoryManager.handle.directoryExists(this.cfg.localPath)) {
- System.IO.DirectoryManager.handle.createDirectory(this.cfg.localPath);
+ private normalizeGithubUrl(uri: UriParsedObject) {
+ if (uri.host == 'github.com') {
+ var parts = uri.directory.split('/');
+ var repo = /*parts[1] + '_' +*/ parts[2];
+ var ignore = '/' + parts[1] + '/' + parts[2] + '/' + parts[3] + '/' + parts[4];
+ uri.directory = '/' + repo + uri.directory.substr(ignore.length);
}
+ }
+
+ private save(url: string, name: string, version: string, key: string, content: string): void {
+ var uri = Uri.parseUri(url);
+ this.normalizeGithubUrl(uri);
- var fileNameWithoutExtension = this.cfg.localPath + "/" + name + "-" + version;
+ if(!System.IO.DirectoryManager.handle.directoryExists(this.cfg.localPath + uri.directory)) {
+ System.IO.DirectoryManager.handle.createDirectory(this.cfg.localPath + uri.directory);
+ }
+ var fileNameWithoutExtension = this.cfg.localPath + uri.directory + name + "-" + version;
+
+ System.Console.writeLine("");
this.saveFile(fileNameWithoutExtension + ".d.ts", content);
- System.Console.writeLine("└── " + name + "@" + version + " instaled.");
+ System.Console.writeLine("└── " + name + "@" + version + " -> " + this.cfg.localPath + uri.directory);
this.saveFile(fileNameWithoutExtension + ".d.key", key);
System.Console.writeLine(" └── " + key + ".key");
@@ -86,7 +101,7 @@ module Command {
var version = targetLib.versions[0];
System.Web.WebHandler.request.getUrl(version.url, (body) => {
- this.save(targetLib.name, version.version, version.key, body);
+ this.save(version.url, targetLib.name, version.version, version.key, body);
this._cache.push(targetLib.name + '@' + version.version);
var deps = (<DataSource.LibDep[]>targetLib.versions[0].dependencies) || [];
for (var i = 0; i < deps.length; i++) {
@@ -98,14 +113,25 @@ module Command {
}
public exec(args: Array): void {
- this.dataSource.all((libs) => {
- System.Console.writeLine("");
- var targetLib: DataSource.Lib = this.find(args[3], libs);
+ var targetLib: DataSource.Lib;
- if(targetLib)
+ var tryInstall = (libs, lib: string) => {
+ targetLib = this.find(lib, libs);
+
+ if (targetLib)
this.install(targetLib, targetLib.versions[0].version, libs);
else
System.Console.writeLine("Lib not found.");
+ };
+
+ this.dataSource.all((libs) => {
+ var index = 3;
+ var lib = args[index];
+ while (lib) {
+ tryInstall(libs, lib);
+ index++;
+ lib = args[index];
+ }
});
}
View
19 src/Command/UpdateCommand.ts
@@ -1,5 +1,6 @@
///<reference path='ICommand.ts'/>
///<reference path='../System/IO/DirectoryManager.ts'/>
+///<reference path='../System/Console.ts'/>
module Command {
@@ -24,13 +25,19 @@ module Command {
public exec(args: Array): void {
this.dataSource.all((libs) => {
- var libList: Lib[] = [];
- var files = System.IO.DirectoryManager.handle.getAllFiles(this.cfg.localPath);
+ var libList: Lib[] = [];
+ var files = [];
+
+ try {
+ files = System.IO.DirectoryManager.handle.getAllFiles(this.cfg.localPath, /.d\.key$/g, { recursive: true });
+ } catch (e) {
+ System.Console.writeLine('Empty directory.');
+ }
for (var i = 0; i < files.length; i++) {
var file = files[i].substr(this.cfg.localPath.length + 1);
- if (file.substr(file.length - 5) == 'd.key') {
+ //if (file.substr(file.length - 5) == 'd.key') {
var name = file.substr(0, file.lastIndexOf('-'));
var version = file.substr(name.length + 1, file.length - name.length - 7);
var key = System.IO.FileManager.handle.readFile(files[i]);
@@ -44,7 +51,7 @@ module Command {
if (version == lib.versions[0].version) {
if (key != lib.versions[0].key) {
System.Console.writeLine(
- ' ' + (System.Environment.isNode() ? '\033[36m' : '') + name + (System.Environment.isNode() ? '\033[0m' : '') + ' - '
+ ' ' + (System.Environment.isNode() ? '\033[36m' : '') + '> ' + name + ' d.ts' + (System.Environment.isNode() ? '\033[0m' : '') + ' - '
+ (System.Environment.isNode() ? '\033[33m' : '') + 'A new version is available!' + (System.Environment.isNode() ? '\033[0m' : '') );
flg = true;
}
@@ -54,10 +61,10 @@ module Command {
if (!flg) {
System.Console.writeLine(
- ' ' + (System.Environment.isNode() ? '\033[36m' : '') + name + (System.Environment.isNode() ? '\033[0m' : '') + ' - '
+ ' ' + (System.Environment.isNode() ? '\033[36m' : '') + '> ' + name + ' d.ts' + (System.Environment.isNode() ? '\033[0m' : '') + ' - '
+ 'Is the latest version.');
}
- }
+ //}
}
});
View
2  src/CommandLineProcessor.ts
@@ -5,6 +5,7 @@
///<reference path='Command\SearchCommand.ts'/>
///<reference path='Command\InstallCommand.ts'/>
///<reference path='Command\UpdateCommand.ts'/>
+///<reference path='Command\CreateLocalConfigCommand.ts'/>
class CommandLineProcessor {
@@ -17,6 +18,7 @@ class CommandLineProcessor {
this.commands.push(new Command.SearchCommand(this.dataSource));
this.commands.push(new Command.InstallCommand(this.dataSource, this.cfg));
this.commands.push(new Command.UpdateCommand(this.dataSource, this.cfg));
+ this.commands.push(new Command.CreateLocalConfigCommand());
}
public printUsage() {
View
29 src/Config.ts
@@ -1,23 +1,36 @@
///<reference path='System/IO/FileManager.ts'/>
+declare var unescape;
+
enum RepositoryTypeEnum {
FileSystem,
Web
}
class Config {
+ public static FILE_NAME = 'tsd-config.json';
+
public repositoryType: RepositoryTypeEnum;
public uri: string;
public localPath: string;
+ private static isNull(cfg: Object, key: string, alternativeValue: any): any {
+ return cfg[key] ? cfg[key] : alternativeValue;
+ }
+
+ private static tryGetConfigFile() {
+ var cfg = {};
+ try {
+ cfg = JSON.parse(System.IO.FileManager.handle.readFile(Config.FILE_NAME));
+ } catch (e) {
+ }
+ return cfg;
+ }
+
public load() {
- try{
- var cfgStr = System.IO.FileManager.handle.readFile('tsd-config.json');
- var cfg = JSON.parse(cfgStr);
- this.localPath = cfg.localPath;
- }catch(e){
- console.log(e);
- this.localPath = "d.ts";
- }
+ var cfg = Config.tryGetConfigFile();
+ this.localPath = Config.isNull(cfg, 'localPath', 'd.ts');
+ this.repositoryType = Config.isNull(cfg, 'repositoryType', RepositoryTypeEnum.Web);
+ this.uri = Config.isNull(cfg, 'uri', "https://github.com/Diullei/tsd/raw/master/deploy/repository.json");
}
}
View
7 src/DataSource/FileSystemDataSource.ts
@@ -11,8 +11,11 @@ module DataSource {
constructor (public repositoryPath: string) { }
public all(callback: (data: DataSource.Lib[]) => void ): void {
- this._fs.readFile(this.repositoryPath, function (err, data) {
- if (err) throw err;
+ this._fs.readFile(this.repositoryPath, (err, data) => {
+ if (err) {
+ throw new Error("Error reading file repository file: " + err.message);
+ //throw err;
+ }
callback(JSON.parse(data));
});
}
View
4 src/NodeJs/DirectoryHandle.ts
@@ -18,7 +18,7 @@ module NodeJs {
var dpath = '';
for (var i = 0; i < parts.length; i++) {
dpath += parts[i] + '/';
- if (!this.directoryExists(path)) {
+ if (!this.directoryExists(dpath)) {
this._fs.mkdirSync(dpath);
}
}
@@ -29,7 +29,7 @@ module NodeJs {
return this._path.dirname(path);
}
- public getAllFiles(path, spec?, options?): string[] {
+ public getAllFiles(path, spec?, options?): string[] {
options = options || <{ recursive?: bool; }>{};
var filesInFolder = (folder: string): string[] => {
View
8 src/NodeJs/WebRequest.ts
@@ -1,15 +1,19 @@
///<reference path='../System/Web/IWebRequest.ts'/>
///<reference path='../System/Console.ts'/>
-module NodeJs {
+module NodeJs {
+
export class WebRequest implements System.Web.IWebRequest {
private _request: any = require('request');
public getUrl(url: string, callback: (data: string) => void ): void {
System.Console.writeLine("tsd \033[32mhttp \033[35mGET\033[0m " + url);
-
+
this._request(url, (error, response, body) => {
+ if (error)
+ System.Console.writeLine("tsd \033[31mERR!\033[0m \033[35mGET\033[0m " + url);
+
System.Console.writeLine("tsd \033[32mhttp \033[35m" + response.statusCode + "\033[0m " + url);
if (!error && response.statusCode == 200) {
callback(body);
View
55 src/System/Uri.ts
@@ -0,0 +1,55 @@
+// parseUri 1.2.2
+// (c) Steven Levithan <stevenlevithan.com>
+// MIT License
+
+interface UriParsedObject {
+ anchor: string;
+ query: string;
+ file: string;
+ directory: string;
+ path: string;
+ relative: string;
+ port: string;
+ host: string;
+ password: string;
+ user: string;
+ iserInfo: string;
+ authority: string;
+ protocol: string;
+ source: string;
+ queryKey: Object;
+}
+
+var Uri = <{ parseUri: (str: string) => UriParsedObject; }><any>(function () {
+
+ var options = {
+ strictMode: false,
+ key: ["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"],
+ q: {
+ name: "queryKey",
+ parser: /(?:^|&)([^&=]*)=?([^&]*)/g
+ },
+ parser: {
+ strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
+ loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
+ }
+ };
+
+ function parseUri(str) {
+ var o = options,
+ m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
+ uri = {},
+ i = 14;
+
+ while (i--) uri[o.key[i]] = m[i] || "";
+
+ uri[o.q.name] = {};
+ uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
+ if ($1) uri[o.q.name][$1] = $2;
+ });
+
+ return uri;
+ };
+
+ return { parseUri: parseUri };
+})();
View
2  src/Wsh/DirectoryHandle.ts
@@ -25,7 +25,7 @@ module Wsh {
var dpath = '';
for (var i = 0; i < parts.length; i++) {
dpath += parts[i] + '/';
- if (!this.directoryExists(path)) {
+ if (!this.directoryExists(dpath)) {
this._fso.CreateFolder(dpath);
}
}
View
131 src/d.ts/node-0.8.d.ts
@@ -80,11 +80,10 @@ interface EventEmitter {
on(event: string, listener: Function);
once(event: string, listener: Function): void;
removeListener(event: string, listener: Function): void;
- removeAllListeners(event: string): void;
+ removeAllListener(event: string): void;
setMaxListeners(n: number): void;
listeners(event: string): { Function; }[];
- //emit(event: string, arg1?: any, arg2?: any): void;
- emit(event: string, ...args: any[]): void;
+ emit(event: string, arg1?: any, arg2?: any): void;
}
interface WritableStream extends EventEmitter {
@@ -166,7 +165,7 @@ interface NodeProcess extends EventEmitter {
interface NodeBuffer {
[index: number]: number;
write(string: string, offset?: number, length?: number, encoding?: string): number;
- toString(encoding?: string, start?: number, end?: number): string;
+ toString(encoding: string, start: number, end: number): string;
length: number;
copy(targetBuffer: NodeBuffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): void;
slice(start?: number, end?: number): NodeBuffer;
@@ -230,13 +229,12 @@ declare module "events" {
}
declare module "http" {
- export import events = module("events");
- export import net = module("net");
- export import stream = module("stream");
+ import events = module("events");
+ import net = module("net");
+ import stream = module("stream");
export interface Server extends events.NodeEventEmitter {
listen(port: number, hostname?: string, backlog?: number, callback?: Function): void;
- listen(port: number, hostname?: number, callback?: Function): void;
listen(path: string, callback?: Function): void;
listen(handle: any, listeningListener?: Function): void;
close(cb?: any): void;
@@ -302,7 +300,7 @@ declare module "http" {
}
declare module "cluster" {
- export import child_process = module("child_process");
+ import child_process = module("child_process");
export interface ClusterSettings {
exec: string;
@@ -339,7 +337,7 @@ declare module "cluster" {
}
declare module "zlib" {
- export import stream = module("stream");
+ import stream = module("stream");
export interface ZlibOptions { chunkSize?: number; windowBits?: number; level?: number; memLevel?: number; strategy?: number; dictionary?: any; }
export interface Gzip extends stream.ReadWriteStream { }
@@ -417,9 +415,9 @@ declare module "os" {
}
declare module "https" {
- export import tls = module("tls");
- export import events = module("events");
- export import http = module("http");
+ import tls = module("tls");
+ import events = module("events");
+ import http = module("http");
export interface ServerOptions {
pfx?: any;
@@ -483,8 +481,8 @@ declare module "punycode" {
}
declare module "repl" {
- export import stream = module("stream");
- export import events = module("events");
+ import stream = module("stream");
+ import events = module("events");
export interface ReplOptions {
prompt?: string;
@@ -501,8 +499,8 @@ declare module "repl" {
}
declare module "readline" {
- export import events = module("events");
- export import stream = module("stream");
+ import events = module("events");
+ import stream = module("stream");
export interface ReadLine extends events.NodeEventEmitter {
setPrompt(prompt: string, length: number): void;
@@ -536,8 +534,8 @@ declare module "vm" {
}
declare module "child_process" {
- export import events = module("events");
- export import stream = module("stream");
+ import events = module("events");
+ import stream = module("stream");
export interface ChildProcess extends events.NodeEventEmitter {
stdin: stream.WritableStream;
@@ -586,17 +584,16 @@ declare module "child_process" {
declare module "url" {
export interface Url {
- href?: string;
- protocol?: string;
- auth?: string;
- hostname?: string;
- port?: string;
- host?: string;
- pathname?: string;
- search?: string;
- query?: string;
- slashes?: bool;
- hash?: string;
+ href: string;
+ protocol: string;
+ auth: string;
+ hostname: string;
+ port: string;
+ host: string;
+ pathname: string;
+ search: string;
+ query: string;
+ slashes: bool;
}
export function parse(urlStr: string, parseQueryString? , slashesDenoteHost? ): Url;
@@ -620,7 +617,7 @@ declare module "dns" {
}
declare module "net" {
- export import stream = module("stream");
+ import stream = module("stream");
export interface NodeSocket extends stream.ReadWriteStream {
// Extended base methods
@@ -636,7 +633,7 @@ declare module "net" {
destroy(): void;
pause(): void;
resume(): void;
- setTimeout(timeout: number, callback?: Function); void;
+ setTimeout(timeout: number, callback?: Function): void;
setNoDelay(noDelay?: bool): void;
setKeepAlive(enable?: bool, initialDelay?: number): void;
address(): { port: number; family: string; address: string; };
@@ -673,7 +670,7 @@ declare module "net" {
}
declare module "dgram" {
- export import events = module("events");
+ import events = module("events");
export function createSocket(type: string, callback?: Function): Socket;
@@ -691,7 +688,7 @@ declare module "dgram" {
}
declare module "fs" {
- export import stream = module("stream");
+ import stream = module("stream");
interface Stats {
isFile(): bool;
@@ -725,32 +722,26 @@ declare module "fs" {
export function rename(oldPath: string, newPath: string, callback?: Function): void;
export function renameSync(oldPath: string, newPath: string): void;
- export function truncate(fd: number, len: number, callback?: Function): void;
- export function truncateSync(fd: number, len: number): void;
+ export function truncate(fd: string, len: number, callback?: Function): void;
+ export function truncateSync(fd: string, len: number): void;
export function chown(path: string, uid: number, gid: number, callback?: Function): void;
export function chownSync(path: string, uid: number, gid: number): void;
- export function fchown(fd: number, uid: number, gid: number, callback?: Function): void;
- export function fchownSync(fd: number, uid: number, gid: number): void;
+ export function fchown(fd: string, uid: number, gid: number, callback?: Function): void;
+ export function fchownSync(fd: string, uid: number, gid: number): void;
export function lchown(path: string, uid: number, gid: number, callback?: Function): void;
export function lchownSync(path: string, uid: number, gid: number): void;
- export function chmod(path: string, mode: number, callback?: Function): void;
export function chmod(path: string, mode: string, callback?: Function): void;
- export function chmodSync(path: string, mode: number): void;
export function chmodSync(path: string, mode: string): void;
- export function fchmod(fd: number, mode: number, callback?: Function): void;
- export function fchmod(fd: number, mode: string, callback?: Function): void;
- export function fchmodSync(fd: number, mode: number): void;
- export function fchmodSync(fd: number, mode: string): void;
+ export function fchmod(fd: string, mode: string, callback?: Function): void;
+ export function fchmodSync(fd: string, mode: string): void;
export function lchmod(path: string, mode: string, callback?: Function): void;
- export function lchmod(path: string, mode: number, callback?: Function): void;
- export function lchmodSync(path: string, mode: number): void;
export function lchmodSync(path: string, mode: string): void;
export function stat(path: string, callback?: (err: Error, stats: Stats) =>any): Stats;
export function lstat(path: string, callback?: (err: Error, stats: Stats) =>any): Stats;
- export function fstat(fd: number, callback?: (err: Error, stats: Stats) =>any): Stats;
+ export function fstat(fd: string, callback?: (err: Error, stats: Stats) =>any): Stats;
export function statSync(path: string): Stats;
export function lstatSync(path: string): Stats;
- export function fstatSync(fd: number): Stats;
+ export function fstatSync(fd: string): Stats;
export function link(srcpath: string, dstpath: string, callback?: Function): void;
export function linkSync(srcpath: string, dstpath: string): void;
export function symlink(srcpath: string, dstpath: string, type?: string, callback?: Function): void;
@@ -758,30 +749,29 @@ declare module "fs" {
export function readlink(path: string, callback?: (err: Error, linkString: string) =>any): void;
export function realpath(path: string, callback?: (err: Error, resolvedPath: string) =>any): void;
export function realpath(path: string, cache: string, callback: (err: Error, resolvedPath: string) =>any): void;
- export function realpathSync(path: string, cache?: bool): string;
+ export function realpathSync(path: string, cache?: string): void;
export function unlink(path: string, callback?: Function): void;
export function unlinkSync(path: string): void;
export function rmdir(path: string, callback?: Function): void;
export function rmdirSync(path: string): void;
- export function mkdir(path: string, mode?: any, callback?: Function): void;
- export function mkdirSync(path: string, mode?: number): void;
+ export function mkdir(path: string, mode?: string, callback?: Function): void;
export function mkdirSync(path: string, mode?: string): void;
export function readdir(path: string, callback?: (err: Error, files: string[]) => void): void;
export function readdirSync(path: string): string[];
- export function close(fd: number, callback?: Function): void;
- export function closeSync(fd: number): void;
- export function open(path: string, flags: string, mode?: string, callback?: (err: Error, fd: number) =>any): void;
- export function openSync(path: string, flags: string, mode?: string): number;
+ export function close(fd: string, callback?: Function): void;
+ export function closeSync(fd: string): void;
+ export function open(path: string, flags: string, mode?: string, callback?: (err: Error, fd: string) =>any): void;
+ export function openSync(path: string, flags: string, mode?: string): void;
export function utimes(path: string, atime: number, mtime: number, callback?: Function): void;
export function utimesSync(path: string, atime: number, mtime: number): void;
- export function futimes(fd: number, atime: number, mtime: number, callback?: Function): void;
- export function futimesSync(fd: number, atime: number, mtime: number): void;
- export function fsync(fd: number, callback?: Function): void;
- export function fsyncSync(fd: number): void;
- export function write(fd: number, buffer: NodeBuffer, offset: number, length: number, position: number, callback?: (err: Error, written: number, buffer: NodeBuffer) =>any): void;
- export function writeSync(fd: number, buffer: NodeBuffer, offset: number, length: number, position: number): number;
- export function read(fd: number, buffer: NodeBuffer, offset: number, length: number, position: number, callback?: (err: Error, bytesRead: number, buffer: NodeBuffer) => void): void;
- export function readSync(fd: number, buffer: NodeBuffer, offset: number, length: number, position: number): number;
+ export function futimes(fd: string, atime: number, mtime: number, callback?: Function): void;
+ export function futimesSync(fd: string, atime: number, mtime: number): void;
+ export function fsync(fd: string, callback?: Function): void;
+ export function fsyncSync(fd: string): void;
+ export function write(fd: string, buffer: NodeBuffer, offset: number, length: number, position: number, callback?: (err: Error, written: number, buffer: NodeBuffer) =>any): void;
+ export function writeSync(fd: string, buffer: NodeBuffer, offset: number, length: number, position: number): void;
+ export function read(fd: string, buffer: NodeBuffer, offset: number, length: number, position: number, callback?: (err: Error, bytesRead: number, buffer: NodeBuffer) => void): void;
+ export function readSync(fd: string, buffer: NodeBuffer, offset: number, length: number, position: number): any[];
export function readFile(filename: string, encoding: string, callback: (err: Error, data: string) => void ): void;
export function readFile(filename: string, callback: (err: Error, data: NodeBuffer) => void ): void;
export function readFileSync(filename: string): NodeBuffer;
@@ -813,7 +803,6 @@ declare module "fs" {
declare module "path" {
export function normalize(p: string): string;
export function join(...paths: any[]): string;
- export function resolve(to: string): string;
export function resolve(from: string, to: string): string;
export function resolve(from: string, from2: string, to: string): string;
export function resolve(from: string, from2: string, from3: string, to: string): string;
@@ -837,9 +826,9 @@ declare module "string_decoder" {
}
declare module "tls" {
- export import crypto = module("crypto");
- export import net = module("net");
- export import stream = module("stream");
+ import crypto = module("crypto");
+ import net = module("net");
+ import stream = module("stream");
var CLIENT_RENEG_LIMIT: number;
var CLIENT_RENEG_WINDOW: number;
@@ -984,7 +973,7 @@ declare module "crypto" {
}
declare module "stream" {
- export import events = module("events");
+ import events = module("events");
export interface WritableStream extends events.NodeEventEmitter {
writable: bool;
@@ -1016,7 +1005,7 @@ declare module "util" {
export function puts(...param: any[]): void;
export function print(...param: any[]): void;
export function log(string: string): void;
- export function inspect(object: any, showHidden?: bool, depth?: number, color?: bool): string;
+ export function inspect(object: any, showHidden?: bool, depth?: number, color?: bool): void;
export function isArray(object: any): bool;
export function isRegExp(object: any): bool;
export function isDate(object: any): bool;
@@ -1040,7 +1029,7 @@ declare module "assert" {
}
declare module "tty" {
- export import net = module("net");
+ import net = module("net");
export function isatty(fd: string): bool;
export interface ReadStream extends net.NodeSocket {
@@ -1054,7 +1043,7 @@ declare module "tty" {
}
declare module "domain" {
- export import events = module("events");
+ import events = module("events");
export interface Domain extends events.NodeEventEmitter { }
View
7 src/tsd.ts
@@ -7,7 +7,7 @@
///<reference path='Config.ts'/>
///<reference path='DataSource\DataSourceFactory.ts'/>
-var VERSION = "0.2.3";
+//var VERSION = "0.2.3";
class Main {
public init() {
@@ -23,14 +23,13 @@ class Main {
var cfg = new Config();
cfg.load();
- cfg.repositoryType = RepositoryTypeEnum.Web;
- cfg.uri = "https://github.com/Diullei/tsd/raw/master/deploy/repository.json";
+ //cfg.repositoryType = RepositoryTypeEnum.Web;
+ //cfg.uri = "https://github.com/Diullei/tsd/raw/master/deploy/repository.json";
//cfg.repositoryType = RepositoryTypeEnum.FileSystem;
//cfg.uri = "repository.json";
//cfg.localPath = "d.ts";
-
var ds = DataSource.DataSourceFactory.factory(cfg);
var cp = new CommandLineProcessor(ds, cfg);
cp.execute(args);
View
8 tsd.csproj
@@ -47,13 +47,17 @@
</ItemGroup>
<ItemGroup>
<Content Include="deploy\tsd.js" />
- <Content Include="deploy\version.txt" />
<Content Include="LICENSE.txt" />
<Content Include="src\Command\AllCommand.ts" />
<TypeScriptCompile Include="src\Command\UpdateCommand.ts" />
+ <Content Include="src\Command\CreateLocalConfigCommand.ts" />
<Content Include="src\Command\UpdateCommand.js">
<DependentUpon>UpdateCommand.ts</DependentUpon>
</Content>
+ <TypeScriptCompile Include="src\System\Uri.ts" />
+ <Content Include="src\System\Uri.js">
+ <DependentUpon>Uri.ts</DependentUpon>
+ </Content>
<Content Include="src\Wsh\WebRequest.js">
<DependentUpon>WebRequest.ts</DependentUpon>
</Content>
@@ -147,7 +151,7 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="BeforeBuild">
- <Exec Command="&quot;$(PROGRAMFILES)\Microsoft SDKs\TypeScript\0.8.1.1\tsc&quot; --out $(ProjectDir)deploy\tsd.js $(ProjectDir)src\tsd.ts" />
+ <Exec Command="&quot;$(PROGRAMFILES)\Microsoft SDKs\TypeScript\tsc&quot; --out $(ProjectDir)deploy\tsd.js $(ProjectDir)src\tsd.ts" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
Please sign in to comment.
Something went wrong with that request. Please try again.