From c353aa244702d844fe2be977260713e8c36023d0 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 11 Dec 2016 13:22:56 -0500 Subject: [PATCH 1/4] allow whitelisted globals (#185) --- src/generate/index.js | 3 ++- src/utils/globalWhitelist.js | 27 +++++++++++++++++++ .../globals-not-dereferenced/_config.js | 12 +++++++++ .../globals-not-dereferenced/main.html | 1 + 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/utils/globalWhitelist.js create mode 100644 test/generator/globals-not-dereferenced/_config.js create mode 100644 test/generator/globals-not-dereferenced/main.html diff --git a/src/generate/index.js b/src/generate/index.js index b54b5217a000..54e4e73982a1 100644 --- a/src/generate/index.js +++ b/src/generate/index.js @@ -5,6 +5,7 @@ import isReference from '../utils/isReference.js'; import counter from './utils/counter.js'; import flattenReference from '../utils/flattenReference.js'; import namespaces from '../utils/namespaces.js'; +import globalWhitelist from '../utils/globalWhitelist.js'; import getIntro from './utils/getIntro.js'; import getOutro from './utils/getOutro.js'; import visitors from './visitors/index.js'; @@ -153,7 +154,7 @@ export default function generate ( parsed, source, options, names ) { } else if ( indexes[ name ] ) { const context = indexes[ name ]; if ( !~usedContexts.indexOf( context ) ) usedContexts.push( context ); - } else { + } else if ( !globalWhitelist[ name ] ) { dependencies.push( name ); generator.code.prependRight( node.start, `root.` ); if ( !~usedContexts.indexOf( 'root' ) ) usedContexts.push( 'root' ); diff --git a/src/utils/globalWhitelist.js b/src/utils/globalWhitelist.js new file mode 100644 index 000000000000..8320b179d778 --- /dev/null +++ b/src/utils/globalWhitelist.js @@ -0,0 +1,27 @@ +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, + null: 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 000000000000..9a0d6175be9b --- /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 000000000000..771042ed0742 --- /dev/null +++ b/test/generator/globals-not-dereferenced/main.html @@ -0,0 +1 @@ +{{Math.min(x, 5)}} From 1cfbfb05d0d02941b63618967fd05e82ff530ccd Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 11 Dec 2016 13:29:37 -0500 Subject: [PATCH 2/4] null is not an identifier --- src/utils/globalWhitelist.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/globalWhitelist.js b/src/utils/globalWhitelist.js index 8320b179d778..467cc4cc6361 100644 --- a/src/utils/globalWhitelist.js +++ b/src/utils/globalWhitelist.js @@ -16,7 +16,6 @@ export default { Math: true, NaN: true, Number: true, - null: true, Object: true, parseFloat: true, parseInt: true, From bdba7531dfc9e34cf207e1438485ae2d270d9385 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 15 Dec 2016 13:06:52 -0500 Subject: [PATCH 3/4] allow local data to override globals --- src/generate/createGenerator.js | 23 +++++++++++++------ .../globals-shadowed-by-data/_config.js | 12 ++++++++++ .../globals-shadowed-by-data/main.html | 15 ++++++++++++ .../globals-shadowed-by-helpers/_config.js | 12 ++++++++++ .../globals-shadowed-by-helpers/main.html | 13 +++++++++++ 5 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 test/generator/globals-shadowed-by-data/_config.js create mode 100644 test/generator/globals-shadowed-by-data/main.html create mode 100644 test/generator/globals-shadowed-by-helpers/_config.js create mode 100644 test/generator/globals-shadowed-by-helpers/main.html diff --git a/src/generate/createGenerator.js b/src/generate/createGenerator.js index e6e2b59d2f5b..4a6608d967b9 100644 --- a/src/generate/createGenerator.js +++ b/src/generate/createGenerator.js @@ -131,22 +131,31 @@ export default function createGenerator ( 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 if ( !globalWhitelist[ name ] ) { + } + + 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/test/generator/globals-shadowed-by-data/_config.js b/test/generator/globals-shadowed-by-data/_config.js new file mode 100644 index 000000000000..ed1fbcef3dec --- /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 000000000000..73fd9437aff3 --- /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 000000000000..ed1fbcef3dec --- /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 000000000000..6746617b6deb --- /dev/null +++ b/test/generator/globals-shadowed-by-helpers/main.html @@ -0,0 +1,13 @@ +{{Math.min(x, 5)}} + + From 2d256840f8c383a0a2839cab8aa3e8c547e3484f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 15 Dec 2016 14:04:08 -0500 Subject: [PATCH 4/4] lint --- src/generate/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/generate/index.js b/src/generate/index.js index 1fc63d88d7bf..7a7226be29f3 100644 --- a/src/generate/index.js +++ b/src/generate/index.js @@ -2,7 +2,6 @@ import MagicString, { Bundle } from 'magic-string'; import CodeBuilder from '../utils/CodeBuilder.js'; import deindent from '../utils/deindent.js'; import namespaces from '../utils/namespaces.js'; -import globalWhitelist from '../utils/globalWhitelist.js'; import getIntro from './utils/getIntro.js'; import getOutro from './utils/getOutro.js'; import processCss from './css/process.js';