From 104faf87a2c63b7ed4e8e68f418c27e9ba878cef Mon Sep 17 00:00:00 2001 From: vvakame Date: Sun, 23 Nov 2014 01:57:12 +0900 Subject: [PATCH 01/72] add Mozilla SpiderMonkey Parser API definition --- .../mozilla-spidermonkey-parser-api-tests.ts | 125 ++++ .../mozilla-spidermonkey-parser-api.d.ts | 615 ++++++++++++++++++ 2 files changed, 740 insertions(+) create mode 100644 mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api-tests.ts create mode 100644 mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api.d.ts diff --git a/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api-tests.ts b/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api-tests.ts new file mode 100644 index 000000000..f73370706 --- /dev/null +++ b/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api-tests.ts @@ -0,0 +1,125 @@ +/// + +var literal:spiderMonkeyParserAPI.Syntax.Literal = { + loc: { + source: null, + start: { + line: 1, + column: 10 + }, + end: { + line: 1, + column: 12 + } + }, + type: "Literal", + value: 42 +}; + +// generated by http://esprima.org/demo/parse.html?code=%22use%20strict%22%3B%0A%0Afunction%20Test%20()%20%7B%0A%7D%0A%0ATest.prototype.hello%20%3D%20function(word)%20%7B%0A%09word%20%3D%20word%20%7C%7C%20%22TypeScript%22%3B%0A%09return%20word%3B%0A%7D%3B%0A +var program:spiderMonkeyParserAPI.Syntax.Program = { + "type": "Program", + "body": [ + { + "type": "ExpressionStatement", + "expression": { + "type": "Literal", + "value": "use strict", + "raw": "\"use strict\"" + } + }, + { + "type": "FunctionDeclaration", + "id": { + "type": "Identifier", + "name": "Test" + }, + "params": [], + "defaults": [], + "body": { + "type": "BlockStatement", + "body": [] + }, + "rest": null, + "generator": false, + "expression": false + }, + { + "type": "ExpressionStatement", + "expression": { + "type": "AssignmentExpression", + "operator": "=", + "left": { + "type": "MemberExpression", + "computed": false, + "object": { + "type": "MemberExpression", + "computed": false, + "object": { + "type": "Identifier", + "name": "Test" + }, + "property": { + "type": "Identifier", + "name": "prototype" + } + }, + "property": { + "type": "Identifier", + "name": "hello" + } + }, + "right": { + "type": "FunctionExpression", + "id": null, + "params": [ + { + "type": "Identifier", + "name": "word" + } + ], + "defaults": [], + "body": { + "type": "BlockStatement", + "body": [ + { + "type": "ExpressionStatement", + "expression": { + "type": "AssignmentExpression", + "operator": "=", + "left": { + "type": "Identifier", + "name": "word" + }, + "right": { + "type": "LogicalExpression", + "operator": "||", + "left": { + "type": "Identifier", + "name": "word" + }, + "right": { + "type": "Literal", + "value": "TypeScript", + "raw": "\"TypeScript\"" + } + } + } + }, + { + "type": "ReturnStatement", + "argument": { + "type": "Identifier", + "name": "word" + } + } + ] + }, + "rest": null, + "generator": false, + "expression": false + } + } + } + ] +}; diff --git a/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api.d.ts b/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api.d.ts new file mode 100644 index 000000000..c83c6162d --- /dev/null +++ b/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api.d.ts @@ -0,0 +1,615 @@ +// Type definitions for Mozilla SpiderMonkey Parser API 1.8.5 +// Project: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Parser_API +// Definitions by: vvakame +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +declare module spiderMonkeyParserAPI { + + // NOTE if property can hold null, that property to be optional. + + module Syntax { + /** + * By default, Reflect.parse() produces Node objects, which are plain JavaScript objects (i.e., their prototype derives from the standard Object prototype). + * All node types implement the following interface: + */ + interface Node { + /** + * The type field is a string representing the AST variant type. + * Each subtype of Node is documented below with the specific string of its type field. + * You can use this field to determine which interface a node implements. + */ + type: string; + /** + * The loc field represents the source location information of the node. + * If the parser produced no information about the node's source location, the field is null; otherwise it is an object consisting of a start position (the position of the first character of the parsed source region) and an end position (the position of the first character after the parsed source region): + */ + loc?: SourceLocation; + } + + interface SourceLocation { + source?: string; + start: Position; + end: Position; + } + + /** + * Each Position object consists of a line number (1-indexed) and a column number (0-indexed): + */ + interface Position { + line: number; // uint32 >= 1; + column: number; // uint32 >= 0; + } + + /** + * A complete program source tree. + */ + interface Program extends Node { + type: string; // "Program" + body: Statement[]; + } + + /** + * A function declaration or expression. + * The body of the function may be a block statement, or in the case of an expression closure, an expression. + * If the generator flag is true, the function is a generator function, i.e., contains a yield expression in its body (other than in a nested function). + * If the expression flag is true, the function is an expression closure and the body field is an expression. + */ + interface Function extends Node { + id?: Identifier; + params: Pattern[]; + defaults: Expression[]; + rest?: Identifier; + body?: any; // BlockStatement | Expression; + generator: boolean; + expression: boolean; + } + + /** + * Any statement. + */ + interface Statement extends Node { + } + + /** + * An empty statement, i.e., a solitary semicolon. + */ + interface EmptyStatement extends Statement { + type: string; //"EmptyStatement"; + } + + /** + * A block statement, i.e., a sequence of statements surrounded by braces. + */ + interface BlockStatement extends Statement { + type: string; // "BlockStatement"; + body: Statement[]; + } + + /** + * An if statement. + */ + interface IfStatement extends Statement { + type: string; // "IfStatement"; + test: Expression; + consequent: Statement; + alternate?: Statement; + } + + /** + * A labeled statement, i.e., a statement prefixed by a break/continue label. + */ + interface LabeledStatement extends Statement { + type: string; // "LabeledStatement"; + label: Identifier; + body: Statement; + } + + /** + * A break statement. + */ + interface BreakStatement extends Statement { + type: string; // "BreakStatement"; + label?: Identifier; + } + + /** + * A continue statement. + */ + interface ContinueStatement extends Statement { + type: string; // "ContinueStatement"; + label?: Identifier; + } + + /** + * A with statement. + */ + interface WithStatement extends Statement { + type: string; // "WithStatement"; + object: Expression; + body: Statement; + } + + /** + * A switch statement. + * The lexical flag is metadata indicating whether the switch statement contains any unnested let declarations (and therefore introduces a new lexical scope). + */ + interface SwitchStatement extends Statement { + type: string; // "SwitchStatement"; + discriminant: Expression; + cases: SwitchCase[]; + lexical: boolean; + } + + /** + * A return statement. + */ + interface ReturnStatement extends Statement { + type: string; // "ReturnStatement"; + argument?: Expression; + } + + /** + * A throw statement. + */ + interface ThrowStatement extends Statement { + type: string; // "ThrowStatement"; + argument: Expression; + } + + /** + * A try statement. + */ + interface TryStatement extends Statement { + type: string; //"TryStatement"; + block: BlockStatement; + handler?: CatchClause; + guardedHandlers: CatchClause[]; + finalizer?: BlockStatement; + } + + /** + * A while statement. + */ + interface WhileStatement extends Statement { + type: string; // "WhileStatement"; + test: Expression; + body: Statement; + } + + /** + * A do/while statement. + */ + interface DoWhileStatement extends Statement { + type: string; // "DoWhileStatement"; + body: Statement; + test: Expression; + } + + /** + * A for statement. + */ + interface ForStatement extends Statement { + type: string; // "ForStatement"; + init?: any; // VariableDeclaration | Expression; + test?: Expression; + update?: Expression; + body: Statement; + } + + /** + * A for/in statement, or, if each is true, a for each/in statement. + */ + interface ForInStatement extends Statement { + type: string; // "ForInStatement"; + left: any; // VariableDeclaration | Expression; + right: Expression; + body: Statement; + each: boolean; + } + + /** + * A for/of statement. + */ + interface ForOfStatement extends Statement { + type: string; // "ForOfStatement"; + left: any; // VariableDeclaration | Expression; + right: Expression; + body: Statement; + } + + /** + * A let statement. + */ + interface LetStatement extends Statement { + type: string; // "LetStatement"; + head: VariableDeclarator[]; + body: Statement; + } + + /** + * A debugger statement. + */ + interface DebuggerStatement extends Statement { + type: string; // "DebuggerStatement"; + } + + /** + * Any declaration node. Note that declarations are considered statements; this is because declarations can appear in any statement context in the language recognized by the SpiderMonkey parser. + */ + interface Declaration extends Statement { + } + + /** + * A function declaration. + */ + interface FunctionDeclaration extends Function, Declaration { + type: string; // "FunctionDeclaration"; + id: Identifier; // Note: The id field cannot be null. + params: Pattern[]; + defaults: Expression[]; + rest?: Identifier; + body: any; // BlockStatement | Expression; + generator: boolean; + expression: boolean; + } + + /** + * A variable declaration, via one of var, let, or const. + */ + interface VariableDeclaration extends Declaration { + type: string; // "VariableDeclaration"; + declarations: VariableDeclarator[]; + kind: string; // "var" | "let" | "const"; + } + + /** + * A variable declarator. + */ + interface VariableDeclarator extends Node { + type: string; // "VariableDeclarator"; + id: Pattern; // Note: The id field cannot be null. + init?: Expression; + } + + /** + * Any expression node. + * Since the left-hand side of an assignment may be any expression in general, an expression can also be a pattern. + */ + interface Expression extends Node, Pattern { + } + + /** + * A this expression. + */ + interface ThisExpression extends Expression { + type: string; // "ThisExpression"; + } + + /** + * An array expression. + */ + interface ArrayExpression extends Expression { + type: string; // "ArrayExpression"; + elements: Expression[]; // [ Expression | null ]; + } + + /** + * An object expression. + */ + interface ObjectExpression extends Expression { + type: string; // "ObjectExpression"; + properties: Property[]; + } + + /** + * A literal property in an object expression can have either a string or number as its value. + * Ordinary property initializers have a kind value "init"; getters and setters have the kind values "get" and "set", respectively. + */ + interface Property extends Node { + type: string; // "Property"; + key: any; // Literal | Identifier; + value: Expression; + kind: string; // "init" | "get" | "set"; + } + + /** + * A function expression. + */ + interface FunctionExpression extends Function, Expression { + type: string; // "FunctionExpression"; + id?: Identifier; + params: Pattern[]; + defaults: Expression[]; + rest?: Identifier; + body: any; // BlockStatement | Expression; + generator: boolean; + expression: boolean; + } + + /** + * A fat arrow function expression, i.e., `let foo = (bar) => { ... body ... }`. + */ + interface ArrowExpression extends Function, Expression { + type: string; // "ArrowExpression"; + params: Pattern[]; + defaults: Expression[]; + rest?: Identifier; + body: any; // BlockStatement | Expression; + generator: boolean; + expression: boolean; + } + + /** + * A sequence expression, i.e., a comma-separated sequence of expressions. + */ + interface SequenceExpression extends Expression { + type: string; // "SequenceExpression"; + expressions: Expression[]; + } + + /** + * A unary operator expression. + */ + interface UnaryExpression extends Expression { + type: string; // "UnaryExpression"; + operator: UnaryOperator; + prefix: boolean; + argument: Expression; + } + + /** + * A binary operator expression. + */ + interface BinaryExpression extends Expression { + type: string; // "BinaryExpression"; + operator: BinaryOperator; + left: Expression; + right: Expression; + } + + /** + * An assignment operator expression. + */ + interface AssignmentExpression extends Expression { + type: string; // "AssignmentExpression"; + operator: AssignmentOperator; + left: Expression; + right: Expression; + } + + /** + * An update (increment or decrement) operator expression. + */ + interface UpdateExpression extends Expression { + type: string; // "UpdateExpression"; + operator: UpdateOperator; + argument: Expression; + prefix: boolean; + } + + /** + * A logical operator expression. + */ + interface LogicalExpression extends Expression { + type: string; // "LogicalExpression"; + operator: LogicalOperator; + left: Expression; + right: Expression; + } + + /** + * A conditional expression, i.e., a ternary ?/: expression. + */ + interface ConditionalExpression extends Expression { + type: string; // "ConditionalExpression"; + test: Expression; + alternate: Expression; + consequent: Expression; + } + + /** + * A new expression. + */ + interface NewExpression extends Expression { + type: string; // "NewExpression"; + callee: Expression; + arguments: Expression[]; + } + + /** + * A function or method call expression. + */ + interface CallExpression extends Expression { + type: string; // "CallExpression"; + callee: Expression; + arguments: Expression[]; + } + + /** + * A member expression. + * If computed === true, the node corresponds to a computed e1[e2] expression and property is an Expression. + * If computed === false, the node corresponds to a static e1.x expression and property is an Identifier. + */ + interface MemberExpression extends Expression { + type: string; // "MemberExpression"; + object: Expression; + property: any; // Identifier | Expression; + computed: boolean; + } + + /** + * A yield expression. + */ + interface YieldExpression extends Expression { + type: string; // "YieldExpression"; + argument?: Expression; + } + + /** + * An array comprehension. + * The blocks array corresponds to the sequence of for and for each blocks. + * The optional filter expression corresponds to the final if clause, if present. + */ + interface ComprehensionExpression extends Expression { + type: string; // "ComprehensionExpression"; + body: Expression; + blocks: ComprehensionBlock[]; + filter?: Expression; + } + + /** + * A generator expression. + * As with array comprehensions, the blocks array corresponds to the sequence of for and for each blocks, and the optional filter expression corresponds to the final if clause, if present. + */ + interface GeneratorExpression extends Expression { + type: string; // "GeneratorExpression"; + body: Expression; + blocks: ComprehensionBlock[]; + filter?: Expression; + } + + /** + * A graph expression, aka "sharp literal," such as #1={ self: #1# }. + */ + interface GraphExpression extends Expression { + type: string; // "GraphExpression"; + index: number; // uint32; + expression: Literal; + } + + /** + * A graph index expression, aka "sharp variable," such as #1#. + */ + interface GraphIndexExpression extends Expression { + type: string; // "GraphIndexExpression"; + index: number; // uint32; + } + + /** + * A let expression. + */ + interface LetExpression extends Expression { + type: string; // "LetExpression"; + head: VariableDeclarator[]; + body: Expression; + } + + /** + * JavaScript 1.7 introduced destructuring assignment and binding forms. + * All binding forms (such as function parameters, variable declarations, and catch block headers) accept array and object destructuring patterns in addition to plain identifiers. + * The left-hand sides of assignment expressions can be arbitrary expressions, but in the case where the expression is an object or array literal, it is interpreted by SpiderMonkey as a destructuring pattern. + * + * Since the left-hand side of an assignment can in general be any expression, in an assignment context, a pattern can be any expression. + * In binding positions (such as function parameters, variable declarations, and catch headers), patterns can only be identifiers in the base case, not arbitrary expressions. + */ + interface Pattern extends Node { + } + + /** + * An object-destructuring pattern. A literal property in an object pattern can have either a string or number as its value. + */ + interface ObjectPattern extends Pattern { + type: string; // "ObjectPattern"; + properties: {key: any /* Literal | Identifier */; value: Pattern;}[]; // [ { key: Literal | Identifier, value: Pattern } ]; + } + + /** + * An array-destructuring pattern. + */ + interface ArrayPattern extends Pattern { + type: string; // "ArrayPattern"; + elements: Pattern[]; // [ Pattern | null ]; + } + + /** + * A case (if test is an Expression) or default (if test === null) clause in the body of a switch statement. + */ + interface SwitchCase extends Node { + type: string; // "SwitchCase"; + test?: Expression; + consequent: Statement[]; + } + + /** + * A catch clause following a try block. + * The optional guard property corresponds to the optional expression guard on the bound variable. + */ + interface CatchClause extends Node { + type: string; // "CatchClause"; + param: Pattern; + guard?: Expression; + body: BlockStatement; + } + + /** + * A for or for each block in an array comprehension or generator expression. + */ + interface ComprehensionBlock extends Node { + type: string; // "ComprehensionBlock"; + left: Pattern; + right: Expression; + each: boolean; + } + + /** + * An identifier. + * Note that an identifier may be an expression or a destructuring pattern. + */ + interface Identifier extends Node, Expression, Pattern { + type: string; // "Identifier"; + name: string; + } + + /** + * A literal token. Note that a literal can be an expression. + */ + interface Literal extends Node, Expression { + type: string; // "Literal"; + // TODO union types + value: any; // string | boolean | null | number | RegExp; + } + + /** + * A unary operator token. + */ + interface UnaryOperator extends String { + // "-" | "+" | "!" | "~" | "typeof" | "void" | "delete" + } + + /** + * A binary operator token. + */ + interface BinaryOperator extends String { + // "==" | "!=" | "===" | "!==" + // | "<" | "<=" | ">" | ">=" + // | "<<" | ">>" | ">>>" + // | "+" | "-" | "*" | "/" | "%" + // | "|" | "^" | "&" | "in" + // | "instanceof" | ".." + // Note: The .. operator is E4X-specific. + } + + /** + * A logical operator token. + */ + interface LogicalOperator extends String { + // "||" | "&&" + } + + /** + * An assignment operator token. + */ + interface AssignmentOperator extends String { + // "=" | "+=" | "-=" | "*=" | "/=" | "%=" + // | "<<=" | ">>=" | ">>>=" + // | "|=" | "^=" | "&=" + } + + /** + * An update (increment or decrement) operator token. + */ + interface UpdateOperator extends String { + // "++" | "--" + } + } +} From 2d83a93b5bbbb4b65d2ce88cadce2cc8198613dd Mon Sep 17 00:00:00 2001 From: vvakame Date: Sun, 23 Nov 2014 01:59:41 +0900 Subject: [PATCH 02/72] refactor test code --- .../mozilla-spidermonkey-parser-api-tests.ts | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api-tests.ts b/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api-tests.ts index f73370706..76dba72a5 100644 --- a/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api-tests.ts +++ b/mozilla-spidermonkey-parser-api/mozilla-spidermonkey-parser-api-tests.ts @@ -1,6 +1,8 @@ /// -var literal:spiderMonkeyParserAPI.Syntax.Literal = { +import Syntax = spiderMonkeyParserAPI.Syntax; + +var literal:Syntax.Literal = { loc: { source: null, start: { @@ -17,26 +19,26 @@ var literal:spiderMonkeyParserAPI.Syntax.Literal = { }; // generated by http://esprima.org/demo/parse.html?code=%22use%20strict%22%3B%0A%0Afunction%20Test%20()%20%7B%0A%7D%0A%0ATest.prototype.hello%20%3D%20function(word)%20%7B%0A%09word%20%3D%20word%20%7C%7C%20%22TypeScript%22%3B%0A%09return%20word%3B%0A%7D%3B%0A -var program:spiderMonkeyParserAPI.Syntax.Program = { +var program:Syntax.Program = { "type": "Program", "body": [ - { + { "type": "ExpressionStatement", - "expression": { + "expression": { "type": "Literal", "value": "use strict", "raw": "\"use strict\"" } }, - { + { "type": "FunctionDeclaration", - "id": { + "id": { "type": "Identifier", "name": "Test" }, "params": [], "defaults": [], - "body": { + "body": { "type": "BlockStatement", "body": [] }, @@ -44,61 +46,61 @@ var program:spiderMonkeyParserAPI.Syntax.Program = { "generator": false, "expression": false }, - { + { "type": "ExpressionStatement", - "expression": { + "expression": { "type": "AssignmentExpression", "operator": "=", - "left": { + "left": { "type": "MemberExpression", "computed": false, - "object": { + "object": { "type": "MemberExpression", "computed": false, - "object": { + "object": { "type": "Identifier", "name": "Test" }, - "property": { + "property": { "type": "Identifier", "name": "prototype" } }, - "property": { + "property": { "type": "Identifier", "name": "hello" } }, - "right": { + "right": { "type": "FunctionExpression", "id": null, "params": [ - { + { "type": "Identifier", "name": "word" } ], "defaults": [], - "body": { + "body": { "type": "BlockStatement", "body": [ - { + { "type": "ExpressionStatement", - "expression": { + "expression": { "type": "AssignmentExpression", "operator": "=", - "left": { + "left": { "type": "Identifier", "name": "word" }, - "right": { + "right": { "type": "LogicalExpression", "operator": "||", - "left": { + "left": { "type": "Identifier", "name": "word" }, - "right": { + "right": { "type": "Literal", "value": "TypeScript", "raw": "\"TypeScript\"" @@ -106,7 +108,7 @@ var program:spiderMonkeyParserAPI.Syntax.Program = { } } }, - { + { "type": "ReturnStatement", "argument": { "type": "Identifier", From cc7b89066ea6e2b0708c9edb390ca2823ae87bdc Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 28 Nov 2014 10:06:54 +1300 Subject: [PATCH 03/72] Add in lambda filtered catches --- when/when.d.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/when/when.d.ts b/when/when.d.ts index 2af3fba9d..3b7d114f7 100644 --- a/when/when.d.ts +++ b/when/when.d.ts @@ -56,6 +56,9 @@ declare module When { } interface Promise { + catch(filter: (reason: any) => Boolean, onRejected?: (reason: any) => Promise): Promise; + catch(filter: (reason: any) => Boolean, onRejected?: (reason: any) => U): Promise; + catch(onRejected?: (reason: any) => Promise): Promise; catch(onRejected?: (reason: any) => U): Promise; From 2947ff83e00900b84aab2e75981c16073be526b6 Mon Sep 17 00:00:00 2001 From: Kevin Barabash Date: Fri, 28 Nov 2014 15:13:00 -0700 Subject: [PATCH 04/72] removed SomeStatement and SomeExpression, added tests for declarations --- esprima/esprima-tests.ts | 143 +++++++++++++++++++++++++-------------- esprima/esprima.d.ts | 132 +++++++++++++++++------------------- 2 files changed, 154 insertions(+), 121 deletions(-) diff --git a/esprima/esprima-tests.ts b/esprima/esprima-tests.ts index 9451e077d..d2635a404 100644 --- a/esprima/esprima-tests.ts +++ b/esprima/esprima-tests.ts @@ -7,9 +7,8 @@ var token: esprima.Token; var options: esprima.Options; var comment: Syntax.Comment; var program: Syntax.Program; -var statement: Syntax.SomeStatement; -var blockStatement: Syntax.BlockStatement; -var expression: Syntax.SomeExpression; +var statement: Syntax.Statement; +var expression: Syntax.Expression; var property: Syntax.Property; var identifier: Syntax.Identifier; var literal: Syntax.Literal; @@ -52,94 +51,136 @@ string = comment.value; // Statement // BlockStatement -string = statement.type; -statement = statement.body[0]; -comment = statement.leadingComments[0] -comment = statement.trailingComments[0] +var blockStatement: Syntax.BlockStatement; +string = blockStatement.type; +statement = blockStatement.body[0]; +comment = blockStatement.leadingComments[0]; +comment = blockStatement.trailingComments[0]; // ExpressionStatement -expression = statement.expression; +var expressionStatement: Syntax.ExpressionStatement; +expression = expressionStatement.expression; // IfStatement -expression = statement.test; -statement = statement.consequent; -statement = statement.alternate; +var ifStatement: Syntax.IfStatement; +expression = ifStatement.test; +statement = ifStatement.consequent; +statement = ifStatement.alternate; // LabeledStatement -identifier = statement.label; -statement = statement.body; +var labeledStatement: Syntax.LabeledStatement; +identifier = labeledStatement.label; +statement = labeledStatement.body; // WithStatement -expression = statement.object; +var withStatement: Syntax.WithStatement; +expression = withStatement.object; // SwitchStatement -expression = statement.discriminant; -switchCase = statement.cases[0]; -boolean = statement.lexical; +var switchStatement: Syntax.SwitchStatement; +expression = switchStatement.discriminant; +switchCase = switchStatement.cases[0]; +boolean = switchStatement.lexical; // ReturnStatement -expression = statement.argument; +var returnStatement: Syntax.ReturnStatement; +expression = returnStatement.argument; // TryStatement -blockStatement = statement.block; -catchClause = statement.handler; -catchClause = statement.guardedHandlers[0]; -blockStatement = statement.finalizer; +var tryStatement: Syntax.TryStatement; +blockStatement = tryStatement.block; +catchClause = tryStatement.handler; +catchClause = tryStatement.guardedHandlers[0]; +blockStatement = tryStatement.finalizer; // ForStatement -variableDeclaratorOrExpression = statement.init; -expression = statement.update; +var forStatement: Syntax.ForStatement; +variableDeclaratorOrExpression = forStatement.init; +expression = forStatement.update; // ForInStatement -variableDeclaratorOrExpression = statement.left; -expression = statement.right; -boolean = statement.each; +var forInStatement: Syntax.ForInStatement; +variableDeclaratorOrExpression = forInStatement.left; +expression = forInStatement.right; +boolean = forInStatement.each; // Expression // ArrayExpression -string = expression.type; -expression = expression.elements[0]; +var arrayExpression: Syntax.ArrayExpression; +string = arrayExpression.type; +expression = arrayExpression.elements[0]; // ObjectExpression -property = expression.properties[0]; +var objectExpression: Syntax.ObjectExpression; +property = objectExpression.properties[0]; string = property.type; literalOrIdentifier = property.key; expression = property.value; string = property.kind; // FunctionExpression -identifier = expression.id; -identifier = expression.params[0]; -expression = expression.defaults[0]; -identifier = expression.rest; -blockStatementOrExpression = expression.body; -boolean = expression.generator; -boolean = expression.expression; +var functionExpression: Syntax.FunctionExpression; +identifier = functionExpression.id; +identifier = functionExpression.params[0]; +expression = functionExpression.defaults[0]; +identifier = functionExpression.rest; +blockStatementOrExpression = functionExpression.body; +boolean = functionExpression.generator; +boolean = functionExpression.expression; // SequenceExpression -expression = expression.expressions[0] +var sequenceExpression: Syntax.SequenceExpression; +expression = sequenceExpression.expressions[0] // UnaryExpression -string = expression.operator; -boolean = expression.prefix; +var unaryExpression: Syntax.UnaryExpression; +string = unaryExpression.operator; +boolean = unaryExpression.prefix; // BinaryExpression -expression = expression.left; -expression = expression.right; +var binaryExpression: Syntax.BinaryExpression; +expression = binaryExpression.left; +expression = binaryExpression.right; // ConditionalExpression -expression = expression.test; -expression = expression.alternate; -expression = expression.consequent; +var conditionalExpression: Syntax.ConditionalExpression; +expression = conditionalExpression.test; +expression = conditionalExpression.alternate; +expression = conditionalExpression.consequent; -// ConditionalExpression -expression = expression.callee; -expression = expression.arguments[0]; +// NewExpression +var newExpression: Syntax.NewExpression; +expression = newExpression.callee; +expression = newExpression.arguments[0]; + +// CallExpression +var callExpression: Syntax.CallExpression; +expression = callExpression.callee; +expression = callExpression.arguments[0]; // MemberExpression -expression = expression.object; -identifierOrExpression = expression.property; -boolean = expression.computed; +var memberExpression: Syntax.MemberExpression; +expression = memberExpression.object; +identifierOrExpression = memberExpression.property; +boolean = memberExpression.computed; + +// Declarations +var functionDeclaration: Syntax.FunctionDeclaration; +identifier = functionDeclaration.id; +var params:Syntax.Identifier[] = functionDeclaration.params; +var defaults:Syntax.Expression[] = functionDeclaration.defaults; +identifier = functionDeclaration.rest; +var body:Syntax.BlockStatementOrExpression = functionDeclaration.body; +boolean = functionDeclaration.generator; +boolean = functionDeclaration.expression; + +var variableDeclaration: Syntax.VariableDeclaration; +var declarations:Syntax.VariableDeclarator[] = variableDeclaration.declarations; +string = variableDeclaration.kind; // "var" | "let" | "const" + +var variableDeclarator: Syntax.VariableDeclarator; +identifier = variableDeclarator.id; // Pattern +expression = variableDeclarator.init; // Clauses // SwitchCase diff --git a/esprima/esprima.d.ts b/esprima/esprima.d.ts index 1e603ee25..d62bb09bb 100644 --- a/esprima/esprima.d.ts +++ b/esprima/esprima.d.ts @@ -49,7 +49,7 @@ declare module esprima { // Program interface Program extends Node { - body: SomeStatement[] + body: Statement[] comments?: Comment[] } @@ -57,14 +57,13 @@ declare module esprima { interface Function extends Node { id: Identifier // | null params: Identifier[] - defaults: SomeExpression[] + defaults: Expression[] rest: Identifier // | null body: BlockStatementOrExpression generator: boolean expression: boolean } - interface BlockStatementOrExpression extends Array, BlockStatement, SomeExpression { - body: BlockStatementOrExpression + interface BlockStatementOrExpression extends BlockStatement, Expression { } // Statement @@ -73,19 +72,19 @@ declare module esprima { interface EmptyStatement extends Statement { } interface BlockStatement extends Statement { - body: SomeStatement[] + body: Statement[] } interface ExpressionStatement extends Statement { - expression: SomeExpression + expression: Expression } interface IfStatement extends Statement { - test: SomeExpression - consequent: SomeStatement - alternate: SomeStatement + test: Expression + consequent: Statement + alternate: Statement } interface LabeledStatement extends Statement { label: Identifier - body: SomeStatement + body: Statement } interface BreakStatement extends Statement { label: Identifier // | null @@ -94,19 +93,19 @@ declare module esprima { label: Identifier // | null } interface WithStatement extends Statement { - object: SomeExpression - body: SomeStatement + object: Expression + body: Statement } interface SwitchStatement extends Statement { - discriminant: SomeExpression + discriminant: Expression cases: SwitchCase[] lexical: boolean } interface ReturnStatement extends Statement { - argument: SomeExpression // | null + argument: Expression // | null } interface ThrowStatement extends Statement { - argument: SomeExpression + argument: Expression } interface TryStatement extends Statement { block: BlockStatement @@ -115,80 +114,73 @@ declare module esprima { finalizer: BlockStatement // | null } interface WhileStatement extends Statement { - test: SomeExpression - body: SomeStatement + test: Expression + body: Statement } interface DoWhileStatement extends Statement { - body: SomeStatement - test: SomeExpression + body: Statement + test: Expression } interface ForStatement extends Statement { init: VariableDeclaratorOrExpression // | null - test: SomeExpression // | null - update: SomeExpression // | null - body: SomeStatement + test: Expression // | null + update: Expression // | null + body: Statement } interface ForInStatement extends Statement { left: VariableDeclaratorOrExpression - right: SomeExpression - body: SomeStatement + right: Expression + body: Statement each: boolean } - interface VariableDeclaratorOrExpression extends VariableDeclarator, SomeExpression { + interface VariableDeclaratorOrExpression extends VariableDeclarator, Expression { } interface DebuggerStatement extends Statement { } - interface SomeStatement extends - EmptyStatement, ExpressionStatement, BlockStatement, IfStatement, - LabeledStatement, BreakStatement, ContinueStatement, WithStatement, - SwitchStatement, ReturnStatement, ThrowStatement, TryStatement, - WhileStatement, DoWhileStatement, ForStatement, ForInStatement, DebuggerStatement { - body: SomeStatementOrList - } - interface SomeStatementOrList extends Array, SomeStatement { + interface StatementOrList extends Array, Statement { } - // Declration - interface Declration extends Statement { + // Declaration + interface Declaration extends Statement { } - interface FunctionDeclration extends Declration { + interface FunctionDeclaration extends Declaration { id: Identifier params: Identifier[] // Pattern - defaults: SomeExpression[] + defaults: Expression[] rest: Identifier body: BlockStatementOrExpression generator: boolean expression: boolean } - interface VariableDeclaration extends Declration { + interface VariableDeclaration extends Declaration { declarations: VariableDeclarator[] kind: string // "var" | "let" | "const" } interface VariableDeclarator extends Node { id: Identifier // Pattern - init: SomeExpression + init: Expression } // Expression interface Expression extends Node { // | Pattern } - interface SomeExpression extends - ThisExpression, ArrayExpression, ObjectExpression, FunctionExpression, - ArrowFunctionExpression, SequenceExpression, UnaryExpression, BinaryExpression, - AssignmentExpression, UpdateExpression, LogicalExpression, ConditionalExpression, - NewExpression, CallExpression, MemberExpression { - } + //interface Expression extends + // ThisExpression, ArrayExpression, ObjectExpression, FunctionExpression, + // ArrowFunctionExpression, SequenceExpression, UnaryExpression, BinaryExpression, + // AssignmentExpression, UpdateExpression, LogicalExpression, ConditionalExpression, + // NewExpression, CallExpression, MemberExpression { + //} interface ThisExpression extends Expression { } interface ArrayExpression extends Expression { - elements: SomeExpression[] // [ Expression | null ] + elements: Expression[] // [ Expression | null ] } interface ObjectExpression extends Expression { properties: Property[] } interface Property extends Node { key: LiteralOrIdentifier // Literal | Identifier - value: SomeExpression + value: Expression kind: string // "init" | "get" | "set" } interface LiteralOrIdentifier extends Literal, Identifier { @@ -198,66 +190,66 @@ declare module esprima { interface ArrowFunctionExpression extends Function, Expression { } interface SequenceExpression extends Expression { - expressions: SomeExpression[] + expressions: Expression[] } interface UnaryExpression extends Expression { operator: string // UnaryOperator prefix: boolean - argument: SomeExpression + argument: Expression } interface BinaryExpression extends Expression { operator: string // BinaryOperator - left: SomeExpression - right: SomeExpression + left: Expression + right: Expression } interface AssignmentExpression extends Expression { operator: string // AssignmentOperator - left: SomeExpression - right: SomeExpression + left: Expression + right: Expression } interface UpdateExpression extends Expression { operator: string // UpdateOperator - argument: SomeExpression + argument: Expression prefix: boolean } interface LogicalExpression extends Expression { operator: string // LogicalOperator - left: SomeExpression - right: SomeExpression + left: Expression + right: Expression } interface ConditionalExpression extends Expression { - test: SomeExpression - alternate: SomeExpression - consequent: SomeExpression + test: Expression + alternate: Expression + consequent: Expression } interface NewExpression extends Expression { - callee: SomeExpression - arguments: SomeExpression[] + callee: Expression + arguments: Expression[] } interface CallExpression extends Expression { - callee: SomeExpression - arguments: SomeExpression[] + callee: Expression + arguments: Expression[] } interface MemberExpression extends Expression { - object: SomeExpression + object: Expression property: IdentifierOrExpression // Identifier | Expression computed: boolean } - interface IdentifierOrExpression extends Identifier, SomeExpression { + interface IdentifierOrExpression extends Identifier, Expression { } // Pattern - // interface Pattern extends Node { - // } + // interface Pattern extends Node { + // } // Clauses interface SwitchCase extends Node { - test: SomeExpression - consequent: SomeStatement[] + test: Expression + consequent: Statement[] } interface CatchClause extends Node { param: Identifier // Pattern - guard: SomeExpression + guard: Expression body: BlockStatement } From 289e3578278791139800b4cd8945a6e9fe513fae Mon Sep 17 00:00:00 2001 From: Michel Salib Date: Mon, 1 Dec 2014 17:50:27 +0100 Subject: [PATCH 05/72] Add moment-timezone --- moment-timezone/moment-timezone-tests.ts | 42 ++++++++++++++++++ moment-timezone/moment-timezone.d.ts | 54 ++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 moment-timezone/moment-timezone-tests.ts create mode 100644 moment-timezone/moment-timezone.d.ts diff --git a/moment-timezone/moment-timezone-tests.ts b/moment-timezone/moment-timezone-tests.ts new file mode 100644 index 000000000..6ee7a78dd --- /dev/null +++ b/moment-timezone/moment-timezone-tests.ts @@ -0,0 +1,42 @@ +/// + +var june = moment("2014-06-01T12:00:00Z"); +june.tz('America/Los_Angeles').format('ha z'); + +var a = moment.tz("2013-11-18 11:55", "America/Toronto"); +var b = moment.tz("May 12th 2014 8PM", "MMM Do YYYY hA", "America/Toronto"); +var c = moment.tz(1403454068850, "America/Toronto"); + +var arr = [2013, 5, 1], + str = "2013-12-01", + obj = { year : 2013, month : 5, day : 1 }; + +moment.tz(arr, "America/Los_Angeles"); +moment.tz(str, "America/Los_Angeles"); +moment.tz(obj, "America/Los_Angeles"); + +moment.tz.zone('America/Los_Angeles').abbr(1403465838805); +moment.tz.zone('America/Los_Angeles').offset(1403465838805); + +var zone = moment.tz.zone('America/New_York'); +zone.parse(Date.UTC(2012, 2, 19, 8, 30)); // 240 + +moment.tz.add('America/Los_Angeles|PST PDT|80 70|0101|1Lzm0 1zb0 Op0'); +moment.tz.add([ + 'America/Los_Angeles|PST PDT|80 70|0101|1Lzm0 1zb0 Op0', + 'America/New_York|EST EDT|50 40|0101|1Lz50 1zb0 Op0' +]); + +moment.tz.link('America/Los_Angeles|US/Pacific'); +moment.tz.link([ + 'America/Los_Angeles|US/Pacific', + 'America/New_York|US/Eastern' +]); + +moment.tz.load({ + zones : [], + links : [], + version : '2014e' +}); + +moment.tz.names(); diff --git a/moment-timezone/moment-timezone.d.ts b/moment-timezone/moment-timezone.d.ts new file mode 100644 index 000000000..167df9a7c --- /dev/null +++ b/moment-timezone/moment-timezone.d.ts @@ -0,0 +1,54 @@ +// Type definitions for moment-timezone.js 0.2.5 +// Project: http://momentjs.com/timezone/ +// Definitions by: Michel Salib +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// + +interface Moment { + tz(timezone: string): Moment; +} + +interface Zone { + name: string; + abbrs: string[]; + untils: number[]; + offsets: number[]; + + abbr(timestamp: number): string; + offset(timestamp: number): number; + parse(timestamp: number): number +} + +interface MomentTimezone { + (date: number, timezone: string): Moment; + (date: number[], timezone: string): Moment; + (date: string, format: string, timezone: string): Moment; + (date: Date, timezone: string): Moment; + (date: Moment, timezone: string): Moment; + (date: Object, timezone: string): Moment; + + zone(timezone: string): Zone; + + add(packedZoneString: string): void; + add(packedZoneString: string[]): void; + + link(packedLinkString: string): void; + link(packedLinkString: string[]): void; + + load(data: { + version: string; + links: string[]; + zones: string[]; + }): void; + + names(): string[]; +} + +interface MomentStatic { + tz: MomentTimezone; +} + +declare module 'moment-timezone' { + +} From be1c64f42405e24a822d6b07e2520ea670434625 Mon Sep 17 00:00:00 2001 From: Michel Salib Date: Mon, 1 Dec 2014 17:52:09 +0100 Subject: [PATCH 06/72] Rename class in order to avoid name collisions. --- moment-timezone/moment-timezone.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/moment-timezone/moment-timezone.d.ts b/moment-timezone/moment-timezone.d.ts index 167df9a7c..785aeb047 100644 --- a/moment-timezone/moment-timezone.d.ts +++ b/moment-timezone/moment-timezone.d.ts @@ -9,7 +9,7 @@ interface Moment { tz(timezone: string): Moment; } -interface Zone { +interface MomentZone { name: string; abbrs: string[]; untils: number[]; @@ -28,7 +28,7 @@ interface MomentTimezone { (date: Moment, timezone: string): Moment; (date: Object, timezone: string): Moment; - zone(timezone: string): Zone; + zone(timezone: string): MomentZone; add(packedZoneString: string): void; add(packedZoneString: string[]): void; From 09f788d73f32fe8778a760bd57c8ae28c044bd87 Mon Sep 17 00:00:00 2001 From: Phips Peter Date: Mon, 1 Dec 2014 13:29:31 -0800 Subject: [PATCH 07/72] Merging React and React with Addons This seems simpler and enables developers to only require the addons they want. --- react-addons/react-addons.d.ts | 175 ---------- .../legacy/react-addons-0.11-tests.ts | 0 .../legacy/react-addons-0.11.d.ts | 2 +- {react-addons => react}/react-addons-tests.ts | 2 +- react/react.d.ts | 307 +++++++++++++++--- 5 files changed, 261 insertions(+), 225 deletions(-) delete mode 100644 react-addons/react-addons.d.ts rename {react-addons => react}/legacy/react-addons-0.11-tests.ts (100%) rename {react-addons => react}/legacy/react-addons-0.11.d.ts (98%) rename {react-addons => react}/react-addons-tests.ts (99%) diff --git a/react-addons/react-addons.d.ts b/react-addons/react-addons.d.ts deleted file mode 100644 index 245d339db..000000000 --- a/react-addons/react-addons.d.ts +++ /dev/null @@ -1,175 +0,0 @@ -// Type definitions for React with Addons 0.12.RC -// Project: http://facebook.github.io/react/ -// Definitions by: Asana -// Definitions: https://github.com/borisyankov/DefinitelyTyped - -/// - -declare module "react/addons" { - export = React; -} - -declare module React { - export var addons: { - classSet: (classes: {[key: string]: boolean}) => string; - cloneWithProps: CloneWithProps; - CSSTransitionGroup: ReactComponentFactory; - LinkedStateMixin: LinkedStateMixin; - Perf: Perf; - PureRenderMixin: Mixin; - TestUtils: TestUtils; - TransitionGroup: ReactComponentFactory; - update(object: Object, changes: Object): Object; - }; - - export interface CloneWithProps

