diff --git a/package.json b/package.json index e35f4aa..2b22e73 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,11 @@ "babel-preset-stage-0": "^6.24.1", "babel-register": "^6.24.1", "chai": "^4.0.1", + "date-fns": "^1.28.5", "lodash-bound": "^1.1.2", "lodash-compat": "^3.10.2", "lodash-es": "^4.17.4", + "material-ui": "^0.18.3", "mocha": "^3.4.2", "ramda": "^0.24.1", "react-bootstrap": "^0.31.0" diff --git a/src/ModuleCache.js b/src/ModuleCache.js index ab86b79..2034695 100644 --- a/src/ModuleCache.js +++ b/src/ModuleCache.js @@ -28,6 +28,13 @@ export default class ModuleCache extends MapCache { _.each(dirPaths, dirPath => { const base = path.relative(moduleRoot, dirPath); const filePaths = glob.sync(path.join(dirPath, '*.js')); + if (base && _.includes(filePaths, path.join(dirPath, 'index.js'))) { + const indexEntry = path.parse(base); + const parentMap = this.get(indexEntry.dir); + if (parentMap && !parentMap.get(indexEntry.base.toLowerCase())) { + parentMap.set(indexEntry.base.toLowerCase(), indexEntry.base); + } + } const pairs = _.map(filePaths, filePath => { const name = path.basename(filePath, '.js'); return [name.toLowerCase(), name]; diff --git a/src/importModule.js b/src/importModule.js index 698b3eb..775795c 100644 --- a/src/importModule.js +++ b/src/importModule.js @@ -5,11 +5,12 @@ import mapping from './mapping'; function resolvePath(pkgStore, name, path) { let { base, id } = pkgStore; - const lower = name.toLowerCase(); const module = mapping.modules.get(id); - - if (!module.get(base).has(lower)) { - base = base ? '' : module.findKey(map => map.has(lower)); + const nameCases = [name.toLowerCase(), _.kebabCase(name), _.snakeCase(name)]; + let realName = _.find(nameCases, n => module.get(base).has(n)); + + if (!realName) { + base = base ? '' : module.findKey(map => realName = _.find(nameCases, n => map.has(n))); if (!base) { throw path.buildCodeFrameError([ `The '${ id }' method \`${ name }\` is not a known module.`, @@ -17,7 +18,7 @@ function resolvePath(pkgStore, name, path) { ].join('\n')); } } - return id + '/' + (base ? base + '/' : '') + module.get(base).get(lower); + return id + '/' + (base ? base + '/' : '') + module.get(base).get(realName); } function importModule(pkgStore, name, path) { diff --git a/src/index.js b/src/index.js index b9855d9..1decf59 100644 --- a/src/index.js +++ b/src/index.js @@ -117,7 +117,7 @@ export default function lodash({ types }) { }, ImportDeclaration(path) { - if (store.get(path.node.source.value)) { + if (path.node.source.loc && store.get(path.node.source.value)) { // Remove old import. path.remove(); } diff --git a/test/mixed-fixtures/date-fns/.babelrc b/test/mixed-fixtures/date-fns/.babelrc new file mode 100644 index 0000000..840ce4f --- /dev/null +++ b/test/mixed-fixtures/date-fns/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + ["env", { "targets": { "node": 4 } }] + ] +} diff --git a/test/mixed-fixtures/date-fns/actual.js b/test/mixed-fixtures/date-fns/actual.js new file mode 100644 index 0000000..62e0078 --- /dev/null +++ b/test/mixed-fixtures/date-fns/actual.js @@ -0,0 +1,5 @@ +import dt from 'date-fns'; +import { isToday } from 'date-fns'; + +dt.isTomorrow(Date.now()); +isToday(Date.now()); diff --git a/test/mixed-fixtures/date-fns/expected.js b/test/mixed-fixtures/date-fns/expected.js new file mode 100644 index 0000000..05dc9f6 --- /dev/null +++ b/test/mixed-fixtures/date-fns/expected.js @@ -0,0 +1,14 @@ +'use strict'; + +var _is_today = require('date-fns/is_today'); + +var _is_today2 = _interopRequireDefault(_is_today); + +var _is_tomorrow = require('date-fns/is_tomorrow'); + +var _is_tomorrow2 = _interopRequireDefault(_is_tomorrow); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +(0, _is_tomorrow2.default)(Date.now()); +(0, _is_today2.default)(Date.now()); diff --git a/test/mixed-fixtures/date-fns/options.json b/test/mixed-fixtures/date-fns/options.json new file mode 100644 index 0000000..b97c4e1 --- /dev/null +++ b/test/mixed-fixtures/date-fns/options.json @@ -0,0 +1,3 @@ +{ + "id": "date-fns" +} diff --git a/test/mixed-fixtures/material-ui/.babelrc b/test/mixed-fixtures/material-ui/.babelrc new file mode 100644 index 0000000..191273c --- /dev/null +++ b/test/mixed-fixtures/material-ui/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + ["env", { "targets": { "node": 4 } }], + "react" + ] +} diff --git a/test/mixed-fixtures/material-ui/actual.js b/test/mixed-fixtures/material-ui/actual.js new file mode 100644 index 0000000..d8024e0 --- /dev/null +++ b/test/mixed-fixtures/material-ui/actual.js @@ -0,0 +1,8 @@ +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; +import { AppBar } from 'material-ui'; + + + + + +export { AutoComplete } from 'material-ui'; \ No newline at end of file diff --git a/test/mixed-fixtures/material-ui/expected.js b/test/mixed-fixtures/material-ui/expected.js new file mode 100644 index 0000000..4f6299e --- /dev/null +++ b/test/mixed-fixtures/material-ui/expected.js @@ -0,0 +1,28 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.AutoComplete = undefined; + +var _AutoComplete2 = require('material-ui/AutoComplete'); + +var _AutoComplete3 = _interopRequireDefault(_AutoComplete2); + +var _AppBar2 = require('material-ui/AppBar'); + +var _AppBar3 = _interopRequireDefault(_AppBar2); + +var _MuiThemeProvider = require('material-ui/styles/MuiThemeProvider'); + +var _MuiThemeProvider2 = _interopRequireDefault(_MuiThemeProvider); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +React.createElement( + _MuiThemeProvider2.default, + null, + React.createElement(_AppBar3.default, null) +); + +exports.AutoComplete = _AutoComplete3.default; diff --git a/test/mixed-fixtures/material-ui/options.json b/test/mixed-fixtures/material-ui/options.json new file mode 100644 index 0000000..f7fe8bb --- /dev/null +++ b/test/mixed-fixtures/material-ui/options.json @@ -0,0 +1,3 @@ +{ + "id": "material-ui" +}