All Projects → Gaafar → pkg-require

Gaafar / pkg-require

Licence: other
require node files relative to your package directory

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to pkg-require

node-advanced
Node Advanced Courseware
Stars: ✭ 80 (+263.64%)
Mutual labels:  module, require
module-invalidate
Invalidate node.js modules loaded through require()
Stars: ✭ 19 (-13.64%)
Mutual labels:  module, require
modules
Officially supported Revel modules
Stars: ✭ 46 (+109.09%)
Mutual labels:  module
Godot-Share
Simple share text and/or image module for Godot Engine (Android & iOS)
Stars: ✭ 58 (+163.64%)
Mutual labels:  module
puppetlabs-vcsrepo
Support for source control repositories
Stars: ✭ 228 (+936.36%)
Mutual labels:  module
the-super-tiny-web-module-resolver
simple js bundler written in 100 lines of code.
Stars: ✭ 25 (+13.64%)
Mutual labels:  module
guess-module
Guess.js integration for Nuxt.js with guess-webpack
Stars: ✭ 20 (-9.09%)
Mutual labels:  module
breaker
🚧 Flexible mechanism to make execution flow interruptible.
Stars: ✭ 100 (+354.55%)
Mutual labels:  module
bar-horizontal
Create beautiful horizontal charts, that fit your terminal.
Stars: ✭ 36 (+63.64%)
Mutual labels:  module
ember-cli-new-version
A convention based update notification for Ember. With this addon, you can detect a new version and notify the user to refresh the page
Stars: ✭ 22 (+0%)
Mutual labels:  module
webtrees-fancy-research-links
Fancy Research Links Module for webtrees
Stars: ✭ 20 (-9.09%)
Mutual labels:  module
amd-cmd-hot-update-hmr
esl-hot-update: Hot update esl modules(AMD、CMD) when modifed. JS, LESS, tpl, component is all supported!
Stars: ✭ 25 (+13.64%)
Mutual labels:  module
whichpm
Locates installed Perl modules.
Stars: ✭ 20 (-9.09%)
Mutual labels:  module
pbwrap
Pastebin API wrapper for Python
Stars: ✭ 19 (-13.64%)
Mutual labels:  module
puppetlabs-limits
Module for managing pam limits in /etc/security/limits.conf
Stars: ✭ 14 (-36.36%)
Mutual labels:  module
AdminOnSteroids
Various ProcessWire admin tweaks to boost productivity.
Stars: ✭ 39 (+77.27%)
Mutual labels:  module
lint-deps
Lint for unused or missing dependencies in your node.js projects. Customize with plugins or configuration.
Stars: ✭ 48 (+118.18%)
Mutual labels:  require
terraform-azurerm-aks
Terraform module composition (feature) for Azure Kubernetes Service
Stars: ✭ 23 (+4.55%)
Mutual labels:  module
companion-module-requests
Repository for tracking module requests
Stars: ✭ 60 (+172.73%)
Mutual labels:  module
co2
Nous sommes passé à GitLab. Go : https://gitlab.adullact.net/pixelhumain/co2
Stars: ✭ 22 (+0%)
Mutual labels:  module

Build Status Coverage Status npm Dependency Status

pkg-require

require node files relative to your package root directory

npm i -S pkg-require

How we got here

Imagine this directory tree

root
├── foo
│   └── foo.js
├── package.json
└── some
    └── deep
        └── dir
            └── tree
                └── bar.js

Now if you're in bar.js and want to require foo.js you need to go all the way up to the root dir and then specify the file you want.

const foo = require('../../../../foo/foo');

This is annoying for a few reasons:

  • hard to read
  • hard to write
  • needs to be maintained if you move bar.js around
  • needs to be maintained if you move foo.js around, which cannot be done with a simple search and replace as you may have different numbers of '../' in different files requiring foo.js

Wouldn't it be simpler if you can just write

const foo = require('foo/foo');

and it would just understand that you mean to require a module relative to your root directory? What do you mean by root directory? The one that contains package.json.

pkg-require

pkg-require will do exactly this. It looks all the way up your directory tree until it finds the first package.json, and then it will resolve all requires from that directory.

TLDR Example

// create an instance that will find the nearest parent dir containing package.json from your __dirname
const pkgRequire = require('pkg-require')(__dirname);

// require a file relative to the your package.json directory 
const foo = pkgRequire('foo/foo')

// get the absolute path for a file
const absolutePathToFoo = pkgRequire.resolve('foo/foo')

// get the absolute path to your root directory
const packageRootPath = pkgRequire.root()

now you can go write useful code instead of counting how many levels you need to go up to require a file.

API

require

create a new instance for the package based on current file directory

const pkgRequire = require('pkg-require')(__dirname);

pkgRequire()

require a file by passing its path relative to the directory containing package.json

const foo = pkgRequire('foo/foo')

pkgRequire.resolve()

resolve a file/dir absolute path by passing its path relative to the directory containing package.json

const absolutePathToFoo = pkgRequire.resolve('foo/foo')

pkgRequire.root()

return the absolute path to the parent directory containing package.json

const packageRootPath = pkgRequire.root()

Other Solutions/Hacks

There are a bunch of ways people have been dealing with this problem, which include

  • creating a sym link in node_modules to your project dir
  • modifying $NODE_PATH
  • calling require.main.require
  • using a global variable for base directory
  • overriding/mutating the global require

these solutions are not just hacky and almost impossible to track, most of these solutions will wreak havoc if you use them in package installed with npm, or if you have a few of packages installed doing these hacks.

pkg-require does not involve any such hacks, it's a pure function with no side effects or mutations. It takes __dirname as an input, finds the first parent directory containing package.json, and uses that directory to resolve all files. This way it can work for nested modules and multiple modules because each module will pass its own __dirname and get a different instance of the module.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].