From ef37366bb3474c51c790c16ef4b740ae18c281f2 Mon Sep 17 00:00:00 2001 From: offirgolan Date: Wed, 6 Mar 2019 14:23:54 -0800 Subject: [PATCH 1/2] fix: Handle multiple queryParams created by applying multiple mixins --- .tool-versions | 1 - addon/-private/parachute-meta.js | 6 ++++++ addon/-private/symbols.js | 1 + addon/decorators/query-param.js | 17 +++++++++++++++++ addon/query-params.js | 26 -------------------------- 5 files changed, 24 insertions(+), 27 deletions(-) delete mode 100644 .tool-versions diff --git a/.tool-versions b/.tool-versions deleted file mode 100644 index dc75145..0000000 --- a/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -nodejs 6.14.4 diff --git a/addon/-private/parachute-meta.js b/addon/-private/parachute-meta.js index 348a1b1..2d77c79 100644 --- a/addon/-private/parachute-meta.js +++ b/addon/-private/parachute-meta.js @@ -1,5 +1,6 @@ import { A as emberArray } from '@ember/array'; import QueryParam from './query-param'; +import { PARACHUTE_QPS } from './symbols'; const { keys } = Object; @@ -36,6 +37,11 @@ export default class ParachuteMeta { {} ); + // Meta info used by the decorators + Object.defineProperty(this.qpMapForController, PARACHUTE_QPS, { + value: true + }); + this.qpMapForRoute = this.queryParamsArray.reduce( (qps, { key, replace }) => { qps[key] = { replace }; diff --git a/addon/-private/symbols.js b/addon/-private/symbols.js index 0f69159..ec578e2 100644 --- a/addon/-private/symbols.js +++ b/addon/-private/symbols.js @@ -1,2 +1,3 @@ export const HAS_PARACHUTE = '__has_parachute__'; export const PARACHUTE_META = '__parachute_meta__'; +export const PARACHUTE_QPS = '__parachute_qps__'; diff --git a/addon/decorators/query-param.js b/addon/decorators/query-param.js index d46af58..ed0db88 100644 --- a/addon/decorators/query-param.js +++ b/addon/decorators/query-param.js @@ -1,3 +1,5 @@ +import { A } from '@ember/array'; +import { PARACHUTE_QPS } from 'ember-parachute/-private/symbols'; import { addQueryParamFor, getQueryParamsFor @@ -12,6 +14,21 @@ function createDescriptor(desc, qpDefinition) { addQueryParamFor(klass, desc.key, qpDefinition); klass.reopen(getQueryParamsFor(klass).Mixin); + const proto = klass.proto(); + + // Remove duplicate queryParams created by the multiple mixins + if (Array.isArray(proto.queryParams)) { + const queryParams = A([...proto.queryParams]); + const parachuteQueryParams = queryParams.filterBy(PARACHUTE_QPS, true); + + // Keep the newest one + parachuteQueryParams.pop(); + // Remove the old ones + queryParams.removeObjects(parachuteQueryParams); + + proto.queryParams = queryParams.toArray(); + } + return klass; } }; diff --git a/addon/query-params.js b/addon/query-params.js index a77ef13..c972a7e 100644 --- a/addon/query-params.js +++ b/addon/query-params.js @@ -7,7 +7,6 @@ import { HAS_PARACHUTE, PARACHUTE_META } from './-private/symbols'; import ParachuteMeta from './-private/parachute-meta'; import queryParamsStateFor from './-private/state'; - const { keys } = Object; /** @@ -250,30 +249,6 @@ export default class QueryParams { } ).readOnly(), - /** - * Overridable hook that fires when query params change. - * - * @public - * @returns {void} - */ - queryParamsDidChange() {}, - - /** - * Overridable hook that fires after the route calls `setupController` - * - * @public - * @returns {void} - */ - setup() {}, - - /** - * Overridable hook that fires after the route calls `resetController` - * - * @public - * @returns {void} - */ - reset() {}, - /** * Reset query params to their default value. Accepts an optional array * of query param keys to reset. @@ -298,7 +273,6 @@ export default class QueryParams { } }); - return ControllerMixin; } } From d049ae41db540dbd4f605858cf098bc23c5c2b58 Mon Sep 17 00:00:00 2001 From: offirgolan Date: Wed, 6 Mar 2019 15:16:21 -0800 Subject: [PATCH 2/2] fix failing test --- tests/unit/decorators-test.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/unit/decorators-test.js b/tests/unit/decorators-test.js index 46b234f..b2cb305 100644 --- a/tests/unit/decorators-test.js +++ b/tests/unit/decorators-test.js @@ -32,8 +32,6 @@ module('Unit | Decorators', function() { }); test('it works', function(assert) { - assert.ok(typeof controller.setup === 'function'); - assert.ok(typeof controller.reset === 'function'); assert.ok(QueryParams.metaFor(controller)); }); });