Skip to content

Commit

Permalink
Pass 'requireish' as a config parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
Jason Walton committed Apr 12, 2016
1 parent e93b52a commit 6451e37
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 29 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"lib": "./lib"
},
"dependencies": {
"browserify-transform-tools": "~1.5.4"
"browserify-transform-tools": "~1.6.0"
},
"devDependencies": {
"coffee-coverage": "^0.7.0",
Expand Down
45 changes: 27 additions & 18 deletions src/aliasify.coffee
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
path = require 'path'
transformTools = require 'browserify-transform-tools'

requireAliases = ['require']
TRANSFORM_NAME = "aliasify"

# Returns replacement require, `null` to not change require, `false` to replace require with `{}`.
getReplacement = (file, aliases, regexps) ->
Expand Down Expand Up @@ -30,15 +30,19 @@ getReplacement = (file, aliases, regexps) ->

return null

makeTransform = () ->
transformTools.makeFunctionTransform "aliasify", {jsFilesOnly: true, fromSourceFileDir: true, functionNames: requireAliases}, (functionParams, opts, done) ->
makeTransform = (requireAliases) ->
transformTools.makeFunctionTransform TRANSFORM_NAME, {
jsFilesOnly: true,
fromSourceFileDir: true,
functionNames: requireAliases
}, (functionParams, opts, done) ->
if !opts.config then return done new Error("Could not find configuration for aliasify")
aliases = opts.config.aliases
regexps = opts.config.replacements
verbose = opts.config.verbose

configDir = opts.configData?.configDir or opts.config.configDir or process.cwd()

result = null

file = functionParams.args[0].value
Expand All @@ -57,7 +61,8 @@ makeTransform = () ->
replacement = "./#{path.relative fileDir, replacement}"

if verbose
console.error "aliasify - #{opts.file}: replacing #{file} with #{replacement} of function #{functionParams.name}"
console.error "aliasify - #{opts.file}: replacing #{file} with #{replacement} " +
"of function #{functionParams.name}"

# If this is an absolute Windows path (e.g. 'C:\foo.js') then don't convert \s to /s.
if /^[a-zA-Z]:\\/.test(replacement)
Expand All @@ -67,16 +72,16 @@ makeTransform = () ->

result = "'#{replacement}'"


# Check if the function has more than one arg. If so preserve the remaining ones.
if result? and result isnt "{}"
remainingArgs = functionParams.args.slice(1);
remainingArgs = functionParams.args.slice(1)
if remainingArgs.length > 0
for arg in remainingArgs
if arg.type is "Literal"
result += ", '#{arg.value}'"
else if arg.type is "ObjectExpression"
try
try
result += ", #{JSON.stringify arg.value}"
catch err
result += ", #{JSON.stringify {}}"
Expand All @@ -88,16 +93,20 @@ makeTransform = () ->
else
result += ", #{arg.value}"
result = "#{functionParams.name}(#{result})"

done null, result

module.exports = makeTransform();
module.exports = (file, config) ->
requireish = null
if config and "requireish" of config
requireish = config.requireish
else
configData = transformTools.loadTransformConfigSync TRANSFORM_NAME, file, {fromSourceFileDir: true}
if configData and configData.config and "requireish" of configData.config
requireish = configData.config.requireish

module.exports.requireish = (aliases) ->
if Array.isArray(aliases) || {}.toString.call(aliases) is "[object Array]"
for alias in aliases
requireAliases.push alias
else if typeof aliases is "string"
requireAliases.push aliases
wrappedTransform = makeTransform(requireish or ['require'])
return wrappedTransform(file, config)

makeTransform()
module.exports.configure = (config) ->
return (file) -> module.exports file, config
31 changes: 21 additions & 10 deletions test/test.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ pb = require 'promise-breaker'
aliasify = require '../src/aliasify'
testDir = path.resolve __dirname, "../testFixtures/test"
testWithRelativeConfigDir = path.resolve __dirname, "../testFixtures/testWithRelativeConfig"
requireishConfigDir = path.resolve __dirname, "../testFixtures/requireishConfig"

runTestWithConfig = pb.make (aliasifyConfig, content=null, done) ->
process.chdir testDir
Expand All @@ -16,13 +17,12 @@ runTestWithConfig = pb.make (aliasifyConfig, content=null, done) ->
if content then options.content = content
transformTools.runTransform aliasify, jsFile, options, done

runTestWithCustomAliases = pb.make (aliasifyConfig, content=null, requireAliases=[], done) ->
runTestWithCustomAliases = pb.make (aliasifyConfig, content=null, done) ->
process.chdir testDir
jsFile = path.resolve __dirname, "../testFixtures/test/src/foobar/foobar.js"
options = {config: aliasifyConfig}
if content then options.content = content
aliasifyWithRequierishFunctions = aliasify.requireish(requireAliases)
transformTools.runTransform aliasifyWithRequierishFunctions, jsFile, options, done
transformTools.runTransform aliasify, jsFile, options, done

describe "aliasify", ->
cwd = process.cwd()
Expand All @@ -49,6 +49,18 @@ describe "aliasify", ->
assert.equal result, "d3 = require('./../shims/d3.js');"
done()

it "should load requireish options from config", (done) ->
console.log requireishConfigDir
process.chdir requireishConfigDir
jsFile = path.resolve requireishConfigDir, "foobar.js"
transformTools.runTransform aliasify, jsFile, (err, result) ->
return done err if err
assert.equal Mocha.utils.clean(result), Mocha.utils.clean("""
var foo = foobar('./foo.js');
var qux = baz('foo');
""")
done()

it "should allow configuration to be specified programatically", ->
runTestWithConfig {aliases: {"d3": "./foo/baz.js"}}
.then (result) ->
Expand Down Expand Up @@ -319,17 +331,17 @@ describe "aliasify", ->
assert.equal Mocha.utils.clean(result), expectedContent
done()


it "should support aliasing require calls by a string", ->
runTestWithCustomAliases {aliases: "foo": { relative: "../foo/foo.js" }}, null, 'foobar'
runTestWithCustomAliases {aliases: {"foo": { relative: "../foo/foo.js" }}, requireish: 'foobar'}
.then (result) ->
assert.equal Mocha.utils.clean(result), Mocha.utils.clean("""
var foo = foobar('../foo/foo.js');
var qux = baz('foo');
""")

it "should support aliasing require calls by an array of strings", ->
runTestWithCustomAliases {aliases: "foo": { relative: "../foo/foo.js" }}, null, ['foobar', 'baz']
runTestWithCustomAliases {aliases: {"foo": { relative: "../foo/foo.js" }}, requireish: ['foobar', 'baz']}
.then (result) ->
assert.equal Mocha.utils.clean(result), Mocha.utils.clean("""
var foo = foobar('../foo/foo.js');
Expand All @@ -341,10 +353,9 @@ describe "aliasify", ->
content = Mocha.utils.clean("""
var foo = foobar('foo', 'baz', bar, function (){}, {}, []);
""")
runTestWithCustomAliases {aliases: "foo": { relative: "../foo/foo.js" }}, content, 'foobar'

runTestWithCustomAliases {aliases: {"foo": { relative: "../foo/foo.js" }}, requireish: 'foobar'}, content
.then (result) ->
assert.equal Mocha.utils.clean(result), Mocha.utils.clean("""
var foo = foobar('../foo/foo.js', 'baz', bar, function (){}, {}, []);
""")

2 changes: 2 additions & 0 deletions testFixtures/requireishConfig/foobar.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
var foo = foobar('foo');
var qux = baz('foo');
8 changes: 8 additions & 0 deletions testFixtures/requireishConfig/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"aliasify": {
"aliases": {
"foo": {"relative": "./foo.js"}
},
"requireish": "foobar"
}
}

0 comments on commit 6451e37

Please sign in to comment.