From 868954a72c06ff2210b35e1e75571f4ec3357c43 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Mon, 8 Feb 2021 13:49:04 -0800 Subject: [PATCH] [fix] node v10.0 lacks `fs.promises` In this node version, fall back to `util.promisify` of the callback version. Maybe fixes https://github.com/npm/cli/issues/2623. Maybe fixes https://github.com/npm/cli/issues/2652. Maybe fixes https://github.com/npm/cli/issues/2625. PR-URL: https://github.com/npm/cli/pull/2654 Credit: @ljharb Close: #2654 Reviewed-by: @wraithgar, @ruyadorno --- .github/workflows/ci.yml | 2 +- lib/shrinkwrap.js | 4 +++- lib/utils/reify-finish.js | 4 +++- test/lib/shrinkwrap.js | 8 ++++++++ test/lib/utils/reify-finish.js | 10 +++++++++- 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 939f295e99c8..851b3fdcb9fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [10.x, 12.x, 14.x] + node-version: ['10.1', 10.x, '12.1', 12.x, '14.1', 14.x] platform: - os: ubuntu-latest shell: bash diff --git a/lib/shrinkwrap.js b/lib/shrinkwrap.js index 74e129297b6c..60e49f3c82e9 100644 --- a/lib/shrinkwrap.js +++ b/lib/shrinkwrap.js @@ -1,5 +1,7 @@ const { resolve, basename } = require('path') -const { promises: { unlink } } = require('fs') +const util = require('util') +const fs = require('fs') +const { unlink } = fs.promises || util.promisify(fs.unlink) const Arborist = require('@npmcli/arborist') const log = require('npmlog') diff --git a/lib/utils/reify-finish.js b/lib/utils/reify-finish.js index 76dba06cb570..9c95e9fcff24 100644 --- a/lib/utils/reify-finish.js +++ b/lib/utils/reify-finish.js @@ -1,7 +1,9 @@ const reifyOutput = require('./reify-output.js') const npm = require('../npm.js') const ini = require('ini') -const {writeFile} = require('fs').promises +const util = require('util') +const fs = require('fs') +const { writeFile } = fs.promises || { writeFile: util.promisify(fs.writeFile) } const {resolve} = require('path') const reifyFinish = async arb => { diff --git a/test/lib/shrinkwrap.js b/test/lib/shrinkwrap.js index 65b16b14762d..ed8fd329c56e 100644 --- a/test/lib/shrinkwrap.js +++ b/test/lib/shrinkwrap.js @@ -1,4 +1,5 @@ const t = require('tap') +const fs = require('fs') const requireInject = require('require-inject') const npm = { @@ -327,3 +328,10 @@ t.test('shrinkwrap --global', t => { t.end() }) }) + +t.test('works without fs.promises', async t => { + t.doesNotThrow(() => requireInject('../../lib/shrinkwrap.js', { + ...mocks, + fs: { ...fs, promises: null }, + })) +}) diff --git a/test/lib/utils/reify-finish.js b/test/lib/utils/reify-finish.js index d6c7d2e7b2d6..39277f21a06c 100644 --- a/test/lib/utils/reify-finish.js +++ b/test/lib/utils/reify-finish.js @@ -20,7 +20,7 @@ let expectWrite = false const realFs = require('fs') const fs = { ...realFs, - promises: { + promises: realFs.promises && { ...realFs.promises, writeFile: async (path, data) => { if (!expectWrite) @@ -78,3 +78,11 @@ t.test('should write if everything above passes', async t => { const data = fs.readFileSync(`${path}/npmrc`, 'utf8').replace(/\r\n/g, '\n') t.matchSnapshot(data, 'written config') }) + +t.test('works without fs.promises', async t => { + t.doesNotThrow(() => requireInject('../../../lib/utils/reify-finish.js', { + fs: { ...fs, promises: null }, + '../../../lib/npm.js': npm, + '../../../lib/utils/reify-output.js': reifyOutput, + })) +})