add globals to initial state object

pull/924/head
Rich Harris 8 years ago
parent 1643814c93
commit 8c467bcb88

@ -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);

@ -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 &&

@ -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 }) =>

@ -28,7 +28,7 @@ export default {
},
third: {
description: "Find life's true purpose",
done: true,
done: false,
},
},
},

Loading…
Cancel
Save