Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Drop old Node support #751

Merged
merged 5 commits into from Feb 4, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 1 addition & 3 deletions .travis.yml
Expand Up @@ -3,12 +3,10 @@ os:
- linux
- osx
node_js:
- 6
- 8
- 9
- 10
- 11
- 12
- 13
env: TEST_SUITE=unit
matrix:
exclude:
Expand Down
3 changes: 1 addition & 2 deletions appveyor.yml
Expand Up @@ -2,9 +2,8 @@
environment:
matrix:
# node.js
- nodejs_version: "6"
- nodejs_version: "8"
- nodejs_version: "10"
- nodejs_version: "12"

# Install scripts. (runs after repo cloning)
install:
Expand Down
4 changes: 2 additions & 2 deletions lib/copy-sync/__tests__/copy-sync-file.test.js
Expand Up @@ -57,7 +57,7 @@ describe('+ copySync() / file', () => {
const fileDest = path.join(TEST_DIR, 'TEST_fs-extra_copy')
fs.writeFileSync(fileSrc, crypto.randomBytes(SIZE))

fs.chmodSync(fileSrc, parseInt('750', 8))
fs.chmodSync(fileSrc, 0o750)
fs.copySync(fileSrc, fileDest)

const statSrc = fs.statSync(fileSrc)
Expand Down Expand Up @@ -187,7 +187,7 @@ describe('+ copySync() / file', () => {
describe('> when overwrite is true and dest is readonly', () => {
it('should copy the file and not throw an error', () => {
try {
fs.chmodSync(dest, parseInt('444', 8))
fs.chmodSync(dest, 0o444)
fs.copySync(src, dest, { overwrite: true })
destData = fs.readFileSync(dest, 'utf8')
assert.strictEqual(srcData, destData)
Expand Down
6 changes: 1 addition & 5 deletions lib/copy-sync/__tests__/copy-sync-preserve-timestamp.test.js
Expand Up @@ -5,16 +5,12 @@ const os = require('os')
const path = require('path')
const utimes = require('../../util/utimes')
const assert = require('assert')
const semver = require('semver')
const nodeVersion = process.version
const nodeVersionMajor = semver.major(nodeVersion)

/* global beforeEach, afterEach, describe, it */

if (process.arch === 'ia32') console.warn('32 bit arch; skipping copySync timestamp tests')
if (nodeVersionMajor < 8) console.warn(`old node version (v${nodeVersion}); skipping copySync timestamp tests`)

const describeIfPractical = (process.arch === 'ia32' || nodeVersionMajor < 8) ? describe.skip : describe
const describeIfPractical = process.arch === 'ia32' ? describe.skip : describe

describeIfPractical('copySync() - preserveTimestamps option', () => {
let TEST_DIR, SRC, DEST, FILES
Expand Down
28 changes: 12 additions & 16 deletions lib/copy/__tests__/copy-permissions.test.js
Expand Up @@ -8,10 +8,6 @@ const assert = require('assert')

/* global beforeEach, describe, it */

const o777 = parseInt('777', 8)
const o666 = parseInt('666', 8)
const o444 = parseInt('444', 8)

describe('copy', () => {
let TEST_DIR

Expand All @@ -27,22 +23,22 @@ describe('copy', () => {
// var userid = require('userid')

// http://man7.org/linux/man-pages/man2/stat.2.html
const S_IFREG = parseInt('0100000', 8) // regular file
const S_IFDIR = parseInt('0040000', 8) // directory
const S_IFREG = 0o100000 // regular file
const S_IFDIR = 0o40000 // directory

// these are Mac specific I think (at least staff), should find Linux equivalent
let gidWheel
let gidStaff

try {
gidWheel = process.getgid() // userid.gid('wheel')
} catch (err) {
} catch {
gidWheel = process.getgid()
}

try {
gidStaff = process.getgid() // userid.gid('staff')
} catch (err) {
} catch {
gidStaff = process.getgid()
}

Expand All @@ -54,31 +50,31 @@ describe('copy', () => {

const f1 = path.join(srcDir, 'f1.txt')
fs.writeFileSync(f1, '')
fs.chmodSync(f1, o666)
fs.chmodSync(f1, 0o666)
fs.chownSync(f1, process.getuid(), gidWheel)
const f1stats = fs.lstatSync(f1)
assert.strictEqual(f1stats.mode - S_IFREG, o666)
assert.strictEqual(f1stats.mode - S_IFREG, 0o666)

const d1 = path.join(srcDir, 'somedir')
fs.mkdirSync(d1)
fs.chmodSync(d1, o777)
fs.chmodSync(d1, 0o777)
fs.chownSync(d1, process.getuid(), gidStaff)
const d1stats = fs.lstatSync(d1)
assert.strictEqual(d1stats.mode - S_IFDIR, o777)
assert.strictEqual(d1stats.mode - S_IFDIR, 0o777)

const f2 = path.join(d1, 'f2.bin')
fs.writeFileSync(f2, '')
fs.chmodSync(f2, o777)
fs.chmodSync(f2, 0o777)
fs.chownSync(f2, process.getuid(), gidStaff)
const f2stats = fs.lstatSync(f2)
assert.strictEqual(f2stats.mode - S_IFREG, o777)
assert.strictEqual(f2stats.mode - S_IFREG, 0o777)

const d2 = path.join(srcDir, 'crazydir')
fs.mkdirSync(d2)
fs.chmodSync(d2, o444)
fs.chmodSync(d2, 0o444)
fs.chownSync(d2, process.getuid(), gidWheel)
const d2stats = fs.lstatSync(d2)
assert.strictEqual(d2stats.mode - S_IFDIR, o444)
assert.strictEqual(d2stats.mode - S_IFDIR, 0o444)

const destDir = path.join(permDir, 'dest')
fse.copy(srcDir, destDir, err => {
Expand Down
6 changes: 1 addition & 5 deletions lib/copy/__tests__/copy-preserve-timestamp.test.js
Expand Up @@ -6,16 +6,12 @@ const path = require('path')
const copy = require('../copy')
const utimes = require('../../util/utimes')
const assert = require('assert')
const semver = require('semver')
const nodeVersion = process.version
const nodeVersionMajor = semver.major(nodeVersion)

/* global beforeEach, afterEach, describe, it */

if (process.arch === 'ia32') console.warn('32 bit arch; skipping copy timestamp tests')
if (nodeVersionMajor < 8) console.warn(`old node version (v${nodeVersion}); skipping copy timestamp tests`)

const describeIfPractical = (process.arch === 'ia32' || nodeVersionMajor < 8) ? describe.skip : describe
const describeIfPractical = process.arch === 'ia32' ? describe.skip : describe

describeIfPractical('copy() - preserve timestamp', () => {
let TEST_DIR, SRC, DEST, FILES
Expand Down
2 changes: 1 addition & 1 deletion lib/copy/__tests__/ncp/ncp-error-perm.test.js
Expand Up @@ -37,7 +37,7 @@ describe('ncp / error / dest-permission', () => {
fse.outputFileSync(someFile, 'hello')

fse.mkdirsSync(dest)
fs.chmodSync(dest, parseInt('444', 8))
fs.chmodSync(dest, 0o444)

const subdest = path.join(dest, 'another-dir')

Expand Down
2 changes: 1 addition & 1 deletion lib/empty/index.js
Expand Up @@ -30,7 +30,7 @@ function emptyDirSync (dir) {
let items
try {
items = fs.readdirSync(dir)
} catch (err) {
} catch {
return mkdir.mkdirsSync(dir)
}

Expand Down
2 changes: 1 addition & 1 deletion lib/ensure/file.js
Expand Up @@ -44,7 +44,7 @@ function createFileSync (file) {
let stats
try {
stats = fs.statSync(file)
} catch (e) {}
} catch {}
if (stats && stats.isFile()) return

const dir = path.dirname(file)
Expand Down
2 changes: 1 addition & 1 deletion lib/ensure/symlink-type.js
Expand Up @@ -19,7 +19,7 @@ function symlinkTypeSync (srcpath, type) {
if (type) return type
try {
stats = fs.lstatSync(srcpath)
} catch (e) {
} catch {
return 'file'
}
return (stats && stats.isDirectory()) ? 'dir' : 'file'
Expand Down
34 changes: 15 additions & 19 deletions lib/fs/__tests__/copyFile.test.js
@@ -1,33 +1,29 @@
'use strict'

const os = require('os')
const fs = require('fs')
const fse = require('../..')
const path = require('path')
const assert = require('assert')

/* eslint-env mocha */

// Only availible in Node 8.5+
if (typeof fs.copyFile === 'function') {
describe('fs.copyFile', () => {
let TEST_DIR
describe('fs.copyFile', () => {
let TEST_DIR

beforeEach(done => {
TEST_DIR = path.join(os.tmpdir(), 'fs-extra', 'fs-copyfile')
fse.emptyDir(TEST_DIR, done)
})
beforeEach(done => {
TEST_DIR = path.join(os.tmpdir(), 'fs-extra', 'fs-copyfile')
fse.emptyDir(TEST_DIR, done)
})

afterEach(done => fse.remove(TEST_DIR, done))
afterEach(done => fse.remove(TEST_DIR, done))

it('supports promises', () => {
const src = path.join(TEST_DIR, 'init.txt')
const dest = path.join(TEST_DIR, 'copy.txt')
fse.writeFileSync(src, 'hello')
return fse.copyFile(src, dest).then(() => {
const data = fse.readFileSync(dest, 'utf8')
assert.strictEqual(data, 'hello')
})
it('supports promises', () => {
const src = path.join(TEST_DIR, 'init.txt')
const dest = path.join(TEST_DIR, 'copy.txt')
fse.writeFileSync(src, 'hello')
return fse.copyFile(src, dest).then(() => {
const data = fse.readFileSync(dest, 'utf8')
assert.strictEqual(data, 'hello')
})
})
}
})
6 changes: 2 additions & 4 deletions lib/fs/__tests__/fs-integration.test.js
Expand Up @@ -26,9 +26,7 @@ describe('native fs', () => {
})

it('should have native fs constants', () => {
// Node.js v0.12 / IO.js
if ('F_OK' in fs) {
assert.strictEqual(fse.F_OK, fs.F_OK)
}
assert.strictEqual(fse.constants.F_OK, fs.constants.F_OK)
assert.strictEqual(fse.F_OK, fs.F_OK) // soft deprecated usage, but still available
})
})
6 changes: 2 additions & 4 deletions lib/fs/__tests__/multi-param.test.js
Expand Up @@ -9,8 +9,6 @@ const fs = require('../..')

const SIZE = 1000

// Used for tests on Node 7.2.0+ only
const onNode7it = semver.gte(process.version, '7.2.0') ? it : it.skip
// Used for tests on Node 12.9.0+ only
const describeNode12 = semver.gte(process.version, '12.9.0') ? describe : describe.skip

Expand Down Expand Up @@ -102,7 +100,7 @@ describe('fs.write()', () => {
})
})

onNode7it('returns an object when minimal arguments are passed', () => {
it('returns an object when minimal arguments are passed', () => {
return fs.write(TEST_FD, TEST_DATA)
.then(results => {
const bytesWritten = results.bytesWritten
Expand Down Expand Up @@ -134,7 +132,7 @@ describe('fs.write()', () => {
})
})

onNode7it('works when minimal arguments are passed', done => {
it('works when minimal arguments are passed', done => {
fs.write(TEST_FD, TEST_DATA, (err, bytesWritten, buffer) => {
assert.ifError(err)
assert.strictEqual(bytesWritten, SIZE, 'bytesWritten is correct')
Expand Down
40 changes: 18 additions & 22 deletions lib/fs/__tests__/realpath.test.js
@@ -1,33 +1,29 @@
'use strict'

const fs = require('fs')
const fse = require('../..')
const assert = require('assert')

/* eslint-env mocha */

// fs.realpath.native only available in Node v9.2+
if (typeof fs.realpath.native === 'function') {
describe('realpath.native', () => {
it('works with callbacks', () => {
fse.realpath.native(__dirname, (err, path) => {
assert.ifError(err)
assert.strictEqual(path, __dirname)
})
describe('realpath.native', () => {
it('works with callbacks', () => {
fse.realpath.native(__dirname, (err, path) => {
assert.ifError(err)
assert.strictEqual(path, __dirname)
})
})

it('works with promises', (done) => {
fse.realpath.native(__dirname)
.then(path => {
assert.strictEqual(path, __dirname)
done()
})
.catch(done)
})
it('works with promises', (done) => {
fse.realpath.native(__dirname)
.then(path => {
assert.strictEqual(path, __dirname)
done()
})
.catch(done)
})

it('works with sync version', () => {
const path = fse.realpathSync.native(__dirname)
assert.strictEqual(path, __dirname)
})
it('works with sync version', () => {
const path = fse.realpathSync.native(__dirname)
assert.strictEqual(path, __dirname)
})
}
})
2 changes: 0 additions & 2 deletions lib/fs/index.js
Expand Up @@ -41,8 +41,6 @@ const api = [
].filter(key => {
// Some commands are not available on some systems. Ex:
// fs.opendir was added in Node.js v12.12.0
// fs.copyFile was added in Node.js v8.5.0
// fs.mkdtemp was added in Node.js v5.10.0
// fs.lchown is not available on at least some Linux
return typeof fs[key] === 'function'
})
Expand Down
29 changes: 14 additions & 15 deletions lib/index.js
@@ -1,22 +1,21 @@
'use strict'

module.exports = Object.assign(
{},
module.exports = {
// Export promiseified graceful-fs:
require('./fs'),
...require('./fs'),
// Export extra methods:
require('./copy-sync'),
require('./copy'),
require('./empty'),
require('./ensure'),
require('./json'),
require('./mkdirs'),
require('./move-sync'),
require('./move'),
require('./output'),
require('./path-exists'),
require('./remove')
)
...require('./copy-sync'),
...require('./copy'),
...require('./empty'),
...require('./ensure'),
...require('./json'),
...require('./mkdirs'),
...require('./move-sync'),
...require('./move'),
...require('./output'),
...require('./path-exists'),
...require('./remove')
}

// Export fs.promises as a getter property so that we don't trigger
// ExperimentalWarning before fs.promises is actually accessed.
Expand Down