Skip to content

Commit

Permalink
BREAKING: ESM support (#974)
Browse files Browse the repository at this point in the history
* Remove process.cwd() trick from test files

* BREAKING: Switch from main to exports

* Add fs-extra/esm ESM named import module, with just fs-extra methods

Fixes #746
  • Loading branch information
RyanZim committed Nov 28, 2022
1 parent 1a3205d commit fd50986
Show file tree
Hide file tree
Showing 42 changed files with 258 additions and 42 deletions.
30 changes: 29 additions & 1 deletion README.md
Expand Up @@ -27,6 +27,8 @@ Installation
Usage
-----

### CommonJS

`fs-extra` is a drop in replacement for native `fs`. All methods in `fs` are attached to `fs-extra`. All `fs` methods return promises if the callback isn't passed.

You don't ever need to include the original `fs` module again:
Expand Down Expand Up @@ -55,6 +57,31 @@ const fs = require('fs')
const fse = require('fs-extra')
```

### ESM

There is also an `fs-extra/esm` import, that supports both default and named exports. However, note that `fs` methods are not included in `fs-extra/esm`; you still need to import `fs` and/or `fs/promises` seperately:

```js
import { readFileSync } from 'fs'
import { readFile } from 'fs/promises'
import { outputFile, outputFileSync } from 'fs-extra/esm'
```

Default exports are supported:

```js
import fs from 'fs'
import fse from 'fs-extra/esm'
// fse.readFileSync is not a function; must use fs.readFileSync
```

but you probably want to just use regular `fs-extra` instead of `fs-extra/esm` for default exports:

```js
import fs from 'fs-extra'
// both fs and fs-extra methods are defined
```

Sync vs Async vs Async/Await
-------------
Most methods are async by default. All async methods will return a promise if the callback isn't passed.
Expand Down Expand Up @@ -197,7 +224,8 @@ fs-extra contains hundreds of tests.

- `npm run lint`: runs the linter ([standard](http://standardjs.com/))
- `npm run unit`: runs the unit tests
- `npm test`: runs both the linter and the tests
- `npm run unit-esm`: runs tests for `fs-extra/esm` exports
- `npm test`: runs the linter and all tests


### Windows
Expand Down
2 changes: 1 addition & 1 deletion lib/copy/__tests__/ncp/broken-symlink.test.js
Expand Up @@ -2,7 +2,7 @@

const fs = require('fs')
const os = require('os')
const fse = require(process.cwd())
const fse = require('../../..')
const ncp = require('../../copy')
const path = require('path')
const assert = require('assert')
Expand Down
2 changes: 1 addition & 1 deletion lib/copy/__tests__/ncp/ncp-error-perm.test.js
Expand Up @@ -4,7 +4,7 @@

const fs = require('fs')
const os = require('os')
const fse = require(process.cwd())
const fse = require('../../..')
const ncp = require('../../copy')
const path = require('path')
const assert = require('assert')
Expand Down
2 changes: 1 addition & 1 deletion lib/copy/__tests__/ncp/symlink.test.js
Expand Up @@ -2,7 +2,7 @@

const fs = require('fs')
const os = require('os')
const fse = require(process.cwd())
const fse = require('../../..')
const ncp = require('../../copy')
const path = require('path')
const assert = require('assert')
Expand Down
2 changes: 1 addition & 1 deletion lib/empty/__tests__/empty-dir-sync.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/empty/__tests__/empty-dir.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/ensure/__tests__/create.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/ensure/__tests__/ensure.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/ensure/__tests__/link.test.js
Expand Up @@ -4,7 +4,7 @@ const CWD = process.cwd()

const fs = require('graceful-fs')
const os = require('os')
const fse = require(CWD)
const fse = require('../..')
const path = require('path')
const assert = require('assert')
const ensureLink = fse.ensureLink
Expand Down
2 changes: 1 addition & 1 deletion lib/ensure/__tests__/symlink-paths.test.js
Expand Up @@ -4,7 +4,7 @@ const CWD = process.cwd()

const fs = require('graceful-fs')
const os = require('os')
const fse = require(CWD)
const fse = require('../..')
const path = require('path')
const assert = require('assert')
const _symlinkPaths = require('../symlink-paths')
Expand Down
2 changes: 1 addition & 1 deletion lib/ensure/__tests__/symlink-type.test.js
Expand Up @@ -4,7 +4,7 @@ const CWD = process.cwd()

const fs = require('graceful-fs')
const os = require('os')
const fse = require(CWD)
const fse = require('../..')
const path = require('path')
const assert = require('assert')
const _symlinkType = require('../symlink-type')
Expand Down
2 changes: 1 addition & 1 deletion lib/ensure/__tests__/symlink.test.js
Expand Up @@ -4,7 +4,7 @@ const CWD = process.cwd()

const fs = require('graceful-fs')
const os = require('os')
const fse = require(CWD)
const fse = require('../..')
const path = require('path')
const assert = require('assert')
const _symlinkPaths = require('../symlink-paths')
Expand Down
68 changes: 68 additions & 0 deletions lib/esm.mjs
@@ -0,0 +1,68 @@
import _copy from './copy/index.js'
import _empty from './empty/index.js'
import _ensure from './ensure/index.js'
import _json from './json/index.js'
import _mkdirs from './mkdirs/index.js'
import _move from './move/index.js'
import _outputFile from './output-file/index.js'
import _pathExists from './path-exists/index.js'
import _remove from './remove/index.js'

// NOTE: Only exports fs-extra's functions; fs functions must be imported from "node:fs" or "node:fs/promises"

export const copy = _copy.copy
export const copySync = _copy.copySync
export const emptyDirSync = _empty.emptyDirSync
export const emptydirSync = _empty.emptydirSync
export const emptyDir = _empty.emptyDir
export const emptydir = _empty.emptydir
export const createFile = _ensure.createFile
export const createFileSync = _ensure.createFileSync
export const ensureFile = _ensure.ensureFile
export const ensureFileSync = _ensure.ensureFileSync
export const createLink = _ensure.createLink
export const createLinkSync = _ensure.createLinkSync
export const ensureLink = _ensure.ensureLink
export const ensureLinkSync = _ensure.ensureLinkSync
export const createSymlink = _ensure.createSymlink
export const createSymlinkSync = _ensure.createSymlinkSync
export const ensureSymlink = _ensure.ensureSymlink
export const ensureSymlinkSync = _ensure.ensureSymlinkSync
export const readJson = _json.readJson
export const readJSON = _json.readJSON
export const readJsonSync = _json.readJsonSync
export const readJSONSync = _json.readJSONSync
export const writeJson = _json.writeJson
export const writeJSON = _json.writeJSON
export const writeJsonSync = _json.writeJsonSync
export const writeJSONSync = _json.writeJSONSync
export const outputJson = _json.outputJson
export const outputJSON = _json.outputJSON
export const outputJsonSync = _json.outputJsonSync
export const outputJSONSync = _json.outputJSONSync
export const mkdirs = _mkdirs.mkdirs
export const mkdirsSync = _mkdirs.mkdirsSync
export const mkdirp = _mkdirs.mkdirp
export const mkdirpSync = _mkdirs.mkdirpSync
export const ensureDir = _mkdirs.ensureDir
export const ensureDirSync = _mkdirs.ensureDirSync
export const move = _move.move
export const moveSync = _move.moveSync
export const outputFile = _outputFile.outputFile
export const outputFileSync = _outputFile.outputFileSync
export const pathExists = _pathExists.pathExists
export const pathExistsSync = _pathExists.pathExistsSync
export const remove = _remove.remove
export const removeSync = _remove.removeSync

export default {
..._copy,
..._empty,
..._ensure,
..._json,
..._mkdirs,
..._move,
..._outputFile,
..._pathExists,
..._remove
}
2 changes: 1 addition & 1 deletion lib/fs/__tests__/realpath.test.js
Expand Up @@ -18,7 +18,7 @@ describe('realpath.native does not exist', () => {

const realpathNativeBackup = fs.realpath.native
const clearFseCache = () => {
const fsePath = path.dirname(require.resolve('../../..'))
const fsePath = path.dirname(require.resolve('../..'))
for (const entry in require.cache) {
if (entry.startsWith(fsePath)) {
delete require.cache[entry]
Expand Down
2 changes: 1 addition & 1 deletion lib/json/__tests__/jsonfile-integration.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/json/__tests__/output-json-sync.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/json/__tests__/output-json.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/json/__tests__/promise-support.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/json/__tests__/read.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/clobber.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/issue-209.test.js
@@ -1,7 +1,7 @@
'use strict'

const assert = require('assert')
const fse = require(process.cwd())
const fse = require('../..')

/* global describe, it */

Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/issue-93.test.js
@@ -1,7 +1,7 @@
'use strict'

const os = require('os')
const fse = require(process.cwd())
const fse = require('../..')
const path = require('path')
const assert = require('assert')
const util = require('util')
Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/mkdir.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/mkdirp.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/opts-undef.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/perm_sync.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/race.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/rel.test.js
Expand Up @@ -4,7 +4,7 @@ const CWD = process.cwd()

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

Expand Down
2 changes: 1 addition & 1 deletion lib/mkdirs/__tests__/sync.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/move/__tests__/move-sync.test.js
Expand Up @@ -4,7 +4,7 @@
// const fs = require('graceful-fs')
const fs = require('fs')
const os = require('os')
const fse = require(process.cwd())
const fse = require('../..')
const path = require('path')
const assert = require('assert')

Expand Down
2 changes: 1 addition & 1 deletion lib/output-file/__tests__/output.test.js
Expand Up @@ -2,7 +2,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion lib/path-exists/__tests__/path-exists-sync.test.js
@@ -1,7 +1,7 @@
'use strict'
/* eslint-env mocha */

const fs = require(process.cwd())
const fs = require('../..')
const path = require('path')
const os = require('os')
const assert = require('assert')
Expand Down
2 changes: 1 addition & 1 deletion lib/path-exists/__tests__/path-exists.test.js
@@ -1,7 +1,7 @@
'use strict'
/* eslint-env mocha */

const fs = require(process.cwd())
const fs = require('../..')
const path = require('path')
const os = require('os')
const assert = require('assert')
Expand Down

0 comments on commit fd50986

Please sign in to comment.