diff --git a/CHANGELOG.md b/CHANGELOG.md index 47ac8f6..5b4cd55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [unreleased] +## [1.0.3-dev.10] - 2018-07-09 + +- fix error "Cannot read property push of undefined" when a resolver throws an exception +- fix the resolver for an unknown extension + ## [1.0.3-dev.9] - 2018-07-06 - bug fix - on Linux module path (require('a.js')) is resolved as relative path (require('./a.js')) diff --git a/package.json b/package.json index 1418a8d..269c950 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bit-javascript", - "version": "1.0.3-dev.9", + "version": "1.0.3-dev.10", "scripts": { "flow": "flow; test $? -eq 0 -o $? -eq 2", "lint": "eslint src && flow check || true", diff --git a/src/dependency-builder/build-tree.js b/src/dependency-builder/build-tree.js index d07984a..4dbaa78 100644 --- a/src/dependency-builder/build-tree.js +++ b/src/dependency-builder/build-tree.js @@ -348,9 +348,8 @@ function mergeMissingToTree(missingGroups, tree: Tree) { function mergeErrorsToTree(baseDir, errors, tree: Tree) { if (R.isEmpty(errors)) return; Object.keys(errors).forEach((file) => { - const relativeFile = processPath(file, {}, baseDir); - if (tree[relativeFile]) tree[relativeFile].error = errors[file]; - else tree[relativeFile] = { error: errors[file] }; + if (tree[file]) tree[file].error = errors[file]; + else tree[file] = { error: errors[file] }; }); } @@ -361,13 +360,6 @@ function groupBySupportedFiles(filePaths: string[]) { return R.groupBy(supportCriteria, filePaths); } -function mergeUnsupportedFilesToTree(baseDir, unsupportedFiles: string[], tree: Tree) { - unsupportedFiles.forEach((file) => { - const relativeFile = processPath(file, {}, baseDir); - tree[relativeFile] = {}; - }); -} - /** * Function for fetching dependency tree of file or dir * @param baseDir working directory @@ -394,14 +386,13 @@ export async function getDependencyTree({ resolveConfig: resolveConfigAbsolute }; const { supportedFiles, unsupportedFiles } = groupBySupportedFiles(filePaths); - const { madgeTree, skipped, pathMap, errors } = generateTree(supportedFiles, config); + const { madgeTree, skipped, pathMap, errors } = generateTree(supportedFiles, unsupportedFiles, config); const tree: Tree = groupDependencyTree(madgeTree, baseDir, bindingPrefix); const { missingGroups, foundPackages } = groupMissing(skipped, baseDir, consumerPath, bindingPrefix); if (foundPackages) mergeManuallyFoundPackagesToTree(foundPackages, missingGroups, tree); if (errors) mergeErrorsToTree(baseDir, errors, tree); if (missingGroups) mergeMissingToTree(missingGroups, tree); - if (unsupportedFiles) mergeUnsupportedFilesToTree(baseDir, unsupportedFiles, tree); if (pathMap) updateTreeWithPathMap(tree, pathMap, baseDir); return { tree }; diff --git a/src/dependency-builder/filing-cabinet/index.js b/src/dependency-builder/filing-cabinet/index.js index fd779cf..2eceff5 100644 --- a/src/dependency-builder/filing-cabinet/index.js +++ b/src/dependency-builder/filing-cabinet/index.js @@ -78,7 +78,8 @@ module.exports = function cabinet(options: Options) { const getResolverResults = () => { // old resolver are not getting an object parameter - if (resolver.name === 'resolveDependencyPath' || ext === '.styl') { + if (resolver.length > 1) { + // check whether the 'resolver' function gets more than one parameter // $FlowFixMe return resolver(partial, filename, directory); } diff --git a/src/dependency-builder/filing-cabinet/index.spec.js b/src/dependency-builder/filing-cabinet/index.spec.js index a1489cb..914417a 100644 --- a/src/dependency-builder/filing-cabinet/index.spec.js +++ b/src/dependency-builder/filing-cabinet/index.spec.js @@ -480,6 +480,18 @@ describe('filing-cabinet', () => { }); }); + describe('unrecognized extension', () => { + it('uses a generic resolve for unsupported file extensions', () => { + const result = cabinet({ + partial: './bar', + filename: 'barbazim/foo.baz', + directory: 'barbazim/' + }); + + assert.equal(result, path.normalize(`${mockRootDir}/barbazim/bar.baz`)); + }); + }); + describe('.register', () => { it('registers a custom resolver for a given extension', () => { const stub = sinon.stub().returns('foo.foobar'); diff --git a/src/dependency-builder/generate-tree-madge.js b/src/dependency-builder/generate-tree-madge.js index 30f1142..635e4ff 100644 --- a/src/dependency-builder/generate-tree-madge.js +++ b/src/dependency-builder/generate-tree-madge.js @@ -111,7 +111,7 @@ function convertTree(depTree, tree, pathCache, baseDir) { * @param config * @return {Object} */ -export default function generateTree(files = [], config) { +export default function generateTree(files = [], unsupportedFiles = [], config) { const depTree = {}; const visited = {}; const nonExistent = {}; @@ -159,13 +159,28 @@ export default function generateTree(files = [], config) { }); let tree = convertTree(depTree, {}, pathCache, config.baseDir); - for (const npmKey in npmPaths) { - const id = processPath(npmKey, pathCache, config.baseDir); + unsupportedFiles.forEach((file) => { + const relativeFile = processPath(file, pathCache, config.baseDir); + if (!tree[relativeFile]) tree[relativeFile] = []; + }); + + // rename errors keys from absolute paths to relative paths + Object.keys(errors).forEach((file) => { + const relativeFile = processPath(file, pathCache, config.baseDir); + if (relativeFile !== file) { + errors[relativeFile] = errors[file]; + delete errors[file]; + } + }); + + Object.keys(npmPaths).forEach((npmKey) => { + const id = processPath(npmKey, pathCache, config.baseDir); + if (!tree[id] && errors[id]) return; // if a file has errors, it won't be in the tree object but in the errors object npmPaths[npmKey].forEach((npmPath) => { tree[id].push(processPath(npmPath, pathCache, config.baseDir)); }); - } + }); if (config.excludeRegExp) { tree = exclude(tree, config.excludeRegExp);