From e879c37f14bd4cfafffa456773959387188daf14 Mon Sep 17 00:00:00 2001 From: Daniel Ferreira Monteiro Alves Date: Wed, 21 Aug 2013 15:58:51 -0300 Subject: [PATCH 001/285] change bool to boolean in jquery.d.ts --- jquery/jquery.d.ts | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/jquery/jquery.d.ts b/jquery/jquery.d.ts index c175d25f5..8680bdfe3 100644 --- a/jquery/jquery.d.ts +++ b/jquery/jquery.d.ts @@ -190,7 +190,7 @@ interface JQuerySupport { interface JQueryParam { (obj: any): string; - (obj: any, traditional: bool): string; + (obj: any, traditional: boolean): string; } /* @@ -224,7 +224,7 @@ interface JQueryStatic { Callbacks(flags?: string): JQueryCallback; // Core - holdReady(hold: bool): any; + holdReady(hold: boolean): any; (selector: string, context?: any): JQuery; (element: Element): JQuery; @@ -235,7 +235,7 @@ interface JQueryStatic { (array: any[]): JQuery; (): JQuery; - noConflict(removeAll?: bool): Object; + noConflict(removeAll?: boolean): Object; when(...deferreds: any[]): JQueryPromise; @@ -296,11 +296,11 @@ interface JQueryStatic { each(collection: T[], callback: (indexInArray: number, valueOfElement: T) => any): any; extend(target: any, ...objs: any[]): Object; - extend(deep: bool, target: any, ...objs: any[]): Object; + extend(deep: boolean, target: any, ...objs: any[]): Object; globalEval(code: string): any; - grep(array: T[], func: (elementOfArray: T, indexInArray: number) => boolean, invert?: bool): T[]; + grep(array: T[], func: (elementOfArray: T, indexInArray: number) => boolean, invert?: boolean): T[]; inArray(value: T, array: T[], fromIndex?: number): number; @@ -344,7 +344,7 @@ interface JQueryStatic { * @param context DOM element to serve as the context in which the HTML fragment will be created * @param keepScripts A Boolean indicating whether to include scripts passed in the HTML string */ - parseHTML(data: string, context?: HTMLElement, keepScripts?: bool): any[]; + parseHTML(data: string, context?: HTMLElement, keepScripts?: boolean): any[]; } /* @@ -396,8 +396,8 @@ interface JQuery { removeProp(propertyName: any): JQuery; - toggleClass(className: any, swtch?: bool): JQuery; - toggleClass(swtch?: bool): JQuery; + toggleClass(className: any, swtch?: boolean): JQuery; + toggleClass(swtch?: boolean): JQuery; toggleClass(func: (index: any, cls: any, swtch: any) => any): JQuery; val(): any; @@ -425,8 +425,8 @@ interface JQuery { offset(coordinates: any): JQuery; offset(func: (index: any, coords: any) => any): JQuery; - outerHeight(includeMargin?: bool): number; - outerWidth(includeMargin?: bool): number; + outerHeight(includeMargin?: boolean): number; + outerWidth(includeMargin?: boolean): number; position(): { top: number; left: number; }; @@ -491,17 +491,17 @@ interface JQuery { slideUp(duration?: any, callback?: any): JQuery; slideUp(duration?: any, easing?: string, callback?: any): JQuery; - stop(clearQueue?: bool, jumpToEnd?: bool): JQuery; - stop(queue?: any, clearQueue?: bool, jumpToEnd?: bool): JQuery; + stop(clearQueue?: boolean, jumpToEnd?: boolean): JQuery; + stop(queue?: any, clearQueue?: boolean, jumpToEnd?: boolean): JQuery; toggle(duration?: any, callback?: any): JQuery; toggle(duration?: any, easing?: string, callback?: any): JQuery; - toggle(showOrHide: bool): JQuery; + toggle(showOrHide: boolean): JQuery; // Events bind(eventType: string, eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery; - bind(eventType: string, eventData: any, preventBubble: bool): JQuery; - bind(eventType: string, preventBubble: bool): JQuery; + bind(eventType: string, eventData: any, preventBubble: boolean): JQuery; + bind(eventType: string, preventBubble: boolean): JQuery; bind(...events: any[]); blur(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery; @@ -603,7 +603,7 @@ interface JQuery { triggerHandler(eventType: string, ...extraParameters: any[]): Object; unbind(eventType?: string, handler?: (eventObject: JQueryEventObject) => any): JQuery; - unbind(eventType: string, fls: bool): JQuery; + unbind(eventType: string, fls: boolean): JQuery; unbind(evt: any): JQuery; undelegate(): JQuery; @@ -636,7 +636,7 @@ interface JQuery { before(...content: any[]): JQuery; before(func: (index: any) => any); - clone(withDataAndEvents?: bool, deepWithDataAndEvents?: bool): JQuery; + clone(withDataAndEvents?: boolean, deepWithDataAndEvents?: boolean): JQuery; detach(selector?: any): JQuery; From 7871c302985937d4ffd3d99d2aedb4630c38f1af Mon Sep 17 00:00:00 2001 From: Felix Fung Date: Tue, 8 Oct 2013 17:43:37 -0400 Subject: [PATCH 002/285] Ember.run.{debounce,throttle,later} have variable arguments Straight from the docs (http://emberjs.com/api/classes/Ember.run.html), see the method debounce is defined thusly: debounce (target, method, args*, wait, immediate): void Even though the last two arguments are guaranteed, the variable arguments in the middle means we can only ever type everything after method as "...any". --- ember/ember.d.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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; From 5485e61d3675b84e18f0c645c898e777329b5afc Mon Sep 17 00:00:00 2001 From: Brian Zengel Date: Sat, 12 Oct 2013 20:57:49 -0400 Subject: [PATCH 003/285] copied underscore typings as a start point --- lodash/underscore-tests.ts | 302 ++++ lodash/underscore.d.ts | 2954 ++++++++++++++++++++++++++++++++++++ 2 files changed, 3256 insertions(+) create mode 100644 lodash/underscore-tests.ts create mode 100644 lodash/underscore.d.ts diff --git a/lodash/underscore-tests.ts b/lodash/underscore-tests.ts new file mode 100644 index 000000000..aa70ea4d9 --- /dev/null +++ b/lodash/underscore-tests.ts @@ -0,0 +1,302 @@ +/// + +declare var $; + +_.each([1, 2, 3], (num) => alert(num.toString())); +_.each({ one: 1, two: 2, three: 3 }, (value) => alert(value.toString())); + +_.map([1, 2, 3], (num) => num * 3); +_.map({ one: 1, two: 2, three: 3 }, (value: number, key?: string) => value * 3); + +var sum = _.reduce([1, 2, 3], (memo, num) => memo + num, 0); +sum = _.reduce([1, 2, 3], (memo, num) => memo + num); // memo is optional #issue 5 github + +var list = [[0, 1], [2, 3], [4, 5]]; +var flat = _.reduceRight(list, (a, b) => a.concat(b), []); + +var even = _.find([1, 2, 3, 4, 5, 6], (num) => num % 2 == 0); + +var evens = _.filter([1, 2, 3, 4, 5, 6], (num) => num % 2 == 0); + +var listOfPlays = [{ title: "Cymbeline", author: "Shakespeare", year: 1611 }, { title: "The Tempest", author: "Shakespeare", year: 1611 }, { title: "Other", author: "Not Shakespeare", year: 2012 }]; +_.where(listOfPlays, { author: "Shakespeare", year: 1611 }); + +var odds = _.reject([1, 2, 3, 4, 5, 6], (num) => num % 2 == 0); + +_.every([true, 1, null, 'yes'], _.identity); +_.every<{}>([true, 1, null, 'yes']); + +_.any([null, 0, 'yes', false]); + +_.contains([1, 2, 3], 3); + +_.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); + +var stooges = [{ name: 'moe', age: 40 }, { name: 'larry', age: 50 }, { name: 'curly', age: 60 }]; +_.pluck(stooges, 'name'); + +_.max(stooges, (stooge) => stooge.age); + +_.max([1, 2, 3, 4, 5]); + +var numbers = [10, 5, 100, 2, 1000]; +_.min(numbers); + +_.sortBy([1, 2, 3, 4, 5, 6], (num) => Math.sin(num)); + + +_([1.3, 2.1, 2.4]).groupBy((e) => Math.floor(e)); +_.groupBy([1.3, 2.1, 2.4], (num: number) => Math.floor(num).toString()); +_.groupBy(['one', 'two', 'three'], 'length'); + +_.indexBy(stooges, 'age')['40'].age; +_(stooges).indexBy('age')['40'].name; +_(stooges) + .chain() + .indexBy('age') + .value()['40'].age; + +_.countBy([1, 2, 3, 4, 5], (num) => (num % 2 == 0) ? 'even' : 'odd'); + +_.shuffle([1, 2, 3, 4, 5, 6]); + +(function(a, b, c, d){ return _.toArray(arguments).slice(1); })(1, 2, 3, 4); + +_.size({ one: 1, two: 2, three: 3 }); + +/////////////////////////////////////////////////////////////////////////////////////// + +_.first([5, 4, 3, 2, 1]); +_.initial([5, 4, 3, 2, 1]); +_.last([5, 4, 3, 2, 1]); +_.rest([5, 4, 3, 2, 1]); +_.compact([0, 1, false, 2, '', 3]); + +_.flatten([1, 2, 3, 4]); +_.flatten([1, [2]]); + +// typescript doesn't like the elements being different +_.flatten([1, [2], [3, [[4]]]]); +_.flatten([1, [2], [3, [[4]]]], true); +_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); +_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); +_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); +_.difference([1, 2, 3, 4, 5], [5, 2, 10]); +_.uniq([1, 2, 1, 3, 1, 4]); +_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]); +var r = _.object<{ [key: string]: number }>(['moe', 'larry', 'curly'], [30, 40, 50]); +_.object([['moe', 30], ['larry', 40], ['curly', 50]]); +_.indexOf([1, 2, 3], 2); +_.lastIndexOf([1, 2, 3, 1, 2, 3], 2); +_.sortedIndex([10, 20, 30, 40, 50], 35); +_.range(10); +_.range(1, 11); +_.range(0, 30, 5); +_.range(0, 30, 5); +_.range(0); + +/////////////////////////////////////////////////////////////////////////////////////// + +var func = function (greeting) { return greeting + ': ' + this.name }; +// need a second var otherwise typescript thinks func signature is the above func type, +// instead of the newly returned _bind => func type. +var func2 = _.bind(func, { name: 'moe' }, 'hi'); +func2(); + +var buttonView = { + label: 'underscore', + onClick: function () { alert('clicked: ' + this.label); }, + onHover: function () { console.log('hovering: ' + this.label); } +}; +_.bindAll(buttonView); +$('#underscore_button').bind('click', buttonView.onClick); + +var fibonacci = _.memoize(function (n) { + return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); +}); + +var log = _.bind(console.log, console); +_.delay(log, 1000, 'logged later'); + +_.defer(function () { alert('deferred'); }); + +var updatePosition = () => alert('updating position...'); +var throttled = _.throttle(updatePosition, 100); +$(window).scroll(throttled); + +var calculateLayout = () => alert('calculating layout...'); +var lazyLayout = _.debounce(calculateLayout, 300); +$(window).resize(lazyLayout); + +var createApplication = () => alert('creating application...'); +var initialize = _.once(createApplication); +initialize(); +initialize(); + +var notes: any[]; +var render = () => alert("rendering..."); +var renderNotes = _.after(notes.length, render); +_.each(notes, (note) => note.asyncSave({ success: renderNotes })); + +var hello = function (name) { return "hello: " + name; }; +// can't use the same "hello" var otherwise typescript fails +var hello2 = _.wrap(hello, (func) => { return "before, " + func("moe") + ", after"; }); +hello2(); + +var greet = function (name) { return "hi: " + name; }; +var exclaim = function (statement) { return statement + "!"; }; +var welcome = _.compose(exclaim, greet); +welcome('moe'); + +/////////////////////////////////////////////////////////////////////////////////////// + +_.keys({ one: 1, two: 2, three: 3 }); +_.values({ one: 1, two: 2, three: 3 }); +_.pairs({ one: 1, two: 2, three: 3 }); +_.invert({ Moe: "Moses", Larry: "Louis", Curly: "Jerome" }); +_.functions(_); +_.extend({ name: 'moe' }, { age: 50 }); +_.pick({ name: 'moe', age: 50, userid: 'moe1' }, 'name', 'age'); +_.omit({ name: 'moe', age: 50, userid: 'moe1' }, 'name'); +_.omit({ name: 'moe', age: 50, userid: 'moe1' }, 'name', 'age'); +_.omit({ name: 'moe', age: 50, userid: 'moe1' }, ['name', 'age']); + +var iceCream = { flavor: "chocolate" }; +_.defaults(iceCream, { flavor: "vanilla", sprinkles: "lots" }); + +_.clone({ name: 'moe' }); +_.clone(['i', 'am', 'an', 'object!']); + +_([1, 2, 3, 4]) + .chain() + .filter((num: number) => { + return num % 2 == 0; + }).tap(alert) + .map((num: number) => { + return num * num; + }) + .value(); + +_.chain([1, 2, 3, 200]) + .filter(function (num: number) { return num % 2 == 0; }) + .tap(alert) + .map(function (num: number) { return num * num }) + .value(); + +_.has({ a: 1, b: 2, c: 3 }, "b"); + +var moe = { name: 'moe', luckyNumbers: [13, 27, 34] }; +var clone = { name: 'moe', luckyNumbers: [13, 27, 34] }; +moe == clone; +_.isEqual(moe, clone); + +_.isEmpty([1, 2, 3]); +_.isEmpty({}); + +_.isElement($('body')[0]); + +(function () { return _.isArray(arguments); })(); +_.isArray([1, 2, 3]); + +_.isObject({}); +_.isObject(1); + + +// (() => { return _.isArguments(arguments); })(1, 2, 3); +_.isArguments([1, 2, 3]); + +_.isFunction(alert); + +_.isString("moe"); + +_.isNumber(8.4 * 5); + +_.isFinite(-101); + +_.isFinite(-Infinity); + +_.isBoolean(null); + +_.isDate(new Date()); + +_.isRegExp(/moe/); + +_.isNaN(NaN); +isNaN(undefined); +_.isNaN(undefined); + +_.isNull(null); +_.isNull(undefined); + +_.isUndefined((window).missingVariable); + +/////////////////////////////////////////////////////////////////////////////////////// + +var underscore = _.noConflict(); + +var moe2 = { name: 'moe' }; +moe2 === _.identity(moe); + +var genie; +var r2 = _.times(3, (n) => { return n * n }); +_(3).times(function (n) { genie.grantWishNumber(n); }); + +_.random(0, 100); + +_.mixin({ + capitalize: function (string) { + return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase(); + } +}); +(_("fabio")).capitalize(); + +_.uniqueId('contact_'); + +_.escape('Curly, Larry & Moe'); + +var object = { cheese: 'crumpets', stuff: function () { return 'nonsense'; } }; +_.result(object, 'cheese'); + +_.result(object, 'stuff'); + +var compiled = _.template("hello: <%= name %>"); +compiled({ name: 'moe' }); +var list2 = "<% _.each(people, function(name) { %>
  • <%= name %>
  • <% }); %>"; +_.template(list2, { people: ['moe', 'curly', 'larry'] }); +var template = _.template("<%- value %>"); +template({ value: '