Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 1 commit into from Aug 9, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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');
});
});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I truly enjoy reviewing your PRs ❤️