From 8f070c0245b3b5e76807cfada013820e7132494c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillaume=20G=C3=A9rard?= Date: Thu, 30 Apr 2020 17:21:48 +0200 Subject: [PATCH] feat: replace jquery-params with URL API and authorize undefined action name --- addon/.gitkeep | 0 addon/utils/url-builder.js | 20 +++++++++++++++++--- index.js | 6 ------ package-lock.json | 13 ++++++++----- package.json | 2 +- tests/dummy/app/models/.gitkeep | 0 tests/dummy/app/models/bike.js | 6 +++++- tests/unit/.gitkeep | 0 tests/unit/models/bike-test.js | 25 +++++++++++++++++++++++++ 9 files changed, 56 insertions(+), 16 deletions(-) delete mode 100644 addon/.gitkeep delete mode 100644 tests/dummy/app/models/.gitkeep delete mode 100644 tests/unit/.gitkeep diff --git a/addon/.gitkeep b/addon/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/addon/utils/url-builder.js b/addon/utils/url-builder.js index be0cdc1..f83ffa7 100644 --- a/addon/utils/url-builder.js +++ b/addon/utils/url-builder.js @@ -1,8 +1,22 @@ -import param from 'jquery-param'; +import URL from 'url'; export default function(url, path, queryParams) { - let query = param(queryParams); - let pathUrl = url.charAt(url.length - 1) === '/' ? `${url}${path}` : `${url}/${path}`; + let pathUrl; + if (path) { + let maybeMissingSlash = url.endsWith('/') || path.startsWith('/') ? '' : '/' + pathUrl = `${url}${maybeMissingSlash}${path}`; + } else { + pathUrl = url + } + + // Use native URL API to generate query + let queryObj = new URL('https://exelord.com/ember-custom-actions/').searchParams; + if (queryParams) { + Object.keys(queryParams).forEach(key => + queryObj.set(key, queryParams[key]) + ); + } + let query = queryObj.toString(); return query ? `${pathUrl}?${query}` : pathUrl; } diff --git a/index.js b/index.js index 588c7ec..89b25a1 100644 --- a/index.js +++ b/index.js @@ -13,11 +13,5 @@ module.exports = { { transformation: 'cjs', as: 'lodash.merge' } ] }); - - this.import('node_modules/jquery-param/jquery-param.js', { - using: [ - { transformation: 'amd', as: 'jquery-param' } - ] - }); }, }; diff --git a/package-lock.json b/package-lock.json index 852e7d5..a6f8423 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7436,6 +7436,14 @@ "semver": "^5.5.0" } }, + "ember-url": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/ember-url/-/ember-url-0.6.0.tgz", + "integrity": "sha1-Myo2NSjP9n0j45veT3DG1oTjK4k=", + "requires": { + "ember-cli-babel": "^6.12.0" + } + }, "ember-wormhole": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/ember-wormhole/-/ember-wormhole-0.5.5.tgz", @@ -11409,11 +11417,6 @@ "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==", "dev": true }, - "jquery-param": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jquery-param/-/jquery-param-1.0.1.tgz", - "integrity": "sha512-7HN1dLvfweR7lNDtajA8FfhghN+SKsKz/ME7D/PAPQ8eDUr2ub42WqeyrZptWEdslckrpKpp+ZGGiKjE+r7iuQ==" - }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", diff --git a/package.json b/package.json index a900fd7..528e9ba 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "dependencies": { "ember-cli-babel": "6.16.0", "ember-cli-cjs-transform": "2.0.0", - "jquery-param": "1.0.1", + "ember-url": "0.6.0", "lodash.merge": "4.6.2" }, "devDependencies": { diff --git a/tests/dummy/app/models/.gitkeep b/tests/dummy/app/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/dummy/app/models/bike.js b/tests/dummy/app/models/bike.js index 71af7ab..a410e16 100644 --- a/tests/dummy/app/models/bike.js +++ b/tests/dummy/app/models/bike.js @@ -4,5 +4,9 @@ import { modelAction } from 'ember-custom-actions'; export default Model.extend({ name: attr(), - ride: modelAction('ride', { method: 'PUT', data: { defaultParam: 'ok' } }) + ride: modelAction('ride', { method: 'PUT', data: { defaultParam: 'ok' } }), + clean: modelAction(undefined, { + method: 'PATCH', + data: { defaultParam: 'ok' } + }) }); diff --git a/tests/unit/.gitkeep b/tests/unit/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit/models/bike-test.js b/tests/unit/models/bike-test.js index a0a6819..951b4a5 100644 --- a/tests/unit/models/bike-test.js +++ b/tests/unit/models/bike-test.js @@ -113,3 +113,28 @@ test('model action set serialized errors in error object', function(assert) { done(); }); }); + +test('model action without actionId', function(assert) { + assert.expect(4); + + this.server.patch('/bikes/:id', (request) => { + let data = JSON.parse(request.requestBody); + + assert.deepEqual(data, { myParam: 'My first param', defaultParam: 'ok' }); + assert.deepEqual(request.queryParams, { soap: 'true', include: 'sponge' }); + assert.equal(request.url, '/bikes/1?include=sponge&soap=true'); + + return [200, { }, 'true']; + }); + + let done = assert.async(); + let payload = { myParam: 'My first param' }; + + let model = this.subject(); + model.set('id', 1); + + model.clean(payload, { queryParams: { soap: true, include: 'sponge' } }).then((response) => { + assert.ok(response, true); + done(); + }); +});