diff options
-rw-r--r-- | lib/utils/split-package-names.js | 23 | ||||
-rw-r--r-- | test/lib/utils/split-package-names.js | 17 |
2 files changed, 40 insertions, 0 deletions
diff --git a/lib/utils/split-package-names.js b/lib/utils/split-package-names.js new file mode 100644 index 000000000..bb6e449ba --- /dev/null +++ b/lib/utils/split-package-names.js @@ -0,0 +1,23 @@ +'use strict' + +const splitPackageNames = (path) => { + return path.split('/') + // combine scoped parts + .reduce((parts, part) => { + if (parts.length === 0) + return [part] + + const lastPart = parts[parts.length - 1] + // check if previous part is the first part of a scoped package + if (lastPart[0] === '@' && !lastPart.includes('/')) + parts[parts.length - 1] += '/' + part + else + parts.push(part) + + return parts + }, []) + .join('/node_modules/') + .replace(/(\/node_modules)+/, '/node_modules') +} + +module.exports = splitPackageNames diff --git a/test/lib/utils/split-package-names.js b/test/lib/utils/split-package-names.js new file mode 100644 index 000000000..c69bb2a3d --- /dev/null +++ b/test/lib/utils/split-package-names.js @@ -0,0 +1,17 @@ +'use strict' + +const { test } = require('tap') +const splitPackageNames = require('../../../lib/utils/split-package-names.js') + +test('splitPackageNames', t => { + const assertions = [ + ['semver', 'semver'], + ['read-pkg/semver', 'read-pkg/node_modules/semver'], + ['@npmcli/one/@npmcli/two', '@npmcli/one/node_modules/@npmcli/two'], + ['@npmcli/one/semver', '@npmcli/one/node_modules/semver'], + ] + + for (const [input, expected] of assertions) + t.equal(splitPackageNames(input), expected, `split ${input} correctly`) + t.end() +}) |