From 8c467bcb88a4510adb0db54daa27509aff9c8f1b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 21 Nov 2017 23:12:02 -0500 Subject: [PATCH] add globals to initial state object --- src/generators/Generator.ts | 16 ++------------ src/generators/dom/index.ts | 18 +++++++++++++++- src/generators/server-side-rendering/index.ts | 21 ++++++++++++++++--- .../_config.js | 2 +- 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/generators/Generator.ts b/src/generators/Generator.ts index 8f2dad24e4..7e1c52eac3 100644 --- a/src/generators/Generator.ts +++ b/src/generators/Generator.ts @@ -6,7 +6,6 @@ import CodeBuilder from '../utils/CodeBuilder'; import getCodeFrame from '../utils/getCodeFrame'; import isReference from '../utils/isReference'; import flattenReference from '../utils/flattenReference'; -import globalWhitelist from '../utils/globalWhitelist'; import reservedNames from '../utils/reservedNames'; import namespaces from '../utils/namespaces'; import { removeNode, removeObjectKey } from '../utils/removeNode'; @@ -267,16 +266,7 @@ export default class Generator { } } - if (globalWhitelist.has(name)) { - code.prependRight(node.start, `('${name}' in state ? state.`); - code.appendLeft( - node.object ? node.object.end : node.end, - ` : ${name})` - ); - } else { - code.prependRight(node.start, `state.`); - } - + code.prependRight(node.start, `state.`); usedContexts.add('state'); } @@ -349,9 +339,7 @@ export default class Generator { }); dependencies.forEach(name => { - if (!globalWhitelist.has(name)) { - this.expectedProperties.add(name); - } + this.expectedProperties.add(name); }); return (expression._dependencies = dependencies); diff --git a/src/generators/dom/index.ts b/src/generators/dom/index.ts index 7c7c4a45dc..1cbf6132cf 100644 --- a/src/generators/dom/index.ts +++ b/src/generators/dom/index.ts @@ -6,6 +6,7 @@ import { walk } from 'estree-walker'; import deindent from '../../utils/deindent'; import { stringify, escape } from '../../utils/stringify'; import CodeBuilder from '../../utils/CodeBuilder'; +import globalWhitelist from '../../utils/globalWhitelist'; import reservedNames from '../../utils/reservedNames'; import visit from './visit'; import shared from './shared'; @@ -184,13 +185,28 @@ export default function dom( const debugName = `<${generator.customElement ? generator.tag : name}>`; + // generate initial state object + const globals = Array.from(generator.expectedProperties).filter(prop => globalWhitelist.has(prop)); + const initialState = []; + if (globals.length > 0) { + initialState.push(`{ ${globals.map(prop => `${prop} : ${prop}`).join(', ')} }`); + } + + if (templateProperties.data) { + initialState.push(`%data()`); + } else if (globals.length === 0) { + initialState.push('{}'); + } + + initialState.push(`options.data`); + const constructorBody = deindent` ${options.dev && `this._debugName = '${debugName}';`} ${options.dev && !generator.customElement && `if (!options || (!options.target && !options._root)) throw new Error("'target' is a required option");`} @init(this, options); ${generator.usesRefs && `this.refs = {};`} - this._state = @assign(${templateProperties.data ? '%data()' : '{}'}, options.data); + this._state = @assign(${initialState.join(', ')}); ${generator.metaBindings} ${computations.length && `this._recompute({ ${Array.from(computationDeps).map(dep => `${dep}: 1`).join(', ')} }, this._state);`} ${options.dev && diff --git a/src/generators/server-side-rendering/index.ts b/src/generators/server-side-rendering/index.ts index b4590df95d..2accc2bc7e 100644 --- a/src/generators/server-side-rendering/index.ts +++ b/src/generators/server-side-rendering/index.ts @@ -6,6 +6,7 @@ import preprocess from './preprocess'; import visit from './visit'; import { removeNode, removeObjectKey } from '../../utils/removeNode'; import getName from '../../utils/getName'; +import globalWhitelist from '../../utils/globalWhitelist'; import { Parsed, Node, CompileOptions } from '../../interfaces'; import { AppendTarget } from './interfaces'; import { stringify } from '../../utils/stringify'; @@ -71,6 +72,22 @@ export default function ssr( { css: null, cssMap: null } : generator.stylesheet.render(options.filename, true); + // generate initial state object + // TODO this doesn't work, because expectedProperties isn't populated + const globals = Array.from(generator.expectedProperties).filter(prop => globalWhitelist.has(prop)); + const initialState = []; + if (globals.length > 0) { + initialState.push(`{ ${globals.map(prop => `${prop} : ${prop}`).join(', ')} }`); + } + + if (templateProperties.data) { + initialState.push(`%data()`); + } else if (globals.length === 0) { + initialState.push('{}'); + } + + initialState.push('state'); + const result = deindent` ${generator.javascript} @@ -83,9 +100,7 @@ export default function ssr( }; ${name}.render = function(state, options) { - ${templateProperties.data - ? `state = Object.assign(%data(), state || {});` - : `state = state || {};`} + state = Object.assign(${initialState.join(', ')}); ${computations.map( ({ key, deps }) => diff --git a/test/runtime/samples/globals-not-overwritten-by-bindings/_config.js b/test/runtime/samples/globals-not-overwritten-by-bindings/_config.js index 0774ada962..a10750e1a0 100644 --- a/test/runtime/samples/globals-not-overwritten-by-bindings/_config.js +++ b/test/runtime/samples/globals-not-overwritten-by-bindings/_config.js @@ -28,7 +28,7 @@ export default { }, third: { description: "Find life's true purpose", - done: true, + done: false, }, }, },