diff --git a/src/generate/generator.js b/src/generate/createGenerator.js
similarity index 90%
rename from src/generate/generator.js
rename to src/generate/createGenerator.js
index 300f81a857..4a6608d967 100644
--- a/src/generate/generator.js
+++ b/src/generate/createGenerator.js
@@ -6,8 +6,9 @@ import isReference from '../utils/isReference.js';
import counter from './utils/counter.js';
import flattenReference from '../utils/flattenReference.js';
import visitors from './visitors/index.js';
+import globalWhitelist from '../utils/globalWhitelist.js';
-export default function generator ( parsed, source, names ) {
+export default function createGenerator ( parsed, source, names ) {
const generator = {
addElement ( name, renderStatement, needsIdentifier = false ) {
const isToplevel = generator.current.localElementDepth === 0;
@@ -130,22 +131,31 @@ export default function generator ( parsed, source, names ) {
if ( parent && parent.type === 'CallExpression' && node === parent.callee && generator.helpers[ name ] ) {
generator.code.prependRight( node.start, `template.helpers.` );
- return;
}
- if ( name === 'event' && isEventHandler ) {
- return;
+ else if ( name === 'event' && isEventHandler ) {
+ // noop
}
- if ( contexts[ name ] ) {
+ else if ( contexts[ name ] ) {
dependencies.push( ...contextDependencies[ name ] );
if ( !~usedContexts.indexOf( name ) ) usedContexts.push( name );
- } else if ( indexes[ name ] ) {
+ }
+
+ else if ( indexes[ name ] ) {
const context = indexes[ name ];
if ( !~usedContexts.indexOf( context ) ) usedContexts.push( context );
- } else {
+ }
+
+ else {
+ if ( globalWhitelist[ name ] ) {
+ generator.code.prependRight( node.start, `( '${name}' in root ? root.` );
+ generator.code.appendLeft( node.object.end, ` : ${name} )` );
+ } else {
+ generator.code.prependRight( node.start, `root.` );
+ }
+
dependencies.push( name );
- generator.code.prependRight( node.start, `root.` );
if ( !~usedContexts.indexOf( 'root' ) ) usedContexts.push( 'root' );
}
diff --git a/src/generate/index.js b/src/generate/index.js
index eef24505d6..7a7226be29 100644
--- a/src/generate/index.js
+++ b/src/generate/index.js
@@ -5,12 +5,12 @@ import namespaces from '../utils/namespaces.js';
import getIntro from './utils/getIntro.js';
import getOutro from './utils/getOutro.js';
import processCss from './css/process.js';
-import Generator from './generator.js';
+import createGenerator from './createGenerator.js';
export default function generate ( parsed, source, options, names ) {
const format = options.format || 'es';
- const generator = Generator( parsed, source, names );
+ const generator = createGenerator( parsed, source, names );
const templateProperties = {};
const imports = [];
diff --git a/src/utils/globalWhitelist.js b/src/utils/globalWhitelist.js
new file mode 100644
index 0000000000..467cc4cc63
--- /dev/null
+++ b/src/utils/globalWhitelist.js
@@ -0,0 +1,26 @@
+export default {
+ Array: true,
+ Boolean: true,
+ console: true,
+ Date: true,
+ decodeURI: true,
+ decodeURIComponent: true,
+ encodeURI: true,
+ encodeURIComponent: true,
+ Infinity: true,
+ Intl: true,
+ isFinite: true,
+ isNaN: true,
+ JSON: true,
+ Map: true,
+ Math: true,
+ NaN: true,
+ Number: true,
+ Object: true,
+ parseFloat: true,
+ parseInt: true,
+ RegExp: true,
+ Set: true,
+ String: true,
+ undefined: true,
+};
diff --git a/test/generator/globals-not-dereferenced/_config.js b/test/generator/globals-not-dereferenced/_config.js
new file mode 100644
index 0000000000..9a0d6175be
--- /dev/null
+++ b/test/generator/globals-not-dereferenced/_config.js
@@ -0,0 +1,12 @@
+export default {
+ data: {
+ x: 10
+ },
+
+ html: '5',
+
+ test ( assert, component, target ) {
+ component.set({ x: 3 });
+ assert.htmlEqual( target.innerHTML, '3' );
+ }
+};
diff --git a/test/generator/globals-not-dereferenced/main.html b/test/generator/globals-not-dereferenced/main.html
new file mode 100644
index 0000000000..771042ed07
--- /dev/null
+++ b/test/generator/globals-not-dereferenced/main.html
@@ -0,0 +1 @@
+{{Math.min(x, 5)}}
diff --git a/test/generator/globals-shadowed-by-data/_config.js b/test/generator/globals-shadowed-by-data/_config.js
new file mode 100644
index 0000000000..ed1fbcef3d
--- /dev/null
+++ b/test/generator/globals-shadowed-by-data/_config.js
@@ -0,0 +1,12 @@
+export default {
+ data: {
+ x: 10
+ },
+
+ html: 'potato',
+
+ test ( assert, component, target ) {
+ component.set({ x: 3 });
+ assert.htmlEqual( target.innerHTML, 'potato' );
+ }
+};
diff --git a/test/generator/globals-shadowed-by-data/main.html b/test/generator/globals-shadowed-by-data/main.html
new file mode 100644
index 0000000000..73fd9437af
--- /dev/null
+++ b/test/generator/globals-shadowed-by-data/main.html
@@ -0,0 +1,15 @@
+{{Math.min(x, 5)}}
+
+
diff --git a/test/generator/globals-shadowed-by-helpers/_config.js b/test/generator/globals-shadowed-by-helpers/_config.js
new file mode 100644
index 0000000000..ed1fbcef3d
--- /dev/null
+++ b/test/generator/globals-shadowed-by-helpers/_config.js
@@ -0,0 +1,12 @@
+export default {
+ data: {
+ x: 10
+ },
+
+ html: 'potato',
+
+ test ( assert, component, target ) {
+ component.set({ x: 3 });
+ assert.htmlEqual( target.innerHTML, 'potato' );
+ }
+};
diff --git a/test/generator/globals-shadowed-by-helpers/main.html b/test/generator/globals-shadowed-by-helpers/main.html
new file mode 100644
index 0000000000..6746617b6d
--- /dev/null
+++ b/test/generator/globals-shadowed-by-helpers/main.html
@@ -0,0 +1,13 @@
+{{Math.min(x, 5)}}
+
+