esm-utils

Utilities you need when migrating to ESModule.

Usage no npm install needed!

<script type="module">
  import esmUtils from 'https://cdn.skypack.dev/esm-utils';
</script>

README

esm-utils

Utilities you need when migrating to ESModule.

Install

yarn add esm-utils

Usage

import createEsmUtils from 'esm-utils'

const {
  require,
  dirname,
  filename,
  json,
} = createEsmUtils(import.meta)

API

createEsmUtils(import.meta)

Returns an object with the following properties:

  • require
  • dirname (alias __dirname)
  • filename (alias __filename)
  • json

Please read this note before you use dirname and filename

json.load(string | URL)

Returns Promise<jsonObject>.

json.loadSync(string | URL)

Sync version of json.load.

Import json file

With Import Assertions

import foo from './foo.json' assert {type: 'json'}
await import('./foo.json', {assert: {type: 'json'}})

With require, like CommonJS

import createEsmUtils from 'esm-utils'

const {require} = createEsmUtils(import.meta)
const foo = require('./foo.json')

With json.load or json.loadSync

import createEsmUtils from 'esm-utils'

const {json} = createEsmUtils(import.meta)
const foo = await json.load('./foo.json')
import createEsmUtils from 'esm-utils'

const {json} = createEsmUtils(import.meta)
const foo = json.loadSync('./foo.json')

You don't need dirname and filename

The dirname and filename supposed to be a quick solution when migrating to ES Modules. In most cases, you don't need them, because many APIs accept URL directly.

/* BAD */
import fs from 'node:fs/promises'
import path from 'node:path'
import createEsmUtils from 'esm-utils'

const {dirname} = createEsmUtils(import.meta)
const buffer = await fs.readFile(
  path.join(dirname, './path/to/file')
)
/* GOOD */
import fs from 'node:fs/promises'

const buffer = await fs.readFile(
  new URL('./path/to/file', import.meta.url)
)