diff --git a/.flowconfig b/.flowconfig index 4f071a065d..d5a9b456ec 100644 --- a/.flowconfig +++ b/.flowconfig @@ -1,4 +1,5 @@ [ignore] +.*/packages/.*/lib [include] @@ -10,6 +11,7 @@ lib/types.js [options] strip_root=true suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe +suppress_comment= \\(.\\|\n\\)*\\$FlowIssue [version] -0.20.1 +0.21.0 diff --git a/package.json b/package.json index 881f3270ac..4478c7b231 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "derequire": "^2.0.2", "es5-shim": "^4.1.7", "eslint": "1.8.0", - "flow-bin": "^0.20.0", + "flow-bin": "^0.21.0", "fs-readdir-recursive": "^0.1.2", "gulp": "^3.9.0", "gulp-babel": "^5.3.0", diff --git a/packages/babel-core/src/helpers/normalize-ast.js b/packages/babel-core/src/helpers/normalize-ast.js index d2f86c22e8..cd8881a9fd 100644 --- a/packages/babel-core/src/helpers/normalize-ast.js +++ b/packages/babel-core/src/helpers/normalize-ast.js @@ -1,4 +1,4 @@ -/* @noflow */ +/* @flow */ import * as t from "babel-types"; diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index c89545c5bc..201f54be4c 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -537,7 +537,7 @@ export default class File extends Store { } } - makeResult({ code, map, ast, ignored } /*: BabelFileResult */): BabelFileResult { + makeResult({ code, map, ast, ignored }: BabelFileResult): BabelFileResult { let result = { metadata: null, options: this.opts, diff --git a/packages/babel-core/src/transformation/pipeline.js b/packages/babel-core/src/transformation/pipeline.js index 642dcd8c43..cbaf7fc32b 100644 --- a/packages/babel-core/src/transformation/pipeline.js +++ b/packages/babel-core/src/transformation/pipeline.js @@ -1,17 +1,19 @@ -/* @noflow */ +/* @flow */ +/* global BabelFileResult */ +/* global BabelFileMetadata */ import normalizeAst from "../helpers/normalize-ast"; import Plugin from "./plugin"; import File from "./file"; export default class Pipeline { - lint(code: string, opts?: Object = {}) { + lint(code: string, opts?: Object = {}): BabelFileResult { opts.code = false; opts.mode = "lint"; return this.transform(code, opts); } - pretransform(code: string, opts?: Object) { + pretransform(code: string, opts?: Object): BabelFileResult { let file = new File(opts, this); return file.wrap(code, function () { file.addCode(code); @@ -20,7 +22,7 @@ export default class Pipeline { }); } - transform(code: string, opts?: Object) { + transform(code: string, opts?: Object): BabelFileResult { let file = new File(opts, this); return file.wrap(code, function () { file.addCode(code); @@ -29,7 +31,7 @@ export default class Pipeline { }); } - analyse(code: string, opts: Object = {}, visitor?) { + analyse(code: string, opts: Object = {}, visitor?: Object): ?BabelFileMetadata { opts.code = false; if (visitor) { opts.plugins = opts.plugins || []; @@ -38,7 +40,7 @@ export default class Pipeline { return this.transform(code, opts).metadata; } - transformFromAst(ast, code: string, opts: Object) { + transformFromAst(ast: Object, code: string, opts: Object): BabelFileResult { ast = normalizeAst(ast); let file = new File(opts, this); diff --git a/packages/babel-core/src/util.js b/packages/babel-core/src/util.js index 9e5f46f1d2..8c1c1b1d80 100644 --- a/packages/babel-core/src/util.js +++ b/packages/babel-core/src/util.js @@ -1,4 +1,4 @@ -/* @noflow */ +/* @flow */ import escapeRegExp from "lodash/string/escapeRegExp"; import startsWith from "lodash/string/startsWith"; @@ -16,7 +16,7 @@ export { inherits, inspect } from "util"; * Test if a filename ends with a compilable extension. */ -export function canCompile(filename: string, altExts?: Array) { +export function canCompile(filename: string, altExts?: Array): boolean { let exts = altExts || canCompile.EXTENSIONS; let ext = path.extname(filename); return contains(exts, ext); diff --git a/packages/babel-generator/src/buffer.js b/packages/babel-generator/src/buffer.js index e0e63bcd7d..af8f91ac01 100644 --- a/packages/babel-generator/src/buffer.js +++ b/packages/babel-generator/src/buffer.js @@ -1,3 +1,5 @@ +/* @flow */ + import type Position from "./position"; import repeating from "repeating"; import trimRight from "trim-right"; @@ -21,17 +23,19 @@ export default class Buffer { this.last = ""; } + printedCommentStarts: Object; parenPushNewlineState: ?Object; - buf: string; position: Position; _indent: number; format: Object; + buf: string; + last: string; /** * Description */ - catchUp(node) { + catchUp(node: Object) { // catch up to this nodes newline if we're behind if (node.loc && this.format.retainLines && this.buf) { while (this.position.line < node.loc.start.line) { @@ -44,7 +48,7 @@ export default class Buffer { * Get the current trimmed buffer. */ - get() { + get(): string { return trimRight(this.buf); } @@ -52,7 +56,7 @@ export default class Buffer { * Get the current indent. */ - getIndent() { + getIndent(): string { if (this.format.compact || this.format.concise) { return ""; } else { @@ -64,7 +68,7 @@ export default class Buffer { * Get the current indent size. */ - indentSize() { + indentSize(): number { return this.getIndent().length; } @@ -222,7 +226,7 @@ export default class Buffer { _removeSpacesAfterLastNewline() { let lastNewlineIndex = this.buf.lastIndexOf("\n"); - if (lastNewlineIndex >= 0 && this.buf.trimRight().length <= lastNewlineIndex) { + if (lastNewlineIndex >= 0 && this.get().length <= lastNewlineIndex) { this.buf = this.buf.substring(0, lastNewlineIndex + 1); this.last = "\n"; } @@ -251,7 +255,7 @@ export default class Buffer { * Push a string to the buffer. */ - _push(str) { + _push(str: string): void { // see startTerminatorless() instance method let parenPushNewlineState = this.parenPushNewlineState; if (parenPushNewlineState) { @@ -296,12 +300,12 @@ export default class Buffer { * Test if a character is last in the buffer. */ - isLast(cha: string) { + isLast(cha: string): boolean { if (this.format.compact) return false; return this._isLast(cha); } - _isLast(cha: string) { + _isLast(cha: string): boolean { let last = this.last; if (Array.isArray(cha)) { diff --git a/packages/babel-generator/src/generators/jsx.js b/packages/babel-generator/src/generators/jsx.js index 7a926bb512..310a26209f 100644 --- a/packages/babel-generator/src/generators/jsx.js +++ b/packages/babel-generator/src/generators/jsx.js @@ -1,3 +1,5 @@ +/* @flow */ + export function JSXAttribute(node: Object) { this.print(node.name, node); if (node.value) { diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index 596983e009..7e8a117616 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -1,3 +1,5 @@ +/* @flow */ + import repeating from "repeating"; import * as t from "babel-types"; diff --git a/packages/babel-generator/src/node/whitespace.js b/packages/babel-generator/src/node/whitespace.js index 19cba52455..bed5500954 100644 --- a/packages/babel-generator/src/node/whitespace.js +++ b/packages/babel-generator/src/node/whitespace.js @@ -1,8 +1,15 @@ +/* @noflow */ + import isBoolean from "lodash/lang/isBoolean"; import each from "lodash/collection/each"; import map from "lodash/collection/map"; import * as t from "babel-types"; +type WhitespaceObject = { + before?: boolean, + after?: boolean +}; + /** * Crawl a node to test if it contains a CallExpression, a Function, or a Helper. * @@ -63,7 +70,7 @@ exports.nodes = { * Test if AssignmentExpression needs whitespace. */ - AssignmentExpression(node) { + AssignmentExpression(node: Object): ?WhitespaceObject { let state = crawl(node.right); if ((state.hasCall && state.hasHelper) || state.hasFunction) { return { @@ -77,7 +84,7 @@ exports.nodes = { * Test if SwitchCase needs whitespace. */ - SwitchCase(node, parent) { + SwitchCase(node: Object, parent: Object): ?WhitespaceObject { return { before: node.consequent.length || parent.cases[0] === node }; @@ -87,7 +94,7 @@ exports.nodes = { * Test if LogicalExpression needs whitespace. */ - LogicalExpression(node) { + LogicalExpression(node: Object): ?WhitespaceObject { if (t.isFunction(node.left) || t.isFunction(node.right)) { return { after: true @@ -99,7 +106,7 @@ exports.nodes = { * Test if Literal needs whitespace. */ - Literal(node) { + Literal(node: Object): ?WhitespaceObject { if (node.value === "use strict") { return { after: true @@ -111,7 +118,7 @@ exports.nodes = { * Test if CallExpression needs whitespace. */ - CallExpression(node) { + CallExpression(node: Object): ?WhitespaceObject { if (t.isFunction(node.callee) || isHelper(node)) { return { before: true, @@ -124,7 +131,7 @@ exports.nodes = { * Test if VariableDeclaration needs whitespace. */ - VariableDeclaration(node) { + VariableDeclaration(node: Object): ?WhitespaceObject { for (let i = 0; i < node.declarations.length; i++) { let declar = node.declarations[i]; @@ -147,7 +154,7 @@ exports.nodes = { * Test if IfStatement needs whitespace. */ - IfStatement(node) { + IfStatement(node: Object): ?WhitespaceObject { if (t.isBlockStatement(node.consequent)) { return { before: true, @@ -163,7 +170,7 @@ exports.nodes = { exports.nodes.ObjectProperty = exports.nodes.ObjectMethod = -exports.nodes.SpreadProperty = function (node, parent) { +exports.nodes.SpreadProperty = function (node: Object, parent): ?WhitespaceObject { if (parent.properties[0] === node) { return { before: true @@ -181,7 +188,7 @@ exports.list = { * Return VariableDeclaration declarations init properties. */ - VariableDeclaration(node) { + VariableDeclaration(node: Object): Array { return map(node.declarations, "init"); }, @@ -189,7 +196,7 @@ exports.list = { * Return VariableDeclaration elements. */ - ArrayExpression(node) { + ArrayExpression(node: Object): Array { return node.elements; }, @@ -197,7 +204,7 @@ exports.list = { * Return VariableDeclaration properties. */ - ObjectExpression(node) { + ObjectExpression(node: Object): Array { return node.properties; } }; diff --git a/packages/babel-traverse/src/path/lib/virtual-types.js b/packages/babel-traverse/src/path/lib/virtual-types.js index e879e66577..cb598fe9a3 100644 --- a/packages/babel-traverse/src/path/lib/virtual-types.js +++ b/packages/babel-traverse/src/path/lib/virtual-types.js @@ -28,14 +28,14 @@ export let ReferencedMemberExpression = { export let BindingIdentifier = { types: ["Identifier"], - checkPath({ node, parent } /*: NodePath */): boolean { + checkPath({ node, parent }: NodePath): boolean { return t.isIdentifier(node) && t.isBinding(node, parent); } }; export let Statement = { types: ["Statement"], - checkPath({ node, parent } /*: NodePath */): boolean { + checkPath({ node, parent }: NodePath): boolean { if (t.isStatement(node)) { if (t.isVariableDeclaration(node)) { if (t.isForXStatement(parent, { left: node })) return false; @@ -106,7 +106,7 @@ export let Pure = { export let Flow = { types: ["Flow", "ImportDeclaration", "ExportDeclaration"], - checkPath({ node } /*: NodePath */): boolean { + checkPath({ node }: NodePath): boolean { if (t.isFlow(node)) { return true; } else if (t.isImportDeclaration(node)) { diff --git a/packages/babel-types/src/converters.js b/packages/babel-types/src/converters.js index 8716a10a3f..3543636a9e 100644 --- a/packages/babel-types/src/converters.js +++ b/packages/babel-types/src/converters.js @@ -1,3 +1,5 @@ +/* @noflow */ + import isPlainObject from "lodash/lang/isPlainObject"; import isNumber from "lodash/lang/isNumber"; import isRegExp from "lodash/lang/isRegExp"; @@ -218,7 +220,7 @@ export function toExpression(node: Object): Object { } } -export function toBlock(node, parent: Object): Object { +export function toBlock(node: Object, parent: Object): Object { if (t.isBlockStatement(node)) { return node; } diff --git a/packages/babel-types/src/flow.js b/packages/babel-types/src/flow.js index 444ea50b86..531471f2d8 100644 --- a/packages/babel-types/src/flow.js +++ b/packages/babel-types/src/flow.js @@ -1,3 +1,5 @@ +/* @flow */ + import * as t from "./index"; /** @@ -19,7 +21,7 @@ export function createUnionTypeAnnotation(types: Array) { * Dedupe type annotations. */ -export function removeTypeDuplicates(nodes: Array) { +export function removeTypeDuplicates(nodes: Array): Array { let generics = {}; let bases = {}; diff --git a/packages/babel-types/src/index.js b/packages/babel-types/src/index.js index 3046db78db..f3a77a26e3 100644 --- a/packages/babel-types/src/index.js +++ b/packages/babel-types/src/index.js @@ -1,4 +1,4 @@ -/* @noflow */ +/* @flow */ import toFastProperties from "to-fast-properties"; import compact from "lodash/array/compact"; @@ -406,6 +406,7 @@ export function inherits(child: Object, parent: Object): Object { export function assertNode(node?) { if (!isNode(node)) { + // $FlowFixMe throw new TypeError("Not a valid node " + (node && node.type)); } } diff --git a/packages/babel-types/src/validators.js b/packages/babel-types/src/validators.js index e95ef2bd9a..cee738b7ab 100644 --- a/packages/babel-types/src/validators.js +++ b/packages/babel-types/src/validators.js @@ -1,3 +1,5 @@ +/* @flow */ + import { getBindingIdentifiers } from "./retrievers"; import esutils from "esutils"; import * as t from "./index"; @@ -67,7 +69,7 @@ export function isReferenced(node: Object, parent: Object): boolean { case "ArrowFunctionExpression": case "FunctionDeclaration": case "FunctionExpression": - for (let param of (parent.params: Array)) { + for (let param of (parent.params: Array)) { if (param === node) return false; } diff --git a/packages/babylon/src/parser/comments.js b/packages/babylon/src/parser/comments.js index 344ba7e2c0..38f2081322 100644 --- a/packages/babylon/src/parser/comments.js +++ b/packages/babylon/src/parser/comments.js @@ -118,7 +118,7 @@ pp.processComment = function (node) { // result in an empty array, and if so, the array must be // deleted. node.leadingComments = this.state.leadingComments.slice(0, i); - if (node.leadingComments.length === 0) { + if ((node.leadingComments: Array).length === 0) { node.leadingComments = null; } diff --git a/packages/babylon/src/parser/index.js b/packages/babylon/src/parser/index.js index 1440ea1a41..14a3ff4b72 100644 --- a/packages/babylon/src/parser/index.js +++ b/packages/babylon/src/parser/index.js @@ -1,4 +1,4 @@ -/* @noflow */ +/* @flow */ import { reservedWords } from "../util/identifier"; import { getOptions } from "../options"; @@ -7,7 +7,7 @@ import Tokenizer from "../tokenizer"; export const plugins = {}; export default class Parser extends Tokenizer { - constructor(options, input: string) { + constructor(options: Object, input: string) { options = getOptions(options); super(options, input); @@ -31,7 +31,7 @@ export default class Parser extends Tokenizer { this[name] = f(this[name]); } - loadPlugins(plugins: Array) { + loadPlugins(plugins: Array): Object { let pluginMap = {}; if (plugins.indexOf("flow") >= 0) { diff --git a/packages/babylon/src/tokenizer/context.js b/packages/babylon/src/tokenizer/context.js index a8e592da6e..fb1bcc57f6 100644 --- a/packages/babylon/src/tokenizer/context.js +++ b/packages/babylon/src/tokenizer/context.js @@ -26,7 +26,9 @@ export class TokContext { override: ?Function; } -export const types = { +export const types: { + [key: string]: TokContext; +} = { b_stat: new TokContext("{", false), b_expr: new TokContext("{", true), b_tmpl: new TokContext("${", true), @@ -57,7 +59,7 @@ tt.parenR.updateContext = tt.braceR.updateContext = function () { tt.name.updateContext = function (prevType) { this.state.exprAllowed = false; - + if (prevType === tt._let || prevType === tt._const || prevType === tt._var) { if (lineBreak.test(this.input.slice(this.state.end))) { this.state.exprAllowed = true; diff --git a/packages/babylon/src/tokenizer/index.js b/packages/babylon/src/tokenizer/index.js index 8e610f77dd..7203e30aac 100644 --- a/packages/babylon/src/tokenizer/index.js +++ b/packages/babylon/src/tokenizer/index.js @@ -1,3 +1,5 @@ +/* @noflow */ + import type { TokenType } from "./types"; import { isIdentifierStart, isIdentifierChar, isKeyword } from "../util/identifier"; import { types as tt, keywords as keywordTypes } from "./types";