diff --git a/src/Asset.js b/src/Asset.js index 69fc9252326..9854f193cbd 100644 --- a/src/Asset.js +++ b/src/Asset.js @@ -7,6 +7,7 @@ const isURL = require('./utils/is-url'); const config = require('./utils/config'); const syncPromise = require('./utils/syncPromise'); const logger = require('./Logger'); +const Resolver = require('./Resolver'); let ASSET_ID = 1; @@ -41,6 +42,7 @@ class Asset { this.endTime = 0; this.buildTime = 0; this.bundledSize = 0; + this.resolver = new Resolver(options); } shouldInvalidate() { @@ -91,14 +93,22 @@ class Asset { } const parsed = URL.parse(url); - const resolved = path.resolve( - path.dirname(from), - decodeURIComponent(parsed.pathname) - ); - this.addDependency( - './' + path.relative(path.dirname(this.name), resolved), - Object.assign({dynamic: true}, opts) - ); + let depName; + let resolved; + let dir = path.dirname(from); + const filename = decodeURIComponent(parsed.pathname); + + if (filename[0] === '~' || filename[0] === '/') { + if (dir === '.') { + dir = this.options.rootDir; + } + depName = resolved = this.resolver.resolveFilename(filename, dir); + } else { + resolved = path.resolve(dir, filename); + depName = './' + path.relative(path.dirname(this.name), resolved); + } + + this.addDependency(depName, Object.assign({dynamic: true}, opts)); parsed.pathname = this.options.parser .getAsset(resolved, this.options) diff --git a/test/asset.js b/test/asset.js index 696e808aff4..a6a0b6d54a5 100644 --- a/test/asset.js +++ b/test/asset.js @@ -1,5 +1,6 @@ const assert = require('assert'); const fs = require('fs'); +const path = require('path'); const Asset = require('../src/Asset'); const {bundle} = require('./utils'); @@ -76,5 +77,19 @@ describe('Asset', () => { `${bundleName}?bar#baz` ); }); + + it('should resolve slash', () => { + asset.dependencies.clear(); + assert.strictEqual(asset.addURLDependency('/foo'), bundleName); + const key = path.resolve('/root/dir/foo'); + assert(asset.dependencies.has(key)); + }); + + it('should resolve tilde', () => { + asset.dependencies.clear(); + assert.strictEqual(asset.addURLDependency('~/foo'), bundleName); + const key = path.normalize('/root/dir/foo'); + assert(asset.dependencies.has(key)); + }); }); });