require-resolve-hook

Module to hook into the Node.js require and require.resolve function

Usage no npm install needed!

<script type="module">
  import requireResolveHook from 'https://cdn.skypack.dev/require-resolve-hook';
</script>

README

require-resolve-hook

Build status Test coverage NPM version NPM Downloads Prettier Conventional Commits

Module to hook into the Node.js require and require.resolve function

Installation

npm install require-resolve-hook
# or use yarn
yarn add require-resolve-hook

Usage

import requireResolveHook, { bypass, unhook } from 'require-resolve-hook'

const { unhook: unhookReact, bypass: bypassReact } = requireResolveHook('react', (id, parent, isMain) => {
  return '/path/to/your/custom-react' // absolute path
})

require.resolve('react') // => '/path/to/your/custom-react'
require('react') // => export '/path/to/your/custom-react'

bypassReact(() => require.resolve('react')) // => '/path/to/real-react'

unhookReact()
require.resolve('react') // => '/path/to/real-react'

API

requireResolveHook(match: Match, onResolve: OnResolve, options: Options)

  • Returns: { bypass: (fn) => ReturnType<fn>, unhook: () => void }

    bypass means:

    bypass = (fn) => {
      unhook()
      const res = fn()
      hook()
      return res
    }
    

StrictMatch

  • Type: string | RegExp | (id: string) => boolean

Match

  • Type: StrictMatch | StrictMatch[]

OnResolve

  • Type: (id: string, parent: null | Module, isMain: boolean) => string | false

Options

ignoreModuleNotFoundError

Should ignore MODULE_NOT_FOUND error?

requireResolveHook('react', () => require.resolve('not_found_package'))
requireResolveHook('react', () => require.resolve('founded_react'))

require.resolve('react') === require.resolve('founded_react')
requireResolveHook('react', () => require.resolve('not_found_package'), { ignoreModuleNotFoundError: false })
requireResolveHook('react', () => require.resolve('founded_react'))

require.resolve('react') // Throws MODULE_NOT_FOUND error
  • Type: boolean
  • Default: true

FAQ

  1. How to require the actual module in the mock file?
import requireResolveHook, { bypass } from 'require-resolve-hook'
import * as Module from 'module'

requireResolveHook(/^react/, (id, parent, isMain, opts) => {
  if (parent && parent.filename === '/path/to/mock/react') {
    // Access the actual react filename
    return bypass(() => Module._resolveFilename(id, parent, isMain, opts))
  }
  return '/path/to/mock/react'
})

Contributing

  • Fork it!
  • Create your new branch:
    git checkout -b feature-new or git checkout -b fix-which-bug
  • Start your magic work now
  • Make sure npm test passes
  • Commit your changes:
    git commit -am 'feat: some description (close #123)' or git commit -am 'fix: some description (fix #123)'
  • Push to the branch: git push
  • Submit a pull request :)

Authors

This library is written and maintained by imcuttle, imcuttle@163.com.

License

MIT - imcuttle 🐟