benbria / aliasify

Rewrite require calls in browserify modules.
MIT License
204 stars 26 forks source link

Allowing paths after alias causes error when requiring sub-modules #17

Open jackwanders opened 9 years ago

jackwanders commented 9 years ago

First, my specific example that led to finding this issue:

I have source modules that may require either the core React module or the React module with addons, such as:

var React = require('react');
// OR
var React = require('react/addons');

I am attempting to use aliasify to map any requires of react to react/addons. However, I want to leave requires for react/addons untouched. When I include the following in my package.json, require('react/addons') becomes require('react/addons/addons'):

"aliasify": {
  "aliases": {
    "react": "react/addons"
  }
}

At first, I thought this might be a bug with aliasify being too lenient, but it looks like it's expected functionality, considering this test to ensure paths after aliases are maintained.

I attempted to work around this by using quote marks in my package.json, like so:

"aliasify": {
  "aliases": {
    "'react'": "'react/addons'"
  }
}

Hoping that I would be able to do an 'exact' match against only requires for 'react', but to no avail.

This pattern of modules exposing differing or extended functionality via sub-modules (e.g. Less 2.0.0 just introduced less/browser as a valid require target) seems to not be that uncommon, so I was curious as to whether you feel there's a way to improve aliasify to be smarter about aliasing modules names with this pattern.

Thanks.

jwalton commented 9 years ago

Hmm... You are not the only person with this issue (see #14). I'm not sure what the best way to fix this is, though. Maybe something like:

"aliasify": {
  "aliases": {
    "react": {"exactMatch:" "react/addons"}
  }
}

This strikes me as "not quite right", though.

jackwanders commented 9 years ago

Interestingly, that's almost the exact solution I tried out on my local fork. I agree that it just doesn't seem 'right' enough.

jwalton commented 9 years ago

So, what you can do right now is set your aliasify config up as:

"aliasify": {
    "aliases": {
        "react":        "react/addons",
        "react/addons": "react/addons"
    }
}

And this will have the desired effect. This works because when we try to transform "react/addons" we'll first try to find a "react/addons" key in the aliasify config, and only if we don't find one will we try to turn "react/addons" into "react" and then find "react/addons/addons".

This also doesn't seem like an ideal way to do this, since it relies on behavior which is, if I'm honest, an accident. :P

stevenvachon commented 7 years ago

I'm trying to create an alias for a file in a module, but it isn't working: #48