better error for missing store - fixes #1807

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

@ -146,9 +146,18 @@ export default function dom(
const hasInitHooks = !!(templateProperties.oncreate || templateProperties.onstate || templateProperties.onupdate);
const constructorBody = deindent`
${options.dev && `this._debugName = '${debugName}';`}
${options.dev && !component.customElement &&
`if (!options || (!options.target && !options.root)) throw new Error("'target' is a required option");`}
${options.dev && deindent`
this._debugName = '${debugName}';
${!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);
${templateProperties.store && `this.store = %store();`}
${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
const result = (deindent`
${js}
@ -113,6 +115,12 @@ export default function ssr(
${templateProperties.store && `options.store = %store();`}
__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(', ')});
${computations.map(

@ -28,7 +28,10 @@ function create_main_fragment(component, ctx) {
function Main(options) {
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);
this._state = assign({}, options.data);
this._intro = true;

@ -69,7 +69,6 @@ describe("runtime", () => {
compileOptions = config.compileOptions || {};
compileOptions.shared = shared;
compileOptions.hydratable = hydrate;
compileOptions.dev = config.dev;
compileOptions.store = !!config.store;
compileOptions.immutable = config.immutable;
compileOptions.skipIntroByDefault = config.skipIntroByDefault;
@ -171,7 +170,11 @@ describe("runtime", () => {
})
.catch(err => {
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 {
failed.add(dir);
showOutput(cwd, {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -124,8 +124,16 @@ describe("ssr", () => {
assert.htmlEqual(html, config.html);
}
} catch (err) {
showOutput(cwd, { generate: "ssr" });
throw err;
if (config.error) {
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