Merge pull request #186 from sveltejs/gh-185

allow whitelisted globals
pull/201/head
Rich Harris 9 years ago committed by GitHub
commit 9e347f1685

@ -6,8 +6,9 @@ import isReference from '../utils/isReference.js';
import counter from './utils/counter.js'; import counter from './utils/counter.js';
import flattenReference from '../utils/flattenReference.js'; import flattenReference from '../utils/flattenReference.js';
import visitors from './visitors/index.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 = { const generator = {
addElement ( name, renderStatement, needsIdentifier = false ) { addElement ( name, renderStatement, needsIdentifier = false ) {
const isToplevel = generator.current.localElementDepth === 0; 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 ] ) { if ( parent && parent.type === 'CallExpression' && node === parent.callee && generator.helpers[ name ] ) {
generator.code.prependRight( node.start, `template.helpers.` ); generator.code.prependRight( node.start, `template.helpers.` );
return;
} }
if ( name === 'event' && isEventHandler ) { else if ( name === 'event' && isEventHandler ) {
return; // noop
} }
if ( contexts[ name ] ) { else if ( contexts[ name ] ) {
dependencies.push( ...contextDependencies[ name ] ); dependencies.push( ...contextDependencies[ name ] );
if ( !~usedContexts.indexOf( name ) ) usedContexts.push( name ); if ( !~usedContexts.indexOf( name ) ) usedContexts.push( name );
} else if ( indexes[ name ] ) { }
else if ( indexes[ name ] ) {
const context = indexes[ name ]; const context = indexes[ name ];
if ( !~usedContexts.indexOf( context ) ) usedContexts.push( context ); if ( !~usedContexts.indexOf( context ) ) usedContexts.push( context );
}
else {
if ( globalWhitelist[ name ] ) {
generator.code.prependRight( node.start, `( '${name}' in root ? root.` );
generator.code.appendLeft( node.object.end, ` : ${name} )` );
} else { } else {
dependencies.push( name );
generator.code.prependRight( node.start, `root.` ); generator.code.prependRight( node.start, `root.` );
}
dependencies.push( name );
if ( !~usedContexts.indexOf( 'root' ) ) usedContexts.push( 'root' ); if ( !~usedContexts.indexOf( 'root' ) ) usedContexts.push( 'root' );
} }

@ -5,12 +5,12 @@ import namespaces from '../utils/namespaces.js';
import getIntro from './utils/getIntro.js'; import getIntro from './utils/getIntro.js';
import getOutro from './utils/getOutro.js'; import getOutro from './utils/getOutro.js';
import processCss from './css/process.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 ) { export default function generate ( parsed, source, options, names ) {
const format = options.format || 'es'; const format = options.format || 'es';
const generator = Generator( parsed, source, names ); const generator = createGenerator( parsed, source, names );
const templateProperties = {}; const templateProperties = {};
const imports = []; const imports = [];

@ -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,
};

@ -0,0 +1,12 @@
export default {
data: {
x: 10
},
html: '5',
test ( assert, component, target ) {
component.set({ x: 3 });
assert.htmlEqual( target.innerHTML, '3' );
}
};

@ -0,0 +1,12 @@
export default {
data: {
x: 10
},
html: 'potato',
test ( assert, component, target ) {
component.set({ x: 3 });
assert.htmlEqual( target.innerHTML, 'potato' );
}
};

@ -0,0 +1,15 @@
{{Math.min(x, 5)}}
<script>
export default {
data () {
return {
Math: {
min ( a, b ) {
return 'potato';
}
}
};
}
};
</script>

@ -0,0 +1,12 @@
export default {
data: {
x: 10
},
html: 'potato',
test ( assert, component, target ) {
component.set({ x: 3 });
assert.htmlEqual( target.innerHTML, 'potato' );
}
};

@ -0,0 +1,13 @@
{{Math.min(x, 5)}}
<script>
export default {
helpers: {
Math: {
min ( a, b ) {
return 'potato';
}
}
}
};
</script>
Loading…
Cancel
Save