Skip to content

Commit e00be42

Browse files
committed
feat: ensure ending in semicolon for prepends/appends
1 parent 44f0b76 commit e00be42

6 files changed

Lines changed: 57 additions & 49 deletions

File tree

spec/bundler.spec.js

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -92,17 +92,17 @@ test('Bundler traces files', t => {
9292
'entry-bundle': {
9393
files: [
9494
{contents: 'var pre = 1;'},
95-
{contents: 'setup'},
96-
{contents: 'dumber-module-loader'},
95+
{contents: 'setup;'},
96+
{contents: 'dumber-module-loader;'},
9797
{contents: 'define.switchToUserSpace();'},
9898
{path: 'src/app.js', contents: "define('app',[\"foo\",\"page/one\"],1);", sourceMap: undefined},
9999
{path: 'src/page/one.js', contents: "define('page/one',[\"foo/bar\",\"loo\"],1);", sourceMap: undefined},
100100
{contents: 'define.switchToPackageSpace();'},
101101
{path: 'node_modules/foo/bar.js', contents: "define('foo/bar',[],1);", sourceMap: undefined},
102-
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[\"loo\"],1);define('foo',['foo/index'],function(m){return m;});\n", sourceMap: undefined},
103-
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});\n", sourceMap: undefined},
102+
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[\"loo\"],1);define('foo',['foo/index'],function(m){return m;});", sourceMap: undefined},
103+
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});", sourceMap: undefined},
104104
{contents: 'define.switchToUserSpace();'},
105-
{contents: 'after'},
105+
{contents: 'after;'},
106106
{contents: 'var ape = 1;'},
107107
],
108108
config: {
@@ -147,12 +147,12 @@ test('Bundler traces files, split bundles', t => {
147147
'entry-bundle': {
148148
files: [
149149
{contents: 'var pre = 1;'},
150-
{contents: 'setup'},
151-
{contents: 'dumber-module-loader'},
150+
{contents: 'setup;'},
151+
{contents: 'dumber-module-loader;'},
152152
{contents: 'define.switchToUserSpace();'},
153153
{path: 'src/app.js', contents: "define('app',[\"foo\",\"page/one\"],1);", sourceMap: undefined},
154154
{path: 'src/page/one.js', contents: "define('page/one',[\"foo/bar\",\"loo\"],1);", sourceMap: undefined},
155-
{contents: 'after'},
155+
{contents: 'after;'},
156156
{contents: 'var ape = 1;'},
157157
],
158158
config: {
@@ -169,8 +169,8 @@ test('Bundler traces files, split bundles', t => {
169169
files: [
170170
{contents: 'define.switchToPackageSpace();'},
171171
{path: 'node_modules/foo/bar.js', contents: "define('foo/bar',[],1);", sourceMap: undefined},
172-
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[\"loo\"],1);define('foo',['foo/index'],function(m){return m;});\n", sourceMap: undefined},
173-
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});\n", sourceMap: undefined},
172+
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[\"loo\"],1);define('foo',['foo/index'],function(m){return m;});", sourceMap: undefined},
173+
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});", sourceMap: undefined},
174174
{contents: 'define.switchToUserSpace();'},
175175
]
176176
}
@@ -218,9 +218,9 @@ test('Bundler traces files, split bundles, case2', t => {
218218
'main': {
219219
files: [
220220
{contents: 'var pre = 1;'},
221-
{contents: 'setup'},
222-
{contents: 'dumber-module-loader'},
223-
{contents: 'after'},
221+
{contents: 'setup;'},
222+
{contents: 'dumber-module-loader;'},
223+
{contents: 'after;'},
224224
{contents: 'var ape = 1;'},
225225
],
226226
config: {
@@ -243,15 +243,15 @@ test('Bundler traces files, split bundles, case2', t => {
243243
{path: 'src/app.js', contents: "define('app',[\"foo\",\"page/one\"],1);", sourceMap: undefined},
244244
{path: 'src/page/one.js', contents: "define('page/one',[\"foo/bar\",\"loo\"],1);", sourceMap: undefined},
245245
{contents: 'define.switchToPackageSpace();'},
246-
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});\n", sourceMap: undefined},
246+
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});", sourceMap: undefined},
247247
{contents: 'define.switchToUserSpace();'},
248248
]
249249
},
250250
'vendor': {
251251
files: [
252252
{contents: 'define.switchToPackageSpace();'},
253253
{path: 'node_modules/foo/bar.js', contents: "define('foo/bar',[],1);", sourceMap: undefined},
254-
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[\"loo\"],1);define('foo',['foo/index'],function(m){return m;});\n", sourceMap: undefined},
254+
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[\"loo\"],1);define('foo',['foo/index'],function(m){return m;});", sourceMap: undefined},
255255
{contents: 'define.switchToUserSpace();'},
256256
]
257257
}
@@ -285,12 +285,12 @@ test('Bundler traces files, sorts shim', t => {
285285
t.deepEqual(bundleMap, {
286286
'entry-bundle': {
287287
files: [
288-
{contents: 'dumber-module-loader'},
288+
{contents: 'dumber-module-loader;'},
289289
{contents: 'define.switchToUserSpace();'},
290290
{path: 'src/app.js', contents: "define('app',[\"fs\",\"bootstrap\"],1);", sourceMap: undefined},
291291
{contents: 'define.switchToPackageSpace();'},
292292
{path: 'node_modules/jquery/dist/jquery.js', contents: 'define("jquery",[],1);', sourceMap: undefined},
293-
{path: 'node_modules/bootstrap/dist/bootstrap.js', contents: "define('bootstrap/dist/bootstrap',[\"jquery\"],function(){return jQuery;});define('bootstrap',['bootstrap/dist/bootstrap'],function(m){return m;});\n", sourceMap: undefined},
293+
{path: 'node_modules/bootstrap/dist/bootstrap.js', contents: "define('bootstrap/dist/bootstrap',[\"jquery\"],function(){return jQuery;});define('bootstrap',['bootstrap/dist/bootstrap'],function(m){return m;});", sourceMap: undefined},
294294
// mockTrace didn't touch fs stub, it is different in real usage
295295
{path: '__stub__/fs', contents: "define(function(){return {};});", sourceMap: undefined},
296296
{contents: 'define.switchToUserSpace();'},
@@ -326,7 +326,7 @@ test('Bundler ignores module when onRequire returns false', t => {
326326
t.deepEqual(bundleMap, {
327327
'entry-bundle': {
328328
files: [
329-
{contents: 'dumber-module-loader'},
329+
{contents: 'dumber-module-loader;'},
330330
{contents: 'define.switchToUserSpace();'},
331331
{path: 'src/app.js', contents: "define('app',[\"foo\"],1);", sourceMap: undefined},
332332
],
@@ -365,12 +365,12 @@ test('Bundler replaces deps when onRequire returns array', t => {
365365
t.deepEqual(bundleMap, {
366366
'entry-bundle': {
367367
files: [
368-
{contents: 'dumber-module-loader'},
368+
{contents: 'dumber-module-loader;'},
369369
{contents: 'define.switchToUserSpace();'},
370370
{path: 'src/app.js', contents: "define('app',[\"foo\"],1);", sourceMap: undefined},
371371
{contents: 'define.switchToPackageSpace();'},
372-
{path: 'node_modules/bar/index.js', contents: "define('bar/index',[],1);define('bar',['bar/index'],function(m){return m;});\n", sourceMap: undefined},
373-
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});\n", sourceMap: undefined},
372+
{path: 'node_modules/bar/index.js', contents: "define('bar/index',[],1);define('bar',['bar/index'],function(m){return m;});", sourceMap: undefined},
373+
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});", sourceMap: undefined},
374374
{contents: 'define.switchToUserSpace();'},
375375
],
376376
config: {
@@ -407,12 +407,12 @@ test('Bundler supports implementation returned by onRequire', t => {
407407
t.deepEqual(bundleMap, {
408408
'entry-bundle': {
409409
files: [
410-
{contents: 'dumber-module-loader'},
410+
{contents: 'dumber-module-loader;'},
411411
{contents: 'define.switchToUserSpace();'},
412412
{path: 'src/app.js', contents: "define('app',[\"foo\"],1);", sourceMap: undefined},
413413
{path: '__on_require__/foo', contents: "define('foo',[\"loo\"],1);", sourceMap: undefined},
414414
{contents: 'define.switchToPackageSpace();'},
415-
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});\n", sourceMap: undefined},
415+
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});", sourceMap: undefined},
416416
{contents: 'define.switchToUserSpace();'},
417417
],
418418
config: {
@@ -448,11 +448,11 @@ test('Bundler swallows onRequire exception', t => {
448448
t.deepEqual(bundleMap, {
449449
'entry-bundle': {
450450
files: [
451-
{contents: 'dumber-module-loader'},
451+
{contents: 'dumber-module-loader;'},
452452
{contents: 'define.switchToUserSpace();'},
453453
{path: 'src/app.js', contents: "define('app',[\"foo\"],1);", sourceMap: undefined},
454454
{contents: 'define.switchToPackageSpace();'},
455-
{path: 'node_modules/foo/foo.js', contents: "define('foo/foo',[],1);define('foo',['foo/foo'],function(m){return m;});\n", sourceMap: undefined},
455+
{path: 'node_modules/foo/foo.js', contents: "define('foo/foo',[],1);define('foo',['foo/foo'],function(m){return m;});", sourceMap: undefined},
456456
{contents: 'define.switchToUserSpace();'},
457457
],
458458
config: {
@@ -488,11 +488,11 @@ test('Bundler swallows onRequire promise rejection', t => {
488488
t.deepEqual(bundleMap, {
489489
'entry-bundle': {
490490
files: [
491-
{contents: 'dumber-module-loader'},
491+
{contents: 'dumber-module-loader;'},
492492
{contents: 'define.switchToUserSpace();'},
493493
{path: 'src/app.js', contents: "define('app',[\"foo\"],1);", sourceMap: undefined},
494494
{contents: 'define.switchToPackageSpace();'},
495-
{path: 'node_modules/foo/foo.js', contents: "define('foo/foo',[],1);define('foo',['foo/foo'],function(m){return m;});\n", sourceMap: undefined},
495+
{path: 'node_modules/foo/foo.js', contents: "define('foo/foo',[],1);define('foo',['foo/foo'],function(m){return m;});", sourceMap: undefined},
496496
{contents: 'define.switchToUserSpace();'},
497497
],
498498
config: {
@@ -558,7 +558,7 @@ test('Bundler traces files, split bundles, continuously update bundles in watch
558558
t.deepEqual(bundleMap, {
559559
'entry-bundle': {
560560
files: [
561-
{contents: 'dumber-module-loader'}
561+
{contents: 'dumber-module-loader;'}
562562
],
563563
config: {
564564
baseUrl: 'dist',
@@ -593,7 +593,7 @@ test('Bundler traces files, split bundles, continuously update bundles in watch
593593
'vendor-bundle': {
594594
files: [
595595
{contents: 'define.switchToPackageSpace();'},
596-
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[],1);define('foo',['foo/index'],function(m){return m;});\n", sourceMap: undefined},
596+
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[],1);define('foo',['foo/index'],function(m){return m;});", sourceMap: undefined},
597597
{contents: 'define.switchToUserSpace();'}
598598
]
599599
}
@@ -609,9 +609,9 @@ test('Bundler traces files, split bundles, continuously update bundles in watch
609609
t.deepEqual(bundleMap, {
610610
'entry-bundle': {
611611
files: [
612-
{contents: 'dumber-module-loader'},
612+
{contents: 'dumber-module-loader;'},
613613
{contents: 'define.switchToPackageSpace();'},
614-
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});\n", sourceMap: undefined},
614+
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});", sourceMap: undefined},
615615
{contents: 'define.switchToUserSpace();'}
616616
],
617617
config: {
@@ -642,7 +642,7 @@ test('Bundler traces files, split bundles, continuously update bundles in watch
642642
files: [
643643
{contents: 'define.switchToPackageSpace();'},
644644
{path: 'node_modules/foo/bar.js', contents: "define('foo/bar',[],1);", sourceMap: undefined},
645-
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[],1);define('foo',['foo/index'],function(m){return m;});\n", sourceMap: undefined},
645+
{path: 'node_modules/foo/index.js', contents: "define('foo/index',[],1);define('foo',['foo/index'],function(m){return m;});", sourceMap: undefined},
646646
{contents: 'define.switchToUserSpace();'}
647647
]
648648
}
@@ -659,9 +659,9 @@ test('Bundler traces files, split bundles, continuously update bundles in watch
659659
t.deepEqual(bundleMap, {
660660
'entry-bundle': {
661661
files: [
662-
{contents: 'dumber-module-loader'},
662+
{contents: 'dumber-module-loader;'},
663663
{contents: 'define.switchToPackageSpace();'},
664-
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});\n", sourceMap: undefined},
664+
{path: 'node_modules/loo/loo.js', contents: "define('loo/loo',[],1);define('loo',['loo/loo'],function(m){return m;});", sourceMap: undefined},
665665
{contents: 'define.switchToUserSpace();'}
666666
],
667667
config: {

spec/shared.spec.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ test('isPackageName returns false for sub id', t => {
4242
t.end();
4343
});
4444

45-
test('contentOrFile returns passed js content', t => {
46-
const content = 'var a = 1;';
45+
test('contentOrFile returns passed js content, ensures end with semicolon', t => {
46+
const content = 'var a = 1\n';
4747

4848
contentOrFile(content)
4949
.then(
50-
result => t.equal(result.contents, content),
50+
result => t.equal(result.contents, 'var a = 1;'),
5151
err => t.fail(err.message)
5252
)
5353
.then(t.end);
@@ -80,7 +80,7 @@ test('contentOrFile reads local js file', t => {
8080

8181
contentOrFile(path, {readFile: buildReadFile({'a.js': 'var a;\n//# sourceMappingURL=abc'})})
8282
.then(
83-
result => t.equal(result.contents, 'var a;\n'),
83+
result => t.equal(result.contents, 'var a;'),
8484
err => t.fail(err.message)
8585
)
8686
.then(t.end);

spec/trace.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ test('trace traces npm js with dist alias', t => {
300300
trace(unit).then(traced => {
301301
t.deepEqual(traced, {
302302
path: 'node_modules/foo/dist/bar.js',
303-
contents: "define('foo/dist/bar',['a','text!./b.css'],function() {});define('foo/bar',['foo/dist/bar'],function(m){return m;});\n",
303+
contents: "define('foo/dist/bar',['a','text!./b.css'],function() {});define('foo/bar',['foo/dist/bar'],function(m){return m;});",
304304
sourceMap: undefined,
305305
moduleId: 'foo/dist/bar',
306306
defined: ['foo/dist/bar', 'foo/bar'],
@@ -323,7 +323,7 @@ test('trace traces npm html with dist alias', t => {
323323
trace(unit).then(traced => {
324324
t.deepEqual(traced, {
325325
path: 'node_modules/foo/dist/cjs/bar.html',
326-
contents: "define('text!foo/dist/cjs/bar.html',function(){return \"<p></p>\";});\ndefine('text!foo/bar.html',['text!foo/dist/cjs/bar.html'],function(m){return m;});\n",
326+
contents: "define('text!foo/dist/cjs/bar.html',function(){return \"<p></p>\";});\ndefine('text!foo/bar.html',['text!foo/dist/cjs/bar.html'],function(m){return m;});",
327327
sourceMap: undefined,
328328
moduleId: 'foo/dist/cjs/bar.html',
329329
defined: ['text!foo/dist/cjs/bar.html', 'text!foo/bar.html'],

spec/transformers/alias.spec.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,31 @@ import alias from '../../src/transformers/alias';
44
test('alias creates aliases for js module', t => {
55
t.deepEqual(alias('from/id', 'to/id'), {
66
defined: 'from/id',
7-
contents: "define('from/id',['to/id'],function(m){return m;});\n"
7+
contents: "define('from/id',['to/id'],function(m){return m;});"
88
});
99
t.deepEqual(alias('from/id.js', 'to/id'), {
1010
defined: 'from/id',
11-
contents: "define('from/id',['to/id'],function(m){return m;});\n"
11+
contents: "define('from/id',['to/id'],function(m){return m;});"
1212
});
1313
t.deepEqual(alias('from/id', 'to/id.js'), {
1414
defined: 'from/id',
15-
contents: "define('from/id',['to/id'],function(m){return m;});\n"
15+
contents: "define('from/id',['to/id'],function(m){return m;});"
1616
});
1717
t.deepEqual(alias('from/id.js', 'to/id.js'), {
1818
defined: 'from/id',
19-
contents: "define('from/id',['to/id'],function(m){return m;});\n"
19+
contents: "define('from/id',['to/id'],function(m){return m;});"
2020
});
2121
t.end();
2222
});
2323

2424
test('alias creates aliases for other modules', t => {
2525
t.deepEqual(alias('from/id.json', 'to/id.json'), {
2626
defined: 'text!from/id.json',
27-
contents: "define('text!from/id.json',['text!to/id.json'],function(m){return m;});\n"
27+
contents: "define('text!from/id.json',['text!to/id.json'],function(m){return m;});"
2828
});
2929
t.deepEqual(alias('from/id.css', 'to/id.css'), {
3030
defined: 'text!from/id.css',
31-
contents: "define('text!from/id.css',['text!to/id.css'],function(m){return m;});\n"
31+
contents: "define('text!from/id.css',['text!to/id.css'],function(m){return m;});"
3232
});
3333
t.end();
3434
});

src/shared.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ export function contentOrFile(pathOrContent, mock) {
7777
});
7878
}
7979

80-
return p.then(text => ({contents: stripSourceMappingUrl(text)}));
80+
return p.then(text => ({
81+
contents: ensureSemicolon(stripSourceMappingUrl(text || ''))
82+
}));
8183
}
8284

8385
export function generateHash(bufOrStr) {
@@ -88,3 +90,9 @@ export function stripSourceMappingUrl(contents) {
8890
return contents.replace(/\/\/(#|@)\s*sourceMappingURL=\S+\s*$/gm, '')
8991
.replace(/\/\*(#|@)\s*sourceMappingURL=\S+\s*\*\//g, '');
9092
}
93+
94+
export function ensureSemicolon(contents) {
95+
let trimed = contents.trim();
96+
if (trimed.slice(-1) === ';') return trimed;
97+
return trimed + ';';
98+
}

src/transformers/alias.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default function (fromId, toId) {
1515
if (parsedFromId.ext) {
1616
let defined = 'text!' + parsedFromId.bareId;
1717
let contents = "define('text!" + parsedFromId.bareId + "',['text!" + parsedToId.bareId +
18-
"'],function(m){return m;});\n";
18+
"'],function(m){return m;});";
1919

2020
return {
2121
defined: defined,
@@ -25,7 +25,7 @@ export default function (fromId, toId) {
2525
return {
2626
defined: parsedFromId.bareId,
2727
contents: "define('" + parsedFromId.bareId + "',['" + parsedToId.bareId +
28-
"'],function(m){return m;});\n"
28+
"'],function(m){return m;});"
2929
};
3030
}
3131
}

0 commit comments

Comments
 (0)