diff --git a/src/Chunk.ts b/src/Chunk.ts index ee499483cd0..2ab9be0edde 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -30,6 +30,7 @@ import { basename, dirname, isAbsolute, normalize, relative, resolve } from './u import renderChunk from './utils/renderChunk'; import { RenderOptions } from './utils/renderHelpers'; import { makeUnique, renderNamePattern } from './utils/renderNamePattern'; +import { sanitizeFileName } from './utils/sanitize-file-name'; import { timeEnd, timeStart } from './utils/timers'; import { MISSING_EXPORT_SHIM_VARIABLE } from './utils/variableNames'; @@ -561,11 +562,8 @@ export default class Chunk { const dependencies: ChunkDependencies = []; this.dependencies.forEach(dep => { - const importsFromDependency = Array.from(this.imports).filter( - variable => - variable.module instanceof Module - ? variable.module.chunk === dep - : variable.module === dep + const importsFromDependency = Array.from(this.imports).filter(variable => + variable.module instanceof Module ? variable.module.chunk === dep : variable.module === dep ); let imports: ImportSpecifier[]; @@ -733,7 +731,6 @@ export default class Chunk { // Make sure the direct dependencies of a chunk are present to maintain execution order for (const { module } of Array.from(this.imports)) { - if (module.chunk === this) console.log(module.id); const chunkOrExternal = module instanceof Module ? module.chunk : module; if (this.dependencies.indexOf(chunkOrExternal) === -1) { this.dependencies.push(chunkOrExternal); @@ -938,7 +935,7 @@ export default class Chunk { preserveModulesRelativeDir: string, existingNames: Record ) { - const sanitizedId = this.orderedModules[0].id.replace('\0', '_'); + const sanitizedId = sanitizeFileName(this.orderedModules[0].id); this.id = makeUnique( normalize( isAbsolute(this.orderedModules[0].id) @@ -977,10 +974,10 @@ export default class Chunk { private computeChunkName(): string { if (this.facadeModule !== null && this.facadeModule.chunkAlias) { - return this.facadeModule.chunkAlias; + return sanitizeFileName(this.facadeModule.chunkAlias); } for (const module of this.orderedModules) { - if (module.chunkAlias) return module.chunkAlias; + if (module.chunkAlias) return sanitizeFileName(module.chunkAlias); } return 'chunk'; } diff --git a/src/utils/relativeId.ts b/src/utils/relativeId.ts index 3710e6146da..59012a1e206 100644 --- a/src/utils/relativeId.ts +++ b/src/utils/relativeId.ts @@ -19,7 +19,5 @@ export function isPlainName(name: string) { (name[1] === '.' && (name[2] === '/' || (name[2] === '.' && name[3] === '/'))) ) return false; - // not a URL - if (name.indexOf(':') !== -1) return false; return true; } diff --git a/src/utils/sanitize-file-name.ts b/src/utils/sanitize-file-name.ts new file mode 100644 index 00000000000..df0c0fb3692 --- /dev/null +++ b/src/utils/sanitize-file-name.ts @@ -0,0 +1,3 @@ +export function sanitizeFileName(name: string): string { + return name.replace(/[\0]/g, '_'); +} diff --git a/test/chunking-form/samples/sanitize-chunk-names/_config.js b/test/chunking-form/samples/sanitize-chunk-names/_config.js new file mode 100644 index 00000000000..ef6faaae57c --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/_config.js @@ -0,0 +1,20 @@ +module.exports = { + description: 'sanitizes chunk names from virtual entry points', + options: { + input: ['main1'], + plugins: [ + { + options(options) { + options.input = ['\0virtual:entry-1', '\0virtual:entry-2']; + return options; + }, + resolveId(id) { + return id; + }, + load(id) { + return 'export default ' + JSON.stringify(id); + } + } + ] + } +}; diff --git a/test/chunking-form/samples/sanitize-chunk-names/_expected/amd/_virtual:entry-1.js b/test/chunking-form/samples/sanitize-chunk-names/_expected/amd/_virtual:entry-1.js new file mode 100644 index 00000000000..f41ce27ab24 --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/_expected/amd/_virtual:entry-1.js @@ -0,0 +1,7 @@ +define(function () { 'use strict'; + + var _virtual_entry1 = "\u0000virtual:entry-1"; + + return _virtual_entry1; + +}); diff --git a/test/chunking-form/samples/sanitize-chunk-names/_expected/amd/_virtual:entry-2.js b/test/chunking-form/samples/sanitize-chunk-names/_expected/amd/_virtual:entry-2.js new file mode 100644 index 00000000000..5746e5e45e9 --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/_expected/amd/_virtual:entry-2.js @@ -0,0 +1,7 @@ +define(function () { 'use strict'; + + var _virtual_entry2 = "\u0000virtual:entry-2"; + + return _virtual_entry2; + +}); diff --git a/test/chunking-form/samples/sanitize-chunk-names/_expected/cjs/_virtual:entry-1.js b/test/chunking-form/samples/sanitize-chunk-names/_expected/cjs/_virtual:entry-1.js new file mode 100644 index 00000000000..437d8954ef4 --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/_expected/cjs/_virtual:entry-1.js @@ -0,0 +1,5 @@ +'use strict'; + +var _virtual_entry1 = "\u0000virtual:entry-1"; + +module.exports = _virtual_entry1; diff --git a/test/chunking-form/samples/sanitize-chunk-names/_expected/cjs/_virtual:entry-2.js b/test/chunking-form/samples/sanitize-chunk-names/_expected/cjs/_virtual:entry-2.js new file mode 100644 index 00000000000..d560356654a --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/_expected/cjs/_virtual:entry-2.js @@ -0,0 +1,5 @@ +'use strict'; + +var _virtual_entry2 = "\u0000virtual:entry-2"; + +module.exports = _virtual_entry2; diff --git a/test/chunking-form/samples/sanitize-chunk-names/_expected/es/_virtual:entry-1.js b/test/chunking-form/samples/sanitize-chunk-names/_expected/es/_virtual:entry-1.js new file mode 100644 index 00000000000..9fa2c9b2926 --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/_expected/es/_virtual:entry-1.js @@ -0,0 +1,3 @@ +var _virtual_entry1 = "\u0000virtual:entry-1"; + +export default _virtual_entry1; diff --git a/test/chunking-form/samples/sanitize-chunk-names/_expected/es/_virtual:entry-2.js b/test/chunking-form/samples/sanitize-chunk-names/_expected/es/_virtual:entry-2.js new file mode 100644 index 00000000000..c228f2ab38b --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/_expected/es/_virtual:entry-2.js @@ -0,0 +1,3 @@ +var _virtual_entry2 = "\u0000virtual:entry-2"; + +export default _virtual_entry2; diff --git a/test/chunking-form/samples/sanitize-chunk-names/_expected/system/_virtual:entry-1.js b/test/chunking-form/samples/sanitize-chunk-names/_expected/system/_virtual:entry-1.js new file mode 100644 index 00000000000..c0250b086d0 --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/_expected/system/_virtual:entry-1.js @@ -0,0 +1,10 @@ +System.register([], function (exports, module) { + 'use strict'; + return { + execute: function () { + + var _virtual_entry1 = exports('default', "\u0000virtual:entry-1"); + + } + }; +}); diff --git a/test/chunking-form/samples/sanitize-chunk-names/_expected/system/_virtual:entry-2.js b/test/chunking-form/samples/sanitize-chunk-names/_expected/system/_virtual:entry-2.js new file mode 100644 index 00000000000..fd6a88ae261 --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/_expected/system/_virtual:entry-2.js @@ -0,0 +1,10 @@ +System.register([], function (exports, module) { + 'use strict'; + return { + execute: function () { + + var _virtual_entry2 = exports('default', "\u0000virtual:entry-2"); + + } + }; +}); diff --git a/test/chunking-form/samples/sanitize-chunk-names/main1.js b/test/chunking-form/samples/sanitize-chunk-names/main1.js new file mode 100644 index 00000000000..fda34828717 --- /dev/null +++ b/test/chunking-form/samples/sanitize-chunk-names/main1.js @@ -0,0 +1 @@ +console.log('main1');