diff --git a/README.md b/README.md
index 37e14c5e0..ad62b49ab 100644
--- a/README.md
+++ b/README.md
@@ -147,6 +147,7 @@ List of Definitions
* [Ubuntu Unity Web API](https://launchpad.net/libunity-webapps) (by [John Vrbanac](https://github.com/jmvrbanac))
* [Underscore.js](http://underscorejs.org/) (by [Boris Yankov](https://github.com/borisyankov))
* [Underscore.js (Typed)](http://underscorejs.org/) (by [Josh Baldwin](https://github.com/jbaldwin/))
+* [Underscore-ko.js](https://github.com/kamranayub/UnderscoreKO) (by [Maurits Elbers](https://github.com/MagicMau))
* [Viewporter](https://github.com/zynga/viewporter) (by [Boris Yankov](https://github.com/borisyankov))
* [Vimeo](http://developer.vimeo.com/player/js-api) (by [Daz Wilkin](https://github.com/DazWilkin/))
* [WebRTC](http://dev.w3.org/2011/webrtc/editor/webrtc.html) (by [Ken Smith](https://github.com/smithkl42))
diff --git a/underscore-ko/underscore-ko.d.ts b/underscore-ko/underscore-ko.d.ts
new file mode 100644
index 000000000..c10b49d43
--- /dev/null
+++ b/underscore-ko/underscore-ko.d.ts
@@ -0,0 +1,101 @@
+// Type definitions for Underscore-ko 1.2.2 with underscore 1.4
+// Project: https://github.com/kamranayub/UnderscoreKO
+// Definitions by: Maurits Elbers
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+///
+
+interface KnockoutObservableArrayFunctions {
+
+ /****
+ Collections
+ *****/
+ each(iterator: ListIterator, context?: any): any[];
+ each(iterator: ObjectIterator, context?: any): any[];
+ forEach(iterator: ObjectIterator, context?: any): any[];
+ forEach(iterator: ListIterator, context?: any): any[];
+
+ map(iterator: ListIterator, context?: any): any[];
+ map(iterator: ObjectIterator, context?: any): any[];
+ collect(iterator: ListIterator, context?: any): any[];
+ collect(iterator: ObjectIterator, context?: any): any[];
+
+ reduce(iterator: any, memo: any, context?: any): any;
+ inject(iterator: any, memo: any, context?: any): any;
+ foldl(iterator: any, memo: any, context?: any): any;
+
+ reduceRight(iterator: any, memo: any, context?: any): any[];
+ foldr(iterator: any, memo: any, context?: any): any[];
+
+ find(iterator: any, context?: any): any;
+ detect(iterator: any, context?: any): any;
+
+ filter(iterator: any, context?: any): any[];
+ select(iterator: any, context?: any): any[];
+
+ where(properties: any): any[];
+
+ reject(iterator: any, context?: any): any[];
+
+ all(iterator: any, context?: any): bool;
+ every(iterator: any, context?: any): bool;
+
+ any(iterator?: any, context?: any): bool;
+ some(iterator?: any, context?: any): bool;
+
+ contains(list: any, value: any): bool;
+ contains(value: any): bool;
+ include(list: any, value: any): bool;
+ include(value: any): bool;
+
+ invoke(methodName: string, arguments: any[]): any;
+ invoke(methodName: string, ...arguments: any[]): any;
+
+ pluck(propertyName: string): string[];
+ max(iterator?: any, context?: any): any;
+ min(iterator?: any, context?: any): any;
+ sortBy(iterator?: any, context?: any): any;
+ groupBy(iterator: any): any;
+ countBy(iterator: any): any;
+ shuffle(): any[];
+ size(): number;
+
+ /****
+ Arrays
+ *****/
+ first(n?: number): any;
+ head(n?: number): any;
+ take(n?: number): any;
+
+ initial(n?: number): any[];
+
+ last(n?: number): any;
+
+ rest(n?: number): any[];
+ tail(n?: number): any[];
+ drop(n?: number): any[];
+
+ compact(): any[];
+ flatten(shallow?: bool): any[];
+ without(...values: any[]): any[];
+ union(...arrays: any[][]): any[];
+ intersection(...arrays: any[][]): any[];
+ difference(...others: any[][]): any[];
+
+ uniq(isSorted?: bool, iterator?: any): any[];
+ unique(isSorted?: bool, iterator?: any): any[];
+
+ zip(...arrays: any[]): any[];
+ object(values?: any[]): any;
+ indexOf(value: any, isSorted?: bool): number;
+ lastIndexOf(value: any, fromIndex?: number): number;
+ sortedIndex(valueL: any, iterator?: any): number;
+ range(stop: number): any[];
+ range(start: number, stop: number, step?: number): any[];
+
+ /****
+ Chaining
+ *****/
+ chain(object: any): UnderscoreWrappedObject;
+}
diff --git a/underscore/underscore.d.ts b/underscore/underscore.d.ts
index 811913958..42d4abeb5 100644
--- a/underscore/underscore.d.ts
+++ b/underscore/underscore.d.ts
@@ -1,232 +1,232 @@
-// Type definitions for Underscore 1.4
-// Project: http://underscorejs.org/
-// Definitions by: Boris Yankov
-// Definitions: https://github.com/borisyankov/DefinitelyTyped
-
-
-interface UnderscoreWrappedObject {
- value () : any;
- filter(arg?) : any;
-}
-
-interface TemplateSettings {
- evaluate?: RegExp;
- interpolate?: RegExp;
- escape?: RegExp;
-}
-
-interface ListIterator {
- (value, key, list?): void;
-}
-
-interface ObjectIterator {
- (element, index, list?): void;
-}
-
-// Common interface between Arrays and jQuery objects
-interface List {
- [index: number]: any;
- length: number;
-}
-
-interface UnderscoreStatic {
- (arg?:any) : any;
-
- /****
- Collections
- *****/
- each(list: List, iterator: ListIterator, context?: any): any[];
- each(object: any, iterator: ObjectIterator, context?: any): any[];
- forEach(list: List, iterator: ObjectIterator, context?: any): any[];
- forEach(object: any, iterator: ListIterator, context?: any): any[];
-
- map(list: List, iterator: ListIterator, context?: any): any[];
- map(object: any, iterator: ObjectIterator, context?: any): any[];
- collect(list: List, iterator: ListIterator, context?: any): any[];
- collect(object: any, iterator: ObjectIterator, context?: any): any[];
-
- reduce(list: List, iterator: any, memo: any, context?: any): any[];
- reduce(list: any[], iterator: any, memo: any, context?: any): any[];
- inject(list: List, iterator: any, memo: any, context?: any): any[];
- inject(list: any[], iterator: any, memo: any, context?: any): any[];
- foldl(list: List, iterator: any, memo: any, context?: any): any[];
- foldl(list: any[], iterator: any, memo: any, context?: any): any[];
-
- reduceRight(list: List, iterator: any, memo: any, context?: any): any[];
- reduceRight(list: any[], iterator: any, memo: any, context?: any): any[];
- foldr(list: List, iterator: any, memo: any, context?: any): any[];
- foldr(list: any[], iterator: any, memo: any, context?: any): any[];
-
- find(list: List, iterator: any, context?: any): any;
- find(list: any[], iterator: any, context?: any): any;
- detect(list: List, iterator: any, context?: any): any;
- detect(list: any[], iterator: any, context?: any): any;
-
- filter(list: List, iterator: any, context?: any): any[];
- filter(list: any[], iterator: any, context?: any): any[];
- select(list: List, iterator: any, context?: any): any[];
- select(list: any[], iterator: any, context?: any): any[];
-
- where(list: List, properties: any): any[];
- where(list: any[], properties: any): any[];
-
- reject(list: List, iterator: any, context?: any): any[];
- reject(list: any[], iterator: any, context?: any): any[];
-
- all(list: List, iterator: any, context?: any): bool;
- all(list: any[], iterator: any, context?: any): bool;
- every(list: List, iterator: any, context?: any): bool;
- every(list: any[], iterator: any, context?: any): bool;
-
- any(list: List, iterator?: any, context?: any): bool;
- any(list: any[], iterator?: any, context?: any): bool;
- some(list: List, iterator?: any, context?: any): bool;
- some(list: any[], iterator?: any, context?: any): bool;
-
- contains(list: any, value: any): bool;
- contains(list: List, value: any): bool;
- include(list: any, value: any): bool;
- include(list: List, value: any): bool;
-
- invoke(list: List, methodName: string, arguments: any[]): any;
- invoke(object: any, methodName: string, ...arguments: any[]): any;
-
- pluck(list: List, propertyName: string): string[];
- pluck(list: any[], propertyName: string): string[];
- max(list: List, iterator?: any, context?: any): any;
- max(list: any[], iterator?: any, context?: any): any;
- min(list: List, iterator?: any, context?: any): any;
- min(list: any[], iterator?: any, context?: any): any;
- sortBy(list: List, iterator?: any, context?: any): any;
- sortBy(list: any[], iterator?: any, context?: any): any;
- groupBy(list: List, iterator: any): any;
- groupBy(list: any[], iterator: any): any;
- countBy(list: List, iterator: any): any;
- countBy(list: any[], iterator: any): any;
- shuffle(list: any[]): any[];
- toArray(list: any): any[];
- size(list: any): number;
-
- /****
- Arrays
- *****/
- first(array: List, n?: number): any;
- first(array: any[], n?: number): any;
- head(array: List, n?: number): any;
- head(array: any[], n?: number): any;
- take(array: List, n?: number): any;
- take(array: any[], n?: number): any;
-
- initial(array: List, n?: number): any[];
- initial(array: any[], n?: number): any[];
-
- last(array: List, n?: number): any;
- last(array: any[], n?: number): any;
-
- rest(array: List, n?: number): any[];
- rest(array: any[], n?: number): any[];
- tail(array: List, n?: number): any[];
- tail(array: any[], n?: number): any[];
- drop(array: List, n?: number): any[];
- drop(array: any[], n?: number): any[];
-
- compact(array: any[]): any[];
- flatten(array: List, shallow?: bool): any[];
- flatten(array: any[], shallow?: bool): any[];
- without(array: List, ...values: any[]): any[];
- without(array: any[], ...values: any[]): any[];
- union(...arrays: any[][]): any[];
- intersection(...arrays: any[][]): any[];
- difference(array: List, ...others: any[][]): any[];
- difference(array: any[], ...others: any[][]): any[];
-
- uniq(array: List, isSorted?: bool, iterator?: any): any[];
- uniq(array: any[], isSorted?: bool, iterator?: any): any[];
- unique(array: List, isSorted?: bool, iterator?: any): any[];
- unique(array: any[], isSorted?: bool, iterator?: any): any[];
-
- zip(...arrays: any[]): any[];
- object(list: List, values?: any[]): any;
- object(list: any[], values?: any[]): any;
- indexOf(array: List, value: any, isSorted?: bool): number;
- indexOf(array: any[], value: any, isSorted?: bool): number;
- lastIndexOf(array: List, value: any, fromIndex?: number): number;
- lastIndexOf(array: any[], value: any, fromIndex?: number): number;
- sortedIndex(list: List, valueL: any, iterator?: any): number;
- sortedIndex(list: any[], valueL: any, iterator?: any): number;
- range(stop: number): any[];
- range(start: number, stop: number, step?: number): any[];
-
- /****
- Functions
- *****/
- bind(func: (...as : any[]) => any, context: any, ...arguments: any[]): () => any;
- bindAll(object: any, ...methodNames: string[]): any;
- memoize(func: any, hashFunction?: any): any;
- defer(func: () => any);
- delay(func: any, wait: number, ...arguments: any[]): any;
- delay(func: any, ...arguments: any[]): any;
- throttle(func: any, wait: number): any;
- debounce(func: any, wait: number, immediate?: bool): any;
- once(func: any): any;
- after(count: number, func: any): any;
- wrap(func: (...as : any[]) => any, wrapper: any): () => any;
- compose(...functions: any[]): any;
-
- /****
- Objects
- *****/
- keys(object: any): any[];
- values(object: any): any[];
- pairs(object: any): any[];
- invert(object: any): any;
-
- functions(object: any): string[];
- methods(object: any): string[];
-
- extend(destination: any, ...sources: any[]): any;
- pick(object: any, ...keys: string[]): any;
- omit(object: any, ...keys: string[]): any;
- defaults(object: any, ...defaults: any[]): any;
- clone(object: any): any;
- tap(object: any, interceptor: (...as : any[]) => any): any;
- has(object: any, key: string): bool;
- isEqual(object: any, other: any): bool;
- isEmpty(object: any): bool;
- isElement(object: any): bool;
- isArray(object: any): bool;
- isObject(value: any): bool;
- isArguments(object: any): bool;
- isFunction(object: any): bool;
- isString(object: any): bool;
- isNumber(object: any): bool;
- isFinite(object: any): bool;
- isBoolean(object: any): bool;
- isDate(object: any): bool;
- isRegExp(object: any): bool;
- isNaN(object: any): bool;
- isNull(object: any): bool;
- isUndefined(value: any): bool;
-
- /****
- Utility
- *****/
- noConflict(): any;
- identity(value: any): any;
- times(n: number, iterator: (index : number) => void, context?: any): void;
- random(min: number, max: number): number;
- mixin(object: any): void;
- uniqueId(prefix: string): string;
- uniqueId(): number;
- escape(str: string): string;
- result(object: any, property: string): any;
- templateSettings: TemplateSettings;
- template(templateString: string, data?: any, settings?: any): (...data: any[]) => string;
-
- /****
- Chaining
- *****/
- chain(object: any): UnderscoreWrappedObject;
-}
-
+// Type definitions for Underscore 1.4
+// Project: http://underscorejs.org/
+// Definitions by: Boris Yankov
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+
+interface UnderscoreWrappedObject {
+ value () : any;
+ filter(arg?) : any;
+}
+
+interface TemplateSettings {
+ evaluate?: RegExp;
+ interpolate?: RegExp;
+ escape?: RegExp;
+}
+
+interface ListIterator {
+ (value, key, list?): void;
+}
+
+interface ObjectIterator {
+ (element, index, list?): void;
+}
+
+// Common interface between Arrays and jQuery objects
+interface List {
+ [index: number]: any;
+ length: number;
+}
+
+interface UnderscoreStatic {
+ (arg?:any) : any;
+
+ /****
+ Collections
+ *****/
+ each(list: List, iterator: ListIterator, context?: any): any[];
+ each(object: any, iterator: ObjectIterator, context?: any): any[];
+ forEach(list: List, iterator: ObjectIterator, context?: any): any[];
+ forEach(object: any, iterator: ListIterator, context?: any): any[];
+
+ map(list: List, iterator: ListIterator, context?: any): any[];
+ map(object: any, iterator: ObjectIterator, context?: any): any[];
+ collect(list: List, iterator: ListIterator, context?: any): any[];
+ collect(object: any, iterator: ObjectIterator, context?: any): any[];
+
+ reduce(list: List, iterator: any, memo: any, context?: any): any;
+ reduce(list: any[], iterator: any, memo: any, context?: any): any;
+ inject(list: List, iterator: any, memo: any, context?: any): any;
+ inject(list: any[], iterator: any, memo: any, context?: any): any;
+ foldl(list: List, iterator: any, memo: any, context?: any): any;
+ foldl(list: any[], iterator: any, memo: any, context?: any): any;
+
+ reduceRight(list: List, iterator: any, memo: any, context?: any): any[];
+ reduceRight(list: any[], iterator: any, memo: any, context?: any): any[];
+ foldr(list: List, iterator: any, memo: any, context?: any): any[];
+ foldr(list: any[], iterator: any, memo: any, context?: any): any[];
+
+ find(list: List, iterator: any, context?: any): any;
+ find(list: any[], iterator: any, context?: any): any;
+ detect(list: List, iterator: any, context?: any): any;
+ detect(list: any[], iterator: any, context?: any): any;
+
+ filter(list: List, iterator: any, context?: any): any[];
+ filter(list: any[], iterator: any, context?: any): any[];
+ select(list: List, iterator: any, context?: any): any[];
+ select(list: any[], iterator: any, context?: any): any[];
+
+ where(list: List, properties: any): any[];
+ where(list: any[], properties: any): any[];
+
+ reject(list: List, iterator: any, context?: any): any[];
+ reject(list: any[], iterator: any, context?: any): any[];
+
+ all(list: List, iterator: any, context?: any): bool;
+ all(list: any[], iterator: any, context?: any): bool;
+ every(list: List, iterator: any, context?: any): bool;
+ every(list: any[], iterator: any, context?: any): bool;
+
+ any(list: List, iterator?: any, context?: any): bool;
+ any(list: any[], iterator?: any, context?: any): bool;
+ some(list: List, iterator?: any, context?: any): bool;
+ some(list: any[], iterator?: any, context?: any): bool;
+
+ contains(list: any, value: any): bool;
+ contains(list: List, value: any): bool;
+ include(list: any, value: any): bool;
+ include(list: List, value: any): bool;
+
+ invoke(list: List, methodName: string, arguments: any[]): any;
+ invoke(object: any, methodName: string, ...arguments: any[]): any;
+
+ pluck(list: List, propertyName: string): string[];
+ pluck(list: any[], propertyName: string): string[];
+ max(list: List, iterator?: any, context?: any): any;
+ max(list: any[], iterator?: any, context?: any): any;
+ min(list: List, iterator?: any, context?: any): any;
+ min(list: any[], iterator?: any, context?: any): any;
+ sortBy(list: List, iterator?: any, context?: any): any;
+ sortBy(list: any[], iterator?: any, context?: any): any;
+ groupBy(list: List, iterator: any): any;
+ groupBy(list: any[], iterator: any): any;
+ countBy(list: List, iterator: any): any;
+ countBy(list: any[], iterator: any): any;
+ shuffle(list: any[]): any[];
+ toArray(list: any): any[];
+ size(list: any): number;
+
+ /****
+ Arrays
+ *****/
+ first(array: List, n?: number): any;
+ first(array: any[], n?: number): any;
+ head(array: List, n?: number): any;
+ head(array: any[], n?: number): any;
+ take(array: List, n?: number): any;
+ take(array: any[], n?: number): any;
+
+ initial(array: List, n?: number): any[];
+ initial(array: any[], n?: number): any[];
+
+ last(array: List, n?: number): any;
+ last(array: any[], n?: number): any;
+
+ rest(array: List, n?: number): any[];
+ rest(array: any[], n?: number): any[];
+ tail(array: List, n?: number): any[];
+ tail(array: any[], n?: number): any[];
+ drop(array: List, n?: number): any[];
+ drop(array: any[], n?: number): any[];
+
+ compact(array: any[]): any[];
+ flatten(array: List, shallow?: bool): any[];
+ flatten(array: any[], shallow?: bool): any[];
+ without(array: List, ...values: any[]): any[];
+ without(array: any[], ...values: any[]): any[];
+ union(...arrays: any[][]): any[];
+ intersection(...arrays: any[][]): any[];
+ difference(array: List, ...others: any[][]): any[];
+ difference(array: any[], ...others: any[][]): any[];
+
+ uniq(array: List, isSorted?: bool, iterator?: any): any[];
+ uniq(array: any[], isSorted?: bool, iterator?: any): any[];
+ unique(array: List, isSorted?: bool, iterator?: any): any[];
+ unique(array: any[], isSorted?: bool, iterator?: any): any[];
+
+ zip(...arrays: any[]): any[];
+ object(list: List, values?: any[]): any;
+ object(list: any[], values?: any[]): any;
+ indexOf(array: List, value: any, isSorted?: bool): number;
+ indexOf(array: any[], value: any, isSorted?: bool): number;
+ lastIndexOf(array: List, value: any, fromIndex?: number): number;
+ lastIndexOf(array: any[], value: any, fromIndex?: number): number;
+ sortedIndex(list: List, valueL: any, iterator?: any): number;
+ sortedIndex(list: any[], valueL: any, iterator?: any): number;
+ range(stop: number): any[];
+ range(start: number, stop: number, step?: number): any[];
+
+ /****
+ Functions
+ *****/
+ bind(func: (...as : any[]) => any, context: any, ...arguments: any[]): () => any;
+ bindAll(object: any, ...methodNames: string[]): any;
+ memoize(func: any, hashFunction?: any): any;
+ defer(func: () => any);
+ delay(func: any, wait: number, ...arguments: any[]): any;
+ delay(func: any, ...arguments: any[]): any;
+ throttle(func: any, wait: number): any;
+ debounce(func: any, wait: number, immediate?: bool): any;
+ once(func: any): any;
+ after(count: number, func: any): any;
+ wrap(func: (...as : any[]) => any, wrapper: any): () => any;
+ compose(...functions: any[]): any;
+
+ /****
+ Objects
+ *****/
+ keys(object: any): any[];
+ values(object: any): any[];
+ pairs(object: any): any[];
+ invert(object: any): any;
+
+ functions(object: any): string[];
+ methods(object: any): string[];
+
+ extend(destination: any, ...sources: any[]): any;
+ pick(object: any, ...keys: string[]): any;
+ omit(object: any, ...keys: string[]): any;
+ defaults(object: any, ...defaults: any[]): any;
+ clone(object: any): any;
+ tap(object: any, interceptor: (...as : any[]) => any): any;
+ has(object: any, key: string): bool;
+ isEqual(object: any, other: any): bool;
+ isEmpty(object: any): bool;
+ isElement(object: any): bool;
+ isArray(object: any): bool;
+ isObject(value: any): bool;
+ isArguments(object: any): bool;
+ isFunction(object: any): bool;
+ isString(object: any): bool;
+ isNumber(object: any): bool;
+ isFinite(object: any): bool;
+ isBoolean(object: any): bool;
+ isDate(object: any): bool;
+ isRegExp(object: any): bool;
+ isNaN(object: any): bool;
+ isNull(object: any): bool;
+ isUndefined(value: any): bool;
+
+ /****
+ Utility
+ *****/
+ noConflict(): any;
+ identity(value: any): any;
+ times(n: number, iterator: (index : number) => void, context?: any): void;
+ random(min: number, max: number): number;
+ mixin(object: any): void;
+ uniqueId(prefix: string): string;
+ uniqueId(): number;
+ escape(str: string): string;
+ result(object: any, property: string): any;
+ templateSettings: TemplateSettings;
+ template(templateString: string, data?: any, settings?: any): (...data: any[]) => string;
+
+ /****
+ Chaining
+ *****/
+ chain(object: any): UnderscoreWrappedObject;
+}
+
declare var _: UnderscoreStatic;
\ No newline at end of file