{ - (instance: ReactComponentElement

, extraProps?: P): ReactComponentElement

; - } - - export interface ReactLink { - value: T; - requestChange(newValue: T): void; - } - - export interface LinkedStateMixin extends Mixin { - linkState(key: string): ReactLink; - } - - export interface ComponentPerfContext { - current: string; - owner: string; - } - - export interface CSSTransitionGroupProps { - transitionName: string; - } - - export interface TransitionsSpecification extends Specification { - componentWillEnter?(callback: () => void): void; - componentDidEnter?(): void; - componentWillLeave?(callback: () => void): void; - componentDidLeave?(): void; - } - - export interface NumericPerfContext { - [key: string]: number; - } - - export interface Measurements { - exclusive: NumericPerfContext; - inclusive: NumericPerfContext; - render: NumericPerfContext; - counts: NumericPerfContext; - writes: NumericPerfContext; - displayNames: { - [key: string]: ComponentPerfContext; - }; - totalTime: number; - } - - export interface Perf { - start(): void; - stop(): void; - printInclusive(measurements: Measurements[]): void; - printExclusive(measurements: Measurements[]): void; - printWasted(measurements: Measurements[]): void; - printDOM(measurements: Measurements[]): void; - getLastMeasurements(): Measurements[]; - } - - export interface TestUtils { - Simulate: Simulate; - renderIntoDocument

(instance: ReactComponentElement

): ReactComponentElement

; - renderIntoDocument(instance: ReactHTMLElement): ReactHTMLElement; - renderIntoDocument(instance: ReactSVGElement): ReactSVGElement; - mockComponent(componentClass: ReactComponentFactory, mockTagName?: string): TestUtils; - isDescriptorOfType(descriptor: ReactElement, componentClass: ReactComponentFactory): boolean; - isDOMComponent(instance: ReactElement): boolean; - isCompositeComponent(instance: ReactElement): boolean; - isCompositeComponentWithType(instance: ReactElement, componentClass: ReactComponentFactory): boolean; - isTextComponent(instance: ReactElement): boolean; - findAllInRenderedTree(tree: ReactElement, test: (component: ReactElement) => boolean): ReactElement[]; - scryRenderedDOMComponentsWithClass(tree: ReactElement, className: string): ReactElement[]; - findRenderedDOMComponentWithClass(tree: ReactElement, className: string): ReactElement; - scryRenderedDOMComponentsWithTag(tree: ReactElement, tagName: string): ReactElement[]; - findRenderedDOMComponentWithTag(tree: ReactElement, tagName: string): ReactElement; - scryRenderedComponentsWithTag(tree: ReactElement, componentClass: Function): ReactElement[]; - findRenderedComponentWithType

(tree: ReactElement, componentClass: ReactComponentFactory

): Component; - scryRenderedComponentsWithType

(tree: ReactElement, componentClass: ReactComponentFactory

): Component[]; - } - - export interface SyntheticEventData { - altKey?: boolean; - button?: number; - buttons?: number; - clientX?: number; - clientY?: number; - changedTouches?: TouchList; - charCode?: boolean; - clipboardData?: DataTransfer; - ctrlKey?: boolean; - deltaMode?: number; - deltaX?: number; - deltaY?: number; - deltaZ?: number; - detail?: number; - getModifierState?(key: string): boolean; - key?: string; - keyCode?: number; - locale?: string; - location?: number; - metaKey?: boolean; - pageX?: number; - pageY?: number; - relatedTarget?: EventTarget; - repeat?: boolean; - screenX?: number; - screenY?: number; - shiftKey?: boolean; - targetTouches?: TouchList; - touches?: TouchList; - view?: AbstractView; - which?: number; - } - - export interface EventSimulator { - (element: Element, eventData?: SyntheticEventData): void; - (descriptor: ReactElement, eventData?: SyntheticEventData): void; - } - - export interface Simulate { - blur: EventSimulator; - change: EventSimulator; - click: EventSimulator; - cut: EventSimulator; - doubleClick: EventSimulator; - drag: EventSimulator; - dragEnd: EventSimulator; - dragEnter: EventSimulator; - dragExit: EventSimulator; - dragLeave: EventSimulator; - dragOver: EventSimulator; - dragStart: EventSimulator; - drop: EventSimulator; - focus: EventSimulator; - input: EventSimulator; - keyDown: EventSimulator; - keyPress: EventSimulator; - keyUp: EventSimulator; - mouseDown: EventSimulator; - mouseEnter: EventSimulator; - mouseLeave: EventSimulator; - mouseMove: EventSimulator; - mouseOut: EventSimulator; - mouseOver: EventSimulator; - mouseUp: EventSimulator; - paste: EventSimulator; - scroll: EventSimulator; - submit: EventSimulator; - touchCancel: EventSimulator; - touchEnd: EventSimulator; - touchMove: EventSimulator; - touchStart: EventSimulator; - wheel: EventSimulator; - } -} diff --git a/react-addons/legacy/react-addons-0.11-tests.ts b/react/legacy/react-addons-0.11-tests.ts similarity index 100% rename from react-addons/legacy/react-addons-0.11-tests.ts rename to react/legacy/react-addons-0.11-tests.ts diff --git a/react-addons/legacy/react-addons-0.11.d.ts b/react/legacy/react-addons-0.11.d.ts similarity index 98% rename from react-addons/legacy/react-addons-0.11.d.ts rename to react/legacy/react-addons-0.11.d.ts index 3e2f22a51..d02740246 100644 --- a/react-addons/legacy/react-addons-0.11.d.ts +++ b/react/legacy/react-addons-0.11.d.ts @@ -3,7 +3,7 @@ // Definitions by: Asana // Definitions: https://github.com/borisyankov/DefinitelyTyped -/// +/// declare module "react/addons-0.11" { export = React; diff --git a/react-addons/react-addons-tests.ts b/react/react-addons-tests.ts similarity index 99% rename from react-addons/react-addons-tests.ts rename to react/react-addons-tests.ts index 7a835dfeb..5fbca7cff 100644 --- a/react-addons/react-addons-tests.ts +++ b/react/react-addons-tests.ts @@ -1,4 +1,4 @@ -/// +/// import React = require("react/addons"); var PropTypesSpecification: React.Specification = { diff --git a/react/react.d.ts b/react/react.d.ts index f7e5f5387..48fc0c128 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -1,53 +1,90 @@ -// Type definitions for React 0.12.RC +// Type definitions for React 0.12.1 // Project: http://facebook.github.io/react/ // Definitions by: Asana // Definitions: https://github.com/borisyankov/DefinitelyTyped declare module "react" { - export = React; + var exports: React.ModuleExports; + export = exports; +} + +declare module "react/addons" { + var exports: React.ModuleWithAddonsExports; + export = exports; +} + +declare module "react/lib/cloneWithProps" { + interface exports

