blob: 899e552e96cbd074432c7157e70b23a931437806 [file] [log] [blame]
Tim van der Lippea6619412021-09-13 14:28:55 +02001'use strict';
Tim van der Lippefdbd42e2020-04-07 15:14:36 +01002
Tim van der Lippea6619412021-09-13 14:28:55 +02003const resolve = require('resolve');
4const path = require('path');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +01005
Tim van der Lippea6619412021-09-13 14:28:55 +02006const log = require('debug')('eslint-plugin-import:resolver:node');
7
8exports.interfaceVersion = 2;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +01009
10exports.resolve = function (source, file, config) {
Tim van der Lippea6619412021-09-13 14:28:55 +020011 log('Resolving:', source, 'from:', file);
12 let resolvedPath;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010013
14 if (resolve.isCore(source)) {
Tim van der Lippea6619412021-09-13 14:28:55 +020015 log('resolved to core');
16 return { found: true, path: null };
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010017 }
18
19 try {
Tim van der Lippea6619412021-09-13 14:28:55 +020020 const cachedFilter = function (pkg, dir) { return packageFilter(pkg, dir, config); };
21 resolvedPath = resolve.sync(source, opts(file, config, cachedFilter));
22 log('Resolved to:', resolvedPath);
23 return { found: true, path: resolvedPath };
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010024 } catch (err) {
Tim van der Lippea6619412021-09-13 14:28:55 +020025 log('resolve threw error:', err);
26 return { found: false };
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010027 }
Tim van der Lippea6619412021-09-13 14:28:55 +020028};
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010029
Tim van der Lippea6619412021-09-13 14:28:55 +020030function opts(file, config, packageFilter) {
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010031 return Object.assign({
Tim van der Lippea6619412021-09-13 14:28:55 +020032 // more closely matches Node (#333)
33 // plus 'mjs' for native modules! (#939)
34 extensions: ['.mjs', '.js', '.json', '.node'],
35 },
36 config,
37 {
38 // path.resolve will handle paths relative to CWD
39 basedir: path.dirname(path.resolve(file)),
40 packageFilter,
41 });
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010042}
43
Tim van der Lippea6619412021-09-13 14:28:55 +020044function identity(x) { return x; }
45
46function packageFilter(pkg, dir, config) {
47 let found = false;
48 const file = path.join(dir, 'dummy.js');
49 if (pkg.module) {
50 try {
51 resolve.sync(String(pkg.module).replace(/^(?:\.\/)?/, './'), opts(file, config, identity));
52 pkg.main = pkg.module;
53 found = true;
54 } catch (err) {
55 log('resolve threw error trying to find pkg.module:', err);
56 }
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010057 }
Tim van der Lippea6619412021-09-13 14:28:55 +020058 if (!found && pkg['jsnext:main']) {
59 try {
60 resolve.sync(String(pkg['jsnext:main']).replace(/^(?:\.\/)?/, './'), opts(file, config, identity));
61 pkg.main = pkg['jsnext:main'];
62 found = true;
63 } catch (err) {
64 log('resolve threw error trying to find pkg[\'jsnext:main\']:', err);
65 }
66 }
67 return pkg;
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010068}