diff --git a/src/Parser.js b/src/Parser.js index 752e820d013..eba49df9517 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -49,7 +49,7 @@ class Parser { ext = '.' + ext; } - this.extensions[ext] = parser; + this.extensions[ext.toLowerCase()] = parser; } findParser(filename) { @@ -57,7 +57,7 @@ class Parser { return GlobAsset; } - let extension = path.extname(filename); + let extension = path.extname(filename).toLowerCase(); let parser = this.extensions[extension] || RawAsset; if (typeof parser === 'string') { parser = this.extensions[extension] = require(parser); diff --git a/test/integration/parser-case-insensitive-ext/icons.SVG b/test/integration/parser-case-insensitive-ext/icons.SVG new file mode 100644 index 00000000000..21f0a75277c --- /dev/null +++ b/test/integration/parser-case-insensitive-ext/icons.SVG @@ -0,0 +1,5 @@ + + + + + diff --git a/test/integration/parser-case-insensitive-ext/index.cSs b/test/integration/parser-case-insensitive-ext/index.cSs new file mode 100644 index 00000000000..67ce83e4d09 --- /dev/null +++ b/test/integration/parser-case-insensitive-ext/index.cSs @@ -0,0 +1,3 @@ +body { + background: red; +} diff --git a/test/integration/parser-case-insensitive-ext/index.html b/test/integration/parser-case-insensitive-ext/index.html new file mode 100644 index 00000000000..2682cffcf7f --- /dev/null +++ b/test/integration/parser-case-insensitive-ext/index.html @@ -0,0 +1,17 @@ + + + + + + +

Hello world

+

Linking to another page

+ Hash link + Mailto link + Tel link + + + hello world + + + diff --git a/test/integration/parser-case-insensitive-ext/index.js b/test/integration/parser-case-insensitive-ext/index.js new file mode 100644 index 00000000000..f096229a664 --- /dev/null +++ b/test/integration/parser-case-insensitive-ext/index.js @@ -0,0 +1 @@ +alert('Hi'); diff --git a/test/integration/parser-case-insensitive-ext/other.HTM b/test/integration/parser-case-insensitive-ext/other.HTM new file mode 100644 index 00000000000..1127055a9ec --- /dev/null +++ b/test/integration/parser-case-insensitive-ext/other.HTM @@ -0,0 +1,10 @@ + + + + + + +

Other page

+ + + diff --git a/test/parser.js b/test/parser.js new file mode 100644 index 00000000000..ec1db8e413c --- /dev/null +++ b/test/parser.js @@ -0,0 +1,66 @@ +const assert = require('assert'); +const fs = require('fs'); +const {bundle, assertBundleTree} = require('./utils'); + +describe('parser', function() { + it('should support case-insensitive file extension', async function() { + let b = await bundle( + __dirname + '/integration/parser-case-insensitive-ext/index.html' + ); + + assertBundleTree(b, { + name: 'index.html', + assets: ['index.html'], + childBundles: [ + { + type: 'svg', + assets: ['icons.SVG'], + childBundles: [] + }, + { + type: 'css', + assets: ['index.cSs'], + childBundles: [] + }, + { + type: 'js', + assets: ['index.js'], + childBundles: [ + { + type: 'map' + } + ] + }, + { + type: 'html', + assets: ['other.HTM'], + childBundles: [ + { + type: 'css', + assets: ['index.cSs'], + childBundles: [] + }, + { + type: 'js', + assets: ['index.js'], + childBundles: [ + { + type: 'map' + } + ] + } + ] + } + ] + }); + + let files = fs.readdirSync(__dirname + '/dist'); + let html = fs.readFileSync(__dirname + '/dist/index.html'); + for (let file of files) { + let ext = file.match(/\.([0-9a-z]+)(?:[?#]|$)/i)[0]; + if (file !== 'index.html' && ext !== '.map') { + assert(html.includes(file)); + } + } + }); +}); diff --git a/test/utils.js b/test/utils.js index dedf4471dbf..fbca4dd65ee 100644 --- a/test/utils.js +++ b/test/utils.js @@ -147,7 +147,7 @@ function assertBundleTree(bundle, tree) { } if (tree.type) { - assert.equal(bundle.type, tree.type); + assert.equal(bundle.type.toLowerCase(), tree.type.toLowerCase()); } if (tree.assets) {