extends React.CloneWithProps

{} + export = exports; +} + +declare module "react/lib/cx" { + var exports: React.ClassSet; + export = exports; +} + +declare module "react/lib/LinkedStateMixin" { + interface exports extends React.LinkedStateMixin {} + export = exports; +} + +declare module "react/lib/ReactComponentWithPureRenderMixin" { + var exports: React.PureRenderMixin; + export = exports; +} + +declare module "react/lib/ReactCSSTransitionGroup" { + var exports: React.CSSTransitionGroup; + export = exports; +} + + +declare module "react/lib/ReactDefaultPerf" { + var exports: React.Perf; + export = exports; +} + +declare module "react/lib/ReactTestUtils" { + var exports: React.TestUtils; + export = exports; +} + +declare module "react/lib/ReactTransitionGroup" { + var exports: React.TransitionGroup; + export = exports; +} + +declare module "react/lib/update" { + var exports: React.Update; + export = exports; } declare module React { - export function createClass(specification: Specification): ReactComponentFactory

; - - export function createFactory

(clazz: ReactComponentFactory

): ReactComponentFactory

; - - export function createElement

(clazz: ReactComponentFactory

, props: P, ...children: any[]): ReactComponentElement

; - - export function createElement(type: string, props: DomAttributes, ...children: any[]): ReactHTMLElement; - - export function createElement(type: string, props: SvgAttributes, ...children: any[]): ReactSVGElement; - - export function render

(component: ReactComponentElement

, container: Element, callback?: () => void): ReactComponentElement

; - - export function render(component: ReactHTMLElement, container: Element, callback?: () => void): ReactHTMLElement; - - export function render(component: ReactSVGElement, container: Element, callback?: () => void): ReactSVGElement; - - export function unmountComponentAtNode(container: Element): boolean; - - export function renderToString

(component: ReactComponentElement

): string; - - export function renderToString(component: ReactHTMLElement): string; - - export function renderToString(component: ReactSVGElement): string; - - export function renderToStaticMarkup

(component: ReactComponentElement

): string; - - export function renderToStaticMarkup(component: ReactHTMLElement): string; - - export function renderToStaticMarkup(component: ReactSVGElement): string; - - export function isValidClass(factory: ReactComponentFactory): boolean; - - export function isValidElement(component: ReactComponentElement): boolean; - - export function isValidElement(component: ReactHTMLElement): boolean; - - export function isValidElement(component: ReactSVGElement): boolean; - - export function initializeTouchEvents(shouldUseTouch: boolean): void; - + export interface ModuleExports { + createClass(specification: Specification): ReactComponentFactory

; + createFactory

(clazz: ReactComponentFactory

): ReactComponentFactory

; + createElement

(clazz: ReactComponentFactory

, props: P, ...children: any[]): ReactComponentElement

; + createElement(type: string, props: DomAttributes, ...children: any[]): ReactHTMLElement; + createElement(type: string, props: SvgAttributes, ...children: any[]): ReactSVGElement; + render

(component: ReactComponentElement

, container: Element, callback?: () => void): Component; + render(component: ReactHTMLElement, container: Element, callback?: () => void): ReactHTMLElement; + render(component: ReactSVGElement, container: Element, callback?: () => void): ReactSVGElement; + unmountComponentAtNode(container: Element): boolean; + renderToString

(component: ReactComponentElement

): string; + renderToString(component: ReactHTMLElement): string; + renderToString(component: ReactSVGElement): string; + renderToStaticMarkup

(component: ReactComponentElement

): string; + renderToStaticMarkup(component: ReactHTMLElement): string; + renderToStaticMarkup(component: ReactSVGElement): string; + isValidClass(factory: ReactComponentFactory): boolean; + isValidElement(component: ReactComponentElement): boolean; + isValidElement(component: ReactHTMLElement): boolean; + isValidElement(component: ReactSVGElement): boolean; + initializeTouchEvents(shouldUseTouch: boolean): void; + DOM: DomConstructors; + Children: Children; + PropTypes: PropTypes; + } export interface ReactComponentFactory

{ (properties?: P, ...children: any[]): ReactComponentElement

; @@ -154,7 +191,7 @@ declare module React { [key: string]: Validator

; } - export var PropTypes: { + export interface PropTypes { any: Requireable; array: Requireable; bool: Requireable; @@ -170,14 +207,14 @@ declare module React { arrayOf: (type: Validator) => Requireable; objectOf: (type: Validator) => Requireable; shape: (type: ValidationMap) => Requireable; - }; + } - export var Children: { + export interface Children { map(children: any[], fn: (child: any) => any): any[]; forEach(children: any[], fn: (child: any) => any): void; count(children: any[]): number; only(children: any[]): any; - }; + } // Browser Interfaces // Taken from https://github.com/nikeee/2048-typescript/blob/master/2048/js/touch.d.ts @@ -477,7 +514,7 @@ declare module React { y?: any; } - export var DOM: { + export interface DomConstructors { // HTML a: DomElement; abbr: DomElement; @@ -608,5 +645,179 @@ declare module React { svg: SvgElement; text: SvgElement; tspan: SvgElement; - }; + } + + // Addons + export interface ModuleWithAddonsExports extends ModuleExports { + addons: ReactAddons; + } + + export interface ReactAddons { + cloneWithProps

(instance: React.ReactComponentElement

, extraProps?: P): React.ReactComponentElement

; + classSet: ClassSet; + LinkedStateMixin: LinkedStateMixin; + PureRenderMixin: PureRenderMixin; + CSSTransitionGroup: CSSTransitionGroup; + Perf: Perf; + TestUtils: TestUtils; + TransitionGroup: TransitionGroup; + update: Update; + } + + export interface CloneWithProps

{ + (instance: React.ReactComponentElement

, extraProps?: P): React.ReactComponentElement

; + } + + export interface ClassSet { + (classes: {[key: string]: boolean}): string + } + + export interface ReactLink { + value: T; + requestChange(newValue: T): void; + } + + export interface LinkedStateMixin extends React.Mixin { + linkState(key: string): ReactLink; + } + + export interface PureRenderMixin extends React.Mixin {} + + export interface CSSTransitionGroup extends React.ReactComponentFactory<{ + transitionName: string; + }> {} + + export interface ComponentPerfContext { + current: string; + owner: string; + } + + export interface NumericPerfContext { + [key: string]: number; + } + + export interface Measurements { + exclusive: NumericPerfContext; + inclusive: NumericPerfContext; + render: NumericPerfContext; + counts: NumericPerfContext; + writes: NumericPerfContext; + displayNames: { + [key: string]: ComponentPerfContext; + }; + totalTime: number; + } + + export interface Perf { + start(): void; + stop(): void; + printInclusive(measurements: Measurements[]): void; + printExclusive(measurements: Measurements[]): void; + printWasted(measurements: Measurements[]): void; + printDOM(measurements: Measurements[]): void; + getLastMeasurements(): Measurements[]; + } + + export interface TestUtils { + Simulate: Simulate; + renderIntoDocument

(instance: ReactComponentElement

): ReactComponentElement

; + renderIntoDocument(instance: ReactHTMLElement): ReactHTMLElement; + renderIntoDocument(instance: ReactSVGElement): ReactSVGElement; + mockComponent(componentClass: ReactComponentFactory, mockTagName?: string): TestUtils; + isDescriptorOfType(descriptor: ReactElement, componentClass: ReactComponentFactory): boolean; + isDOMComponent(instance: ReactElement): boolean; + isCompositeComponent(instance: ReactElement): boolean; + isCompositeComponentWithType(instance: ReactElement, componentClass: ReactComponentFactory): boolean; + isTextComponent(instance: ReactElement): boolean; + findAllInRenderedTree(tree: ReactElement, test: (component: ReactElement) => boolean): ReactElement[]; + scryRenderedDOMComponentsWithClass(tree: ReactElement, className: string): ReactElement[]; + findRenderedDOMComponentWithClass(tree: ReactElement, className: string): ReactElement; + scryRenderedDOMComponentsWithTag(tree: ReactElement, tagName: string): ReactElement[]; + findRenderedDOMComponentWithTag(tree: ReactElement, tagName: string): ReactElement; + scryRenderedComponentsWithTag(tree: ReactElement, componentClass: Function): ReactElement[]; + findRenderedComponentWithType

(tree: ReactElement, componentClass: ReactComponentFactory

): Component; + scryRenderedComponentsWithType

(tree: ReactElement, componentClass: ReactComponentFactory

): Component[]; + } + + export interface SyntheticEventData { + altKey?: boolean; + button?: number; + buttons?: number; + clientX?: number; + clientY?: number; + changedTouches?: TouchList; + charCode?: boolean; + clipboardData?: DataTransfer; + ctrlKey?: boolean; + deltaMode?: number; + deltaX?: number; + deltaY?: number; + deltaZ?: number; + detail?: number; + getModifierState?(key: string): boolean; + key?: string; + keyCode?: number; + locale?: string; + location?: number; + metaKey?: boolean; + pageX?: number; + pageY?: number; + relatedTarget?: EventTarget; + repeat?: boolean; + screenX?: number; + screenY?: number; + shiftKey?: boolean; + targetTouches?: TouchList; + touches?: TouchList; + view?: AbstractView; + which?: number; + } + + export interface EventSimulator { + (element: Element, eventData?: SyntheticEventData): void; + (descriptor: ReactElement, eventData?: SyntheticEventData): void; + } + + export interface Simulate { + blur: EventSimulator; + change: EventSimulator; + click: EventSimulator; + cut: EventSimulator; + doubleClick: EventSimulator; + drag: EventSimulator; + dragEnd: EventSimulator; + dragEnter: EventSimulator; + dragExit: EventSimulator; + dragLeave: EventSimulator; + dragOver: EventSimulator; + dragStart: EventSimulator; + drop: EventSimulator; + focus: EventSimulator; + input: EventSimulator; + keyDown: EventSimulator; + keyPress: EventSimulator; + keyUp: EventSimulator; + mouseDown: EventSimulator; + mouseEnter: EventSimulator; + mouseLeave: EventSimulator; + mouseMove: EventSimulator; + mouseOut: EventSimulator; + mouseOver: EventSimulator; + mouseUp: EventSimulator; + paste: EventSimulator; + scroll: EventSimulator; + submit: EventSimulator; + touchCancel: EventSimulator; + touchEnd: EventSimulator; + touchMove: EventSimulator; + touchStart: EventSimulator; + wheel: EventSimulator; + } + + export interface TransitionGroup extends ReactComponentFactory {} + + export interface Update { + (object: Object, changes: Object): Object + } + } \ No newline at end of file From 4e36e715e2524d712b3e28c21199d8be043669a3 Mon Sep 17 00:00:00 2001 From: sixinli Date: Fri, 21 Nov 2014 19:01:53 -0500 Subject: [PATCH 08/72] Add tsd for ion.rangeSlider 2.0.1 Add the typing and test files for ion.rangeSlider version 2.0.1 --- .../ion.rangeSlider-1.9.1-tests.ts | 38 +++++++++++ ion.rangeSlider/ion.rangeSlider-1.9.1.d.ts | 51 ++++++++++++++ ion.rangeSlider/ion.rangeSlider-tests.ts | 66 +++++++++++++------ ion.rangeSlider/ion.rangeSlider.d.ts | 58 ++++++++++------ 4 files changed, 173 insertions(+), 40 deletions(-) create mode 100644 ion.rangeSlider/ion.rangeSlider-1.9.1-tests.ts create mode 100644 ion.rangeSlider/ion.rangeSlider-1.9.1.d.ts diff --git a/ion.rangeSlider/ion.rangeSlider-1.9.1-tests.ts b/ion.rangeSlider/ion.rangeSlider-1.9.1-tests.ts new file mode 100644 index 000000000..c04d5715f --- /dev/null +++ b/ion.rangeSlider/ion.rangeSlider-1.9.1-tests.ts @@ -0,0 +1,38 @@ +/// +/// + +var sliderInputElement = $(''); +sliderInputElement.ionRangeSlider({ + min: 10, + max: 100, + from: 30, + to: 80, + type: "single", + step: 10, + prefix: "$", + postfix: ".00", + maxPostfix: "+", + hasGrid: true, + hideMinMax: true, + hideFromTo: true, + prettify: true, + disable: false, + values: ["a", "b", "c"], + onLoad: function (obj) { + console.log(obj); + }, + onChange: function (obj) { + console.log(obj); + }, + onFinish: function (obj) { + console.log(obj); + } +}); +sliderInputElement.ionRangeSlider("update", { + min: 20, + max: 90, + from: 40, + to: 70, + step: 5 +}); +sliderInputElement.ionRangeSlider("remove"); diff --git a/ion.rangeSlider/ion.rangeSlider-1.9.1.d.ts b/ion.rangeSlider/ion.rangeSlider-1.9.1.d.ts new file mode 100644 index 000000000..b60954b3b --- /dev/null +++ b/ion.rangeSlider/ion.rangeSlider-1.9.1.d.ts @@ -0,0 +1,51 @@ +// Type definitions for for Ion.RangeSlider 1.9.1 +// Project: https://github.com/IonDen/ion.rangeSlider/ +// Definitions by: Douglas Eichelberger +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +// API documentation: http://ionden.com/a/plugins/ion.rangeSlider/en.html + +interface JQuery { + ionRangeSlider(): JQuery; + ionRangeSlider(options: IonRangeSliderOptions): JQuery; + ionRangeSlider(method: string): JQuery; + ionRangeSlider(method: string, options: IonRangeSliderOptions): JQuery; +} + +interface IonRangeSliderOptions { + disable?: boolean; + from?: number; + hasGrid?: boolean; + hideFromTo?: boolean; + hideMinMax?: boolean; + max?: number; + maxPostfix?: string; + min?: number; + onChange?: (obj: IonRangeSliderEvent) => void; + onFinish?: (obj: IonRangeSliderEvent) => void; + onLoad?: (obj: IonRangeSliderEvent) => void; + postfix?: string; + prefix?: string; + prettify?: boolean; + step?: number; + to?: number; + type?: string; + values?: any[]; +} + +interface IonRangeSliderEvent { + fromNumber: number; + fromPers: number; + fromValue?: any; + fromX: number; + fromX_pure?: number; + input: JQuery; + max: number; + min: number; + slider: JQuery; + toNumber: number; + toPers: number; + toValue?: number; + toX: number; + toX_pure?: number; +} diff --git a/ion.rangeSlider/ion.rangeSlider-tests.ts b/ion.rangeSlider/ion.rangeSlider-tests.ts index 6f1d25f0d..26dd35e94 100644 --- a/ion.rangeSlider/ion.rangeSlider-tests.ts +++ b/ion.rangeSlider/ion.rangeSlider-tests.ts @@ -3,36 +3,62 @@ var sliderInputElement = $(''); sliderInputElement.ionRangeSlider({ - min: 10, - max: 100, - from: 30, - to: 80, - type: "single", - step: 10, - prefix: "$", - postfix: ".00", - maxPostfix: "+", - hasGrid: true, - hideMinMax: true, - hideFromTo: true, - prettify: true, + decorate_both: true, disable: false, - values: ["a", "b", "c"], - onLoad: function (obj) { - console.log(obj); - }, + force_edges: false, + from: 30, + from_fixed: false, + from_max: 50, + from_min: 20, + from_shadow: false, + grid: true, + grid_margin: true, + grid_num: 4, + grid_snap: false, + hide_from_to: false, + hide_min_max: false, + keyboard: true, + keyboard_step: 1, + max: 100, + max_interval: 5, + max_postfix: "+", + min: 10, + min_interval: 5, onChange: function (obj) { console.log(obj); }, onFinish: function (obj) { console.log(obj); - } + }, + onStart: function (obj) { + console.log(obj); + }, + onUpdate: function (obj) { + console.log(obj); + }, + postfix: ".00", + prefix: "$", + prettify: function(num) { + return String(num); + }, + prettify_enabled: true, + prettify_separator: ",", + step: 10, + to: 80, + to_fixed: false, + to_max: 100, + to_min: 60, + to_shadowed: false, + type: "double", + values: ["a", "b", "c"], + values_separator: "," }); -sliderInputElement.ionRangeSlider("update", { +sliderInputElement.update({ min: 20, max: 90, from: 40, to: 70, step: 5 }); -sliderInputElement.ionRangeSlider("remove"); +sliderInputElement.reset(); +sliderInputElement.destroy(); diff --git a/ion.rangeSlider/ion.rangeSlider.d.ts b/ion.rangeSlider/ion.rangeSlider.d.ts index b60954b3b..8eac3c109 100644 --- a/ion.rangeSlider/ion.rangeSlider.d.ts +++ b/ion.rangeSlider/ion.rangeSlider.d.ts @@ -1,51 +1,69 @@ -// Type definitions for for Ion.RangeSlider 1.9.1 +// Type definitions for for Ion.RangeSlider 2.0.1 // Project: https://github.com/IonDen/ion.rangeSlider/ -// Definitions by: Douglas Eichelberger +// Definitions by: Sixin Li // Definitions: https://github.com/borisyankov/DefinitelyTyped // API documentation: http://ionden.com/a/plugins/ion.rangeSlider/en.html interface JQuery { + destroy(): void; ionRangeSlider(): JQuery; ionRangeSlider(options: IonRangeSliderOptions): JQuery; - ionRangeSlider(method: string): JQuery; - ionRangeSlider(method: string, options: IonRangeSliderOptions): JQuery; + reset(): void; + update(option: IonRangeSliderOptions): void; } interface IonRangeSliderOptions { + decorate_both?: boolean disable?: boolean; + force_edges?: boolean; from?: number; - hasGrid?: boolean; - hideFromTo?: boolean; - hideMinMax?: boolean; + from_fixed?: boolean; + from_max?: number; + from_min?: number; + from_shadow?: boolean; + grid?: boolean; + grid_margin?: boolean; + grid_num?: number; + grid_snap?: boolean; + hide_from_to?: boolean; + hide_min_max?: boolean; + keyboard?: boolean; + keyboard_step?: number; max?: number; - maxPostfix?: string; + max_interval?: number; + max_postfix?: string; min?: number; + min_interval?: number; onChange?: (obj: IonRangeSliderEvent) => void; onFinish?: (obj: IonRangeSliderEvent) => void; - onLoad?: (obj: IonRangeSliderEvent) => void; + onStart?: (obj: IonRangeSliderEvent) => void; + onUpdate?: (obj: IonRangeSliderEvent) => void; postfix?: string; prefix?: string; - prettify?: boolean; + prettify?: (num: number) => string; + prettify_enabled?: boolean; + prettify_separator?: string; step?: number; to?: number; + to_fixed?: boolean; + to_max?: number; + to_min?: number; + to_shadowed?: boolean; type?: string; values?: any[]; + values_separator?: string; } interface IonRangeSliderEvent { - fromNumber: number; - fromPers: number; - fromValue?: any; - fromX: number; - fromX_pure?: number; + from: number; + from_precent: number; + from_value: any; input: JQuery; max: number; min: number; slider: JQuery; - toNumber: number; - toPers: number; - toValue?: number; - toX: number; - toX_pure?: number; + to: number; + to_precent: number; + to_value: any; } From 3ce44dcc58e583980447f89ffb5b531973acf50f Mon Sep 17 00:00:00 2001 From: Michel Salib Date: Tue, 2 Dec 2014 14:04:06 +0100 Subject: [PATCH 09/72] Fix moment-timezone export/import --- moment-timezone/moment-timezone-tests.ts | 2 ++ moment-timezone/moment-timezone.d.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/moment-timezone/moment-timezone-tests.ts b/moment-timezone/moment-timezone-tests.ts index 6ee7a78dd..f6a754c6e 100644 --- a/moment-timezone/moment-timezone-tests.ts +++ b/moment-timezone/moment-timezone-tests.ts @@ -1,5 +1,7 @@ /// +import moment = require('moment-timezone'); + var june = moment("2014-06-01T12:00:00Z"); june.tz('America/Los_Angeles').format('ha z'); diff --git a/moment-timezone/moment-timezone.d.ts b/moment-timezone/moment-timezone.d.ts index 785aeb047..9553faa3a 100644 --- a/moment-timezone/moment-timezone.d.ts +++ b/moment-timezone/moment-timezone.d.ts @@ -50,5 +50,7 @@ interface MomentStatic { } declare module 'moment-timezone' { + var _tmp: MomentStatic; + export = _tmp; } From a99c1ad839fbd00e00f89e3d54490fd8a3d86294 Mon Sep 17 00:00:00 2001 From: Vincent Siao Date: Tue, 2 Dec 2014 17:00:15 -0800 Subject: [PATCH 10/72] Cleanup react.d.ts; introduce Instance

interface to replace DomReferencer

; alias EventHandler types; etc... --- react/react-addons-tests.ts | 111 +--- react/react-tests.ts | 29 +- react/react.d.ts | 1074 +++++++++++++++++++---------------- 3 files changed, 585 insertions(+), 629 deletions(-) diff --git a/react/react-addons-tests.ts b/react/react-addons-tests.ts index 5fbca7cff..d89c383bf 100644 --- a/react/react-addons-tests.ts +++ b/react/react-addons-tests.ts @@ -1,113 +1,8 @@ /// import React = require("react/addons"); -var PropTypesSpecification: React.Specification = { - propTypes: { - // You can declare that a prop is a specific JS primitive. By default, these - // are all optional. - optionalArray: React.PropTypes.array, - optionalBool: React.PropTypes.bool, - optionalFunc: React.PropTypes.func, - optionalNumber: React.PropTypes.number, - optionalObject: React.PropTypes.object, - optionalString: React.PropTypes.string, - - // Anything that can be rendered: numbers, strings, components or an array - // containing these types. - optionalRenderable: React.PropTypes.node, - - // A React component. - optionalComponent: React.PropTypes.component, - - // You can also declare that a prop is an instance of a class. This uses - // JS's instanceof operator. - optionalMessage: React.PropTypes.instanceOf(Date), - - // You can ensure that your prop is limited to specific values by treating - // it as an enum. - optionalEnum: React.PropTypes.oneOf(['News', 'Photos']), - - // An object that could be one of many types - optionalUnion: React.PropTypes.oneOfType([ - React.PropTypes.string, - React.PropTypes.number, - React.PropTypes.instanceOf(Date) - ]), - - // An array of a certain type - optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number), - - // An object with property values of a certain type - optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number), - - // An object taking on a particular shape - optionalObjectWithShape: React.PropTypes.shape({ - color: React.PropTypes.string, - fontSize: React.PropTypes.number - }), - - // You can chain any of the above with `isRequired` to make sure a warning - // is shown if the prop isn't provided. - requiredFunc: React.PropTypes.func.isRequired, - - // A value of any data type - requiredAny: React.PropTypes.any.isRequired, - - // You can also specify a custom validator. It should return an Error - // object if the validation fails. Don't `console.warn` or throw, as this - // won't work inside `oneOfType`. - customProp: function(props, propName, componentName) { - if (!/matchme/.test(props[propName])) { - return new Error('Validation failed!'); - } - return null; - } - }, - render: (): React.ReactHTMLElement => { - return null; - } -}; - -React.createClass(PropTypesSpecification); - -var mountNode: Element; - -var HelloMessage = React.createClass({displayName: 'HelloMessage', - render: function() { - return React.DOM.div(null, "Hello ", (>this).props.name); - } -}); - -React.render(HelloMessage({name: "John"}), mountNode); - -var Timer = React.createClass({displayName: 'Timer', - getInitialState: function() { - return {secondsElapsed: 0}; - }, - tick: function() { - (>this).setState({ - secondsElapsed: (>this).state.secondsElapsed + 1 - }); - }, - componentDidMount: function() { - this.interval = setInterval(this.tick, 1000); - }, - componentWillUnmount: function() { - clearInterval(this.interval); - }, - render: function() { - return React.DOM.div( - null, - "Seconds Elapsed: ", - (>this).state.secondsElapsed - ); - } -}); - -React.render(Timer(null), mountNode); - // TestUtils -var that: React.Component; +var that: React.ComponentInstance; var node = that.refs['input'].getDOMNode(); React.addons.TestUtils.Simulate.click(node); React.addons.TestUtils.Simulate.change(node); @@ -118,12 +13,12 @@ var Greeting = React.createClass({displayName: 'Greeting', return {morning: true}; }, render: function() { - var me = >this; + var me = >this; return React.DOM.div(null, (me.state.morning ? "Hello" : "Goodbye "), me.props.name); } }); -var root = React.addons.TestUtils.renderIntoDocument(Greeting({name: "John"})); +var root = React.addons.TestUtils.renderIntoDocument(React.createElement(Greeting, {name: "John"})); var greeting = React.addons.TestUtils.findRenderedComponentWithType(root, Greeting); greeting.setState({ morning: false diff --git a/react/react-tests.ts b/react/react-tests.ts index 37380b23b..5d1743cbb 100644 --- a/react/react-tests.ts +++ b/react/react-tests.ts @@ -1,7 +1,7 @@ /// import React = require("react"); -var PropTypesSpecification: React.Specification = { +var PropTypesSpecification: React.ComponentSpec = { propTypes: { // You can declare that a prop is a specific JS primitive. By default, these // are all optional. @@ -14,10 +14,10 @@ var PropTypesSpecification: React.Specification = { // Anything that can be rendered: numbers, strings, components or an array // containing these types. - optionalRenderable: React.PropTypes.node, + optionalNode: React.PropTypes.node, - // A React component. - optionalComponent: React.PropTypes.component, + // A React element + optionalElement: React.PropTypes.element, // You can also declare that a prop is an instance of a class. This uses // JS's instanceof operator. @@ -56,7 +56,7 @@ var PropTypesSpecification: React.Specification = { // You can also specify a custom validator. It should return an Error // object if the validation fails. Don't `console.warn` or throw, as this // won't work inside `oneOfType`. - customProp: function(props, propName, componentName) { + customProp: function(props: any, propName: string, componentName: string) { if (!/matchme/.test(props[propName])) { return new Error('Validation failed!'); } @@ -76,17 +76,13 @@ interface HelloMessageProps { name: string; } -var HelloMessage = React.createClass({displayName: 'HelloMessage', +var HelloMessage = React.createClass({ + displayName: 'HelloMessage', render: function() { - return React.DOM.div(null, "Hello ", (>this).props.name); + return React.DOM.div(null, "Hello ", (>this).props.name); } }); -// This code - calling a component directly - is deprecated in v0.12 -// See http://fb.me/react-legacyfactory -React.render(HelloMessage({ name: "John" }), mountNode); - -// Create a factory instead var HelloMessageFactory = React.createFactory(HelloMessage) React.render(HelloMessageFactory({ name: "John" }), mountNode) @@ -95,8 +91,9 @@ var Timer = React.createClass({displayName: 'Timer', return {secondsElapsed: 0}; }, tick: function() { - (>this).setState({ - secondsElapsed: (>this).state.secondsElapsed + 1 + var me = >this; + me.setState({ + secondsElapsed: me.state.secondsElapsed + 1 }); }, componentDidMount: function() { @@ -109,9 +106,9 @@ var Timer = React.createClass({displayName: 'Timer', return React.DOM.div( null, "Seconds Elapsed: ", - (>this).state.secondsElapsed + (>this).state.secondsElapsed ); } }); -React.render(Timer(), mountNode); \ No newline at end of file +React.render(React.createElement(Timer, null), mountNode); diff --git a/react/react.d.ts b/react/react.d.ts index 48fc0c128..8a8589203 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -3,227 +3,16 @@ // Definitions by: Asana // Definitions: https://github.com/borisyankov/DefinitelyTyped -declare module "react" { - var exports: React.ModuleExports; - export = exports; -} - -declare module "react/addons" { - var exports: React.ModuleWithAddonsExports; - export = exports; -} - -declare module "react/lib/cloneWithProps" { - interface exports

extends React.CloneWithProps

{} - export = exports; -} - -declare module "react/lib/cx" { - var exports: React.ClassSet; - export = exports; -} - -declare module "react/lib/LinkedStateMixin" { - interface exports extends React.LinkedStateMixin {} - export = exports; -} - -declare module "react/lib/ReactComponentWithPureRenderMixin" { - var exports: React.PureRenderMixin; - export = exports; -} - -declare module "react/lib/ReactCSSTransitionGroup" { - var exports: React.CSSTransitionGroup; - export = exports; -} - - -declare module "react/lib/ReactDefaultPerf" { - var exports: React.Perf; - export = exports; -} - -declare module "react/lib/ReactTestUtils" { - var exports: React.TestUtils; - export = exports; -} - -declare module "react/lib/ReactTransitionGroup" { - var exports: React.TransitionGroup; - export = exports; -} - -declare module "react/lib/update" { - var exports: React.Update; - export = exports; -} - -declare module React { - export interface ModuleExports { - createClass(specification: Specification): ReactComponentFactory

; - createFactory

(clazz: ReactComponentFactory

): ReactComponentFactory

; - createElement

(clazz: ReactComponentFactory

, props: P, ...children: any[]): ReactComponentElement

; - createElement(type: string, props: DomAttributes, ...children: any[]): ReactHTMLElement; - createElement(type: string, props: SvgAttributes, ...children: any[]): ReactSVGElement; - render

(component: ReactComponentElement

, container: Element, callback?: () => void): Component; - render(component: ReactHTMLElement, container: Element, callback?: () => void): ReactHTMLElement; - render(component: ReactSVGElement, container: Element, callback?: () => void): ReactSVGElement; - unmountComponentAtNode(container: Element): boolean; - renderToString

(component: ReactComponentElement

): string; - renderToString(component: ReactHTMLElement): string; - renderToString(component: ReactSVGElement): string; - renderToStaticMarkup

(component: ReactComponentElement

): string; - renderToStaticMarkup(component: ReactHTMLElement): string; - renderToStaticMarkup(component: ReactSVGElement): string; - isValidClass(factory: ReactComponentFactory): boolean; - isValidElement(component: ReactComponentElement): boolean; - isValidElement(component: ReactHTMLElement): boolean; - isValidElement(component: ReactSVGElement): boolean; - initializeTouchEvents(shouldUseTouch: boolean): void; - DOM: DomConstructors; - Children: Children; - PropTypes: PropTypes; - } - - export interface ReactComponentFactory

{ - (properties?: P, ...children: any[]): ReactComponentElement

; - } - - export interface ReactElementFactory

{ - (properties?: P, ...children: any[]): ReactDOMElement

; - } - - export interface DomElement extends ReactElementFactory { - } - - export interface SvgElement extends ReactElementFactory { - } - - export interface ReactClass

{ - (props: P): ReactComponent

; - } - - export interface ReactComponent

{ - props: P; - render(): ReactElement; - } - - export interface ReactElement { - type: T; - props: P; - key: string; - ref: string; - } - - export interface ReactDOMElement

extends ReactElement { - props: P; - } - - export interface ReactHTMLElement extends ReactDOMElement { - } - - export interface ReactSVGElement extends ReactDOMElement { - } - - export interface ReactComponentElement

extends ReactElement, P> { - props: P; - } - - export interface Mixin { - componentWillMount?(): void; - componentDidMount?(): void; - componentWillReceiveProps?(nextProps: P): void; - shouldComponentUpdate?(nextProps: P, nextState: S): boolean; - componentWillUpdate?(nextProps: P, nextState: S): void; - componentDidUpdate?(prevProps: P, prevState: S): void; - componentWillUnmount?(): void; - } - - export interface Specification extends Mixin { - displayName?: string; - mixins?: Mixin[]; - statics?: { - [key: string]: Function; - }; - propTypes?: ValidationMap

; - getDefaultProps?(): P; - getInitialState?(): S; - render(): ReactElement; - } - - export interface DomReferencer { - getDOMNode(): Element; - /** - * Use this overload to cast the returned element to a more specific type. - * Eg: var name = this.refs['name'].getDOMNode().value - */ - getDOMNode(): TElement; - } - - export interface Component extends DomReferencer { - refs: { - [key: string]: DomReferencer - }; - props: P; - state: S; - setState(nextState: S, callback?: () => void): void; - replaceState(nextState: S, callback?: () => void): void; - forceUpdate(callback?: () => void): void; - isMounted(): boolean; - setProps(nextProps: P, callback?: () => void): void; - replaceProps(nextProps: P, callback?: () => void): void; - } - - export interface Constructable { - new(): any; - } - - export interface Validator

{ - (props: P, propName: string, componentName: string): Error; - } - - export interface Requireable

extends Validator

{ - isRequired: Validator

; - } - - export interface ValidationMap

{ - [key: string]: Validator

; - } - - export interface PropTypes { - any: Requireable; - array: Requireable; - bool: Requireable; - func: Requireable; - number: Requireable; - object: Requireable; - string: Requireable; - node: Requireable; - component: Requireable; - instanceOf: (clazz: Constructable) => Requireable; - oneOf: (types: any[]) => Requireable - oneOfType: (types: Validator[]) => Requireable; - arrayOf: (type: Validator) => Requireable; - objectOf: (type: Validator) => Requireable; - shape: (type: ValidationMap) => Requireable; - } - - export interface Children { - map(children: any[], fn: (child: any) => any): any[]; - forEach(children: any[], fn: (child: any) => any): void; - count(children: any[]): number; - only(children: any[]): any; - } - +declare module Browser { // Browser Interfaces // Taken from https://github.com/nikeee/2048-typescript/blob/master/2048/js/touch.d.ts - export interface AbstractView { + + interface AbstractView { styleMedia: StyleMedia; document: Document; } - export interface Touch { + interface Touch { identifier: number; target: EventTarget; screenX: number; @@ -234,20 +23,150 @@ declare module React { pageY: number; } - export interface TouchList { + interface TouchList { [index: number]: Touch; length: number; item(index: number): Touch; identifiedTouch(identifier: number): Touch; } +} - // Events - export interface SyntheticEvent { +declare module React { + + // + // React Elements + // ---------------------------------------------------------------------- + + // type ReactType = ReactClass | string; + + interface ReactElement

{ + type: any; // ReactType + props: P; + key: any; // number | string + ref: string; + } + + interface ReactHTMLElement extends ReactElement {} + interface ReactSVGElement extends ReactElement {} + interface ComponentElement

extends ReactElement

{} + + // + // React Nodes + // ---------------------------------------------------------------------- + + // Typescript 1.4 (Union types, aliases) + // type ReactText = string | number; + // type ReactFragment = ReactNode[]; + // type ReactNode = ReactElement | ReactFragment | ReactText; + + // + // React Components + // ---------------------------------------------------------------------- + + interface ReactStatics

{ + displayName?: string; + getDefaultProps?(): P; + propTypes?: React.ValidationMap

; + } + + interface ReactClass

extends ReactStatics

{ + // Deprecated in 0.12. See http://fb.me/react-legacyfactory + // new(props: P): ReactElement

; + // (props: P): ReactElement

; + } + + // + // ReactElement Factories + // ---------------------------------------------------------------------- + + interface Factory

{ + (props?: P, ...children: any/*ReactNode*/[]): ReactElement

; + } + + interface ComponentFactory

extends Factory

{} + interface HTMLFactory extends Factory {} + interface SVGFactory extends Factory {} + + // + // Top-Level API + // ---------------------------------------------------------------------- + + interface TopLevelAPI { + createClass

(spec: ComponentSpec): ReactClass

; + createElement

(type: any/*ReactType*/, props: P, ...children: any/*ReactNode*/[]): ReactElement

; + createFactory

(type: any/*ReactType*/): Factory

; + render

(element: ReactElement

, container: Element, callback?: () => void): ReactInstance

; + unmountComponentAtNode(container: Element): boolean; + renderToString(element: ReactElement): string; + renderToStaticMarkup(element: ReactElement): string; + isValidElement(object: {}): boolean; + initializeTouchEvents(shouldUseTouch: boolean): void; + } + + // + // Component API + // ---------------------------------------------------------------------- + + interface ReactInstance

{ + // Use this overload to cast the returned element to a more specific type. + // Eg: var name = this.refs['name'].getDOMNode().value; + getDOMNode(): TElement; + getDOMNode(): Element; + isMounted(): boolean; + + props: P; + setProps(nextProps: P, callback?: () => void): void; + replaceProps(nextProps: P, callback?: () => void): void; + } + + interface ComponentInstance extends ReactInstance

{ + state: S; + setState(nextState: S, callback?: () => void): void; + replaceState(nextState: S, callback?: () => void): void; + forceUpdate(callback?: () => void): void; + refs: { + [key: string]: ReactInstance

+ }; + } + + // + // Component Specs and Lifecycle + // ---------------------------------------------------------------------- + + interface Mixin extends ReactStatics

{ + mixins?: Mixin; + statics?: { + [key: string]: any; + }; + + // Definition methods + getInitialState?(): S; + + // Delegate methods + componentWillMount?(): void; + componentDidMount?(): void; + componentWillReceiveProps?(nextProps: P): void; + shouldComponentUpdate?(nextProps: P, nextState: S): boolean; + componentWillUpdate?(nextProps: P, nextState: S): void; + componentDidUpdate?(prevProps: P, prevState: S): void; + componentWillUnmount?(): void; + } + + interface ComponentSpec extends Mixin { + render(): ReactElement; + } + + // + // Event System + // ---------------------------------------------------------------------- + + interface SyntheticEvent { bubbles: boolean; cancelable: boolean; currentTarget: EventTarget; defaultPrevented: boolean; eventPhase: number; + isTrusted: boolean; nativeEvent: Event; preventDefault(): void; stopPropagation(): void; @@ -256,11 +175,11 @@ declare module React { type: string; } - export interface ClipboardEvent extends SyntheticEvent { + interface ClipboardEvent extends SyntheticEvent { clipboardData: DataTransfer; } - export interface KeyboardEvent extends SyntheticEvent { + interface KeyboardEvent extends SyntheticEvent { altKey: boolean; charCode: number; ctrlKey: boolean; @@ -275,11 +194,14 @@ declare module React { which: number; } - export interface FocusEvent extends SyntheticEvent { + interface FocusEvent extends SyntheticEvent { relatedTarget: EventTarget; } - export interface MouseEvent extends SyntheticEvent { + interface FormEvent extends SyntheticEvent { + } + + interface MouseEvent extends SyntheticEvent { altKey: boolean; button: number; buttons: number; @@ -296,125 +218,135 @@ declare module React { shiftKey: boolean; } - export interface TouchEvent extends SyntheticEvent { + interface TouchEvent extends SyntheticEvent { altKey: boolean; - changedTouches: TouchList; + changedTouches: Browser.TouchList; ctrlKey: boolean; getModifierState(key: string): boolean; metaKey: boolean; shiftKey: boolean; - targetTouches: TouchList; - touches: TouchList; + targetTouches: Browser.TouchList; + touches: Browser.TouchList; } - export interface UiEvent extends SyntheticEvent { + interface UIEvent extends SyntheticEvent { detail: number; - view: AbstractView; + view: Browser.AbstractView; } - export interface WheelEvent extends SyntheticEvent { + interface WheelEvent extends SyntheticEvent { deltaMode: number; deltaX: number; deltaY: number; deltaZ: number; } - // Attributes - export interface EventAttributes { - onCopy?: (event: ClipboardEvent) => void; - onCut?: (event: ClipboardEvent) => void; - onPaste?: (event: ClipboardEvent) => void; - onKeyDown?: (event: KeyboardEvent) => void; - onKeyPress?: (event: KeyboardEvent) => void; - onKeyUp?: (event: KeyboardEvent) => void; - onFocus?: (event: FocusEvent) => void; - onBlur?: (event: FocusEvent) => void; - onChange?: (event: SyntheticEvent) => void; - onInput?: (event: SyntheticEvent) => void; - onSubmit?: (event: SyntheticEvent) => void; - onClick?: (event: MouseEvent) => void; - onDoubleClick?: (event: MouseEvent) => void; - onDrag?: (event: MouseEvent) => void; - onDragEnd?: (event: MouseEvent) => void; - onDragEnter?: (event: MouseEvent) => void; - onDragExit?: (event: MouseEvent) => void; - onDragLeave?: (event: MouseEvent) => void; - onDragOver?: (event: MouseEvent) => void; - onDragStart?: (event: MouseEvent) => void; - onDrop?: (event: MouseEvent) => void; - onMouseDown?: (event: MouseEvent) => void; - onMouseEnter?: (event: MouseEvent) => void; - onMouseLeave?: (event: MouseEvent) => void; - onMouseMove?: (event: MouseEvent) => void; - onMouseOut?: (event: MouseEvent) => void; - onMouseOver?: (event: MouseEvent) => void; - onMouseUp?: (event: MouseEvent) => void; - onTouchCancel?: (event: TouchEvent) => void; - onTouchEnd?: (event: TouchEvent) => void; - onTouchMove?: (event: TouchEvent) => void; - onTouchStart?: (event: TouchEvent) => void; - onScroll?: (event: UiEvent) => void; - onWheel?: (event: WheelEvent) => void; + // + // Event Handler Types + // ---------------------------------------------------------------------- + + interface EventHandler { + (event: E): void; } + interface ClipboardEventHandler extends EventHandler {} + interface KeyboardEventHandler extends EventHandler {} + interface FocusEventHandler extends EventHandler {} + interface FormEventHandler extends EventHandler {} + interface MouseEventHandler extends EventHandler {} + interface TouchEventHandler extends EventHandler {} + interface UIEventHandler extends EventHandler {} + interface WheelEventHandler extends EventHandler {} + + // + // Attributes + // ---------------------------------------------------------------------- + export interface ReactAttributes { - dangerouslySetInnerHTML?: { - __html: string; - }; - children?: any[]; + children?: any; // ReactNode key?: string; ref?: string; + + // Event Attributes + onCopy?: ClipboardEventHandler; + onCut?: ClipboardEventHandler; + onPaste?: ClipboardEventHandler; + onKeyDown?: KeyboardEventHandler; + onKeyPress?: KeyboardEventHandler; + onKeyUp?: KeyboardEventHandler; + onFocus?: FocusEventHandler; + onBlur?: FocusEventHandler; + onChange?: FormEventHandler; + onInput?: FormEventHandler; + onSubmit?: FormEventHandler; + onClick?: MouseEventHandler; + onDoubleClick?: MouseEventHandler; + onDrag?: MouseEventHandler; + onDragEnd?: MouseEventHandler; + onDragEnter?: MouseEventHandler; + onDragExit?: MouseEventHandler; + onDragLeave?: MouseEventHandler; + onDragOver?: MouseEventHandler; + onDragStart?: MouseEventHandler; + onDrop?: MouseEventHandler; + onMouseDown?: MouseEventHandler; + onMouseEnter?: MouseEventHandler; + onMouseLeave?: MouseEventHandler; + onMouseMove?: MouseEventHandler; + onMouseOut?: MouseEventHandler; + onMouseOver?: MouseEventHandler; + onMouseUp?: MouseEventHandler; + onTouchCancel?: TouchEventHandler; + onTouchEnd?: TouchEventHandler; + onTouchMove?: TouchEventHandler; + onTouchStart?: TouchEventHandler; + onScroll?: UIEventHandler; + onWheel?: WheelEventHandler; } - export interface DomAttributes extends EventAttributes, ReactAttributes { - // HTML Attributes - accept?: any; - accessKey?: any; - action?: any; - allowFullScreen?: any; - allowTransparency?: any; - alt?: any; - async?: any; - autoCapitalize?: any; - autoComplete?: any; - autoCorrect?: any; - autoFocus?: any; - autoPlay?: any; - cellPadding?: any; - cellSpacing?: any; - charSet?: any; - checked?: any; - className?: any; - cols?: any; - colSpan?: any; - content?: any; - contentEditable?: any; - contextMenu?: any; + interface HTMLAttributes extends ReactAttributes { + accept?: string; + accessKey?: string; + action?: string; + allowFullScreen?: boolean; + allowTransparency?: boolean; + alt?: string; + async?: boolean; + autoComplete?: boolean; + autoFocus?: boolean; + autoPlay?: boolean; + cellPadding?: any; // number | string + cellSpacing?: any; // number | string + charSet?: string; + checked?: boolean; + className?: string; + cols?: number; + colSpan?: number; + content?: string; + contentEditable?: boolean; + contextMenu?: string; controls?: any; - coords?: any; - crossOrigin?: any; - data?: any; - dateTime?: any; - defer?: any; - dir?: any; - disabled?: any; + coords?: string; + crossOrigin?: string; + data?: string; + dateTime?: string; + defer?: boolean; + dir?: string; + disabled?: boolean; download?: any; - draggable?: any; - encType?: any; - form?: any; - formNoValidate?: any; - frameBorder?: any; - height?: any; - hidden?: any; - href?: any; - hrefLang?: any; - htmlFor?: any; - httpEquiv?: any; - icon?: any; - id?: any; - itemProp?: any; - itemScope?: any; - itemType?: any; + draggable?: boolean; + encType?: string; + form?: string; + formNoValidate?: boolean; + frameBorder?: any; // number | string + height?: any; // number | string + hidden?: boolean; + href?: string; + hrefLang?: string; + htmlFor?: string; + httpEquiv?: string; + icon?: string; + id?: string; label?: any; lang?: any; list?: any; @@ -433,7 +365,6 @@ declare module React { placeholder?: any; poster?: any; preload?: any; - property?: any; radioGroup?: any; readOnly?: any; rel?: any; @@ -466,9 +397,22 @@ declare module React { value?: any; width?: any; wmode?: any; + + // Non-standard Attributes + autoCapitalize?: boolean; + autoCorrect?: boolean; + property?: any; + itemProp?: string; + itemScope?: boolean; + itemType?: string; + + // React-specific Attributes + dangerouslySetInnerHTML: { + __html: string + }; } - export interface SvgAttributes extends EventAttributes, ReactAttributes { + interface SVGAttributes extends ReactAttributes { cx?: any; cy?: any; d?: any; @@ -514,189 +458,255 @@ declare module React { y?: any; } - export interface DomConstructors { + // + // React.DOM + // ---------------------------------------------------------------------- + + interface ReactDOM { // HTML - a: DomElement; - abbr: DomElement; - address: DomElement; - area: DomElement; - article: DomElement; - aside: DomElement; - audio: DomElement; - b: DomElement; - base: DomElement; - bdi: DomElement; - bdo: DomElement; - big: DomElement; - blockquote: DomElement; - body: DomElement; - br: DomElement; - button: DomElement; - canvas: DomElement; - caption: DomElement; - cite: DomElement; - code: DomElement; - col: DomElement; - colgroup: DomElement; - data: DomElement; - datalist: DomElement; - dd: DomElement; - del: DomElement; - details: DomElement; - dfn: DomElement; - dialog: DomElement; - div: DomElement; - dl: DomElement; - dt: DomElement; - em: DomElement; - embed: DomElement; - fieldset: DomElement; - figcaption: DomElement; - figure: DomElement; - footer: DomElement; - form: DomElement; - h1: DomElement; - h2: DomElement; - h3: DomElement; - h4: DomElement; - h5: DomElement; - h6: DomElement; - head: DomElement; - header: DomElement; - hr: DomElement; - html: DomElement; - i: DomElement; - iframe: DomElement; - img: DomElement; - input: DomElement; - ins: DomElement; - kbd: DomElement; - keygen: DomElement; - label: DomElement; - legend: DomElement; - li: DomElement; - link: DomElement; - main: DomElement; - map: DomElement; - mark: DomElement; - menu: DomElement; - menuitem: DomElement; - meta: DomElement; - meter: DomElement; - nav: DomElement; - noscript: DomElement; - object: DomElement; - ol: DomElement; - optgroup: DomElement; - option: DomElement; - output: DomElement; - p: DomElement; - param: DomElement; - pre: DomElement; - progress: DomElement; - q: DomElement; - rp: DomElement; - rt: DomElement; - ruby: DomElement; - s: DomElement; - samp: DomElement; - script: DomElement; - section: DomElement; - select: DomElement; - small: DomElement; - source: DomElement; - span: DomElement; - strong: DomElement; - style: DomElement; - sub: DomElement; - summary: DomElement; - sup: DomElement; - table: DomElement; - tbody: DomElement; - td: DomElement; - textarea: DomElement; - tfoot: DomElement; - th: DomElement; - thead: DomElement; - time: DomElement; - title: DomElement; - tr: DomElement; - track: DomElement; - u: DomElement; - ul: DomElement; - "var": DomElement; - video: DomElement; - wbr: DomElement; + a: React.HTMLFactory; + abbr: React.HTMLFactory; + address: React.HTMLFactory; + area: React.HTMLFactory; + article: React.HTMLFactory; + aside: React.HTMLFactory; + audio: React.HTMLFactory; + b: React.HTMLFactory; + base: React.HTMLFactory; + bdi: React.HTMLFactory; + bdo: React.HTMLFactory; + big: React.HTMLFactory; + blockquote: React.HTMLFactory; + body: React.HTMLFactory; + br: React.HTMLFactory; + button: React.HTMLFactory; + canvas: React.HTMLFactory; + caption: React.HTMLFactory; + cite: React.HTMLFactory; + code: React.HTMLFactory; + col: React.HTMLFactory; + colgroup: React.HTMLFactory; + data: React.HTMLFactory; + datalist: React.HTMLFactory; + dd: React.HTMLFactory; + del: React.HTMLFactory; + details: React.HTMLFactory; + dfn: React.HTMLFactory; + dialog: React.HTMLFactory; + div: React.HTMLFactory; + dl: React.HTMLFactory; + dt: React.HTMLFactory; + em: React.HTMLFactory; + embed: React.HTMLFactory; + fieldset: React.HTMLFactory; + figcaption: React.HTMLFactory; + figure: React.HTMLFactory; + footer: React.HTMLFactory; + form: React.HTMLFactory; + h1: React.HTMLFactory; + h2: React.HTMLFactory; + h3: React.HTMLFactory; + h4: React.HTMLFactory; + h5: React.HTMLFactory; + h6: React.HTMLFactory; + head: React.HTMLFactory; + header: React.HTMLFactory; + hr: React.HTMLFactory; + html: React.HTMLFactory; + i: React.HTMLFactory; + iframe: React.HTMLFactory; + img: React.HTMLFactory; + input: React.HTMLFactory; + ins: React.HTMLFactory; + kbd: React.HTMLFactory; + keygen: React.HTMLFactory; + label: React.HTMLFactory; + legend: React.HTMLFactory; + li: React.HTMLFactory; + link: React.HTMLFactory; + main: React.HTMLFactory; + map: React.HTMLFactory; + mark: React.HTMLFactory; + menu: React.HTMLFactory; + menuitem: React.HTMLFactory; + meta: React.HTMLFactory; + meter: React.HTMLFactory; + nav: React.HTMLFactory; + noscript: React.HTMLFactory; + object: React.HTMLFactory; + ol: React.HTMLFactory; + optgroup: React.HTMLFactory; + option: React.HTMLFactory; + output: React.HTMLFactory; + p: React.HTMLFactory; + param: React.HTMLFactory; + pre: React.HTMLFactory; + progress: React.HTMLFactory; + q: React.HTMLFactory; + rp: React.HTMLFactory; + rt: React.HTMLFactory; + ruby: React.HTMLFactory; + s: React.HTMLFactory; + samp: React.HTMLFactory; + script: React.HTMLFactory; + section: React.HTMLFactory; + select: React.HTMLFactory; + small: React.HTMLFactory; + source: React.HTMLFactory; + span: React.HTMLFactory; + strong: React.HTMLFactory; + style: React.HTMLFactory; + sub: React.HTMLFactory; + summary: React.HTMLFactory; + sup: React.HTMLFactory; + table: React.HTMLFactory; + tbody: React.HTMLFactory; + td: React.HTMLFactory; + textarea: React.HTMLFactory; + tfoot: React.HTMLFactory; + th: React.HTMLFactory; + thead: React.HTMLFactory; + time: React.HTMLFactory; + title: React.HTMLFactory; + tr: React.HTMLFactory; + track: React.HTMLFactory; + u: React.HTMLFactory; + ul: React.HTMLFactory; + "var": React.HTMLFactory; + video: React.HTMLFactory; + wbr: React.HTMLFactory; + // SVG - circle: SvgElement; - defs: SvgElement; - ellipse: SvgElement; - g: SvgElement; - line: SvgElement; - linearGradient: SvgElement; - mask: SvgElement; - path: SvgElement; - pattern: SvgElement; - polygon: SvgElement; - polyline: SvgElement; - radialGradient: SvgElement; - rect: SvgElement; - stop: SvgElement; - svg: SvgElement; - text: SvgElement; - tspan: SvgElement; + circle: React.SVGFactory; + defs: React.SVGFactory; + ellipse: React.SVGFactory; + g: React.SVGFactory; + line: React.SVGFactory; + linearGradient: React.SVGFactory; + mask: React.SVGFactory; + path: React.SVGFactory; + pattern: React.SVGFactory; + polygon: React.SVGFactory; + polyline: React.SVGFactory; + radialGradient: React.SVGFactory; + rect: React.SVGFactory; + stop: React.SVGFactory; + svg: React.SVGFactory; + text: React.SVGFactory; + tspan: React.SVGFactory; } - // Addons - export interface ModuleWithAddonsExports extends ModuleExports { - addons: ReactAddons; + // + // React.PropTypes + // ---------------------------------------------------------------------- + + interface Validator { + (object: T, key: string, componentName: string): Error; } - export interface ReactAddons { - cloneWithProps

(instance: React.ReactComponentElement

, extraProps?: P): React.ReactComponentElement

; - classSet: ClassSet; - LinkedStateMixin: LinkedStateMixin; - PureRenderMixin: PureRenderMixin; - CSSTransitionGroup: CSSTransitionGroup; - Perf: Perf; - TestUtils: TestUtils; - TransitionGroup: TransitionGroup; - update: Update; + interface Requireable extends Validator { + isRequired: Validator; } - export interface CloneWithProps

{ - (instance: React.ReactComponentElement

, extraProps?: P): React.ReactComponentElement

; + interface ValidationMap { + [key: string]: Validator; } - export interface ClassSet { - (classes: {[key: string]: boolean}): string + interface ReactPropTypes { + any: Requireable; + array: Requireable; + bool: Requireable; + func: Requireable; + number: Requireable; + object: Requireable; + string: Requireable; + node: Requireable; + element: Requireable; + instanceOf(expectedClass: {}): Requireable; + oneOf(types: any[]): Requireable; + oneOfType(types: Validator[]): Requireable; + arrayOf(type: Validator): Requireable; + objectOf(type: Validator): Requireable; + shape(type: ValidationMap): Requireable; } - export interface ReactLink { + // + // React.Children + // ---------------------------------------------------------------------- + + interface ReactChildren { + map(children: any/*ReactNode*/, fn: (child: any/*ReactNode*/) => T): { [key:string]: T }; + forEach(children: any/*ReactNode*/, fn: (child: any/*ReactNode*/) => any): void; + count(children: any/*ReactNode*/): number; + only(children: any/*ReactNode*/): any; + } + + // + // React.addons (Transitions) + // ---------------------------------------------------------------------- + + interface CSSTransitionGroupProps { + transitionName: string; + transitionAppear?: boolean; + transitionEnter?: boolean; + transitionLeave?: boolean; + } + + interface TransitionGroupProps { + component?: any; // ReactType + childFactory?: (child: React.ReactElement) => React.ReactElement; + } + + interface CSSTransitionGroup extends React.ReactClass {} + interface TransitionGroup extends React.ReactClass {} + + // + // React.addons (Mixins) + // ---------------------------------------------------------------------- + + interface ReactLink { value: T; requestChange(newValue: T): void; } - export interface LinkedStateMixin extends React.Mixin { + interface LinkedStateMixin extends React.Mixin { linkState(key: string): ReactLink; } - export interface PureRenderMixin extends React.Mixin {} + interface PureRenderMixin extends React.Mixin { + } - export interface CSSTransitionGroup extends React.ReactComponentFactory<{ - transitionName: string; - }> {} + // + // Reat.addons.update + // ---------------------------------------------------------------------- - export interface ComponentPerfContext { + interface UpdateSpec { + $set: any; + $merge: {}; + $apply(value: any): any; + // [key: string]: UpdateSpec; + } + + interface UpdateArraySpec extends UpdateSpec { + $push?: any[]; + $unshift?: any[]; + $splice?: any[][]; + } + + // + // React.addons.Perf + // ---------------------------------------------------------------------- + + interface ComponentPerfContext { current: string; owner: string; } - export interface NumericPerfContext { + interface NumericPerfContext { [key: string]: number; } - export interface Measurements { + interface Measurements { exclusive: NumericPerfContext; inclusive: NumericPerfContext; render: NumericPerfContext; @@ -708,7 +718,7 @@ declare module React { totalTime: number; } - export interface Perf { + interface ReactPerf { start(): void; stop(): void; printInclusive(measurements: Measurements[]): void; @@ -718,34 +728,47 @@ declare module React { getLastMeasurements(): Measurements[]; } - export interface TestUtils { - Simulate: Simulate; - renderIntoDocument

(instance: ReactComponentElement

): ReactComponentElement

; - renderIntoDocument(instance: ReactHTMLElement): ReactHTMLElement; - renderIntoDocument(instance: ReactSVGElement): ReactSVGElement; - mockComponent(componentClass: ReactComponentFactory, mockTagName?: string): TestUtils; - isDescriptorOfType(descriptor: ReactElement, componentClass: ReactComponentFactory): boolean; - isDOMComponent(instance: ReactElement): boolean; - isCompositeComponent(instance: ReactElement): boolean; - isCompositeComponentWithType(instance: ReactElement, componentClass: ReactComponentFactory): boolean; - isTextComponent(instance: ReactElement): boolean; - findAllInRenderedTree(tree: ReactElement, test: (component: ReactElement) => boolean): ReactElement[]; - scryRenderedDOMComponentsWithClass(tree: ReactElement, className: string): ReactElement[]; - findRenderedDOMComponentWithClass(tree: ReactElement, className: string): ReactElement; - scryRenderedDOMComponentsWithTag(tree: ReactElement, tagName: string): ReactElement[]; - findRenderedDOMComponentWithTag(tree: ReactElement, tagName: string): ReactElement; - scryRenderedComponentsWithTag(tree: ReactElement, componentClass: Function): ReactElement[]; - findRenderedComponentWithType

(tree: ReactElement, componentClass: ReactComponentFactory

): Component; - scryRenderedComponentsWithType

(tree: ReactElement, componentClass: ReactComponentFactory

): Component[]; + // + // React.addons.TestUtils + // ---------------------------------------------------------------------- + + interface MockedComponent { + render: { + mockImplementation(impl: () => any): void; + }; } - export interface SyntheticEventData { + // Alias for ReactTestUtils + interface Instance

extends React.ReactInstance

{} + + interface ReactTestUtils { + Simulate: Simulate; + + renderIntoDocument

(element: React.ReactElement

): Instance

; + mockComponent(mocked: MockedComponent, mockTagName?: string): ReactTestUtils; + isElementOfType(element: React.ReactElement, type: any/*ReactType*/): boolean; + isDOMComponent(instance: Instance): boolean; + isCompositeComponent(instance: Instance): boolean; + isCompositeComponentWithType(instance: Instance, type: React.ReactClass): boolean; + isTextComponent(instance: Instance): boolean; + findAllInRenderedTree(tree: Instance, fn: (i: Instance) => boolean): Instance; + scryRenderedDOMComponentsWithClass(tree: Instance, className: string): Instance[]; + findRenderedDOMComponentWithClass(tree: Instance, className: string): Instance; + scryRenderedDOMComponentsWithTag(tree: Instance, tagName: string): Instance[]; + findRenderedDOMComponentWithTag(tree: Instance, tagName: string): Instance; + scryRenderedComponentsWithType( + tree: Instance, type: React.ReactClass

): React.ComponentInstance[]; + findRenderedComponentWithType( + tree: Instance, type: React.ReactClass

): React.ComponentInstance; + } + + interface SyntheticEventData { altKey?: boolean; button?: number; buttons?: number; clientX?: number; clientY?: number; - changedTouches?: TouchList; + changedTouches?: Browser.TouchList; charCode?: boolean; clipboardData?: DataTransfer; ctrlKey?: boolean; @@ -767,18 +790,18 @@ declare module React { screenX?: number; screenY?: number; shiftKey?: boolean; - targetTouches?: TouchList; - touches?: TouchList; - view?: AbstractView; + targetTouches?: Browser.TouchList; + touches?: Browser.TouchList; + view?: Browser.AbstractView; which?: number; } - export interface EventSimulator { + interface EventSimulator { (element: Element, eventData?: SyntheticEventData): void; - (descriptor: ReactElement, eventData?: SyntheticEventData): void; + (descriptor: Instance, eventData?: SyntheticEventData): void; } - export interface Simulate { + interface Simulate { blur: EventSimulator; change: EventSimulator; click: EventSimulator; @@ -814,10 +837,51 @@ declare module React { wheel: EventSimulator; } - export interface TransitionGroup extends ReactComponentFactory {} + // + // react Exports + // ---------------------------------------------------------------------- - export interface Update { - (object: Object, changes: Object): Object + interface Exports extends TopLevelAPI { + DOM: ReactDOM; + PropTypes: ReactPropTypes; + Children: ReactChildren; } -} \ No newline at end of file + // + // react/addons Exports + // ---------------------------------------------------------------------- + + interface AddonsExports extends Exports { + addons: { + CSSTransitionGroup: CSSTransitionGroup; + LinkedStateMixin: LinkedStateMixin; + PureRenderMixin: PureRenderMixin; + TransitionGroup: TransitionGroup; + + batchedUpdates(callback: (a: A, b: B) => void, a: A, b: B): void; + batchedUpdates(callback: (a: A) => void, a: A): void; + batchedUpdates(callback: () => void): void; + + classSet(cx: { [key: string]: boolean }): string; + cloneWithProps

(element: React.ReactElement

, props: P): React.ReactElement

; + + update(value: any[], spec: UpdateArraySpec): any[]; + update(value: {}, spec: UpdateSpec): any; + + // Development tools + Perf: ReactPerf; + TestUtils: ReactTestUtils; + }; + } +} + +declare module "react" { + var exports: React.Exports; + export = exports; +} + +declare module "react/addons" { + var exports: React.AddonsExports; + export = exports; +} + From 7f4cdee62819f02b85cdf9cdc4279aeed0fe1ef4 Mon Sep 17 00:00:00 2001 From: Vincent Siao Date: Tue, 2 Dec 2014 18:11:15 -0800 Subject: [PATCH 11/72] ReactClass -> ComponentClass; add tests to react-tests.ts --- react/react-addons-tests.ts | 12 +- react/react-tests.ts | 198 +++++++++++++++------- react/react.d.ts | 317 ++++++++++++++++++------------------ 3 files changed, 308 insertions(+), 219 deletions(-) diff --git a/react/react-addons-tests.ts b/react/react-addons-tests.ts index d89c383bf..1de8255f1 100644 --- a/react/react-addons-tests.ts +++ b/react/react-addons-tests.ts @@ -8,18 +8,26 @@ React.addons.TestUtils.Simulate.click(node); React.addons.TestUtils.Simulate.change(node); React.addons.TestUtils.Simulate.keyDown(node, {key: "Enter"}); +interface GreetingProps { + name: string; +} +interface GreetingState { + morning: boolean; +} +interface GreetingInstance extends React.ComponentInstance { +} var Greeting = React.createClass({displayName: 'Greeting', getInitialState: function() { return {morning: true}; }, render: function() { - var me = >this; + var me = this; return React.DOM.div(null, (me.state.morning ? "Hello" : "Goodbye "), me.props.name); } }); var root = React.addons.TestUtils.renderIntoDocument(React.createElement(Greeting, {name: "John"})); -var greeting = React.addons.TestUtils.findRenderedComponentWithType(root, Greeting); +var greeting = React.addons.TestUtils.findRenderedComponentWithType(root, Greeting); greeting.setState({ morning: false }); diff --git a/react/react-tests.ts b/react/react-tests.ts index 5d1743cbb..fb0d6eebc 100644 --- a/react/react-tests.ts +++ b/react/react-tests.ts @@ -1,64 +1,152 @@ /// import React = require("react"); +interface Props { + hello: string; + world?: string; + foo: number; + bar: boolean; +} + +interface State { + inputValue?: string; + seconds?: number; +} + +interface MyComponentInstance extends React.ComponentInstance { + reset(): void; +} + +var props: Props = { + hello: "world", + foo: 42, + bar: true +}; + +var container: Element; +var INPUT_REF: string = "input"; + +// +// Top-Level API +// -------------------------------------------------------------------------- + +var reactClass: React.ComponentClass = React.createClass({ + getDefaultProps: () => { + return { + hello: undefined, + world: "peace", + foo: undefined, + bar: undefined + }; + }, + getInitialState: () => { + return { + inputValue: "React.js", + seconds: 0 + }; + }, + reset: () => { + this.replaceState(this.getInitialState()); + }, + render: () => { + return React.DOM.div(null, + React.DOM.input({ + ref: INPUT_REF, + value: this.state.inputValue + })); + } +}); + +var reactElement: React.ReactElement = + React.createElement(reactClass, props); + +var reactFactory: React.Factory = + React.createFactory(reactClass); + +var reactInstance: React.Instance = + React.render(reactElement, container); + +var unmounted: boolean = React.unmountComponentAtNode(container); +var str: string = React.renderToString(reactElement); +var markup: string = React.renderToStaticMarkup(reactElement); +var notValid: boolean = React.isValidElement(props); // false +var isValid = React.isValidElement(reactElement); // true +React.initializeTouchEvents(true); + +// +// React Elements +// -------------------------------------------------------------------------- + +var type = reactElement.type; +var elementProps: Props = reactElement.props; +var key = reactElement.key; +var ref: string = reactElement.ref; +var factoryElement: React.ReactElement = reactFactory(elementProps); + +// +// React Components +// -------------------------------------------------------------------------- + +var displayName: string = reactClass.displayName; +var defaultProps: Props = reactClass.getDefaultProps(); +var propTypes: React.ValidationMap = reactClass.propTypes; + +// +// Component API +// -------------------------------------------------------------------------- + +var htmlElement: Element = reactInstance.getDOMNode(); +var divElement: HTMLDivElement = reactInstance.getDOMNode(); +var isMounted: boolean = reactInstance.isMounted(); +reactInstance.setProps(elementProps); +reactInstance.replaceProps(props); + +var componentInstance: React.ComponentInstance = + >reactInstance; +var initialState: State = componentInstance.state; +componentInstance.setState({ inputValue: "!!!" }); +componentInstance.replaceState({ inputValue: "???", seconds: 60 }); +componentInstance.forceUpdate(); + +var inputRef: React.Instance = + componentInstance.refs[INPUT_REF]; +var value: string = inputRef.getDOMNode().value; + +var myComponentInstance = componentInstance; +myComponentInstance.reset(); + +// +// PropTypes +// -------------------------------------------------------------------------- + var PropTypesSpecification: React.ComponentSpec = { propTypes: { - // You can declare that a prop is a specific JS primitive. By default, these - // are all optional. optionalArray: React.PropTypes.array, optionalBool: React.PropTypes.bool, optionalFunc: React.PropTypes.func, optionalNumber: React.PropTypes.number, optionalObject: React.PropTypes.object, optionalString: React.PropTypes.string, - - // Anything that can be rendered: numbers, strings, components or an array - // containing these types. optionalNode: React.PropTypes.node, - - // A React element optionalElement: React.PropTypes.element, - - // You can also declare that a prop is an instance of a class. This uses - // JS's instanceof operator. optionalMessage: React.PropTypes.instanceOf(Date), - - // You can ensure that your prop is limited to specific values by treating - // it as an enum. - optionalEnum: React.PropTypes.oneOf(['News', 'Photos']), - - // An object that could be one of many types + optionalEnum: React.PropTypes.oneOf(["News", "Photos"]), optionalUnion: React.PropTypes.oneOfType([ React.PropTypes.string, React.PropTypes.number, React.PropTypes.instanceOf(Date) ]), - - // An array of a certain type optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number), - - // An object with property values of a certain type optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number), - - // An object taking on a particular shape optionalObjectWithShape: React.PropTypes.shape({ color: React.PropTypes.string, fontSize: React.PropTypes.number }), - - // You can chain any of the above with `isRequired` to make sure a warning - // is shown if the prop isn't provided. requiredFunc: React.PropTypes.func.isRequired, - - // A value of any data type requiredAny: React.PropTypes.any.isRequired, - - // You can also specify a custom validator. It should return an Error - // object if the validation fails. Don't `console.warn` or throw, as this - // won't work inside `oneOfType`. customProp: function(props: any, propName: string, componentName: string) { if (!/matchme/.test(props[propName])) { - return new Error('Validation failed!'); + return new Error("Validation failed!"); } return null; } @@ -68,47 +156,41 @@ var PropTypesSpecification: React.ComponentSpec = { } }; -React.createClass(PropTypesSpecification); +// +// Example from http://facebook.github.io/react/ +// -------------------------------------------------------------------------- -var mountNode: Element; - -interface HelloMessageProps { - name: string; +interface TimerState { + secondsElapsed: number; } - -var HelloMessage = React.createClass({ - displayName: 'HelloMessage', - render: function() { - return React.DOM.div(null, "Hello ", (>this).props.name); - } -}); - -var HelloMessageFactory = React.createFactory(HelloMessage) -React.render(HelloMessageFactory({ name: "John" }), mountNode) - -var Timer = React.createClass({displayName: 'Timer', - getInitialState: function() { - return {secondsElapsed: 0}; +interface TimerInstance extends React.ComponentInstance<{}, TimerState> { +} +var Timer = React.createClass({ + displayName: "Timer", + getInitialState: () => { + return { secondsElapsed: 0 }; }, - tick: function() { - var me = >this; + tick: () => { + var me = this; me.setState({ secondsElapsed: me.state.secondsElapsed + 1 }); }, - componentDidMount: function() { + componentDidMount: () => { this.interval = setInterval(this.tick, 1000); }, - componentWillUnmount: function() { + componentWillUnmount: () => { clearInterval(this.interval); }, - render: function() { + render: () => { + var me = this; return React.DOM.div( null, "Seconds Elapsed: ", - (>this).state.secondsElapsed + me.state.secondsElapsed ); } }); - +var mountNode: Element; React.render(React.createElement(Timer, null), mountNode); + diff --git a/react/react.d.ts b/react/react.d.ts index 8a8589203..2d17c2223 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -37,7 +37,7 @@ declare module React { // React Elements // ---------------------------------------------------------------------- - // type ReactType = ReactClass | string; + // type ReactType = ComponentClass | string; interface ReactElement

{ type: any; // ReactType @@ -54,22 +54,21 @@ declare module React { // React Nodes // ---------------------------------------------------------------------- - // Typescript 1.4 (Union types, aliases) // type ReactText = string | number; - // type ReactFragment = ReactNode[]; - // type ReactNode = ReactElement | ReactFragment | ReactText; + // type Fragment = ReactNode[]; + // type ReactNode = ReactElement | Fragment | ReactText; // // React Components // ---------------------------------------------------------------------- - interface ReactStatics

{ + interface ComponentStatics

{ displayName?: string; getDefaultProps?(): P; - propTypes?: React.ValidationMap

; + propTypes?: ValidationMap

; } - interface ReactClass

extends ReactStatics

{ + interface ComponentClass

extends ComponentStatics

{ // Deprecated in 0.12. See http://fb.me/react-legacyfactory // new(props: P): ReactElement

; // (props: P): ReactElement

; @@ -83,19 +82,19 @@ declare module React { (props?: P, ...children: any/*ReactNode*/[]): ReactElement

; } - interface ComponentFactory

extends Factory

{} interface HTMLFactory extends Factory {} interface SVGFactory extends Factory {} + interface ComponentFactory

extends Factory

{} // // Top-Level API // ---------------------------------------------------------------------- interface TopLevelAPI { - createClass

(spec: ComponentSpec): ReactClass

; + createClass

(spec: ComponentSpec): ComponentClass

; createElement

(type: any/*ReactType*/, props: P, ...children: any/*ReactNode*/[]): ReactElement

; createFactory

(type: any/*ReactType*/): Factory

; - render

(element: ReactElement

, container: Element, callback?: () => void): ReactInstance

; + render

(element: ReactElement

, container: Element, callback?: () => void): Instance

; unmountComponentAtNode(container: Element): boolean; renderToString(element: ReactElement): string; renderToStaticMarkup(element: ReactElement): string; @@ -107,7 +106,7 @@ declare module React { // Component API // ---------------------------------------------------------------------- - interface ReactInstance

{ + interface Instance

{ // Use this overload to cast the returned element to a more specific type. // Eg: var name = this.refs['name'].getDOMNode().value; getDOMNode(): TElement; @@ -119,13 +118,13 @@ declare module React { replaceProps(nextProps: P, callback?: () => void): void; } - interface ComponentInstance extends ReactInstance

{ + interface ComponentInstance extends Instance

{ state: S; setState(nextState: S, callback?: () => void): void; replaceState(nextState: S, callback?: () => void): void; forceUpdate(callback?: () => void): void; refs: { - [key: string]: ReactInstance

+ [key: string]: Instance

}; } @@ -133,7 +132,7 @@ declare module React { // Component Specs and Lifecycle // ---------------------------------------------------------------------- - interface Mixin extends ReactStatics

{ + interface Mixin extends ComponentStatics

{ mixins?: Mixin; statics?: { [key: string]: any; @@ -407,7 +406,7 @@ declare module React { itemType?: string; // React-specific Attributes - dangerouslySetInnerHTML: { + dangerouslySetInnerHTML?: { __html: string }; } @@ -464,136 +463,136 @@ declare module React { interface ReactDOM { // HTML - a: React.HTMLFactory; - abbr: React.HTMLFactory; - address: React.HTMLFactory; - area: React.HTMLFactory; - article: React.HTMLFactory; - aside: React.HTMLFactory; - audio: React.HTMLFactory; - b: React.HTMLFactory; - base: React.HTMLFactory; - bdi: React.HTMLFactory; - bdo: React.HTMLFactory; - big: React.HTMLFactory; - blockquote: React.HTMLFactory; - body: React.HTMLFactory; - br: React.HTMLFactory; - button: React.HTMLFactory; - canvas: React.HTMLFactory; - caption: React.HTMLFactory; - cite: React.HTMLFactory; - code: React.HTMLFactory; - col: React.HTMLFactory; - colgroup: React.HTMLFactory; - data: React.HTMLFactory; - datalist: React.HTMLFactory; - dd: React.HTMLFactory; - del: React.HTMLFactory; - details: React.HTMLFactory; - dfn: React.HTMLFactory; - dialog: React.HTMLFactory; - div: React.HTMLFactory; - dl: React.HTMLFactory; - dt: React.HTMLFactory; - em: React.HTMLFactory; - embed: React.HTMLFactory; - fieldset: React.HTMLFactory; - figcaption: React.HTMLFactory; - figure: React.HTMLFactory; - footer: React.HTMLFactory; - form: React.HTMLFactory; - h1: React.HTMLFactory; - h2: React.HTMLFactory; - h3: React.HTMLFactory; - h4: React.HTMLFactory; - h5: React.HTMLFactory; - h6: React.HTMLFactory; - head: React.HTMLFactory; - header: React.HTMLFactory; - hr: React.HTMLFactory; - html: React.HTMLFactory; - i: React.HTMLFactory; - iframe: React.HTMLFactory; - img: React.HTMLFactory; - input: React.HTMLFactory; - ins: React.HTMLFactory; - kbd: React.HTMLFactory; - keygen: React.HTMLFactory; - label: React.HTMLFactory; - legend: React.HTMLFactory; - li: React.HTMLFactory; - link: React.HTMLFactory; - main: React.HTMLFactory; - map: React.HTMLFactory; - mark: React.HTMLFactory; - menu: React.HTMLFactory; - menuitem: React.HTMLFactory; - meta: React.HTMLFactory; - meter: React.HTMLFactory; - nav: React.HTMLFactory; - noscript: React.HTMLFactory; - object: React.HTMLFactory; - ol: React.HTMLFactory; - optgroup: React.HTMLFactory; - option: React.HTMLFactory; - output: React.HTMLFactory; - p: React.HTMLFactory; - param: React.HTMLFactory; - pre: React.HTMLFactory; - progress: React.HTMLFactory; - q: React.HTMLFactory; - rp: React.HTMLFactory; - rt: React.HTMLFactory; - ruby: React.HTMLFactory; - s: React.HTMLFactory; - samp: React.HTMLFactory; - script: React.HTMLFactory; - section: React.HTMLFactory; - select: React.HTMLFactory; - small: React.HTMLFactory; - source: React.HTMLFactory; - span: React.HTMLFactory; - strong: React.HTMLFactory; - style: React.HTMLFactory; - sub: React.HTMLFactory; - summary: React.HTMLFactory; - sup: React.HTMLFactory; - table: React.HTMLFactory; - tbody: React.HTMLFactory; - td: React.HTMLFactory; - textarea: React.HTMLFactory; - tfoot: React.HTMLFactory; - th: React.HTMLFactory; - thead: React.HTMLFactory; - time: React.HTMLFactory; - title: React.HTMLFactory; - tr: React.HTMLFactory; - track: React.HTMLFactory; - u: React.HTMLFactory; - ul: React.HTMLFactory; - "var": React.HTMLFactory; - video: React.HTMLFactory; - wbr: React.HTMLFactory; + a: HTMLFactory; + abbr: HTMLFactory; + address: HTMLFactory; + area: HTMLFactory; + article: HTMLFactory; + aside: HTMLFactory; + audio: HTMLFactory; + b: HTMLFactory; + base: HTMLFactory; + bdi: HTMLFactory; + bdo: HTMLFactory; + big: HTMLFactory; + blockquote: HTMLFactory; + body: HTMLFactory; + br: HTMLFactory; + button: HTMLFactory; + canvas: HTMLFactory; + caption: HTMLFactory; + cite: HTMLFactory; + code: HTMLFactory; + col: HTMLFactory; + colgroup: HTMLFactory; + data: HTMLFactory; + datalist: HTMLFactory; + dd: HTMLFactory; + del: HTMLFactory; + details: HTMLFactory; + dfn: HTMLFactory; + dialog: HTMLFactory; + div: HTMLFactory; + dl: HTMLFactory; + dt: HTMLFactory; + em: HTMLFactory; + embed: HTMLFactory; + fieldset: HTMLFactory; + figcaption: HTMLFactory; + figure: HTMLFactory; + footer: HTMLFactory; + form: HTMLFactory; + h1: HTMLFactory; + h2: HTMLFactory; + h3: HTMLFactory; + h4: HTMLFactory; + h5: HTMLFactory; + h6: HTMLFactory; + head: HTMLFactory; + header: HTMLFactory; + hr: HTMLFactory; + html: HTMLFactory; + i: HTMLFactory; + iframe: HTMLFactory; + img: HTMLFactory; + input: HTMLFactory; + ins: HTMLFactory; + kbd: HTMLFactory; + keygen: HTMLFactory; + label: HTMLFactory; + legend: HTMLFactory; + li: HTMLFactory; + link: HTMLFactory; + main: HTMLFactory; + map: HTMLFactory; + mark: HTMLFactory; + menu: HTMLFactory; + menuitem: HTMLFactory; + meta: HTMLFactory; + meter: HTMLFactory; + nav: HTMLFactory; + noscript: HTMLFactory; + object: HTMLFactory; + ol: HTMLFactory; + optgroup: HTMLFactory; + option: HTMLFactory; + output: HTMLFactory; + p: HTMLFactory; + param: HTMLFactory; + pre: HTMLFactory; + progress: HTMLFactory; + q: HTMLFactory; + rp: HTMLFactory; + rt: HTMLFactory; + ruby: HTMLFactory; + s: HTMLFactory; + samp: HTMLFactory; + script: HTMLFactory; + section: HTMLFactory; + select: HTMLFactory; + small: HTMLFactory; + source: HTMLFactory; + span: HTMLFactory; + strong: HTMLFactory; + style: HTMLFactory; + sub: HTMLFactory; + summary: HTMLFactory; + sup: HTMLFactory; + table: HTMLFactory; + tbody: HTMLFactory; + td: HTMLFactory; + textarea: HTMLFactory; + tfoot: HTMLFactory; + th: HTMLFactory; + thead: HTMLFactory; + time: HTMLFactory; + title: HTMLFactory; + tr: HTMLFactory; + track: HTMLFactory; + u: HTMLFactory; + ul: HTMLFactory; + "var": HTMLFactory; + video: HTMLFactory; + wbr: HTMLFactory; // SVG - circle: React.SVGFactory; - defs: React.SVGFactory; - ellipse: React.SVGFactory; - g: React.SVGFactory; - line: React.SVGFactory; - linearGradient: React.SVGFactory; - mask: React.SVGFactory; - path: React.SVGFactory; - pattern: React.SVGFactory; - polygon: React.SVGFactory; - polyline: React.SVGFactory; - radialGradient: React.SVGFactory; - rect: React.SVGFactory; - stop: React.SVGFactory; - svg: React.SVGFactory; - text: React.SVGFactory; - tspan: React.SVGFactory; + circle: SVGFactory; + defs: SVGFactory; + ellipse: SVGFactory; + g: SVGFactory; + line: SVGFactory; + linearGradient: SVGFactory; + mask: SVGFactory; + path: SVGFactory; + pattern: SVGFactory; + polygon: SVGFactory; + polyline: SVGFactory; + radialGradient: SVGFactory; + rect: SVGFactory; + stop: SVGFactory; + svg: SVGFactory; + text: SVGFactory; + tspan: SVGFactory; } // @@ -654,11 +653,11 @@ declare module React { interface TransitionGroupProps { component?: any; // ReactType - childFactory?: (child: React.ReactElement) => React.ReactElement; + childFactory?: (child: ReactElement) => ReactElement; } - interface CSSTransitionGroup extends React.ReactClass {} - interface TransitionGroup extends React.ReactClass {} + interface CSSTransitionGroup extends ComponentClass {} + interface TransitionGroup extends ComponentClass {} // // React.addons (Mixins) @@ -669,11 +668,11 @@ declare module React { requestChange(newValue: T): void; } - interface LinkedStateMixin extends React.Mixin { + interface LinkedStateMixin extends Mixin { linkState(key: string): ReactLink; } - interface PureRenderMixin extends React.Mixin { + interface PureRenderMixin extends Mixin { } // @@ -738,28 +737,28 @@ declare module React { }; } - // Alias for ReactTestUtils - interface Instance

extends React.ReactInstance

{} - interface ReactTestUtils { Simulate: Simulate; - renderIntoDocument

(element: React.ReactElement

): Instance

; + renderIntoDocument

(element: ReactElement

): Instance

; mockComponent(mocked: MockedComponent, mockTagName?: string): ReactTestUtils; - isElementOfType(element: React.ReactElement, type: any/*ReactType*/): boolean; + + isElementOfType(element: ReactElement, type: any/*ReactType*/): boolean; isDOMComponent(instance: Instance): boolean; isCompositeComponent(instance: Instance): boolean; - isCompositeComponentWithType(instance: Instance, type: React.ReactClass): boolean; + isCompositeComponentWithType(instance: Instance, type: ComponentClass): boolean; isTextComponent(instance: Instance): boolean; + findAllInRenderedTree(tree: Instance, fn: (i: Instance) => boolean): Instance; + scryRenderedDOMComponentsWithClass(tree: Instance, className: string): Instance[]; findRenderedDOMComponentWithClass(tree: Instance, className: string): Instance; + scryRenderedDOMComponentsWithTag(tree: Instance, tagName: string): Instance[]; findRenderedDOMComponentWithTag(tree: Instance, tagName: string): Instance; - scryRenderedComponentsWithType( - tree: Instance, type: React.ReactClass

): React.ComponentInstance[]; - findRenderedComponentWithType( - tree: Instance, type: React.ReactClass

): React.ComponentInstance; + + scryRenderedComponentsWithType

(tree: Instance, type: ComponentClass

): Instance

[]; + findRenderedComponentWithType

(tree: Instance, type: ComponentClass

): Instance

; } interface SyntheticEventData { @@ -863,7 +862,7 @@ declare module React { batchedUpdates(callback: () => void): void; classSet(cx: { [key: string]: boolean }): string; - cloneWithProps

(element: React.ReactElement

, props: P): React.ReactElement

; + cloneWithProps

(element: ReactElement

, props: P): ReactElement

; update(value: any[], spec: UpdateArraySpec): any[]; update(value: {}, spec: UpdateSpec): any; From 4c069d5d6e27d26497a090a8994dd84d728a5570 Mon Sep 17 00:00:00 2001 From: Vincent Siao Date: Tue, 2 Dec 2014 18:30:02 -0800 Subject: [PATCH 12/72] Fill out HTMLAttributes types --- react/react.d.ts | 102 +++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/react/react.d.ts b/react/react.d.ts index 2d17c2223..6173cab54 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -346,61 +346,61 @@ declare module React { httpEquiv?: string; icon?: string; id?: string; - label?: any; - lang?: any; - list?: any; - loop?: any; - max?: any; - maxLength?: any; - mediaGroup?: any; - method?: any; - min?: any; - multiple?: any; - muted?: any; - name?: any; - noValidate?: any; - open?: any; - pattern?: any; - placeholder?: any; - poster?: any; - preload?: any; - radioGroup?: any; - readOnly?: any; - rel?: any; - required?: any; - role?: any; - rows?: any; - rowSpan?: any; - sandbox?: any; - scope?: any; - scrollLeft?: any; - scrolling?: any; - scrollTop?: any; - seamless?: any; - selected?: any; - shape?: any; - size?: any; - span?: any; - spellCheck?: any; - src?: any; - srcDoc?: any; - srcSet?: any; - start?: any; - step?: any; - style?: any; - tabIndex?: any; - target?: any; - title?: any; - type?: any; - useMap?: any; - value?: any; - width?: any; - wmode?: any; + label?: string; + lang?: string; + list?: string; + loop?: boolean; + max?: any; // number | string + maxLength?: number; + mediaGroup?: string; + method?: string; + min?: any; // number | string + multiple?: boolean; + muted?: boolean; + name?: string; + noValidate?: boolean; + open?: boolean; + pattern?: string; + placeholder?: string; + poster?: string; + preload?: string; + radioGroup?: string; + readOnly?: boolean; + rel?: string; + required?: boolean; + role?: string; + rows?: number; + rowSpan?: number; + sandbox?: string; + scope?: string; + scrollLeft?: number; + scrolling?: string; + scrollTop?: number; + seamless?: boolean; + selected?: boolean; + shape?: string; + size?: number; + span?: number; + spellCheck?: boolean; + src?: string; + srcDoc?: string; + srcSet?: string; + start?: number; + step?: any; // number | string + style?: string; + tabIndex?: number; + target?: string; + title?: string; + type?: string; + useMap?: string; + value?: string; + width?: any; // number | string + wmode?: string; // Non-standard Attributes autoCapitalize?: boolean; autoCorrect?: boolean; - property?: any; + property?: string; itemProp?: string; itemScope?: boolean; itemType?: string; From 5c4c344b1e0de6859888b25f0c0e57d4e1b20752 Mon Sep 17 00:00:00 2001 From: Vincent Siao Date: Tue, 2 Dec 2014 18:51:27 -0800 Subject: [PATCH 13/72] Fill out React.SVGAttributes types --- react/react.d.ts | 86 ++++++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/react/react.d.ts b/react/react.d.ts index 6173cab54..3842c54e7 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -412,49 +412,49 @@ declare module React { } interface SVGAttributes extends ReactAttributes { - cx?: any; - cy?: any; - d?: any; - dx?: any; - dy?: any; - fill?: any; - fillOpacity?: any; - fontFamily?: any; - fontSize?: any; - fx?: any; - fy?: any; - gradientTransform?: any; - gradientUnits?: any; - markerEnd?: any; - markerMid?: any; - markerStart?: any; - offset?: any; - opacity?: any; - patternContentUnits?: any; - patternUnits?: any; - points?: any; - preserveAspectRatio?: any; - r?: any; - rx?: any; - ry?: any; - spreadMethod?: any; - stopColor?: any; - stopOpacity?: any; - stroke?: any; - strokeDasharray?: any; - strokeLinecap?: any; - strokeOpacity?: any; - strokeWidth?: any; - textAnchor?: any; - transform?: any; - version?: any; - viewBox?: any; - x1?: any; - x2?: any; - x?: any; - y1?: any; - y2?: any; - y?: any; + cx?: any; // SVGLength | SVGAnimatedLength + cy?: any; + d?: string; + dx?: any; // SVGLength | SVGAnimatedLength + dy?: any; // SVGLength | SVGAnimatedLength + fill?: any; // SVGPaint | string + fillOpacity?: any; // number | string + fontFamily?: string; + fontSize?: any; // number | string + fx?: any; // SVGLength | SVGAnimatedLength + fy?: any; // SVGLength | SVGAnimatedLength + gradientTransform?: any; // SVGTransformList | SVGAnimatedTransformList + gradientUnits?: string; + markerEnd?: string; + markerMid?: string; + markerStart?: string; + offset?: any; // number | string + opacity?: any; // number | string + patternContentUnits?: string; + patternUnits?: string; + points?: string; + preserveAspectRatio?: string; + r?: any; // SVGLength | SVGAnimatedLength + rx?: any; // SVGLength | SVGAnimatedLength + ry?: any; // SVGLength | SVGAnimatedLength + spreadMethod?: string; + stopColor?: any; // SVGColor | string + stopOpacity?: any; // number | string + stroke?: any; // SVGPaint + strokeDasharray?: string; + strokeLinecap?: string; + strokeOpacity?: any; // number | string + strokeWidth?: any; // SVGLength | SVGAnimatedLength + textAnchor?: string; + transform?: any; // SVGTransformList | SVGAnimatedTransformList + version?: string; + viewBox?: string; + x1?: any; // SVGLength | SVGAnimatedLength + x2?: any; // SVGLength | SVGAnimatedLength + x?: any; // SVGLength | SVGAnimatedLength + y1?: any; // SVGLength | SVGAnimatedLength + y2?: any; // SVGLength | SVGAnimatedLength + y?: any; // SVGLength | SVGAnimatedLength } // From db0333df599cf6483cd854ab4504e85db67ab0fe Mon Sep 17 00:00:00 2001 From: Vincent Siao Date: Tue, 2 Dec 2014 19:18:58 -0800 Subject: [PATCH 14/72] React.Instance

-> React.ElementInstance

--- react/react-tests.ts | 4 ++-- react/react.d.ts | 34 +++++++++++++++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/react/react-tests.ts b/react/react-tests.ts index fb0d6eebc..0ca0e9f7b 100644 --- a/react/react-tests.ts +++ b/react/react-tests.ts @@ -63,7 +63,7 @@ var reactElement: React.ReactElement = var reactFactory: React.Factory = React.createFactory(reactClass); -var reactInstance: React.Instance = +var reactInstance: React.ElementInstance = React.render(reactElement, container); var unmounted: boolean = React.unmountComponentAtNode(container); @@ -108,7 +108,7 @@ componentInstance.setState({ inputValue: "!!!" }); componentInstance.replaceState({ inputValue: "???", seconds: 60 }); componentInstance.forceUpdate(); -var inputRef: React.Instance = +var inputRef: React.ElementInstance = componentInstance.refs[INPUT_REF]; var value: string = inputRef.getDOMNode().value; diff --git a/react/react.d.ts b/react/react.d.ts index 3842c54e7..3eaa868fe 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -94,7 +94,7 @@ declare module React { createClass

(spec: ComponentSpec): ComponentClass

; createElement

(type: any/*ReactType*/, props: P, ...children: any/*ReactNode*/[]): ReactElement

; createFactory

(type: any/*ReactType*/): Factory

; - render

(element: ReactElement

, container: Element, callback?: () => void): Instance

; + render

(element: ReactElement

, container: Element, callback?: () => void): ElementInstance

; unmountComponentAtNode(container: Element): boolean; renderToString(element: ReactElement): string; renderToStaticMarkup(element: ReactElement): string; @@ -106,7 +106,7 @@ declare module React { // Component API // ---------------------------------------------------------------------- - interface Instance

{ + interface ElementInstance

{ // Use this overload to cast the returned element to a more specific type. // Eg: var name = this.refs['name'].getDOMNode().value; getDOMNode(): TElement; @@ -118,13 +118,13 @@ declare module React { replaceProps(nextProps: P, callback?: () => void): void; } - interface ComponentInstance extends Instance

{ + interface ComponentInstance extends ElementInstance

{ state: S; setState(nextState: S, callback?: () => void): void; replaceState(nextState: S, callback?: () => void): void; forceUpdate(callback?: () => void): void; refs: { - [key: string]: Instance

+ [key: string]: ElementInstance

}; } @@ -740,25 +740,25 @@ declare module React { interface ReactTestUtils { Simulate: Simulate; - renderIntoDocument

(element: ReactElement

): Instance

; + renderIntoDocument

(element: ReactElement

): ElementInstance

; mockComponent(mocked: MockedComponent, mockTagName?: string): ReactTestUtils; isElementOfType(element: ReactElement, type: any/*ReactType*/): boolean; - isDOMComponent(instance: Instance): boolean; - isCompositeComponent(instance: Instance): boolean; - isCompositeComponentWithType(instance: Instance, type: ComponentClass): boolean; - isTextComponent(instance: Instance): boolean; + isDOMComponent(instance: ElementInstance): boolean; + isCompositeComponent(instance: ElementInstance): boolean; + isCompositeComponentWithType(instance: ElementInstance, type: ComponentClass): boolean; + isTextComponent(instance: ElementInstance): boolean; - findAllInRenderedTree(tree: Instance, fn: (i: Instance) => boolean): Instance; + findAllInRenderedTree(tree: ElementInstance, fn: (i: ElementInstance) => boolean): ElementInstance; - scryRenderedDOMComponentsWithClass(tree: Instance, className: string): Instance[]; - findRenderedDOMComponentWithClass(tree: Instance, className: string): Instance; + scryRenderedDOMComponentsWithClass(tree: ElementInstance, className: string): ElementInstance[]; + findRenderedDOMComponentWithClass(tree: ElementInstance, className: string): ElementInstance; - scryRenderedDOMComponentsWithTag(tree: Instance, tagName: string): Instance[]; - findRenderedDOMComponentWithTag(tree: Instance, tagName: string): Instance; + scryRenderedDOMComponentsWithTag(tree: ElementInstance, tagName: string): ElementInstance[]; + findRenderedDOMComponentWithTag(tree: ElementInstance, tagName: string): ElementInstance; - scryRenderedComponentsWithType

(tree: Instance, type: ComponentClass

): Instance

[]; - findRenderedComponentWithType

(tree: Instance, type: ComponentClass

): Instance

; + scryRenderedComponentsWithType

(tree: ElementInstance, type: ComponentClass

): ElementInstance

[]; + findRenderedComponentWithType

(tree: ElementInstance, type: ComponentClass

): ElementInstance

; } interface SyntheticEventData { @@ -797,7 +797,7 @@ declare module React { interface EventSimulator { (element: Element, eventData?: SyntheticEventData): void; - (descriptor: Instance, eventData?: SyntheticEventData): void; + (descriptor: ElementInstance, eventData?: SyntheticEventData): void; } interface Simulate { From 01cfe48a46a3f8a7113cde9a8e62958f56beec76 Mon Sep 17 00:00:00 2001 From: Vincent Siao Date: Tue, 2 Dec 2014 19:43:17 -0800 Subject: [PATCH 15/72] Change React.createFactory to take React.ComponentClass

--- react/react.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/react/react.d.ts b/react/react.d.ts index 3eaa868fe..70608cf44 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -93,7 +93,7 @@ declare module React { interface TopLevelAPI { createClass

(spec: ComponentSpec): ComponentClass

; createElement

(type: any/*ReactType*/, props: P, ...children: any/*ReactNode*/[]): ReactElement

; - createFactory

(type: any/*ReactType*/): Factory

; + createFactory

(componentClass: ComponentClass

): Factory

; render

(element: ReactElement

, container: Element, callback?: () => void): ElementInstance

; unmountComponentAtNode(container: Element): boolean; renderToString(element: ReactElement): string; From cdc1fe2ad0f6b564c4dc95d71dbd94dc96ef5bf5 Mon Sep 17 00:00:00 2001 From: Vincent Siao Date: Tue, 2 Dec 2014 20:32:38 -0800 Subject: [PATCH 16/72] Fix React.ComponentInstance

.refs type and add some CSS properties --- react/react.d.ts | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/react/react.d.ts b/react/react.d.ts index 70608cf44..c90de5137 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -124,7 +124,7 @@ declare module React { replaceState(nextState: S, callback?: () => void): void; forceUpdate(callback?: () => void): void; refs: { - [key: string]: ElementInstance

+ [key: string]: ElementInstance }; } @@ -303,6 +303,28 @@ declare module React { onWheel?: WheelEventHandler; } + interface CSSProperties { + columnCount?: number; + flex?: number; + flexGrow?: number; + flexShrink?: number; + fontWeight?: number; + lineClamp?: number; + lineHeight?: number; + opacity?: number; + order?: number; + orphans?: number; + widows?: number; + zIndex?: number; + zoom?: number; + + // SVG-related properties + fillOpacity?: number; + strokeOpacity?: number; + + [key: string]: any; // number | string + } + interface HTMLAttributes extends ReactAttributes { accept?: string; accessKey?: string; @@ -387,7 +409,7 @@ declare module React { srcSet?: string; start?: number; step?: any; // number | string - style?: string; + style?: CSSProperties; tabIndex?: number; target?: string; title?: string; From f56398eb68c03985f6df0659dd7704ea6d75289b Mon Sep 17 00:00:00 2001 From: Toshiya Nakakura Date: Wed, 3 Dec 2014 13:34:08 +0900 Subject: [PATCH 17/72] update gamepad/gamepad.d.ts --- gamepad/gamepad-tests.ts | 6 +++--- gamepad/gamepad.d.ts | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/gamepad/gamepad-tests.ts b/gamepad/gamepad-tests.ts index 48b0f8e73..4b0cddcad 100644 --- a/gamepad/gamepad-tests.ts +++ b/gamepad/gamepad-tests.ts @@ -51,9 +51,9 @@ if(pad){ for (var k = 0; k < pad.buttons.length; k++) { - var button = pad.buttons[k]; - if(button !== 0){ - console.log('pad[' + pad.index + ']: ' + 'time=' + pad.timestamp + ' id="' + pad.id + '" button[' + k + '] = ' + button); + var button = pad.buttons[k]; + if(button.pressed){ + console.log('pad[' + pad.index + ']: ' + 'time=' + pad.timestamp + ' id="' + pad.id + '" button[' + k + '] = ' + button.value); } } for (var k = 0; k < pad.axes.length; k++) diff --git a/gamepad/gamepad.d.ts b/gamepad/gamepad.d.ts index f6af65a1a..69ef795fb 100644 --- a/gamepad/gamepad.d.ts +++ b/gamepad/gamepad.d.ts @@ -36,7 +36,7 @@ declare module Gamepad{ * Array of values for all buttons of the gamepad. All button values must be linearly normalized to the range [0.0 .. 1.0]. 0.0 must mean fully unpressed, and 1.0 must mean fully pressed. It is recommended that buttons appear in decreasing importance such that the primary button, secondary button, tertiary button, and so on appear as elements 0, 1, 2, ... in the buttons array. * @readonly */ - buttons:number[]; + buttons:GamepadButton[]; } /** @@ -55,7 +55,10 @@ declare module Gamepad{ length: number; } - + export interface GamepadButton{ + pressed: boolean; + value: number; + } /* * @event gamepadconnected From 9a9ff2ed081d5c6b579321c3aca3268c2e26cff5 Mon Sep 17 00:00:00 2001 From: Vincent Siao Date: Tue, 2 Dec 2014 21:59:46 -0800 Subject: [PATCH 18/72] Move Browser interfaces into React module --- react/react.d.ts | 73 ++++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/react/react.d.ts b/react/react.d.ts index c90de5137..5b19f032a 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -3,36 +3,7 @@ // Definitions by: Asana // Definitions: https://github.com/borisyankov/DefinitelyTyped -declare module Browser { - // Browser Interfaces - // Taken from https://github.com/nikeee/2048-typescript/blob/master/2048/js/touch.d.ts - - interface AbstractView { - styleMedia: StyleMedia; - document: Document; - } - - interface Touch { - identifier: number; - target: EventTarget; - screenX: number; - screenY: number; - clientX: number; - clientY: number; - pageX: number; - pageY: number; - } - - interface TouchList { - [index: number]: Touch; - length: number; - item(index: number): Touch; - identifiedTouch(identifier: number): Touch; - } -} - declare module React { - // // React Elements // ---------------------------------------------------------------------- @@ -219,18 +190,18 @@ declare module React { interface TouchEvent extends SyntheticEvent { altKey: boolean; - changedTouches: Browser.TouchList; + changedTouches: TouchList; ctrlKey: boolean; getModifierState(key: string): boolean; metaKey: boolean; shiftKey: boolean; - targetTouches: Browser.TouchList; - touches: Browser.TouchList; + targetTouches: TouchList; + touches: TouchList; } interface UIEvent extends SyntheticEvent { detail: number; - view: Browser.AbstractView; + view: AbstractView; } interface WheelEvent extends SyntheticEvent { @@ -789,7 +760,7 @@ declare module React { buttons?: number; clientX?: number; clientY?: number; - changedTouches?: Browser.TouchList; + changedTouches?: TouchList; charCode?: boolean; clipboardData?: DataTransfer; ctrlKey?: boolean; @@ -811,9 +782,9 @@ declare module React { screenX?: number; screenY?: number; shiftKey?: boolean; - targetTouches?: Browser.TouchList; - touches?: Browser.TouchList; - view?: Browser.AbstractView; + targetTouches?: TouchList; + touches?: TouchList; + view?: AbstractView; which?: number; } @@ -894,6 +865,34 @@ declare module React { TestUtils: ReactTestUtils; }; } + + // + // Browser Interfaces + // https://github.com/nikeee/2048-typescript/blob/master/2048/js/touch.d.ts + // ---------------------------------------------------------------------- + + interface AbstractView { + styleMedia: StyleMedia; + document: Document; + } + + interface Touch { + identifier: number; + target: EventTarget; + screenX: number; + screenY: number; + clientX: number; + clientY: number; + pageX: number; + pageY: number; + } + + interface TouchList { + [index: number]: Touch; + length: number; + item(index: number): Touch; + identifiedTouch(identifier: number): Touch; + } } declare module "react" { From 2b89a26bb0978ef4faa8b7eb75ba8abeb63471f0 Mon Sep 17 00:00:00 2001 From: Ben Ripkens Date: Wed, 3 Dec 2014 16:57:08 +0100 Subject: [PATCH 19/72] d3: Transition.call(...) defines wrong signature The D3 definition file contains an error in the signature of Transition.call(...). The callback will be passed the transition object and it supports optional arguments similar to Selection.call(...). --- d3/d3.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/d3/d3.d.ts b/d3/d3.d.ts index 2f439a76f..8ae0c6a7f 100644 --- a/d3/d3.d.ts +++ b/d3/d3.d.ts @@ -926,7 +926,7 @@ declare module D3 { (name: string, value: any, priority?: string): Transition; (name: string, valueFunction: (data: any, index: number) => any, priority?: string): Transition; }; - call(callback: (selection: Selection) => void ): Transition; + call(callback: (transition: Transition, ...args: any[]) => void, ...args: any[]): Transition; /** * Select an element from the current document */ From 09b31dbffbe57d523001496aa5e8f43b67db7862 Mon Sep 17 00:00:00 2001 From: Ben Ripkens Date: Wed, 3 Dec 2014 18:45:35 +0100 Subject: [PATCH 20/72] An axis can be applied to transitions This is documented in the D3 API documentation: https://github.com/mbostock/d3/wiki/SVG-Axes#_axis --- d3/d3.d.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/d3/d3.d.ts b/d3/d3.d.ts index 8ae0c6a7f..15b1375f3 100644 --- a/d3/d3.d.ts +++ b/d3/d3.d.ts @@ -1750,6 +1750,8 @@ declare module D3 { export interface Axis { (selection: Selection): void; + (transition: Transition.Transition): void; + scale: { (): any; (scale: any): Axis; From 3ea10396e60a1e26d32734a13f3e6d4d58debd91 Mon Sep 17 00:00:00 2001 From: Tim Vergenz Date: Wed, 3 Dec 2014 12:48:06 -0500 Subject: [PATCH 21/72] Add item types to Pickadate --- pickadate/pickadate-tests.ts | 30 +++++++ pickadate/pickadate.d.ts | 149 ++++++++++++++++++++++++++++++++++- 2 files changed, 176 insertions(+), 3 deletions(-) diff --git a/pickadate/pickadate-tests.ts b/pickadate/pickadate-tests.ts index 884dc5438..4700310b8 100644 --- a/pickadate/pickadate-tests.ts +++ b/pickadate/pickadate-tests.ts @@ -33,6 +33,34 @@ function testApiMethods(api: Pickadate.Api) { pickerRootElement.show(); } +function testDateApiMethods(api: Pickadate.DateApi) { + api.get('select'); + api.get('select', 'yyyy/mm/dd'); + api.get('highlight'); + api.get('highlight', 'yyyy/mm/dd'); + api.get('view'); + api.get('view', 'yyyy/mm/dd'); + api.get('min'); + api.get('min', 'yyyy/mm/dd'); + api.get('max'); + api.get('max', 'yyyy/mm/dd'); +} + +function testTimeApiMethods(api: Pickadate.TimeApi) { + api.get('select'); + api.get('select', 'hh:i'); + api.get('highlight'); + api.get('highlight', 'hh:i'); + api.get('view'); + api.get('view', 'hh:i'); + api.get('min'); + api.get('min', 'hh:i'); + api.get('max'); + api.get('max', 'hh:i'); +} + +// ==================================================================================================================== + var datePickerInput = $("input.date"); datePickerInput.pickadate(); @@ -159,6 +187,7 @@ datePickerInput.pickadate('$root').show(); datePickerInput.pickadate('_hidden').show(); testApiMethods(datePickerApi); +testDateApiMethods(datePickerApi); // ==================================================================================================================== @@ -246,4 +275,5 @@ timePickerInput.pickatime('$root').show(); timePickerInput.pickatime('_hidden').show(); testApiMethods(timePickerApi); +testTimeApiMethods(timePickerApi); diff --git a/pickadate/pickadate.d.ts b/pickadate/pickadate.d.ts index 6746039a0..1f96085f7 100644 --- a/pickadate/pickadate.d.ts +++ b/pickadate/pickadate.d.ts @@ -26,6 +26,40 @@ declare module Pickadate { */ get(field: string, format?: string): any; + /** + * Returns the string value of the picker’s input element. + */ + get(field: "value"): string; + + /** + * Returns a boolean value of whether the picker is open or not. + */ + get(field: "open"): boolean; + + /** + * Returns a boolean value of whether the picker has started or not. + */ + get(field: "start"): boolean; + + /** + * Returns a unique string that is the ID of the picker and it’s element. If the element has no ID, it is set to something random. + */ + get(field: "id"): string; + + /** + * "enable" and "disable" work together to determine which item objects to disable on the picker. + * + * "enable" returns 1 to represent a base enabled state, meaning that specific dates or times are disabled and all others are enabled; + * or -1 to indicate a base disabled state, meaning that specific dates or times are enabled and all others are disabled. + */ + get(field: "enable"): number; + + /** + * If "enable" is 1, returns the collection of dates or times to disable. If "enable" is -1, returns the collection of dates or + * times to *not* disable. + */ + get(field: "disable"): any; + /** * Unbind callbacks that are bound using the `on` method. * @param methodName one of [ "open, "close", "render", "start", "stop", "set" ] @@ -49,7 +83,7 @@ declare module Pickadate { /** * Refresh the picker after adding something to the holder. - * By default, only the “face” of the picker (i.e. the box element), has its contents re-rendered. + * By default, only the "face" of the picker (i.e. the box element), has its contents re-rendered. * * @param fromRoot whether to render the entire picker from the root up (default: false) */ @@ -100,6 +134,65 @@ declare module Pickadate { _hidden: JQuery; } + export interface DateApi extends Api { + get(field: string, format?: string): any; + + /** + * Returns the item object or formatted string of the date that is visually selected. + * Defaults to null when there’s no value. + */ + get(field: "select"): DateItem; + get(field: "select", format: string): string; + + /** + * Returns the item object or formatted string of the date that is visually highlighted. + * Defaults to "today" when there’s no value. + */ + get(field: "highlight"): DateItem; + get(field: "highlight", format: string): string; + + /** + * Returns the item object or formatted string of the date that determines the current view. + * Defaults to the first day of the current month when there’s no value. + */ + get(field: "view"): DateItem; + get(field: "view", format: string): string; + + /** + * Returns the item object or formatted string of the date that determines the lower limit. + * Defaults to a -Infinity item object when it is not explicitly set in the options or through the picker’s API. + */ + get(field: "min"): DateItem; + get(field: "min", format: string): string; + + /** + * Returns the item object or formatted string of the date that determines the upper limit. + * Defaults to an Infinity item object when it is not explicitly set in the options or through the picker’s API. + */ + get(field: "max"): DateItem; + get(field: "max", format: string): string; + } + + export interface DateItem { + // The full year. + year: number; + + // The month with zero-as-index. + month: number; + + // The date of the month. + date: number; + + // The day of the week with zero-as-index. + day: number; + + // The underlying JavaScript Date object. + obj: Date; + + // The "pick" value used for comparisons. + pick: number; + } + export interface DateOptions { // String and translations monthsFull?: string[]; @@ -214,6 +307,56 @@ declare module Pickadate { buttonToday?: string } + export interface TimeApi extends Api { + get(field: string, format?: string): any; + + /** + * Returns the item object or formatted string of the date that is visually selected. + * Defaults to null when there’s no value. + */ + get(field: "select"): TimeItem; + get(field: "select", format: string): string; + + /** + * Returns the item object or formatted string of the date that is visually highlighted. + * Defaults to "now" when there’s no value. + */ + get(field: "highlight"): TimeItem; + get(field: "highlight", format: string): string; + + /** + * Returns the item object or formatted string of the date that determines the current view. + * Defaults to "now" when there’s no value. + */ + get(field: "view"): TimeItem; + get(field: "view", format: string): string; + + /** + * Returns the item object or formatted string of the date that determines the lower limit. + * Defaults to a -Infinity item object when it is not explicitly set in the options or through the picker’s API. + */ + get(field: "min"): TimeItem; + get(field: "min", format: string): string; + + /** + * Returns the item object or formatted string of the date that determines the upper limit. + * Defaults to an Infinity item object when it is not explicitly set in the options or through the picker’s API. + */ + get(field: "max"): TimeItem; + get(field: "max", format: string): string; + } + + export interface TimeItem { + // Hour of the day from 0 to 23. + hour: number; + + // The minutes of the hour from 0 to 59 (based on the interval). + mins: number; + + // The "pick" value used for comparisons. + pick: number; + } + export interface TimeOptions { // Translations and clear button clear?: string; @@ -291,7 +434,7 @@ interface JQuery { /** * Access the API object after initialization. */ - pickadate(keyword: "picker"): Pickadate.Api; + pickadate(keyword: "picker"): Pickadate.DateApi; pickadate(objectName: "$node"): JQuery; pickadate(objectName: "$root"): JQuery; pickadate(objectName: "_hidden"): JQuery; @@ -310,7 +453,7 @@ interface JQuery { pickadate(options?: Pickadate.DateOptions): JQuery; - pickatime(keyword: "picker"): Pickadate.Api; + pickatime(keyword: "picker"): Pickadate.TimeApi; pickatime(objectName: "$node"): JQuery; pickatime(objectName: "$root"): JQuery; pickatime(objectName: "_hidden"): JQuery; From b4de4226784d5f9ae48d5c78515f8499d11a507c Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Thu, 4 Dec 2014 08:40:44 +1300 Subject: [PATCH 22/72] Add exception type filter using any --- when/when.d.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/when/when.d.ts b/when/when.d.ts index 3b7d114f7..ca2400fc5 100644 --- a/when/when.d.ts +++ b/when/when.d.ts @@ -56,6 +56,11 @@ declare module When { } interface Promise { + // Make sure you test any usage of these overloads, exceptionType must + // be a constructor with prototype set to an instance of Error. + catch(exceptionType: any, onRejected?: (reason: any) => Promise): Promise; + catch(exceptionType: any, onRejected?: (reason: any) => U): Promise; + catch(filter: (reason: any) => Boolean, onRejected?: (reason: any) => Promise): Promise; catch(filter: (reason: any) => Boolean, onRejected?: (reason: any) => U): Promise; From efb0ee0e4f38e7b45c370a57ef0dc6ab71274918 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Thu, 4 Dec 2014 08:42:11 +1300 Subject: [PATCH 23/72] Change Boolean to boolean --- when/when.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/when/when.d.ts b/when/when.d.ts index ca2400fc5..60d569a17 100644 --- a/when/when.d.ts +++ b/when/when.d.ts @@ -61,8 +61,8 @@ declare module When { catch(exceptionType: any, onRejected?: (reason: any) => Promise): Promise; catch(exceptionType: any, onRejected?: (reason: any) => U): Promise; - catch(filter: (reason: any) => Boolean, onRejected?: (reason: any) => Promise): Promise; - catch(filter: (reason: any) => Boolean, onRejected?: (reason: any) => U): Promise; + catch(filter: (reason: any) => boolean, onRejected?: (reason: any) => Promise): Promise; + catch(filter: (reason: any) => boolean, onRejected?: (reason: any) => U): Promise; catch(onRejected?: (reason: any) => Promise): Promise; catch(onRejected?: (reason: any) => U): Promise; From 26dca076860b1ae0feeaca25da7029387f4423ac Mon Sep 17 00:00:00 2001 From: Adi Dahiya Date: Wed, 3 Dec 2014 16:13:32 -0500 Subject: [PATCH 24/72] Add selectize typings --- selectize/selectize-tests.ts | 389 +++++++++++++++++++++++ selectize/selectize.d.ts | 600 +++++++++++++++++++++++++++++++++++ 2 files changed, 989 insertions(+) create mode 100644 selectize/selectize-tests.ts create mode 100644 selectize/selectize.d.ts diff --git a/selectize/selectize-tests.ts b/selectize/selectize-tests.ts new file mode 100644 index 000000000..5c75f52a4 --- /dev/null +++ b/selectize/selectize-tests.ts @@ -0,0 +1,389 @@ +/// +/// + +// All code examples taken from https://github.com/brianreavis/selectize.js/blob/master/examples + +// API example +// -------------------------------------------------------------------------------------------------------------------- + +var $select = $('#select-tools').selectize({ + maxItems: null, + valueField: 'id', + labelField: 'title', + searchField: 'title', + options: [ + {id: 1, title: 'Spectrometer', url: 'http://en.wikipedia.org/wiki/Spectrometers'}, + {id: 2, title: 'Star Chart', url: 'http://en.wikipedia.org/wiki/Star_chart'}, + {id: 3, title: 'Electrical Tape', url: 'http://en.wikipedia.org/wiki/Electrical_tape'} + ], + create: false +}); + +var control = $select[0].selectize; + +$('#button-clear').on('click', function() { + control.clear(); +}); +$('#button-clearoptions').on('click', function() { + control.clearOptions(); +}); +$('#button-addoption').on('click', function() { + control.addOption({ + id: 4, + title: 'Something New', + url: 'http://google.com' + }); +}); +$('#button-additem').on('click', function() { + control.addItem(2); +}); +$('#button-setvalue').on('click', function() { + control.setValue([2, 3]); +}); + + +// Cities example +// -------------------------------------------------------------------------------------------------------------------- + +var xhr: XMLHttpRequest; +var select_state: Selectize.IApi; +var select_city: Selectize.IApi; +var $select_state: JQuery; +var $select_city: JQuery; + +$select_state = $('#select-state').selectize({ + onChange: function(value) { + if (!value.length) return; + select_city.disable(); + select_city.clearOptions(); + select_city.load(function(callback) { + xhr && xhr.abort(); + xhr = $.ajax({ + url: 'http://www.corsproxy.com/api.sba.gov/geodata/primary_city_links_for_state_of/' + value + '.json', + success: function(results) { + select_city.enable(); + callback(results); + }, + error: function() { + callback(); + } + }) + }); + } +}); + +$select_city = $('#select-city').selectize({ + valueField: 'name', + labelField: 'name', + searchField: ['name'] +}); + +select_city = $select_city[0].selectize; +select_state = $select_state[0].selectize; +select_city.disable(); + + +// Confirm example +// -------------------------------------------------------------------------------------------------------------------- + +$('#input-tags').selectize({ + delimiter: ',', + persist: false, + onDelete: function(values) { + return confirm(values.length > 1 ? 'Are you sure you want to remove these ' + values.length + ' items?' : 'Are you sure you want to remove "' + values[0] + '"?'); + } +}); + + +// Contacts example +// -------------------------------------------------------------------------------------------------------------------- + +var REGEX_EMAIL = '([a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*@' + + '(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)'; +var formatName = function(item) { + return $.trim((item.first_name || '') + ' ' + (item.last_name || '')); +}; + +$('#select-to').selectize({ + persist: false, + maxItems: null, + valueField: 'email', + labelField: 'name', + searchField: ['first_name', 'last_name', 'email'], + sortField: [ + {field: 'first_name', direction: 'asc'}, + {field: 'last_name', direction: 'asc'} + ], + options: [ + {email: 'nikola@tesla.com', first_name: 'Nikola', last_name: 'Tesla'}, + {email: 'brian@thirdroute.com', first_name: 'Brian', last_name: 'Reavis'}, + {email: 'someone@gmail.com'} + ], + render: { + item: function(item, escape) { + var name = formatName(item); + return '

'; + }, + option: function(item, escape) { + var name = formatName(item); + var label = name || item.email; + var caption = name ? item.email : null; + return '
' + + '' + escape(label) + '' + + (caption ? '' + escape(caption) + '' : '') + + '
'; + } + }, + createFilter: function(input) { + var regexpA = new RegExp('^' + REGEX_EMAIL + '$', 'i'); + var regexpB = new RegExp('^([^<]*)\<' + REGEX_EMAIL + '\>$', 'i'); + return regexpA.test(input) || regexpB.test(input); + }, + create: function(input): any { + if ((new RegExp('^' + REGEX_EMAIL + '$', 'i')).test(input)) { + return {email: input}; + } + var match = input.match(new RegExp('^([^<]*)\<' + REGEX_EMAIL + '\>$', 'i')); + if (match) { + var name = $.trim(match[1]); + var pos_space = name.indexOf(' '); + var first_name = name.substring(0, pos_space); + var last_name = name.substring(pos_space + 1); + return { + email: match[2], + first_name: first_name, + last_name: last_name + }; + } + alert('Invalid email address.'); + return false; + } +}); + + +// Create filter example +// -------------------------------------------------------------------------------------------------------------------- + +$('#select-words-regex').selectize({ + create: true, + createFilter: $('#regex').val() +}); +$('#select-words-length').selectize({ + create: true, + createFilter: function(input) { return input.length >= parseInt($('#length').val(), 10); } +}); +var unique: Selectize.IApi = $('#select-words-unique').selectize({ + create: true, + createFilter: function(input) { + input = input.toLowerCase(); + return $.grep( unique.getValue(), function(value) { + return value.toLowerCase() === input; + }).length == 0; + } +})[0].selectize; + + +// Customization example +// -------------------------------------------------------------------------------------------------------------------- + +$('#select-links').selectize({ + theme: 'links', + maxItems: null, + valueField: 'id', + searchField: 'title', + options: [ + {id: 1, title: 'DIY', url: 'https://diy.org'}, + {id: 2, title: 'Google', url: 'http://google.com'}, + {id: 3, title: 'Yahoo', url: 'http://yahoo.com'}, + ], + render: { + option: function(data, escape) { + return '
' + + '' + escape(data.title) + '' + + '' + escape(data.url) + '' + + '
'; + }, + item: function(data, escape) { + return '
'; + } + }, + create: function(input) { + return { + id: 0, + title: input, + url: '#' + }; + } +}); + + +// Events +// -------------------------------------------------------------------------------------------------------------------- + +var eventHandler = function(name) { + return function() { + console.log(name, arguments); + $('#log').append('
' + name + '
'); + }; +}; +var $select = $('#select-state').selectize({ + create : true, + onChange : eventHandler('onChange'), + onItemAdd : eventHandler('onItemAdd'), + onItemRemove : eventHandler('onItemRemove'), + onOptionAdd : eventHandler('onOptionAdd'), + onOptionRemove : eventHandler('onOptionRemove'), + onDropdownOpen : eventHandler('onDropdownOpen'), + onDropdownClose : eventHandler('onDropdownClose'), + onInitialize : eventHandler('onInitialize'), +}); + + +// Github example +// -------------------------------------------------------------------------------------------------------------------- + +$('#select-repo').selectize({ + valueField: 'url', + labelField: 'name', + searchField: 'name', + options: [], + create: false, + render: { + option: function(item, escape) { + return '
' + + '' + + '' + escape(item.name) + '' + + '' + escape(item.username) + '' + + '' + + '' + escape(item.description) + '' + + '
    ' + + (item.language ? '
  • ' + escape(item.language) + '
  • ' : '') + + '
  • ' + escape(item.watchers) + ' watchers
  • ' + + '
  • ' + escape(item.forks) + ' forks
  • ' + + '
' + + '
'; + } + }, + score: function(search) { + var score = this.getScoreFunction(search); + return function(item) { + return score(item) * (1 + Math.min(item.watchers / 100, 1)); + }; + }, + load: function(query, callback) { + if (!query.length) return callback(); + $.ajax({ + url: 'https://api.github.com/legacy/repos/search/' + encodeURIComponent(query), + type: 'GET', + error: function() { + callback(); + }, + success: function(res) { + callback(res.repositories.slice(0, 10)); + } + }); + } +}); + + +// Lock example +// -------------------------------------------------------------------------------------------------------------------- + +$('select').selectize({create: true}); +$('#select-locked-empty')[0].selectize.lock(); +$('#select-locked-single')[0].selectize.lock(); +$('#select-locked')[0].selectize.lock(); + + +// Movies example +// -------------------------------------------------------------------------------------------------------------------- + +$('#select-movie').selectize({ + valueField: 'title', + labelField: 'title', + searchField: 'title', + options: [], + create: false, + render: { + option: function(item, escape) { + var actors = []; + for (var i = 0, n = item.abridged_cast.length; i < n; i++) { + actors.push('' + escape(item.abridged_cast[i].name) + ''); + } + return '
' + + '' + + '' + + '' + escape(item.title) + '' + + '' + + '' + escape(item.synopsis || 'No synopsis available at this time.') + '' + + '' + (actors.length ? 'Starring ' + actors.join(', ') : 'Actors unavailable') + '' + + '
'; + } + }, + load: function(query, callback) { + if (!query.length) return callback(); + $.ajax({ + url: 'http://api.rottentomatoes.com/api/public/v1.0/movies.json', + type: 'GET', + dataType: 'jsonp', + data: { + q: query, + page_limit: 10, + apikey: '3qqmdwbuswut94jv4eua3j85' + }, + error: function() { + callback(); + }, + success: function(res) { + console.log(res.movies); + callback(res.movies); + } + }); + } +}); + +// Optgroups +// -------------------------------------------------------------------------------------------------------------------- + +$("#select-car").selectize({ + options: [ + {id: 'avenger', make: 'dodge', model: 'Avenger'}, + {id: 'caliber', make: 'dodge', model: 'Caliber'}, + {id: 'caravan-grand-passenger', make: 'dodge', model: 'Caravan Grand Passenger'}, + {id: 'challenger', make: 'dodge', model: 'Challenger'}, + {id: 'ram-1500', make: 'dodge', model: 'Ram 1500'}, + {id: 'viper', make: 'dodge', model: 'Viper'}, + {id: 'a3', make: 'audi', model: 'A3'}, + {id: 'a6', make: 'audi', model: 'A6'}, + {id: 'r8', make: 'audi', model: 'R8'}, + {id: 'rs-4', make: 'audi', model: 'RS 4'}, + {id: 's4', make: 'audi', model: 'S4'}, + {id: 's8', make: 'audi', model: 'S8'}, + {id: 'tt', make: 'audi', model: 'TT'}, + {id: 'avalanche', make: 'chevrolet', model: 'Avalanche'}, + {id: 'aveo', make: 'chevrolet', model: 'Aveo'}, + {id: 'cobalt', make: 'chevrolet', model: 'Cobalt'}, + {id: 'silverado', make: 'chevrolet', model: 'Silverado'}, + {id: 'suburban', make: 'chevrolet', model: 'Suburban'}, + {id: 'tahoe', make: 'chevrolet', model: 'Tahoe'}, + {id: 'trail-blazer', make: 'chevrolet', model: 'TrailBlazer'}, + ], + optgroups: [ + {id: 'dodge', name: 'Dodge'}, + {id: 'audi', name: 'Audi'}, + {id: 'chevrolet', name: 'Chevrolet'} + ], + labelField: 'model', + valueField: 'id', + optgroupField: 'make', + optgroupLabelField: 'name', + optgroupValueField: 'id', + optgroupOrder: ['chevrolet', 'dodge', 'audi'], + searchField: ['model'], + plugins: ['optgroup_columns'], + openOnFocus: false +}); + diff --git a/selectize/selectize.d.ts b/selectize/selectize.d.ts new file mode 100644 index 000000000..5d0c75585 --- /dev/null +++ b/selectize/selectize.d.ts @@ -0,0 +1,600 @@ +// Type definitions for Selectize 0.11.2 +// Project: https://github.com/brianreavis/selectize.js +// Definitions by: Adi Dahiya +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// + +declare module Selectize { + // see https://github.com/brianreavis/selectize.js/blob/master/docs/usage.md + // option identifiers are parameterized by T; data is parameterized by U + interface IOptions { + + // General + // ------------------------------------------------------------------------------------------------------------ + + /** + * The string to separate items by. This option is only used when Selectize is instantiated from a + * element. + * + * Default: ',' + */ + delimiter?: string; + + /** + * Enable or disable international character support. + * + * Default: true + */ + diacritics?: boolean; + + /** + * Allows the user to create a new items that aren't in the list of options. + * This option can be any of the following: "true", "false" (disabled), or a function that accepts two + * arguments: "input" and "callback". The callback should be invoked with the final data for the option. + * + * Default: false + */ + create?: any; + + /** + * If true, when user exits the field (clicks outside of input or presses ESC) new option is created and + * selected (if `create`-option is enabled). + * + * Default: false + */ + createOnBlur?: boolean; + + /** + * Specifies a RegExp or String containing a regular expression that the current search filter must match to + * be allowed to be created. May also be a predicate function that takes the filter text and returns whether + * it is allowed. + * + * Default: null + */ + createFilter?: any; + + /** + * Toggles match highlighting within the dropdown menu. + * + * Default: true + */ + highlight?: boolean; + + /** + * If false, items created by the user will not show up as available options once they are unselected. + * + * Default: true + */ + persist?: boolean; + + /** + * Show the dropdown immediately when the control receives focus. + * + * Default: true + */ + openOnFocus?: boolean; + + /** + * The max number of items to render at once in the dropdown list of options. + * + * Default: 1000 + */ + maxOptions?: number; + + /** + * The max number of items the user can select. + * + * Default: Infinity + */ + maxItems?: number; + + /** + * If true, the items that are currently selected will not be shown in the dropdown list of available options. + * + * Default: false + */ + hideSelected?: boolean; + + /** + * If true, Selectize will treat any options with a "" value like normal. This defaults to false to + * accomodate the common with