Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 1 | 'use strict'; |
| 2 | exports.__esModule = true; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 3 | |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 4 | const moduleRequire = require('./module-require').default; |
| 5 | const extname = require('path').extname; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 6 | |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 7 | const log = require('debug')('eslint-plugin-import:parse'); |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 8 | |
| 9 | exports.default = function parse(path, content, context) { |
| 10 | |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 11 | if (context == null) throw new Error('need context to parse properly'); |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 12 | |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 13 | let parserOptions = context.parserOptions; |
| 14 | const parserPath = getParserPath(path, context); |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 15 | |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 16 | if (!parserPath) throw new Error('parserPath is required!'); |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 17 | |
| 18 | // hack: espree blows up with frozen options |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 19 | parserOptions = Object.assign({}, parserOptions); |
| 20 | parserOptions.ecmaFeatures = Object.assign({}, parserOptions.ecmaFeatures); |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 21 | |
| 22 | // always include comments and tokens (for doc parsing) |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 23 | parserOptions.comment = true; |
| 24 | parserOptions.attachComment = true; // keeping this for backward-compat with older parsers |
| 25 | parserOptions.tokens = true; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 26 | |
| 27 | // attach node locations |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 28 | parserOptions.loc = true; |
| 29 | parserOptions.range = true; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 30 | |
| 31 | // provide the `filePath` like eslint itself does, in `parserOptions` |
| 32 | // https://github.com/eslint/eslint/blob/3ec436ee/lib/linter.js#L637 |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 33 | parserOptions.filePath = path; |
| 34 | |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 35 | // @typescript-eslint/parser will parse the entire project with typechecking if you provide |
| 36 | // "project" or "projects" in parserOptions. Removing these options means the parser will |
| 37 | // only parse one file in isolate mode, which is much, much faster. |
Tim van der Lippe | a661941 | 2021-09-13 14:28:55 +0200 | [diff] [blame^] | 38 | // https://github.com/import-js/eslint-plugin-import/issues/1408#issuecomment-509298962 |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 39 | delete parserOptions.project; |
| 40 | delete parserOptions.projects; |
| 41 | |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 42 | // require the parser relative to the main module (i.e., ESLint) |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 43 | const parser = moduleRequire(parserPath); |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 44 | |
| 45 | if (typeof parser.parseForESLint === 'function') { |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 46 | let ast; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 47 | try { |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 48 | ast = parser.parseForESLint(content, parserOptions).ast; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 49 | } catch (e) { |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 50 | console.warn(); |
| 51 | console.warn('Error while parsing ' + parserOptions.filePath); |
| 52 | console.warn('Line ' + e.lineNumber + ', column ' + e.column + ': ' + e.message); |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 53 | } |
| 54 | if (!ast || typeof ast !== 'object') { |
Tim van der Lippe | a661941 | 2021-09-13 14:28:55 +0200 | [diff] [blame^] | 55 | console.warn('`parseForESLint` from parser `' + parserPath + '` is invalid and will just be ignored'); |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 56 | } else { |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 57 | return ast; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 58 | } |
| 59 | } |
| 60 | |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 61 | return parser.parse(content, parserOptions); |
| 62 | }; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 63 | |
| 64 | function getParserPath(path, context) { |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 65 | const parsers = context.settings['import/parsers']; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 66 | if (parsers != null) { |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 67 | const extension = extname(path); |
| 68 | for (const parserPath in parsers) { |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 69 | if (parsers[parserPath].indexOf(extension) > -1) { |
| 70 | // use this alternate parser |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 71 | log('using alt parser:', parserPath); |
| 72 | return parserPath; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 73 | } |
| 74 | } |
| 75 | } |
| 76 | // default to use ESLint parser |
Tim van der Lippe | 2c89197 | 2021-07-29 16:22:50 +0100 | [diff] [blame] | 77 | return context.parserPath; |
Tim van der Lippe | fdbd42e | 2020-04-07 15:14:36 +0100 | [diff] [blame] | 78 | } |