From 61e3fe08c168afac82bb611725e471e4efa5ce9f Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Wed, 21 Nov 2018 21:34:24 -0800 Subject: [PATCH 1/5] Upgrade: typescript-estree@5.1.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index de0704b..9d71956 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "eslint-scope": "^4.0.0", "eslint-visitor-keys": "^1.0.0", "lodash": "^4.17.11", - "typescript-estree": "5.0.0" + "typescript-estree": "^5.1.0" }, "devDependencies": { "eslint": "^4.19.1", @@ -58,7 +58,7 @@ "npm-license": "0.3.3", "shelljs": "0.8.2", "shelljs-nodecli": "0.1.1", - "typescript": "~3.1.1" + "typescript": "^3.1.6" }, "jest": { "testEnvironment": "node", From 53633b82ceb72132b7361153b138ab0d35895c82 Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Thu, 27 Sep 2018 17:14:04 -0700 Subject: [PATCH 2/5] New: Offer parser services from typescript-estree --- parser.js | 10 +- tests/fixtures/services/isolated-file.src.ts | 1 + tests/fixtures/services/tsconfig.json | 8 + tests/lib/__snapshots__/services.js.snap | 356 +++++++++++++++++++ tests/lib/services.js | 58 +++ tools/test-utils.js | 35 +- 6 files changed, 456 insertions(+), 12 deletions(-) create mode 100644 tests/fixtures/services/isolated-file.src.ts create mode 100644 tests/fixtures/services/tsconfig.json create mode 100644 tests/lib/__snapshots__/services.js.snap create mode 100644 tests/lib/services.js diff --git a/parser.js b/parser.js index 51e526a..cbc10c2 100644 --- a/parser.js +++ b/parser.js @@ -8,7 +8,7 @@ "use strict"; -const parse = require("typescript-estree").parse; +const converter = require("typescript-estree"); const astNodeTypes = require("typescript-estree").AST_NODE_TYPES; const traverser = require("eslint/lib/util/traverser"); const analyzeScope = require("./analyze-scope"); @@ -21,6 +21,7 @@ const visitorKeys = require("./visitor-keys"); exports.version = require("./package.json").version; exports.parseForESLint = function parseForESLint(code, options) { + let generateServices = false; if (typeof options !== "object" || options === null) { options = { useJSXTextNode: true }; } else if (typeof options.useJSXTextNode !== "boolean") { @@ -32,8 +33,11 @@ exports.parseForESLint = function parseForESLint(code, options) { options = Object.assign({}, options, { jsx: tsx }); } } + if (typeof options.generateServices === "boolean" && options.generateServices) { + generateServices = true; + } - const ast = parse(code, options); + const { ast, services } = generateServices ? converter.parseAndGenerateServices(code, options) : { ast: converter.parse(code, options) }; const extraOptions = { sourceType: ast.sourceType }; @@ -72,7 +76,7 @@ exports.parseForESLint = function parseForESLint(code, options) { }); const scopeManager = analyzeScope(ast, options, extraOptions); - return { ast, scopeManager, visitorKeys }; + return { ast, services, scopeManager, visitorKeys }; }; exports.parse = function(code, options) { diff --git a/tests/fixtures/services/isolated-file.src.ts b/tests/fixtures/services/isolated-file.src.ts new file mode 100644 index 0000000..ca04667 --- /dev/null +++ b/tests/fixtures/services/isolated-file.src.ts @@ -0,0 +1 @@ +const x = [3, 4, 5]; \ No newline at end of file diff --git a/tests/fixtures/services/tsconfig.json b/tests/fixtures/services/tsconfig.json new file mode 100644 index 0000000..3caa872 --- /dev/null +++ b/tests/fixtures/services/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "strict": true, + "esModuleInterop": true + } +} \ No newline at end of file diff --git a/tests/lib/__snapshots__/services.js.snap b/tests/lib/__snapshots__/services.js.snap new file mode 100644 index 0000000..608c4f7 --- /dev/null +++ b/tests/lib/__snapshots__/services.js.snap @@ -0,0 +1,356 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`services fixtures/isolated-file.src 1`] = ` +Object { + "body": Array [ + Object { + "declarations": Array [ + Object { + "id": Object { + "loc": Object { + "end": Object { + "column": 7, + "line": 1, + }, + "start": Object { + "column": 6, + "line": 1, + }, + }, + "name": "x", + "range": Array [ + 6, + 7, + ], + "type": "Identifier", + }, + "init": Object { + "elements": Array [ + Object { + "loc": Object { + "end": Object { + "column": 12, + "line": 1, + }, + "start": Object { + "column": 11, + "line": 1, + }, + }, + "range": Array [ + 11, + 12, + ], + "raw": "3", + "type": "Literal", + "value": 3, + }, + Object { + "loc": Object { + "end": Object { + "column": 15, + "line": 1, + }, + "start": Object { + "column": 14, + "line": 1, + }, + }, + "range": Array [ + 14, + 15, + ], + "raw": "4", + "type": "Literal", + "value": 4, + }, + Object { + "loc": Object { + "end": Object { + "column": 18, + "line": 1, + }, + "start": Object { + "column": 17, + "line": 1, + }, + }, + "range": Array [ + 17, + 18, + ], + "raw": "5", + "type": "Literal", + "value": 5, + }, + ], + "loc": Object { + "end": Object { + "column": 19, + "line": 1, + }, + "start": Object { + "column": 10, + "line": 1, + }, + }, + "range": Array [ + 10, + 19, + ], + "type": "ArrayExpression", + }, + "loc": Object { + "end": Object { + "column": 19, + "line": 1, + }, + "start": Object { + "column": 6, + "line": 1, + }, + }, + "range": Array [ + 6, + 19, + ], + "type": "VariableDeclarator", + }, + ], + "kind": "const", + "loc": Object { + "end": Object { + "column": 20, + "line": 1, + }, + "start": Object { + "column": 0, + "line": 1, + }, + }, + "range": Array [ + 0, + 20, + ], + "type": "VariableDeclaration", + }, + ], + "comments": Array [], + "loc": Object { + "end": Object { + "column": 20, + "line": 1, + }, + "start": Object { + "column": 0, + "line": 1, + }, + }, + "range": Array [ + 0, + 20, + ], + "sourceType": "script", + "tokens": Array [ + Object { + "loc": Object { + "end": Object { + "column": 5, + "line": 1, + }, + "start": Object { + "column": 0, + "line": 1, + }, + }, + "range": Array [ + 0, + 5, + ], + "type": "Keyword", + "value": "const", + }, + Object { + "loc": Object { + "end": Object { + "column": 7, + "line": 1, + }, + "start": Object { + "column": 6, + "line": 1, + }, + }, + "range": Array [ + 6, + 7, + ], + "type": "Identifier", + "value": "x", + }, + Object { + "loc": Object { + "end": Object { + "column": 9, + "line": 1, + }, + "start": Object { + "column": 8, + "line": 1, + }, + }, + "range": Array [ + 8, + 9, + ], + "type": "Punctuator", + "value": "=", + }, + Object { + "loc": Object { + "end": Object { + "column": 11, + "line": 1, + }, + "start": Object { + "column": 10, + "line": 1, + }, + }, + "range": Array [ + 10, + 11, + ], + "type": "Punctuator", + "value": "[", + }, + Object { + "loc": Object { + "end": Object { + "column": 12, + "line": 1, + }, + "start": Object { + "column": 11, + "line": 1, + }, + }, + "range": Array [ + 11, + 12, + ], + "type": "Numeric", + "value": "3", + }, + Object { + "loc": Object { + "end": Object { + "column": 13, + "line": 1, + }, + "start": Object { + "column": 12, + "line": 1, + }, + }, + "range": Array [ + 12, + 13, + ], + "type": "Punctuator", + "value": ",", + }, + Object { + "loc": Object { + "end": Object { + "column": 15, + "line": 1, + }, + "start": Object { + "column": 14, + "line": 1, + }, + }, + "range": Array [ + 14, + 15, + ], + "type": "Numeric", + "value": "4", + }, + Object { + "loc": Object { + "end": Object { + "column": 16, + "line": 1, + }, + "start": Object { + "column": 15, + "line": 1, + }, + }, + "range": Array [ + 15, + 16, + ], + "type": "Punctuator", + "value": ",", + }, + Object { + "loc": Object { + "end": Object { + "column": 18, + "line": 1, + }, + "start": Object { + "column": 17, + "line": 1, + }, + }, + "range": Array [ + 17, + 18, + ], + "type": "Numeric", + "value": "5", + }, + Object { + "loc": Object { + "end": Object { + "column": 19, + "line": 1, + }, + "start": Object { + "column": 18, + "line": 1, + }, + }, + "range": Array [ + 18, + 19, + ], + "type": "Punctuator", + "value": "]", + }, + Object { + "loc": Object { + "end": Object { + "column": 20, + "line": 1, + }, + "start": Object { + "column": 19, + "line": 1, + }, + }, + "range": Array [ + 19, + 20, + ], + "type": "Punctuator", + "value": ";", + }, + ], + "type": "Program", +} +`; diff --git a/tests/lib/services.js b/tests/lib/services.js new file mode 100644 index 0000000..62bef8d --- /dev/null +++ b/tests/lib/services.js @@ -0,0 +1,58 @@ +/** + * @fileoverview Tests for TypeScript-specific constructs + * @author Benjamin Lichtman + * @copyright jQuery Foundation and other contributors, https://jquery.org/ + * MIT License + */ + +"use strict"; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const path = require("path"), + shelljs = require("shelljs"), + testUtils = require("../../tools/test-utils"); + +//------------------------------------------------------------------------------ +// Setup +//------------------------------------------------------------------------------ + +const FIXTURES_DIR = "./tests/fixtures/services"; + +const testFiles = shelljs.find(FIXTURES_DIR) + .filter(filename => filename.indexOf(".src.ts") > -1) + // strip off ".src.ts" + .map(filename => filename.substring(FIXTURES_DIR.length - 1, filename.length - 7)); + +/** + * @param {string} filename Full path to file being tested + * @returns {Object} Config object + */ +function createConfig(filename) { + return { + filePath: filename, + generateServices: true, + project: "./tsconfig.json", + tsconfigRootDir: path.resolve(FIXTURES_DIR) + }; +} + +//------------------------------------------------------------------------------ +// Tests +//------------------------------------------------------------------------------ + +describe("services", () => { + + testFiles.forEach(filename => { + const fullFileName = `${path.resolve(FIXTURES_DIR, filename)}.src.ts`; + const code = shelljs.cat(fullFileName); + const config = createConfig(fullFileName); + test(`fixtures/${filename}.src`, testUtils.createSnapshotTestBlock(code, config)); + test(`fixtures/${filename}.src services`, () => { + testUtils.testServices(code, config); + }); + }); + +}); diff --git a/tools/test-utils.js b/tools/test-utils.js index f8dfdc5..8e06d04 100644 --- a/tools/test-utils.js +++ b/tools/test-utils.js @@ -20,6 +20,15 @@ const parser = require("../parser"); // Private //-------------------------------------------------------------------------------- +const defaultConfig = { + loc: true, + range: true, + raw: true, + tokens: true, + comment: true, + errorOnUnknownASTType: true +}; + /** * Returns a raw copy of the given AST * @param {Object} ast the AST object @@ -42,14 +51,6 @@ function getRaw(ast) { * @returns {Function} callback for Jest test() block */ function createSnapshotTestBlock(code, config = {}) { - const defaultConfig = { - loc: true, - range: true, - raw: true, - tokens: true, - comment: true, - errorOnUnknownASTType: true - }; config = Object.assign({}, defaultConfig, config); /** @@ -78,7 +79,23 @@ function createSnapshotTestBlock(code, config = {}) { } +/** + * @param {string} code The code being parsed + * @param {Object} config The configuration object for the parser + * @returns {void} + */ +function testServices(code, config = {}) { + config = Object.assign({}, defaultConfig, config); + + const services = parser.parseForESLint(code, config).services; + expect(services).toBeDefined(); + expect(services.program).toBeDefined(); + expect(services.esTreeNodeToTSNodeMap).toBeDefined(); + expect(services.tsNodeToESTreeNodeMap).toBeDefined(); +} + module.exports = { getRaw, - createSnapshotTestBlock + createSnapshotTestBlock, + testServices }; From dd11561d2f197469f6d86280595a276fe1a4d20a Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Mon, 26 Nov 2018 14:03:07 -0800 Subject: [PATCH 3/5] Upgrade: Revert change to typescript version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9d71956..5b39a3e 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "npm-license": "0.3.3", "shelljs": "0.8.2", "shelljs-nodecli": "0.1.1", - "typescript": "^3.1.6" + "typescript": "~3.1.1" }, "jest": { "testEnvironment": "node", From 5094e981b9fe07a2d98cd6f1d47aef2a0ee78e71 Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Thu, 6 Dec 2018 09:22:33 -0800 Subject: [PATCH 4/5] Breaking: remove flag for producing services --- parser.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/parser.js b/parser.js index cbc10c2..22552f0 100644 --- a/parser.js +++ b/parser.js @@ -8,7 +8,7 @@ "use strict"; -const converter = require("typescript-estree"); +const parse = require("typescript-estree").parseAndGenerateServices; const astNodeTypes = require("typescript-estree").AST_NODE_TYPES; const traverser = require("eslint/lib/util/traverser"); const analyzeScope = require("./analyze-scope"); @@ -21,7 +21,6 @@ const visitorKeys = require("./visitor-keys"); exports.version = require("./package.json").version; exports.parseForESLint = function parseForESLint(code, options) { - let generateServices = false; if (typeof options !== "object" || options === null) { options = { useJSXTextNode: true }; } else if (typeof options.useJSXTextNode !== "boolean") { @@ -33,11 +32,8 @@ exports.parseForESLint = function parseForESLint(code, options) { options = Object.assign({}, options, { jsx: tsx }); } } - if (typeof options.generateServices === "boolean" && options.generateServices) { - generateServices = true; - } - const { ast, services } = generateServices ? converter.parseAndGenerateServices(code, options) : { ast: converter.parse(code, options) }; + const { ast, services } = parse(code, options); const extraOptions = { sourceType: ast.sourceType }; From d12847d0419f60c4fe4f9cf7ee34a362e26feb02 Mon Sep 17 00:00:00 2001 From: Benjamin Lichtman Date: Thu, 27 Dec 2018 10:31:29 -0800 Subject: [PATCH 5/5] Upgrade: typescript-estree@7.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fc21e87..3b86728 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "dependencies": { "eslint-scope": "^4.0.0", "eslint-visitor-keys": "^1.0.0", - "typescript-estree": "5.3.0" + "typescript-estree": "^7.0.1" }, "devDependencies": { "eslint": "^4.19.1",