108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# 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 |