Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGar <gar+gh@danger.computer>2021-09-09 18:21:56 +0300
committerGar <gar+gh@danger.computer>2021-09-09 22:34:53 +0300
commit6c12500ae14a6f8b78e3ab091ee6cc8e2ea9fd23 (patch)
treebc03898baff2fd541485d865cfe038e1dfeadb2f /test
parent1ad0938243110d983284e8763da41a57b561563d (diff)
feat(install): very strict global npm engines
This will do an engines check when installing npm globally and fail if the new npm is known not to work in the current node version. It will not work for older npm versions because they don't have an engines field (it wasn't added till npm@6.14.0). It will at least prevent npm@7 from being installed in node@8. PR-URL: https://github.com/npm/cli/pull/3731 Credit: @wraithgar Close: #3731 Reviewed-by: @nlf
Diffstat (limited to 'test')
-rw-r--r--test/lib/install.js140
1 files changed, 140 insertions, 0 deletions
diff --git a/test/lib/install.js b/test/lib/install.js
index 6412b34c1..2cbee02e6 100644
--- a/test/lib/install.js
+++ b/test/lib/install.js
@@ -126,6 +126,146 @@ t.test('should install globally using Arborist', (t) => {
})
})
+t.test('npm i -g npm engines check success', (t) => {
+ const Install = t.mock('../../lib/install.js', {
+ '../../lib/utils/reify-finish.js': async () => {},
+ '@npmcli/arborist': function () {
+ this.reify = () => {}
+ },
+ pacote: {
+ manifest: () => {
+ return {
+ version: '100.100.100',
+ engines: {
+ node: '>1',
+ },
+ }
+ },
+ },
+ })
+ const npm = mockNpm({
+ globalDir: 'path/to/node_modules/',
+ config: {
+ global: true,
+ },
+ })
+ const install = new Install(npm)
+ install.exec(['npm'], er => {
+ if (er)
+ throw er
+ t.end()
+ })
+})
+
+t.test('npm i -g npm engines check failure', (t) => {
+ const Install = t.mock('../../lib/install.js', {
+ pacote: {
+ manifest: () => {
+ return {
+ _id: 'npm@1.2.3',
+ version: '100.100.100',
+ engines: {
+ node: '>1000',
+ },
+ }
+ },
+ },
+ })
+ const npm = mockNpm({
+ globalDir: 'path/to/node_modules/',
+ config: {
+ global: true,
+ },
+ })
+ const install = new Install(npm)
+ install.exec(['npm'], er => {
+ t.match(er, {
+ message: 'Unsupported engine',
+ pkgid: 'npm@1.2.3',
+ current: {
+ node: process.version,
+ npm: '100.100.100',
+ },
+ required: {
+ node: '>1000',
+ },
+ code: 'EBADENGINE',
+ })
+ t.end()
+ })
+})
+
+t.test('npm i -g npm engines check failure forced override', (t) => {
+ const Install = t.mock('../../lib/install.js', {
+ '../../lib/utils/reify-finish.js': async () => {},
+ '@npmcli/arborist': function () {
+ this.reify = () => {}
+ },
+ pacote: {
+ manifest: () => {
+ return {
+ _id: 'npm@1.2.3',
+ version: '100.100.100',
+ engines: {
+ node: '>1000',
+ },
+ }
+ },
+ },
+ })
+ const npm = mockNpm({
+ globalDir: 'path/to/node_modules/',
+ config: {
+ force: true,
+ global: true,
+ },
+ })
+ const install = new Install(npm)
+ install.exec(['npm'], er => {
+ if (er)
+ throw er
+ t.end()
+ })
+})
+
+t.test('npm i -g npm@version engines check failure', (t) => {
+ const Install = t.mock('../../lib/install.js', {
+ pacote: {
+ manifest: () => {
+ return {
+ _id: 'npm@1.2.3',
+ version: '100.100.100',
+ engines: {
+ node: '>1000',
+ },
+ }
+ },
+ },
+ })
+ const npm = mockNpm({
+ globalDir: 'path/to/node_modules/',
+ config: {
+ global: true,
+ },
+ })
+ const install = new Install(npm)
+ install.exec(['npm@100'], er => {
+ t.match(er, {
+ message: 'Unsupported engine',
+ pkgid: 'npm@1.2.3',
+ current: {
+ node: process.version,
+ npm: '100.100.100',
+ },
+ required: {
+ node: '>1000',
+ },
+ code: 'EBADENGINE',
+ })
+ t.end()
+ })
+})
+
t.test('completion to folder', async t => {
const Install = t.mock('../../lib/install.js', {
'../../lib/utils/reify-finish.js': async () => {},