You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.0 KiB
108 lines
3.0 KiB
2 weeks ago
|
# is-file-esm
|
||
|
|
||
|
> Determines whether a Node file is a Module (`import`) or a Script (`require`)
|
||
|
|
||
|
## Algorithm
|
||
|
|
||
|
Determining the module system of a file comes from three inputs, the `type` field
|
||
|
of the closest `package.json` to that file, the file extension (`.js`, `.mjs` or `.cjs`)
|
||
|
and the lesser know `--input-type` command-line flag. The latter only applies to
|
||
|
dyamic input (via STDIN, `--eval` or `--print` flags) so is not considered with this library.
|
||
|
|
||
|
So to determine whether a file is an esm file (e.g. native EcmaScript modules) or not,
|
||
|
we use the following procedure:
|
||
|
|
||
|
```
|
||
|
read package.json for "type" field,
|
||
|
if type is "module"
|
||
|
if answer.mjs -> module
|
||
|
if answer.js -> module
|
||
|
if answer.cjs -> script
|
||
|
if type is "commonjs"
|
||
|
if answer.mjs -> module
|
||
|
if answer.js -> script
|
||
|
if answer.cjs -> script
|
||
|
if type is not set
|
||
|
if answer.mjs -> module
|
||
|
if answer.js -> script
|
||
|
if answer.cjs -> script
|
||
|
```
|
||
|
|
||
|
## API
|
||
|
|
||
|
The `is-file-esm` module provides synchronous, awaitable (promise-based) and callback based APIs.
|
||
|
|
||
|
In each case the Result object has the following shape:
|
||
|
|
||
|
```js
|
||
|
{
|
||
|
esm: Boolean, // true if file is a Module, false if it is a Script
|
||
|
type: String, // the determined package.json type, may be undefined, 'module', or 'commonjs'
|
||
|
extType: String, // the file extension type, may be 'c', 'm' or 'j'
|
||
|
path: String, // the input path
|
||
|
pkgPath: String // the path to the package.json from which the type was determined
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Awaitable (promise-based)
|
||
|
|
||
|
#### `await isFileEsm(path) => Result`
|
||
|
|
||
|
```js
|
||
|
import isFileEsm from 'is-file-esm'
|
||
|
const { esm, path } = await isFileEsm('/path/to/file.js')
|
||
|
if (esm) console.log(`File ${path} is a Module`)
|
||
|
else console.log(`File ${path} is a Script`)
|
||
|
```
|
||
|
|
||
|
### Callback-style
|
||
|
|
||
|
#### `isFileEsm(path, cb(err, Result))`
|
||
|
|
||
|
```js
|
||
|
const isFileEsm = require('is-file-esm')
|
||
|
isFileEsm('/path/to/file.js', (err, result) => {
|
||
|
if (err) {
|
||
|
console.error(err)
|
||
|
return
|
||
|
}
|
||
|
if (result.esm) console.log(`File ${result.path} is a Module`)
|
||
|
else console.log(`File ${result.path} is a Script`)
|
||
|
})
|
||
|
```
|
||
|
|
||
|
### Synchronous
|
||
|
|
||
|
#### `isFileEsm.sync(path) => Result`
|
||
|
|
||
|
```js
|
||
|
import isFileEsm from 'is-file-esm'
|
||
|
const { esm, path } = isFileEsm.sync('/path/to/file.js')
|
||
|
if (esm) console.log(`File ${path} is a Module`)
|
||
|
else console.log(`File ${path} is a Script`)
|
||
|
```
|
||
|
|
||
|
### Test
|
||
|
|
||
|
```sh
|
||
|
npm test
|
||
|
```
|
||
|
|
||
|
```
|
||
|
test/index.js ..................................... 213/213
|
||
|
total ............................................. 213/213
|
||
|
|
||
|
213 passing (927.584ms)
|
||
|
|
||
|
ok
|
||
|
----------|----------|----------|----------|----------|-------------------|
|
||
|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
|
||
|
----------|----------|----------|----------|----------|-------------------|
|
||
|
All files | 100 | 100 | 100 | 100 | |
|
||
|
index.js | 100 | 100 | 100 | 100 | |
|
||
|
----------|----------|----------|----------|----------|-------------------|
|
||
|
```
|
||
|
|
||
|
### License
|
||
|
|
||
|
MIT
|