From e6eb782603826929ba2f410e1f205567748939b5 Mon Sep 17 00:00:00 2001 From: D1g1talEntr0py Date: Thu, 21 Sep 2023 17:50:25 -0400 Subject: [PATCH] Fixed regression the 'searchParams' option was not being passed to the method that creates the URL for the request and fixed broken references in some tests. --- package.json | 2 +- src/transportr.js | 16 ++++--- tests/abort-all.test.js | 2 +- tests/all-complete-event.test.js | 14 +++--- tests/global-event-handler.test.js | 2 +- tests/transportr.test.js | 74 +++++++++++++++--------------- 6 files changed, 57 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index e287db6..040f7cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@d1g1tal/transportr", - "version": "1.3.1", + "version": "1.3.2", "description": "JavaScript wrapper for the Fetch API", "type": "module", "exports": { diff --git a/src/transportr.js b/src/transportr.js index 4b3766d..c94402a 100644 --- a/src/transportr.js +++ b/src/transportr.js @@ -629,7 +629,7 @@ export default class Transportr { this.#publish({ name: RequestEvents.CONFIGURED, data: options, global: options.global }); - const url = Transportr.#createUrl(this.#baseUrl, path); + const url = Transportr.#createUrl(this.#baseUrl, path, options.searchParams); if (_type(options.signal) != AbortSignal) { options.signal = new AbortSignal(options.signal) } options.signal.addEventListener(SignalEvents.ABORT, (event) => this.#publish({ name: RequestEvents.ABORTED, event, global: options.global })); options.signal.addEventListener(SignalEvents.TIMEOUT, (event) => this.#publish({ name: RequestEvents.TIMEOUT, event, global: options.global })); @@ -736,7 +736,7 @@ export default class Transportr { } } else { requestOptions.headers.delete(HttpRequestHeader.CONTENT_TYPE); - if (!requestOptions.body?.isEmpty()) { + if (requestOptions.body) { Transportr.#mergeOptions(requestOptions.searchParams, requestOptions.body); } requestOptions.body = undefined; @@ -787,11 +787,15 @@ export default class Transportr { * @static * @param {URL} url The URL to use as a base. * @param {string} [path] The optional, relative path to the resource. This MUST be a relative path, otherwise, you should create a new {@link Transportr} instance. - * @returns {URL} A new URL object with the pathname and origin of the url parameter, and the path parameter - * appended to the end of the pathname. + * @param {URLSearchParams} [searchParams] The optional search parameters to append to the URL. + * @returns {URL} A new URL object with the pathname and origin of the url parameter, and the path parameter appended to the end of the pathname. */ - static #createUrl(url, path) { - return path ? new URL(`${url.pathname.replace(endsWithSlashRegEx, '')}${path}`, url.origin) : new URL(url); + static #createUrl(url, path, searchParams) { + const requestUrl = path ? new URL(`${url.pathname.replace(endsWithSlashRegEx, '')}${path}`, url.origin) : new URL(url); + + searchParams?.forEach((value, key) => requestUrl.searchParams.append(key, value)); + + return requestUrl; } /** diff --git a/tests/abort-all.test.js b/tests/abort-all.test.js index 1696b87..22ca641 100644 --- a/tests/abort-all.test.js +++ b/tests/abort-all.test.js @@ -21,7 +21,7 @@ describe('Transportr', () => { it('should cancel all requests when abortAll is called', async () => { const abortedEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ABORTED, abortedEventListener); + transportr.register(Transportr.Events.ABORTED, abortedEventListener); // Initiate multiple requests transportr.getImage('/320/240'); diff --git a/tests/all-complete-event.test.js b/tests/all-complete-event.test.js index f8d3409..c757b8c 100644 --- a/tests/all-complete-event.test.js +++ b/tests/all-complete-event.test.js @@ -5,25 +5,25 @@ test('All Complete Event', async () => { const transportr = new Transportr('https://picsum.photos'); const configuredEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.CONFIGURED, configuredEventListener); + transportr.register(Transportr.Events.CONFIGURED, configuredEventListener); const successEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.SUCCESS, successEventListener); + transportr.register(Transportr.Events.SUCCESS, successEventListener); const errorEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ERROR, errorEventListener); + transportr.register(Transportr.Events.ERROR, errorEventListener); const abortEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ABORTED, abortEventListener); + transportr.register(Transportr.Events.ABORTED, abortEventListener); const timeoutEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.TIMEOUT, timeoutEventListener); + transportr.register(Transportr.Events.TIMEOUT, timeoutEventListener); const completeEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.COMPLETE, completeEventListener); + transportr.register(Transportr.Events.COMPLETE, completeEventListener); const allCompleteEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ALL_COMPLETE, allCompleteEventListener); + transportr.register(Transportr.Events.ALL_COMPLETE, allCompleteEventListener); try { const results = await Promise.allSettled([transportr.getImage('/240'), transportr.getImage('/360'), transportr.getImage('/480')]); diff --git a/tests/global-event-handler.test.js b/tests/global-event-handler.test.js index e4b19b8..9e92076 100644 --- a/tests/global-event-handler.test.js +++ b/tests/global-event-handler.test.js @@ -5,7 +5,7 @@ test('Global Event Listener', async () => { const imageTransportr = new Transportr('https://picsum.photos'); const globalConfiguredEventHandler = jest.fn(); - Transportr.register(Transportr.RequestEvents.CONFIGURED, globalConfiguredEventHandler); + Transportr.register(Transportr.Events.CONFIGURED, globalConfiguredEventHandler); const image = await imageTransportr.getImage('/320/240'); diff --git a/tests/transportr.test.js b/tests/transportr.test.js index 9dafc7e..ed0b75c 100644 --- a/tests/transportr.test.js +++ b/tests/transportr.test.js @@ -1,11 +1,11 @@ -import { describe, beforeAll, afterAll, it, expect, jest, test } from '@jest/globals'; +import { describe, expect, it, jest, test } from '@jest/globals'; import { DOMParser } from '@xmldom/xmldom'; import HttpError from '../src/http-error.js'; -import Transportr from '../src/transportr.js'; -import HttpRequestHeader from '../src/http-request-headers.js'; -import HttpResponseHeader from '../src/http-response-headers.js'; import HttpMediaType from '../src/http-media-type.js'; +import HttpRequestHeader from '../src/http-request-headers.js'; import HttpRequestMethod from '../src/http-request-methods.js'; +import HttpResponseHeader from '../src/http-response-headers.js'; +import Transportr from '../src/transportr.js'; describe('Transportr', () => { describe('Transportr.prototype.constructor', () => { @@ -300,25 +300,25 @@ describe('Transportr', () => { const transportr = new Transportr('https://picsum.photos'); const configuredEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.CONFIGURED, configuredEventListener); + transportr.register(Transportr.Events.CONFIGURED, configuredEventListener); const successEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.SUCCESS, successEventListener); + transportr.register(Transportr.Events.SUCCESS, successEventListener); const errorEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ERROR, errorEventListener); + transportr.register(Transportr.Events.ERROR, errorEventListener); const abortEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ABORTED, abortEventListener); + transportr.register(Transportr.Events.ABORTED, abortEventListener); const timeoutEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.TIMEOUT, timeoutEventListener); + transportr.register(Transportr.Events.TIMEOUT, timeoutEventListener); const completeEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.COMPLETE, completeEventListener); + transportr.register(Transportr.Events.COMPLETE, completeEventListener); const allCompleteEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ALL_COMPLETE, allCompleteEventListener); + transportr.register(Transportr.Events.ALL_COMPLETE, allCompleteEventListener); const image = await transportr.getImage('/240'); expect(typeof (image)).toBe('string'); @@ -337,22 +337,22 @@ describe('Transportr', () => { const transportr = new Transportr('https://picsum.photos'); const configuredEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.CONFIGURED, configuredEventListener); + transportr.register(Transportr.Events.CONFIGURED, configuredEventListener); const successEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.SUCCESS, successEventListener); + transportr.register(Transportr.Events.SUCCESS, successEventListener); const errorEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ERROR, errorEventListener); + transportr.register(Transportr.Events.ERROR, errorEventListener); const abortedEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ABORTED, abortedEventListener); + transportr.register(Transportr.Events.ABORTED, abortedEventListener); const timeoutEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.TIMEOUT, timeoutEventListener); + transportr.register(Transportr.Events.TIMEOUT, timeoutEventListener); const completeEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.COMPLETE, completeEventListener); + transportr.register(Transportr.Events.COMPLETE, completeEventListener); const abortListener = jest.fn(); // Test adding an event listener to the signal @@ -381,22 +381,22 @@ describe('Transportr', () => { const transportr = new Transportr('https://picsum.photos'); const configuredEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.CONFIGURED, configuredEventListener); + transportr.register(Transportr.Events.CONFIGURED, configuredEventListener); const successEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.SUCCESS, successEventListener); + transportr.register(Transportr.Events.SUCCESS, successEventListener); const errorEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ERROR, errorEventListener); + transportr.register(Transportr.Events.ERROR, errorEventListener); const abortedEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ABORTED, abortedEventListener); + transportr.register(Transportr.Events.ABORTED, abortedEventListener); const timeoutEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.TIMEOUT, timeoutEventListener); + transportr.register(Transportr.Events.TIMEOUT, timeoutEventListener); const completeEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.COMPLETE, completeEventListener); + transportr.register(Transportr.Events.COMPLETE, completeEventListener); const abortListener = jest.fn(); // Test adding an event listener to the signal @@ -424,24 +424,24 @@ describe('Transportr', () => { const transportr = new Transportr(url, { timeout }); const configuredEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.CONFIGURED, configuredEventListener); + transportr.register(Transportr.Events.CONFIGURED, configuredEventListener); const successEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.SUCCESS, successEventListener); + transportr.register(Transportr.Events.SUCCESS, successEventListener); const errorEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ERROR, errorEventListener); + transportr.register(Transportr.Events.ERROR, errorEventListener); const abortedEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ABORTED, abortedEventListener); + transportr.register(Transportr.Events.ABORTED, abortedEventListener); const timeoutEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.TIMEOUT, timeoutEventListener); + transportr.register(Transportr.Events.TIMEOUT, timeoutEventListener); const completeEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.COMPLETE, completeEventListener); + transportr.register(Transportr.Events.COMPLETE, completeEventListener); - transportr.register(Transportr.RequestEvents.TIMEOUT, (event) => { + transportr.register(Transportr.Events.TIMEOUT, (event) => { expect(event).toBeInstanceOf(CustomEvent); expect(event.target).toBeInstanceOf(globalThis.AbortSignal); expect(event.target.aborted).toBe(true); @@ -471,24 +471,24 @@ describe('Transportr', () => { const transportr = new Transportr(url.origin, { timeout }); const configuredEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.CONFIGURED, configuredEventListener); + transportr.register(Transportr.Events.CONFIGURED, configuredEventListener); const successEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.SUCCESS, successEventListener); + transportr.register(Transportr.Events.SUCCESS, successEventListener); const errorEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ERROR, errorEventListener); + transportr.register(Transportr.Events.ERROR, errorEventListener); const abortedEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.ABORTED, abortedEventListener); + transportr.register(Transportr.Events.ABORTED, abortedEventListener); const timeoutEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.TIMEOUT, timeoutEventListener); + transportr.register(Transportr.Events.TIMEOUT, timeoutEventListener); const completeEventListener = jest.fn(); - transportr.register(Transportr.RequestEvents.COMPLETE, completeEventListener); + transportr.register(Transportr.Events.COMPLETE, completeEventListener); - transportr.register(Transportr.RequestEvents.TIMEOUT, (event) => { + transportr.register(Transportr.Events.TIMEOUT, (event) => { expect(event).toBeInstanceOf(CustomEvent); expect(event.detail).toHaveProperty('timeout', timeout); expect(event.detail).toHaveProperty('cause');