Skip to content

Commit 25a38bd

Browse files
Fix export default regexs
Fixes rollup#1798
1 parent 223c5f3 commit 25a38bd

File tree

12 files changed

+438
-2
lines changed

12 files changed

+438
-2
lines changed

src/ast/nodes/ExportDefaultDeclaration.js

+16-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@ import ExecutionPathOptions from '../ExecutionPathOptions';
33

44
const functionOrClassDeclaration = /^(?:Function|Class)Declaration/;
55

6+
function buildRegexWithSpaces (re) {
7+
const spaceOrComment = "(?:" + [
8+
/\s/.source, // Space
9+
/\/\/.*[\n\r]/.source, // Single line comment
10+
/\/\*[^]*?\*\//.source, // Multiline comment. There is [^] instead of . because it also matches \n
11+
].join( "|" ) + ")";
12+
return new RegExp( re.source.replace( /\s|\\s/g, spaceOrComment ), re.flags );
13+
}
14+
15+
const sourceRE = {
16+
exportDefault: buildRegexWithSpaces( /^ *export +default */ ),
17+
declarationHeader: buildRegexWithSpaces( /^ *export +default +(?:(?:async +)?function(?: *\*)?|class)/ ),
18+
};
19+
620
export default class ExportDefaultDeclaration extends Node {
721
bindNode () {
822
if ( this._declarationName ) {
@@ -37,7 +51,7 @@ export default class ExportDefaultDeclaration extends Node {
3751
const statementStr = code.original.slice( this.start, this.end );
3852

3953
// paren workaround: find first non-whitespace character position after `export default`
40-
const declaration_start = this.start + statementStr.match( /^\s*export\s+default\s*/ )[ 0 ].length;
54+
const declaration_start = this.start + statementStr.match( sourceRE.exportDefault )[ 0 ].length;
4155

4256
if ( functionOrClassDeclaration.test(this.declaration.type) ) {
4357
if ( treeshakeable ) {
@@ -46,7 +60,7 @@ export default class ExportDefaultDeclaration extends Node {
4660

4761
// Add the id to anonymous declarations
4862
if ( !this.declaration.id ) {
49-
const id_insertPos = this.start + statementStr.match( /^\s*export\s+default\s*(?:function|class)/ )[ 0 ].length;
63+
const id_insertPos = this.start + statementStr.match( sourceRE.declarationHeader )[ 0 ].length;
5064
code.appendLeft( id_insertPos, ` ${name}` );
5165
}
5266

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = {
2+
description: 'export default [Declaration] with spaces and comments'
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
define(function () { 'use strict';
2+
3+
function Fn
4+
5+
//iian iaouns
6+
/* aaain ob skubz
7+
8+
9+
*/
10+
11+
() {
12+
console.log("Foo");
13+
}
14+
15+
async /* [no LineTerminator here] */ function Async
16+
17+
//iian iaouns
18+
/* aaain ob skubz */
19+
20+
() {
21+
console.log("Foo");
22+
}
23+
24+
function
25+
26+
/* oiasnpiueno */
27+
/// iauianpns
28+
29+
/* aiusni
30+
*/
31+
32+
* Generator
33+
34+
//iian iaouns
35+
/* aaain ob skubz */
36+
37+
() {
38+
console.log("Foo");
39+
}
40+
41+
class Class
42+
43+
/* oiasnpiueno */
44+
/// iauianpns
45+
46+
/* aiusni
47+
*/
48+
49+
//iian iaouns
50+
/* aaain ob skubz */
51+
52+
{
53+
constructor() {
54+
console.log("Foo");
55+
}
56+
}
57+
58+
Fn();
59+
Async();
60+
Generator();
61+
new Class();
62+
63+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use strict';
2+
3+
function Fn
4+
5+
//iian iaouns
6+
/* aaain ob skubz
7+
8+
9+
*/
10+
11+
() {
12+
console.log("Foo");
13+
}
14+
15+
async /* [no LineTerminator here] */ function Async
16+
17+
//iian iaouns
18+
/* aaain ob skubz */
19+
20+
() {
21+
console.log("Foo");
22+
}
23+
24+
function
25+
26+
/* oiasnpiueno */
27+
/// iauianpns
28+
29+
/* aiusni
30+
*/
31+
32+
* Generator
33+
34+
//iian iaouns
35+
/* aaain ob skubz */
36+
37+
() {
38+
console.log("Foo");
39+
}
40+
41+
class Class
42+
43+
/* oiasnpiueno */
44+
/// iauianpns
45+
46+
/* aiusni
47+
*/
48+
49+
//iian iaouns
50+
/* aaain ob skubz */
51+
52+
{
53+
constructor() {
54+
console.log("Foo");
55+
}
56+
}
57+
58+
Fn();
59+
Async();
60+
Generator();
61+
new Class();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
function Fn
2+
3+
//iian iaouns
4+
/* aaain ob skubz
5+
6+
7+
*/
8+
9+
() {
10+
console.log("Foo");
11+
}
12+
13+
async /* [no LineTerminator here] */ function Async
14+
15+
//iian iaouns
16+
/* aaain ob skubz */
17+
18+
() {
19+
console.log("Foo");
20+
}
21+
22+
function
23+
24+
/* oiasnpiueno */
25+
/// iauianpns
26+
27+
/* aiusni
28+
*/
29+
30+
* Generator
31+
32+
//iian iaouns
33+
/* aaain ob skubz */
34+
35+
() {
36+
console.log("Foo");
37+
}
38+
39+
class Class
40+
41+
/* oiasnpiueno */
42+
/// iauianpns
43+
44+
/* aiusni
45+
*/
46+
47+
//iian iaouns
48+
/* aaain ob skubz */
49+
50+
{
51+
constructor() {
52+
console.log("Foo");
53+
}
54+
}
55+
56+
Fn();
57+
Async();
58+
Generator();
59+
new Class();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
(function () {
2+
'use strict';
3+
4+
function Fn
5+
6+
//iian iaouns
7+
/* aaain ob skubz
8+
9+
10+
*/
11+
12+
() {
13+
console.log("Foo");
14+
}
15+
16+
async /* [no LineTerminator here] */ function Async
17+
18+
//iian iaouns
19+
/* aaain ob skubz */
20+
21+
() {
22+
console.log("Foo");
23+
}
24+
25+
function
26+
27+
/* oiasnpiueno */
28+
/// iauianpns
29+
30+
/* aiusni
31+
*/
32+
33+
* Generator
34+
35+
//iian iaouns
36+
/* aaain ob skubz */
37+
38+
() {
39+
console.log("Foo");
40+
}
41+
42+
class Class
43+
44+
/* oiasnpiueno */
45+
/// iauianpns
46+
47+
/* aiusni
48+
*/
49+
50+
//iian iaouns
51+
/* aaain ob skubz */
52+
53+
{
54+
constructor() {
55+
console.log("Foo");
56+
}
57+
}
58+
59+
Fn();
60+
Async();
61+
Generator();
62+
new Class();
63+
64+
}());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
(function (global, factory) {
2+
typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
3+
typeof define === 'function' && define.amd ? define(factory) :
4+
(factory());
5+
}(this, (function () { 'use strict';
6+
7+
function Fn
8+
9+
//iian iaouns
10+
/* aaain ob skubz
11+
12+
13+
*/
14+
15+
() {
16+
console.log("Foo");
17+
}
18+
19+
async /* [no LineTerminator here] */ function Async
20+
21+
//iian iaouns
22+
/* aaain ob skubz */
23+
24+
() {
25+
console.log("Foo");
26+
}
27+
28+
function
29+
30+
/* oiasnpiueno */
31+
/// iauianpns
32+
33+
/* aiusni
34+
*/
35+
36+
* Generator
37+
38+
//iian iaouns
39+
/* aaain ob skubz */
40+
41+
() {
42+
console.log("Foo");
43+
}
44+
45+
class Class
46+
47+
/* oiasnpiueno */
48+
/// iauianpns
49+
50+
/* aiusni
51+
*/
52+
53+
//iian iaouns
54+
/* aaain ob skubz */
55+
56+
{
57+
constructor() {
58+
console.log("Foo");
59+
}
60+
}
61+
62+
Fn();
63+
Async();
64+
Generator();
65+
new Class();
66+
67+
})));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export
2+
3+
/* comment */
4+
// aaaa
5+
6+
/* foo */
7+
8+
default // jsjjjsjjjjsjs
9+
10+
/* jsjjddjksj
11+
*/ // Too many comments lol
12+
13+
async /* [no LineTerminator here] */ function
14+
15+
//iian iaouns
16+
/* aaain ob skubz */
17+
18+
() {
19+
console.log("Foo");
20+
}

0 commit comments

Comments
 (0)