diff --git a/README.md b/README.md index c6b75370e..c064a4184 100755 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ List of Definitions * [Firebase](https://www.firebase.com/docs/javascript/firebase) (by [Vincent Bortone](https://github.com/vbortone)) * [Firefox](https://developer.mozilla.org/en-US/docs/Web/API) (by [vvakame](https://github.com/vvakame)) * [FlexSlider](http://www.woothemes.com/flexslider/) (by [Diullei Gomes](https://github.com/Diullei)) +* [Flight by Twitter](http://flightjs.github.com/flight/) (by [Jonathan Hedrén](https://github.com/jonathanhedren)) * [Foundation](http://foundation.zurb.com/) (by [Boris Yankov](https://github.com/borisyankov)) * [FPSMeter](http://darsa.in/fpsmeter/) (by [Aaron Lampros](https://github.com/alampros)) * [FullCalendar](http://arshaw.com/fullcalendar/) (by [Neil Stalker](https://github.com/nestalk)) @@ -95,7 +96,6 @@ List of Definitions * [i18next](http://i18next.com/) (by [Maarten Docter](https://github.com/mdocter)) * [iCheck](http://damirfoy.com/iCheck/) (by [Dániel Tar](https://github.com/qcz)) * [Impress.js](https://github.com/bartaz/impress.js) (by [Boris Yankov](https://github.com/borisyankov)) -* [Intl](http://www.ecma-international.org/ecma-402/1.0/) (by [Jeffery Grajkowski](http://github.com/pushplay)) * [iScroll](http://cubiq.org/iscroll-4) (by [Boris Yankov](https://github.com/borisyankov) and [Christiaan Rakowski](https://github.com/csrakowski)) * [jake](https://github.com/mde/jake) (by [Kon](http://phyzkit.net/)) * [Jasmine](http://pivotal.github.com/jasmine/) (by [Boris Yankov](https://github.com/borisyankov)) @@ -109,9 +109,10 @@ List of Definitions * [jQuery.areYouSure](https://github.com/codedance/jquery.AreYouSure) (by [Jon Egerton](https://github.com/jonegerton)) * [jQuery.autosize](http://www.jacklmoore.com/autosize/) (by [Jack Moore](http://www.jacklmoore.com/)) * [jQuery.BBQ](http://benalman.com/projects/jquery-bbq-plugin/) (by [Adam R. Smith](https://github.com/sunetos)) -* [jQuery.contextMenu](http://medialize.github.com/jQuery-contextMenu/) (by [Natan Vivo](https://github.com/nvivo/)) +* [jQuery.CLEditor](http://premiumsoftware.net/CLEditor) (by [Jeffery Grajkowski](https://github.com/pushplay)) * [jQuery.clientSideLogging](https://github.com/remybach/jQuery.clientSideLogging/) (by [Diullei Gomes](https://github.com/diullei/)) * [jQuery.Colorbox](http://www.jacklmoore.com/colorbox/) (by [Gidon Junge](https://github.com/gjunge)) +* [jQuery.contextMenu](http://medialize.github.com/jQuery-contextMenu/) (by [Natan Vivo](https://github.com/nvivo/)) * [jQuery.Cookie](https://github.com/carhartl/jquery-cookie) (by [Roy Goode](https://github.com/RoyGoode)) * [jQuery.Cycle](http://jquery.malsup.com/cycle/) (by [François Guillot](http://fguillot.developpez.com/)) * [jQuery.dataTables](http://www.datatables.net) (by [Armin Sander](https://github.com/pragmatrix)) @@ -135,6 +136,7 @@ List of Definitions * [jQuery.Transit](http://ricostacruz.com/jquery.transit/) (by [MrBigDog2U](https://github.com/MrBigDog2U)) * [jQuery.Validation](http://bassistance.de/jquery-plugins/jquery-plugin-validation/) (by [Boris Yankov](https://github.com/borisyankov)) * [jQuery.Watermark](http://jquery-watermark.googlecode.com) (by [Anwar Javed](https://github.com/anwarjaved)) +* [jQuery.base64](https://github.com/yatt/jquery.base64) (by [Shinya Mochizuki](https://github.com/enrapt-mochizuki)) * [jScrollPane](http://jscrollpane.kelvinluck.com) (by [Dániel Tar](https://github.com/qcz)) * [JSDeferred](http://cho45.stfuawsc.com/jsdeferred/) (by [Daisuke Mino](https://github.com/minodisk)) * [JSONEditorOnline](https://github.com/josdejong/jsoneditoronline) (by [Vincent Bortone](https://github.com/vbortone/)) @@ -147,7 +149,7 @@ List of Definitions * [Knockout.ES5](https://github.com/SteveSanderson/knockout-es5) (by [Sebastián Galiano](https://github.com/sgaliano)) * [Knockout.Mapper](https://github.com/LucasLorentz/knockout.mapper) (by [Brandon Meyer](https://github.com/BMeyerKC)) * [Knockout.Mapping](https://github.com/SteveSanderson/knockout.mapping) (by [Boris Yankov](https://github.com/borisyankov)) -* [Knockout.Postbox](https://github.com/rniemeyer/knockout-postbox) (by [Judah Gabriel](https://github.com/JudahGabriel)) +* [Knockout.Postbox](https://github.com/rniemeyer/knockout-postbox) (by [Judah Gabriel Himango](https://github.com/JudahGabriel)) * [Knockout.Validation](https://github.com/ericmbarnard/Knockout-Validation) (by [Dan Ludwig](https://github.com/danludwig)) * [Knockout.Viewmodel](http://coderenaissance.github.com/knockout.viewmodel/) (by [Oisin Grehan](https://github.com/oising)) * [ko.editables](http://romanych.github.com/ko.editables/) (by [Oisin Grehan](https://github.com/oising)) @@ -158,6 +160,7 @@ List of Definitions * [Levelup](https://github.com/rvagg/node-levelup) (by [Bret Little](https://github.com/blittle)) * [linq.js](http://linqjs.codeplex.com/) (by [Marcin Najder](https://github.com/marcinnajder)) * [Livestamp.js](https://github.com/mattbradley/livestampjs) (by [Vincent Bortone](https://github.com/vbortone)) +* [Lodash](http://lodash.com/) (by [Brian Zengel](https://github.com/bczengel)) * [Logg](https://github.com/dpup/node-logg) (by [Bret Little](https://github.com/blittle)) * [Marked](https://github.com/chjj/marked) (by [William Orr](https://github.com/worr)) * [mCustomScrollbar](https://github.com/malihu/malihu-custom-scrollbar-plugin) (by [Sarah Williams] (https://github.com/flurg)) @@ -172,7 +175,9 @@ List of Definitions * [node-ffi](https://github.com/rbranson/node-ffi) (by [Paul Loyd](https://github.com/loyd)) * [node_zeromq](https://github.com/JustinTulloss/zeromq.node) (by [Dave McKeown](https://github.com/davemckeown)) * [node-sqlserver](https://github.com/WindowsAzure/node-sqlserver) (by [Boris Yankov](https://github.com/borisyankov)) +* [NProgress](https://github.com/rstacruz/nprogress) (by [Judah Gabriel Himango](https://github.com/judahgabriel)) * [Numeral.js](https://github.com/adamwdraper/Numeral-js) (by [Vincent Bortone](https://github.com/vbortone/)) +* [OpenLayers] (https://github.com/openlayers/openlayers) (by [Ilya Bolkhovsky](https://github.com/bolhovsky/)) * [Parallel.js](https://github.com/adambom/parallel.js) (by [Josh Baldwin](https://github.com/jbaldwin)) * [PDF.js](https://github.com/mozilla/pdf.js) (by [Josh Baldwin](https://github.com/jbaldwin)) * [Persona](http://www.mozilla.org/en-US/persona) (by [James Frasca](https://github.com/Nycto)) @@ -239,7 +244,6 @@ Requested Definitions * [google.visualizations](https://developers.google.com/chart/) * [Prelude.ls](http://gkz.github.com/prelude-ls/) * [MooTools](http://mootools.net/) -* [Lo-Dash](http://lodash.com/) * [java](https://github.com/nearinfinity/node-java) * [SVG.js](http://www.svgjs.com/) diff --git a/_infrastructure/tests/compile-runner.bat b/_infrastructure/tests/compile-runner.bat new file mode 100644 index 000000000..53e014841 --- /dev/null +++ b/_infrastructure/tests/compile-runner.bat @@ -0,0 +1 @@ +tsc runner.ts --out runner.js --module commonjs \ No newline at end of file diff --git a/_infrastructure/tests/runner.js b/_infrastructure/tests/runner.js index fd926bcb1..3721f7e11 100644 --- a/_infrastructure/tests/runner.js +++ b/_infrastructure/tests/runner.js @@ -552,10 +552,11 @@ else if (typeof require === "function") else return null; })(); -/// -/// var DefinitelyTyped; (function (DefinitelyTyped) { + /// + /// + /// (function (TestManager) { var path = require('path'); @@ -614,6 +615,10 @@ var DefinitelyTyped; return Typing; })(); + ///////////////////////////////// + // Given a document root + ts file pattern this class returns: + // all the TS files OR just tests OR just definition files + ///////////////////////////////// var FileHandler = (function () { function FileHandler(path, pattern) { this.path = path; @@ -659,6 +664,10 @@ var DefinitelyTyped; return FileHandler; })(); + ///////////////////////////////// + // Timer.start starts a timer + // Timer.end stops the timer and sets asString to the pretty print value + ///////////////////////////////// var Timer = (function () { function Timer() { this.time = 0; @@ -688,6 +697,9 @@ var DefinitelyTyped; return Timer; })(); + ///////////////////////////////// + // All the common things that we pring are functions of this class + ///////////////////////////////// var Print = (function () { function Print(version, typings, tsFiles) { this.version = version; @@ -707,19 +719,19 @@ var DefinitelyTyped; this.out(' \33[36m\33[1mTypeScript files :\33[0m ' + this.tsFiles + '\n'); }; - Print.prototype.printSyntaxChecking = function () { + Print.prototype.printSyntaxCheckingHeader = function () { this.out('============================ \33[34m\33[1mSyntax checking\33[0m ================================\n'); }; - Print.prototype.printTypingTests = function () { + Print.prototype.printTypingTestsHeader = function () { this.out('============================= \33[34m\33[1mTyping tests\33[0m ==================================\n'); }; - Print.prototype.printSuccess = function () { + Print.prototype.printSuccessCharacter = function () { this.out('\33[36m\33[1m.\33[0m'); }; - Print.prototype.printFailure = function () { + Print.prototype.printFailureCharacter = function () { this.out('x'); }; @@ -727,6 +739,23 @@ var DefinitelyTyped; this.out('-----------------------------------------------------------------------------\n'); }; + Print.prototype.printBoldDiv = function () { + this.out('=============================================================================\n'); + }; + + Print.prototype.printErrorsHeader = function () { + this.out('=============================================================================\n'); + this.out(' \33[34m\33[1mErrors in files\33[0m \n'); + this.out('=============================================================================\n'); + }; + + Print.prototype.printErrorsForFile = function (file) { + this.out('----------------- For file:' + file.formatName()); + this.printBreak(); + this.out(file.execResult.stderr); + this.printBreak(); + }; + Print.prototype.printfilesWithSintaxErrorMessage = function () { this.out(' \33[36m\33[1mFiles with syntax error\33[0m\n'); }; @@ -751,7 +780,7 @@ var DefinitelyTyped; this.out(' - \33[33m\33[1m' + file + '\33[0m\n'); }; - Print.prototype.breack = function () { + Print.prototype.printBreak = function () { this.out('\n'); }; @@ -781,22 +810,30 @@ var DefinitelyTyped; return Print; })(); + ///////////////////////////// + // Represents the results of a test file execution + ///////////////////////////// var File = (function () { - function File(name, hasError) { - this.name = name; - this.hasError = hasError; + function File(baseDir, filePathWithName, execResult) { + this.baseDir = baseDir; + this.filePathWithName = filePathWithName; + this.execResult = execResult; } - File.prototype.formatName = function (baseDir) { - var dirName = path.dirname(this.name.substr(baseDir.length + 1)).replace('\\', '/'); + // From '/complete/path/to/file' to 'specfolder/specfile.d.ts' + File.prototype.formatName = function () { + var dirName = path.dirname(this.filePathWithName.substr(this.baseDir.length + 1)).replace('\\', '/'); var dir = dirName.split('/')[0]; - var file = path.basename(this.name, '.ts'); - var ext = path.extname(this.name); + var file = path.basename(this.filePathWithName, '.ts'); + var ext = path.extname(this.filePathWithName); return dir + ((dirName.split('/').length > 1) ? '/-/' : '/') + '\33[36m\33[1m' + file + '\33[0m' + ext; }; return File; })(); + ///////////////////////////// + // Determine syntax errors in typings + ///////////////////////////// var SyntaxChecking = (function () { function SyntaxChecking(fileHandler, out) { this.fileHandler = fileHandler; @@ -808,7 +845,7 @@ var DefinitelyTyped; var list = []; for (var i = 0; i < this.files.length; i++) { - if (this.files[i].hasError) { + if (this.files[i].execResult.exitCode) { list.push(this.files[i]); } } @@ -820,7 +857,7 @@ var DefinitelyTyped; var list = []; for (var i = 0; i < this.files.length; i++) { - if (!this.files[i].hasError) { + if (!this.files[i].execResult.exitCode) { list.push(this.files[i]); } } @@ -845,7 +882,7 @@ var DefinitelyTyped; for (var i = 0; i < this.getFailedFiles().length; i++) { var errorFile = this.getFailedFiles()[i]; - this.out.printErrorFile(errorFile.formatName(this.fileHandler.path)); + this.out.printErrorFile(errorFile.formatName()); } } }; @@ -853,29 +890,26 @@ var DefinitelyTyped; SyntaxChecking.prototype.run = function (it, file, len, maxLen, callback) { var _this = this; if (!endsWith(file.toUpperCase(), '-TESTS.TS') && endsWith(file.toUpperCase(), '.TS') && file.indexOf('../_infrastructure') < 0) { - new Test(file).run(function (o) { - var failed = false; - - if (o.exitCode === 1) { - _this.out.printFailure(); - failed = true; + new Test(file).run(function (execResult) { + if (execResult.exitCode === 1) { + _this.out.printFailureCharacter(); len++; } else { - _this.out.printSuccess(); + _this.out.printSuccessCharacter(); len++; } - _this.files.push(new File(file, failed)); + _this.files.push(new File(_this.fileHandler.path, file, execResult)); if (len > maxLen) { len = 0; - _this.out.breack(); + _this.out.printBreak(); } if (it.hasNext()) { _this.run(it, it.next(), len, maxLen, callback); } else { - _this.out.breack(); + _this.out.printBreak(); _this.timer.end(); _this.printFailedFiles(); _this.printStats(); @@ -886,7 +920,7 @@ var DefinitelyTyped; } else if (it.hasNext()) { this.run(it, it.next(), len, maxLen, callback); } else { - this.out.breack(); + this.out.printBreak(); this.timer.end(); this.printStats(); this.printFailedFiles(); @@ -912,6 +946,9 @@ var DefinitelyTyped; return SyntaxChecking; })(); + ///////////////////////////// + // Determines errors in typing tests + ///////////////////////////// var TestEval = (function () { function TestEval(fileHandler, out) { this.fileHandler = fileHandler; @@ -923,7 +960,7 @@ var DefinitelyTyped; var list = []; for (var i = 0; i < this.files.length; i++) { - if (this.files[i].hasError) { + if (this.files[i].execResult.exitCode) { list.push(this.files[i]); } } @@ -935,7 +972,7 @@ var DefinitelyTyped; var list = []; for (var i = 0; i < this.files.length; i++) { - if (!this.files[i].hasError) { + if (!this.files[i].execResult.exitCode) { list.push(this.files[i]); } } @@ -960,7 +997,7 @@ var DefinitelyTyped; for (var i = 0; i < this.getFailedFiles().length; i++) { var errorFile = this.getFailedFiles()[i]; - this.out.printErrorFile(errorFile.formatName(this.fileHandler.path)); + this.out.printErrorFile(errorFile.formatName()); } } }; @@ -968,29 +1005,26 @@ var DefinitelyTyped; TestEval.prototype.run = function (it, file, len, maxLen, callback) { var _this = this; if (endsWith(file.toUpperCase(), '-TESTS.TS')) { - new Test(file).run(function (o) { - var failed = false; - - if (o.exitCode === 1) { - _this.out.printFailure(); - failed = true; + new Test(file).run(function (execResult) { + if (execResult.exitCode === 1) { + _this.out.printFailureCharacter(); len++; } else { - _this.out.printSuccess(); + _this.out.printSuccessCharacter(); len++; } - _this.files.push(new File(file, failed)); + _this.files.push(new File(_this.fileHandler.path, file, execResult)); if (len > maxLen) { len = 0; - _this.out.breack(); + _this.out.printBreak(); } if (it.hasNext()) { _this.run(it, it.next(), len, maxLen, callback); } else { - _this.out.breack(); + _this.out.printBreak(); _this.timer.end(); _this.printFailedFiles(); _this.printStats(); @@ -1001,7 +1035,7 @@ var DefinitelyTyped; } else if (it.hasNext()) { this.run(it, it.next(), len, maxLen, callback); } else { - this.out.breack(); + this.out.printBreak(); this.timer.end(); this.printFailedFiles(); this.printStats(); @@ -1027,6 +1061,9 @@ var DefinitelyTyped; return TestEval; })(); + ///////////////////////////////// + // The main class to kick things off + ///////////////////////////////// var TestRunner = (function () { function TestRunner(dtPath) { this.dtPath = dtPath; @@ -1065,19 +1102,41 @@ var DefinitelyTyped; return count; }; + TestRunner.prototype.printErrorsDetected = function () { + var _this = this; + this.out.printErrorsHeader(); + + var printErrorsForFileIfFound = function (file) { + if (file.execResult.exitCode) + _this.out.printErrorsForFile(file); + }; + + // sc errors: + this.sc.files.forEach(printErrorsForFileIfFound); + this.out.printBoldDiv(); + + // te errors: + this.te.files.forEach(printErrorsForFileIfFound); + this.out.printBoldDiv(); + }; + TestRunner.prototype.run = function () { var _this = this; var timer = new Timer(); timer.start(); this.out.printHeader(); - this.out.printSyntaxChecking(); + // Run syntax tests + this.out.printSyntaxCheckingHeader(); this.sc.start(function (syntaxFailedCount, syntaxTotal) { - _this.out.printTypingTests(); + // Now run typing tests + _this.out.printTypingTestsHeader(); _this.te.start(function (testFailedCount, testTotal) { - var total = _this.printTypingsWithoutTest(); + // Get the tests without any typing and simultaneously print their names + var totalTypingsWithoutTest = _this.printTypingsWithoutTest(); + // End total timer and print final messages timer.end(); _this.out.printDiv(); @@ -1087,11 +1146,12 @@ var DefinitelyTyped; _this.out.printElapsedTime(timer.asString, timer.time); _this.out.printSyntaxErrorCount(syntaxFailedCount, syntaxTotal); _this.out.printTestErrorCount(testFailedCount, testTotal); - _this.out.printWithoutTestCount(total, _this.fh.allTypings().length); + _this.out.printWithoutTestCount(totalTypingsWithoutTest, _this.fh.allTypings().length); _this.out.printDiv(); if (syntaxFailedCount > 0 || testFailedCount > 0) { + _this.printErrorsDetected(); process.exit(1); } }); diff --git a/_infrastructure/tests/runner.ts b/_infrastructure/tests/runner.ts index 68e5f36ba..68682f536 100644 --- a/_infrastructure/tests/runner.ts +++ b/_infrastructure/tests/runner.ts @@ -1,562 +1,626 @@ -/// +/// + +/// /// -module DefinitelyTyped { - - export module TestManager { - - var path = require('path'); - - function endsWith(str, suffix) { - return str.indexOf(suffix, str.length - suffix.length) !== -1; - } - - class Iterator { - index: number = -1; - - constructor(public list: any[]){} - - public next() { - this.index++; - return this.list[this.index]; - } - - public hasNext() { - return this.list[1 + this.index] != null; - } - } - - class Tsc { - public static run(tsfile: string, callback: Function) { - var command = 'node ./_infrastructure/tests/typescript/tsc.js --module commonjs '; - if (IO.fileExists(tsfile + '.tscparams')) { - command += '@' + tsfile + '.tscparams'; - } else { - command += '--noImplicitAny'; - } - Exec.exec(command, [tsfile], (ExecResult) => { - callback(ExecResult); - }); - } - } - - class Test { - constructor(public tsfile: string) {} - - public run(callback: Function) { - Tsc.run(this.tsfile , callback); - } - } - - class Typing { - public fileHandler: FileHandler; - - constructor(public name: string, baseDir: string) { - this.fileHandler = new FileHandler(baseDir + '/' + name + '/', /.\.ts/g); - } - } - - class FileHandler { - public files: string[] = []; - public typings: Typing[] = []; - - constructor(public path: string, pattern: any) { - this.files = IO.dir(path, pattern, { recursive: true }).sort(); - } - - public allTS(): string[] { - return this.files; - } - - public allTests(): string[] { - var tests = []; - - for(var i = 0; i < this.files.length; i++) { - if (endsWith(this.files[i].toUpperCase(), '-TESTS.TS')) { - tests.push(this.files[i]); - } - } - - return tests; - } - - public allTypings(): string[] { - var typings = {}; - - for(var i = 0; i < this.files.length; i++) { - var file = this.files[i]; - var firName = path.dirname(file.substr(this.path.length + 1)).replace('\\', '/'); - var dir = firName.split('/')[0]; - - if(!typings[dir]) typings[dir] = true; - } - - var list = []; - for(var attr in typings) { - list.push(attr); - } - - return list; - } - } - - class Timer { - public startTime; - public time = 0; - public asString: string; - - private static prettyDate(date1, date2): string { - var diff = ((date2 - date1) / 1000), - day_diff = Math.floor(diff / 86400); - - if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 ) - return; - - return (day_diff == 0 && ( - diff < 60 && (diff + " seconds") || - diff < 120 && "1 minute" || - diff < 3600 && Math.floor( diff / 60 ) + " minutes" || - diff < 7200 && "1 hour" || - diff < 86400 && Math.floor( diff / 3600 ) + " hours") || - day_diff == 1 && "Yesterday" || - day_diff < 7 && day_diff + " days" || - day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks"); - } - - public start() { - this.time = 0; - this.startTime = this.now(); - } - - private now() { - return Date.now(); - } - - public end() { - this.time = (this.now() - this.startTime) / 1000; - this.asString = Timer.prettyDate(this.startTime, this.now()); - } - } - - class Print { - constructor(public version: string, public typings: number, public tsFiles: number) { } - - public out(s) { - process.stdout.write(s); - } - - public printHeader() { - this.out('=============================================================================\n'); - this.out(' \33[36m\33[1mDefinitelyTyped test runner 0.3.0\33[0m\n'); - this.out('=============================================================================\n'); - this.out(' \33[36m\33[1mTypescript version:\33[0m ' + this.version + '\n'); - this.out(' \33[36m\33[1mTypings :\33[0m ' + this.typings + '\n'); - this.out(' \33[36m\33[1mTypeScript files :\33[0m ' + this.tsFiles + '\n'); - } - - public printSyntaxChecking() { - this.out('============================ \33[34m\33[1mSyntax checking\33[0m ================================\n'); - } - - public printTypingTests() { - this.out('============================= \33[34m\33[1mTyping tests\33[0m ==================================\n'); - } - - public printSuccess() { - this.out('\33[36m\33[1m.\33[0m'); - } - - public printFailure() { - this.out('x'); - } - - public printDiv() { - this.out('-----------------------------------------------------------------------------\n'); - } - - public printfilesWithSintaxErrorMessage() { - this.out(' \33[36m\33[1mFiles with syntax error\33[0m\n'); - } - - public printFailedTestMessage() { - this.out(' \33[36m\33[1mFailed tests\33[0m\n'); - } - - public printTypingsWithoutTestsMessage() { - this.out(' \33[36m\33[1mTyping without tests\33[0m\n'); - } - - public printTotalMessage() { - this.out(' \33[36m\33[1mTotal\33[0m\n'); - } - - public printErrorFile(file) { - this.out(' - ' + file + '\n'); - } - - public printTypingsWithoutTest(file) { - this.out(' - \33[33m\33[1m' + file + '\33[0m\n'); - } - - public breack() { - this.out('\n'); - } - - public printSuccessCount(current: number, total: number) { - this.out(' \33[36m\33[1mSuccessful :\33[0m \33[32m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - - public printFailedCount(current: number, total: number) { - this.out(' \33[36m\33[1mFailure :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - - public printElapsedTime(time, s) { - this.out(' \33[36m\33[1mElapsed time :\33[0m ~' + time + ' (' + s + 's)\n'); - } - - public printSyntaxErrorCount(current: number, total: number) { - this.out(' \33[36m\33[1mSyntax error :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - - public printTestErrorCount(current: number, total: number) { - this.out(' \33[36m\33[1mFailed tests :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - - public printWithoutTestCount(current: number, total: number) { - this.out(' \33[36m\33[1mWithout tests :\33[0m \33[33m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - } - - class File { - - constructor(public name: string, public hasError: boolean) {} - - public formatName(baseDir: string): string { - var dirName = path.dirname(this.name.substr(baseDir.length + 1)).replace('\\', '/'); - var dir = dirName.split('/')[0]; - var file = path.basename(this.name, '.ts'); - var ext = path.extname(this.name); - - return dir + ((dirName.split('/').length > 1) ? '/-/' : '/') + '\33[36m\33[1m' + file + '\33[0m' + ext; - } - } - - class SyntaxChecking { - - private timer: Timer; - - public files: File[] = []; - - private getFailedFiles(): File[] { - var list: File[] = []; - - for(var i = 0; i < this.files.length; i++) { - if(this.files[i].hasError) { - list.push(this.files[i]); - } - } - - return list; - } - - private getSuccessFiles(): File[] { - var list: File[] = []; - - for(var i = 0; i < this.files.length; i++) { - if(!this.files[i].hasError) { - list.push(this.files[i]); - } - } - - return list; - } - - constructor(public fileHandler: FileHandler, public out: Print) { - this.timer = new Timer(); - } - - private printStats() { - this.out.printDiv(); - this.out.printElapsedTime(this.timer.asString, this.timer.time); - this.out.printSuccessCount(this.getSuccessFiles().length, this.files.length); - this.out.printFailedCount(this.getFailedFiles().length, this.files.length); - } - - private printFailedFiles() { - if (this.getFailedFiles().length > 0) { - this.out.printDiv(); - - this.out.printfilesWithSintaxErrorMessage(); - - this.out.printDiv(); - - for(var i = 0; i < this.getFailedFiles().length; i++) { - var errorFile = this.getFailedFiles()[i]; - this.out.printErrorFile(errorFile.formatName(this.fileHandler.path)); - } - } - } - - private run(it, file, len, maxLen, callback: Function) { - if (!endsWith(file.toUpperCase(), '-TESTS.TS') && endsWith(file.toUpperCase(), '.TS') && file.indexOf('../_infrastructure') < 0) { - new Test(file).run((o) => { - var failed = false; - - if(o.exitCode === 1) { - this.out.printFailure(); - failed = true; - len++; - } else { - this.out.printSuccess(); - len++; - } - - this.files.push(new File(file, failed)); - - if(len > maxLen) { - len = 0; - this.out.breack(); - } - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.breack(); - this.timer.end(); - this.printFailedFiles(); - this.printStats(); - - callback(this.getFailedFiles().length, this.files.length); - } - }); - } else if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.breack(); - this.timer.end(); - this.printStats(); - this.printFailedFiles(); - - callback(this.getFailedFiles().length, this.files.length); - } - } - - public start(callback: Function) { - this.timer.start(); - - var tsFiles = this.fileHandler.allTS(); - - var it = new Iterator(tsFiles); - - var len = 0; - var maxLen = 76; - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } - } - } - - class TestEval { - - private timer: Timer; - - public files: File[] = []; - - private getFailedFiles(): File[] { - var list: File[] = []; - - for(var i = 0; i < this.files.length; i++) { - if(this.files[i].hasError) { - list.push(this.files[i]); - } - } - - return list; - } - - private getSuccessFiles(): File[] { - var list: File[] = []; - - for(var i = 0; i < this.files.length; i++) { - if(!this.files[i].hasError) { - list.push(this.files[i]); - } - } - - return list; - } - - constructor(public fileHandler: FileHandler, public out: Print) { - this.timer = new Timer(); - } - - private printStats() { - this.out.printDiv(); - this.out.printElapsedTime(this.timer.asString, this.timer.time); - this.out.printSuccessCount(this.getSuccessFiles().length, this.files.length); - this.out.printFailedCount(this.getFailedFiles().length, this.files.length); - } - - private printFailedFiles() { - if (this.getFailedFiles().length > 0) { - this.out.printDiv(); - - this.out.printFailedTestMessage(); - - this.out.printDiv(); - - for(var i = 0; i < this.getFailedFiles().length; i++) { - var errorFile = this.getFailedFiles()[i]; - this.out.printErrorFile(errorFile.formatName(this.fileHandler.path)); - } - } - } - - private run(it, file, len, maxLen, callback: Function) { - if (endsWith(file.toUpperCase(), '-TESTS.TS')) { - new Test(file).run((o) => { - var failed = false; - - if(o.exitCode === 1) { - this.out.printFailure(); - failed = true; - len++; - } else { - this.out.printSuccess(); - len++; - } - - this.files.push(new File(file, failed)); - - if(len > maxLen) { - len = 0; - this.out.breack(); - } - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.breack(); - this.timer.end(); - this.printFailedFiles(); - this.printStats(); - - callback(this.getFailedFiles().length, this.files.length); - } - }); - } else if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.breack(); - this.timer.end(); - this.printFailedFiles(); - this.printStats(); - - callback(this.getFailedFiles().length, this.files.length); - } - } - - public start(callback: Function) { - this.timer.start(); - - var tsFiles = this.fileHandler.allTS(); - - var it = new Iterator(tsFiles); - - var len = 0; - var maxLen = 76; - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } - } - } - - export class TestRunner { - private fh: FileHandler; - private out: Print; - private sc: SyntaxChecking; - private te: TestEval; - private typings: Typing[] = []; - - private printTypingsWithoutTest() { - var count = 0; - - if (this.typings.length > 0) { - this.out.printDiv(); - - this.out.printTypingsWithoutTestsMessage(); - - this.out.printDiv(); - - for(var i = 0; i < this.typings.length; i++) { - var typing = this.typings[i]; - if(typing.fileHandler.allTests().length == 0) { - if (typing.name != '_infrastructure' - && typing.name != '_ReSharper.DefinitelyTyped' - && typing.name != 'obj' - && typing.name != 'bin' - && typing.name != 'Properties') { - this.out.printTypingsWithoutTest(typing.name); - count++; - } - } - } - } - - return count; - } - - constructor(public dtPath: string) { - this.fh = new FileHandler(dtPath, /.\.ts/g); - this.out = new Print('0.9.1.1', this.fh.allTypings().length, this.fh.allTS().length); - this.sc = new SyntaxChecking(this.fh, this.out); - this.te = new TestEval(this.fh, this.out); - - var tpgs = this.fh.allTypings(); - for(var i = 0; i < tpgs.length; i++) { - this.typings.push(new Typing(tpgs[i], this.dtPath)); - } - } - - public run() { - var timer = new Timer(); - timer.start(); - - this.out.printHeader(); - this.out.printSyntaxChecking(); - - this.sc.start((syntaxFailedCount, syntaxTotal) => { - this.out.printTypingTests(); - this.te.start((testFailedCount, testTotal) => { - var total = this.printTypingsWithoutTest(); - - timer.end(); - - this.out.printDiv(); - this.out.printTotalMessage(); - this.out.printDiv(); - - this.out.printElapsedTime(timer.asString, timer.time); - this.out.printSyntaxErrorCount(syntaxFailedCount, syntaxTotal); - this.out.printTestErrorCount(testFailedCount, testTotal); - this.out.printWithoutTestCount(total, this.fh.allTypings().length); - - this.out.printDiv(); - - if (syntaxFailedCount > 0 || testFailedCount > 0) { - process.exit(1); - } - }); - }); - } - } - } +module DefinitelyTyped.TestManager { + + var path = require('path'); + + function endsWith(str, suffix) { + return str.indexOf(suffix, str.length - suffix.length) !== -1; + } + + class Iterator { + index: number = -1; + + constructor(public list: any[]) { } + + public next() { + this.index++; + return this.list[this.index]; + } + + public hasNext() { + return this.list[1 + this.index] != null; + } + } + + interface TscCallback { + (result: ExecResult): void; + } + + class Tsc { + public static run(tsfile: string, callback: TscCallback) { + var command = 'node ./_infrastructure/tests/typescript/tsc.js --module commonjs '; + if (IO.fileExists(tsfile + '.tscparams')) { + command += '@' + tsfile + '.tscparams'; + } else { + command += '--noImplicitAny'; + } + Exec.exec(command, [tsfile], (ExecResult) => { + callback(ExecResult); + }); + } + } + + class Test { + constructor(public tsfile: string) { } + + public run(callback: TscCallback) { + Tsc.run(this.tsfile, callback); + } + } + + class Typing { + public fileHandler: FileHandler; + + constructor(public name: string, baseDir: string) { + this.fileHandler = new FileHandler(baseDir + '/' + name + '/', /.\.ts/g); + } + } + + ///////////////////////////////// + // Given a document root + ts file pattern this class returns: + // all the TS files OR just tests OR just definition files + ///////////////////////////////// + class FileHandler { + public files: string[] = []; + public typings: Typing[] = []; + + constructor(public path: string, pattern: any) { + this.files = IO.dir(path, pattern, { recursive: true }).sort(); + } + + public allTS(): string[] { + return this.files; + } + + public allTests(): string[] { + var tests = []; + + for (var i = 0; i < this.files.length; i++) { + if (endsWith(this.files[i].toUpperCase(), '-TESTS.TS')) { + tests.push(this.files[i]); + } + } + + return tests; + } + + public allTypings(): string[] { + var typings = {}; + + for (var i = 0; i < this.files.length; i++) { + var file = this.files[i]; + var firName = path.dirname(file.substr(this.path.length + 1)).replace('\\', '/'); + var dir = firName.split('/')[0]; + + if (!typings[dir]) typings[dir] = true; + } + + var list = []; + for (var attr in typings) { + list.push(attr); + } + + return list; + } + } + + ///////////////////////////////// + // Timer.start starts a timer + // Timer.end stops the timer and sets asString to the pretty print value + ///////////////////////////////// + class Timer { + public startTime; + public time = 0; + public asString: string; + + private static prettyDate(date1, date2): string { + var diff = ((date2 - date1) / 1000), + day_diff = Math.floor(diff / 86400); + + if (isNaN(day_diff) || day_diff < 0 || day_diff >= 31) + return; + + return (day_diff == 0 && ( + diff < 60 && (diff + " seconds") || + diff < 120 && "1 minute" || + diff < 3600 && Math.floor(diff / 60) + " minutes" || + diff < 7200 && "1 hour" || + diff < 86400 && Math.floor(diff / 3600) + " hours") || + day_diff == 1 && "Yesterday" || + day_diff < 7 && day_diff + " days" || + day_diff < 31 && Math.ceil(day_diff / 7) + " weeks"); + } + + public start() { + this.time = 0; + this.startTime = this.now(); + } + + private now() { + return Date.now(); + } + + public end() { + this.time = (this.now() - this.startTime) / 1000; + this.asString = Timer.prettyDate(this.startTime, this.now()); + } + } + + ///////////////////////////////// + // All the common things that we pring are functions of this class + ///////////////////////////////// + class Print { + constructor(public version: string, public typings: number, public tsFiles: number) { } + + public out(s) { + process.stdout.write(s); + } + + public printHeader() { + this.out('=============================================================================\n'); + this.out(' \33[36m\33[1mDefinitelyTyped test runner 0.3.0\33[0m\n'); + this.out('=============================================================================\n'); + this.out(' \33[36m\33[1mTypescript version:\33[0m ' + this.version + '\n'); + this.out(' \33[36m\33[1mTypings :\33[0m ' + this.typings + '\n'); + this.out(' \33[36m\33[1mTypeScript files :\33[0m ' + this.tsFiles + '\n'); + } + + public printSyntaxCheckingHeader() { + this.out('============================ \33[34m\33[1mSyntax checking\33[0m ================================\n'); + } + + public printTypingTestsHeader() { + this.out('============================= \33[34m\33[1mTyping tests\33[0m ==================================\n'); + } + + public printSuccessCharacter() { + this.out('\33[36m\33[1m.\33[0m'); + } + + public printFailureCharacter() { + this.out('x'); + } + + public printDiv() { + this.out('-----------------------------------------------------------------------------\n'); + } + + public printBoldDiv() { + this.out('=============================================================================\n'); + } + + public printErrorsHeader() { + this.out('=============================================================================\n'); + this.out(' \33[34m\33[1mErrors in files\33[0m \n'); + this.out('=============================================================================\n'); + } + + public printErrorsForFile(file: File) { + this.out('----------------- For file:' + file.formatName() ); + this.printBreak(); + this.out(file.execResult.stderr); + this.printBreak(); + } + + public printfilesWithSintaxErrorMessage() { + this.out(' \33[36m\33[1mFiles with syntax error\33[0m\n'); + } + + public printFailedTestMessage() { + this.out(' \33[36m\33[1mFailed tests\33[0m\n'); + } + + public printTypingsWithoutTestsMessage() { + this.out(' \33[36m\33[1mTyping without tests\33[0m\n'); + } + + public printTotalMessage() { + this.out(' \33[36m\33[1mTotal\33[0m\n'); + } + + public printErrorFile(file: string) { + this.out(' - ' + file + '\n'); + } + + public printTypingsWithoutTest(file) { + this.out(' - \33[33m\33[1m' + file + '\33[0m\n'); + } + + public printBreak() { + this.out('\n'); + } + + public printSuccessCount(current: number, total: number) { + this.out(' \33[36m\33[1mSuccessful :\33[0m \33[32m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); + } + + public printFailedCount(current: number, total: number) { + this.out(' \33[36m\33[1mFailure :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); + } + + public printElapsedTime(time, s) { + this.out(' \33[36m\33[1mElapsed time :\33[0m ~' + time + ' (' + s + 's)\n'); + } + + public printSyntaxErrorCount(current: number, total: number) { + this.out(' \33[36m\33[1mSyntax error :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); + } + + public printTestErrorCount(current: number, total: number) { + this.out(' \33[36m\33[1mFailed tests :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); + } + + public printWithoutTestCount(current: number, total: number) { + this.out(' \33[36m\33[1mWithout tests :\33[0m \33[33m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); + } + } + + ///////////////////////////// + // Represents the results of a test file execution + ///////////////////////////// + class File { + static baseDir: string; + + constructor(public baseDir: string, public filePathWithName: string, public execResult: ExecResult) { } + + // From '/complete/path/to/file' to 'specfolder/specfile.d.ts' + public formatName(): string { + var dirName = path.dirname(this.filePathWithName.substr(this.baseDir.length + 1)).replace('\\', '/'); + var dir = dirName.split('/')[0]; + var file = path.basename(this.filePathWithName, '.ts'); + var ext = path.extname(this.filePathWithName); + + return dir + ((dirName.split('/').length > 1) ? '/-/' : '/') + '\33[36m\33[1m' + file + '\33[0m' + ext; + } + } + + + ///////////////////////////// + // Determine syntax errors in typings + ///////////////////////////// + class SyntaxChecking { + + private timer: Timer; + + public files: File[] = []; + + private getFailedFiles(): File[] { + var list: File[] = []; + + for (var i = 0; i < this.files.length; i++) { + if (this.files[i].execResult.exitCode) { + list.push(this.files[i]); + } + } + + return list; + } + + private getSuccessFiles(): File[] { + var list: File[] = []; + + for (var i = 0; i < this.files.length; i++) { + if (!this.files[i].execResult.exitCode) { + list.push(this.files[i]); + } + } + + return list; + } + + constructor(public fileHandler: FileHandler, public out: Print) { + this.timer = new Timer(); + } + + private printStats() { + this.out.printDiv(); + this.out.printElapsedTime(this.timer.asString, this.timer.time); + this.out.printSuccessCount(this.getSuccessFiles().length, this.files.length); + this.out.printFailedCount(this.getFailedFiles().length, this.files.length); + } + + private printFailedFiles() { + if (this.getFailedFiles().length > 0) { + this.out.printDiv(); + + this.out.printfilesWithSintaxErrorMessage(); + + this.out.printDiv(); + + for (var i = 0; i < this.getFailedFiles().length; i++) { + var errorFile = this.getFailedFiles()[i]; + this.out.printErrorFile(errorFile.formatName()); + } + } + } + + private run(it, file, len, maxLen, callback: Function) { + if (!endsWith(file.toUpperCase(), '-TESTS.TS') && endsWith(file.toUpperCase(), '.TS') && file.indexOf('../_infrastructure') < 0) { + new Test(file).run((execResult) => { + + if (execResult.exitCode === 1) { + this.out.printFailureCharacter(); + len++; + } else { + this.out.printSuccessCharacter(); + len++; + } + + this.files.push(new File(this.fileHandler.path, file, execResult)); + + if (len > maxLen) { + len = 0; + this.out.printBreak(); + } + + if (it.hasNext()) { + this.run(it, it.next(), len, maxLen, callback); + } else { + this.out.printBreak(); + this.timer.end(); + this.printFailedFiles(); + this.printStats(); + + callback(this.getFailedFiles().length, this.files.length); + } + }); + } else if (it.hasNext()) { + this.run(it, it.next(), len, maxLen, callback); + } else { + this.out.printBreak(); + this.timer.end(); + this.printStats(); + this.printFailedFiles(); + + callback(this.getFailedFiles().length, this.files.length); + } + } + + public start(callback: Function) { + this.timer.start(); + + var tsFiles = this.fileHandler.allTS(); + + var it = new Iterator(tsFiles); + + var len = 0; + var maxLen = 76; + + if (it.hasNext()) { + this.run(it, it.next(), len, maxLen, callback); + } + } + } + + ///////////////////////////// + // Determines errors in typing tests + ///////////////////////////// + class TestEval { + + private timer: Timer; + + public files: File[] = []; + + private getFailedFiles(): File[] { + var list: File[] = []; + + for (var i = 0; i < this.files.length; i++) { + if (this.files[i].execResult.exitCode) { + list.push(this.files[i]); + } + } + + return list; + } + + private getSuccessFiles(): File[] { + var list: File[] = []; + + for (var i = 0; i < this.files.length; i++) { + if (!this.files[i].execResult.exitCode) { + list.push(this.files[i]); + } + } + + return list; + } + + constructor(public fileHandler: FileHandler, public out: Print) { + this.timer = new Timer(); + } + + private printStats() { + this.out.printDiv(); + this.out.printElapsedTime(this.timer.asString, this.timer.time); + this.out.printSuccessCount(this.getSuccessFiles().length, this.files.length); + this.out.printFailedCount(this.getFailedFiles().length, this.files.length); + } + + private printFailedFiles() { + if (this.getFailedFiles().length > 0) { + this.out.printDiv(); + + this.out.printFailedTestMessage(); + + this.out.printDiv(); + + for (var i = 0; i < this.getFailedFiles().length; i++) { + var errorFile = this.getFailedFiles()[i]; + this.out.printErrorFile(errorFile.formatName()); + } + } + } + + private run(it, file, len, maxLen, callback: Function) { + if (endsWith(file.toUpperCase(), '-TESTS.TS')) { + new Test(file).run((execResult) => { + + if (execResult.exitCode === 1) { + this.out.printFailureCharacter(); + len++; + } else { + this.out.printSuccessCharacter(); + len++; + } + + this.files.push(new File(this.fileHandler.path, file, execResult)); + + if (len > maxLen) { + len = 0; + this.out.printBreak(); + } + + if (it.hasNext()) { + this.run(it, it.next(), len, maxLen, callback); + } else { + this.out.printBreak(); + this.timer.end(); + this.printFailedFiles(); + this.printStats(); + + callback(this.getFailedFiles().length, this.files.length); + } + }); + } else if (it.hasNext()) { + this.run(it, it.next(), len, maxLen, callback); + } else { + this.out.printBreak(); + this.timer.end(); + this.printFailedFiles(); + this.printStats(); + + callback(this.getFailedFiles().length, this.files.length); + } + } + + public start(callback: Function) { + this.timer.start(); + + var tsFiles = this.fileHandler.allTS(); + + var it = new Iterator(tsFiles); + + var len = 0; + var maxLen = 76; + + if (it.hasNext()) { + this.run(it, it.next(), len, maxLen, callback); + } + } + } + + ///////////////////////////////// + // The main class to kick things off + ///////////////////////////////// + export class TestRunner { + private fh: FileHandler; + private out: Print; + private sc: SyntaxChecking; + private te: TestEval; + private typings: Typing[] = []; + + private printTypingsWithoutTest() { + var count = 0; + + if (this.typings.length > 0) { + this.out.printDiv(); + + this.out.printTypingsWithoutTestsMessage(); + + this.out.printDiv(); + + for (var i = 0; i < this.typings.length; i++) { + var typing = this.typings[i]; + if (typing.fileHandler.allTests().length == 0) { + if (typing.name != '_infrastructure' + && typing.name != '_ReSharper.DefinitelyTyped' + && typing.name != 'obj' + && typing.name != 'bin' + && typing.name != 'Properties') { + this.out.printTypingsWithoutTest(typing.name); + count++; + } + } + } + } + + return count; + } + + private printErrorsDetected() { + this.out.printErrorsHeader(); + + var printErrorsForFileIfFound = (file: File) => { + if (file.execResult.exitCode) + this.out.printErrorsForFile(file); + }; + + // sc errors: + this.sc.files.forEach(printErrorsForFileIfFound); + this.out.printBoldDiv(); + + // te errors: + this.te.files.forEach(printErrorsForFileIfFound); + this.out.printBoldDiv(); + } + + constructor(public dtPath: string) { + this.fh = new FileHandler(dtPath, /.\.ts/g); + this.out = new Print('0.9.1.1', this.fh.allTypings().length, this.fh.allTS().length); + this.sc = new SyntaxChecking(this.fh, this.out); + this.te = new TestEval(this.fh, this.out); + + var tpgs = this.fh.allTypings(); + for (var i = 0; i < tpgs.length; i++) { + this.typings.push(new Typing(tpgs[i], this.dtPath)); + } + } + + public run() { + var timer = new Timer(); + timer.start(); + + this.out.printHeader(); + + // Run syntax tests + this.out.printSyntaxCheckingHeader(); + this.sc.start((syntaxFailedCount, syntaxTotal) => { + + // Now run typing tests + this.out.printTypingTestsHeader(); + this.te.start((testFailedCount, testTotal) => { + + // Get the tests without any typing and simultaneously print their names + var totalTypingsWithoutTest = this.printTypingsWithoutTest(); + + // End total timer and print final messages + timer.end(); + + this.out.printDiv(); + this.out.printTotalMessage(); + this.out.printDiv(); + + this.out.printElapsedTime(timer.asString, timer.time); + this.out.printSyntaxErrorCount(syntaxFailedCount, syntaxTotal); + this.out.printTestErrorCount(testFailedCount, testTotal); + this.out.printWithoutTestCount(totalTypingsWithoutTest, this.fh.allTypings().length); + + this.out.printDiv(); + + if (syntaxFailedCount > 0 || testFailedCount > 0) { + this.printErrorsDetected(); + process.exit(1); + } + }); + }); + } + } } -declare var __dirname: any; - var dtPath = __dirname + '/../..'; var runner = new DefinitelyTyped.TestManager.TestRunner(dtPath); diff --git a/_infrastructure/tests/src/io.ts b/_infrastructure/tests/src/io.ts index 6fce75489..2c7a81f4f 100644 --- a/_infrastructure/tests/src/io.ts +++ b/_infrastructure/tests/src/io.ts @@ -83,22 +83,12 @@ declare class Enumerator { public item(): any; constructor (o: any); } -declare function setTimeout(callback: () =>void , ms?: number); -//declare var require: any; -declare module process { - export var argv: string[]; - export var platform: string; - export function on(event: string, handler: (any) => void ): void; - export module stdout { - export function write(str: string); + +// Missing in node definitions, but called in code below. +interface NodeProcess { + mainModule: { + filename: string; } - export module stderr { - export function write(str: string); - } - export module mainModule { - export var filename: string; - } - export function exit(exitCode?: number); } var IO = (function() { diff --git a/angularjs/angular.d.ts b/angularjs/angular.d.ts index 08f22481a..921cbafc9 100755 --- a/angularjs/angular.d.ts +++ b/angularjs/angular.d.ts @@ -94,7 +94,7 @@ declare module ng { controller(name: string, controllerConstructor: Function): IModule; controller(name: string, inlineAnnotadedConstructor: any[]): IModule; controller(object : Object): IModule; - directive(name: string, directiveFactory: (...params:any[])=> IDirective): IModule; + directive(name: string, directiveFactory: Function): IModule; directive(name: string, inlineAnnotadedFunction: any[]): IModule; directive(object: Object): IModule; factory(name: string, serviceFactoryFunction: Function): IModule; @@ -215,8 +215,8 @@ declare module ng { $emit(name: string, ...args: any[]): IAngularEvent; // Documentation says exp is optional, but actual implementaton counts on it - $eval(expression: string): any; - $eval(expression: (scope: IScope) => any): any; + $eval(expression: string, args?: Object): any; + $eval(expression: (scope: IScope) => any, args?: Object): any; // Documentation says exp is optional, but actual implementaton counts on it $evalAsync(expression: string): void; @@ -276,6 +276,15 @@ declare module ng { cancel(promise: IPromise): boolean; } + /////////////////////////////////////////////////////////////////////////// + // IntervalService + // see http://docs.angularjs.org/api/ng.$interval + /////////////////////////////////////////////////////////////////////////// + interface IIntervalService { + (func: Function, delay: number, count?: number, invokeApply?: boolean): IPromise; + cancel(promise: IPromise): boolean; + } + /////////////////////////////////////////////////////////////////////////// // FilterService // see http://docs.angularjs.org/api/ng.$filter @@ -640,6 +649,59 @@ declare module ng { /////////////////////////////////////////////////////////////////////////// interface IRootScopeService extends IScope {} + /////////////////////////////////////////////////////////////////////////// + // SCEService + // see http://docs.angularjs.org/api/ng.$sce + /////////////////////////////////////////////////////////////////////////// + interface ISCEService { + getTrusted(type: string, mayBeTrusted: any): any; + getTrustedCss(value: any): any; + getTrustedHtml(value: any): any; + getTrustedJs(value: any): any; + getTrustedResourceUrl(value: any): any; + getTrustedUrl(value: any): any; + parse(type: string, expression: string): (context: any, locals: any) => any; + parseAsCss(expression: string): (context: any, locals: any) => any; + parseAsHtml(expression: string): (context: any, locals: any) => any; + parseAsJs(expression: string): (context: any, locals: any) => any; + parseAsResourceUrl(expression: string): (context: any, locals: any) => any; + parseAsUrl(expression: string): (context: any, locals: any) => any; + trustAs(type: string, value: any): any; + trustAsHtml(value: any): any; + trustAsJs(value: any): any; + trustAsResourceUrl(value: any): any; + trustAsUrl(value: any): any; + isEnabled(): boolean; + } + + /////////////////////////////////////////////////////////////////////////// + // SCEProvider + // see http://docs.angularjs.org/api/ng.$sceProvider + /////////////////////////////////////////////////////////////////////////// + interface ISCEProvider extends IServiceProvider { + enabled(value: boolean): void; + } + + /////////////////////////////////////////////////////////////////////////// + // SCEDelegateService + // see http://docs.angularjs.org/api/ng.$sceDelegate + /////////////////////////////////////////////////////////////////////////// + interface ISCEDelegateService { + getTrusted(type: string, mayBeTrusted: any): any; + trustAs(type: string, value: any): any; + valueOf(value: any): any; + } + + + /////////////////////////////////////////////////////////////////////////// + // SCEDelegateProvider + // see http://docs.angularjs.org/api/ng.$sceDelegateProvider + /////////////////////////////////////////////////////////////////////////// + interface ISCEDelegateProvider extends IServiceProvider { + resourceUrlBlacklist(blacklist: any[]): void; + resourceUrlWhitelist(whitelist: any[]): void; + } + /////////////////////////////////////////////////////////////////////////// // Directive // see http://docs.angularjs.org/api/ng.$compileProvider#directive diff --git a/casperjs/casperjs.d.ts b/casperjs/casperjs.d.ts index 4be7b40c4..de43c548b 100644 --- a/casperjs/casperjs.d.ts +++ b/casperjs/casperjs.d.ts @@ -5,39 +5,50 @@ /// -interface Casper { +interface CasperModule { + create(options: CasperOptions): Casper; + selectXPath(expression: string): Object +} - constructor (options: CasperOptions); +interface EventEmitter { + removeAllFilters(filter: string): Casper; + setFilter(filter: string, cb: Function): boolean; +} + +interface Casper extends EventEmitter { + test: Tester; + + constructor (options: CasperOptions): Casper; // Properties __utils__: ClientUtils; // Methods - back(); - base64encode(url: string, method?: string, data?: any); - click(selector: string); - clickLabel(label: string, tag?: string); - capture(targetFilePath: string, clipRect: ClipRect); - captureBase64(format: string); - captureBase64(format: string, area: string); - captureBase64(format: string, area: ClipRect); - captureBase64(format: string, area: any); - captureSelector(targetFile: string, selector: string); - clear(); - debugHTML(selector?: string, outer?: boolean); - debugPage(); - die(message: string, status?: number); - download(url: string, target?: string, method?: string, data?: any); - each(array: Array, fn: (self, link) => void); - echo(message: string, style?: string); - evaluate(fn: Function, ...args: any[]); - evaluateOrDie(fn: Function, message?: string); - exit(status?: number); - exists(selector: string); - fetchText(selector: string); - forward(); - log(message: string, level?: string, space?: string); - fill(selector: string, values: any, submit?: boolean); + back(): Casper; + base64encode(url: string, method?: string, data?: any): string; + click(selector: string): boolean; + clickLabel(label: string, tag?: string): boolean; + capture(targetFilePath: string, clipRect: ClipRect): Casper; + captureBase64(format: string): string; + captureBase64(format: string, area: string): string; + captureBase64(format: string, area: ClipRect): string; + captureBase64(format: string, area: any): string; + captureSelector(targetFile: string, selector: string): Casper; + clear(): Casper; + debugHTML(selector?: string, outer?: boolean): Casper; + debugPage(): Casper; + die(message: string, status?: number): Casper; + download(url: string, target?: string, method?: string, data?: any): Casper; + each(array: T[], fn: (self: Casper, item: T, index: number) => void): Casper; + echo(message: string, style?: string): Casper; + evaluate(fn: () => T, ...args: any[]): T + evaluateOrDie(fn: () => any, message?: string, status?: number): Casper; + exit(status?: number): Casper; + exists(selector: string): boolean; + fetchText(selector: string): string; + forward(): Casper; + log(message: string, level?: string, space?: string): Casper; + fill(selector: string, values: any, submit?: boolean): void; getCurrentUrl(): string; getElementAttribute(selector: string, attribute: string): string; getElementBounds(selector: string): ElementBounds; @@ -48,44 +59,44 @@ interface Casper { getHTML(selector?: string, outer?: boolean): string; getPageContent(): string; getTitle(): string; - mouseEvent(type: string, selector: string); + mouseEvent(type: string, selector: string): boolean; open(location: string, settings: OpenSettings): Casper; - reload(then?: (response: HttpResponse) => void); - repeat(times: number, then: Function); - resourceExists(test: Function); - resourceExists(test: string); - run(onComplete: Function, time?: number); - sendKeys(selector: string, keys: string, options?: any); - setHttpAuth(username: string, password: string); + reload(then?: (response: HttpResponse) => void): Casper; + repeat(times: number, then: Function): Casper; + resourceExists(test: Function): boolean; + resourceExists(test: string): boolean; + run(onComplete: Function, time?: number): Casper; + sendKeys(selector: string, keys: string, options?: any): Casper; + setHttpAuth(username: string, password: string): Casper; start(url?: string, then?: (response: HttpResponse) => void): Casper; status(asString: boolean): any; - then(fn: (self?: Casper) => void); - thenClick(selector: string); - thenEvaluate(fn: Function, ...args: any[]); - thenOpen(location: string, then?: (response: HttpResponse) => void); - thenOpen(location: string, options?: OpenSettings, then?: (response: HttpResponse) => void); - thenOpenAndEvaluate(location: string, then?: Function, ...args: any[]); - toString(); - userAgent(agent: string); - viewport(width: number, height: number); - visible(selector: string); - wait(timeout: number, then?: Function); - waitFor(testFx: Function, then?: Function, onTimeout?: Function, timeout?: number); - waitForPopup(urlPattern: string, then?: Function, onTimeout?: Function, timeout?: number); - waitForPopup(urlPattern: RegExp, then?: Function, onTimeout?: Function, timeout?: number); - waitForSelector(selector: string, then?: Function, onTimeout?: Function, timeout?: number); - waitWhileSelector(selector: string, then?: Function, onTimeout?: Function, timeout?: number); - waitForResource(testFx: Function, then?: Function, onTimeout?: Function, timeout?: number); - waitForText(pattern: string, then?: Function, onTimeout?: Function, timeout?: number); - waitForText(pattern: RegExp, then?: Function, onTimeout?: Function, timeout?: number); - waitUntilVisible(selector: string, then?: Function, onTimeout?: Function, timeout?: number); - waitWhileVisible(selector: string, then?: Function, onTimeout?: Function, timeout?: number); - warn(message: string); - withFrame(frameInfo: string, then: Function); - withFrame(frameInfo: number, then: Function); - withPopup(popupInfo: string, step: Function); - withPopup(popupInfo: RegExp, step: Function); - zoom(factor: number); + then(fn: (self?: Casper) => void): Casper; + thenClick(selector: string): Casper; + thenEvaluate(fn: () => any, ...args: any[]): Casper; + thenOpen(location: string, then?: (response: HttpResponse) => void): Casper; + thenOpen(location: string, options?: OpenSettings, then?: (response: HttpResponse) => void): Casper; + thenOpenAndEvaluate(location: string, then?: Function, ...args: any[]): Casper; + toString(): string; + userAgent(agent: string): string; + viewport(width: number, height: number): Casper; + visible(selector: string): boolean; + wait(timeout: number, then?: Function): Casper; + waitFor(testFx: Function, then?: Function, onTimeout?: Function, timeout?: number): Casper; + waitForPopup(urlPattern: string, then?: Function, onTimeout?: Function, timeout?: number): Casper; + waitForPopup(urlPattern: RegExp, then?: Function, onTimeout?: Function, timeout?: number): Casper; + waitForSelector(selector: string, then?: Function, onTimeout?: Function, timeout?: number): Casper; + waitWhileSelector(selector: string, then?: Function, onTimeout?: Function, timeout?: number): Casper; + waitForResource(testFx: Function, then?: Function, onTimeout?: Function, timeout?: number): Casper; + waitForText(pattern: string, then?: Function, onTimeout?: Function, timeout?: number): Casper; + waitForText(pattern: RegExp, then?: Function, onTimeout?: Function, timeout?: number): Casper; + waitUntilVisible(selector: string, then?: Function, onTimeout?: Function, timeout?: number): Casper; + waitWhileVisible(selector: string, then?: Function, onTimeout?: Function, timeout?: number): Casper; + warn(message: string): Casper; + withFrame(frameInfo: string, then: Function): Casper; + withFrame(frameInfo: number, then: Function): Casper; + withPopup(popupInfo: string, step: Function): Casper; + withPopup(popupInfo: RegExp, step: Function): Casper; + zoom(factor: number): Casper; } interface HttpResponse { @@ -127,96 +138,105 @@ interface ElementInfo { } interface CasperOptions { - clientScripts: Array; - exitOnError: boolean; - httpStatusHandlers: any; - logLevel: string; - onAlert: Function; - onDie: Function; - onError: Function; - onLoadError: Function; - onPageInitialized: Function; - onResourceReceived: Function; - onResourceRequested: Function; - onStepComplete: Function; - onStepTimeout: Function; - onTimeout: Function; - onWaitTimeout: Function; - page: WebPage; - pageSettings: any; - remoteScripts: Array; - safeLogs: boolean; - stepTimeout: number; - timeout: number; - verbose: boolean; - viewportSize: any; - waitTimeout: number; + clientScripts?: Array; + exitOnError?: boolean; + httpStatusHandlers?: any; + logLevel?: string; + onAlert?: Function; + onDie?: Function; + onError?: Function; + onLoadError?: Function; + onPageInitialized?: Function; + onResourceReceived?: Function; + onResourceRequested?: Function; + onStepComplete?: Function; + onStepTimeout?: Function; + onTimeout?: Function; + onWaitTimeout?: Function; + page?: WebPage; + pageSettings?: any; + remoteScripts?: Array; + safeLogs?: boolean; + stepTimeout?: number; + timeout?: number; + verbose?: boolean; + viewportSize?: any; + waitTimeout?: number; } interface ClientUtils { - echo(message: string); - encode(contents: string); - exists(selector: string); - findAll(selector: string); - findOne(selector: string); - getBase64(url: string, method?: string, data?: any); - getBinary(url: string, method?: string, data?: any); - getDocumentHeight(); - getElementBounds(selector: string); - getElementsBounds(selector: string); - getElementByXPath(expression: string, scope?: HTMLElement); - getElementsByXPath(expression: string, scope?: HTMLElement); - getFieldValue(inputName: string); - getFormValues(selector: string); - mouseEvent(type: string, selector: string); - removeElementsByXPath(expression: string); - sendAJAX(url: string, method?: string, data?: any, async?: boolean); - visible(selector: string); + echo(message: string): void; + encode(contents: string): void; + exists(selector: string): void; + findAll(selector: string): void; + findOne(selector: string): void; + getBase64(url: string, method?: string, data?: any): void; + getBinary(url: string, method?: string, data?: any): void; + getDocumentHeight(): void; + getElementBounds(selector: string): void; + getElementsBounds(selector: string): void; + getElementByXPath(expression: string, scope?: HTMLElement): void; + getElementsByXPath(expression: string, scope?: HTMLElement): void; + getFieldValue(inputName: string): void; + getFormValues(selector: string): void; + mouseEvent(type: string, selector: string): void; + removeElementsByXPath(expression: string): void; + sendAJAX(url: string, method?: string, data?: any, async?: boolean): void; + visible(selector: string): void; } interface Colorizer { - colorize(text: string, styleName: string); - format(text: string, style: any); + colorize(text: string, styleName: string): void; + format(text: string, style: any): void; } interface Tester { - assert(condition: boolean, message?: string); - assertDoesntExist(selector: string, message?: string); - assertEquals(testValue: any, expected: any, message?: string); - assertEval(fn: Function, message: string, arguments: any); - assertEvalEquals(fn: Function, expected: any, message?: string, arguments?: any); - assertExists(selector: string, message?: string); - assertFalsy(subject: any, message?: string); - assertField(inputName: string, expected: string, message?: string); - assertHttpStatus(status: number, message?: string); - assertMatch(subject: any, pattern: RegExp, message?: string); - assertNot(subject: any, message?: string); - assertNotEquals(testValue: any, expected: any, message?: string); - assertNotVisible(selector: string, message?: string); - assertRaises(fn: Function, args: Array, message?: string); - assertSelectorDoesntHaveText(selector: string, text: string, message?: string); - assertSelectorExists(selector: string, message?: string); - assertSelectorHasText(selector: string, text: string, message?: string); - assertResourceExists(testFx: Function, message?: string); - assertTextExists(expected: string, message?: string); - assertTextDoesntExist(unexpected: string, message: string); - assertTitle(expected: string, message?: string); - assertTitleMatch(pattern: RegExp, message?: string); - assertTruthy(subject: any, message?: string); - assertType(input: any, type: string, message?: string); - assertUrlMatch(pattern: RegExp, message?: string); - assertVisible(selector: string, message?: string); - colorize(message: string, style: string); - comment(message: string); - done(expected?: number); - error(message: string); - fail(message: string); - formatMessage(message: string, style: string); + assert(condition: boolean, message?: string): any; + assertDoesntExist(selector: string, message?: string): any; + assertElementCount(selctor: string, expected: number, message?: string): any; + assertEquals(testValue: any, expected: any, message?: string): any; + assertEval(fn: Function, message: string, arguments: any): any; + assertEvalEquals(fn: Function, expected: any, message?: string, arguments?: any): any; + assertExists(selector: string, message?: string): any; + assertFalsy(subject: any, message?: string): any; + assertField(inputName: string, expected: string, message?: string): any; + assertHttpStatus(status: number, message?: string): any; + assertMatch(subject: any, pattern: RegExp, message?: string): any; + assertNot(subject: any, message?: string): any; + assertNotEquals(testValue: any, expected: any, message?: string): any; + assertNotVisible(selector: string, message?: string): any; + assertRaises(fn: Function, args: Array, message?: string): any; + assertSelectorDoesntHaveText(selector: string, text: string, message?: string): any; + assertSelectorExists(selector: string, message?: string): any; + assertSelectorHasText(selector: string, text: string, message?: string): any; + assertResourceExists(testFx: Function, message?: string): any; + assertTextExists(expected: string, message?: string): any; + assertTextDoesntExist(unexpected: string, message: string): any; + assertTitle(expected: string, message?: string): any; + assertTitleMatch(pattern: RegExp, message?: string): any; + assertTruthy(subject: any, message?: string): any; + assertType(input: any, type: string, message?: string): any; + assertUrlMatch(pattern: string, message?: string): any; + assertUrlMatch(pattern: RegExp, message?: string): any; + assertVisible(selector: string, message?: string): any; + + /* since 1.1 */ + begin(description: string, planned: number, suite: Function): any; + begin(description: string, suite: Function): any; + begin(description: string, planned: number, config: Object): any; + begin(description: string, config: Object): any; + + colorize(message: string, style: string): any; + comment(message: string): any; + done(expected?: number): any; + error(message: string): any; + fail(message: string): any; + formatMessage(message: string, style: string): any; getFailures(): Cases; getPasses(): Cases; - info(message: string); - pass(message: string); - renderResults(exit: boolean, status: number, save: string); + info(message: string): any; + pass(message: string): any; + renderResults(exit: boolean, status: number, save: string): any; } interface Cases { @@ -238,30 +258,30 @@ interface CaseValues { } interface Utils { - betterTypeOf(input: any); - dump(value: any); - fileExt(file: string); - fillBlanks(text: string, pad: number); - format(f: string, ...args: any[]); - getPropertyPath(obj: any, path: string); - inherits(ctor: any, superCtor: any); - isArray(value: any); - isCasperObject(value: any); - isClipRect(value: any); - isFalsy(subject: any); - isFunction(value: any); - isJsFile(file: string); - isNull(value: any); - isNumber(value: any); - isObject(value: any); - isRegExp(value: any); - isString(value: any); - isTruthy(subject: any); - isType(what: any, type: string); - isUndefined(value: any); - isWebPage(what: any); - mergeObjects(origin: any, add: any); - node(name: string, attributes: any); - serialize(value: any); - unique(array: Array); + betterTypeOf(input: any): any; + dump(value: any): any; + fileExt(file: string): any; + fillBlanks(text: string, pad: number): any; + format(f: string, ...args: any[]): any; + getPropertyPath(obj: any, path: string): any; + inherits(ctor: any, superCtor: any): any; + isArray(value: any): any; + isCasperObject(value: any): any; + isClipRect(value: any): any; + isFalsy(subject: any): any; + isFunction(value: any): any; + isJsFile(file: string): any; + isNull(value: any): any; + isNumber(value: any): any; + isObject(value: any): any; + isRegExp(value: any): any; + isString(value: any): any; + isTruthy(subject: any): any; + isType(what: any, type: string): any; + isUndefined(value: any): any; + isWebPage(what: any): any; + mergeObjects(origin: any, add: any): any; + node(name: string, attributes: any): any; + serialize(value: any): any; + unique(array: Array): any; } diff --git a/chrome/chrome.d.ts b/chrome/chrome.d.ts index 8b77c9617..8c9ec22dd 100644 --- a/chrome/chrome.d.ts +++ b/chrome/chrome.d.ts @@ -830,44 +830,11 @@ declare module chrome.events { // Extension //////////////////// declare module chrome.extension { - interface MessageSender { - id: string; - tab?: chrome.tabs.Tab; - } - - interface Port { - postMessage: Function; - sender?: MessageSender; - onDisconnect: chrome.events.Event; - onMessage: chrome.events.Event; - name: string; - } - interface FetchProperties { windowId?: number; type?: string; } - interface ConnectInfo { - name?: string; - } - - interface ExtensionMessageEvent extends chrome.events.Event { - addListener(callback: (message: any, sender: MessageSender, sendResponse: Function) => void): void; - } - - interface ExtensionMessageExternalEvent extends chrome.events.Event { - addListener(callback: (message: any, sender: MessageSender, sendResponse: Function) => void): void; - } - - interface ExtensionConnectEvent extends chrome.events.Event { - addListener(callback: (port: Port) => void): void; - } - - interface ExtensionConnectExternalEvent extends chrome.events.Event { - addListener(callback: (port: Port) => void): void; - } - var inIncognitoContext: boolean; var lastError: Object; @@ -876,15 +843,7 @@ declare module chrome.extension { export function setUpdateUrlData(data: string): void; export function getViews(fetchProperties?: FetchProperties): Window[]; export function isAllowedFileSchemeAccess(callback: (isAllowedAccess: boolean) => void): void; - export function sendMessage(message: any, responseCallback?: (response: any) => void): void; - export function sendMessage(extensionId: string, message: any, responseCallback?: (response: any) => void): void; - export function connect(extensionId?: string, connectInfo?: ConnectInfo): Port; export function isAllowedIncognitoAccess(callback: (isAllowedAccess) => void): void; - - var onMessage: ExtensionMessageEvent; - var onMessageExternal: ExtensionMessageExternalEvent; - var onConnect: ExtensionConnectEvent; - var onConnectExternal: ExtensionConnectExternalEvent; } //////////////////// @@ -1461,11 +1420,62 @@ declare module chrome.runtime { var lastError: Object; var id: string; + interface ConnectInfo { + name?: string; + } + interface InstalledDetails { reason: string; previousVersion?: string; } + interface MessageOptions { + includeTlsChannelId?: boolean; + } + + interface MessageSender { + id: string; + tab?: chrome.tabs.Tab; + } + + interface PlatformInfo { + os: string; + arch: string; + nacl_arch: string; + } + + interface Port { + postMessage: Function; + sender?: MessageSender; + onDisconnect: chrome.events.Event; + onMessage: chrome.events.Event; + name: string; + } + + interface UpdateAvailableDetails { + version: string; + } + + interface UpdateCheckDetails { + version: string; + } + + interface ExtensionMessageEvent extends chrome.events.Event { + addListener(callback: (message: any, sender: MessageSender, sendResponse: Function) => void): void; + } + + interface ExtensionMessageExternalEvent extends chrome.events.Event { + addListener(callback: (message: any, sender: MessageSender, sendResponse: Function) => void): void; + } + + interface ExtensionConnectEvent extends chrome.events.Event { + addListener(callback: (port: Port) => void): void; + } + + interface ExtensionConnectExternalEvent extends chrome.events.Event { + addListener(callback: (port: Port) => void): void; + } + interface RuntimeSuspendEvent extends chrome.events.Event { addListener(callback: Function): void; } @@ -1484,18 +1494,43 @@ declare module chrome.runtime { interface RuntimeMessageEvent extends chrome.events.Event { addListener(callback: Function): void; } + + interface RuntimeRestartRequiredEvent extends chrome.events.Event { + addListener(callback: (reason: string) => void): void; + } + + interface RuntimeUpdateAvailableEvent extends chrome.events.Event { + addListener(callback: (details: UpdateAvailableDetails) => void): void; + } + export function connect(connectInfo?: ConnectInfo): Port; + export function connect(extensionId: string, connectInfo?: ConnectInfo): Port; + export function connectNative(application: string): Port; export function getBackgroundPage(callback: (backgroundPage?: Window) => void): void; export function getManifest(): Object; + export function getPackageDirectoryEntry(callback: (directoryEntry: any) => void): void; + export function getPlatformInfo(callback: (platformInfo: PlatformInfo) => void): void; export function getURL(path: string): string; - + export function reload(): void; + export function requestUpdateCheck(callback: (status: string, details?: UpdateCheckDetails) => void): void; + export function restart(): void; + export function sendMessage(message: any, responseCallback?: (response: any) => void): void; + export function sendMessage(message: any, options: MessageOptions, responseCallback?: (response: any) => void): void; + export function sendMessage(extensionId: string, message: any, responseCallback?: (response: any) => void): void; + export function sendMessage(extensionId: string, message: any, options: MessageOptions, responseCallback?: (response: any) => void): void; + export function sendNativeMessage(application: string, message: any, responseCallback?: (response: any) => void ): void; + export function setUninstallUrl(url: string): void; + + var onConnect: ExtensionConnectEvent; + var onConnectExternal: ExtensionConnectExternalEvent; var onSuspend: RuntimeSuspendEvent; var onStartup: RuntimeStartupEvent; var onInstalled: RuntimeInstalledEvent; var onSuspendCanceled: RuntimeSuspendCanceledEvent; var onMessage: RuntimeMessageEvent; var onMessageExternal: RuntimeMessageEvent; - var sendMessage:(req:any, cb:(resp:any)=>void)=>void; + var onRestartRequired: RuntimeRestartRequiredEvent; + var onUpdateAvailable: RuntimeUpdateAvailableEvent; } @@ -1718,6 +1753,7 @@ declare module chrome.tabs { } interface TabRemoveInfo { + windowId: number; isWindowClosing: boolean; } diff --git a/ember/ember.d.ts b/ember/ember.d.ts index 2ef232644..574bb3b9f 100644 --- a/ember/ember.d.ts +++ b/ember/ember.d.ts @@ -2728,13 +2728,13 @@ declare module Ember { (target: any, method: Function): void; begin(): void; cancel(timer: any): void; - debounce(target: any, method: Function, wait: number, immediate: boolean): void; - debounce(target: any, method: string, wait: number, immediate: boolean): void; + debounce(target: any, method: Function, ...args: any[]): void; + debounce(target: any, method: string, ...args: any[]): void; end(): void; join(target: any, method: Function, ...any): any; join(target: any, method: string, ...any): any; - later(target: any, method: Function, wait: boolean): string; - later(target: any, method: string, wait: boolean): string; + later(target: any, method: Function, ...args: any[]): string; + later(target: any, method: string, ...args: any[]): string; next(target: any, method: Function, ...any): number; next(target: any, method: string, ...any): number; once(target: any, method: Function, ...any): number; @@ -2744,8 +2744,8 @@ declare module Ember { scheduleOnce(queue: string, target: any, method: Function, ...any): void; scheduleOnce(queue: string, target: any, method: string, ...any): void; sync(): void; - throttle(target: any, method: Function, spacing: number): void; - throttle(target: any, method: string, spacing: number): void; + throttle(target: any, method: Function, ...args: any[]): void; + throttle(target: any, method: string, ...args: any[]): void; queues: any[]; }; function runLoadHooks(name: string, object: any): void; diff --git a/flight/flight-tests.ts b/flight/flight-tests.ts new file mode 100644 index 000000000..1bfe68d3a --- /dev/null +++ b/flight/flight-tests.ts @@ -0,0 +1,49 @@ +/// +declare var el: Element; +declare var els: Element[]; +declare var mixinFn: Function; + +function TestComponent() { + var self: Flight.Component = this; + + self.defaultAttrs({ + fooSelector: '.bar' + }); + + this.onClick = function (ev: JQueryEventObject, data: Flight.EventData) { + var el: HTMLElement = data.el; + self.select('fooSelector').addClass('bar'); + }; + + self.around('initialize', function () { }); + self.before('initialize', function () { }); + self.after("initialize", function () { + + var $node: JQuery = self.$node; + var node: Element = self.node; + + self.on(el, 'click', {}); + self.on(els, 'click', function () { }); + self.on(document, 'click', this.onClick); + self.on('click', function () { }); + self.on('click', { + fooSelector: this.onClick + }); + + self.off('click', function () { }); + self.off(document, 'click'); + self.off(el, 'click') + self.off(els, 'click'); + + self.teardown(); + }); +} + +flight.component(TestComponent, mixinFn).attachTo(el); +flight.component(TestComponent, mixinFn).attachTo($(els)); +flight.component(TestComponent, mixinFn).attachTo('.test'); +flight.component(TestComponent, mixinFn).attachTo('.test', { + some: 'data' +}); + +flight.component.teardownAll(); diff --git a/flight/flight.d.ts b/flight/flight.d.ts new file mode 100644 index 000000000..a00f6d958 --- /dev/null +++ b/flight/flight.d.ts @@ -0,0 +1,238 @@ +/// + +// Type definitions for Flight 1.1.1 +// Project: http://flightjs.github.com/flight/ +// Definitions by: Jonathan Hedrén +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +declare module Flight { + + export interface Base { + + /** + * Most Components and Mixins need to define attributes. In Flight, + * default values are assigned by passing an object to the defaultAttrs + * function. + */ + defaultAttrs(obj: Object): void; + + /** + * The select method takes an attr key as its argument. The value of the + * attr must be a CSS Selector. The method will return all matching + * elements within the component's node. + * + * This is a handy alternative to jQuery's this.$node.find() and prevents + * accidental access to elements outside of the component's node. + * + * @param attr + */ + select(attr: string): JQuery; + + /** + * This method is attached to the prototype of every Component; it accepts + * the component's node and an options object as arguments. The core + * implementation, which is called every time an instance is created, will + * assign the node to the instance and override the default attrs with the + * options object. + * + * Components and Mixins will typically augment the core implementation by + * supplying a function as an argument to the after method (see the advice + * API for more information). This is a good place to set up event + * listeners that bind to callbacks. + */ + initialize(node: any, options: Object): void; + + /** + * This allows a component instance to listen to an event and register a + * callback to be invoked. Flight will automatically bind the context + * (this) of the callback to the component instance. + * + * @param selector Optional. Specify the DOM node(s) that should listen + * for the event. Defaults to the component instance's node value. + * + * @param eventType The event type to listen for. + * + * @param handler Either a function (callback) to be invoked, or a map of + * targets and callbacks. + */ + on(eventType: string, handler: Function): void; + on(eventType: string, handler: Object): void; + on(selector: string, eventType: string, handler: Function): void; + on(selector: Document, eventType: string, handler: Function): void; + on(selector: Element, eventType: string, handler: Function): void; + on(selector: Element[], eventType: string, handler: Function): void; + on(selector: string, eventType: string, handler: Object): void; + on(selector: Document, eventType: string, handler: Object): void; + on(selector: Element, eventType: string, handler: Object): void; + on(selector: Element[], eventType: string, handler: Object): void; + + /** + * If we no longer want a component instance to listen to an event we can + * use the off method to unsubscribe. + * + * @param selector Optional. The DOM node(s) listening for the event. + * Defaults to the component instance's node value. + * + * @param eventType The event type being listened to. + * + * @param handler Optional. The function (callback) to detach from the + * component instance. Defaults to the detaching all callbacks for the event. + */ + off(eventType: string, handler?: Function): void; + off(selector: string, eventType: string, handler?: Function): void; + off(selector: Document, eventType: string, handler?: Function): void; + off(selector: Element, eventType: string, handler?: Function): void; + off(selector: Element[], eventType: string, handler?: Function): void; + off(selector: string, eventType: Object, handler?: Function): void; + off(selector: Document, eventType: Object, handler?: Function): void; + off(selector: Element, eventType: Object, handler?: Function): void; + off(selector: Element[], eventType: Object, handler?: Function): void; + off(selector: string, eventType: string, handler?: Object): void; + off(selector: Document, eventType: string, handler?: Object): void; + off(selector: Element, eventType: string, handler?: Object): void; + off(selector: Element[], eventType: string, handler?: Object): void; + off(selector: string, eventType: Object, handler?: Object): void; + off(selector: Document, eventType: Object, handler?: Object): void; + off(selector: Element, eventType: Object, handler?: Object): void; + off(selector: Element[], eventType: Object, handler?: Object): void; + + /** + * Trigger an event. + * + * @param selector Optional. The DOM node(s) that the event will be + * dispatched to. Defaults to the component instance's node value. + * + * @param eventType String. The event type to be triggered. + * + * You can also specify a default function that will be called by the + * component, providing that nothing in the event's bubble chain invokes + * preventDefault. Default functions in custom events are analagous to the + * default actions of native events. + * + * To define a default function, make the eventType argument an object + * that specifies the event's type and a defaultBehavior property. A + * common use case is defining default behavior for keyboard events. + * + * @param eventPayload This is the payload of data that accompanies the event. + */ + trigger(eventType: string): void; + trigger(selector: string, eventType: string, eventPayload?: Object): void; + trigger(selector: Document, eventType: string, eventPayload?: Object): void; + trigger(selector: Element, eventType: string, eventPayload?: Object): void; + trigger(selector: Element[], eventType: string, eventPayload?: Object): void; + trigger(eventType: Object): void; + trigger(selector: string, eventType: Object, eventPayload?: Object): void; + trigger(selector: Document, eventType: Object, eventPayload?: Object): void; + trigger(selector: Element, eventType: Object, eventPayload?: Object): void; + trigger(selector: Element[], eventType: Object, eventPayload?: Object): void; + + /** + * Remove a component instance and its event bindings. + * + * It's a good idea to teardown components after each unit test - and + * teardown is also good for unbinding event listeners when, for example, + * the user navigates away from a page. + * + */ + teardown(): void; + } + + export interface Advice extends Base { + /** + * Run the customFunc function after the existingFunc function. + * + * @param existingFuncName The name of the existing function (existingFunc) + * you want to augment. + * + * customFunc The function to be invoked after existingFunc. + */ + after(method: string, fn: Function): void; + + /** + * Run the existingFunc function in the middle of the customFunc function. + * It's similar to underscore's _wrap function). + * + * @param existingFuncName The name of the existing function (existingFunc) + * you want to augment. + * + * customFunc The function to wrap around existingFunc. The existingFunc + * function will be passed to customFunc as an argument. + * + * The existing function is passed to the custom function as an argument so + * that it can be referenced. If the custom function does not call the + * existing function then it will replace that function instead of + * surrounding it. + */ + around(method: string, fn: Function): void; + + /** + * Run the customFunc function before the existingFunc function. + * + * @param existingFuncName The name of the existing function (existingFunc) + * you want to augment. + * + * @param customFunc The function to be invoked before existingFunc. + */ + before(method: string, fn: Function): void; + } + + export interface Component extends Base, Advice { + node: Element; + $node: JQuery; + } + + + export interface AdviceStatic { + withAdvice(): Function; + } + + export interface ComponentStatic { + (...fns: Function[]): ComponentStatic; + attachTo(selector: string, options?: Object): void; + attachTo(selector: Element, options?: Object): void; + attachTo(selector: JQuery, options?: Object): void; + teardownAll(): void; + } + + export interface ComposeStatic { + mixin(base: Object, mixins: Function[]): void; + } + + export interface DebugStatic { + events: { + logAll(): void; + logByAction(action: string): void; + logByName(name: string): void; + logNone(): void; + } + } + + export interface UtilsStatic { + compose(fn1: Function, fn2: Function, ...fns: Function[]): Function; + countThen(num: number, base: Function): Function; + debounce(func: Function, wait: number, immediate: boolean): Function; + delegate(rules: Object): void; + isDomObj(obj: Object): boolean; + isEnumerable(obj: Object, property: string): boolean; + merge(obj1: Object, obj2: Object, deepClone?: boolean): Object; + merge(obj1: Object, obj2: Object, ...args: any[]): Object; + push(base: Object, extra: Object, protect?: boolean): void; + throttle(func: Function, wait: number): Function; + toArray(obj: Object, from?: number): Array; + uniqueArray(array: Array): Array; + } + + export interface EventData { + el: HTMLElement; + } + + export interface FlightStatic { + advice: AdviceStatic; + component: ComponentStatic; + compose: ComposeStatic; + utils: UtilsStatic; + } +} + +declare var DEBUG: Flight.DebugStatic; +declare var flight: Flight.FlightStatic; \ No newline at end of file diff --git a/flot/jquery.flot.d.ts b/flot/jquery.flot.d.ts index fc484aae5..542810545 100644 --- a/flot/jquery.flot.d.ts +++ b/flot/jquery.flot.d.ts @@ -72,7 +72,7 @@ declare module jquery.flot { } interface seriesOptions { - color?: number; + color?: any; // color or number label?: string; lines?: linesOptions; bars?: barsOptions; diff --git a/globalize/globalize-tests.ts b/globalize/globalize-tests.ts index 577330424..5174f90f9 100644 --- a/globalize/globalize-tests.ts +++ b/globalize/globalize-tests.ts @@ -22,10 +22,14 @@ Globalize.addCultureInfo("fr", { messages: { "translate": "traduire" } }); console.log(Globalize.localize("translate", "fr")); Globalize.parseInt("1,234.56"); -Globalize.parseInt("1.234,56"); +Globalize.parseInt("1.234,56", 10); +Globalize.parseInt("1.234,56", 10, "de"); Globalize.parseFloat("1,234.56"); -Globalize.parseFloat("1.234,56"); +Globalize.parseFloat("1.234,56", 10); +Globalize.parseFloat("1.234,56", 10, "de"); Globalize.parseDate("1/2/2003"); +Globalize.parseDate("15 Jun 2012", "dd MMM yyyy"); +Globalize.parseDate("15 Jun 2012", ["dd MMM yyyy"]); Globalize.culture("fr"); Globalize.parseDate("1/2/2003"); diff --git a/globalize/globalize.d.ts b/globalize/globalize.d.ts index dd2876bc8..da17957f1 100644 --- a/globalize/globalize.d.ts +++ b/globalize/globalize.d.ts @@ -107,14 +107,16 @@ interface GlobalizeStatic { culture(cultureSelector: string): GlobalizeCulture; culture(cultureSelector: string[]): GlobalizeCulture; - addCultureInfo(cultureName, baseCultureName, info? ); + addCultureInfo(cultureName: string, baseCultureName, info?); findClosestCulture(cultureSelector: string); - format(value, format, cultureSelector? ); - localize(key, cultureSelector?); + format(value: number, format: string, cultureSelector?: string); + format(value: Date, format: string, cultureSelector?: string); + localize(key: string, cultureSelector?: string); - parseDate(value: string, formats? , cultureSelector?: string): Date; - parseInt(value: string, radix? , cultureSelector?: string): number; - parseFloat(value: string, radix? , cultureSelector?: string): number; + parseDate(value: string, format?: string, cultureSelector?: string): Date; + parseDate(value: string, formats?: string[], cultureSelector?: string): Date; + parseInt(value: string, radix?: number, cultureSelector?: string): number; + parseFloat(value: string, radix?: number, cultureSelector?: string): number; } declare var Globalize: GlobalizeStatic; diff --git a/google.visualization/google.visualization.d.ts b/google.visualization/google.visualization.d.ts index 13d9421bc..511d65a23 100644 --- a/google.visualization/google.visualization.d.ts +++ b/google.visualization/google.visualization.d.ts @@ -4,9 +4,28 @@ declare module google { function setOnLoadCallback(handler: Function): void; function setOnLoadCallback(handler: () => void): void; + //https://developers.google.com/chart/interactive/docs/reference module visualization { + //#region DataTable // https://developers.google.com/chart/interactive/docs/reference#DataTable + export class DataTable { + constructor(data?: any, version?: any); + addColumn(type: string, label?: string, id?: string): number; + addColumn(descriptionObject: DataTableColumnDescription): number; + addRow(cellObject: DataObjectCell): number; + addRow(cellArray?: any[]): number; + addRows(count: number): number; + addRows(array: DataObjectCell[][]): number; + addRows(array: any[]): number; + getFilteredRows(filters: DataTableCellFilter[]): number[]; + getFormattedValue(rowIndex: number, columnIndex: number): string; + getNumberOfColumns(): number; + getNumberOfRows(): number; + removeRow(rowIndex: number): void; + removeRows(rowIndex: number, numberOfRows: number): void; + setColumnLabel(columnIndex: number, label: string): void; + } export interface DataTableColumnDescription { type?: string; @@ -16,10 +35,10 @@ declare module google { pattern?: string; } - export interface DataObjectCell { - v?: any; - f?: string; - p?: any; + export interface DataObject { + cols: DataObjectColumn[]; + rows: DataObjectRow[]; + p: any; } export interface DataObjectColumn { @@ -35,30 +54,52 @@ declare module google { p?: any; } - export interface DataObject { - cols: DataObjectColumn[]; - rows: DataObjectRow[]; - p: any; + export interface DataTableCellFilter { + column: number; } - export class DataTable { - constructor(data?: any, version?: any); - addColumn(type: string, label?: string, id?: string): number; - addColumn(descriptionObject: DataTableColumnDescription): number; - addRow(cellObject: DataObjectCell): number; - addRow(cellArray?: any[]): number; - addRows(count: number): number; - addRows(array: DataObjectCell[][]): number; - addRows(array: any[]): number; + export interface DataObjectCell { + v?: any; + f?: string; + p?: any; + } + + export interface DataTableCellValueFilter extends DataTableCellFilter { + value: any; + } + + export interface DataTableCellRangeFilter extends DataTableCellFilter { + minValue?: any; + maxValue?: any; } function arrayToDataTable(data: any[]): DataTable; + //#endregion + //#region DataView + + // https://developers.google.com/chart/interactive/docs/reference#DataView + export class DataView { + constructor(data: DataTable); + constructor(data: DataView); + setColumns(columnIndexes: number[]): void; + } + + //#endregion + //#region GeoChart + //https://google-developers.appspot.com/chart/interactive/docs/gallery/geochart export class GeoChart { constructor(element: Element); - draw(chart: DataTable, options: GeoChartOptions): void; + + // https://developers.google.com/chart/interactive/docs/gallery/geochart?hl=fr&csw=1#Methods + draw(data: DataTable, options: GeoChartOptions): void; + getSelection(): GeoChartSelection[]; + setSelection(selection: VisualizationSelectionArray[]): void; + clearChart(): void; } + + // https://developers.google.com/chart/interactive/docs/gallery/geochart?hl=fr&csw=1#Configuration_Options export interface GeoChartOptions { backgroundColor?: any; colorAxis?: GeoChartColorAxis; @@ -76,11 +117,12 @@ declare module google { tooltip?: GeoChartTooltip; width?: number; } - //export interface GeoChartColor { - // fill?: string; - // stroke?: string; - // strokeWidth: number; - //} + export interface GeoChartAxis { + maxSize?: number; + maxValue?: number; + minSize?: number; + minValue?: number; + } export interface GeoChartColorAxis extends GeoChartAxis { minValue?: number; maxValue?: number; @@ -102,20 +144,226 @@ declare module google { enable?: boolean; zoomFactor?: number; } - export interface GeoChartAxis { - maxSize?: number; - maxValue?: number; - minSize?: number; - minValue?: number; - } export interface GeoChartTooltip { textStyle?: GeoChartTextStyle; trigger?: string; } + export interface GeoChartRegionClickEvent { + region: string; + } + export interface GeoChartSelection { + row: number; + } + + //#endregion + //#region Common + + export interface ChartArea { + top: any; + left: any; + width: any; + height: any; + } + + export interface ChartTextStyle { + color?: string; + fontName?: string; + fontSize?: number; + bold?: boolean; + italic?: boolean; + } + + export interface ChartLegend { + alignment?: string; + maxLines?: number; + position?: string; + textStyle?: ChartTextStyle; + } + + // https://google-developers.appspot.com/chart/interactive/docs/animation + export interface TransitionAnimation { + duration?: number; + easing?: string; // linear, in, out, inAndOut + } + + export interface ChartAxis { + baseline?: number; // This option is only supported for a continuous axis. https://google-developers.appspot.com/chart/interactive/docs/customizing_axes#Terminology + baselineColor?: string; // google's documentation on this is wrong, specifies it as a number. The color of the baseline for the horizontal axis. Can be any HTML color string, for example: 'red' or '#00cc00' + direction?: number; // The direction in which the values along the horizontal axis grow. Specify -1 to reverse the order of the values. + format?: string; // icu pattern set http://icu-project.org/apiref/icu4c/classDecimalFormat.html#_details + gridlines?: ChartGridlines; + logScale?: boolean; + textPosition?: string; + textStyle?: ChartTextStyle; + ticks?: any[]; + title?: string; + titleTextStyle?: ChartTextStyle; + allowContainerBoundaryTextCufoff?: boolean; + slantedText?: boolean; + slantedTextAngle?: number; + maxAlternation?: number; + maxTextLines?: number; + minTextSpacing?: number; + showTextEvery?: number; + maxValue?: number; + minValue?: number; + viewWindowMode?: string; + viewWindow?: ChartViewWindow; + } + + export interface ChartGridlines { + color?: string; + count?: number; + minorGridlines?: ChartMinorGridlines; + } + + export interface ChartMinorGridlines { + color?: string; + count?: number; + } + + export interface ChartViewWindow { + max?: number; + min?: number; + } + + export interface ChartTooltip { + isHtml?: boolean; + showColorCode?: boolean; + textStyle?: ChartTextStyle; + trigger?: string; + } + + export interface ChartBoundingBox { + left: number; + top: number; + width: number; + height: number; + } + + export interface ChartLayoutInterface { + getBoundingBox(id: string): ChartBoundingBox; + getChartAreaBoundingBox(): ChartBoundingBox; + getHAxisValue(position: number, axisIndex?: number): number; + getVAxisValue(position: number, axisIndex?: number): number; + getXLocation(position: number, axisIndex?: number): number; + getYLocation(position: number, axisIndex?: number): number; + } + + export interface VisualizationSelectionArray { + column?: number; + row?: number; + } + + //#endregion + //#region ColumnChart + + // https://google-developers.appspot.com/chart/interactive/docs/gallery/columnchart + export class ColumnChart { + constructor(element: Element); + + // https://google-developers.appspot.com/chart/interactive/docs/gallery/columnchart#Methods + draw(data: DataTable, options?: ColumnChartOptions): void; + draw(data: DataView, options?: ColumnChartOptions): void; + getChartLayoutInterface(): ChartLayoutInterface; + getSelection(): any[]; + setSelection(selection: any[]): void; + clearChart(): void; + } + + // https://google-developers.appspot.com/chart/interactive/docs/gallery/columnchart#Configuration_Options + export interface ColumnChartOptions { + aggregationTarget?: string; + animation?: TransitionAnimation; + axisTitlesPosition?: string; // in, out, none + backgroundColor?: any; + bar?: ColumnChartBarOptions; + chartArea?: ChartArea; + colors?: string[]; + enableInteractivity?: boolean; + focusTarget?: string; + fontSize?: number; + fontName?: string; + hAxis?: ChartAxis; + height?: number; + isStacked?: boolean; + legend?: ChartLegend; + reverseCategories?: boolean; + selectionMode?: string // single / multiple + series?: any; + theme?: string; + title?: string; + titlePosition?: string; + titleTextStyle?: ChartTextStyle; + tooltip?: ChartTooltip; + vAxes?: any; + vAxis?: ChartAxis; + width?: number; + } + + export interface ColumnChartBarOptions { + groupWidth: any; + } + + //#endregion + //#region LineChart + + // https://google-developers.appspot.com/chart/interactive/docs/gallery/linechart + export class LineChart { + constructor(element: Element); + + // https://google-developers.appspot.com/chart/interactive/docs/gallery/linechart#Methods + draw(data: DataTable, options: any): void; + draw(data: DataView, options: any): void; + getChartLayoutInterface(): ChartLayoutInterface; + getSelection(): any[]; + setSelection(selection: any[]): void; + clearChart(): void; + } + + // https://google-developers.appspot.com/chart/interactive/docs/gallery/linechart#Configuration_Options + export interface LineChartOptions { + aggregationTarget?: string; + animation?: TransitionAnimation; + axisTitlesPosition?: string; + backgroundColor?: any; + chartArea?: ChartArea; + colors?: string[]; + curveType?: string; + enableInteractivity?: boolean; + focusTarget?: string; + fontSize?: number; + fontName?: string; + hAxis?: ChartAxis; + height?: number; + interpolateNulls?: boolean; + legend?: ChartLegend; + lineWidth?: number; + pointSize?: number; + reverseCategories?: boolean; + selectionMode?: string // single / multiple + series?: any; + theme?: string; + title?: string; + titlePosition?: string; + titleTextStyle?: ChartTextStyle; + tooltip?: ChartTooltip; + vAxes?: any; + vAxis?: ChartAxis; + width?: number; + } + + //#endregion + //#region Events module events { - function addListener(chart: any, eventName: string, callback: Function): any; - function addListener(chart: any, eventName: string, callback: () => any): any; + function addListener(visualization: any, eventName: string, callback: Function): any; + function addListener(visualization: any, eventName: string, callback: (...args: any[]) => void): any; + function removeListener(listener: any): void; + function removeAllListeners(visualization: any): void; + function trigger(visualization: any, eventName: string, args?: any): void; } + + //#endregion } } \ No newline at end of file diff --git a/jquery.base64/jquery.base64-tests.ts b/jquery.base64/jquery.base64-tests.ts new file mode 100644 index 000000000..5f6b6eaa6 --- /dev/null +++ b/jquery.base64/jquery.base64-tests.ts @@ -0,0 +1,8 @@ +/// +/// + +var encoded = $.base64.encode(""); +$.base64.decode(encoded); + +var encodedUTF8 = $.base64.encode("", true); +$.base64.decode(encodedUTF8, true); diff --git a/jquery.base64/jquery.base64.d.ts b/jquery.base64/jquery.base64.d.ts new file mode 100644 index 000000000..9af24ed01 --- /dev/null +++ b/jquery.base64/jquery.base64.d.ts @@ -0,0 +1,15 @@ +// Type definitions for jQuery Plugin - base64 codec +// Project: https://github.com/yatt/jquery.base64/ +// Definitions by: Shinya Mochizuki +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// + +interface JQueryBase64Static { + encode(data: string, isUTF8?: boolean): string; + decode(data: string, isUTF8?: boolean): string; +} + +interface JQueryStatic { + base64: JQueryBase64Static; +} diff --git a/jquery.cleditor/jquery.cleditor-tests.ts b/jquery.cleditor/jquery.cleditor-tests.ts new file mode 100644 index 000000000..b29885150 --- /dev/null +++ b/jquery.cleditor/jquery.cleditor-tests.ts @@ -0,0 +1,42 @@ +/// +/// + +// cribbed from http://premiumsoftware.net/CLEditor/GettingStarted + +$(document).ready(function () { $("#input").cleditor(); }); + +$(document).ready(function() { + $("#input").cleditor({ + width: 500, // width not including margins, borders or padding + height: 250, // height not including margins, borders or padding + controls: // controls to add to the toolbar + "bold italic underline strikethrough subscript superscript | font size " + + "style | color highlight removeformat | bullets numbering | outdent " + + "indent | alignleft center alignright justify | undo redo | " + + "rule image link unlink | cut copy paste pastetext | print source", + colors: // colors in the color popup + "FFF FCC FC9 FF9 FFC 9F9 9FF CFF CCF FCF " + + "CCC F66 F96 FF6 FF3 6F9 3FF 6FF 99F F9F " + + "BBB F00 F90 FC6 FF0 3F3 6CC 3CF 66C C6C " + + "999 C00 F60 FC3 FC0 3C0 0CC 36F 63F C3C " + + "666 900 C60 C93 990 090 399 33F 60C 939 " + + "333 600 930 963 660 060 366 009 339 636 " + + "000 300 630 633 330 030 033 006 309 303", + fonts: // font names in the font popup + "Arial,Arial Black,Comic Sans MS,Courier New,Narrow,Garamond," + + "Georgia,Impact,Sans Serif,Serif,Tahoma,Trebuchet MS,Verdana", + sizes: // sizes in the font size popup + "1,2,3,4,5,6,7", + styles: // styles in the style popup + [["Paragraph", "

"], ["Header 1", "

"], ["Header 2", "

"], + ["Header 3", "

"], ["Header 4","

"], ["Header 5","

"], + ["Header 6","
"]], + useCSS: false, // use CSS to style HTML when possible (not supported in ie) + docType: // Document type contained within the editor + '', + docCSSFile: // CSS file used to style the document contained within the editor + "", + bodyStyle: // style to assign to document body contained within the editor + "margin:4px; font:10pt Arial,Verdana; cursor:text" + }); + }); \ No newline at end of file diff --git a/jquery.cleditor/jquery.cleditor.d.ts b/jquery.cleditor/jquery.cleditor.d.ts new file mode 100644 index 000000000..c273f3227 --- /dev/null +++ b/jquery.cleditor/jquery.cleditor.d.ts @@ -0,0 +1,98 @@ +// Type definitions for jQuery CLEditor Plugin 1.4.3 +// Project: http://premiumsoftware.net/CLEditor +// Definitions by: Jeffery Grajkowski +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// + +/** + * An editor is composed of a main div element used to hold a toolbar, + * a text area and an iframe. The toolbar can hold multiple groups + * which in turn hold multiple buttons. + */ +interface CLEditor { + $area: JQuery; + $frame: JQuery; + $main: JQuery; + $toolbar: JQuery; + disabled: boolean; + doc: Document; + options: JQueryCLEditorOptions; + change(handler: Function): CLEditor; + clear(): CLEditor; + disable(disabled: boolean): CLEditor; + execCommand(commands: string, value: any, useCSS?: boolean, button?: any): CLEditor; + focus(): CLEditor; + hidePopups(): CLEditor; + refresh(): CLEditor; + select(): CLEditor; + selectedHTML(): string; + selectedText(): string; + showMessage(message: string, button?: any): CLEditor; + sourceMode(): boolean; + updateFrame(): CLEditor; + updateTextArea(): CLEditor; +} + +interface JQueryCLEditorOptions { + width?: number; + height?: number; + controls?: string; + colors?: string; + fonts?: string; + sizes?: string; + styles?: string[][]; + useCSS?: boolean; + docType?: string; + docCSSFile?: string; + bodyStyle?: string; +} + +interface JQueryCLEditorButtonDefinition { + name: string; + title: string; + css?: any; + image?: string; + stripIndex?: number; + command?: string; + popupName?: string; + popupContent?: string; + getEnabled?: (data: JQueryCLEditorButtonDefinitionEventData) => boolean; + getPressed?: (data: JQueryCLEditorButtonDefinitionEventData) => boolean; + buttonClick?: (event: Event, data: JQueryCLEditorButtonDefinitionEventData) => boolean; + popupClick?: (event: Event, data: JQueryCLEditorButtonDefinitionEventData) => boolean; +} + +interface JQueryCLEditorButtonDefinitionEventData { + editor: CLEditor; + button: HTMLElement; + buttonName: string; + popup: HTMLElement; + popupName: string; + command: string; + value: any; + useCSS: boolean; +} + +/** + * This object contains global properties and methods used to create + * custom plugins and override built in functionality. + */ +interface JQueryCLEditorStatic { + defaultOptions: JQueryCLEditorOptions; + buttons: JQueryCLEditorButtonDefinition[]; + imagesPath: () => string; +} + +interface JQueryStatic { + cleditor: JQueryCLEditorStatic; +} + +interface JQuery { + /** + * If the cleditor object does not exist for a matched textarea element, + * it will be created using the default options combined with the supplied options. + * This is the core method for creating and selecting cleditor objects. + */ + cleditor(options?: JQueryCLEditorOptions): CLEditor; +} diff --git a/jqueryui/jqueryui.d.ts b/jqueryui/jqueryui.d.ts index 42de3a3af..1a09df7fd 100644 --- a/jqueryui/jqueryui.d.ts +++ b/jqueryui/jqueryui.d.ts @@ -73,7 +73,7 @@ declare module JQueryUI { } interface Autocomplete extends Widget, AutocompleteOptions, AutocompleteEvents { - escapeRegex: (string) => string; + escapeRegex: (value: string) => string; } @@ -154,7 +154,7 @@ declare module JQueryUI { interface Datepicker extends Widget, DatepickerOptions { regional: { [languageCod3: string]: any; }; - setDefaults(defaults: DatepickerOptions); + setDefaults(defaults: DatepickerOptions): void; formatDate(format: string, date: Date, settings?: DatepickerFormatDateOptions): string; parseDate(format: string, date: string, settings?: DatepickerFormatDateOptions): Date; iso8601Week(date: Date): void; diff --git a/knockout.es5/knockout.es5-tests.ts b/knockout.es5/knockout.es5-tests.ts index f8faf9529..c51b9bc9d 100644 --- a/knockout.es5/knockout.es5-tests.ts +++ b/knockout.es5/knockout.es5-tests.ts @@ -1,4 +1,4 @@ -/// +/// var empty = {}, obj = { a: 'string', b: 123, c: true, d: empty }, @@ -75,3 +75,12 @@ anOrder.lines.shift(); console.log(someOrderLine.subtotal == someOrderLine.getSubtotal()); // true console.log(anOrder.lines.length); // 1 + +//Array methods +anOrder.lines.remove(someOrderLine); +anOrder.lines.removeAll([someOrderLine]); +anOrder.lines.removeAll(); + +anOrder.lines.destroy(someOrderLine); +anOrder.lines.destroyAll([someOrderLine]); +anOrder.lines.destroyAll(); \ No newline at end of file diff --git a/knockout.es5/knockout.es5.d.ts b/knockout.es5/knockout.es5.d.ts index c546e1beb..868655545 100644 --- a/knockout.es5/knockout.es5.d.ts +++ b/knockout.es5/knockout.es5.d.ts @@ -8,7 +8,22 @@ interface KnockoutStatic { track(obj: any, propertyNames?: Array): any; defineProperty(obj: any, propertyName: string, evaluator: Function): any; - defineProperty(obj: any, propertyName: string, options: { get: () => any; set?: (value: any) => void; }): any; + defineProperty(obj: any, propertyName: string, options: KnockoutDefinePropertyOptions): any; getObservable(obj: any, propertyName: string): KnockoutObservable; valueHasMutated(obj: any, propertyName: string): void; +} + +interface KnockoutDefinePropertyOptions { + get(): any; + set?(value: any): void; +} + +interface Array { + remove(item): T[]; + removeAll(items: T[]): T[]; + removeAll(): T[]; + + destroy(item: T): void; + destroyAll(items: T[]): void; + destroyAll(): void; } \ No newline at end of file diff --git a/knockout.postbox/knockout-postbox.d.ts b/knockout.postbox/knockout-postbox.d.ts index 3e6698851..daa35458a 100644 --- a/knockout.postbox/knockout-postbox.d.ts +++ b/knockout.postbox/knockout-postbox.d.ts @@ -19,6 +19,14 @@ interface KnockoutObservable { syncWith(topic: string, initializeWithLatestValue?: boolean, skipInitialPublish?: boolean, equalityComparer?: (newValue: T, oldValue: T) => boolean): KnockoutObservable; } +interface KnockoutObservableArray { + subscribeTo(topic: string, useLastPublishedValueToInitialize?: boolean, transform?: (val: any) => T): KnockoutObservableArray; + unsubscribeFrom(topic: string): KnockoutObservableArray; + publishOn(topic: string, skipInitialPublish?: boolean, equalityComparer?: (newValue: T, oldValue: T) => boolean): KnockoutObservableArray; + stopPublishingOn(topic: string): KnockoutObservableArray; + syncWith(topic: string, initializeWithLatestValue?: boolean, skipInitialPublish?: boolean, equalityComparer?: (newValue: T, oldValue: T) => boolean): KnockoutObservableArray; +} + interface KnockoutStatic { postbox: KnockoutPostBox; } \ No newline at end of file diff --git a/knockout.rx/knockout.rx-tests.ts b/knockout.rx/knockout.rx-tests.ts new file mode 100644 index 000000000..674e9bb6a --- /dev/null +++ b/knockout.rx/knockout.rx-tests.ts @@ -0,0 +1,12 @@ +/// + +var ax: Rx.IObservable; + +var ao = ax.toKoObservable(); + +ao(100); +ao.getSubscriptionsCount(); + +ao.toObservable(); +ao.toObservable("change"); +ao.toObservable("error"); \ No newline at end of file diff --git a/knockout.rx/knockout.rx-tests.ts.tscparams b/knockout.rx/knockout.rx-tests.ts.tscparams new file mode 100644 index 000000000..e16c76dff --- /dev/null +++ b/knockout.rx/knockout.rx-tests.ts.tscparams @@ -0,0 +1 @@ +"" diff --git a/knockout.rx/knockout.rx.d.ts b/knockout.rx/knockout.rx.d.ts new file mode 100644 index 000000000..4f44153d8 --- /dev/null +++ b/knockout.rx/knockout.rx.d.ts @@ -0,0 +1,26 @@ +// Type definitions for knockout.rx 0.1 +// Project: https://github.com/Igorbek/knockout.rx +// Definitions by: Igor Oleinikov + +/// +/// + +interface KnockoutSubscribableFunctions { + toObservable(event?: string): Rx.IObservable; + toObservable(event: string): Rx.IObservable; +} + +interface KnockoutObservableFunctions { + toObservableWithReplyLatest(): Rx.IObservable; +} + +interface KnockoutComputedFunctions { + toObservableWithReplyLatest(): Rx.IObservable; +} + +declare module Rx { + interface IObservable { + toKoSubscribable(): KnockoutSubscribable; + toKoObservable(initialValue?: T): KnockoutObservable; + } +} diff --git a/knockout.rx/knockout.rx.d.ts.tscparams b/knockout.rx/knockout.rx.d.ts.tscparams new file mode 100644 index 000000000..e16c76dff --- /dev/null +++ b/knockout.rx/knockout.rx.d.ts.tscparams @@ -0,0 +1 @@ +"" diff --git a/knockout/knockout.amd.d.ts b/knockout/knockout.amd.d.ts index 960a0286d..7eb134612 100644 --- a/knockout/knockout.amd.d.ts +++ b/knockout/knockout.amd.d.ts @@ -24,10 +24,10 @@ declare module 'knockout' { export function isObservable(instance: any): boolean; export function isComputed(instance: any): boolean; export function dataFor(node: any): any; - export function removeNode(node: Element); - export function cleanNode(node: Element); - export function renderTemplate(template: Function, viewModel: any, options?: any, target?: any, renderMode?: any); - export function renderTemplate(template: string, viewModel: any, options?: any, target?: any, renderMode?: any); + export function removeNode(node: Element): void; + export function cleanNode(node: Element): Element; + export function renderTemplate(template: Function, viewModel: any, options?: any, target?: any, renderMode?: any): any; + export function renderTemplate(template: string, viewModel: any, options?: any, target?: any, renderMode?: any): any; ////////////////////////////////// //// templateSources.js @@ -44,9 +44,10 @@ declare module 'knockout' { //// templateRewriting.js //////////////////////////////////// export var templateRewriting: { - ensureTemplateIsRewritten(template, templateEngine, templateDocument); - memoizeBindingAttributeSyntax(htmlString: string, templateEngine: KnockoutTemplateEngine); - applyMemoizedBindingsToNextSibling(bindings); + ensureTemplateIsRewritten(template: Node, templateEngine: KnockoutTemplateEngine, templateDocument: Document): any; + ensureTemplateIsRewritten(template: string, templateEngine: KnockoutTemplateEngine, templateDocument: Document): any; + memoizeBindingAttributeSyntax(htmlString: string, templateEngine: KnockoutTemplateEngine): any; + applyMemoizedBindingsToNextSibling(bindings: any, nodeName: string): string; }; //////////////////////////////////// //// nativeTemplateEngine.js @@ -61,16 +62,25 @@ declare module 'knockout' { //////////////////////////////////// export var jqueryTmplTemplateEngine: { prototype: KnockoutTemplateEngine; - renderTemplateSource(templateSource, bindingContext, options); + renderTemplateSource(templateSource: Object, bindingContext: KnockoutBindingContext, options: Object): Node[]; createJavaScriptEvaluatorBlock(script: string): string; - addTemplate(templateName, templateMarkup); + addTemplate(templateName: string, templateMarkup: string): void; }; //////////////////////////////////// //// templating.js //////////////////////////////////// - export function setTemplateEngine(templateEngine: KnockoutNativeTemplateEngine); - export function renderTemplate(template, dataOrBindingContext, options, targetNodeOrNodeArray, renderMode); - export function renderTemplateForEach(template, arrayOrObservableArray, options, targetNode, parentBindingContext); + export function renderTemplate(template: Function, dataOrBindingContext: KnockoutBindingContext, options: Object, targetNodeOrNodeArray: Node, renderMode: string): any; + export function renderTemplate(template: any, dataOrBindingContext: KnockoutBindingContext, options: Object, targetNodeOrNodeArray: Node, renderMode: string): any; + export function renderTemplate(template: Function, dataOrBindingContext: any, options: Object, targetNodeOrNodeArray: Node, renderMode: string): any; + export function renderTemplate(template: any, dataOrBindingContext: any, options: Object, targetNodeOrNodeArray: Node, renderMode: string): any; + export function renderTemplate(template: Function, dataOrBindingContext: KnockoutBindingContext, options: Object, targetNodeOrNodeArray: Node[], renderMode: string): any; + export function renderTemplate(template: any, dataOrBindingContext: KnockoutBindingContext, options: Object, targetNodeOrNodeArray: Node[], renderMode: string): any; + export function renderTemplate(template: Function, dataOrBindingContext: any, options: Object, targetNodeOrNodeArray: Node[], renderMode: string): any; + export function renderTemplate(template: any, dataOrBindingContext: any, options: Object, targetNodeOrNodeArray: Node[], renderMode: string): any; + export function renderTemplateForEach(template: Function, arrayOrObservableArray: Array, options: Object, targetNode: Node, parentBindingContext: KnockoutBindingContext): any; + export function renderTemplateForEach(template: any, arrayOrObservableArray: Array, options: Object, targetNode: Node, parentBindingContext: KnockoutBindingContext): any; + export function renderTemplateForEach(template: Function, arrayOrObservableArray: KnockoutObservable, options: Object, targetNode: Node, parentBindingContext: KnockoutBindingContext): any; + export function renderTemplateForEach(template: any, arrayOrObservableArray: KnockoutObservable < Array>, options: Object, targetNode: Node, parentBindingContext: KnockoutBindingContext): any; export var expressionRewriting: { bindingRewriteValidators: any; }; diff --git a/knockout/knockout.d.ts b/knockout/knockout.d.ts index 63f993894..79d0c1737 100644 --- a/knockout/knockout.d.ts +++ b/knockout/knockout.d.ts @@ -5,7 +5,7 @@ interface KnockoutSubscribableFunctions { - notifySubscribers(valueToWrite: T, event?: string); + notifySubscribers(valueToWrite: T, event?: string): void; } interface KnockoutComputedFunctions { @@ -27,12 +27,13 @@ interface KnockoutObservableArrayFunctions { unshift(...items: T[]): number; reverse(): T[]; sort(): void; - sort(compareFunction): void; + sort(compareFunction: (left: any, right: any) => number): void; // Ko specific replace(oldItem: T, newItem: T): void; - remove(item): T[]; + remove(item: T): T[]; + remove(removeFunction: (item: T) => boolean): T[]; removeAll(items: T[]): T[]; removeAll(): T[]; @@ -52,10 +53,8 @@ interface KnockoutSubscription { } interface KnockoutSubscribable extends KnockoutSubscribableFunctions { - (): T; - (value: T): void; - subscribe(callback: (newValue: T) => void, target?: any, event?: string): KnockoutSubscription; + subscribe(callback: (newValue: TEvent) => void, target: any, event: string): KnockoutSubscription; extend(requestedExtenders: { [key: string]: any; }): KnockoutSubscribable; getSubscriptionsCount(): number; } @@ -70,10 +69,14 @@ interface KnockoutComputedStatic { } interface KnockoutComputed extends KnockoutSubscribable, KnockoutComputedFunctions { + (): T; + (value: T): void; + peek(): T; dispose(): void; isActive(): boolean; getDependenciesCount(): number; + extend(requestedExtenders: { [key: string]: any; }): KnockoutComputed; } interface KnockoutObservableArrayStatic { @@ -83,6 +86,7 @@ interface KnockoutObservableArrayStatic { } interface KnockoutObservableArray extends KnockoutObservable, KnockoutObservableArrayFunctions { + extend(requestedExtenders: { [key: string]: any; }): KnockoutObservableArray; } interface KnockoutObservableStatic { @@ -92,9 +96,13 @@ interface KnockoutObservableStatic { } interface KnockoutObservable extends KnockoutSubscribable, KnockoutObservableFunctions { + (): T; + (value: T): void; + peek(): T; valueHasMutated(): void; valueWillMutate(): void; + extend(requestedExtenders: { [key: string]: any; }): KnockoutObservable; } interface KnockoutComputedDefine { @@ -114,8 +122,8 @@ interface KnockoutBindingContext { $index?: number; $parentContext?: KnockoutBindingContext; - extend(any): any; - createChildContext(any): any; + extend(properties: any): any; + createChildContext(dataItemOrAccessor: any, dataItemAlias?: any, extendCallback?: Function): any; } interface KnockoutBindingHandler { @@ -159,23 +167,23 @@ interface KnockoutBindingHandlers { } interface KnockoutMemoization { - memoize(callback); - unmemoize(memoId, callbackParams); - unmemoizeDomNodeAndDescendants(domNode, extraCallbackParamsArray); - parseMemoText(memoText); + memoize(callback: () => string): string; + unmemoize(memoId: string, callbackParams: Array): boolean; + unmemoizeDomNodeAndDescendants(domNode: any, extraCallbackParamsArray: Array): boolean; + parseMemoText(memoText: string): string; } interface KnockoutVirtualElement {} interface KnockoutVirtualElements { allowedBindings: { [bindingName: string]: boolean; }; - emptyNode( e: KnockoutVirtualElement ); - firstChild( e: KnockoutVirtualElement ); - insertAfter( container: KnockoutVirtualElement, nodeToInsert: HTMLElement, insertAfter: HTMLElement ); - nextSibling( e: KnockoutVirtualElement ); - prepend( e: KnockoutVirtualElement, toInsert: HTMLElement ); - setDomNodeChildren( e: KnockoutVirtualElement, newChildren: { length: number;[index: number]: HTMLElement; } ); - childNodes( e: KnockoutVirtualElement ): HTMLElement[]; + emptyNode(node: KnockoutVirtualElement ): void; + firstChild(node: KnockoutVirtualElement ): KnockoutVirtualElement; + insertAfter( container: KnockoutVirtualElement, nodeToInsert: HTMLElement, insertAfter: HTMLElement ): void; + nextSibling(node: KnockoutVirtualElement): HTMLElement; + prepend(node: KnockoutVirtualElement, toInsert: HTMLElement ): void; + setDomNodeChildren(node: KnockoutVirtualElement, newChildren: { length: number;[index: number]: HTMLElement; } ): void; + childNodes(node: KnockoutVirtualElement ): HTMLElement[]; } interface KnockoutExtenders { @@ -189,11 +197,11 @@ interface KnockoutUtils { // utils.domManipulation.js ////////////////////////////////// - simpleHtmlParse(html: string); + simpleHtmlParse(html: string): Array; - jQueryHtmlParse(html: string); + jQueryHtmlParse(html: string): Array; - parseHtmlFragment(html: string); + parseHtmlFragment(html: string): Array; setHtml(node: Element, html: string): void; @@ -204,13 +212,13 @@ interface KnockoutUtils { ////////////////////////////////// domData: { - get (node: Element, key: string); + get (node: Element, key: string): any; - set (node: Element, key: string, value: any); + set (node: Element, key: string, value: any): void; - getAll(node: Element, createIfNotFound: boolean); + getAll(node: Element, createIfNotFound: boolean): any; - clear(node: Element); + clear(node: Element): boolean; }; ////////////////////////////////// @@ -218,13 +226,13 @@ interface KnockoutUtils { ////////////////////////////////// domNodeDisposal: { - addDisposeCallback(node: Element, callback: Function); + addDisposeCallback(node: Element, callback: Function): void; - removeDisposeCallback(node: Element, callback: Function); + removeDisposeCallback(node: Element, callback: Function): void; - cleanNode(node: Element); + cleanNode(node: Element): Element; - removeNode(node: Element); + removeNode(node: Element): void; }; ////////////////////////////////// @@ -233,41 +241,29 @@ interface KnockoutUtils { fieldsIncludedWithJsonPost: any[]; - arrayForEach(array: T[], action: (item: T) => void): void; + compareArrays(a: T[], b: T[]): Array>; - arrayForEach(array: any[], action: (any) => void ): void; + arrayForEach(array: T[], action: (item: T) => void): void; arrayIndexOf(array: any[], item: any): number; arrayFirst(array: T[], predicate: (item: T) => boolean, predicateOwner?: any): T; - arrayFirst(array: any[], predicate: (item) => boolean, predicateOwner?: any): any; - arrayRemoveItem(array: any[], itemToRemove: any): void; arrayGetDistinctValues(array: T[]): T[]; - arrayGetDistinctValues(array: any[]): any[]; - arrayMap(array: T[], mapping: (item: T) => U): U[]; - arrayMap(array: any[], mapping: (item) => any): any[]; - arrayFilter(array: T[], predicate: (item: T) => boolean): T[]; - arrayFilter(array: any[], predicate: (item) => boolean): any[]; - arrayPushAll(array: T[], valuesToPush: T[]): T[]; - arrayPushAll(array: any[], valuesToPush: any[]): any[]; - arrayPushAll(array: KnockoutObservableArray, valuesToPush: T[]): T[]; - arrayPushAll(array: KnockoutObservableArray, valuesToPush: any[]): any[]; + extend(target: Object, source: Object): Object; - extend(target, source); - - emptyDomNode(domNode): void; + emptyDomNode(domNode: HTMLElement): void; moveCleanedNodesToContainerElement(nodes: any[]): HTMLElement; @@ -328,15 +324,21 @@ interface KnockoutUtils { isIe7: boolean; } +interface KnockoutArrayChange { + status: string; + value: T; + index: number; +} + ////////////////////////////////// // templateSources.js ////////////////////////////////// interface KnockoutTemplateSourcesDomElement { - text(valueToWrite?); + text(valueToWrite?: any): any; - data(key, valueToWrite?); + data(key: string, valueToWrite?: any): any; } @@ -358,7 +360,7 @@ interface KnockoutTemplateSources { interface KnockoutNativeTemplateEngine { - renderTemplateSource(templateSource, bindingContext, options?); + renderTemplateSource(templateSource: Object, bindingContext?: KnockoutBindingContext, options?: Object): Array; } ////////////////////////////////// @@ -367,15 +369,15 @@ interface KnockoutNativeTemplateEngine { interface KnockoutTemplateEngine extends KnockoutNativeTemplateEngine { - createJavaScriptEvaluatorBlock(script: string); + createJavaScriptEvaluatorBlock(script: string): string; - makeTemplateSource(template, templateDocument); + makeTemplateSource(template: any, templateDocument?: Document): any; - renderTemplate(template, bindingContext, options, templateDocument); + renderTemplate(template: any, bindingContext: KnockoutBindingContext, options: Object, templateDocument: Document): any; - isTemplateRewritten(template, templateDocument): boolean; + isTemplateRewritten(template: any, templateDocument: Document): boolean; - rewriteTemplate(template, rewriterCallback, templateDocument); + rewriteTemplate(template: any, rewriterCallback: Function, templateDocument: Document): void; } ///////////////////////////////// @@ -404,10 +406,10 @@ interface KnockoutStatic { isWriteableObservable(instance: any): boolean; isComputed(instance: any): boolean; dataFor(node: any): any; - removeNode(node: Element); - cleanNode(node: Element); - renderTemplate(template: Function, viewModel: any, options?: any, target?: any, renderMode?: any); - renderTemplate(template: string, viewModel: any, options?: any, target?: any, renderMode?: any); + removeNode(node: Element): void; + cleanNode(node: Element): Element; + renderTemplate(template: Function, viewModel: any, options?: any, target?: any, renderMode?: any): any; + renderTemplate(template: string, viewModel: any, options?: any, target?: any, renderMode?: any): any; unwrap(value: any): any; ////////////////////////////////// @@ -433,11 +435,12 @@ interface KnockoutStatic { templateRewriting: { - ensureTemplateIsRewritten(template, templateEngine, templateDocument); + ensureTemplateIsRewritten(template: Node, templateEngine: KnockoutTemplateEngine, templateDocument: Document): any; + ensureTemplateIsRewritten(template: string, templateEngine: KnockoutTemplateEngine, templateDocument: Document): any; - memoizeBindingAttributeSyntax(htmlString: string, templateEngine: KnockoutTemplateEngine); + memoizeBindingAttributeSyntax(htmlString: string, templateEngine: KnockoutTemplateEngine): any; - applyMemoizedBindingsToNextSibling(bindings); + applyMemoizedBindingsToNextSibling(bindings: any, nodeName: string): string; }; ////////////////////////////////// @@ -461,22 +464,32 @@ interface KnockoutStatic { prototype: KnockoutTemplateEngine; - renderTemplateSource(templateSource, bindingContext, options); + renderTemplateSource(templateSource: Object, bindingContext: KnockoutBindingContext, options: Object): Node[]; createJavaScriptEvaluatorBlock(script: string): string; - addTemplate(templateName, templateMarkup); + addTemplate(templateName: string, templateMarkup: string): void; }; ////////////////////////////////// // templating.js ////////////////////////////////// - setTemplateEngine(templateEngine: KnockoutNativeTemplateEngine); + setTemplateEngine(templateEngine: KnockoutNativeTemplateEngine): void; - renderTemplate(template, dataOrBindingContext, options, targetNodeOrNodeArray, renderMode); + renderTemplate(template: Function, dataOrBindingContext: KnockoutBindingContext, options: Object, targetNodeOrNodeArray: Node, renderMode: string): any; + renderTemplate(template: any, dataOrBindingContext: KnockoutBindingContext, options: Object, targetNodeOrNodeArray: Node, renderMode: string): any; + renderTemplate(template: Function, dataOrBindingContext: any, options: Object, targetNodeOrNodeArray: Node, renderMode: string): any; + renderTemplate(template: any, dataOrBindingContext: any, options: Object, targetNodeOrNodeArray: Node, renderMode: string): any; + renderTemplate(template: Function, dataOrBindingContext: KnockoutBindingContext, options: Object, targetNodeOrNodeArray: Node[], renderMode: string): any; + renderTemplate(template: any, dataOrBindingContext: KnockoutBindingContext, options: Object, targetNodeOrNodeArray: Node[], renderMode: string): any; + renderTemplate(template: Function, dataOrBindingContext: any, options: Object, targetNodeOrNodeArray: Node[], renderMode: string): any; + renderTemplate(template: any, dataOrBindingContext: any, options: Object, targetNodeOrNodeArray: Node[], renderMode: string): any; - renderTemplateForEach(template, arrayOrObservableArray, options, targetNode, parentBindingContext); + renderTemplateForEach(template: Function, arrayOrObservableArray: Array, options: Object, targetNode: Node, parentBindingContext: KnockoutBindingContext): any; + renderTemplateForEach(template: any, arrayOrObservableArray: Array, options: Object, targetNode: Node, parentBindingContext: KnockoutBindingContext): any; + renderTemplateForEach(template: Function, arrayOrObservableArray: KnockoutObservable, options: Object, targetNode: Node, parentBindingContext: KnockoutBindingContext): any; + renderTemplateForEach(template: any, arrayOrObservableArray: KnockoutObservable, options: Object, targetNode: Node, parentBindingContext: KnockoutBindingContext): any; expressionRewriting: { bindingRewriteValidators: any; @@ -492,9 +505,9 @@ interface KnockoutStatic { selectExtensions: { - readValue(element: any); + readValue(element: HTMLElement): any; - writeValue(element: any, value: any); + writeValue(element: HTMLElement, value: any): void; }; } diff --git a/leaflet/leaflet.d.ts b/leaflet/leaflet.d.ts index 5cdc961bd..6234475b4 100644 --- a/leaflet/leaflet.d.ts +++ b/leaflet/leaflet.d.ts @@ -1,35 +1,2341 @@ -// Type definitions for Leaflet.js 0.5 +// Type definitions for Leaflet.js 0.6.4 // Project: https://github.com/Leaflet/Leaflet -// Definitions by: Vladimir +// Definitions by: Vladimir Zotov // Definitions: https://github.com/borisyankov/DefinitelyTyped + declare module L { + + export interface AttributionOptions { + + /** + * The position of the control (one of the map corners). See control positions. + * Default value: 'bottomright'. + */ + position?: string; + + /** + * The HTML text shown before the attributions. Pass false to disable. + * Default value: 'Powered by Leaflet'. + */ + prefix?: string; + + } +} + +declare module L { + + /** + * Creates a Bounds object from two coordinates (usually top-left and bottom-right + * corners). + */ + export function bounds(topLeft: Point, bottomRight: Point): Bounds; + + /** + * Creates a Bounds object defined by the points it contains. + */ + export function bounds(points: Point[]): Bounds; + + export class Bounds { + + /** + * Creates a Bounds object from two coordinates (usually top-left and bottom-right + * corners). + */ + constructor(topLeft: Point, bottomRight: Point); + + /** + * Creates a Bounds object defined by the points it contains. + */ + constructor(points: Point[]); + + /** + * Extends the bounds to contain the given point. + */ + extend(point: Point): void; + + /** + * Returns the center point of the bounds. + */ + getCenter(): Point; + + /** + * Returns true if the rectangle contains the given one. + */ + contains(otherBounds: Bounds): boolean; + + /** + * Returns true if the rectangle contains the given point. + */ + contains(point: Point): boolean; + + /** + * Returns true if the rectangle intersects the given bounds. + */ + intersects(otherBounds: Bounds): boolean; + + /** + * Returns true if the bounds are properly initialized. + */ + isValid(): boolean; + + /** + * Returns the size of the given bounds. + */ + getSize(): Point; + + /** + * The top left corner of the rectangle. + */ + min: Point; + + /** + * The bottom right corner of the rectangle. + */ + max: Point; + } +} + +declare module L { + + export class Browser { + + /** + * true for all Internet Explorer versions. + */ + static ie: boolean; + + /** + * true for Internet Explorer 6. + */ + static ie6: boolean; + + /** + * true for Internet Explorer 6. + */ + static ie7: boolean; + + /** + * true for webkit-based browsers like Chrome and Safari (including mobile + * versions). + */ + static webkit: boolean; + + /** + * true for webkit-based browsers that support CSS 3D transformations. + */ + static webkit3d: boolean; + + /** + * true for Android mobile browser. + */ + static android: boolean; + + /** + * true for old Android stock browsers (2 and 3). + */ + static android23: boolean; + + /** + * true for modern mobile browsers (including iOS Safari and different Android + * browsers). + */ + static mobile: boolean; + + /** + * true for mobile webkit-based browsers. + */ + static mobileWebkit: boolean; + + /** + * true for mobile Opera. + */ + static mobileOpera: boolean; + + /** + * true for all browsers on touch devices. + */ + static touch: boolean; + + /** + * true for browsers with Microsoft touch model (e.g. IE10). + */ + static msTouch: boolean; + + /** + * true for devices with Retina screens. + */ + static retina: boolean; + + } +} + + +declare module L { + + /** + * Instantiates a circle object given a geographical point, a radius in meters + * and optionally an options object. + */ + function circle(latlng: LatLng, radius: number, options?: PathOptions): Circle; + + export class Circle extends Path { + + /** + * Instantiates a circle object given a geographical point, a radius in meters + * and optionally an options object. + */ + constructor(latlng: LatLng, radius: number, options?: PathOptions); + + /** + * Returns the current geographical position of the circle. + */ + getLatLng(): LatLng; + + /** + * Returns the current radius of a circle. Units are in meters. + */ + getRadius(): number; + + /** + * Sets the position of a circle to a new location. + */ + setLatLng(latlng: LatLng): Circle; + + /** + * Sets the radius of a circle. Units are in meters. + */ + setRadius(radius: number): Circle; + + /** + * Returns a GeoJSON representation of the circle (GeoJSON Point Feature). + */ + toGeoJSON(): any; + + } +} + +declare module L { + + /** + * Instantiates a circle marker given a geographical point and optionally + * an options object. The default radius is 10 and can be altered by passing a + * "radius" member in the path options object. + */ + function circleMarker(latlng: LatLng, options?: PathOptions): CircleMarker; + + export class CircleMarker extends Circle { + + /** + * Instantiates a circle marker given a geographical point and optionally + * an options object. The default radius is 10 and can be altered by passing a + * "radius" member in the path options object. + */ + constructor(latlng: LatLng, options?: PathOptions); + + /** + * Sets the position of a circle marker to a new location. + */ + setLatLng(latlng: LatLng): CircleMarker; + + /** + * Sets the radius of a circle marker. Units are in pixels. + */ + setRadius(radius: number): CircleMarker; + + /** + * Returns a GeoJSON representation of the circle marker (GeoJSON Point Feature). + */ + toGeoJSON(): any; + } +} + +declare module L { + + export interface ClassExtendOptions { + /** + * options is a special property that unlike other objects that you pass + * to extend will be merged with the parent one instead of overriding it + * completely, which makes managing configuration of objects and default + * values convenient. + */ + options?: any; + + /** + * includes is a special class property that merges all specified objects + * into the class (such objects are called mixins). A good example of this + * is L.Mixin.Events that event-related methods like on, off and fire + * to the class. + */ + includes?: any; + + /** + * statics is just a convenience property that injects specified object + * properties as the static properties of the class, useful for defining + * constants. + */ + static?: any; + } + + /** + * L.Class powers the OOP facilities of Leaflet and is used to create + * almost all of the Leaflet classes documented. + */ + export class Class { + + /** + * You use L.Class.extend to define new classes, but you can use the + * same method on any class to inherit from it. + */ + static extend(options: ClassExtendOptions): any; + + /** + * You can also use the following shortcut when you just need to make + * one additional method call. + */ + static addInitHook(methodName: string, ...args: any[]): void; + } + +} + + + +declare module L { + + export class Control extends Class implements IControl { + + /** + * Creates a control with the given options. + */ + constructor(options?: ControlOptions); + + /** + * Sets the position of the control. See control positions. + */ + setPosition(position: string): Control; + + /** + * Returns the current position of the control. + */ + getPosition(): string; + + /** + * Adds the control to the map. + */ + addTo(map: Map): Control; + + /** + * Removes the control from the map. + */ + removeFrom(map: Map): Control; + + /** + * Returns the HTML container of the control. + */ + getContainer(): HTMLElement; + + // IControl members + + /** + * Should contain code that creates all the neccessary DOM elements for the + * control, adds listeners on relevant map events, and returns the element + * containing the control. Called on map.addControl(control) or control.addTo(map). + */ + onAdd(map: Map): HTMLElement; + + /** + * Optional, should contain all clean up code (e.g. removes control's event + * listeners). Called on map.removeControl(control) or control.removeFrom(map). + * The control's DOM container is removed automatically. + */ + onRemove(map: Map): void; + } + + module Control { + + export class Zoom extends L.Control { + + /** + * Creates a zoom control. + */ + constructor(options?: ZoomOptions); + } + + export class Attribution extends L.Control { + + /** + * Creates an attribution control. + */ + constructor(options?: AttributionOptions); + + /** + * Sets the text before the attributions. + */ + setPrefix(prefix: string): Attribution; + + /** + * Adds an attribution text (e.g. 'Vector data © CloudMade'). + */ + addAttribution(text: string): Attribution; + + /** + * Removes an attribution text. + */ + removeAttribution(text: string): Attribution; + + } + + export class Layers extends L.Control implements IEventPowered { + + /** + * Creates an attribution control with the given layers. Base layers will be + * switched with radio buttons, while overlays will be switched with checkboxes. + */ + constructor(baseLayers?: any, overlays?: any, options?: LayersOptions); + + /** + * Adds a base layer (radio button entry) with the given name to the control. + */ + addBaseLayer(layer: ILayer, name: string): Layers; + + /** + * Adds an overlay (checkbox entry) with the given name to the control. + */ + addOverlay(layer: ILayer, name: string): Layers; + + /** + * Remove the given layer from the control. + */ + removeLayer(layer: ILayer): Layers; + + //////////////// + //////////////// + addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Layers; + addOneTimeEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Layers; + removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): Layers; + hasEventListeners(type: string): boolean; + fireEvent(type: string, data?: any): Layers; + on(type: string, fn: (e: LeafletEvent) => void, context?: any): Layers; + once(type: string, fn: (e: LeafletEvent) => void, context?: any): Layers; + off(type: string, fn?: (e: LeafletEvent) => void, context?: any): Layers; + fire(type: string, data?: any): Layers; addEventListener(eventMap: any, context?: any): Layers; + removeEventListener(eventMap?: any, context?: any): Layers; + clearAllEventListeners(): Layers + on(eventMap: any, context?: any): Layers; + off(eventMap?: any, context?: any): Layers; + } + + export class Scale extends L.Control { + + /** + * Creates an scale control with the given options. + */ + constructor(options?: ScaleOptions); + + } + } + + export class control { + + /** + * Creates a control with the given options. + */ + function (options?: ControlOptions): Control; + + /** + * Creates a zoom control. + */ + static zoom(options?: ZoomOptions): L.Control.Zoom; + + /** + * Creates an attribution control. + */ + static attribution(options?: AttributionOptions): L.Control.Attribution; + + /** + * Creates an attribution control with the given layers. Base layers will be + * switched with radio buttons, while overlays will be switched with checkboxes. + */ + static layers(baseLayers?: any, overlays?: any, options?: LayersOptions): L.Control.Layers; + + /** + * Creates an scale control with the given options. + */ + static scale(options?: ScaleOptions): L.Control.Scale; + } +} + +declare module L { + + export interface ControlOptions { + + /** + * The initial position of the control (one of the map corners). See control + * positions. + * Default value: 'topright'. + */ + position: string; + + } +} + +declare module L { + + export class CRS { + + /** + * The most common CRS for online maps, used by almost all free and commercial + * tile providers. Uses Spherical Mercator projection. Set in by default in + * Map's crs option. + */ + static EPSG3857: ICRS; + + /** + * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. + */ + static EPSG4326: ICRS; + + /** + * Rarely used by some commercial tile providers. Uses Elliptical Mercator + * projection. + */ + static EPSG3395: ICRS; + + /** + * A simple CRS that maps longitude and latitude into x and y directly. May be + * used for maps of flat surfaces (e.g. game maps). Note that the y axis should + * still be inverted (going from bottom to top). + */ + static Simple: ICRS; + + } +} + +declare module L { + + /** + * Creates a div icon instance with the given options. + */ + function divIcon(options: DivIconOptions): DivIcon; + + export class DivIcon extends Icon { + + /** + * Creates a div icon instance with the given options. + */ + constructor(options: DivIconOptions); + } +} + +declare module L { + + export interface DivIconOptions { + + /** + * Size of the icon in pixels. Can be also set through CSS. + */ + iconSize?: Point; + + /** + * The coordinates of the "tip" of the icon (relative to its top left corner). + * The icon will be aligned so that this point is at the marker's geographical + * location. Centered by default if size is specified, also can be set in CSS + * with negative margins. + */ + iconAnchor?: Point; + + /** + * A custom class name to assign to the icon. + * + * Default value: 'leaflet-div-icon'. + */ + className?: string; + + /** + * A custom HTML code to put inside the div element. + * + * Default value: ''. + */ + html?: string; + + } +} + +declare module L { + + export class DomEvent { + + /** + * Adds a listener fn to the element's DOM event of the specified type. this keyword + * inside the listener will point to context, or to the element if not specified. + */ + static addListener(el: HTMLElement, type: string, fn: (e: Event) => void, context?: any): DomEvent; + + /** + * Removes an event listener from the element. + */ + static removeListener(el: HTMLElement, type: string, fn: (e: Event) => void): DomEvent; + + /** + * Stop the given event from propagation to parent elements. Used inside the + * listener functions: + * L.DomEvent.addListener(div, 'click', function + * (e) { + * L.DomEvent.stopPropagation(e); + * }); + */ + static stopPropagation(e: Event): DomEvent; + + /** + * Prevents the default action of the event from happening (such as following + * a link in the href of the a element, or doing a POST request with page reload + * when form is submitted). Use it inside listener functions. + */ + static preventDefault(e: Event): DomEvent; + + /** + * Does stopPropagation and preventDefault at the same time. + */ + static stop(e: Event): DomEvent; + + /** + * Adds stopPropagation to the element's 'click', 'doubleclick', 'mousedown' + * and 'touchstart' events. + */ + static disableClickPropagation(el: HTMLElement): DomEvent; + + /** + * Gets normalized mouse position from a DOM event relative to the container + * or to the whole page if not specified. + */ + static getMousePosition(e: Event, container?: HTMLElement): Point; + + /** + * Gets normalized wheel delta from a mousewheel DOM event. + */ + static getWheelDelta(e: Event): number; + + } +} + +declare module L { + + export class DomUtil { + + /** + * Returns an element with the given id if a string was passed, or just returns + * the element if it was passed directly. + */ + static get(id: string): HTMLElement; + + /** + * Returns the value for a certain style attribute on an element, including + * computed values or values set through CSS. + */ + static getStyle(el: HTMLElement, style: string): string; + + /** + * Returns the offset to the viewport for the requested element. + */ + static getViewportOffset(el: HTMLElement): Point; + + /** + * Creates an element with tagName, sets the className, and optionally appends + * it to container element. + */ + static create(tagName: string, className: string, container?: HTMLElement): HTMLElement; + + /** + * Makes sure text cannot be selected, for example during dragging. + */ + static disableTextSelection(): void; + + /** + * Makes text selection possible again. + */ + static enableTextSelection(): void; + + /** + * Returns true if the element class attribute contains name. + */ + static hasClass(el: HTMLElement, name: string): boolean; + + /** + * Adds name to the element's class attribute. + */ + static addClass(el: HTMLElement, name: string): void; + + /** + * Removes name from the element's class attribute. + */ + static removeClass(el: HTMLElement, name: string): void; + + /** + * Set the opacity of an element (including old IE support). Value must be from + * 0 to 1. + */ + static setOpacity(el: HTMLElement, value: number): void; + + /** + * Goes through the array of style names and returns the first name that is a valid + * style name for an element. If no such name is found, it returns false. Useful + * for vendor-prefixed styles like transform. + */ + static testProp(props: string[]): any; + + /** + * Returns a CSS transform string to move an element by the offset provided in + * the given point. Uses 3D translate on WebKit for hardware-accelerated transforms + * and 2D on other browsers. + */ + static getTranslateString(point: Point): string; + + /** + * Returns a CSS transform string to scale an element (with the given scale origin). + */ + static getScaleString(scale: number, origin: Point): string; + + /** + * Sets the position of an element to coordinates specified by point, using + * CSS translate or top/left positioning depending on the browser (used by + * Leaflet internally to position its layers). Forces top/left positioning + * if disable3D is true. + */ + static setPosition(el: HTMLElement, point: Point, disable3D?: boolean): void; + + /** + * Returns the coordinates of an element previously positioned with setPosition. + */ + static getPosition(el: HTMLElement): Point; + + /** + * Vendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit). + */ + static TRANSITION: string; + + /** + * Vendor-prefixed transform style name. + */ + static TRANSFORM: string; + + } +} + +declare module L { + + /** + * Creates a Draggable object for moving the given element when you start dragging + * the dragHandle element (equals the element itself by default). + */ + function draggable(element: HTMLElement, dragHandle?: HTMLElement): Draggable; + + export class Draggable extends Class implements IEventPowered { + + /** + * Creates a Draggable object for moving the given element when you start dragging + * the dragHandle element (equals the element itself by default). + */ + constructor(element: HTMLElement, dragHandle?: HTMLElement); + + /** + * Enables the dragging ability. + */ + enable(): void; + + /** + * Disables the dragging ability. + */ + disable(): void; + + //////////////// + //////////////// + addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Draggable; + addOneTimeEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Draggable; + removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): Draggable; + hasEventListeners(type: string): boolean; + fireEvent(type: string, data?: any): Draggable; + on(type: string, fn: (e: LeafletEvent) => void, context?: any): Draggable; + once(type: string, fn: (e: LeafletEvent) => void, context?: any): Draggable; + off(type: string, fn?: (e: LeafletEvent) => void, context?: any): Draggable; + fire(type: string, data?: any): Draggable; + addEventListener(eventMap: any, context?: any): Draggable; + removeEventListener(eventMap?: any, context?: any): Draggable; + clearAllEventListeners(): Draggable + on(eventMap: any, context?: any): Draggable; + off(eventMap?: any, context?: any): Draggable; + } +} + + + +declare module L { + + /** + * Create a layer group, optionally given an initial set of layers. + */ + function featureGroup(layers?: ILayer[]): FeatureGroup; + + export class FeatureGroup extends LayerGroup implements ILayer, IEventPowered { + + /** + * Create a layer group, optionally given an initial set of layers. + */ + constructor(layers?: ILayer[]); + + /** + * Binds a popup with a particular HTML content to a click on any layer from the + * group that has a bindPopup method. + */ + bindPopup(htmlContent: string, options?: PopupOptions): FeatureGroup; + + /** + * Returns the LatLngBounds of the Feature Group (created from bounds and coordinates + * of its children). + */ + getBounds(): LatLngBounds; + + /** + * Sets the given path options to each layer of the group that has a setStyle method. + */ + setStyle(style: PathOptions): FeatureGroup; + + /** + * Brings the layer group to the top of all other layers. + */ + bringToFront(): FeatureGroup; + + /** + * Brings the layer group to the bottom of all other layers. + */ + bringToBack(): FeatureGroup; + + //////////// + //////////// + /** + * Should contain code that creates DOM elements for the overlay, adds them + * to map panes where they should belong and puts listeners on relevant map events. + * Called on map.addLayer(layer). + */ + onAdd(map: Map): void; + + /** + * Should contain all clean up code that removes the overlay's elements from + * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). + */ + onRemove(map: Map): void; + + //////////////// + //////////////// + addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): FeatureGroup; + addOneTimeEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): FeatureGroup; + removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): FeatureGroup; + hasEventListeners(type: string): boolean; + fireEvent(type: string, data?: any): FeatureGroup; + on(type: string, fn: (e: LeafletEvent) => void, context?: any): FeatureGroup; + once(type: string, fn: (e: LeafletEvent) => void, context?: any): FeatureGroup; + off(type: string, fn?: (e: LeafletEvent) => void, context?: any): FeatureGroup; + fire(type: string, data?: any): FeatureGroup; + addEventListener(eventMap: any, context?: any): FeatureGroup; + removeEventListener(eventMap?: any, context?: any): FeatureGroup; + clearAllEventListeners(): FeatureGroup + on(eventMap: any, context?: any): FeatureGroup; + off(eventMap?: any, context?: any): FeatureGroup; + } +} + +declare module L { + + export interface FitBoundsOptions extends ZoomPanOptions { + + /** + * Sets the amount of padding in the top left corner of a map container that + * shouldn't be accounted for when setting the view to fit bounds. Useful if + * you have some control overlays on the map like a sidebar and you don't + * want them to obscure objects you're zooming to. + * + * Default value: [0, 0]. + */ + paddingTopLeft?: Point; + + /** + * The same for bottom right corner of the map. + * + * Default value: [0, 0]. + */ + paddingBottomRight?: Point; + + /** + * Equivalent of setting both top left and bottom right padding to the same value. + * + * Default value: [0, 0]. + */ + padding?: Point; + } +} + +declare module L { + + /** + * Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format + * to display on the map (you can alternatively add it later with addData method) + * and an options object. + */ + function geoJson(geojson?: any, options?: GeoJSONOptions): GeoJSON; + + export class GeoJSON extends FeatureGroup { + + /** + * Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format + * to display on the map (you can alternatively add it later with addData method) + * and an options object. + */ + constructor(geojson?: any, options?: GeoJSONOptions); + + /** + * Adds a GeoJSON object to the layer. + */ + addData(data: any): boolean; + + /** + * Changes styles of GeoJSON vector layers with the given style function. + */ + setStyle(style: (featureData: any) => any): GeoJSON; + + /** + * Resets the the given vector layer's style to the original GeoJSON style, + * useful for resetting style after hover events. + */ + resetStyle(layer: Path): GeoJSON; + + /** + * Creates a layer from a given GeoJSON feature. + */ + static geometryToLayer(featureData: GeoJSON, pointToLayer?: (featureData: any, latlng: LatLng) => ILayer): ILayer; + + /** + * Creates a LatLng object from an array of 2 numbers (latitude, longitude) + * used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted + * as (longitude, latitude). + */ + static coordsToLatlng(coords: number[], reverse?: boolean): LatLng; + + /** + * Creates a multidimensional array of LatLng objects from a GeoJSON coordinates + * array. levelsDeep specifies the nesting level (0 is for an array of points, + * 1 for an array of arrays of points, etc., 0 by default). If reverse is set to + * true, the numbers will be interpreted as (longitude, latitude). + */ + static coordsToLatlngs(coords: number[], levelsDeep?: number, reverse?: boolean): LatLng[]; + + } +} + +declare module L { + export interface GeoJSONOptions { + /** + * Function that will be used for creating layers for GeoJSON points (if not + * specified, simple markers will be created). + */ + pointToLayer?: (featureData: any, latlng: LatLng) => ILayer; + + /** + * Function that will be used to get style options for vector layers created + * for GeoJSON features. + */ + style?: (featureData: any) => any; + + /** + * Function that will be called on each created feature layer. Useful for attaching + * events and popups to features. + */ + onEachFeature?: (featureData: any, layer: ILayer) => void; + + /** + * Function that will be used to decide whether to show a feature or not. + */ + filter?: (featureData: any, layer: ILayer) => boolean; + + /** + * Function that will be used for converting GeoJSON coordinates to LatLng points + * (if not specified, coords will be assumed to be WGS84 standard[longitude, latitude] + * values in degrees). + */ + coordsToLatLng?: (coords: any[]) => LatLng[]; + } +} + + + + +declare module L { + + /** + * Creates an icon instance with the given options. + */ + function icon(options: IconOptions): Icon; + + export class Icon extends Class { + + /** + * Creates an icon instance with the given options. + */ + constructor(options: IconOptions); + } + + module Icon { + + /** + * L.Icon.Default extends L.Icon and is the blue icon Leaflet uses + * for markers by default. + */ + export class Default extends Icon { + + /** + * Creates an icon instance with default options. + */ + constructor(options: IconOptions); + + static imagePath: string; + } + } +} + +declare module L { + + export interface IconOptions { + + /** + * (required) The URL to the icon image (absolute or relative to your script + * path). + */ + iconUrl?: string; + + /** + * The URL to a retina sized version of the icon image (absolute or relative to + * your script path). Used for Retina screen devices. + */ + iconRetinaUrl?: string; + + /** + * Size of the icon image in pixels. + */ + iconSize?: Point; + + /** + * The coordinates of the "tip" of the icon (relative to its top left corner). + * The icon will be aligned so that this point is at the marker's geographical + * location. Centered by default if size is specified, also can be set in CSS + * with negative margins. + */ + iconAnchor?: Point; + + /** + * The URL to the icon shadow image. If not specified, no shadow image will be + * created. + */ + shadowUrl?: string; + + /** + * The URL to the retina sized version of the icon shadow image. If not specified, + * no shadow image will be created. Used for Retina screen devices. + */ + shadowRetinaUrl?: string; + + /** + * Size of the shadow image in pixels. + */ + shadowSize?: Point; + + /** + * The coordinates of the "tip" of the shadow (relative to its top left corner) + * (the same as iconAnchor if not specified). + */ + shadowAnchor?: Point; + + /** + * The coordinates of the point from which popups will "open", relative to the + * icon anchor. + */ + popupAnchor?: Point; + + /** + * A custom class name to assign to both icon and shadow images. Empty by default. + */ + className?: string; + } +} + +declare module L { + + export interface IControl { + + /** + * Should contain code that creates all the neccessary DOM elements for the + * control, adds listeners on relevant map events, and returns the element + * containing the control. Called on map.addControl(control) or control.addTo(map). + */ + onAdd(map: Map): HTMLElement; + + /** + * Optional, should contain all clean up code (e.g. removes control's event + * listeners). Called on map.removeControl(control) or control.removeFrom(map). + * The control's DOM container is removed automatically. + */ + onRemove(map: Map): void; + } +} + +declare module L { + + export interface ICRS { + + /** + * Projection that this CRS uses. + */ + projection: IProjection; + + /** + * Transformation that this CRS uses to turn projected coordinates into screen + * coordinates for a particular tile service. + */ + transformation: Transformation; + + /** + * Standard code name of the CRS passed into WMS services (e.g. 'EPSG:3857'). + */ + code: string; + + /** + * Projects geographical coordinates on a given zoom into pixel coordinates. + */ + latLngToPoint(latlng: LatLng, zoom: number): Point; + + /** + * The inverse of latLngToPoint. Projects pixel coordinates on a given zoom + * into geographical coordinates. + */ + pointToLatLng(point: Point, zoom: number): LatLng; + + /** + * Projects geographical coordinates into coordinates in units accepted + * for this CRS (e.g. meters for EPSG:3857, for passing it to WMS services). + */ + project(latlng: LatLng): Point; + + /** + * Returns the scale used when transforming projected coordinates into pixel + * coordinates for a particular zoom. For example, it returns 256 * 2^zoom for + * Mercator-based CRS. + */ + scale(zoom: number): number; + + } +} + +declare module L { + + export interface IEventPowered { + + /** + * Adds a listener function (fn) to a particular event type of the object. You + * can optionally specify the context of the listener (object the this keyword + * will point to). You can also pass several space-separated types (e.g. 'click + * dblclick'). + */ + addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): T; + + /** + * The same as above except the listener will only get fired once and then removed. + */ + addOneTimeEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): T; + /** + * Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove} + */ + addEventListener(eventMap: any, context?: any): T; + + /** + * Removes a previously added listener function. If no function is specified, + * it will remove all the listeners of that particular event from the object. + */ + removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): T; + + /** + * Removes a set of type/listener pairs. + */ + removeEventListener(eventMap?: any, context?: any): T; + + /** + * Returns true if a particular event type has some listeners attached to it. + */ + hasEventListeners(type: string): boolean; + + /** + * Fires an event of the specified type. You can optionally provide an data object + * — the first argument of the listener function will contain its properties. + */ + fireEvent(type: string, data?: any): T; + + /** + * Removes all listeners to all events on the object. + */ + clearAllEventListeners(): T; + + /** + * Alias to addEventListener. + */ + on(type: string, fn: (e: LeafletEvent) => void, context?: any): T; + + /** + * Alias to addEventListener. + */ + on(eventMap: any, context?: any): T; + + /** + * Alias to addOneTimeEventListener. + */ + once(type: string, fn: (e: LeafletEvent) => void, context?: any): T; + + /** + * Alias to removeEventListener. + */ + off(type: string, fn?: (e: LeafletEvent) => void, context?: any): T; + + /** + * Alias to removeEventListener. + */ + off(eventMap?: any, context?: any): T; + + /** + * Alias to fireEvent. + */ + fire(type: string, data?: any): T; + } +} + +declare module L { + + export interface IHandler { + + /** + * Enables the handler. + */ + enable(): void; + + /** + * Disables the handler. + */ + disable(): void; + + /** + * Returns true if the handler is enabled. + */ + enabled(): boolean; + } +} + +declare module L { + + export interface ILayer { + + /** + * Should contain code that creates DOM elements for the overlay, adds them + * to map panes where they should belong and puts listeners on relevant map events. + * Called on map.addLayer(layer). + */ + onAdd(map: Map): void; + + /** + * Should contain all clean up code that removes the overlay's elements from + * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). + */ + onRemove(map: Map): void; + } +} + +declare module L { + + /** + * Instantiates an image overlay object given the URL of the image and the geographical + * bounds it is tied to. + */ + function imageOverlay(imageUrl: string, bounds: LatLngBounds, options?: ImageOverlayOptions): ImageOverlay; + + export class ImageOverlay extends Class implements ILayer { + + /** + * Instantiates an image overlay object given the URL of the image and the geographical + * bounds it is tied to. + */ + constructor(imageUrl: string, bounds: LatLngBounds, options?: ImageOverlayOptions); + + /** + * Adds the overlay to the map. + */ + addTo(map: Map): ImageOverlay; + + /** + * Sets the opacity of the overlay. + */ + setOpacity(opacity: number): ImageOverlay; + + /** + * Brings the layer to the top of all overlays. + */ + bringToFront(): ImageOverlay; + + /** + * Brings the layer to the bottom of all overlays. + */ + bringToBack(): ImageOverlay; + + //////////// + //////////// + /** + * Should contain code that creates DOM elements for the overlay, adds them + * to map panes where they should belong and puts listeners on relevant map events. + * Called on map.addLayer(layer). + */ + onAdd(map: Map): void; + + /** + * Should contain all clean up code that removes the overlay's elements from + * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). + */ + onRemove(map: Map): void; + } +} + +declare module L { + + export interface ImageOverlayOptions { + + /** + * The opacity of the image overlay. + */ + opacity?: number; + } +} + +declare module L { + + export interface IProjection { + + /** + * Projects geographical coordinates into a 2D point. + */ + project(latlng: LatLng): Point; + + /** + * The inverse of project. Projects a 2D point into geographical location. + */ + unproject(point: Point): LatLng; + } +} + +declare module L { + + /** + * A constant that represents the Leaflet version in use. + */ + export var version: string; + + /** + * This method restores the L global variale to the original value it had + * before Leaflet inclusion, and returns the real Leaflet namespace. + */ + export function noConflict(): typeof L; +} + +declare module L { + + /** + * Creates an object representing a geographical point with the given latitude + * and longitude. + */ + function latLng(latitude: number, longitude: number): LatLng; + + /** + * Creates an object representing a geographical point with the given latitude + * and longitude. + */ + function latLng(coords: number[]): LatLng; + + export class LatLng { + + /** + * Creates an object representing a geographical point with the given latitude + * and longitude. + */ + constructor(latitude: number, longitude: number); + + /** + * Creates an object representing a geographical point with the given latitude + * and longitude. + */ + constructor(coords: number[]); + + /** + * Returns the distance (in meters) to the given LatLng calculated using the + * Haversine formula. See description on wikipedia + */ + distanceTo(otherLatlng: LatLng): number; + + /** + * Returns true if the given LatLng point is at the same position (within a small + * margin of error). + */ + equals(otherLatlng: LatLng): boolean; + + /** + * Returns a string representation of the point (for debugging purposes). + */ + toString(): string; + + /** + * Returns a new LatLng object with the longitude wrapped around left and right + * boundaries (-180 to 180 by default). + */ + wrap(left: number, right: number): LatLng; + + /** + * Latitude in degrees. + */ + lat: number; + + /** + * Longitude in degrees. + */ + lng: number; + + /** + * A multiplier for converting degrees into radians. + * + * Value: Math.PI / 180. + */ + static DEG_TO_RAD: number; + + /** + * A multiplier for converting radians into degrees. + * + * Value: 180 / Math.PI. + */ + static RAD_TO_DEG: number; + + /** + * Max margin of error for the equality check. + * + * Value: 1.0E-9. + */ + static MAX_MARGIN: number; + } +} + +declare module L { + + /** + * Creates a LatLngBounds object by defining south-west and north-east corners + * of the rectangle. + */ + function latLngBounds(southWest: LatLng, northEast: LatLng): LatLngBounds; + + /** + * Creates a LatLngBounds object defined by the geographical points it contains. + * Very useful for zooming the map to fit a particular set of locations with fitBounds. + */ + function latLngBounds(latlngs: LatLng[]): LatLngBounds; + + export class LatLngBounds { + + /** + * Creates a LatLngBounds object by defining south-west and north-east corners + * of the rectangle. + */ + constructor(southWest: LatLng, northEast: LatLng); + + /** + * Creates a LatLngBounds object defined by the geographical points it contains. + * Very useful for zooming the map to fit a particular set of locations with fitBounds. + */ + constructor(latlngs: LatLng[]); + + /** + * Extends the bounds to contain the given point. + */ + extend(latlng: LatLng): LatLngBounds; + + /** + * Extends the bounds to contain the given bounds. + */ + extend(latlng: LatLngBounds): LatLngBounds; + + /** + * Returns the south-west point of the bounds. + */ + getSouthWest(): LatLng; + + /** + * Returns the north-east point of the bounds. + */ + getNorthEast(): LatLng; + + /** + * Returns the north-west point of the bounds. + */ + getNorthWest(): LatLng; + + /** + * Returns the south-east point of the bounds. + */ + getSouthEast(): LatLng; + + /** + * Returns the center point of the bounds. + */ + getCenter(): LatLng; + + /** + * Returns true if the rectangle contains the given one. + */ + contains(otherBounds: LatLngBounds): boolean; + + /** + * Returns true if the rectangle contains the given point. + */ + contains(latlng: LatLng): boolean; + + /** + * Returns true if the rectangle intersects the given bounds. + */ + intersects(otherBounds: LatLngBounds): boolean; + + /** + * Returns true if the rectangle is equivalent (within a small margin of error) + * to the given bounds. + */ + equals(otherBounds: LatLngBounds): boolean; + + /** + * Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' + * format. Useful for sending requests to web services that return geo data. + */ + toBBoxString(): string; + + /** + * Returns bigger bounds created by extending the current bounds by a given + * percentage in each direction. + */ + pad(bufferRatio: number): LatLngBounds; + + /** + * Returns true if the bounds are properly initialized. + */ + isValid(): boolean; + + } +} + +declare module L { + + /** + * Create a layer group, optionally given an initial set of layers. + */ + function layerGroup(layers?: ILayer[]): LayerGroup; + + export class LayerGroup extends Class implements ILayer { + + /** + * Create a layer group, optionally given an initial set of layers. + */ + constructor(layers?: ILayer[]); + + /** + * Adds the group of layers to the map. + */ + addTo(map: Map): LayerGroup; + + /** + * Adds a given layer to the group. + */ + addLayer(layer: ILayer): LayerGroup; + + /** + * Removes a given layer from the group. + */ + removeLayer(layer: ILayer): LayerGroup; + + /** + * Removes a given layer of the given id from the group. + */ + removeLayer(id: string): LayerGroup; + + /** + * Returns true if the given layer is currently added to the group. + */ + hasLayer(layer: ILayer): boolean; + + /** + * Returns the layer with the given id. + */ + getLayer(id: string): ILayer; + + /** + * Returns an array of all the layers added to the group. + */ + getLayers(): ILayer[]; + + /** + * Removes all the layers from the group. + */ + clearLayers(): LayerGroup; + + /** + * Iterates over the layers of the group, optionally specifying context of + * the iterator function. + */ + eachLayer(fn: (layer: ILayer) => void, context?: any): LayerGroup; + + /** + * Returns a GeoJSON representation of the layer group (GeoJSON FeatureCollection). + */ + toGeoJSON(): any; + + //////////// + //////////// + /** + * Should contain code that creates DOM elements for the overlay, adds them + * to map panes where they should belong and puts listeners on relevant map events. + * Called on map.addLayer(layer). + */ + onAdd(map: Map): void; + + /** + * Should contain all clean up code that removes the overlay's elements from + * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). + */ + onRemove(map: Map): void; + } +} + + +declare module L { + + export interface LayersOptions { + + /** + * The position of the control (one of the map corners). See control positions. + * + * Default value: 'topright'. + */ + position?: string; + + /** + * If true, the control will be collapsed into an icon and expanded on mouse hover + * or touch. + * + * Default value: true. + */ + collapsed?: boolean; + + /** + * If true, the control will assign zIndexes in increasing order to all of its + * layers so that the order is preserved when switching them on/off. + * + * Default value: true. + */ + autoZIndex?: boolean; + + } +} + +declare module L { + + export interface LeafletErrorEvent extends LeafletEvent { + + /** + * Error message. + */ + message: string; + + /** + * Error code (if applicable). + */ + code: number; + } +} + +declare module L { + + export interface LeafletEvent { + + /** + * The event type (e.g. 'click'). + */ + type: string; + + /** + * The object that fired the event. + */ + target: any; + } +} + +declare module L { + + export interface LeafletGeoJSONEvent extends LeafletEvent { + + /** + * The layer for the GeoJSON feature that is being added to the map. + */ + layer: ILayer; + + /** + * GeoJSON properties of the feature. + */ + properties: any; + + /** + * GeoJSON geometry type of the feature. + */ + geometryType: string; + + /** + * GeoJSON ID of the feature (if present). + */ + id: string; + } +} + +declare module L { + + export interface LeafletLayerEvent extends LeafletEvent { + + /** + * The layer that was added or removed. + */ + layer: ILayer; + } +} + +declare module L { + + export interface LeafletLocationEvent extends LeafletEvent { + + /** + * Detected geographical location of the user. + */ + latlng: LatLng; + + /** + * Geographical bounds of the area user is located in (with respect to the accuracy + * of location). + */ + bounds: LatLngBounds; + + /** + * Accuracy of location in meters. + */ + accuracy: number; + + /** + * Height of the position above the WGS84 ellipsoid in meters. + */ + altitude: number; + + /** + * Accuracy of altitude in meters. + */ + altitudeAccuracy: number; + + /** + * The direction of travel in degrees counting clockwise from true North. + */ + heading: number; + + /** + * Current velocity in meters per second. + */ + speed: number; + + /** + * The time when the position was acquired. + */ + timestamp: number; + + } +} + +declare module L { + + export interface LeafletMouseEvent extends LeafletEvent { + + /** + * The geographical point where the mouse event occured. + */ + latlng: LatLng; + + /** + * Pixel coordinates of the point where the mouse event occured relative to + * the map layer. + */ + layerPoint: Point; + + /** + * Pixel coordinates of the point where the mouse event occured relative to + * the map сontainer. + */ + containerPoint: Point; + + /** + * The original DOM mouse event fired by the browser. + */ + originalEvent: MouseEvent; + } +} + +declare module L { + + export interface LeafletPopupEvent extends LeafletEvent { + + /** + * The popup that was opened or closed. + */ + popup: Popup; + } +} + +declare module L { + + export interface LeafletResizeEvent extends LeafletEvent { + + /** + * The old size before resize event. + */ + oldSize: Point; + + /** + * The new size after the resize event. + */ + newSize: Point; + } +} + +declare module L { + + export interface LeafletTileEvent extends LeafletEvent { + + /** + * The tile element (image). + */ + tile: HTMLElement; + + /** + * The source URL of the tile. + */ + url: string; + } +} + +declare module L { + + export class LineUtil { + + /** + * Dramatically reduces the number of points in a polyline while retaining + * its shape and returns a new array of simplified points. Used for a huge performance + * boost when processing/displaying Leaflet polylines for each zoom level + * and also reducing visual noise. tolerance affects the amount of simplification + * (lesser value means higher quality but slower and with more points). Also + * released as a separated micro-library Simplify.js. + */ + static simplify(points: Point[], tolerance: number): Point[]; + + /** + * Returns the distance between point p and segment p1 to p2. + */ + static pointToSegmentDistance(p: Point, p1: Point, p2: Point): number; + + /** + * Returns the closest point from a point p on a segment p1 to p2. + */ + static closestPointOnSegment(p: Point, p1: Point, p2: Point): number; + + /** + * Clips the segment a to b by rectangular bounds (modifying the segment points + * directly!). Used by Leaflet to only show polyline points that are on the screen + * or near, increasing performance. + */ + static clipSegment(a: Point, b: Point, bounds: Bounds): void; + + } +} + +declare module L { + + export interface LocateOptions { + + /** + * If true, starts continous watching of location changes (instead of detecting + * it once) using W3C watchPosition method. You can later stop watching using + * map.stopLocate() method. + * + * Default value: false. + */ + watch?: boolean; + + /** + * If true, automatically sets the map view to the user location with respect + * to detection accuracy, or to world view if geolocation failed. + * + * Default value: false. + */ + setView?: boolean; + + /** + * The maximum zoom for automatic view setting when using `setView` option. + * + * Default value: Infinity. + */ + maxZoom?: number; + + /** + * Number of millisecond to wait for a response from geolocation before firing + * a locationerror event. + * + * Default value: 10000. + */ + timeout?: number; + + /** + * Maximum age of detected location. If less than this amount of milliseconds + * passed since last geolocation response, locate will return a cached location. + * + * Default value: 0. + */ + maximumAge?: number; + + /** + * Enables high accuracy, see description in the W3C spec. + * + * Default value: false. + */ + enableHighAccuracy?: boolean; + } +} + +declare module L { + + /** + * Instantiates a map object given a div element and optionally an + * object literal with map options described below. + */ + function map(id: HTMLElement, options?: MapOptions): Map; + + /** + * Instantiates a map object given a div element id and optionally an + * object literal with map options described below. + */ + function map(id: string, options?: MapOptions): Map; + + export class Map extends Class implements IEventPowered { + + /** + * Instantiates a map object given a div element and optionally an + * object literal with map options described below. + * + * @constructor + */ + constructor(id: HTMLElement, options?: MapOptions); + + /** + * Instantiates a map object given a div element id and optionally an + * object literal with map options described below. + * + * @constructor + */ + constructor(id: string, options?: MapOptions); + + // Methods for Modifying Map State + + /** + * Sets the view of the map (geographical center and zoom) with the given + * animation options. + */ + setView(center: LatLng, zoom: number, options?: ZoomPanOptions): Map; + + /** + * Sets the zoom of the map. + */ + setZoom(zoom: number, options?: ZoomOptions): Map; + + /** + * Increases the zoom of the map by delta (1 by default). + */ + zoomIn(delta?: number, options?: ZoomOptions): Map; + + /** + * Decreases the zoom of the map by delta (1 by default). + */ + zoomOut(delta?: number, options?: ZoomOptions): Map; + + /** + * Zooms the map while keeping a specified point on the map stationary + * (e.g. used internally for scroll zoom and double-click zoom). + */ + setZoomAround(latlng: LatLng, zoom: number, options?: ZoomOptions): Map; + + /** + * Sets a map view that contains the given geographical bounds with the maximum + * zoom level possible. + */ + fitBounds(bounds: LatLngBounds, options?: FitBoundsOptions): Map; + + /** + * Sets a map view that mostly contains the whole world with the maximum zoom + * level possible. + */ + fitWorld(options?: FitBoundsOptions): Map; + + /** + * Pans the map to a given center. Makes an animated pan if new center is not more + * than one screen away from the current one. + */ + panTo(latlng: LatLng, options?: PanOptions): Map; + + /** + * Pans the map to the closest view that would lie inside the given bounds (if + * it's not already). + */ + panInsideBounds(bounds: LatLngBounds): Map; + + /** + * Pans the map by a given number of pixels (animated). + */ + panBy(point: Point, options?: PanOptions): Map; + + /** + * Checks if the map container size changed and updates the map if so — call it + * after you've changed the map size dynamically, also animating pan by default. + * If options.pan is false, panning will not occur. + */ + invalidateSize(options: ZoomPanOptions): Map; + + /** + * Checks if the map container size changed and updates the map if so — call it + * after you've changed the map size dynamically, also animating pan by default. + */ + invalidateSize(animate: boolean): Map; + + /** + * Restricts the map view to the given bounds (see map maxBounds option), + * passing the given animation options through to `setView`, if required. + */ + setMaxBounds(bounds: LatLngBounds, options?: ZoomPanOptions): Map; + + /** + * Tries to locate the user using Geolocation API, firing locationfound event + * with location data on success or locationerror event on failure, and optionally + * sets the map view to the user location with respect to detection accuracy + * (or to the world view if geolocation failed). See Locate options for more + * details. + */ + locate(options?: LocateOptions): Map; + + /** + * Stops watching location previously initiated by map.locate({watch: true}) + * and aborts resetting the map view if map.locate was called with {setView: true}. + */ + stopLocate(): Map; + + /** + * Destroys the map and clears all related event listeners. + */ + remove(): Map; + + // Methods for Getting Map State + + /** + * Returns the geographical center of the map view. + */ + getCenter(): LatLng; + + /** + * Returns the current zoom of the map view. + */ + getZoom(): number; + + /** + * Returns the minimum zoom level of the map. + */ + getMinZoom(): number; + + /** + * Returns the maximum zoom level of the map. + */ + getMaxZoom(): number; + + /** + * Returns the LatLngBounds of the current map view. + */ + getBounds(): LatLngBounds; + + /** + * Returns the maximum zoom level on which the given bounds fit to the map view + * in its entirety. If inside (optional) is set to true, the method instead returns + * the minimum zoom level on which the map view fits into the given bounds in its + * entirety. + */ + getBoundsZoom(bounds: LatLngBounds, inside?: boolean): number; + + /** + * Returns the current size of the map container. + */ + getSize(): Point; + + /** + * Returns the bounds of the current map view in projected pixel coordinates + * (sometimes useful in layer and overlay implementations). + */ + getPixelBounds(): Bounds; + + /** + * Returns the projected pixel coordinates of the top left point of the map layer + * (useful in custom layer and overlay implementations). + */ + getPixelOrigin(): Point; + + // Methods for Layers and Controls + + /** + * Adds the given layer to the map. If optional insertAtTheBottom is set to true, + * the layer is inserted under all others (useful when switching base tile layers). + */ + addLayer(layer: ILayer, insertAtTheBottom?: boolean): Map; + + /** + * Removes the given layer from the map. + */ + removeLayer(layer: ILayer): Map; + + /** + * Returns true if the given layer is currently added to the map. + */ + hasLayer(layer: ILayer): boolean; + + /** + * Opens the specified popup while closing the previously opened (to make sure + * only one is opened at one time for usability). + */ + openPopup(popup: Popup): Map; + + /** + * Creates a popup with the specified options and opens it in the given point + * on a map. + */ + openPopup(html: string, latlng: LatLng, options?: PopupOptions): Map; + + /** + * Creates a popup with the specified options and opens it in the given point + * on a map. + */ + openPopup(el: HTMLElement, latlng: LatLng, options?: PopupOptions): Map; + + /** + * Closes the popup previously opened with openPopup (or the given one). + */ + closePopup(): Map; + + /** + * Adds the given control to the map. + */ + addControl(control: IControl): Map; + + /** + * Removes the given control from the map. + */ + removeControl(control: IControl): Map; + + // Conversion Methods + + /** + * Returns the map layer point that corresponds to the given geographical coordinates + * (useful for placing overlays on the map). + */ + latLngToLayerPoint(latlng: LatLng): Point; + + /** + * Returns the geographical coordinates of a given map layer point. + */ + layerPointToLatLng(point: Point): LatLng; + + /** + * Converts the point relative to the map container to a point relative to the + * map layer. + */ + containerPointToLayerPoint(point: Point): Point; + + /** + * Converts the point relative to the map layer to a point relative to the map + * container. + */ + layerPointToContainerPoint(point: Point): Point; + + /** + * Returns the map container point that corresponds to the given geographical + * coordinates. + */ + latLngToContainerPoint(latlng: LatLng): Point; + + /** + * Returns the geographical coordinates of a given map container point. + */ + containerPointToLatLng(point: Point): LatLng; + + /** + * Projects the given geographical coordinates to absolute pixel coordinates + * for the given zoom level (current zoom level by default). + */ + project(latlng: LatLng, zoom?: number): Point; + + /** + * Projects the given absolute pixel coordinates to geographical coordinates + * for the given zoom level (current zoom level by default). + */ + unproject(point: Point, zoom?: number): LatLng; + + /** + * Returns the pixel coordinates of a mouse click (relative to the top left corner + * of the map) given its event object. + */ + mouseEventToContainerPoint(event: LeafletMouseEvent): Point; + + /** + * Returns the pixel coordinates of a mouse click relative to the map layer given + * its event object. + */ + mouseEventToLayerPoint(event: LeafletMouseEvent): Point; + + /** + * Returns the geographical coordinates of the point the mouse clicked on given + * the click's event object. + */ + mouseEventToLatLng(event: LeafletMouseEvent): LatLng; + + // Other Methods + + /** + * Returns the container element of the map. + */ + getContainer(): HTMLElement; + + /** + * Returns an object with different map panes (to render overlays in). + */ + getPanes(): MapPanes; + + // REVIEW: Should we make it more flexible declaring parameter 'fn' as Function? + /** + * Runs the given callback when the map gets initialized with a place and zoom, + * or immediately if it happened already, optionally passing a function context. + */ + whenReady(fn: (map: Map) => void, context?: any): Map; + + // Properties + + /** + * Map dragging handler (by both mouse and touch). + */ + dragging: IHandler; + + /** + * Touch zoom handler. + */ + touchZoom: IHandler; + + /** + * Double click zoom handler. + */ + doubleClickZoom: IHandler; + + /** + * Scroll wheel zoom handler. + */ + scrollWheelZoom: IHandler; + + /** + * Box (shift-drag with mouse) zoom handler. + */ + boxZoom: IHandler; + + /** + * Keyboard navigation handler. + */ + keyboard: IHandler; + + /** + * Mobile touch hacks (quick tap and touch hold) handler. + */ + tap: IHandler; + + /** + * Zoom control. + */ + zoomControl: Control.Zoom; + + /** + * Attribution control. + */ + attributionControl: Control.Attribution; + + + //////////////// + //////////////// + addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Map; + addOneTimeEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Map; + removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): Map; + hasEventListeners(type: string): boolean; + fireEvent(type: string, data?: any): Map; + on(type: string, fn: (e: LeafletEvent) => void, context?: any): Map; + once(type: string, fn: (e: LeafletEvent) => void, context?: any): Map; + off(type: string, fn?: (e: LeafletEvent) => void, context?: any): Map; + fire(type: string, data?: any): Map;addEventListener(eventMap: any, context?: any): Map; + removeEventListener(eventMap?: any, context?: any): Map; + clearAllEventListeners(): Map + on(eventMap: any, context?: any): Map; + off(eventMap?: any, context?: any): Map; + } +} + +declare module L { + export interface MapOptions { + + // Map State Options + /** * Initial geographical center of the map. */ center?: LatLng; - + /** * Initial map zoom. */ zoom?: number; - + /** * Layers that will be added to the map initially. */ layers?: ILayer[]; - + /** * Minimum zoom level of the map. Overrides any minZoom set on map layers. */ minZoom?: number; - + /** * Maximum zoom level of the map. This overrides any maxZoom set on map layers. */ maxZoom?: number; - + /** * When this option is set, the map restricts the view to the given geographical * bounds, bouncing the user back when he tries to pan outside the view, and also @@ -37,166 +2343,199 @@ declare module L { * on the map size). To set the restriction dynamically, use setMaxBounds method */ maxBounds?: LatLngBounds; - + /** * Coordinate Reference System to use. Don't change this if you're not sure * what it means. + * + * Default value: L.CRS.EPSG3857. */ crs?: ICRS; + + // Interaction Options /** * Whether the map be draggable with mouse/touch or not. + * + * Default value: true. */ dragging?: boolean; - + /** * Whether the map can be zoomed by touch-dragging with two fingers. + * + * Default value: true. */ touchZoom?: boolean; - + /** * Whether the map can be zoomed by using the mouse wheel. + * + * Default value: true. */ scrollWheelZoom?: boolean; - + /** * Whether the map can be zoomed in by double clicking on it. + * + * Default value: true. */ doubleClickZoom?: boolean; /** * Whether the map can be zoomed to a rectangular area specified by dragging * the mouse while pressing shift. + * + * Default value: true. */ boxZoom?: boolean; + /** + * Enables mobile hacks for supporting instant taps (fixing 200ms click delay + * on iOS/Android) and touch holds (fired as contextmenu events). + * + * Default value: true. + */ + tap?: boolean; + + /** + * The max number of pixels a user can shift his finger during touch for it + * to be considered a valid tap. + * + * Default value: 15. + */ + tapTolerance?: number; + /** * Whether the map automatically handles browser window resize to update itself. + * + * Default value: true. */ trackResize?: boolean; - + /** * With this option enabled, the map tracks when you pan to another "copy" of * the world and seamlessly jumps to the original one so that all overlays like * markers and vector layers are still visible. + * + * Default value: false. */ worldCopyJump?: boolean; - + /** * Set it to false if you don't want popups to close when user clicks the map. + * + * Default value: true. */ closePopupOnClick?: boolean; + + // Keyboard Navigation Options /** * Makes the map focusable and allows users to navigate the map with keyboard * arrows and +/- keys. + * + * Default value: true. */ keyboard?: boolean; - + /** * Amount of pixels to pan when pressing an arrow key. + * + * Default value: 80. */ keyboardPanOffset?: number; - + /** * Number of zoom levels to change when pressing + or - key. + * + * Default value: 1. */ keyboardZoomOffset?: number; + + // Panning Inertia Options /** * If enabled, panning of the map will have an inertia effect where the map builds * momentum while dragging and continues moving in the same direction for some * time. Feels especially nice on touch devices. + * + * Default value: true. */ inertia?: boolean; - + /** * The rate with which the inertial movement slows down, in pixels/second2. + * + * Default value: 3000. */ inertiaDeceleration?: number; - + /** * Max speed of the inertial movement, in pixels/second. + * + * Default value: 1500. */ inertiaMaxSpeed?: number; - + /** * Amount of milliseconds that should pass between stopping the movement and - * releasing the mouse or touch to prevent inertial movement. 32 for touch devices - * and 14 for the rest by default. + * releasing the mouse or touch to prevent inertial movement. + * + * Default value: 32 for touch devices and 14 for the rest. */ inertiaThreshold?: number; + + // Control options /** * Whether the zoom control is added to the map by default. + * + * Default value: true. */ zoomControl?: boolean; - + /** * Whether the attribution control is added to the map by default. + * + * Default value: true. */ attributionControl?: boolean; + + // Animation options /** * Whether the tile fade animation is enabled. By default it's enabled in all * browsers that support CSS3 Transitions except Android. */ fadeAnimation?: boolean; - + /** * Whether the tile zoom animation is enabled. By default it's enabled in all * browsers that support CSS3 Transitions except Android. */ zoomAnimation?: boolean; + /** + * Won't animate zoom if the zoom difference exceeds this value. + * + * Default value: 4. + */ + zoomAnimationThreshold?: number; + /** * Whether markers animate their zoom with the zoom animation, if disabled * they will disappear for the length of the animation. By default it's enabled * in all browsers that support CSS3 Transitions except Android. */ markerZoomAnimation?: boolean; - - } - - export interface LocateOptions { - /** - * If true, starts continous watching of location changes (instead of detecting - * it once) using W3C watchPosition method. You can later stop watching using - * map.stopLocate() method. - */ - watch?: boolean; - - /** - * If true, automatically sets the map view to the user location with respect - * to detection accuracy, or to world view if geolocation failed. - */ - setView?: boolean; - - /** - * The maximum zoom for automatic view setting when using `setView` option. - */ - maxZoom?: number; - - /** - * Number of millisecond to wait for a response from geolocation before firing - * a locationerror event. - */ - timeout?: number; - - /** - * Maximum age of detected location. If less than this amount of milliseconds - * passed since last geolocation response, locate will return a cached location. - */ - maximumAge?: number; - - /** - * Enables high accuracy, see description in the W3C spec. - */ - enableHighAccuracy?: boolean; - } +} + +declare module L { export interface MapPanes { + /** * Pane that contains all other map panes. */ @@ -231,978 +2570,403 @@ declare module L { * Pane for popups. */ popupPane: HTMLElement; - } +} + +declare module L { - export class Map implements IEventPowered { - /** - * Instantiates a map object given a div element (or its id) and optionally an - * object literal with map options described below. - */ - constructor(id: HTMLElement, options?: MapOptions); + /** + * Instantiates a Marker object given a geographical point and optionally + * an options object. + */ + function marker(latlng: LatLng, options?: MarkerOptions): Marker; - /** - * Instantiates a map object given a div element (or its id) and optionally an - * object literal with map options described below. - */ - constructor(id: string, options?: MapOptions); + export class Marker extends Class implements ILayer, IEventPowered { - /** - * Sets the view of the map (geographical center and zoom). If forceReset is - * set to true, the map is reloaded even if it's eligible for pan or zoom animation - * (false by default). - */ - setView(center: LatLng, zoom: number, forceReset?: boolean): Map; - - /** - * Sets the zoom of the map. - */ - setZoom(zoom: number): Map; - - /** - * Increases the zoom of the map by delta (1 by default). - */ - zoomIn(delta?: number): Map; - - /** - * Decreases the zoom of the map by delta (1 by default). - */ - zoomOut(delta?: number): Map; - - /** - * Sets a map view that contains the given geographical bounds with the maximum - * zoom level possible. - */ - fitBounds(bounds: LatLngBounds): Map; - - /** - * Sets a map view that mostly contains the whole world with the maximum zoom - * level possible. - */ - fitWorld(): Map; - - /** - * Pans the map to a given center. Makes an animated pan if new center is not more - * than one screen away from the current one. - */ - panTo(latlng: LatLng): Map; - - /** - * Pans the map to the closest view that would lie inside the given bounds (if - * it's not already). - */ - panInsideBounds(bounds: LatLngBounds): Map; - - /** - * Pans the map by a given number of pixels (animated). - */ - panBy(point: Point): Map; - - /** - * Checks if the map container size changed and updates the map if so — call it - * after you've changed the map size dynamically. If animate is true, map animates - * the update. - */ - invalidateSize(animate?: boolean): Map; - - /** - * Restricts the map view to the given bounds (see map maxBounds option). - */ - setMaxBounds(bounds: LatLngBounds): Map; - - /** - * Tries to locate the user using Geolocation API, firing locationfound event - * with location data on success or locationerror event on failure, and optionally - * sets the map view to the user location with respect to detection accuracy - * (or to the world view if geolocation failed). See Locate options for more - * details. - */ - locate(options?: LocateOptions): Map; - - /** - * Stops watching location previously initiated by map.locate({watch: true}). - */ - stopLocate(): Map; - - /** - * Returns the geographical center of the map view. - */ - getCenter(): LatLng; - - /** - * Returns the current zoom of the map view. - */ - getZoom(): number; - - /** - * Returns the minimum zoom level of the map. - */ - getMinZoom(): number; - - /** - * Returns the maximum zoom level of the map. - */ - getMaxZoom(): number; - - /** - * Returns the LatLngBounds of the current map view. - */ - getBounds(): LatLngBounds; - - /** - * Returns the maximum zoom level on which the given bounds fit to the map view - * in its entirety. If inside (optional) is set to true, the method instead returns - * the minimum zoom level on which the map view fits into the given bounds in its - * entirety. - */ - getBoundsZoom(bounds: LatLngBounds, inside?: boolean): number; - - /** - * Returns the current size of the map container. - */ - getSize(): Point; - - /** - * Returns the bounds of the current map view in projected pixel coordinates - * (sometimes useful in layer and overlay implementations). - */ - getPixelBounds(): Bounds; - - /** - * Returns the projected pixel coordinates of the top left point of the map layer - * (useful in custom layer and overlay implementations). - */ - getPixelOrigin(): Point; - - /** - * Adds the given layer to the map. If optional insertAtTheBottom is set to true, - * the layer is inserted under all others (useful when switching base tile layers). - */ - addLayer(layer: ILayer, insertAtTheBottom?: boolean): Map; - - /** - * Removes the given layer from the map. - */ - removeLayer(layer: ILayer): Map; - - /** - * Returns true if the given layer is currently added to the map. - */ - hasLayer(layer: ILayer): boolean; - - /** - * Opens the specified popup while closing the previously opened (to make sure - * only one is opened at one time for usability). - */ - openPopup(popup: Popup): Map; - - /** - * Closes the popup opened with openPopup. - */ - closePopup(): Map; - - /** - * Adds the given control to the map. - */ - addControl(control: IControl): Map; - - /** - * Removes the given control from the map. - */ - removeControl(control: IControl): Map; - - /** - * Returns the map layer point that corresponds to the given geographical coordinates - * (useful for placing overlays on the map). - */ - latLngToLayerPoint(latlng: LatLng): Point; - - /** - * Returns the geographical coordinates of a given map layer point. - */ - layerPointToLatLng(point: Point): LatLng; - - /** - * Converts the point relative to the map container to a point relative to the - * map layer. - */ - containerPointToLayerPoint(point: Point): Point; - - /** - * Converts the point relative to the map layer to a point relative to the map - * container. - */ - layerPointToContainerPoint(point: Point): Point; - - /** - * Returns the map container point that corresponds to the given geographical - * coordinates. - */ - latLngToContainerPoint(latlng: LatLng): Point; - - /** - * Returns the geographical coordinates of a given map container point. - */ - containerPointToLatLng(point: Point): LatLng; - - /** - * Projects the given geographical coordinates to absolute pixel coordinates - * for the given zoom level (current zoom level by default). - */ - project(latlng: LatLng, zoom?: number): Point; - - /** - * Projects the given absolute pixel coordinates to geographical coordinates - * for the given zoom level (current zoom level by default). - */ - unproject(point: Point, zoom?: number): LatLng; - - /** - * Returns the pixel coordinates of a mouse click (relative to the top left corner - * of the map) given its event object. - */ - mouseEventToContainerPoint(event: LeafletMouseEvent): Point; - - /** - * Returns the pixel coordinates of a mouse click relative to the map layer given - * its event object. - */ - mouseEventToLayerPoint(event: LeafletMouseEvent): Point; - - /** - * Returns the geographical coordinates of the point the mouse clicked on given - * the click's event object. - */ - mouseEventToLatLng(event: LeafletMouseEvent): LatLng; - - /** - * Returns the container element of the map. - */ - getContainer(): HTMLElement; - - /** - * Returns an object with different map panes (to render overlays in). - */ - getPanes(): MapPanes; - - /** - * Runs the given callback when the map gets initialized with a place and zoom, - * or immediately if it happened already, optionally passing a function context. - */ - whenReady(fn: Function, context?: any): Map; - - /** - * Map dragging handler (by both mouse and touch). - */ - dragging: IHandler; - - /** - * Touch zoom handler. - */ - touchZoom: IHandler; - - /** - * Double click zoom handler. - */ - doubleClickZoom: IHandler; - - /** - * Scroll wheel zoom handler. - */ - scrollWheelZoom: IHandler; - - /** - * Box (shift-drag with mouse) zoom handler. - */ - boxZoom: IHandler; - - /** - * Keyboard navigation handler. - */ - keyboard: IHandler; - - /** - * Zoom control. - */ - zoomControl: Zoom; - - /** - * Attribution control. - */ - attributionControl: Attribution; - - //////////// - //// IEventPowered members - //////////// - - addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - addEventListener(eventMap: any, context?: any): IEventPowered; - removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - removeEventListener(eventMap: any, context?: any): IEventPowered; - hasEventListeners(type: string): boolean; - fireEvent(type: string, data?: any): IEventPowered; - on(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - on(eventMap: any, context?: any): IEventPowered; - off(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - off(eventMap: any, context?: any): IEventPowered; - fire(type: string, data?: any): IEventPowered; - } - - export interface MarkerOptions { - /** - * Icon class to use for rendering the marker. See Icon documentation for details - * on how to customize the marker icon. Set to new L.Icon.Default() by default. - */ - icon?: Icon; - - /** - * If false, the marker will not emit mouse events and will act as a part of the - * underlying map. - */ - clickable?: boolean; - - /** - * Whether the marker is draggable with mouse/touch or not. - */ - draggable?: boolean; - - /** - * Text for the browser tooltip that appear on marker hover (no tooltip by default). - */ - title?: string; - - /** - * By default, marker images zIndex is set automatically based on its latitude. - * You this option if you want to put the marker on top of all others (or below), - * specifying a high value like 1000 (or high negative value, respectively). - */ - zIndexOffset?: number; - - /** - * The opacity of the marker. - */ - opacity?: number; - - /** - * If true, the marker will get on top of others when you hover the mouse over it. - */ - riseOnHover?: boolean; - - /** - * The z-index offset used for the riseOnHover feature. - */ - riseOffset?: number; - - } - - export class Marker implements ILayer, IEventPowered { /** * Instantiates a Marker object given a geographical point and optionally * an options object. */ constructor(latlng: LatLng, options?: MarkerOptions); - + /** * Adds the marker to the map. */ addTo(map: Map): Marker; - + /** * Returns the current geographical position of the marker. */ getLatLng(): LatLng; - + /** * Changes the marker position to the given point. */ setLatLng(latlng: LatLng): Marker; - + /** * Changes the marker icon. */ setIcon(icon: Icon): Marker; - + /** * Changes the zIndex offset of the marker. */ setZIndexOffset(offset: number): Marker; - + /** * Changes the opacity of the marker. */ setOpacity(opacity: number): Marker; - + /** * Updates the marker position, useful if coordinates of its latLng object * were changed directly. */ update(): Marker; + + /** + * Binds a popup with a particular HTML content to a click on this marker. You + * can also open the bound popup with the Marker openPopup method. + */ + bindPopup(html: string, options?: PopupOptions): Marker; + + /** + * Binds a popup with a particular HTML content to a click on this marker. You + * can also open the bound popup with the Marker openPopup method. + */ + bindPopup(el: HTMLElement, options?: PopupOptions): Marker; /** * Binds a popup with a particular HTML content to a click on this marker. You * can also open the bound popup with the Marker openPopup method. */ - bindPopup(htmlContent: string, options?: PopupOptions): Marker; + bindPopup(popup: Popup, options?: PopupOptions): Marker; /** * Unbinds the popup previously bound to the marker with bindPopup. */ unbindPopup(): Marker; - + /** * Opens the popup previously bound by the bindPopup method. */ openPopup(): Marker; - + /** * Closes the bound popup of the marker if it's opened. */ closePopup(): Marker; - //////////// - //// ILayer members - //////////// + /** + * Toggles the popup previously bound by the bindPopup method. + */ + togglePopup(): Marker; + /** + * Sets an HTML content of the popup of this marker. + */ + setPopupContent(html: string, options?: PopupOptions): Marker; + + /** + * Sets an HTML content of the popup of this marker. + */ + setPopupContent(el: HTMLElement, options?: PopupOptions): Marker; + + /** + * Returns a GeoJSON representation of the marker (GeoJSON Point Feature). + */ + toGeoJSON(popup: Popup, options?: PopupOptions): any; + + //////////// + //////////// /** * Should contain code that creates DOM elements for the overlay, adds them * to map panes where they should belong and puts listeners on relevant map events. * Called on map.addLayer(layer). */ onAdd(map: Map): void; - + /** * Should contain all clean up code that removes the overlay's elements from * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). */ onRemove(map: Map): void; - - //////////// - //// IEventPowered members - //////////// - - addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - addEventListener(eventMap: any, context?: any): IEventPowered; - removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - removeEventListener(eventMap: any, context?: any): IEventPowered; + + //////////////// + //////////////// + addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Marker; + addOneTimeEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Marker; + removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): Marker; hasEventListeners(type: string): boolean; - fireEvent(type: string, data?: any): IEventPowered; - on(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - on(eventMap: any, context?: any): IEventPowered; - off(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - off(eventMap: any, context?: any): IEventPowered; - fire(type: string, data?: any): IEventPowered; + fireEvent(type: string, data?: any): Marker; + on(type: string, fn: (e: LeafletEvent) => void, context?: any): Marker; + once(type: string, fn: (e: LeafletEvent) => void, context?: any): Marker; + off(type: string, fn?: (e: LeafletEvent) => void, context?: any): Marker; + fire(type: string, data?: any): Marker; + addEventListener(eventMap: any, context?: any): Marker; + removeEventListener(eventMap?: any, context?: any): Marker; + clearAllEventListeners(): Marker + on(eventMap: any, context?: any): Marker; + off(eventMap?: any, context?: any): Marker; } +} + +declare module L { - export interface PopupOptions { - /** - * Max width of the popup. - */ - maxWidth?: number; - - /** - * Min width of the popup. - */ - minWidth?: number; - - /** - * If set, creates a scrollable container of the given height inside a popup - * if its content exceeds it. - */ - maxHeight?: number; - - /** - * Set it to false if you don't want the map to do panning animation to fit the opened - * popup. - */ - autoPan?: boolean; - - /** - * Controls the presense of a close button in the popup. - */ - closeButton?: boolean; - - /** - * The offset of the popup position. Useful to control the anchor of the popup - * when opening it on some overlays. - */ - offset?: Point; - - /** - * The margin between the popup and the edges of the map view after autopanning - * was performed. - */ - autoPanPadding?: Point; - - /** - * Whether to animate the popup on zoom. Disable it if you have problems with - * Flash content inside popups. - */ - zoomAnimation?: boolean; - - } - - export class Popup implements ILayer { - /** - * Instantiates a Popup object given an optional options object that describes - * its appearance and location and an optional object that is used to tag the - * popup with a reference to the source object to which it refers. - */ - constructor(options?: PopupOptions, source?: any); - - /** - * Adds the popup to the map. - */ - addTo(map: Map): Popup; - - /** - * Adds the popup to the map and closes the previous one. The same as map.openPopup(popup). - */ - openOn(map: Map): Popup; - - /** - * Sets the geographical point where the popup will open. - */ - setLatLng(latlng: LatLng): Popup; - - /** - * Sets the HTML content of the popup. - */ - setContent(htmlContent: string): Popup; - - //////////// - //// ILayer members - //////////// - - /** - * Should contain code that creates DOM elements for the overlay, adds them - * to map panes where they should belong and puts listeners on relevant map events. - * Called on map.addLayer(layer). - */ - onAdd(map: Map): void; - - /** - * Should contain all clean up code that removes the overlay's elements from - * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). - */ - onRemove(map: Map): void; - - } - - export interface TileLayerOptions { - /** - * Minimum zoom number. - */ - minZoom?: number; - - /** - * Maximum zoom number. - */ - maxZoom?: number; - - /** - * Tile size (width and height in pixels, assuming tiles are square). - */ - tileSize?: number; - - /** - * Subdomains of the tile service. Can be passed in the form of one string (where - * each letter is a subdomain name) or an array of strings. - */ - subdomains?: any; - - /** - * URL to the tile image to show in place of the tile that failed to load. - */ - errorTileUrl?: string; - - /** - * e.g. "© CloudMade" — the string used by the attribution control, describes - * the layer data. - */ - attribution?: string; - - /** - * If true, inverses Y axis numbering for tiles (turn this on for TMS services). - */ - tms?: boolean; - - /** - * If set to true, the tile coordinates won't be wrapped by world width (-180 - * to 180 longitude) or clamped to lie within world height (-90 to 90). Use this - * if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor - * or photo maps). - */ - continuousWorld?: boolean; - - /** - * If set to true, the tiles just won't load outside the world width (-180 to 180 - * longitude) instead of repeating. - */ - noWrap?: boolean; - - /** - * The zoom number used in tile URLs will be offset with this value. - */ - zoomOffset?: number; - - /** - * If set to true, the zoom number used in tile URLs will be reversed (maxZoom - * - zoom instead of zoom) - */ - zoomReverse?: boolean; - - /** - * The opacity of the tile layer. - */ - opacity?: number; - - /** - * The explicit zIndex of the tile layer. Not set by default. - */ - zIndex?: number; - - /** - * If true, all the tiles that are not visible after panning are removed (for - * better performance). true by default on mobile WebKit, otherwise false. - */ - unloadInvisibleTiles?: boolean; - - /** - * If false, new tiles are loaded during panning, otherwise only after it (for - * better performance). true by default on mobile WebKit, otherwise false. - */ - updateWhenIdle?: boolean; - - /** - * If true and user is on a retina display, it will request four tiles of half the - * specified size and a bigger zoom level in place of one to utilize the high resolution. - */ - detectRetina?: boolean; - - /** - * If true, all the tiles that are not visible after panning are placed in a reuse - * queue from which they will be fetched when new tiles become visible (as opposed - * to dynamically creating new ones). This will in theory keep memory usage - * low and eliminate the need for reserving new memory whenever a new tile is - * needed. - */ - reuseTiles?: boolean; - - } - - export class TileLayer implements ILayer, IEventPowered { - /** - * Instantiates a tile layer object given a URL template and optionally an options - * object. - */ - constructor(urlTemplate: string, options?: TileLayerOptions); - - /** - * Adds the layer to the map. - */ - addTo(map: Map): TileLayer; - - /** - * Brings the tile layer to the top of all tile layers. - */ - bringToFront(): TileLayer; + export interface MarkerOptions { /** - * Brings the tile layer to the bottom of all tile layers. + * Icon class to use for rendering the marker. See Icon documentation for details + * on how to customize the marker icon. + * + * Default value: new L.Icon.Default(). */ - bringToBack(): TileLayer; - - /** - * Changes the opacity of the tile layer. - */ - setOpacity(opacity: number): TileLayer; - - /** - * Sets the zIndex of the tile layer. - */ - setZIndex(zIndex: number): TileLayer; - - /** - * Causes the layer to clear all the tiles and request them again. - */ - redraw(): TileLayer; - - /** - * Updates the layer's URL template and redraws it. - */ - setUrl(urlTemplate: string): TileLayer; - - static WMS: new () => WMS; - - static Canvas: new () => Canvas; - - //////////// - //// ILayer members - //////////// - - /** - * Should contain code that creates DOM elements for the overlay, adds them - * to map panes where they should belong and puts listeners on relevant map events. - * Called on map.addLayer(layer). - */ - onAdd(map: Map): void; - - /** - * Should contain all clean up code that removes the overlay's elements from - * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). - */ - onRemove(map: Map): void; - - //////////// - //// IEventPowered members - //////////// - - addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - addEventListener(eventMap: any, context?: any): IEventPowered; - removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - removeEventListener(eventMap: any, context?: any): IEventPowered; - hasEventListeners(type: string): boolean; - fireEvent(type: string, data?: any): IEventPowered; - on(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - on(eventMap: any, context?: any): IEventPowered; - off(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - off(eventMap: any, context?: any): IEventPowered; - fire(type: string, data?: any): IEventPowered; - } - - export interface WMSOptions { - /** - * (required) Comma-separated list of WMS layers to show. - */ - layers?: string; - - /** - * Comma-separated list of WMS styles. - */ - styles?: string; - - /** - * WMS image format (use 'image/png' for layers with transparency). - */ - format?: string; - - /** - * If true, the WMS service will return images with transparency. - */ - transparent?: boolean; - - /** - * Version of the WMS service to use. - */ - version?: string; - - } - - export class WMS { - /** - * Instantiates a WMS tile layer object given a base URL of the WMS service and - * a WMS parameters/options object. - */ - constructor(baseUrl: string, options: WMSOptions); - - /** - * Merges an object with the new parameters and re-requests tiles on the current - * screen (unless noRedraw was set to true). - */ - setParams(params: WMS, noRedraw?: boolean): WMS; - - } - - export class Canvas { - /** - * Instantiates a Canvas tile layer object given an options object (optionally). - */ - constructor(options?: TileLayerOptions); - - /** - * You need to define this method after creating the instance to draw tiles; - * canvas is the actual canvas tile on which you can draw, tilePoint represents - * the tile numbers, and zoom is the current zoom. - */ - drawTile(canvas: HTMLCanvasElement, tilePoint: Point, zoom: number): Canvas; - - /** - * Calling redraw will cause the drawTile method to be called for all tiles. - * May be used for updating dynamic content drawn on the Canvas - */ - redraw(): Canvas; - - } - - export interface ImageOverlayOptions { - /** - * The opacity of the image overlay. - */ - opacity?: number; - - } - - export class ImageOverlay implements ILayer { - /** - * Instantiates an image overlay object given the URL of the image and the geographical - * bounds it is tied to. - */ - constructor(imageUrl: string, bounds: LatLngBounds, options?: ImageOverlayOptions); - - /** - * Adds the overlay to the map. - */ - addTo(map: Map): ImageOverlay; - - /** - * Sets the opacity of the overlay. - */ - setOpacity(opacity: number): ImageOverlay; - - /** - * Brings the layer to the top of all overlays. - */ - bringToFront(): ImageOverlay; - - /** - * Brings the layer to the bottom of all overlays. - */ - bringToBack(): ImageOverlay; - - //////////// - //// ILayer members - //////////// - - /** - * Should contain code that creates DOM elements for the overlay, adds them - * to map panes where they should belong and puts listeners on relevant map events. - * Called on map.addLayer(layer). - */ - onAdd(map: Map): void; - - /** - * Should contain all clean up code that removes the overlay's elements from - * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). - */ - onRemove(map: Map): void; - - } - - export interface PathOptions { - /** - * Whether to draw stroke along the path. Set it to false to disable borders on - * polygons or circles. - */ - stroke?: boolean; - - /** - * Stroke color. - */ - color?: string; - - /** - * Stroke width in pixels. - */ - weight?: number; - - /** - * Stroke opacity. - */ - opacity?: number; - - /** - * Whether to fill the path with color. Set it to false to disable filling on polygons - * or circles. - */ - fill?: boolean; - - /** - * Fill color. - */ - fillColor?: string; - - /** - * Fill opacity. - */ - fillOpacity?: number; - - /** - * A string that defines the stroke dash pattern. Doesn't work on canvas-powered - * layers (e.g. Android 2). - */ - dashArray?: string; - + icon?: Icon; + /** - * If false, the vector will not emit mouse events and will act as a part of the + * If false, the marker will not emit mouse events and will act as a part of the * underlying map. + * + * Default value: true. */ clickable?: boolean; + + /** + * Whether the marker is draggable with mouse/touch or not. + * + * Default value: false. + */ + draggable?: boolean; + /** + * Whether the marker can be tabbed to with a keyboard and clicked by pressing enter. + * + * Default value: true. + */ + keyboard?: boolean; + + /** + * Text for the browser tooltip that appear on marker hover (no tooltip by default). + * + * Default value: ''. + */ + title?: string; + + /** + * By default, marker images zIndex is set automatically based on its latitude. + * You this option if you want to put the marker on top of all others (or below), + * specifying a high value like 1000 (or high negative value, respectively). + * + * Default value: 0. + */ + zIndexOffset?: number; + + /** + * The opacity of the marker. + * + * Default value: 1.0. + */ + opacity?: number; + + /** + * If true, the marker will get on top of others when you hover the mouse over it. + * + * Default value: false. + */ + riseOnHover?: boolean; + + /** + * The z-index offset used for the riseOnHover feature. + * + * Default value: 250. + */ + riseOffset?: number; } +} + +declare module L { + + /** + * Instantiates a multi-polyline object given an array of latlngs arrays (one + * for each individual polygon) and optionally an options object (the same + * as for MultiPolyline). + */ + function multiPolygon(latlngs: LatLng[][], options?: PolylineOptions): MultiPolygon; + + export class MultiPolygon extends FeatureGroup { + + /** + * Instantiates a multi-polyline object given an array of latlngs arrays (one + * for each individual polygon) and optionally an options object (the same + * as for MultiPolyline). + */ + constructor(latlngs: LatLng[][], options?: PolylineOptions); + + /** + * Replace all polygons and their paths with the given array of arrays + * of geographical points. + */ + setLatLngs(latlngs: LatLng[][]): MultiPolygon; + + /** + * Returns an array of arrays of geographical points in each polygon. + */ + getLatLngs(): LatLng[][]; + + /** + * Returns a GeoJSON representation of the multipolygon (GeoJSON MultiPolygon Feature). + */ + toGeoJSON(): any; + } +} + +declare module L { + + /** + * Instantiates a multi-polyline object given an array of arrays of geographical + * points (one for each individual polyline) and optionally an options object. + */ + function multiPolyline(latlngs: LatLng[][], options?: PolylineOptions): MultiPolyline; + + export class MultiPolyline extends FeatureGroup { + + /** + * Instantiates a multi-polyline object given an array of arrays of geographical + * points (one for each individual polyline) and optionally an options object. + */ + constructor(latlngs: LatLng[][], options?: PolylineOptions); + + /** + * Replace all polygons and their paths with the given array of arrays + * of geographical points. + */ + setLatLngs(latlngs: LatLng[][]): MultiPolyline; + + /** + * Returns an array of arrays of geographical points in each polygon. + */ + getLatLngs(): LatLng[][]; + + /** + * Returns a GeoJSON representation of the multipolyline (GeoJSON MultiLineString Feature). + */ + toGeoJSON(): any; + } +} + +declare module L { + + export interface PanOptions { + + /** + * If true, panning will always be animated if possible. If false, it will not + * animate panning, either resetting the map view if panning more than a screen + * away, or just setting a new offset for the map pane (except for `panBy` + * which always does the latter). + */ + animate?: boolean; + + /** + * Duration of animated panning. + * + * Default value: 0.25. + */ + duration?: number; + + /** + * The curvature factor of panning animation easing (third parameter of the Cubic + * Bezier curve). 1.0 means linear animation, the less the more bowed the curve. + * + * Default value: 0.25. + */ + easeLinearity?: number; + + /** + * If true, panning won't fire movestart event on start (used internally for panning inertia). + * + * Default value: false. + */ + noMoveStart?: boolean; + } +} + +declare module L { + + export class Path extends Class implements ILayer, IEventPowered { - export class Path implements ILayer, IEventPowered { /** * Adds the layer to the map. */ addTo(map: Map): Path; + + /** + * Binds a popup with a particular HTML content to a click on this path. + */ + bindPopup(html: string, options?: PopupOptions): Path; + + /** + * Binds a popup with a particular HTML content to a click on this path. + */ + bindPopup(el: HTMLElement, options?: PopupOptions): Path; /** * Binds a popup with a particular HTML content to a click on this path. */ - bindPopup(htmlContent: string, options?: PopupOptions): Path; + bindPopup(popup: Popup, options?: PopupOptions): Path; /** * Unbinds the popup previously bound to the path with bindPopup. */ unbindPopup(): Path; - + /** * Opens the popup previously bound by the bindPopup method in the given point, * or in one of the path's points if not specified. */ openPopup(latlng?: LatLng): Path; - + /** * Closes the path's bound popup if it is opened. */ closePopup(): Path; - + /** * Changes the appearance of a Path based on the options in the Path options object. */ setStyle(object: PathOptions): Path; - + /** * Returns the LatLngBounds of the path. */ getBounds(): LatLngBounds; - + /** * Brings the layer to the top of all path layers. */ bringToFront(): Path; - + /** * Brings the layer to the bottom of all path layers. */ bringToBack(): Path; - + /** * Redraws the layer. Sometimes useful after you changed the coordinates that * the path uses. */ redraw(): Path; - + /** * True if SVG is used for vector rendering (true for most modern browsers). */ static SVG: boolean; - + /** * True if VML is used for vector rendering (IE 6-8). */ static VML: boolean; - + /** * True if Canvas is used for vector rendering (Android 2). You can also force * this by setting global variable L_PREFER_CANVAS to true before the Leaflet @@ -1211,7 +2975,7 @@ declare module L { * a bug that causes removing such layers to be extremely slow. */ static CANVAS: boolean; - + /** * How much to extend the clip area around the map view (relative to its size, * e.g. 0.5 is half the screen in each direction). Smaller values mean that you @@ -1221,503 +2985,124 @@ declare module L { static CLIP_PADDING: number; //////////// - //// ILayer members //////////// - /** * Should contain code that creates DOM elements for the overlay, adds them * to map panes where they should belong and puts listeners on relevant map events. * Called on map.addLayer(layer). */ onAdd(map: Map): void; - + /** * Should contain all clean up code that removes the overlay's elements from * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). */ onRemove(map: Map): void; - - //////////// - //// IEventPowered members - //////////// - - addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - addEventListener(eventMap: any, context?: any): IEventPowered; - removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - removeEventListener(eventMap: any, context?: any): IEventPowered; + + //////////////// + //////////////// + addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Path; + addOneTimeEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): Path; + removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): Path; hasEventListeners(type: string): boolean; - fireEvent(type: string, data?: any): IEventPowered; - on(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - on(eventMap: any, context?: any): IEventPowered; - off(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - off(eventMap: any, context?: any): IEventPowered; - fire(type: string, data?: any): IEventPowered; + fireEvent(type: string, data?: any): Path; + on(type: string, fn: (e: LeafletEvent) => void, context?: any): Path; + once(type: string, fn: (e: LeafletEvent) => void, context?: any): Path; + off(type: string, fn?: (e: LeafletEvent) => void, context?: any): Path; + fire(type: string, data?: any): Path; + addEventListener(eventMap: any, context?: any): Path; + removeEventListener(eventMap?: any, context?: any): Path; + clearAllEventListeners(): Path + on(eventMap: any, context?: any): Path; + off(eventMap?: any, context?: any): Path; } +} + +declare module L { - export interface PolylineOptions { - /** - * How much to simplify the polyline on each zoom level. More means better performance - * and smoother look, and less means more accurate representation. - */ - smoothFactor?: number; + export interface PathOptions { /** - * Disabled polyline clipping. + * Whether to draw stroke along the path. Set it to false to disable borders on + * polygons or circles. + * + * Default value: true. */ - noClip?: boolean; - - } - - export class Polyline extends Path { + stroke?: boolean; + /** - * Instantiates a polyline object given an array of geographical points and - * optionally an options object. + * Stroke color. + * + * Default value: '#03f'. */ - constructor(latlngs: LatLng[], options?: PolylineOptions); - + color?: string; + /** - * Adds a given point to the polyline. + * Stroke width in pixels. + * + * Default value: 5. */ - addLatLng(latlng: LatLng): Polyline; - + weight?: number; + /** - * Replaces all the points in the polyline with the given array of geographical - * points. + * Stroke opacity. + * + * Default value: 0.5. */ - setLatLngs(latlngs: LatLng[]): Polyline; - + opacity?: number; + /** - * Returns an array of the points in the path. + * Whether to fill the path with color. Set it to false to disable filling on polygons + * or circles. */ - getLatLngs(): LatLng[]; - + fill?: boolean; + /** - * Allows adding, removing or replacing points in the polyline. Syntax is the - * same as in Array#splice. Returns the array of removed points (if any). + * Fill color. + * + * Default value: same as color. */ - spliceLatLngs(index: number, pointsToRemove: number, ...latlngs: LatLng[]): LatLng[]; - + fillColor?: string; + /** - * Returns the LatLngBounds of the polyline. + * Fill opacity. + * + * Default value: 0.2. */ - getBounds(): LatLngBounds; - - } - - export class MultiPolyline extends FeatureGroup { + fillOpacity?: number; + /** - * Instantiates a multi-polyline object given an array of arrays of geographical - * points (one for each individual polyline) and optionally an options object. + * A string that defines the stroke dash pattern. Doesn't work on canvas-powered + * layers (e.g. Android 2). */ - constructor(latlngs: LatLng[][], options?: PolylineOptions); - - } - - export class Polygon extends Polyline { + dashArray?: string; + /** - * Instantiates a polygon object given an array of geographical points and - * optionally an options object (the same as for Polyline). You can also create - * a polygon with holes by passing an array of arrays of latlngs, with the first - * latlngs array representing the exterior ring while the remaining represent - * the holes inside. + * If false, the vector will not emit mouse events and will act as a part of the + * underlying map. + * + * Default value: true. */ - constructor(latlngs: LatLng[], options?: PolylineOptions); - - } - - export class MultiPolygon extends FeatureGroup { - /** - * Instantiates a multi-polyline object given an array of latlngs arrays (one - * for each individual polygon) and optionally an options object (the same - * as for MultiPolyline). - */ - constructor(latlngs: LatLng[][], options?: PolylineOptions); - - } - - export class Rectangle extends Polygon { - /** - * Instantiates a rectangle object with the given geographical bounds and - * optionally an options object. - */ - constructor(bounds: LatLngBounds, options?: PathOptions); - - /** - * Redraws the rectangle with the passed bounds. - */ - setBounds(bounds: LatLngBounds): Rectangle; - - } - - export class Circle extends Path { - /** - * Instantiates a circle object given a geographical point, a radius in meters - * and optionally an options object. - */ - constructor(latlng: LatLng, radius: number, options?: PathOptions); - - /** - * Returns the current geographical position of the circle. - */ - getLatLng(): LatLng; - - /** - * Returns the current radius of a circle. Units are in meters. - */ - getRadius(): number; - - /** - * Sets the position of a circle to a new location. - */ - setLatLng(latlng: LatLng): Circle; - - /** - * Sets the radius of a circle. Units are in meters. - */ - setRadius(radius: number): Circle; - - } - - export class CircleMarker extends Circle { - /** - * Instantiates a circle marker given a geographical point and optionally - * an options object. The default radius is 10 and can be altered by passing a - * "radius" member in the path options object. - */ - constructor(latlng: LatLng, options?: PathOptions); - - /** - * Sets the position of a circle marker to a new location. - */ - setLatLng(latlng: LatLng): CircleMarker; - - /** - * Sets the radius of a circle marker. Units are in pixels. - */ - setRadius(radius: number): CircleMarker; - - } - - export class LayerGroup implements ILayer { - /** - * Create a layer group, optionally given an initial set of layers. - */ - constructor(layers?: ILayer[]); - - /** - * Adds the group of layers to the map. - */ - addTo(map: Map): LayerGroup; - - /** - * Adds a given layer to the group. - */ - addLayer(layer: ILayer): LayerGroup; - - /** - * Removes a given layer from the group. - */ - removeLayer(layer: ILayer): LayerGroup; - - /** - * Removes all the layers from the group. - */ - clearLayers(): LayerGroup; - - /** - * Iterates over the layers of the group, optionally specifying context of - * the iterator function. - */ - eachLayer(fn: (layer: ILayer) => void, context?: any): LayerGroup; - - //////////// - //// ILayer members - //////////// - - /** - * Should contain code that creates DOM elements for the overlay, adds them - * to map panes where they should belong and puts listeners on relevant map events. - * Called on map.addLayer(layer). - */ - onAdd(map: Map): void; - - /** - * Should contain all clean up code that removes the overlay's elements from - * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). - */ - onRemove(map: Map): void; - - } - - export class FeatureGroup extends LayerGroup implements ILayer, IEventPowered { - /** - * Create a layer group, optionally given an initial set of layers. - */ - constructor(layers?: ILayer[]); - - /** - * Binds a popup with a particular HTML content to a click on any layer from the - * group that has a bindPopup method. - */ - bindPopup(htmlContent: string, options?: PopupOptions): FeatureGroup; - - /** - * Returns the LatLngBounds of the Feature Group (created from bounds and coordinates - * of its children). - */ - getBounds(): LatLngBounds; - - /** - * Sets the given path options to each layer of the group that has a setStyle method. - */ - setStyle(style: PathOptions): FeatureGroup; - - /** - * Brings the layer group to the top of all other layers. - */ - bringToFront(): FeatureGroup; - - /** - * Brings the layer group to the bottom of all other layers. - */ - bringToBack(): FeatureGroup; - - //////////// - //// ILayer members - //////////// - - /** - * Should contain code that creates DOM elements for the overlay, adds them - * to map panes where they should belong and puts listeners on relevant map events. - * Called on map.addLayer(layer). - */ - onAdd(map: Map): void; - - /** - * Should contain all clean up code that removes the overlay's elements from - * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). - */ - onRemove(map: Map): void; - - //////////// - //// IEventPowered members - //////////// - - addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - addEventListener(eventMap: any, context?: any): IEventPowered; - removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - removeEventListener(eventMap: any, context?: any): IEventPowered; - hasEventListeners(type: string): boolean; - fireEvent(type: string, data?: any): IEventPowered; - on(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - on(eventMap: any, context?: any): IEventPowered; - off(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - off(eventMap: any, context?: any): IEventPowered; - fire(type: string, data?: any): IEventPowered; - } - - export interface GeoJSONOptions { - /** - * Function that will be used for creating layers for GeoJSON points (if not - * specified, simple markers will be created). - */ - pointToLayer?: (featureData: any, latlng: LatLng) => ILayer; - - /** - * Function that will be used to get style options for vector layers created - * for GeoJSON features. - */ - style?: (featureData: any) => any; - - /** - * Function that will be called on each created feature layer. Useful for attaching - * events and popups to features. - */ - onEachFeature?: (featureData: any, layer: ILayer) => void; - - /** - * Function that will be used to decide whether to show a feature or not. - */ - filter?: (featureData: any, layer: ILayer) => boolean; - - } - - export class GeoJSON extends FeatureGroup { - /** - * Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format - * to display on the map (you can alternatively add it later with addData method) - * and an options object. - */ - constructor(geojson?: any, options?: GeoJSONOptions); - - /** - * Adds a GeoJSON object to the layer. - */ - addData(data: any): boolean; - - /** - * NOTE: A fake signature to allow an overriding overload. - */ - setStyle(style: PathOptions): FeatureGroup; - - /** - * Changes styles of GeoJSON vector layers with the given style function. - */ - setStyle(style: (featureData: any) => any): GeoJSON; - - /** - * Resets the the given vector layer's style to the original GeoJSON style, - * useful for resetting style after hover events. - */ - resetStyle(layer: Path): GeoJSON; - - /** - * Creates a layer from a given GeoJSON feature. - */ - static geometryToLayer(featureData: GeoJSON, pointToLayer?: (featureData: any, latlng: LatLng) => ILayer): ILayer; - - /** - * Creates a LatLng object from an array of 2 numbers (latitude, longitude) - * used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted - * as (longitude, latitude). - */ - static coordsToLatlng(coords: number[], reverse?: boolean): LatLng; - - /** - * Creates a multidimensional array of LatLng objects from a GeoJSON coordinates - * array. levelsDeep specifies the nesting level (0 is for an array of points, - * 1 for an array of arrays of points, etc., 0 by default). If reverse is set to - * true, the numbers will be interpreted as (longitude, latitude). - */ - static coordsToLatlngs(coords: number[], levelsDeep?: number, reverse?: boolean): LatLng[]; - - } - - export class LatLng { - /** - * Creates an object representing a geographical point with the given latitude - * and longitude. - */ - constructor(latitude: number, longitude: number); - - /** - * Returns the distance (in meters) to the given LatLng calculated using the - * Haversine formula. See description on wikipedia - */ - distanceTo(otherLatlng: LatLng): number; - - /** - * Returns true if the given LatLng point is at the same position (within a small - * margin of error). - */ - equals(otherLatlng: LatLng): boolean; - - /** - * Returns a string representation of the point (for debugging purposes). - */ - toString(): string; - - /** - * Returns a new LatLng object with the longitude wrapped around left and right - * boundaries (-180 to 180 by default). - */ - wrap(left: number, right: number): LatLng; - - /** - * Latitude in degrees. - */ - lat: number; - - /** - * Longitude in degrees. - */ - lng: number; - - } - - export class LatLngBounds { - /** - * Creates a LatLngBounds object by defining south-west and north-east corners - * of the rectangle. - */ - constructor(southWest: LatLng, northEast: LatLng); - - /** - * Extends the bounds to contain the given point or bounds. - */ - extend(latlng: LatLng): LatLngBounds; - - /** - * Extends the bounds to contain the given point or bounds. - */ - extend(latlng: LatLngBounds): LatLngBounds; - - /** - * Returns the south-west point of the bounds. - */ - getSouthWest(): LatLng; - - /** - * Returns the north-east point of the bounds. - */ - getNorthEast(): LatLng; - - /** - * Returns the north-west point of the bounds. - */ - getNorthWest(): LatLng; - - /** - * Returns the south-east point of the bounds. - */ - getSouthEast(): LatLng; - - /** - * Returns the center point of the bounds. - */ - getCenter(): LatLng; - - /** - * Returns true if the rectangle contains the given one. - */ - contains(otherBounds: LatLngBounds): boolean; - - /** - * Returns true if the rectangle contains the given point. - */ - contains(latlng: LatLng): boolean; - - /** - * Returns true if the rectangle intersects the given bounds. - */ - intersects(otherBounds: LatLngBounds): boolean; - - /** - * Returns true if the rectangle is equivalent (within a small margin of error) - * to the given bounds. - */ - equals(otherBounds: LatLngBounds): boolean; - - /** - * Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' - * format. Useful for sending requests to web services that return geo data. - */ - toBBoxString(): string; - - /** - * Returns bigger bounds created by extending the current bounds by a given - * percentage in each direction. - */ - pad(bufferRatio: number): LatLngBounds; - - /** - * Returns true if the bounds are properly initialized. - */ - isValid(): boolean; + clickable?: boolean; + /** + * Sets the pointer-events attribute on the path if SVG backend is used. + */ + pointerEvents?: boolean; + } +} + +declare module L { + + /** + * Creates a Point object with the given x and y coordinates. If optional round + * is set to true, rounds the x and y values. + */ + function point(x: number, y: number, round?: boolean): Point; export class Point { + /** * Creates a Point object with the given x and y coordinates. If optional round * is set to true, rounds the x and y values. @@ -1728,48 +3113,48 @@ declare module L { * Returns the result of addition of the current and the given points. */ add(otherPoint: Point): Point; - + /** * Returns the result of subtraction of the given point from the current. */ subtract(otherPoint: Point): Point; - + /** * Returns the result of multiplication of the current point by the given number. */ multiplyBy(number: number): Point; - + /** * Returns the result of division of the current point by the given number. If * optional round is set to true, returns a rounded result. */ divideBy(number: number, round?: boolean): Point; - + /** * Returns the distance between the current and the given points. */ distanceTo(otherPoint: Point): number; - + /** * Returns a copy of the current point. */ clone(): Point; - + /** * Returns a copy of the current point with rounded coordinates. */ round(): Point; - + /** * Returns true if the given point has the same coordinates. */ equals(otherPoint: Point): boolean; - + /** * Returns a string representation of the point for debugging purposes. */ toString(): string; - + /** * The x coordinate. */ @@ -1779,773 +3164,108 @@ declare module L { * The y coordinate. */ y: number; - } +} + +declare module L { - export class Bounds { - /** - * Creates a Bounds object from two coordinates (usually top-left and bottom-right - * corners). - */ - constructor(topLeft: Point, bottomRight: Point); + /** + * Instantiates a polygon object given an array of geographical points and + * optionally an options object (the same as for Polyline). You can also create + * a polygon with holes by passing an array of arrays of latlngs, with the first + * latlngs array representing the exterior ring while the remaining represent + * the holes inside. + */ + function polygon(latlngs: LatLng[], options?: PolylineOptions): Polygon; + + export class Polygon extends Polyline { /** - * Extends the bounds to contain the given point. + * Instantiates a polygon object given an array of geographical points and + * optionally an options object (the same as for Polyline). You can also create + * a polygon with holes by passing an array of arrays of latlngs, with the first + * latlngs array representing the exterior ring while the remaining represent + * the holes inside. */ - extend(point: Point): void; - - /** - * Returns the center point of the bounds. - */ - getCenter(): Point; - - /** - * Returns true if the rectangle contains the given one. - */ - contains(otherBounds: Bounds): boolean; - - /** - * Returns true if the rectangle contains the given point. - */ - contains(point: Point): boolean; - - /** - * Returns true if the rectangle intersects the given bounds. - */ - intersects(otherBounds: Bounds): boolean; - - /** - * Returns true if the bounds are properly initialized. - */ - isValid(): boolean; - - /** - * Returns the size of the given bounds. - */ - getSize(): Point; - - /** - * The top left corner of the rectangle. - */ - min: Point; - - /** - * The bottom right corner of the rectangle. - */ - max: Point; - + constructor(latlngs: LatLng[], options?: PolylineOptions); } +} + +declare module L { - export interface IconOptions { - /** - * (required) The URL to the icon image (absolute or relative to your script - * path). - */ - iconUrl?: string; + /** + * Instantiates a polyline object given an array of geographical points and + * optionally an options object. + */ + function polyline(latlngs: LatLng[], options?: PolylineOptions): Polyline; + + export class Polyline extends Path { /** - * The URL to a retina sized version of the icon image (absolute or relative to - * your script path). Used for Retina screen devices. + * Instantiates a polyline object given an array of geographical points and + * optionally an options object. */ - iconRetinaUrl?: string; + constructor(latlngs: LatLng[], options?: PolylineOptions); + + /** + * Adds a given point to the polyline. + */ + addLatLng(latlng: LatLng): Polyline; + + /** + * Replaces all the points in the polyline with the given array of geographical + * points. + */ + setLatLngs(latlngs: LatLng[]): Polyline; + + /** + * Returns an array of the points in the path. + */ + getLatLngs(): LatLng[]; + + /** + * Allows adding, removing or replacing points in the polyline. Syntax is the + * same as in Array#splice. Returns the array of removed points (if any). + */ + spliceLatLngs(index: number, pointsToRemove: number, ...latlngs: LatLng[]): LatLng[]; + + /** + * Returns the LatLngBounds of the polyline. + */ + getBounds(): LatLngBounds; /** - * Size of the icon image in pixels. + * Returns a GeoJSON representation of the polyline (GeoJSON LineString Feature). */ - iconSize?: Point; - - /** - * The coordinates of the "tip" of the icon (relative to its top left corner). - * The icon will be aligned so that this point is at the marker's geographical - * location. Centered by default if size is specified, also can be set in CSS - * with negative margins. - */ - iconAnchor?: Point; - - /** - * The URL to the icon shadow image. If not specified, no shadow image will be - * created. - */ - shadowUrl?: string; - - /** - * The URL to the retina sized version of the icon shadow image. If not specified, - * no shadow image will be created. Used for Retina screen devices. - */ - shadowRetinaUrl?: string; - - /** - * Size of the shadow image in pixels. - */ - shadowSize?: Point; - - /** - * The coordinates of the "tip" of the shadow (relative to its top left corner) - * (the same as iconAnchor if not specified). - */ - shadowAnchor?: Point; - - /** - * The coordinates of the point from which popups will "open", relative to the - * icon anchor. - */ - popupAnchor?: Point; - - /** - * A custom class name to assign to both icon and shadow images. Empty by default. - */ - className?: string; - + toGeoJSON(): any; } +} + +declare module L { + + export interface PolylineOptions { - export class Icon { /** - * Creates an icon instance with the given options. + * How much to simplify the polyline on each zoom level. More means better performance + * and smoother look, and less means more accurate representation. + * + * Default value: 1.0. */ - constructor(options: IconOptions); - } - - export module Icon { - export class Default extends Icon { - /** - * Creates an icon instance with default options. - */ - constructor(); - - static imagePath: string; - } - } - - export interface DivIconOptions { + smoothFactor?: number; + /** - * Size of the icon in pixels. Can be also set through CSS. + * Disabled polyline clipping. + * + * Default value: false. */ - iconSize?: Point; - - /** - * The coordinates of the "tip" of the icon (relative to its top left corner). - * The icon will be aligned so that this point is at the marker's geographical - * location. Centered by default if size is specified, also can be set in CSS - * with negative margins. - */ - iconAnchor?: Point; - - /** - * A custom class name to assign to the icon. 'leaflet-div-icon' by default. - */ - className?: string; - - /** - * A custom HTML code to put inside the div element, empty by default. - */ - html?: string; - - } - - export class DivIcon extends Icon{ - /** - * Creates a div icon instance with the given options. - */ - constructor(options: DivIconOptions); - - } - - export interface ControlOptions { - /** - * The initial position of the control (one of the map corners). See control - * positions. - */ - position: string; - - } - - export class Control implements IControl { - /** - * Creates a control with the given options. - */ - constructor(options?: ControlOptions); - - /** - * Sets the position of the control. See control positions. - */ - setPosition(position: string): Control; - - /** - * Returns the current position of the control. - */ - getPosition(): string; - - /** - * Adds the control to the map. - */ - addTo(map: Map): Control; - - /** - * Removes the control from the map. - */ - removeFrom(map: Map): Control; - - static Zoom: new () => Zoom; - - static Attribution: new () => Attribution; - - static Layers: new () => Layers; - - static Scale: new () => Scale; - - //////////// - //// IControl members - //////////// - - /** - * Should contain code that creates all the neccessary DOM elements for the - * control, adds listeners on relevant map events, and returns the element - * containing the control. Called on map.addControl(control) or control.addTo(map). - */ - onAdd(map: Map): HTMLElement; - - /** - * Optional, should contain all clean up code (e.g. removes control's event - * listeners). Called on map.removeControl(control) or control.removeFrom(map). - * The control's DOM container is removed automatically. - */ - onRemove(map: Map): void; - - } - - export interface ZoomOptions { - /** - * The position of the control (one of the map corners). See control positions. - */ - position?: string; - - } - - export class Zoom extends Control { - /** - * Creates a zoom control. - */ - constructor(options?: ZoomOptions); - - } - - export interface AttributionOptions { - /** - * The position of the control (one of the map corners). See control positions. - */ - position?: string; - - /** - * The HTML text shown before the attributions. Pass false to disable. - */ - prefix?: string; - - } - - export class Attribution extends Control { - /** - * Creates an attribution control. - */ - constructor(options?: AttributionOptions); - - /** - * Sets the text before the attributions. - */ - setPrefix(prefix: string): Attribution; - - /** - * Adds an attribution text (e.g. 'Vector data © CloudMade'). - */ - addAttribution(text: string): Attribution; - - /** - * Removes an attribution text. - */ - removeAttribution(text: string): Attribution; - - } - - export interface LayersOptions { - /** - * The position of the control (one of the map corners). See control positions. - */ - position?: string; - - /** - * If true, the control will be collapsed into an icon and expanded on mouse hover - * or touch. - */ - collapsed?: boolean; - - /** - * If true, the control will assign zIndexes in increasing order to all of its - * layers so that the order is preserved when switching them on/off. - */ - autoZIndex?: boolean; - - } - - export class Layers extends Control implements IEventPowered { - /** - * Creates an attribution control with the given layers. Base layers will be - * switched with radio buttons, while overlays will be switched with checkboxes. - */ - constructor(baseLayers?: any, overlays?: any, options?: LayersOptions); - - /** - * Adds a base layer (radio button entry) with the given name to the control. - */ - addBaseLayer(layer: ILayer, name: string): Layers; - - /** - * Adds an overlay (checkbox entry) with the given name to the control. - */ - addOverlay(layer: ILayer, name: string): Layers; - - /** - * Remove the given layer from the control. - */ - removeLayer(layer: ILayer): Layers; - - //////////// - //// IEventPowered members - //////////// - - addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - addEventListener(eventMap: any, context?: any): IEventPowered; - removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - removeEventListener(eventMap: any, context?: any): IEventPowered; - hasEventListeners(type: string): boolean; - fireEvent(type: string, data?: any): IEventPowered; - on(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - on(eventMap: any, context?: any): IEventPowered; - off(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - off(eventMap: any, context?: any): IEventPowered; - fire(type: string, data?: any): IEventPowered; - } - - export interface ScaleOptions { - /** - * The position of the control (one of the map corners). See control positions. - */ - position?: string; - - /** - * Maximum width of the control in pixels. The width is set dynamically to show - * round values (e.g. 100, 200, 500). - */ - maxWidth?: number; - - /** - * Whether to show the metric scale line (m/km). - */ - metric?: boolean; - - /** - * Whether to show the imperial scale line (mi/ft). - */ - imperial?: boolean; - - /** - * If true, the control is updated on moveend, otherwise it's always up-to-date - * (updated on move). - */ - updateWhenIdle?: boolean; - - } - - export class Scale extends Control { - /** - * Creates an scale control with the given options. - */ - constructor(options?: ScaleOptions); - - } - - export interface IEventPowered { - /** - * Adds a listener function (fn) to a particular event type of the object. You - * can optionally specify the context of the listener (object the this keyword - * will point to). You can also pass several space-separated types (e.g. 'click - * dblclick'). - */ - addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - - /** - * Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove} - */ - addEventListener(eventMap: any, context?: any): IEventPowered; - - /** - * Removes a previously added listener function. If no function is specified, - * it will remove all the listeners of that particular event from the object. - */ - removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - - /** - * Removes a set of type/listener pairs. - */ - removeEventListener(eventMap: any, context?: any): IEventPowered; - - /** - * Returns true if a particular event type has some listeners attached to it. - */ - hasEventListeners(type: string): boolean; - - /** - * Fires an event of the specified type. You can optionally provide an data object - * — the first argument of the listener function will contain its properties. - */ - fireEvent(type: string, data?: any): IEventPowered; - - /** - * Alias to addEventListener. - */ - on(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - - /** - * Alias to addEventListener. - */ - on(eventMap: any, context?: any): IEventPowered; - - /** - * Alias to removeEventListener. - */ - off(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - - /** - * Alias to removeEventListener. - */ - off(eventMap: any, context?: any): IEventPowered; - - /** - * Alias to fireEvent. - */ - fire(type: string, data?: any): IEventPowered; - - } - - export interface LeafletEvent { - /** - * The event type (e.g. 'click'). - */ - type: string; - - /** - * The object that fired the event. - */ - target: any; - - } - - export interface LeafletMouseEvent { - /** - * The geographical point where the mouse event occured. - */ - latlng: LatLng; - - /** - * Pixel coordinates of the point where the mouse event occured relative to - * the map layer. - */ - layerPoint: Point; - - /** - * Pixel coordinates of the point where the mouse event occured relative to - * the map сontainer. - */ - containerPoint: Point; - - /** - * The original DOM mouse event fired by the browser. - */ - originalEvent: MouseEvent; - - } - - export interface LeafletLocationEvent { - /** - * Detected geographical location of the user. - */ - latlng: LatLng; - - /** - * Geographical bounds of the area user is located in (with respect to the accuracy - * of location). - */ - bounds: LatLngBounds; - - /** - * Accuracy of location in meters. - */ - accuracy: number; - - } - - export interface LeafletErrorEvent { - /** - * Error message. - */ - message: string; - - /** - * Error code (if applicable). - */ - code: number; - - } - - export interface LeafletLayerEvent { - /** - * The layer that was added or removed. - */ - layer: ILayer; - - } - - export interface LeafletTileEvent { - /** - * The tile element (image). - */ - tile: HTMLElement; - - /** - * The source URL of the tile. - */ - url: string; - - } - - export interface LeafletGeoJSONEvent { - /** - * The layer for the GeoJSON feature that is being added to the map. - */ - layer: ILayer; - - /** - * GeoJSON properties of the feature. - */ - properties: any; - - /** - * GeoJSON geometry type of the feature. - */ - geometryType: string; - - /** - * GeoJSON ID of the feature (if present). - */ - id: string; - - } - - export interface LeafletPopupEvent { - /** - * The popup that was opened or closed. - */ - popup: Popup; - - } - - export class Class { - } - - export class Browser { - /** - * true for all Internet Explorer versions. - */ - static ie: boolean; - - /** - * true for Internet Explorer 6. - */ - static ie6: boolean; - - /** - * true for Internet Explorer 6. - */ - static ie7: boolean; - - /** - * true for webkit-based browsers like Chrome and Safari (including mobile - * versions). - */ - static webkit: boolean; - - /** - * true for webkit-based browsers that support CSS 3D transformations. - */ - static webkit3d: boolean; - - /** - * true for Android mobile browser. - */ - static android: boolean; - - /** - * true for old Android stock browsers (2 and 3). - */ - static android23: boolean; - - /** - * true for modern mobile browsers (including iOS Safari and different Android - * browsers). - */ - static mobile: boolean; - - /** - * true for mobile webkit-based browsers. - */ - static mobileWebkit: boolean; - - /** - * true for mobile Opera. - */ - static mobileOpera: boolean; - - /** - * true for all browsers on touch devices. - */ - static touch: boolean; - - /** - * true for browsers with Microsoft touch model (e.g. IE10). - */ - static msTouch: boolean; - - /** - * true for devices with Retina screens. - */ - static retina: boolean; - - } - - export class Util { - /** - * Merges the properties of the src object (or multiple objects) into dest object - * and returns the latter. Has an L.extend shortcut. - */ - static extend(dest: any, ...sources: any[]): any; - - /** - * Returns a function which executes function fn with the given scope obj (so - * that this keyword refers to obj inside the function code). Has an L.bind shortcut. - */ - static bind(fn: Function, obj: any): Function; - - /** - * Applies a unique key to the object and returns that key. Has an L.stamp shortcut. - */ - static stamp(obj: any): string; - - /** - * Returns a wrapper around the function fn that makes sure it's called not more - * often than a certain time interval time, but as fast as possible otherwise - * (for example, it is used for checking and requesting new tiles while dragging - * the map), optionally passing the scope (context) in which the function will - * be called. - */ - static limitExecByInterval(fn: Function, time: number, context?: any): Function; - - /** - * Returns a function which always returns false. - */ - static falseFn(): () => boolean; - - /** - * Returns the number num rounded to digits decimals. - */ - static formatNum(num: number, digits: number): number; - - /** - * Trims and splits the string on whitespace and returns the array of parts. - */ - static splitWords(str: string): string[]; - - /** - * Merges the given properties to the options of the obj object, returning the - * resulting options. See Class options. Has an L.setOptions shortcut. - */ - static setOptions(obj: any, options: any): any; - - /** - * Converts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} - * translates to '?a=foo&b=bar'. - */ - static getParamString(obj: any): string; - - /** - * Simple templating facility, creates a string by applying the values of the - * data object of a form {a: 'foo', b: 'bar', …} to a template string of the form - * 'Hello {a}, {b}' — in this example you will get 'Hello foo, bar'. - */ - static template(str: string, data: any): string; - - /** - * Returns true if the given object is an array. - */ - static isArray(obj: any): boolean; - - /** - * Data URI string containing a base64-encoded empty GIF image. Used as a hack - * to free memory from unused images on WebKit-powered mobile devices (by setting - * image src to this string). - */ - static emptyImageUrl: string; - - } - - export class Transformation { - /** - * Creates a transformation object with the given coefficients. - */ - constructor(a: number, b: number, c: number, d: number); - - /** - * Returns a transformed point, optionally multiplied by the given scale. - * Only accepts real L.Point instances, not arrays. - */ - transform(point: Point, scale?: number): Point; - - /** - * Returns the reverse transformation of the given point, optionally divided - * by the given scale. Only accepts real L.Point instances, not arrays. - */ - untransform(point: Point, scale?: number): Point; - - } - - export class LineUtil { - /** - * Dramatically reduces the number of points in a polyline while retaining - * its shape and returns a new array of simplified points. Used for a huge performance - * boost when processing/displaying Leaflet polylines for each zoom level - * and also reducing visual noise. tolerance affects the amount of simplification - * (lesser value means higher quality but slower and with more points). Also - * released as a separated micro-library Simplify.js. - */ - static simplify(points: Point[], tolerance: number): Point[]; - - /** - * Returns the distance between point p and segment p1 to p2. - */ - static pointToSegmentDistance(p: Point, p1: Point, p2: Point): number; - - /** - * Returns the closest point from a point p on a segment p1 to p2. - */ - static closestPointOnSegment(p: Point, p1: Point, p2: Point): number; - - /** - * Clips the segment a to b by rectangular bounds (modifying the segment points - * directly!). Used by Leaflet to only show polyline points that are on the screen - * or near, increasing performance. - */ - static clipSegment(a: Point, b: Point, bounds: Bounds): void; - + noClip?: boolean; } +} + +declare module L { export class PolyUtil { + /** * Clips the polygon geometry defined by the given points by rectangular bounds. * Used by Leaflet to only show polygon points that are on the screen or near, @@ -2553,291 +3273,194 @@ declare module L { * for clipping than polyline, so there's a seperate method for it. */ static clipPolygon(points: Point[], bounds: Bounds): Point[]; - } +} + +declare module L { - export class DomEvent { - /** - * Adds a listener fn to the element's DOM event of the specified type. this keyword - * inside the listener will point to context, or to the element if not specified. - */ - static addListener(el: HTMLElement, type: string, fn: (e: Event) => void, context?: any): DomEvent; + /** + * Instantiates a Popup object given an optional options object that describes + * its appearance and location and an optional object that is used to tag the + * popup with a reference to the source object to which it refers. + */ + function popup(options?: PopupOptions, source?: any): Popup; + + export class Popup extends Class implements ILayer { /** - * Removes an event listener from the element. + * Instantiates a Popup object given an optional options object that describes + * its appearance and location and an optional object that is used to tag the + * popup with a reference to the source object to which it refers. */ - static removeListener(el: HTMLElement, type: string, fn: (e: Event) => void): DomEvent; + constructor(options?: PopupOptions, source?: any); + + /** + * Adds the popup to the map. + */ + addTo(map: Map): Popup; + + /** + * Adds the popup to the map and closes the previous one. The same as map.openPopup(popup). + */ + openOn(map: Map): Popup; + + /** + * Sets the geographical point where the popup will open. + */ + setLatLng(latlng: LatLng): Popup; + + /** + * Sets the HTML content of the popup. + */ + setContent(html: string): Popup; /** - * Stop the given event from propagation to parent elements. Used inside the - * listener functions: - * L.DomEvent.addListener(div, 'click', function - * (e) { - * L.DomEvent.stopPropagation(e); - * }); + * Sets the HTML content of the popup. */ - static stopPropagation(e: Event): DomEvent; - - /** - * Prevents the default action of the event from happening (such as following - * a link in the href of the a element, or doing a POST request with page reload - * when form is submitted). Use it inside listener functions. - */ - static preventDefault(e: Event): DomEvent; - - /** - * Does stopPropagation and preventDefault at the same time. - */ - static stop(e: Event): DomEvent; - - /** - * Adds stopPropagation to the element's 'click', 'doubleclick', 'mousedown' - * and 'touchstart' events. - */ - static disableClickPropagation(el: HTMLElement): DomEvent; - - /** - * Gets normalized mouse position from a DOM event relative to the container - * or to the whole page if not specified. - */ - static getMousePosition(e: Event, container?: HTMLElement): Point; - - /** - * Gets normalized wheel delta from a mousewheel DOM event. - */ - static getWheelDelta(e: Event): number; - - } - - export class DomUtil { - /** - * Returns an element with the given id if a string was passed, or just returns - * the element if it was passed directly. - */ - static get(id: string): HTMLElement; - - /** - * Returns the value for a certain style attribute on an element, including - * computed values or values set through CSS. - */ - static getStyle(el: HTMLElement, style: string): string; - - /** - * Returns the offset to the viewport for the requested element. - */ - static getViewportOffset(el: HTMLElement): Point; - - /** - * Creates an element with tagName, sets the className, and optionally appends - * it to container element. - */ - static create(tagName: string, className: string, container?: HTMLElement): HTMLElement; - - /** - * Makes sure text cannot be selected, for example during dragging. - */ - static disableTextSelection(): void; - - /** - * Makes text selection possible again. - */ - static enableTextSelection(): void; - - /** - * Returns true if the element class attribute contains name. - */ - static hasClass(el: HTMLElement, name: string): boolean; - - /** - * Adds name to the element's class attribute. - */ - static addClass(el: HTMLElement, name: string): void; - - /** - * Removes name from the element's class attribute. - */ - static removeClass(el: HTMLElement, name: string): void; - - /** - * Set the opacity of an element (including old IE support). Value must be from - * 0 to 1. - */ - static setOpacity(el: HTMLElement, value: number): void; - - /** - * Goes through the array of style names and returns the first name that is a valid - * style name for an element. If no such name is found, it returns false. Useful - * for vendor-prefixed styles like transform. - */ - static testProp(props: String[]): string; - - /** - * Returns a CSS transform string to move an element by the offset provided in - * the given point. Uses 3D translate on WebKit for hardware-accelerated transforms - * and 2D on other browsers. - */ - static getTranslateString(point: Point): string; - - /** - * Returns a CSS transform string to scale an element (with the given scale origin). - */ - static getScaleString(scale: number, origin: Point): string; - - /** - * Sets the position of an element to coordinates specified by point, using - * CSS translate or top/left positioning depending on the browser (used by - * Leaflet internally to position its layers). Forces top/left positioning - * if disable3D is true. - */ - static setPosition(el: HTMLElement, point: Point, disable3D?: boolean): void; - - /** - * Returns the coordinates of an element previously positioned with setPosition. - */ - static getPosition(el: HTMLElement): Point; - - /** - * Vendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit). - */ - static TRANSITION: string; - - /** - * Vendor-prefixed transform style name. - */ - static TRANSFORM: string; - - } - - export class PosAnimation implements IEventPowered { - /** - * Creates a PosAnimation object. - */ - constructor(); - - /** - * Run an animation of a given element to a new position, optionally setting - * duration in seconds (0.25 by default) and easing linearity factor (3rd argument - * of the cubic bezier curve, 0.5 by default) - */ - run(element: HTMLElement, newPos: Point, duration?: number, easeLinearity?: number): PosAnimation; + setContent(el: HTMLElement): Popup; //////////// - //// IEventPowered members //////////// - - addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - addEventListener(eventMap: any, context?: any): IEventPowered; - removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - removeEventListener(eventMap: any, context?: any): IEventPowered; - hasEventListeners(type: string): boolean; - fireEvent(type: string, data?: any): IEventPowered; - on(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - on(eventMap: any, context?: any): IEventPowered; - off(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - off(eventMap: any, context?: any): IEventPowered; - fire(type: string, data?: any): IEventPowered; - } - - export class Draggable implements IEventPowered { - /** - * Creates a Draggable object for moving the given element when you start dragging - * the dragHandle element (equals the element itself by default). - */ - constructor(element: HTMLElement, dragHandle?: HTMLElement); - - /** - * Enables the dragging ability. - */ - enable(): void; - - /** - * Disables the dragging ability. - */ - disable(): void; - - //////////// - //// IEventPowered members - //////////// - - addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - addEventListener(eventMap: any, context?: any): IEventPowered; - removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - removeEventListener(eventMap: any, context?: any): IEventPowered; - hasEventListeners(type: string): boolean; - fireEvent(type: string, data?: any): IEventPowered; - on(type: string, fn: (e: LeafletEvent) => void, context?: any): IEventPowered; - on(eventMap: any, context?: any): IEventPowered; - off(type: string, fn?: (e: LeafletEvent) => void, context?: any): IEventPowered; - off(eventMap: any, context?: any): IEventPowered; - fire(type: string, data?: any): IEventPowered; - } - - export interface IHandler { - /** - * Enables the handler. - */ - enable(): void; - - /** - * Disables the handler. - */ - disable(): void; - - /** - * Returns true if the handler is enabled. - */ - enabled(): boolean; - - } - - export interface ILayer { /** * Should contain code that creates DOM elements for the overlay, adds them * to map panes where they should belong and puts listeners on relevant map events. * Called on map.addLayer(layer). */ onAdd(map: Map): void; - + /** * Should contain all clean up code that removes the overlay's elements from * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). */ onRemove(map: Map): void; - } +} + +declare module L { - export interface IControl { - /** - * Should contain code that creates all the neccessary DOM elements for the - * control, adds listeners on relevant map events, and returns the element - * containing the control. Called on map.addControl(control) or control.addTo(map). - */ - onAdd(map: Map): HTMLElement; + export interface PopupOptions { /** - * Optional, should contain all clean up code (e.g. removes control's event - * listeners). Called on map.removeControl(control) or control.removeFrom(map). - * The control's DOM container is removed automatically. + * Max width of the popup. + * + * Default value: 300. */ - onRemove(map: Map): void; + maxWidth?: number; + + /** + * Min width of the popup. + * + * Default value: 50. + */ + minWidth?: number; + + /** + * If set, creates a scrollable container of the given height inside a popup + * if its content exceeds it. + */ + maxHeight?: number; + + /** + * Set it to false if you don't want the map to do panning animation to fit the opened + * popup. + * + * Default value: true. + */ + autoPan?: boolean; + + /** + * Controls the presense of a close button in the popup. + * + * Default value: true. + */ + closeButton?: boolean; + + /** + * The offset of the popup position. Useful to control the anchor of the popup + * when opening it on some overlays. + * + * Default value: new Point(0, 6). + */ + offset?: Point; + + /** + * The margin between the popup and the edges of the map view after autopanning + * was performed. + * + * Default value: new Point(5, 5). + */ + autoPanPadding?: Point; + + /** + * Whether to animate the popup on zoom. Disable it if you have problems with + * Flash content inside popups. + * + * Default value: true. + */ + zoomAnimation?: boolean; + /** + * Set it to false if you want to override the default behavior of the popup + * closing when user clicks the map (set globally by the Map closePopupOnClick + * option). + */ + closeOnClick?: boolean; } +} + +declare module L { + + export class PosAnimation extends Class implements IEventPowered { + + /** + * Creates a PosAnimation object. + */ + constructor(); + + /** + * Run an animation of a given element to a new position, optionally setting + * duration in seconds (0.25 by default) and easing linearity factor (3rd argument + * of the cubic bezier curve, 0.5 by default) + */ + run(element: HTMLElement, newPos: Point, duration?: number, easeLinearity?: number): PosAnimation; + + //////////////// + //////////////// + addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): PosAnimation; + addOneTimeEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): PosAnimation; + removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): PosAnimation; + hasEventListeners(type: string): boolean; + fireEvent(type: string, data?: any): PosAnimation; + on(type: string, fn: (e: LeafletEvent) => void, context?: any): PosAnimation; + once(type: string, fn: (e: LeafletEvent) => void, context?: any): PosAnimation; + off(type: string, fn?: (e: LeafletEvent) => void, context?: any): PosAnimation; + fire(type: string, data?: any): PosAnimation; + addEventListener(eventMap: any, context?: any): PosAnimation; + removeEventListener(eventMap?: any, context?: any): PosAnimation; + clearAllEventListeners(): PosAnimation + on(eventMap: any, context?: any): PosAnimation; + off(eventMap?: any, context?: any): PosAnimation; + } +} + +declare module L { export class Projection { + /** * Spherical Mercator projection — the most common projection for online maps, * used by almost all free and commercial tile providers. Assumes that Earth * is a sphere. Used by the EPSG:3857 CRS. */ static SphericalMercator: IProjection; - + /** * Elliptical Mercator projection — more complex than Spherical Mercator. * Takes into account that Earth is a geoid, not a perfect sphere. Used by the * EPSG:3395 CRS. */ static Mercator: IProjection; - + /** * Equirectangular, or Plate Carree projection — the most simple projection, * mostly used by GIS enthusiasts. Directly maps x as longitude, and y as latitude. @@ -2845,108 +3468,539 @@ declare module L { * CRS. */ static LonLat: IProjection; - } - - export interface IProjection { - /** - * Projects geographical coordinates into a 2D point. - */ - project(latlng: LatLng): Point; - - /** - * The inverse of project. Projects a 2D point into geographical location. - */ - unproject(point: Point): LatLng; - - } - - export class CRS { - /** - * The most common CRS for online maps, used by almost all free and commercial - * tile providers. Uses Spherical Mercator projection. Set in by default in - * Map's crs option. - */ - static EPSG3857: ICRS; - - /** - * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. - */ - static EPSG4326: ICRS; - - /** - * Rarely used by some commercial tile providers. Uses Elliptical Mercator - * projection. - */ - static EPSG3395: ICRS; - - /** - * A simple CRS that maps longitude and latitude into x and y directly. May be - * used for maps of flat surfaces (e.g. game maps). Note that the y axis should - * still be inverted (going from bottom to top). - */ - static Simple: ICRS; - - } - - export interface ICRS { - /** - * Projection that this CRS uses. - */ - projection: IProjection; - - /** - * Transformation that this CRS uses to turn projected coordinates into screen - * coordinates for a particular tile service. - */ - transformation: Transformation; - - /** - * Standard code name of the CRS passed into WMS services (e.g. 'EPSG:3857'). - */ - code: string; - - /** - * Projects geographical coordinates on a given zoom into pixel coordinates. - */ - latLngToPoint(latlng: LatLng, zoom: number): Point; - - /** - * The inverse of latLngToPoint. Projects pixel coordinates on a given zoom - * into geographical coordinates. - */ - pointToLatLng(point: Point, zoom: number): LatLng; - - /** - * Projects geographical coordinates into coordinates in units accepted - * for this CRS (e.g. meters for EPSG:3857, for passing it to WMS services). - */ - project(latlng: LatLng): Point; - - /** - * Returns the scale used when transforming projected coordinates into pixel - * coordinates for a particular zoom. For example, it returns 256 * 2^zoom for - * Mercator-based CRS. - */ - scale(zoom: number): number; - - } - - /** - * This method restores the L global variale to the original value it had - * before Leaflet inclusion, and returns the real Leaflet namespace. - */ - export var noConflict: () => typeof L; - - /** - * A constant that represents the Leaflet version in use. - */ - export var version: string; } + +declare module L { + /** + * Instantiates a rectangle object with the given geographical bounds and + * optionally an options object. + */ + function rectangle(bounds: LatLngBounds, options?: PathOptions): Rectangle; + + export class Rectangle extends Polygon { + + /** + * Instantiates a rectangle object with the given geographical bounds and + * optionally an options object. + */ + constructor(bounds: LatLngBounds, options?: PathOptions); + + /** + * Redraws the rectangle with the passed bounds. + */ + setBounds(bounds: LatLngBounds): Rectangle; + } +} + + +declare module L { + + export interface ScaleOptions { + + /** + * The position of the control (one of the map corners). See control positions. + * Default value: 'bottomleft'. + */ + position?: string; + + /** + * Maximum width of the control in pixels. The width is set dynamically to show + * round values (e.g. 100, 200, 500). + * Default value: 100. + */ + maxWidth?: number; + + /** + * Whether to show the metric scale line (m/km). + * Default value: true. + */ + metric?: boolean; + + /** + * Whether to show the imperial scale line (mi/ft). + * Default value: true. + */ + imperial?: boolean; + + /** + * If true, the control is updated on moveend, otherwise it's always up-to-date + * (updated on move). + * Default value: false. + */ + updateWhenIdle?: boolean; + } +} + +declare module L { + + export class TileLayer implements ILayer, IEventPowered { + + /** + * Instantiates a tile layer object given a URL template and optionally an options + * object. + */ + constructor(urlTemplate: string, options?: TileLayerOptions); + + /** + * Adds the layer to the map. + */ + addTo(map: Map): TileLayer; + + /** + * Brings the tile layer to the top of all tile layers. + */ + bringToFront(): TileLayer; + + /** + * Brings the tile layer to the bottom of all tile layers. + */ + bringToBack(): TileLayer; + + /** + * Changes the opacity of the tile layer. + */ + setOpacity(opacity: number): TileLayer; + + /** + * Sets the zIndex of the tile layer. + */ + setZIndex(zIndex: number): TileLayer; + + /** + * Causes the layer to clear all the tiles and request them again. + */ + redraw(): TileLayer; + + /** + * Updates the layer's URL template and redraws it. + */ + setUrl(urlTemplate: string): TileLayer; + + /** + * Returns the HTML element that contains the tiles for this layer. + */ + getContainer(): HTMLElement; + + //////////// + //////////// + /** + * Should contain code that creates DOM elements for the overlay, adds them + * to map panes where they should belong and puts listeners on relevant map events. + * Called on map.addLayer(layer). + */ + onAdd(map: Map): void; + + /** + * Should contain all clean up code that removes the overlay's elements from + * the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). + */ + onRemove(map: Map): void; + + //////////////// + //////////////// + addEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): TileLayer; + addOneTimeEventListener(type: string, fn: (e: LeafletEvent) => void, context?: any): TileLayer; + removeEventListener(type: string, fn?: (e: LeafletEvent) => void, context?: any): TileLayer; + hasEventListeners(type: string): boolean; + fireEvent(type: string, data?: any): TileLayer; + on(type: string, fn: (e: LeafletEvent) => void, context?: any): TileLayer; + once(type: string, fn: (e: LeafletEvent) => void, context?: any): TileLayer; + off(type: string, fn?: (e: LeafletEvent) => void, context?: any): TileLayer; + fire(type: string, data?: any): TileLayer; + addEventListener(eventMap: any, context?: any): TileLayer; + removeEventListener(eventMap?: any, context?: any): TileLayer; + clearAllEventListeners(): TileLayer + on(eventMap: any, context?: any): TileLayer; + off(eventMap?: any, context?: any): TileLayer; + } + + module TileLayer { + + export class WMS { + + /** + * Instantiates a WMS tile layer object given a base URL of the WMS service and + * a WMS parameters/options object. + */ + constructor(baseUrl: string, options: WMSOptions); + + /** + * Merges an object with the new parameters and re-requests tiles on the current + * screen (unless noRedraw was set to true). + */ + setParams(params: WMS, noRedraw?: boolean): WMS; + } + + export class Canvas { + + /** + * Instantiates a Canvas tile layer object given an options object (optionally). + */ + constructor(options?: TileLayerOptions); + + /** + * You need to define this method after creating the instance to draw tiles; + * canvas is the actual canvas tile on which you can draw, tilePoint represents + * the tile numbers, and zoom is the current zoom. + */ + drawTile(canvas: HTMLCanvasElement, tilePoint: Point, zoom: number): Canvas; + + /** + * Calling redraw will cause the drawTile method to be called for all tiles. + * May be used for updating dynamic content drawn on the Canvas + */ + redraw(): Canvas; + } + } + + export class tileLayer { + + /** + * Instantiates a tile layer object given a URL template and optionally an options + * object. + */ + function (urlTemplate: string, options?: TileLayerOptions): TileLayer; + + /** + * Instantiates a WMS tile layer object given a base URL of the WMS service and + * a WMS parameters/options object. + */ + static wms(baseUrl: string, options: WMSOptions): L.TileLayer.WMS; + + /** + * Instantiates a Canvas tile layer object given an options object (optionally). + */ + static canvas(options?: TileLayerOptions): L.TileLayer.Canvas; + } +} + +declare module L { + + export interface TileLayerOptions { + + /** + * Minimum zoom number. + * + * Default value: 0. + */ + minZoom?: number; + + /** + * Maximum zoom number. + * + * Default value: 18. + */ + maxZoom?: number; + + /** + * Tile size (width and height in pixels, assuming tiles are square). + * + * Default value: 256. + */ + tileSize?: number; + + /** + * Subdomains of the tile service. Can be passed in the form of one string (where + * each letter is a subdomain name) or an array of strings. + * + * Default value: 'abc'. + */ + subdomains?: string[]; + + /** + * URL to the tile image to show in place of the tile that failed to load. + * + * Default value: ''. + */ + errorTileUrl?: string; + + /** + * e.g. "© CloudMade" — the string used by the attribution control, describes + * the layer data. + * + * Default value: ''. + */ + attribution?: string; + + /** + * If true, inverses Y axis numbering for tiles (turn this on for TMS services). + * + * Default value: false. + */ + tms?: boolean; + + /** + * If set to true, the tile coordinates won't be wrapped by world width (-180 + * to 180 longitude) or clamped to lie within world height (-90 to 90). Use this + * if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor + * or photo maps). + * + * Default value: false. + */ + continuousWorld?: boolean; + + /** + * If set to true, the tiles just won't load outside the world width (-180 to 180 + * longitude) instead of repeating. + * + * Default value: false. + */ + noWrap?: boolean; + + /** + * The zoom number used in tile URLs will be offset with this value. + * + * Default value: 0. + */ + zoomOffset?: number; + + /** + * If set to true, the zoom number used in tile URLs will be reversed (maxZoom + * - zoom instead of zoom) + * + * Default value: false. + */ + zoomReverse?: boolean; + + /** + * The opacity of the tile layer. + * + * Default value: 1.0. + */ + opacity?: number; + + /** + * The explicit zIndex of the tile layer. Not set by default. + */ + zIndex?: number; + + /** + * If true, all the tiles that are not visible after panning are removed (for + * better performance). true by default on mobile WebKit, otherwise false. + */ + unloadInvisibleTiles?: boolean; + + /** + * If false, new tiles are loaded during panning, otherwise only after it (for + * better performance). true by default on mobile WebKit, otherwise false. + */ + updateWhenIdle?: boolean; + + /** + * If true and user is on a retina display, it will request four tiles of half the + * specified size and a bigger zoom level in place of one to utilize the high resolution. + * + * Default value: false. + */ + detectRetina?: boolean; + + /** + * If true, all the tiles that are not visible after panning are placed in a reuse + * queue from which they will be fetched when new tiles become visible (as opposed + * to dynamically creating new ones). This will in theory keep memory usage + * low and eliminate the need for reserving new memory whenever a new tile is + * needed. + * + * Default value: false. + */ + reuseTiles?: boolean; + } +} + +declare module L { + + export class Transformation { + + /** + * Creates a transformation object with the given coefficients. + */ + constructor(a: number, b: number, c: number, d: number); + + /** + * Returns a transformed point, optionally multiplied by the given scale. + * Only accepts real L.Point instances, not arrays. + */ + transform(point: Point, scale?: number): Point; + + /** + * Returns the reverse transformation of the given point, optionally divided + * by the given scale. Only accepts real L.Point instances, not arrays. + */ + untransform(point: Point, scale?: number): Point; + } +} + +declare module L { + + export class Util { + + /** + * Merges the properties of the src object (or multiple objects) into dest object + * and returns the latter. Has an L.extend shortcut. + */ + static extend(dest: any, ...sources: any[]): any; + + /** + * Returns a function which executes function fn with the given scope obj (so + * that this keyword refers to obj inside the function code). Has an L.bind shortcut. + */ + static bind(fn: T, obj: any): T; + + /** + * Applies a unique key to the object and returns that key. Has an L.stamp shortcut. + */ + static stamp(obj: any): string; + + /** + * Returns a wrapper around the function fn that makes sure it's called not more + * often than a certain time interval time, but as fast as possible otherwise + * (for example, it is used for checking and requesting new tiles while dragging + * the map), optionally passing the scope (context) in which the function will + * be called. + */ + static limitExecByInterval(fn: T, time: number, context?: any): T; + + /** + * Returns a function which always returns false. + */ + static falseFn(): () => boolean; + + /** + * Returns the number num rounded to digits decimals. + */ + static formatNum(num: number, digits: number): number; + + /** + * Trims and splits the string on whitespace and returns the array of parts. + */ + static splitWords(str: string): string[]; + + /** + * Merges the given properties to the options of the obj object, returning the + * resulting options. See Class options. Has an L.setOptions shortcut. + */ + static setOptions(obj: any, options: any): any; + + /** + * Converts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} + * translates to '?a=foo&b=bar'. + */ + static getParamString(obj: any): string; + + /** + * Simple templating facility, creates a string by applying the values of the + * data object of a form {a: 'foo', b: 'bar', …} to a template string of the form + * 'Hello {a}, {b}' — in this example you will get 'Hello foo, bar'. + */ + static template(str: string, data: any): string; + + /** + * Returns true if the given object is an array. + */ + static isArray(obj: any): boolean; + + /** + * Trims the whitespace from both ends of the string and returns the result. + */ + static trim(str: string): boolean; + + /** + * Data URI string containing a base64-encoded empty GIF image. Used as a hack + * to free memory from unused images on WebKit-powered mobile devices (by setting + * image src to this string). + */ + static emptyImageUrl: string; + } +} + + +declare module L { + + export interface WMSOptions { + + /** + * (required) Comma-separated list of WMS layers to show. + * + * Default value: ''. + */ + layers?: string; + + /** + * Comma-separated list of WMS styles. + * + * Default value: 'image/jpeg'. + */ + styles?: string; + + /** + * WMS image format (use 'image/png' for layers with transparency). + * + * Default value: false. + */ + format?: string; + + /** + * If true, the WMS service will return images with transparency. + * + * Default value: '1.1.1'. + */ + transparent?: boolean; + + /** + * Version of the WMS service to use. + */ + version?: string; + + } +} + + +declare module L { + + export interface ZoomOptions { + + /** + * The position of the control (one of the map corners). See control positions. + * + * Default value: 'topright'. + */ + position?: string; + } +} + +declare module L { + + export interface ZoomPanOptions { + + /** + * If true, the map view will be completely reset (without any animations). + * + * Default value: false. + */ + reset?: boolean; + + /** + * Sets the options for the panning (without the zoom change) if it occurs. + */ + pan?: PanOptions; + + /** + * Sets the options for the zoom change if it occurs. + */ + zoom?: ZoomOptions; + + /** + * An equivalent of passing animate to both zoom and pan options (see below). + */ + animate?: boolean; + } +} + /** - * Forces Leaflet to use the Canvas back-end (if available) for vector layers - * instead of SVG. This can increase performance considerably in some cases + * Forces Leaflet to use the Canvas back-end (if available) for vector layers + * instead of SVG. This can increase performance considerably in some cases * (e.g. many thousands of circle markers on the map). */ declare var L_PREFER_CANVAS: boolean; @@ -2957,7 +4011,8 @@ declare var L_PREFER_CANVAS: boolean; declare var L_NO_TOUCH: boolean; /** - * Forces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning + * Forces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning * (which may cause glitches in some rare environments) even if they're supported. */ declare var L_DISABLE_3D: boolean; + diff --git a/lodash/lodash-tests.ts b/lodash/lodash-tests.ts new file mode 100644 index 000000000..400d8664a --- /dev/null +++ b/lodash/lodash-tests.ts @@ -0,0 +1,929 @@ +/// + +declare var $: any, jQuery: any; + +interface IFoodOrganic { + name: string; + organic: boolean; +} + +interface IFoodType { + name: string; + type: string; +} + +interface IFoodCombined { + name: string; + organic: boolean; + type: string; +} + +interface IStoogesQuote { + name: string; + quotes: string[]; +} + +interface IStoogesAge { + name: string; + age: number; +} + +interface IStoogesCombined { + name: string; + age: number; + quotes: string[]; +} + +interface IKey { + dir: string; + code: number; +} + +var foodsOrganic: IFoodOrganic[] = [ + { name: 'banana', organic: true }, + { name: 'beet', organic: false }, +]; +var foodsType: IFoodType[] = [ + { name: 'apple', type: 'fruit' }, + { name: 'banana', type: 'fruit' }, + { name: 'beet', type: 'vegetable' } +]; +var foodsCombined: IFoodCombined[] = [ + { 'name': 'apple', 'organic': false, 'type': 'fruit' }, + { 'name': 'carrot', 'organic': true, 'type': 'vegetable' } +]; + +var stoogesQuotes: IStoogesQuote[] = [ + { 'name': 'curly', 'quotes': ['Oh, a wise guy, eh?', 'Poifect!'] }, + { 'name': 'moe', 'quotes': ['Spread out!', 'You knucklehead!'] } +]; +var stoogesAges: IStoogesAge[] = [ + { 'name': 'moe', 'age': 40 }, + { 'name': 'larry', 'age': 50 } +]; + +var stoogesCombined: IStoogesCombined[] = [ + { 'name': 'curly', 'age': 30, 'quotes': ['Oh, a wise guy, eh?', 'Poifect!'] }, + { 'name': 'moe', 'age': 40, 'quotes': ['Spread out!', 'You knucklehead!'] } +]; + +var keys: IKey[] = [ + { 'dir': 'left', 'code': 97 }, + { 'dir': 'right', 'code': 100 } +]; + +class Dog { + constructor(public name: string) {} + + public bark() { + console.log('Woof, woof!'); + } +} + +var result : any; + +/************* + * Chaining * + *************/ +result = <_.LoDashWrapper>_('test'); +result = <_.LoDashWrapper>_(1); +result = <_.LoDashWrapper>_(true); +result = <_.LoDashArrayWrapper>_(['test1', 'test2']); +result = <_.LoDashObjectWrapper<_.Dictionary>>_({'key1': 'test1', 'key2': 'test2'}); + +result = <_.LoDashWrapper>_.chain('test'); +result = <_.LoDashWrapper>_('test').chain(); +result = <_.LoDashWrapper>_.chain(1); +result = <_.LoDashWrapper>_(1).chain(); +result = <_.LoDashWrapper>_.chain(true); +result = <_.LoDashWrapper>_(true).chain(); +result = <_.LoDashArrayWrapper>_.chain(['test1', 'test2']); +result = <_.LoDashArrayWrapper>_(['test1', 'test2']).chain(); +result = <_.LoDashObjectWrapper<_.Dictionary>>_.chain({'key1': 'test1', 'key2': 'test2'}); +result = <_.LoDashObjectWrapper<_.Dictionary>>_({'key1': 'test1', 'key2': 'test2'}).chain(); + +//Wrapped array shortcut methods +result = <_.LoDashArrayWrapper>_([1, 2, 3, 4]).concat(5, 6); +result = <_.LoDashWrapper>_([1, 2, 3, 4]).join(','); +result = <_.LoDashWrapper>_([1, 2, 3, 4]).pop(); +_([1, 2, 3, 4]).push(5, 6, 7); +result = <_.LoDashArrayWrapper>_([1, 2, 3, 4]).reverse(); +result = <_.LoDashWrapper>_([1, 2, 3, 4]).shift(); +result = <_.LoDashArrayWrapper>_([1, 2, 3, 4]).slice(1, 2); +result = <_.LoDashArrayWrapper>_([1, 2, 3, 4]).slice(2); +result = <_.LoDashArrayWrapper>_([1, 2, 3, 4]).sort((a, b) => 1); +result = <_.LoDashArrayWrapper>_([1, 2, 3, 4]).splice(1); +result = <_.LoDashArrayWrapper>_([1, 2, 3, 4]).splice(1, 2, 5, 6); +result = <_.LoDashWrapper>_([1, 2, 3, 4]).unshift(5, 6); + +result = _.tap([1, 2, 3, 4], function(array) { console.log(array); }); +result = <_.LoDashWrapper>_('test').tap(function(value) { console.log(value); }); +result = <_.LoDashArrayWrapper>_([1, 2, 3, 4]).tap(function(array) { console.log(array); }); +result = <_.LoDashObjectWrapper<_.Dictionary>>_({'key1': 'test1', 'key2': 'test2'}).tap(function(array) { console.log(array); }); + +result = _('test').toString(); +result = _([1, 2, 3]).toString(); +result = _({'key1': 'test1', 'key2': 'test2'}).toString(); + +result = _('test').valueOf(); +result = _([1, 2, 3]).valueOf(); +result = <_.Dictionary>_({'key1': 'test1', 'key2': 'test2'}).valueOf(); + +result = _('test').value(); +result = _([1, 2, 3]).value(); +result = <_.Dictionary>_({'key1': 'test1', 'key2': 'test2'}).value(); + +// /************* +// * Arrays * +// *************/ +result = _.compact([0, 1, false, 2, '', 3]); + result = <_.LoDashArrayWrapper>_([0, 1, false, 2, '', 3]).compact(); + +result = _.difference([1, 2, 3, 4, 5], [5, 2, 10]); + result = <_.LoDashArrayWrapper>_([1, 2, 3, 4, 5]).difference([5, 2, 10]); + +result = _.rest([1, 2, 3]); +result = _.rest([1, 2, 3], 2); +result = _.rest([1, 2, 3], (num) => num < 3) +result = _.rest(foodsOrganic, 'test'); +result = _.rest(foodsType, { 'type': 'value' }); + +result = _.drop([1, 2, 3]); +result = _.drop([1, 2, 3], 2); +result = _.drop([1, 2, 3], (num) => num < 3) +result = _.drop(foodsOrganic, 'test'); +result = _.drop(foodsType, { 'type': 'value' }); + +result = _.tail([1, 2, 3]) +result = _.tail([1, 2, 3], 2) +result = _.tail([1, 2, 3], (num) => num < 3) +result = _.tail(foodsOrganic, 'test') +result = _.tail(foodsType, { 'type': 'value' }) + +result = _.findIndex(['apple', 'banana', 'beet'], function(f) { + return /^b/.test(f); +}); +result = _.findIndex(['apple', 'banana', 'beet'], 'apple'); +result = _.findIndex([{ food: 'apple' }, { food: 'banana' }, { food: 'beet' }], { food: 'apple'}); + +result = _.findLastIndex(['apple', 'banana', 'beet'], function(f: string) { + return /^b/.test(f); +}); +result = _.findLastIndex(['apple', 'banana', 'beet'], 'apple'); +result = _.findLastIndex([{ food: 'apple' }, { food: 'banana' }, { food: 'beet' }], { food: 'apple'}); + +result = _.first([1, 2, 3]); +result = _.first([1, 2, 3], 2); +result = _.first([1, 2, 3], function(num) { + return num < 3; +}); +result = _.first(foodsOrganic, 'organic'); +result = _.first(foodsType, { 'type': 'fruit' }); + + result = _.head([1, 2, 3]); + result = _.head([1, 2, 3], 2); + result = _.head([1, 2, 3], function(num) { + return num < 3; + }); + result = _.head(foodsOrganic, 'organic'); + result = _.head(foodsType, { 'type': 'fruit' }); + + result = _.take([1, 2, 3]); + result = _.take([1, 2, 3], 2); + result = _.take([1, 2, 3], (num) => num < 3); + result = _.take(foodsOrganic, 'organic'); + result = _.take(foodsType, { 'type': 'fruit' }); + +result = _.flatten([1, [2], [3, [[4]]]]); +result = _.flatten([1, [2], [3, [[4]]]], true); +var result: any +result = _.flatten(stoogesQuotes, 'quotes'); + + result = <_.LoDashArrayWrapper>_([1, [2], [3, [[4]]]]).flatten(); + result = <_.LoDashArrayWrapper>_([1, [2], [3, [[4]]]]).flatten(true); + result = <_.LoDashArrayWrapper>_(stoogesQuotes).flatten('quotes'); + +result = _.indexOf([1, 2, 3, 1, 2, 3], 2); +result = _.indexOf([1, 2, 3, 1, 2, 3], 2, 3); +result = _.indexOf([1, 1, 2, 2, 3, 3], 2, true); + +result = _.initial([1, 2, 3]); +result = _.initial([1, 2, 3], 2); +result = _.initial([1, 2, 3], function(num) { + return num > 1; +}); +result = _.initial(foodsOrganic, 'organic'); +result = _.initial(foodsType, { 'type': 'vegetable' }); + +result = _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); + +result = _.last([1, 2, 3]); +result = _.last([1, 2, 3], 2); +result = _.last([1, 2, 3], function(num) { + return num > 1; +}); +result = _.last(foodsOrganic, 'organic'); +result = _.last(foodsType, { 'type': 'vegetable' }); + +result = _.lastIndexOf([1, 2, 3, 1, 2, 3], 2); +result = _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3); + +result = <{[key: string]: any}>_.zipObject(['moe', 'larry'], [30, 40]); + result = <{[key: string]: any}>_.object(['moe', 'larry'], [30, 40]); + +result = _.pull([1, 2, 3, 1, 2, 3], 2, 3); + +result = _.range(10); +result = _.range(1, 11); +result = _.range(0, 30, 5); +result = _.range(0, -10, -1); +result = _.range(1, 4, 0); +result = _.range(0); + +result = _.remove([1, 2, 3, 4, 5, 6], function(num: number) { return num % 2 == 0; }); +result = _.remove(foodsOrganic, 'organic'); +result = _.remove(foodsType, { 'type': 'vegetable'}); + +result = _.sortedIndex([20, 30, 50], 40); +result = _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x'); +var sortedIndexDict = { + 'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 } +}; +result = _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) { + return sortedIndexDict.wordToNumber[word]; +}); +result = _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) { + return this.wordToNumber[word]; +}, sortedIndexDict); + +result = _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); + +result = _.uniq([1, 2, 1, 3, 1]); +result = _.uniq([1, 1, 2, 2, 3], true); +result = _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { + return letter.toLowerCase(); +}); +result = _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math); +result = <{x: number;}[]>_.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + + result = _.unique([1, 2, 1, 3, 1]); + result = _.unique([1, 1, 2, 2, 3], true); + result = _.unique(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { + return letter.toLowerCase(); + }); + result = _.unique([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math); + result = <{x: number;}[]>_.unique([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + +result = _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); + +result = _.zip(['moe', 'larry'], [30, 40], [true, false]); + result = _.unzip(['moe', 'larry'], [30, 40], [true, false]); + +// /* ************* +// * Collections * +// ************* */ + +result = _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]); +result = _.at(['moe', 'larry', 'curly'], 0, 2); + +result = _.contains([1, 2, 3], 1); +result = _.contains([1, 2, 3], 1, 2); +result = _.contains({ 'name': 'moe', 'age': 40 }, 'moe'); +result = _.contains('curly', 'ur'); + + result = _.include([1, 2, 3], 1); + result = _.include([1, 2, 3], 1, 2); + result = _.include({ 'name': 'moe', 'age': 40 }, 'moe'); + result = _.include('curly', 'ur'); + +result = <_.Dictionary>_.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); }); +result = <_.Dictionary>_.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math); +result = <_.Dictionary>_.countBy(['one', 'two', 'three'], 'length'); + + result = <_.LoDashObjectWrapper<_.Dictionary>>_([4.3, 6.1, 6.4]).countBy(function(num) { return Math.floor(num); }); + result = <_.LoDashObjectWrapper<_.Dictionary>>_([4.3, 6.1, 6.4]).countBy(function(num) { return this.floor(num); }, Math); + result = <_.LoDashObjectWrapper<_.Dictionary>>_(['one', 'two', 'three']).countBy('length'); + +result = _.every([true, 1, null, 'yes'], Boolean); +result = _.every(stoogesAges, 'age'); +result = _.every(stoogesAges, { 'age': 50 }); + + result = _.all([true, 1, null, 'yes'], Boolean); + result = _.all(stoogesAges, 'age'); + result = _.all(stoogesAges, { 'age': 50 }); + +result = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }); +result = _.filter(foodsCombined, 'organic'); +result = _.filter(foodsCombined, { 'type': 'fruit' }); + + result = _([1, 2, 3, 4, 5, 6]).filter(function(num) { return num % 2 == 0; }); + result = _(foodsCombined).filter('organic'); + result = _(foodsCombined).filter({ 'type': 'fruit' }); + + result = _.select([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }); + result = _.select(foodsCombined, 'organic'); + result = _.select(foodsCombined, { 'type': 'fruit' }); + + result = _([1, 2, 3, 4, 5, 6]).select(function(num) { return num % 2 == 0; }); + result = _(foodsCombined).select('organic'); + result = _(foodsCombined).select({ 'type': 'fruit' }); + +result = _.find([1, 2, 3, 4], function(num) { + return num % 2 == 0; +}); +result = _.find(foodsCombined, { 'type': 'vegetable' }); +result = _.find(foodsCombined, 'organic'); + + result = _.detect([1, 2, 3, 4], function(num) { + return num % 2 == 0; + }); + result = _.detect(foodsCombined, { 'type': 'vegetable' }); + result = _.detect(foodsCombined, 'organic'); + + result = _.findWhere([1, 2, 3, 4], function(num) { + return num % 2 == 0; + }); + result = _.findWhere(foodsCombined, { 'type': 'vegetable' }); + result = _.findWhere(foodsCombined, 'organic'); + +result = _.findLast([1, 2, 3, 4], function(num) { + return num % 2 == 0; +}); +result = _.findLast(foodsCombined, { 'type': 'vegetable' }); +result = _.findLast(foodsCombined, 'organic'); + +result = _.forEach([1, 2, 3], function(num) { console.log(num); }); +result = <_.Dictionary>_.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); }); + + result = _.each([1, 2, 3], function(num) { console.log(num); }); + result = <_.Dictionary>_.each({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); }); + + result = <_.LoDashArrayWrapper>_([1, 2, 3]).forEach(function(num) { console.log(num); }); + result = <_.LoDashObjectWrapper<_.Dictionary>>_({ 'one': 1, 'two': 2, 'three': 3 }).forEach(function(num) { console.log(num); }); + + result = <_.LoDashArrayWrapper>_([1, 2, 3]).each(function(num) { console.log(num); }); + result = <_.LoDashObjectWrapper<_.Dictionary>>_({ 'one': 1, 'two': 2, 'three': 3 }).each(function(num) { console.log(num); }); + +result = _.forEachRight([1, 2, 3], function(num) { console.log(num); }); +result = <_.Dictionary>_.forEachRight({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); }); + + result = _.eachRight([1, 2, 3], function(num) { console.log(num); }); + result = <_.Dictionary>_.eachRight({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); }); + + result = <_.LoDashArrayWrapper>_([1, 2, 3]).forEachRight(function(num) { console.log(num); }); + result = <_.LoDashObjectWrapper<_.Dictionary>>_({ 'one': 1, 'two': 2, 'three': 3 }).forEachRight(function(num) { console.log(num); }); + + result = <_.LoDashArrayWrapper>_([1, 2, 3]).eachRight(function(num) { console.log(num); }); + result = <_.LoDashObjectWrapper<_.Dictionary>>_({ 'one': 1, 'two': 2, 'three': 3 }).eachRight(function(num) { console.log(num); }); + +result = <_.Dictionary>_.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); }); +result = <_.Dictionary>_.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math); +result = <_.Dictionary>_.groupBy(['one', 'two', 'three'], 'length'); + + result = <_.LoDashObjectWrapper<_.Dictionary>>_([4.2, 6.1, 6.4]).groupBy(function(num) { return Math.floor(num); }); + result = <_.LoDashObjectWrapper<_.Dictionary>>_([4.2, 6.1, 6.4]).groupBy(function(num) { return this.floor(num); }, Math); + result = <_.LoDashObjectWrapper<_.Dictionary>>_(['one', 'two', 'three']).groupBy('length'); + +result = <_.Dictionary>_.indexBy(keys, 'dir'); +result = <_.Dictionary>_.indexBy(keys, function(key) { return String.fromCharCode(key.code); }); +result = <_.Dictionary>_.indexBy(keys, function(key) { this.fromCharCode(key.code); }, String); + +result = _.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); +result = _.invoke([123, 456], String.prototype.split, ''); + +result = _.map([1, 2, 3], function(num) { return num * 3; }); +result = _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; }); +result = _.map(stoogesAges, 'name'); + + result = _.collect([1, 2, 3], function(num) { return num * 3; }); + result = _.collect({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; }); + result = _.collect(stoogesAges, 'name'); + +result = _.max([4, 2, 8, 6]); +result = _.max(stoogesAges, function(stooge) { return stooge.age; }); +result = _.max(stoogesAges, 'age'); + +result = _.min([4, 2, 8, 6]); +result = _.min(stoogesAges, function(stooge) { return stooge.age; }); +result = _.min(stoogesAges, 'age'); + +result = _.pluck(stoogesAges, 'name'); + +result = _.reduce([1, 2, 3], function(sum: number, num: number) { + return sum + num; +}); +result = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(r: any, num: number, key: string) { + r[key] = num * 3; + return r; +}, {}); + + result = _.foldl([1, 2, 3], function(sum: number, num: number) { + return sum + num; + }); + result = _.foldl({ 'a': 1, 'b': 2, 'c': 3 }, function(r: any, num: number, key: string) { + r[key] = num * 3; + return r; + }, {}); + + result = _.inject([1, 2, 3], function(sum: number, num: number) { + return sum + num; + }); + result = _.inject({ 'a': 1, 'b': 2, 'c': 3 }, function(r: any, num: number, key: string) { + r[key] = num * 3; + return r; + }, {}); + +result = _.reduceRight([[0, 1], [2, 3], [4, 5]], function(a: number[], b: number[]) { return a.concat(b); }, []); + result = _.foldr([[0, 1], [2, 3], [4, 5]], function(a: number[], b: number[]) { return a.concat(b); }, []); + +result = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }); +result = _.reject(foodsCombined, 'organic'); +result = _.reject(foodsCombined, { 'type': 'fruit' }); + +result = _.sample([1, 2, 3, 4]); +result = _.sample([1, 2, 3, 4], 2); + +result = _.shuffle([1, 2, 3, 4, 5, 6]); + +result = _.size([1, 2]); +result = _.size({ 'one': 1, 'two': 2, 'three': 3 }); +result = _.size('curly'); + +result = _.some([null, 0, 'yes', false], Boolean); +result = _.some(foodsCombined, 'organic'); +result = _.some(foodsCombined, { 'type': 'meat' }); + + result = _.any([null, 0, 'yes', false], Boolean); + result = _.any(foodsCombined, 'organic'); + result = _.any(foodsCombined, { 'type': 'meat' }); + +result = _.sortBy([1, 2, 3], function(num) { return Math.sin(num); }); +result = _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math); +result = _.sortBy(['banana', 'strawberry', 'apple'], 'length'); + +(function(a: any, b: any, c: any, d: any){ return _.toArray(arguments).slice(1); })(1, 2, 3, 4); + +result = _.where(stoogesCombined, { 'age': 40 }); +result = _.where(stoogesCombined, { 'quotes': ['Poifect!'] }); + +/************* + * Functions * + *************/ +var saves = ['profile', 'settings']; +var asyncSave = (obj: any) => obj.done(); +var done: Function; + +done = _.after(saves.length, function() { + console.log('Done saving!'); +}); + +_.forEach(saves, function(type) { + asyncSave({ 'type': type, 'complete': done }); +}); + +done = _(saves.length).after(function() { + console.log('Done saving!'); +}).value(); + +_.forEach(saves, function(type) { + asyncSave({ 'type': type, 'complete': done }); +}); + +var funcBind = function (greeting: string) { return greeting + ' ' + this.name }; +var funcBind2: () => any = _.bind(funcBind, { 'name': 'moe' }, 'hi'); +funcBind2(); + +var funcBind3: () => any = _(funcBind).bind({ 'name': 'moe' }, 'hi').value(); +funcBind3(); + +var view = { + 'label': 'docs', + 'onClick': function() { console.log('clicked ' + this.label); } +}; + +view = _.bindAll(view); +jQuery('#docs').on('click', view.onClick); + +view = _(view).bindAll().value(); +jQuery('#docs').on('click', view.onClick); + +var objectBindKey = { + 'name': 'moe', + 'greet': function(greeting: string) { + return greeting + ' ' + this.name; + } +}; + +var funcBindKey: Function = _.bindKey(objectBindKey, 'greet', 'hi'); +funcBindKey(); + +objectBindKey.greet = function(greeting) { + return greeting + ', ' + this.name + '!'; +}; + +funcBindKey(); + +funcBindKey = _(objectBindKey).bindKey('greet', 'hi').value(); +funcBindKey(); + +var realNameMap = { + 'curly': 'jerome' +}; + +var format = function(name: string) { + name = realNameMap[name.toLowerCase()] || name; + return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase(); +}; + +var greet = function(formatted: string) { + return 'Hiya ' + formatted + '!'; +}; + +result = _.compose(greet, format); +result = <_.LoDashObjectWrapper>_(greet).compose(format); + +var createCallbackObj = { name: 'Joe' }; +result = <() => any>_.createCallback('name'); +result = <() => boolean>_.createCallback(createCallbackObj); +result = <_.LoDashObjectWrapper<() => any>>_('name').createCallback(); +result = <_.LoDashObjectWrapper<() => boolean>>_(createCallbackObj).createCallback(); + +result = _.curry(function(a, b, c) { + console.log(a + b + c); +}); + +result = <_.LoDashObjectWrapper>_(function(a, b, c) { + console.log(a + b + c); +}).curry(); + +declare var source: any; +result = _.debounce(function() {}, 150); + +jQuery('#postbox').on('click', _.debounce(function() {}, 300, { + 'leading': true, + 'trailing': false +})); + +source.addEventListener('message', _.debounce(function() {}, 250, { + 'maxWait': 1000 +}), false); + +result = <_.LoDashObjectWrapper>_(function() {}).debounce(150); + +jQuery('#postbox').on('click', <_.LoDashObjectWrapper>_(function() {}).debounce(300, { + 'leading': true, + 'trailing': false +})); + +source.addEventListener('message', <_.LoDashObjectWrapper>_(function() {}).debounce(250, { + 'maxWait': 1000 +}), false); + +result = _.defer(function() { console.log('deferred'); }); +result = <_.LoDashWrapper>_(function() { console.log('deferred'); }).defer(); + +var log = _.bind(console.log, console); +result = _.delay(log, 1000, 'logged later'); +result = <_.LoDashWrapper>_(log).delay(1000, 'logged later'); + +var fibonacci = _.memoize(function(n) { + return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); +}); + +var data = { + 'moe': { 'name': 'moe', 'age': 40 }, + 'curly': { 'name': 'curly', 'age': 60 } +}; + +var stooge = _.memoize(function(name: string) { return data[name]; }, _.identity); +stooge('curly'); + +stooge['cache']['curly'].name = 'jerome'; +stooge('curly'); + +var initialize = _.once(function(){ }); +initialize(); +initialize(); + +var greetPartial = function(greeting: string, name: string) { return greeting + ' ' + name; }; +var hi = _.partial(greetPartial, 'hi'); +hi('moe'); + +var defaultsDeep = _.partialRight(_.merge, _.defaults); + +var optionsPartialRight = { + 'variable': 'data', + 'imports': { 'jq': $ } +}; + +defaultsDeep(optionsPartialRight, _.templateSettings); + +var throttled = _.throttle(function () { }, 100); +jQuery(window).on('scroll', throttled); + +jQuery('.interactive').on('click', _.throttle(function() { }, 300000, { + 'trailing': false +})); + +var helloWrap = function(name: string) { return 'hello ' + name; }; +var helloWrap2 = _.wrap(helloWrap, function(func) { + return 'before, ' + func('moe') + ', after'; +}); +helloWrap2(); + +/********** +* Objects * +***********/ +result = _.assign({ 'name': 'moe' }, { 'age': 40 }); +result = _.assign({ 'name': 'moe' }, { 'age': 40 }, function(a: any, b: any) { + return typeof a == 'undefined' ? b : a; +}); + +result = <_.LoDashObjectWrapper>_({ 'name': 'moe' }).assign({ 'age': 40 }); +result = <_.LoDashObjectWrapper>_({ 'name': 'moe' }).assign({ 'age': 40 }, function(a: any, b: any) { + return typeof a == 'undefined' ? b : a; +}); + + result = _.extend({ 'name': 'moe' }, { 'age': 40 }); + result = _.extend({ 'name': 'moe' }, { 'age': 40 }, function(a: any, b: any) { + return typeof a == 'undefined' ? b : a; + }); + + result = <_.LoDashObjectWrapper>_({ 'name': 'moe' }).extend({ 'age': 40 }); + result = <_.LoDashObjectWrapper>_({ 'name': 'moe' }).extend({ 'age': 40 }, function(a: any, b: any) { + return typeof a == 'undefined' ? b : a; + }); + +var result = _.clone(stoogesAges); +var result = _.clone(stoogesAges, true); +var result = _.clone(stoogesAges, true, function(value) { + return _.isElement(value) ? value.cloneNode(false) : undefined; +}); + +var result = _.cloneDeep(stoogesAges); +var result = _.cloneDeep(stoogesAges, function(value) { + return _.isElement(value) ? value.cloneNode(false) : undefined; +}); + +var foodDefaults = { 'name': 'apple' }; +result = _.defaults(foodDefaults, { 'name': 'banana', 'type': 'fruit' }); +result = _(foodDefaults).defaults({ 'name': 'banana', 'type': 'fruit' }); + +result = _.findKey({ 'a': 1, 'b': 2, 'c': 3, 'd': 4 }, function(num) { + return num % 2 == 0; +}); + +result = _.findLastKey({ 'a': 1, 'b': 2, 'c': 3, 'd': 4 }, function(num) { + return num % 2 == 1; +}); + +result = _.forIn(new Dog('Dagny'), function(value, key) { + console.log(key); +}); + + result = <_.LoDashObjectWrapper>_(new Dog('Dagny')).forIn(function(value, key) { + console.log(key); + }); + +result = _.forInRight(new Dog('Dagny'), function(value, key) { + console.log(key); +}); + + result = <_.LoDashObjectWrapper>_(new Dog('Dagny')).forInRight(function(value, key) { + console.log(key); + }); + +result = _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) { + console.log(key); +}); + + result = <_.LoDashObjectWrapper>_({ '0': 'zero', '1': 'one', 'length': 2 }).forOwn(function(num, key) { + console.log(key); + }); + +result = _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) { + console.log(key); +}); + + result = <_.LoDashObjectWrapper>_({ '0': 'zero', '1': 'one', 'length': 2 }).forOwnRight(function(num, key) { + console.log(key); + }); + +result = _.functions(_); + result = _.methods(_); + + result = <_.LoDashArrayWrapper>_(_).functions(); + result = <_.LoDashArrayWrapper>_(_).methods(); + +result = _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b'); + +result = _.invert({ 'first': 'moe', 'second': 'larry' }); + +(function(...args: any[]) { return _.isArguments(arguments); })(1, 2, 3); + +(function () { return _.isArray(arguments); })(); +result = _.isArray([1, 2, 3]); + +result = _.isBoolean(null); + +result = _.isDate(new Date()); + +result = _.isElement(document.body); + +result = _.isEmpty([1, 2, 3]); +result = _.isEmpty({}); +result = _.isEmpty(''); + +var moe = { 'name': 'moe', 'age': 40 }; +var copy = { 'name': 'moe', 'age': 40 }; + +result = _.isEqual(moe, copy); + +var words = ['hello', 'goodbye']; +var otherWords = ['hi', 'goodbye']; + +result = _.isEqual(words, otherWords, function(a, b) { + var reGreet = /^(?:hello|hi)$/i, + aGreet = _.isString(a) && reGreet.test(a), + bGreet = _.isString(b) && reGreet.test(b); + + return (aGreet || bGreet) ? (aGreet == bGreet) : undefined; +}); + +result = _.isFinite(-101); +result = _.isFinite('10'); +result = _.isFinite(true); +result = _.isFinite(''); +result = _.isFinite(Infinity); + +result = _.isFunction(_); + +result = _.isNaN(NaN); +result = _.isNaN(new Number(NaN)); +result = _.isNaN(undefined); + +result = _.isNull(null); +result = _.isNull(undefined); + +result = _.isNumber(8.4 * 5); + +result = _.isObject({}); +result = _.isObject([1, 2, 3]); +result = _.isObject(1); + +class Stooge { + constructor( + public name: string, + public age: number + ) {} +} + +result = _.isPlainObject(new Stooge('moe', 40)); +result = _.isPlainObject([1, 2, 3]); +result = _.isPlainObject({ 'name': 'moe', 'age': 40 }); + +result = _.isRegExp(/moe/); + +result = _.isString('moe'); + +result = _.isUndefined(void 0); + +result = _.keys({ 'one': 1, 'two': 2, 'three': 3 }); + +var mergeNames = { + 'stooges': [ + { 'name': 'moe' }, + { 'name': 'larry' } + ] +}; + +var mergeAges = { + 'stooges': [ + { 'age': 40 }, + { 'age': 50 } + ] +}; + +result = _.merge(mergeNames, mergeAges); + +var mergeFood = { + 'fruits': ['apple'], + 'vegetables': ['beet'] +}; + +var mergeOtherFood = { + 'fruits': ['banana'], + 'vegetables': ['carrot'] +}; + +result = _.merge(mergeFood, mergeOtherFood, function(a: any, b: any) { + return _.isArray(a) ? a.concat(b) : undefined; +}); + +result = _.omit({ 'name': 'moe', 'age': 40 }, 'age'); +result = _.omit({ 'name': 'moe', 'age': 40 }, ['age']); +result = _.omit({ 'name': 'moe', 'age': 40 }, function(value) { + return typeof value == 'number'; +}); + +result = _.pairs({ 'moe': 30, 'larry': 40 }); + +result = _.pick({ 'name': 'moe', '_userid': 'moe1' }, 'name'); +result = _.pick({ 'name': 'moe', '_userid': 'moe1' }, ['name']); +result = _.pick({ 'name': 'moe', '_userid': 'moe1' }, function(value, key) { + return key.charAt(0) != '_'; +}); + +result = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(r: any, num: number) { + num *= num; + if (num % 2) { + return r.push(num) < 3; + } +}); +// → [1, 9, 25] + +result = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(r: any, num: number, key: string) { + r[key] = num * 3; +}); + +result = _.values({ 'one': 1, 'two': 2, 'three': 3 }); + +/********** +* Utilities * +***********/ + +result = _.escape('Moe, Larry & Curly'); + +result = <{ name: string }>_.identity({ 'name': 'moe' }); + +_.mixin({ + 'capitalize': function(string) { + return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase(); + } +}); + +var lodash = _.noConflict(); + +result = _.parseInt('08'); + +result = _.random(0, 5); +result = _.random(5); +result = _.random(5, true); +result = _.random(1.2, 5.2); +result = _.random(0, 5, true); + +var object = { + 'cheese': 'crumpets', + 'stuff': function() { + return 'nonsense'; + } +}; + +result = _.result(object, 'cheese'); +result = _.result(object, 'stuff'); + +var tempObject = {}; +result = _.runInContext(tempObject); + +result = <_.TemplateExecutor>_.template('hello <%= name %>'); +result = _.template('<%- value %>', { 'value': '