Skip to content

Commit c7ae8a0

Browse files
Merge pull request #577 from cloudinary/queryparams-string-value
Queryparams string value
2 parents 4b67d7f + 6d154cc commit c7ae8a0

File tree

4 files changed

+46
-10
lines changed

4 files changed

+46
-10
lines changed

__TESTS__/unit/url/url.test.ts

+18
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ describe('Tests for URL configuration', () => {
101101
expect(url).toEqual(`https://res.cloudinary.com/demo/image/upload/sample?_i=abcde&_z=1234&_t=false`);
102102
});
103103

104+
it('Should include query params when passed as a string', function () {
105+
const image = createNewImage('sample', {cloudName: 'demo'}, {queryParams: '_i=abcde&_z=1234&_t=false'});
106+
const url = image.toURL();
107+
expect(url).toEqual(`https://res.cloudinary.com/demo/image/upload/sample?_i=abcde&_z=1234&_t=false`);
108+
});
109+
104110
it('Should include query params with analytics', function () {
105111
const image = createNewImage('sample', {cloudName: 'demo'}, {analytics: true, queryParams: {"_i": "abcde"}});
106112
const analyticsOptions = {
@@ -111,4 +117,16 @@ describe('Tests for URL configuration', () => {
111117
const url = image.toURL({trackedAnalytics: analyticsOptions});
112118
expect(url).toEqual(`https://res.cloudinary.com/demo/image/upload/sample?_i=abcde&_a=BATAABAQ0`);
113119
});
120+
121+
it('Should include query params with analytics when passed as a string', function () {
122+
const image = createNewImage('sample', {cloudName: 'demo'}, {analytics: true, queryParams: '_i=abcde&_z=1234&_t=false'});
123+
const analyticsOptions = {
124+
techVersion: '16.0.0',
125+
sdkCode: 'T',
126+
sdkSemver: '1.0.0'
127+
};
128+
const url = image.toURL({trackedAnalytics: analyticsOptions});
129+
expect(url).toEqual(`https://res.cloudinary.com/demo/image/upload/sample?_i=abcde&_z=1234&_t=false&_a=BATAABAQ0`);
130+
});
131+
114132
});

src/assets/CloudinaryFile.ts

+24-6
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,33 @@ class CloudinaryFile {
291291
.replace(/\?/g, '%3F')
292292
.replace(/=/g, '%3D');
293293

294-
const queryParams = new URLSearchParams(this.urlConfig.queryParams as Record<string, string>);
295294

296-
// urlConfig.analytics is true by default, has to be explicitly set to false to overwrite
297-
// Don't add analytics when publicId includes a '?' to not risk changing existing query params
298-
if (this.urlConfig.analytics !== false && !(publicID.includes('?'))) {
299-
queryParams.set("_a", getSDKAnalyticsSignature(trackedAnalytics));
295+
const shouldAddAnalytics = this.urlConfig.analytics !== false && !(publicID.includes('?'));
296+
297+
let queryParamsString = '';
298+
299+
if (typeof(this.urlConfig.queryParams) === 'object') {
300+
301+
try {
302+
const queryParams = new URLSearchParams(this.urlConfig.queryParams as Record<string, string>);
303+
304+
if (shouldAddAnalytics) {
305+
queryParams.set("_a", getSDKAnalyticsSignature(trackedAnalytics));
306+
}
307+
308+
queryParamsString = queryParams.toString();
309+
310+
} catch(err) {
311+
console.error('Error: URLSearchParams is not available so the queryParams object cannot be parsed, please try passing as an already parsed string');
312+
}
313+
} else {
314+
queryParamsString = this.urlConfig.queryParams || '';
315+
316+
if (shouldAddAnalytics) {
317+
queryParamsString += `${(queryParamsString.length > 0 ? '&' : '')}_a=${getSDKAnalyticsSignature(trackedAnalytics)}`;
318+
}
300319
}
301320

302-
const queryParamsString = queryParams.toString();
303321
if (queryParamsString) {
304322
return `${safeURL}?${queryParamsString}`;
305323
} else {

src/config/URLConfig.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class URLConfig extends Config implements IURLConfig {
1313
useRootPath?: boolean;
1414
secure?: boolean;
1515
forceVersion?: boolean;
16-
queryParams?: Record<string, string | number | boolean>;
16+
queryParams?: Record<string, string | number | boolean> | string;
1717

1818
/**
1919
* @param {IURLConfig} userURLConfig
@@ -106,7 +106,7 @@ class URLConfig extends Config implements IURLConfig {
106106
/**
107107
* @param params Sets additional params
108108
*/
109-
setQueryParams(params: Record<string, string | number | boolean>):this {
109+
setQueryParams(params: Record<string, string | number | boolean> | string):this {
110110
this.queryParams = params;
111111
return this;
112112
}

src/config/interfaces/Config/IURLConfig.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* @prop {boolean} [secure]
1414
* @prop {boolean} [forceVersion]
1515
* @prop {boolean} [analytics]
16-
* @prop {object} [queryParams]
16+
* @prop {object|string} [queryParams]
1717
* @example
1818
* import Cloudinary from '@cloudinary/url-gen';
1919
* // The Cloudinary Instance accepts a URLConfig under the `url` key
@@ -98,7 +98,7 @@ interface IURLConfig {
9898
/**
9999
* Additional params to be added to the URL
100100
*/
101-
queryParams?: Record<string, string | number | boolean>
101+
queryParams?: Record<string, string | number | boolean> | string
102102
}
103103

104104
export default IURLConfig;

0 commit comments

Comments
 (0)