From 219305b22163f56260fd95c5c108e01a4a77a2e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20T=C3=B6rnqvist?= Date: Sat, 8 Jun 2019 10:57:19 +0200 Subject: [PATCH] Match route before init stores --- index.js | 4 ++-- test/browser.js | 21 +++++++++++++++++++++ test/node.js | 20 ++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 45effedc..0feed849 100644 --- a/index.js +++ b/index.js @@ -138,11 +138,11 @@ Choo.prototype.start = function () { } this._setCache(this.state) + this._matchRoute() this._stores.forEach(function (initStore) { initStore(self.state) }) - this._matchRoute() this._tree = this._prerender(this.state) assert.ok(this._tree, 'choo.start: no valid DOM node returned for location ' + this.state.href) @@ -212,11 +212,11 @@ Choo.prototype.toString = function (location, state) { var self = this this._setCache(this.state) + this._matchRoute(location) this._stores.forEach(function (initStore) { initStore(self.state) }) - this._matchRoute(location) var html = this._prerender(this.state) assert.ok(html, 'choo.toString: no valid value returned for the route ' + location) assert(!Array.isArray(html), 'choo.toString: return value was an array for the route ' + location) diff --git a/test/browser.js b/test/browser.js index 18728ed9..24e86323 100644 --- a/test/browser.js +++ b/test/browser.js @@ -191,6 +191,27 @@ tape('state should include location on render', function (t) { app.mount(container) }) +tape('state should include location on store init', function (t) { + t.plan(6) + var app = choo() + var container = init('/foo/bar/file.txt?bin=baz') + app.use(store) + app.route('/:first/:second/*', function (state, emit) { + return html`
` + }) + app.mount(container) + + function store (state, emit) { + var params = { first: 'foo', second: 'bar', wildcard: 'file.txt' } + t.equal(state.href, '/foo/bar/file.txt', 'state has href') + t.equal(state.route, ':first/:second/*', 'state has route') + t.ok(state.hasOwnProperty('params'), 'state has params') + t.deepEqual(state.params, params, 'params match') + t.ok(state.hasOwnProperty('query'), 'state has query') + t.deepEqual(state.query, { bin: 'baz' }, 'query match') + } +}) + tape('state should include title', function (t) { t.plan(3) document.title = 'foo' diff --git a/test/node.js b/test/node.js index eefe4b58..213958eb 100644 --- a/test/node.js +++ b/test/node.js @@ -185,6 +185,26 @@ tape('state should include location on render', function (t) { t.end() }) +tape('state should include location on store init', function (t) { + t.plan(6) + var app = choo() + app.use(store) + app.route('/:first/:second/*', function (state, emit) { + return html`
` + }) + app.toString('/foo/bar/file.txt?bin=baz') + + function store (state, emit) { + var params = { first: 'foo', second: 'bar', wildcard: 'file.txt' } + t.equal(state.href, '/foo/bar/file.txt', 'state has href') + t.equal(state.route, ':first/:second/*', 'state has route') + t.ok(state.hasOwnProperty('params'), 'state has params') + t.deepEqual(state.params, params, 'params match') + t.ok(state.hasOwnProperty('query'), 'state has query') + t.deepEqual(state.query, { bin: 'baz' }, 'query match') + } +}) + tape('state should include cache', function (t) { t.plan(6) var app = choo()