Skip to content

Commit

Permalink
bug #619 Fix createSharedEntry(...) when using query string versionin…
Browse files Browse the repository at this point in the history
…g strategy (Lyrkan)

This PR was merged into the master branch.

Discussion
----------

Fix createSharedEntry(...) when using query string versioning strategy

This PR fixes #618 by correctly filtering the JS files of the shared entry (in the `SharedEntryConcatPlugin`) when versioning is handled in a query string.

Commits
-------

0f63369 Fix createSharedEntry(...) when using query string versioning strategy
  • Loading branch information
weaverryan committed Aug 9, 2019
2 parents b61cf71 + 0f63369 commit 9801b84
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 2 deletions.
19 changes: 19 additions & 0 deletions lib/utils/get-file-extension.js
@@ -0,0 +1,19 @@
/*
* This file is part of the Symfony Webpack Encore package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

'use strict';

const path = require('path');
const url = require('url');

module.exports = function(filename) {
const parsedFilename = new url.URL(filename, 'http://foo');
const extension = path.extname(parsedFilename.pathname);
return extension ? extension.slice(1) : '';
};
4 changes: 3 additions & 1 deletion lib/webpack/shared-entry-concat-plugin.js
Expand Up @@ -10,6 +10,7 @@
'use strict';

const sharedEntryTmpName = require('../utils/sharedEntryTmpName');
const getFileExtension = require('../utils/get-file-extension');
const RawSource = require('webpack-sources/lib/RawSource');

function SharedEntryConcatPlugin(sharedEntryName) {
Expand All @@ -26,7 +27,8 @@ function getChunkFilename(compilation, chunkName) {
}

const jsFiles = chunk.files.filter(filename => {
return /\.js$/.test(filename) && !additionalChunkAssets.includes(filename);
const fileExtension = getFileExtension(filename);
return /^js$/.test(fileExtension) && !additionalChunkAssets.includes(filename);
});

if (jsFiles.length !== 1) {
Expand Down
29 changes: 28 additions & 1 deletion test/functional.js
Expand Up @@ -854,7 +854,7 @@ describe('Functional tests using webpack', function() {
});
});

it('createdSharedEntry() works with versioning', (done) => {
it('createdSharedEntry() works with default versioning strategy', (done) => {
const config = createWebpackConfig('www/build', 'dev');
config.setPublicPath('/build');
config.addEntry('main', ['./js/no_require', './js/code_splitting', './js/arrow_function', './js/print_to_app']);
Expand All @@ -878,6 +878,33 @@ describe('Functional tests using webpack', function() {
});
});

it('createdSharedEntry() works with query string versioning strategy', (done) => {
const config = createWebpackConfig('www/build', 'dev');
config.setPublicPath('/build');
config.addEntry('main', ['./js/no_require', './js/code_splitting', './js/arrow_function', './js/print_to_app']);
config.addEntry('other', ['./js/no_require', './css/h1_style.css']);
config.createSharedEntry('shared', './js/shared_example');
config.configureFilenames({
js: '[name].js?[contenthash:8]',
css: '[name].css?[contenthash:8]',
});

testSetup.runWebpack(config, (webpackAssert) => {
testSetup.requestTestPage(
path.join(config.getContext(), 'www'),
[
convertToManifestPath('build/runtime.js', config),
convertToManifestPath('build/shared.js', config),
],
(browser) => {
// assert that the javascript brought into shared is executed
browser.assert.text('#app', 'Welcome to Encore!');
done();
}
);
});
});

it('createdSharedEntry() works with source maps enabled', (done) => {
const config = createWebpackConfig('www/build', 'dev');
config.setPublicPath('/build');
Expand Down
42 changes: 42 additions & 0 deletions test/utils/get-file-extension.js
@@ -0,0 +1,42 @@
/*
* This file is part of the Symfony Webpack Encore package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

'use strict';

const expect = require('chai').expect;
const getFileExtension = require('../../lib/utils/get-file-extension');

describe('get-file-extension', () => {
it('returns the extension of simple filenames', () => {
expect(getFileExtension('foo.js')).to.equal('js');
expect(getFileExtension('foo-bar.txt')).to.equal('txt');
expect(getFileExtension('foo.bar.baz')).to.equal('baz');
});

it('returns an empty string for files with no extension', () => {
expect(getFileExtension('foo')).to.equal('');
expect(getFileExtension('foo-bar')).to.equal('');
});

it('returns the extension of a file from an absolute path', () => {
expect(getFileExtension('/home/foo/bar.js')).to.equal('js');
expect(getFileExtension('C:\\home\\foo\\bar.js')).to.equal('js');
});

it('returns the extension from an URI', () => {
expect(getFileExtension('http://localhost/foo.js')).to.equal('js');
expect(getFileExtension('file://localhost/foo/bar.txt')).to.equal('txt');
expect(getFileExtension('https://localhost:8080/foo.bar.baz')).to.equal('baz');
});

it('works with query strings', () => {
expect(getFileExtension('http://localhost/foo.js?abcd')).to.equal('js');
expect(getFileExtension('foo.txt?bar=baz&baz=bar')).to.equal('txt');
});
});

0 comments on commit 9801b84

Please sign in to comment.