This commit is contained in:
Brian Ng 2017-06-17 14:14:42 -05:00
parent 001064885d
commit 94e69f399b
14 changed files with 854 additions and 381 deletions

View File

@ -1,9 +1,13 @@
module.exports = {
root: true,
extends: "babel",
"plugins": [
"prettier"
],
rules: {
"no-var": 0,
"max-len": 0
"max-len": 0,
"prettier/prettier": ["error", { "trailingComma": "es5" }],
},
env: {
node: true,

View File

@ -11,14 +11,15 @@ module.exports = function (tokens, tt) {
}
function isTemplateStarter(token) {
return isBackQuote(token) ||
return (
isBackQuote(token) ||
// only can be a template starter when in a template already
tokens[token].type === tt.braceR && numBackQuotes > 0;
(tokens[token].type === tt.braceR && numBackQuotes > 0)
);
}
function isTemplateEnder(token) {
return isBackQuote(token) ||
tokens[token].type === tt.dollarBraceL;
return isBackQuote(token) || tokens[token].type === tt.dollarBraceL;
}
// append the values between start and end
@ -44,8 +45,8 @@ module.exports = function (tokens, tt) {
end: tokens[end].end,
loc: {
start: tokens[start].loc.start,
end: tokens[end].loc.end
}
end: tokens[end].loc.end,
},
};
// put new token in place of old tokens
@ -70,7 +71,10 @@ module.exports = function (tokens, tt) {
currentToken = startingToken + 1;
// check if token after template start is "template"
if (currentToken >= tokens.length - 1 || tokens[currentToken].type !== tt.template) {
if (
currentToken >= tokens.length - 1 ||
tokens[currentToken].type !== tt.template
) {
break;
}

View File

@ -8,7 +8,13 @@ module.exports = function (ast, traverse, code) {
// Monkey patch visitor keys in order to be able to traverse the estree nodes
t.VISITOR_KEYS.Property = t.VISITOR_KEYS.ObjectProperty;
t.VISITOR_KEYS.MethodDefinition = ["key", "value", "decorators", "returnType", "typeParameters"];
t.VISITOR_KEYS.MethodDefinition = [
"key",
"value",
"decorators",
"returnType",
"typeParameters",
];
traverse(ast, astTransformVisitor, null, state);
@ -49,11 +55,19 @@ var astTransformVisitor = {
if (!node.shorthand) node.shorthand = false;
}
if (path.isRestElement() && path.parent && path.parent.type === "ObjectPattern") {
if (
path.isRestElement() &&
path.parent &&
path.parent.type === "ObjectPattern"
) {
node.type = "ExperimentalRestProperty";
}
if (path.isSpreadElement() && path.parent && path.parent.type === "ObjectExpression") {
if (
path.isSpreadElement() &&
path.parent &&
path.parent.type === "ObjectExpression"
) {
node.type = "ExperimentalSpreadProperty";
}
@ -105,5 +119,5 @@ var astTransformVisitor = {
}
}
}
}
},
};

View File

@ -6,24 +6,42 @@ module.exports = function (token, tt, source) {
if (type === tt.name) {
token.type = "Identifier";
} else if (type === tt.semi || type === tt.comma ||
type === tt.parenL || type === tt.parenR ||
type === tt.braceL || type === tt.braceR ||
type === tt.slash || type === tt.dot ||
type === tt.bracketL || type === tt.bracketR ||
type === tt.ellipsis || type === tt.arrow ||
type === tt.star || type === tt.incDec ||
type === tt.colon || type === tt.question ||
type === tt.template || type === tt.backQuote ||
type === tt.dollarBraceL || type === tt.at ||
type === tt.logicalOR || type === tt.logicalAND ||
type === tt.bitwiseOR || type === tt.bitwiseXOR ||
type === tt.bitwiseAND || type === tt.equality ||
type === tt.relational || type === tt.bitShift ||
type === tt.plusMin || type === tt.modulo ||
type === tt.exponent || type === tt.prefix ||
} else if (
type === tt.semi ||
type === tt.comma ||
type === tt.parenL ||
type === tt.parenR ||
type === tt.braceL ||
type === tt.braceR ||
type === tt.slash ||
type === tt.dot ||
type === tt.bracketL ||
type === tt.bracketR ||
type === tt.ellipsis ||
type === tt.arrow ||
type === tt.star ||
type === tt.incDec ||
type === tt.colon ||
type === tt.question ||
type === tt.template ||
type === tt.backQuote ||
type === tt.dollarBraceL ||
type === tt.at ||
type === tt.logicalOR ||
type === tt.logicalAND ||
type === tt.bitwiseOR ||
type === tt.bitwiseXOR ||
type === tt.bitwiseAND ||
type === tt.equality ||
type === tt.relational ||
type === tt.bitShift ||
type === tt.plusMin ||
type === tt.modulo ||
type === tt.exponent ||
type === tt.prefix ||
type === tt.doubleColon ||
type.isAssign) {
type.isAssign
) {
token.type = "Punctuator";
if (!token.value) token.value = type.label;
} else if (type === tt.jsxTagStart) {
@ -53,7 +71,7 @@ module.exports = function (token, tt, source) {
var value = token.value;
token.regex = {
pattern: value.pattern,
flags: value.flags
flags: value.flags,
};
token.value = `/${value.pattern}/${value.flags}`;
}

View File

@ -30,7 +30,8 @@ function getModules() {
try {
var escope = eslintMod.require("eslint-scope");
var Definition = eslintMod.require("eslint-scope/lib/definition").Definition;
var Definition = eslintMod.require("eslint-scope/lib/definition")
.Definition;
var referencer = eslintMod.require("eslint-scope/lib/referencer");
} catch (err) {
escope = eslintMod.require("escope");
@ -94,7 +95,7 @@ function monkeypatch(modules) {
"FunctionExpression",
"Identifier",
"ObjectPattern",
"RestElement"
"RestElement",
]);
var visitorKeysMap = Object.keys(t.VISITOR_KEYS).reduce(function(acc, key) {
var value = t.VISITOR_KEYS[key];
@ -120,7 +121,7 @@ function monkeypatch(modules) {
// others
typeAnnotation: { type: "typeAnnotation" },
typeParameters: { type: "typeParameters" },
id: { type: "id" }
id: { type: "id" },
};
function visitTypeAnnotation(node) {
@ -182,7 +183,13 @@ function monkeypatch(modules) {
function nestTypeParamScope(manager, node) {
var parentScope = manager.__currentScope;
var scope = new escope.Scope(manager, "type-parameters", parentScope, node, false);
var scope = new escope.Scope(
manager,
"type-parameters",
parentScope,
node,
false
);
manager.__nestScope(scope);
for (var j = 0; j < node.typeParameters.params.length; j++) {
var name = node.typeParameters.params[j];
@ -297,15 +304,9 @@ function monkeypatch(modules) {
};
function createScopeVariable(node, name) {
this.currentScope().variableScope.__define(name,
new Definition(
"Variable",
this.currentScope().variableScope.__define(
name,
node,
null,
null,
null
)
new Definition("Variable", name, node, null, null, null)
);
}
@ -339,10 +340,9 @@ function monkeypatch(modules) {
}
};
referencer.prototype.DeclareModule =
referencer.prototype.DeclareFunction =
referencer.prototype.DeclareVariable =
referencer.prototype.DeclareClass = function(node) {
referencer.prototype.DeclareModule = referencer.prototype.DeclareFunction = referencer.prototype.DeclareVariable = referencer.prototype.DeclareClass = function(
node
) {
if (node.id) {
createScopeVariable.call(this, node, node.id);
}
@ -360,8 +360,10 @@ function monkeypatch(modules) {
exports.parse = function(code, options) {
options = options || {};
eslintOptions.ecmaVersion = options.ecmaVersion = options.ecmaVersion || 6;
eslintOptions.sourceType = options.sourceType = options.sourceType || "module";
eslintOptions.allowImportExportEverywhere = options.allowImportExportEverywhere = options.allowImportExportEverywhere || false;
eslintOptions.sourceType = options.sourceType =
options.sourceType || "module";
eslintOptions.allowImportExportEverywhere = options.allowImportExportEverywhere =
options.allowImportExportEverywhere || false;
if (options.sourceType === "module") {
eslintOptions.globalReturn = false;
} else {
@ -410,7 +412,7 @@ exports.parseNoPatch = function (code, options) {
"optionalChaining",
"importMeta",
"classPrivateProperties",
]
],
};
var ast;
@ -418,7 +420,6 @@ exports.parseNoPatch = function (code, options) {
ast = parse(code, opts);
} catch (err) {
if (err instanceof SyntaxError) {
err.lineNumber = err.loc.line;
err.column = err.loc.column;
@ -427,15 +428,23 @@ exports.parseNoPatch = function (code, options) {
err.column = err.loc.column + 1;
// remove trailing "(LINE:COLUMN)" acorn message and add in esprima syntax error message start
err.message = "Line " + err.lineNumber + ": " + err.message.replace(/ \((\d+):(\d+)\)$/, "") +
err.message =
"Line " +
err.lineNumber +
": " +
err.message.replace(/ \((\d+):(\d+)\)$/, "") +
// add codeframe
"\n\n" +
codeFrameColumns(code, {
codeFrameColumns(
code,
{
start: {
line: err.lineNumber,
column: err.column,
},
}, { highlightCode: true });
},
{ highlightCode: true }
);
}
}

View File

@ -22,6 +22,7 @@
"test-only": "mocha",
"lint": "eslint index.js babylon-to-espree test",
"fix": "eslint index.js babylon-to-espree test --fix",
"precommit": "lint-staged",
"preversion": "npm test",
"changelog": "git log `git describe --tags --abbrev=0`..HEAD --pretty=format:' * %s (%an)' | grep -v 'Merge pull request'"
},
@ -38,9 +39,19 @@
"babel-eslint": "^7.0.0",
"dedent": "^0.7.0",
"eslint": "^3.18.0",
"eslint-config-babel": "^6.0.0",
"eslint-config-babel": "^7.0.1",
"eslint-plugin-flowtype": "^2.30.3",
"eslint-plugin-prettier": "^2.1.2",
"espree": "^3.4.0",
"mocha": "^3.0.0"
"husky": "^0.13.2",
"lint-staged": "^3.6.1",
"mocha": "^3.0.0",
"prettier": "1.4.4"
},
"lint-staged": {
"*.js": [
"eslint --format=codeframe --fix",
"git add"
]
}
}

View File

@ -20,9 +20,18 @@ function assertImplementsAST(target, source, path) {
var typeA = target === null ? "null" : typeof target;
var typeB = source === null ? "null" : typeof source;
if (typeA !== typeB) {
error(`have different types (${typeA} !== ${typeB}) (${target} !== ${source})`);
} else if (typeA === "object" && ["RegExp"].indexOf(target.constructor.name) !== -1 && target.constructor.name !== source.constructor.name) {
error(`object have different constructors (${target.constructor.name} !== ${source.constructor.name}`);
error(
`have different types (${typeA} !== ${typeB}) (${target} !== ${source})`
);
} else if (
typeA === "object" &&
["RegExp"].indexOf(target.constructor.name) !== -1 &&
target.constructor.name !== source.constructor.name
) {
error(
`object have different constructors (${target.constructor
.name} !== ${source.constructor.name}`
);
} else if (typeA === "object") {
var keysTarget = Object.keys(target);
for (var i in keysTarget) {
@ -32,15 +41,23 @@ function assertImplementsAST(target, source, path) {
path.pop();
}
} else if (target !== source) {
error(`are different (${JSON.stringify(target)} !== ${JSON.stringify(source)})`);
error(
`are different (${JSON.stringify(target)} !== ${JSON.stringify(source)})`
);
}
}
function lookup(obj, keypath, backwardsDepth) {
if (!keypath) { return obj; }
if (!keypath) {
return obj;
}
return keypath.split(".").slice(0, -1 * backwardsDepth)
.reduce((base, segment) => { return base && base[segment], obj; });
return keypath
.split(".")
.slice(0, -1 * backwardsDepth)
.reduce((base, segment) => {
return base && base[segment], obj;
});
}
function parseAndAssertSame(code) {
@ -53,7 +70,7 @@ function parseAndAssertSame(code) {
// enable implied strict mode (if ecmaVersion >= 5)
impliedStrict: true,
// allow experimental object rest/spread
experimentalObjectRestSpread: true
experimentalObjectRestSpread: true,
},
tokens: true,
loc: true,
@ -61,7 +78,7 @@ function parseAndAssertSame(code) {
comment: true,
attachComment: true,
ecmaVersion: 8,
sourceType: "module"
sourceType: "module",
});
var babylonAST = babelEslint.parse(code);
try {
@ -76,9 +93,15 @@ function parseAndAssertSame(code) {
}
err.message += unpad(`
espree:
${util.inspect(lookup(esAST, traversal, 2), { depth: err.depth, colors: true })}
${util.inspect(lookup(esAST, traversal, 2), {
depth: err.depth,
colors: true,
})}
babel-eslint:
${util.inspect(lookup(babylonAST, traversal, 2), { depth: err.depth, colors: true })}
${util.inspect(lookup(babylonAST, traversal, 2), {
depth: err.depth,
colors: true,
})}
`);
throw err;
}
@ -90,9 +113,13 @@ describe("babylon-to-esprima", () => {
it("should allow ast.analyze to be called without options", function() {
var esAST = babelEslint.parse("`test`");
assert.doesNotThrow(() => {
assert.doesNotThrow(
() => {
escope.analyze(esAST);
}, TypeError, "Should allow no options argument.");
},
TypeError,
"Should allow no options argument."
);
});
});
@ -138,11 +165,15 @@ describe("babylon-to-esprima", () => {
});
it("template with nested function/object", () => {
parseAndAssertSame("`outer${{x: {y: 10}}}bar${`nested${function(){return 1;}}endnest`}end`");
parseAndAssertSame(
"`outer${{x: {y: 10}}}bar${`nested${function(){return 1;}}endnest`}end`"
);
});
it("template with braces inside and outside of template string #96", () => {
parseAndAssertSame("if (a) { var target = `{}a:${webpackPort}{}}}}`; } else { app.use(); }");
parseAndAssertSame(
"if (a) { var target = `{}a:${webpackPort}{}}}}`; } else { app.use(); }"
);
});
it("template also with braces #96", () => {
@ -218,19 +249,19 @@ describe("babylon-to-esprima", () => {
});
it("default import", () => {
parseAndAssertSame("import foo from \"foo\";");
parseAndAssertSame('import foo from "foo";');
});
it("import specifier", () => {
parseAndAssertSame("import { foo } from \"foo\";");
parseAndAssertSame('import { foo } from "foo";');
});
it("import specifier with name", () => {
parseAndAssertSame("import { foo as bar } from \"foo\";");
parseAndAssertSame('import { foo as bar } from "foo";');
});
it("import bare", () => {
parseAndAssertSame("import \"foo\";");
parseAndAssertSame('import "foo";');
});
it("export default class declaration", () => {
@ -250,7 +281,7 @@ describe("babylon-to-esprima", () => {
});
it("export all", () => {
parseAndAssertSame("export * from \"foo\";");
parseAndAssertSame('export * from "foo";');
});
it("export named", () => {
@ -331,11 +362,11 @@ describe("babylon-to-esprima", () => {
});
it("regexp in a template string", () => {
parseAndAssertSame("`${/\\d/.exec(\"1\")[0]}`");
parseAndAssertSame('`${/\\d/.exec("1")[0]}`');
});
it("first line is empty", () => {
parseAndAssertSame("\nimport Immutable from \"immutable\";");
parseAndAssertSame('\nimport Immutable from "immutable";');
});
it("empty", () => {
@ -383,7 +414,9 @@ describe("babylon-to-esprima", () => {
});
it("MethodDefinition 2", () => {
parseAndAssertSame("export default class Bar { get bar() { return 42; }}");
parseAndAssertSame(
"export default class Bar { get bar() { return 42; }}"
);
});
it("ClassMethod", () => {
@ -443,7 +476,7 @@ describe("babylon-to-esprima", () => {
it("do not allow import export everywhere", () => {
assert.throws(() => {
parseAndAssertSame("function F() { import a from \"a\"; }");
parseAndAssertSame('function F() { import a from "a"; }');
}, /SyntaxError: 'import' and 'export' may only appear at the top level/);
});

View File

@ -13,8 +13,8 @@ var errorLevel = 2;
var baseEslintOpts = {
parser: require.resolve(".."),
parserOptions: {
sourceType: "script"
}
sourceType: "script",
},
};
/**
@ -38,11 +38,7 @@ function lint (opts, done) {
function readFixture(id, done) {
if (Array.isArray(id)) id = path.join.apply(path, id);
if (!path.extname(id)) id += ".js";
fs.readFile(
path.join(paths.fixtures, id),
encoding,
done
);
fs.readFile(path.join(paths.fixtures, id), encoding, done);
}
// readFixture
@ -60,19 +56,20 @@ function strictSuite () {
});
eslintOpts.rules[ruleId] = [errorLevel, "never"];
["global-with", "function-with"].forEach((fixture) => {
it(`should error on ${fixture.match(/^[^-]+/)[0]} directive`,
(done) => {
lint({
["global-with", "function-with"].forEach(fixture => {
it(`should error on ${fixture.match(/^[^-]+/)[0]} directive`, done => {
lint(
{
fixture: ["strict", fixture],
eslint: eslintOpts,
}, (err, report) => {
},
(err, report) => {
if (err) return done(err);
assert(report[0].ruleId === ruleId);
done();
});
}
);
});
// it
});
});
@ -80,41 +77,49 @@ function strictSuite () {
describe("when set to 'global'", () => {
var eslintOpts = Object.assign({}, baseEslintOpts, {
rules: {}
rules: {},
});
eslintOpts.rules[ruleId] = [errorLevel, "global"];
it("shouldn't error on single global directive", (done) => {
lint({
it("shouldn't error on single global directive", done => {
lint(
{
fixture: ["strict", "global-with"],
eslint: eslintOpts,
}, (err, report) => {
},
(err, report) => {
if (err) return done(err);
assert(!report.length);
done();
});
}
);
});
// it
it("should error twice on global directive: no and function directive: yes", (done) => {
lint({
it("should error twice on global directive: no and function directive: yes", done => {
lint(
{
fixture: ["strict", "function-with"],
eslint: eslintOpts,
}, (err, report) => {
},
(err, report) => {
if (err) return done(err);
[0, 1].forEach((i) => {
[0, 1].forEach(i => {
assert(report[i].ruleId === ruleId);
});
done();
});
}
);
});
// it
it("should error on function directive", (done) => {
lint({
it("should error on function directive", done => {
lint(
{
fixture: ["strict", "global-with-function-with"],
eslint: eslintOpts,
}, (err, report) => {
},
(err, report) => {
if (err) return done(err);
assert(report[0].ruleId === ruleId);
@ -124,19 +129,23 @@ function strictSuite () {
// result of the previous assertion.
assert(report[0].nodeType !== "Program");
done();
});
}
);
});
// it
it("should error on no directive", (done) => {
lint({
it("should error on no directive", done => {
lint(
{
fixture: ["strict", "none"],
eslint: eslintOpts,
}, (err, report) => {
},
(err, report) => {
if (err) return done(err);
assert(report[0].ruleId === ruleId);
done();
});
}
);
});
// it
});
@ -144,108 +153,130 @@ function strictSuite () {
describe("when set to 'function'", () => {
var eslintOpts = Object.assign({}, baseEslintOpts, {
rules: {}
rules: {},
});
eslintOpts.rules[ruleId] = [errorLevel, "function"];
it("shouldn't error on single function directive", (done) => {
lint({
it("shouldn't error on single function directive", done => {
lint(
{
fixture: ["strict", "function-with"],
eslint: eslintOpts,
}, (err, report) => {
},
(err, report) => {
if (err) return done(err);
assert(!report.length);
done();
});
}
);
});
// it
it("should error twice on function directive: no and global directive: yes", (done) => {
lint({
it("should error twice on function directive: no and global directive: yes", done => {
lint(
{
fixture: ["strict", "global-with-function-without"],
eslint: eslintOpts,
}, (err, report) => {
},
(err, report) => {
if (err) return done(err);
[0, 1].forEach((i) => {
[0, 1].forEach(i => {
assert(report[i].ruleId === ruleId);
});
done();
});
}
);
});
// it
it("should error on only global directive", (done) => {
lint({
it("should error on only global directive", done => {
lint(
{
fixture: ["strict", "global-with"],
eslint: eslintOpts,
}, (err, report) => {
},
(err, report) => {
if (err) return done(err);
assert(report[0].ruleId === ruleId);
done();
});
}
);
});
// it
it("should error on extraneous global directive", (done) => {
lint({
it("should error on extraneous global directive", done => {
lint(
{
fixture: ["strict", "global-with-function-with"],
eslint: eslintOpts,
}, (err, report) => {
},
(err, report) => {
if (err) return done(err);
assert(report[0].ruleId === ruleId);
assert(report[0].nodeType.indexOf("Function") === -1);
done();
});
}
);
});
// it
});
// describe
describe("When \"codeFrame\"", () => {
describe('When "codeFrame"', () => {
// Strip chalk colors, these are not relevant for the test
const stripAnsi = (str) => str.replace(
const stripAnsi = str =>
str.replace(
/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,
""
);
it("should display codeFrame when option is absent", (done) => {
lint({
it("should display codeFrame when option is absent", done => {
lint(
{
fixture: ["syntax-error"],
eslint: baseEslintOpts
}, (err, report) => {
eslint: baseEslintOpts,
},
(err, report) => {
if (err) return done(err);
assert(stripAnsi(report[0].message).indexOf("^\n 5 |") > -1);
done();
});
}
);
});
it("should display codeFrame when option is true", (done) => {
lint({
it("should display codeFrame when option is true", done => {
lint(
{
fixture: ["syntax-error"],
eslint: Object.assign({}, baseEslintOpts, {
parserOptions: {
codeFrame: true
}
})
}, (err, report) => {
codeFrame: true,
},
}),
},
(err, report) => {
if (err) return done(err);
assert(stripAnsi(report[0].message).indexOf("^\n 5 |") > -1);
done();
});
}
);
});
it("should not display codeFrame when option is false", (done) => {
lint({
it("should not display codeFrame when option is false", done => {
lint(
{
fixture: ["syntax-error"],
eslint: Object.assign({}, baseEslintOpts, {
parserOptions: {
codeFrame: false
}
})
}, (err, report) => {
codeFrame: false,
},
}),
},
(err, report) => {
if (err) return done(err);
assert(stripAnsi(report[0].message).indexOf("^\n 5 |") === -1);
done();
});
}
);
});
});
}

View File

@ -3,23 +3,29 @@
var eslint = require("eslint");
var unpad = require("dedent");
function verifyAndAssertMessages(code, rules, expectedMessages, sourceType, overrideConfig) {
function verifyAndAssertMessages(
code,
rules,
expectedMessages,
sourceType,
overrideConfig
) {
var config = {
parser: require.resolve(".."),
rules,
env: {
node: true,
es6: true
es6: true,
},
parserOptions: {
ecmaVersion: 8,
ecmaFeatures: {
jsx: true,
experimentalObjectRestSpread: true,
globalReturn: true
globalReturn: true,
},
sourceType,
},
sourceType
}
};
if (overrideConfig) {
@ -31,11 +37,19 @@ function verifyAndAssertMessages(code, rules, expectedMessages, sourceType, over
var messages = eslint.linter.verify(code, config);
if (messages.length !== expectedMessages.length) {
throw new Error(`Expected ${expectedMessages.length} message(s), got ${messages.length}\n${JSON.stringify(messages, null, 2)}`);
throw new Error(
`Expected ${expectedMessages.length} message(s), got ${messages.length}\n${JSON.stringify(
messages,
null,
2
)}`
);
}
messages.forEach((message, i) => {
var formatedMessage = `${message.line}:${message.column} ${message.message}${(message.ruleId ? ` ${message.ruleId}` : "")}`;
var formatedMessage = `${message.line}:${message.column} ${message.message}${message.ruleId
? ` ${message.ruleId}`
: ""}`;
if (formatedMessage !== expectedMessages[i]) {
throw new Error(
unpad(`
@ -50,27 +64,21 @@ function verifyAndAssertMessages(code, rules, expectedMessages, sourceType, over
describe("verify", () => {
it("arrow function support (issue #1)", () => {
verifyAndAssertMessages(
"describe('stuff', () => {});",
{},
[]
);
verifyAndAssertMessages("describe('stuff', () => {});", {}, []);
});
it("EOL validation (issue #2)", () => {
verifyAndAssertMessages(
"module.exports = \"something\";",
{ "eol-last": 1, "semi": 1 },
'module.exports = "something";',
{ "eol-last": 1, semi: 1 },
["1:30 Newline required at end of file but not found. eol-last"]
);
});
xit("Readable error messages (issue #3)", () => {
verifyAndAssertMessages(
"{ , res }",
{},
[ "1:3 Parsing error: Unexpected token" ]
);
verifyAndAssertMessages("{ , res }", {}, [
"1:3 Parsing error: Unexpected token",
]);
});
it("Modules support (issue #5)", () => {
@ -120,7 +128,7 @@ describe("verify", () => {
it("JSX attribute names marked as variables (issue #12)", () => {
verifyAndAssertMessages(
"module.exports = <div className=\"foo\" />",
'module.exports = <div className="foo" />',
{ "no-undef": 1 },
[]
);
@ -136,8 +144,8 @@ describe("verify", () => {
it("Arrow function with non-block bodies (issue #20)", () => {
verifyAndAssertMessages(
"\"use strict\"; () => 1",
{ "strict": [1, "global"] },
'"use strict"; () => 1',
{ strict: [1, "global"] },
[],
"script"
);
@ -145,7 +153,7 @@ describe("verify", () => {
it("#242", () => {
verifyAndAssertMessages(
"\"use strict\"; asdf;",
'"use strict"; asdf;',
{ "no-irregular-whitespace": 1 },
[],
{}
@ -191,19 +199,11 @@ describe("verify", () => {
});
it("type alias", () => {
verifyAndAssertMessages(
"type SomeNewType = any;",
{ "no-undef": 1 },
[]
);
verifyAndAssertMessages("type SomeNewType = any;", { "no-undef": 1 }, []);
});
it("type cast expression #102", () => {
verifyAndAssertMessages(
"for (let a of (a: Array)) {}",
{},
[]
);
verifyAndAssertMessages("for (let a of (a: Array)) {}", {}, []);
});
it("multiple nullable type annotations and return #108", () => {
@ -259,9 +259,11 @@ describe("verify", () => {
new Foo();
`),
{ "no-unused-vars": 1, "no-undef": 1 },
[ "1:1 'T' is not defined. no-undef",
[
"1:1 'T' is not defined. no-undef",
"2:11 'T' is defined but never used. no-unused-vars",
"3:1 'T' is not defined. no-undef" ]
"3:1 'T' is not defined. no-undef",
]
);
});
@ -274,8 +276,10 @@ describe("verify", () => {
}
`),
{ "no-unused-vars": 1, "no-undef": 1 },
[ "2:11 'Log' is defined but never used. no-unused-vars",
"2:38 'T4' is defined but never used. no-unused-vars" ]
[
"2:11 'Log' is defined but never used. no-unused-vars",
"2:38 'T4' is defined but never used. no-unused-vars",
]
);
});
@ -288,9 +292,11 @@ describe("verify", () => {
Foo;
`),
{ "no-unused-vars": 1, "no-undef": 1 },
[ "1:1 'T' is not defined. no-undef",
[
"1:1 'T' is not defined. no-undef",
"2:15 'T' is defined but never used. no-unused-vars",
"3:1 'T' is not defined. no-undef" ]
"3:1 'T' is not defined. no-undef",
]
);
});
@ -304,8 +310,10 @@ describe("verify", () => {
};
`),
{ "no-unused-vars": 1, "no-undef": 1 },
[ "2:6 'Log' is defined but never used. no-unused-vars",
"2:29 'T3' is defined but never used. no-unused-vars" ]
[
"2:6 'Log' is defined but never used. no-unused-vars",
"2:29 'T3' is defined but never used. no-unused-vars",
]
);
});
@ -318,9 +326,11 @@ describe("verify", () => {
Foo;
`),
{ "no-unused-vars": 1, "no-undef": 1 },
[ "1:1 'T' is not defined. no-undef",
[
"1:1 'T' is not defined. no-undef",
"2:10 'T' is defined but never used. no-unused-vars",
"3:1 'T' is not defined. no-undef" ]
"3:1 'T' is not defined. no-undef",
]
);
});
@ -346,9 +356,11 @@ describe("verify", () => {
log;
`),
{ "no-unused-vars": 1, "no-undef": 1 },
[ "1:1 'T' is not defined. no-undef",
[
"1:1 'T' is not defined. no-undef",
"2:14 'T' is defined but never used. no-unused-vars",
"3:1 'T' is not defined. no-undef" ]
"3:1 'T' is not defined. no-undef",
]
);
});
@ -544,8 +556,10 @@ describe("verify", () => {
var b: T = 1; b;
`),
{ "no-unused-vars": 1, "no-undef": 1 },
[ "1:21 'T' is defined but never used. no-unused-vars",
"2:8 'T' is not defined. no-undef" ]
[
"1:21 'T' is defined but never used. no-unused-vars",
"2:8 'T' is not defined. no-undef",
]
);
});
@ -581,8 +595,10 @@ describe("verify", () => {
type T = {a: number, ...U, ...V};
`),
{ "no-undef": 1, "no-unused-vars": 1 },
[ "2:6 'T' is defined but never used. no-unused-vars",
"2:31 'V' is not defined. no-undef" ]
[
"2:6 'T' is defined but never used. no-unused-vars",
"2:31 'V' is not defined. no-undef",
]
);
});
@ -1289,11 +1305,9 @@ describe("verify", () => {
});
it("detects minimal no-unused-vars case #120", () => {
verifyAndAssertMessages(
"var unused;",
{ "no-unused-vars": 1 },
[ "1:5 'unused' is defined but never used. no-unused-vars" ]
);
verifyAndAssertMessages("var unused;", { "no-unused-vars": 1 }, [
"1:5 'unused' is defined but never used. no-unused-vars",
]);
});
// This two tests are disabled, as the feature to visit properties when
@ -1430,14 +1444,16 @@ describe("verify", () => {
});
it("no no-undef error with rest #11", () => {
verifyAndAssertMessages("const [a, ...rest] = ['1', '2', '3']; a; rest;",
verifyAndAssertMessages(
"const [a, ...rest] = ['1', '2', '3']; a; rest;",
{ "no-undef": 1, "no-unused-vars": 1 },
[]
);
});
it("async function with space-before-function-paren #168", () => {
verifyAndAssertMessages("it('handles updates', async function() {});",
verifyAndAssertMessages(
"it('handles updates', async function() {});",
{ "space-before-function-paren": [1, "never"] },
[]
);
@ -1474,11 +1490,7 @@ describe("verify", () => {
});
it("jsx and stringliteral #216", () => {
verifyAndAssertMessages(
"<div className=''></div>",
{},
[]
);
verifyAndAssertMessages("<div className=''></div>", {}, []);
});
it("getter/setter #218", () => {
@ -1488,7 +1500,11 @@ describe("verify", () => {
set a (v) { }
}
`),
{ "space-before-function-paren": 1, "keyword-spacing": [1, { "before": true }], "indent": 1 },
{
"space-before-function-paren": 1,
"keyword-spacing": [1, { before: true }],
indent: 1,
},
[]
);
});
@ -1552,11 +1568,13 @@ describe("verify", () => {
verifyAndAssertMessages(
"var leakedGlobal = 1;",
{ "no-implicit-globals": 1 },
[ "1:5 Implicit global variable, assign as global property instead. no-implicit-globals" ],
[
"1:5 Implicit global variable, assign as global property instead. no-implicit-globals",
],
"script",
{
env: {},
parserOptions: { ecmaVersion: 6, sourceType: "script" }
parserOptions: { ecmaVersion: 6, sourceType: "script" },
}
);
});
@ -1569,7 +1587,7 @@ describe("verify", () => {
"module",
{
env: {},
parserOptions: { ecmaVersion: 6, sourceType: "module" }
parserOptions: { ecmaVersion: 6, sourceType: "module" },
}
);
});
@ -1582,7 +1600,7 @@ describe("verify", () => {
null,
{
env: {},
parserOptions: { ecmaVersion: 6 }
parserOptions: { ecmaVersion: 6 },
}
);
});
@ -1599,26 +1617,23 @@ describe("verify", () => {
"module",
{
env: {},
parserOptions: { ecmaVersion: 6, sourceType: "module", allowImportExportEverywhere: true }
parserOptions: {
ecmaVersion: 6,
sourceType: "module",
allowImportExportEverywhere: true,
},
}
);
});
it("with does not crash parsing in script mode (strict off) #171", () => {
verifyAndAssertMessages(
"with (arguments) { length; }",
{},
[],
"script"
);
verifyAndAssertMessages("with (arguments) { length; }", {}, [], "script");
});
xit("with does crash parsing in module mode (strict on) #171", () => {
verifyAndAssertMessages(
"with (arguments) { length; }",
{},
[ "1:1 Parsing error: 'with' in strict mode" ]
);
verifyAndAssertMessages("with (arguments) { length; }", {}, [
"1:1 Parsing error: 'with' in strict mode",
]);
});
it("new.target is not reported as undef #235", () => {
@ -1723,24 +1738,18 @@ describe("verify", () => {
new A
`),
{ "no-undef": 1, "no-unused-vars": 1, "no-redeclare": 1 },
[
"5:11 'b' is not defined. no-undef"
]
["5:11 'b' is not defined. no-undef"]
);
});
});
it("dynamic import support", () => {
verifyAndAssertMessages(
"import('test-module').then(() => {})",
{},
[]
);
verifyAndAssertMessages("import('test-module').then(() => {})", {}, []);
});
it("regex with es6 unicodeCodePointEscapes", () => {
verifyAndAssertMessages(
"string.replace(/[\u{0000A0}-\u{10FFFF}<>\&]/gmiu, (char) => `&#x${char.codePointAt(0).toString(16)};`);",
"string.replace(/[\u{0000A0}-\u{10FFFF}<>&]/gmiu, (char) => `&#x${char.codePointAt(0).toString(16)};`);",
{},
[]
);

View File

@ -27,7 +27,7 @@ ajv@^4.7.0:
co "^4.6.0"
json-stable-stringify "^1.0.1"
ansi-escapes@^1.1.0:
ansi-escapes@^1.0.0, ansi-escapes@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
@ -39,6 +39,10 @@ ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
app-root-path@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
argparse@^1.0.7:
version "1.0.9"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
@ -259,16 +263,31 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
ci-info@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534"
circular-json@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
cli-cursor@^1.0.1:
cli-cursor@^1.0.1, cli-cursor@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
dependencies:
restore-cursor "^1.0.1"
cli-spinners@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c"
cli-truncate@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
dependencies:
slice-ansi "0.0.4"
string-width "^1.0.1"
cli-width@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
@ -281,7 +300,7 @@ code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
commander@2.9.0:
commander@2.9.0, commander@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
dependencies:
@ -307,12 +326,37 @@ core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
cosmiconfig@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-1.1.0.tgz#0dea0f9804efdfb929fbb1b188e25553ea053d37"
dependencies:
graceful-fs "^4.1.2"
js-yaml "^3.4.3"
minimist "^1.2.0"
object-assign "^4.0.1"
os-homedir "^1.0.1"
parse-json "^2.2.0"
pinkie-promise "^2.0.0"
require-from-string "^1.1.0"
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
dependencies:
lru-cache "^4.0.1"
shebang-command "^1.2.0"
which "^1.2.9"
d@1:
version "1.0.0"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
dependencies:
es5-ext "^0.10.9"
date-fns@^1.27.2:
version "1.28.5"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf"
debug@2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
@ -356,6 +400,16 @@ doctrine@^2.0.0:
esutils "^2.0.2"
isarray "^1.0.0"
elegant-spinner@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
error-ex@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
dependencies:
is-arrayish "^0.2.1"
es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
version "0.10.15"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.15.tgz#c330a5934c1ee21284a7c081a86e5fd937c91ea6"
@ -421,9 +475,9 @@ escope@^3.6.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint-config-babel@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/eslint-config-babel/-/eslint-config-babel-6.0.0.tgz#66feedf6ce6e04abe585cec1a65b5bcc96bed50a"
eslint-config-babel@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/eslint-config-babel/-/eslint-config-babel-7.0.1.tgz#aac7b79f2f06f52358a5a764fdc01fde23718572"
eslint-plugin-flowtype@^2.30.3:
version "2.30.3"
@ -431,6 +485,13 @@ eslint-plugin-flowtype@^2.30.3:
dependencies:
lodash "^4.15.0"
eslint-plugin-prettier@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.1.2.tgz#4b90f4ee7f92bfbe2e926017e1ca40eb628965ea"
dependencies:
fast-diff "^1.1.1"
jest-docblock "^20.0.1"
eslint@^3.18.0:
version "3.18.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.18.0.tgz#647e985c4ae71502d20ac62c109f66d5104c8a4b"
@ -514,15 +575,31 @@ event-emitter@~0.3.5:
d "1"
es5-ext "~0.10.14"
execa@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
dependencies:
cross-spawn "^5.0.1"
get-stream "^3.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
signal-exit "^3.0.0"
strip-eof "^1.0.0"
exit-hook@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
fast-diff@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.1.tgz#0aea0e4e605b6a2189f0e936d4b7fbaf1b7cfd9b"
fast-levenshtein@~2.0.4:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
figures@^1.3.5:
figures@^1.3.5, figures@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
dependencies:
@ -536,6 +613,10 @@ file-entry-cache@^2.0.0:
flat-cache "^1.2.1"
object-assign "^4.0.1"
find-parent-dir@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
flat-cache@^1.2.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96"
@ -559,6 +640,10 @@ generate-object-property@^1.1.0:
dependencies:
is-property "^1.0.0"
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
glob@7.0.5:
version "7.0.5"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95"
@ -618,6 +703,15 @@ has-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
husky@^0.13.2:
version "0.13.4"
resolved "https://registry.yarnpkg.com/husky/-/husky-0.13.4.tgz#48785c5028de3452a51c48c12c4f94b2124a1407"
dependencies:
chalk "^1.1.3"
find-parent-dir "^0.3.0"
is-ci "^1.0.9"
normalize-path "^1.0.0"
ignore@^3.2.0:
version "3.2.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.6.tgz#26e8da0644be0bb4cb39516f6c79f0e0f4ffe48c"
@ -626,6 +720,16 @@ imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
indent-string@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
dependencies:
repeating "^2.0.0"
indent-string@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.1.0.tgz#08ff4334603388399b329e6b9538dc7a3cf5de7d"
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@ -665,6 +769,22 @@ invariant@^2.2.0:
dependencies:
loose-envify "^1.0.0"
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
is-ci@^1.0.9:
version "1.0.10"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e"
dependencies:
ci-info "^1.0.0"
is-finite@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
dependencies:
number-is-nan "^1.0.0"
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
@ -700,6 +820,10 @@ is-path-inside@^1.0.0:
dependencies:
path-is-inside "^1.0.1"
is-promise@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
is-property@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
@ -710,15 +834,27 @@ is-resolvable@^1.0.0:
dependencies:
tryit "^1.0.1"
is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
jest-docblock@^20.0.1:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712"
js-tokens@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
js-yaml@^3.5.1:
js-yaml@^3.4.3, js-yaml@^3.5.1:
version "3.8.2"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.2.tgz#02d3e2c0f6beab20248d412c352203827d786721"
dependencies:
@ -750,6 +886,67 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
lint-staged@^3.6.1:
version "3.6.1"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-3.6.1.tgz#24423c8b7bd99d96e15acd1ac8cb392a78e58582"
dependencies:
app-root-path "^2.0.0"
cosmiconfig "^1.1.0"
execa "^0.7.0"
listr "^0.12.0"
lodash.chunk "^4.2.0"
minimatch "^3.0.0"
npm-which "^3.0.1"
p-map "^1.1.1"
staged-git-files "0.0.4"
listr-silent-renderer@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
listr-update-renderer@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9"
dependencies:
chalk "^1.1.3"
cli-truncate "^0.2.1"
elegant-spinner "^1.0.1"
figures "^1.7.0"
indent-string "^3.0.0"
log-symbols "^1.0.2"
log-update "^1.0.2"
strip-ansi "^3.0.1"
listr-verbose-renderer@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.0.tgz#44dc01bb0c34a03c572154d4d08cde9b1dc5620f"
dependencies:
chalk "^1.1.3"
cli-cursor "^1.0.2"
date-fns "^1.27.2"
figures "^1.7.0"
listr@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a"
dependencies:
chalk "^1.1.3"
cli-truncate "^0.2.1"
figures "^1.7.0"
indent-string "^2.1.0"
is-promise "^2.1.0"
is-stream "^1.1.0"
listr-silent-renderer "^1.1.1"
listr-update-renderer "^0.2.0"
listr-verbose-renderer "^0.4.0"
log-symbols "^1.0.2"
log-update "^1.0.2"
ora "^0.2.3"
p-map "^1.1.1"
rxjs "^5.0.0-beta.11"
stream-to-observable "^0.1.0"
strip-ansi "^3.0.1"
lodash._baseassign@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
@ -773,6 +970,10 @@ lodash._isiterateecall@^3.0.0:
version "3.0.9"
resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
lodash.chunk@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc"
lodash.create@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
@ -805,13 +1006,33 @@ lodash@^4.0.0, lodash@^4.15.0, lodash@^4.2.0, lodash@^4.3.0:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
log-symbols@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
dependencies:
chalk "^1.0.0"
log-update@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
dependencies:
ansi-escapes "^1.0.0"
cli-cursor "^1.0.2"
loose-envify@^1.0.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
dependencies:
js-tokens "^3.0.0"
minimatch@^3.0.2:
lru-cache@^4.0.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
dependencies:
pseudomap "^1.0.2"
yallist "^2.1.2"
minimatch@^3.0.0, minimatch@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
dependencies:
@ -821,6 +1042,10 @@ minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
@ -859,6 +1084,30 @@ natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
normalize-path@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379"
npm-path@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.3.tgz#15cff4e1c89a38da77f56f6055b24f975dfb2bbe"
dependencies:
which "^1.2.10"
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
dependencies:
path-key "^2.0.0"
npm-which@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa"
dependencies:
commander "^2.9.0"
npm-path "^2.0.2"
which "^1.2.10"
number-is-nan@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
@ -888,10 +1137,33 @@ optionator@^0.8.2:
type-check "~0.3.2"
wordwrap "~1.0.0"
os-homedir@^1.0.0:
ora@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
dependencies:
chalk "^1.1.1"
cli-cursor "^1.0.2"
cli-spinners "^0.1.2"
object-assign "^4.0.1"
os-homedir@^1.0.0, os-homedir@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
p-map@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a"
parse-json@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
dependencies:
error-ex "^1.2.0"
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@ -900,6 +1172,10 @@ path-is-inside@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
path-key@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
path-parse@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
@ -926,6 +1202,10 @@ prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
prettier@1.4.4:
version "1.4.4"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.4.4.tgz#a8d1447b14c9bf67e6d420dcadd10fb9a4fad65a"
process-nextick-args@~1.0.6:
version "1.0.7"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
@ -934,6 +1214,10 @@ progress@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
readable-stream@^2.2.2:
version "2.2.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.6.tgz#8b43aed76e71483938d12a8d46c6cf1a00b1f816"
@ -964,6 +1248,16 @@ regenerator-runtime@^0.10.0:
version "0.10.3"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e"
repeating@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
dependencies:
is-finite "^1.0.0"
require-from-string@^1.1.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
require-uncached@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
@ -1004,6 +1298,22 @@ rx-lite@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
rxjs@^5.0.0-beta.11:
version "5.4.1"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.1.tgz#b62f757f279445d265a18a58fb0a70dc90e91626"
dependencies:
symbol-observable "^1.0.1"
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
dependencies:
shebang-regex "^1.0.0"
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
shelljs@^0.7.5:
version "0.7.7"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1"
@ -1012,6 +1322,10 @@ shelljs@^0.7.5:
interpret "^1.0.0"
rechoir "^0.6.2"
signal-exit@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
slice-ansi@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
@ -1020,6 +1334,14 @@ sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
staged-git-files@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35"
stream-to-observable@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe"
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@ -1039,7 +1361,7 @@ string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
strip-ansi@^3.0.0:
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
dependencies:
@ -1049,6 +1371,10 @@ strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
@ -1063,6 +1389,10 @@ supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
symbol-observable@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
table@^3.7.8:
version "3.8.3"
resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
@ -1110,6 +1440,12 @@ util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
which@^1.2.10, which@^1.2.9:
version "1.2.14"
resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
dependencies:
isexe "^2.0.0"
wordwrap@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
@ -1127,3 +1463,7 @@ write@^0.2.1:
xtend@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"