better error for missing store - fixes

pull/1811/head
Rich Harris 7 years ago
parent c29dc42e2e
commit 8929aebbec

@ -146,9 +146,18 @@ export default function dom(
const hasInitHooks = !!(templateProperties.oncreate || templateProperties.onstate || templateProperties.onupdate); const hasInitHooks = !!(templateProperties.oncreate || templateProperties.onstate || templateProperties.onupdate);
const constructorBody = deindent` const constructorBody = deindent`
${options.dev && `this._debugName = '${debugName}';`} ${options.dev && deindent`
${options.dev && !component.customElement && this._debugName = '${debugName}';
`if (!options || (!options.target && !options.root)) throw new Error("'target' is a required option");`} ${!component.customElement && deindent`
if (!options || (!options.target && !options.root)) {
throw new Error("'target' is a required option");
}`}
${storeProps.length > 0 && deindent`
if (!options.store) {
throw new Error("${debugName} references store properties, but no store was provided");
}`}
`}
@init(this, options); @init(this, options);
${templateProperties.store && `this.store = %store();`} ${templateProperties.store && `this.store = %store();`}
${component.refs.size > 0 && `this.refs = {};`} ${component.refs.size > 0 && `this.refs = {};`}

@ -75,6 +75,8 @@ export default function ssr(
); );
} }
const debugName = `<${component.customElement ? component.tag : name}>`;
// TODO concatenate CSS maps // TODO concatenate CSS maps
const result = (deindent` const result = (deindent`
${js} ${js}
@ -113,6 +115,12 @@ export default function ssr(
${templateProperties.store && `options.store = %store();`} ${templateProperties.store && `options.store = %store();`}
__result.addComponent(${name}); __result.addComponent(${name});
${options.dev && storeProps.length > 0 && deindent`
if (!options.store) {
throw new Error("${debugName} references store properties, but no store was provided");
}
`}
ctx = Object.assign(${initialState.join(', ')}); ctx = Object.assign(${initialState.join(', ')});
${computations.map( ${computations.map(

@ -28,7 +28,10 @@ function create_main_fragment(component, ctx) {
function Main(options) { function Main(options) {
this._debugName = '<Main>'; this._debugName = '<Main>';
if (!options || (!options.target && !options.root)) throw new Error("'target' is a required option"); if (!options || (!options.target && !options.root)) {
throw new Error("'target' is a required option");
}
init(this, options); init(this, options);
this._state = assign({}, options.data); this._state = assign({}, options.data);
this._intro = true; this._intro = true;

@ -69,7 +69,6 @@ describe("runtime", () => {
compileOptions = config.compileOptions || {}; compileOptions = config.compileOptions || {};
compileOptions.shared = shared; compileOptions.shared = shared;
compileOptions.hydratable = hydrate; compileOptions.hydratable = hydrate;
compileOptions.dev = config.dev;
compileOptions.store = !!config.store; compileOptions.store = !!config.store;
compileOptions.immutable = config.immutable; compileOptions.immutable = config.immutable;
compileOptions.skipIntroByDefault = config.skipIntroByDefault; compileOptions.skipIntroByDefault = config.skipIntroByDefault;
@ -171,7 +170,11 @@ describe("runtime", () => {
}) })
.catch(err => { .catch(err => {
if (config.error && !unintendedError) { if (config.error && !unintendedError) {
config.error(assert, err); if (typeof config.error === 'function') {
config.error(assert, err);
} else {
assert.equal(config.error, err.message);
}
} else { } else {
failed.add(dir); failed.add(dir);
showOutput(cwd, { showOutput(cwd, {

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
html: ` html: `
<select> <select>

@ -0,0 +1,7 @@
export default {
compileOptions: {
dev: true
},
error: `<Main$> references store properties, but no store was provided`
};

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
error(assert, error) { error(assert, error) {
assert.equal(error.message, `<Main$>.set was called without an object of data key-values to update.`); assert.equal(error.message, `<Main$>.set was called without an object of data key-values to update.`);

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
test(assert, component) { test(assert, component) {
const warn = console.warn; // eslint-disable-line no-console const warn = console.warn; // eslint-disable-line no-console

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
data: { data: {
x: true x: true

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
data: { data: {
bar: 1 bar: 1

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
warnings: [ warnings: [
`<Main$> was created without expected data property 'value'` `<Main$> was created without expected data property 'value'`

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
data: { data: {
letters: [ letters: [

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
warnings: [] warnings: []
}; };

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
warnings: [ warnings: [
`<Main$> was created without expected data property 'foo'`, `<Main$> was created without expected data property 'foo'`,

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
data: { data: {
a: 42 a: 42

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
test ( assert, component ) { test ( assert, component ) {
try { try {

@ -1,7 +1,9 @@
import path from 'path'; import path from 'path';
export default { export default {
dev: true, compileOptions: {
dev: true
},
test(assert, component, target) { test(assert, component, target) {
const h1 = target.querySelector('h1'); const h1 = target.querySelector('h1');

@ -8,10 +8,10 @@ export default {
html: ``, html: ``,
compileOptions: { compileOptions: {
dev: true dev: true,
nestedTransitions: true,
skipIntroByDefault: true,
}, },
nestedTransitions: true,
skipIntroByDefault: true,
test(assert, component, target, window, raf) { test(assert, component, target, window, raf) {
component.set({ visible: true }); component.set({ visible: true });

@ -1,5 +1,7 @@
export default { export default {
dev: true, compileOptions: {
dev: true
},
data: { data: {
a: 42 a: 42

@ -9,7 +9,9 @@ export default {
html: `<h1>Hello world!</h1>`, html: `<h1>Hello world!</h1>`,
dev: true, compileOptions: {
dev: true
},
test(assert, component) { test(assert, component) {
const names = []; const names = [];

@ -124,8 +124,16 @@ describe("ssr", () => {
assert.htmlEqual(html, config.html); assert.htmlEqual(html, config.html);
} }
} catch (err) { } catch (err) {
showOutput(cwd, { generate: "ssr" }); if (config.error) {
throw err; if (typeof config.error === 'function') {
config.error(assert, err);
} else {
assert.equal(config.error, err.message);
}
} else {
showOutput(cwd, { generate: "ssr" });
throw err;
}
} }
}); });
}); });

Loading…
Cancel
Save