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)}} + +