Skip to content
This repository has been archived by the owner on Jun 8, 2023. It is now read-only.

Use babel's built-in option manager for loading configs #34

Merged
merged 1 commit into from
Dec 26, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"plugins": [
["transform-object-rest-spread", { "useBuiltIns": true }]
]
}
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ node_modules/
npm-debug.log

coverage/
.nyc_output
lib/
72 changes: 0 additions & 72 deletions lib/index.js

This file was deleted.

13 changes: 10 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"name": "eslint-import-resolver-babel-module",
"version": "2.2.1",
"main": "src/index.js",
"main": "lib/index.js",
"description": "babel-plugin-module-resolver resolver for eslint-plugin-import",
"repository": {
"type": "git",
"url": "https://github.com/tleunen/eslint-import-resolver-babel-module.git"
},
"files": [
"src"
"lib"
],
"author": "Tommy Leunen <[email protected]> (https://tommyleunen.com)",
"license": "MIT",
Expand All @@ -29,11 +29,15 @@
"import"
],
"dependencies": {
"find-babel-config": "^1.0.1",
"pkg-up": "^1.0.0",
"resolve": "^1.2.0"
},
"devDependencies": {
"babel-cli": "^6.18.0",
"babel-core": "^6.21.0",
"babel-jest": "^18.0.0",
"babel-plugin-module-resolver": "^2.4.0",
"babel-plugin-transform-object-rest-spread": "^6.20.2",
"eslint": "^3.12.2",
"eslint-config-tleunen": "^1.0.0",
"eslint-plugin-import": "^2.2.0",
Expand All @@ -42,14 +46,17 @@
"standard-version": "^4.0.0"
},
"peerDependencies": {
"babel-core": "^6.0.0",
"babel-plugin-module-resolver": "^2.4.0"
},
"scripts": {
"lint": "eslint src test",
"compile": "babel src --out-dir lib",
"pretest": "npm run lint",
"test": "jest --coverage",
"test:suite": "jest",
"test:watch": "jest --watch",
"prepublish": "npm run compile",
"release": "standard-version"
},
"jest": {
Expand Down
82 changes: 36 additions & 46 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,41 @@

const path = require('path');
const resolve = require('resolve');
const pkgUp = require('pkg-up');
const targetPlugin = require('babel-plugin-module-resolver').default;
const mapModule = require('babel-plugin-module-resolver').mapModule;
const findBabelConfig = require('find-babel-config'); // eslint-disable-line
const OptionManager = require('babel-core').OptionManager;

function findModuleAliasConfig(conf) {
if (conf.plugins) {
return conf.plugins.find(p => p[0] === 'module-resolver' || p[0] === 'babel-plugin-module-resolver');
}
return null;
}

function getPluginOpts(config) {
const env = process.env.BABEL_ENV || process.env.NODE_ENV || 'development';

if (config) {
const pluginConfig = findModuleAliasConfig(config);
function getPlugins(file, target) {
try {
const manager = new OptionManager();
const result = manager.init({
babelrc: true,
filename: file,
});

if (config.env && config.env[env]) {
const envPluginConfig = findModuleAliasConfig(config.env[env]);
if (envPluginConfig) {
if (pluginConfig) {
return {
root: [].concat(pluginConfig[1].root, envPluginConfig[1].root),
alias: Object.assign({}, pluginConfig[1].alias, envPluginConfig[1].alias),
};
}
return envPluginConfig[1];
}
}
return result.plugins.filter((plugin) => {
const plug = OptionManager.memoisedPlugins.find(item =>
item.plugin === plugin[0],
);

if (pluginConfig) {
return pluginConfig[1];
}
return plug && plug.container === target;
});
} catch (err) {
// This error should only occur if something goes wrong with babel's
// internals. Dump it to console so people know what's going on,
// elsewise the error will simply be squelched in the calling code.
console.error('[eslint-import-resolver-babel-module]', err);
console.error('See: https://github.com/tleunen/eslint-import-resolver-babel-module/pull/34');
return [];
}

return {};
}

function opts(file, config) {
return Object.assign(
{},
config,
{ basedir: path.dirname(file) },
);
return {
...config,
basedir: path.dirname(file),
};
}

exports.interfaceVersion = 2;
Expand All @@ -61,20 +53,18 @@ exports.interfaceVersion = 2;
exports.resolve = (source, file, options) => {
if (resolve.isCore(source)) return { found: true, path: null };

const babelConfig = findBabelConfig.sync(path.dirname(file));
const babelrcPath = babelConfig.file;
const config = babelConfig.config;
let cwd = babelrcPath
? path.dirname(babelrcPath)
: process.cwd();
const projectRootDir = path.dirname(pkgUp.sync(file));

try {
const pluginOpts = getPluginOpts(config);
if (pluginOpts.cwd !== 'babelrc') {
cwd = pluginOpts.cwd || cwd;
}
const instances = getPlugins(file, targetPlugin);

const pluginOpts = instances.reduce((config, plugin) => ({
cwd: plugin[1] && plugin[1].cwd ? plugin[1].cwd : config.cwd,
root: config.root.concat(plugin[1] && plugin[1].root ? plugin[1].root : []),
alias: Object.assign(config.alias, plugin[1] ? plugin[1].alias : {}),
}), { root: [], alias: {}, cwd: projectRootDir });

const src = mapModule(source, file, pluginOpts, cwd) || source;
const src = mapModule(source, file, pluginOpts, path.resolve(pluginOpts.cwd)) || source;
return {
found: true,
path: resolve.sync(src, opts(file, options)),
Expand Down
4 changes: 2 additions & 2 deletions test/.babelrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"plugins": [
["module-resolver", {
"alias": {
"components": "./examples/components",
"components": "./test/examples/components",
"underscore": "npm:lodash"
}
}]
Expand All @@ -12,7 +12,7 @@
"plugins": [
["babel-plugin-module-resolver", {
"alias": {
"subsub": "./examples/components/sub/sub"
"subsub": "./test/examples/components/sub/sub"
}
}]
]
Expand Down
13 changes: 0 additions & 13 deletions test/examples/components/sub/envonly/.babelrc

This file was deleted.

28 changes: 28 additions & 0 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
'use strict';

const path = require('path');
const OptionManager = require('babel-core').OptionManager;
const resolverPlugin = require('../src/index');

const opts = {};
Expand Down Expand Up @@ -134,4 +135,31 @@ describe('eslint-import-resolver-module-resolver', () => {
});
});
});

describe('babel internals', () => {
let oldInit;
let error;

beforeEach(() => {
oldInit = OptionManager.prototype.init;
error = console.error;
});
afterEach(() => {
OptionManager.prototype.init = oldInit;
console.error = error;
});

it('should survive babel blowing up', () => {
console.error = jest.fn();

OptionManager.prototype.init = undefined;

expect(resolverPlugin.resolve('underscore', path.resolve('./test/examples/file1'), opts))
.toEqual({
found: false,
});

expect(console.error).toBeCalled();
});
});
});