@adobe/acc-js-sdk 1.0.8 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -1
- package/MIGRATION.md +160 -0
- package/README.md +139 -14
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/application.js +347 -141
- package/src/client.js +6 -1
- package/src/index.js +1 -1
- package/src/soap.js +5 -2
- package/src/util.js +144 -0
- package/src/xtkCaster.js +17 -2
- package/test/application.test.js +1492 -117
- package/test/client.test.js +3 -3
- package/test/soap.test.js +53 -2
- package/test/util.test.js +167 -1
package/src/client.js
CHANGED
|
@@ -234,6 +234,8 @@ class Credentials {
|
|
|
234
234
|
* @property {Utils.Transport} transport - Overrides the transport (i.e. HTTP layer)
|
|
235
235
|
* @property {boolean} noStorage - De-activate using of local storage. By default, and in addition to in-memory cache, entities, methods, and options are also persisted in local storage if there is one.
|
|
236
236
|
* @property {Storage} storage - Overrides the storage interface (i.e. LocalStorage)
|
|
237
|
+
* @property {function} refreshClient - An async callback function with the SDK client as parameter, which will be called when the ACC session is expired
|
|
238
|
+
* @property {string} charset - The charset encoding used for http requests. Defaults to UTF-8 since SDK version 1.1.1
|
|
237
239
|
* @memberOf Campaign
|
|
238
240
|
*/
|
|
239
241
|
|
|
@@ -297,6 +299,7 @@ class ConnectionParameters {
|
|
|
297
299
|
}
|
|
298
300
|
this._options._storage = storage;
|
|
299
301
|
this._options.refreshClient = options.refreshClient;
|
|
302
|
+
this._options.charset = options.charset === undefined ? "UTF-8": options.charset;
|
|
300
303
|
}
|
|
301
304
|
|
|
302
305
|
/**
|
|
@@ -673,7 +676,9 @@ class Client {
|
|
|
673
676
|
* parameters should be set
|
|
674
677
|
*/
|
|
675
678
|
_prepareSoapCall(urn, method, internal) {
|
|
676
|
-
const soapCall = new SoapMethodCall(this._transport, urn, method,
|
|
679
|
+
const soapCall = new SoapMethodCall(this._transport, urn, method,
|
|
680
|
+
this._sessionToken, this._securityToken,
|
|
681
|
+
this._getUserAgentString(), this._connectionParameters._options.charset);
|
|
677
682
|
soapCall.internal = !!internal;
|
|
678
683
|
return soapCall;
|
|
679
684
|
}
|
package/src/index.js
CHANGED
|
@@ -191,7 +191,7 @@ class SDK {
|
|
|
191
191
|
* Convert a javascript value into an xtk constant with proper quoting
|
|
192
192
|
* @param {any} value the value to convert
|
|
193
193
|
* @param {string} type the xtk type
|
|
194
|
-
* @returns
|
|
194
|
+
* @returns {string} the text literal which can be used in a Xtk expression or condition
|
|
195
195
|
*/
|
|
196
196
|
xtkConstText(value, type) {
|
|
197
197
|
if (!type || type === 'string' || type === 'memo') {
|
package/src/soap.js
CHANGED
|
@@ -78,11 +78,12 @@ const NS_XSD = "http://www.w3.org/2001/XMLSchema";
|
|
|
78
78
|
* @param {string} sessionToken Campaign session token
|
|
79
79
|
* @param {string} securityToken Campaign security token
|
|
80
80
|
* @param {string} userAgentString The user agent string to use for HTTP requests
|
|
81
|
+
* @param {string} charset The charset encoding used for http requests, usually UTF-8
|
|
81
82
|
* @memberof SOAP
|
|
82
83
|
*/
|
|
83
84
|
class SoapMethodCall {
|
|
84
85
|
|
|
85
|
-
constructor(transport, urn, methodName, sessionToken, securityToken, userAgentString) {
|
|
86
|
+
constructor(transport, urn, methodName, sessionToken, securityToken, userAgentString, charset) {
|
|
86
87
|
this.request = undefined; // The HTTP request (object litteral passed to the transport layer)
|
|
87
88
|
this.response = undefined; // The HTTP response object (in case of success)
|
|
88
89
|
|
|
@@ -99,6 +100,7 @@ class SoapMethodCall {
|
|
|
99
100
|
this._sessionToken = sessionToken || "";
|
|
100
101
|
this._securityToken = securityToken || "";
|
|
101
102
|
this._userAgentString = userAgentString;
|
|
103
|
+
this._charset = charset || "";
|
|
102
104
|
|
|
103
105
|
// THe SOAP call being built
|
|
104
106
|
this._doc = undefined; // XML document for SOAP call
|
|
@@ -512,11 +514,12 @@ class SoapMethodCall {
|
|
|
512
514
|
* @returns {Object} an options object describing the HTTP request, with cookies, headers and body
|
|
513
515
|
*/
|
|
514
516
|
_createHTTPRequest(url) {
|
|
517
|
+
|
|
515
518
|
const options = {
|
|
516
519
|
url: url,
|
|
517
520
|
method: 'POST',
|
|
518
521
|
headers: {
|
|
519
|
-
'Content-type':
|
|
522
|
+
'Content-type': `application/soap+xml${this._charset ? ";charset=" + this._charset : ""}`,
|
|
520
523
|
'SoapAction': `${this.urn}#${this.methodName}`,
|
|
521
524
|
'X-Security-Token': this._securityToken
|
|
522
525
|
},
|
package/src/util.js
CHANGED
|
@@ -135,7 +135,151 @@ class Util {
|
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
+
/**
|
|
139
|
+
* The ArrayMap object is used to access elements as either an array or a map
|
|
140
|
+
*
|
|
141
|
+
* @class
|
|
142
|
+
* @constructor
|
|
143
|
+
* @memberof Utils
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
class ArrayMap {
|
|
147
|
+
constructor() {
|
|
148
|
+
// List of items, as an ordered array. Use defineProperty to make it non-enumerable
|
|
149
|
+
// and support for for ... in loop to iterate by item key
|
|
150
|
+
Object.defineProperty(this, "_items", {
|
|
151
|
+
value: [],
|
|
152
|
+
writable: false,
|
|
153
|
+
enumerable: false,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
Object.defineProperty(this, "_map", {
|
|
157
|
+
value: [],
|
|
158
|
+
writable: false,
|
|
159
|
+
enumerable: false,
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// Number of items. Use defineProperty to make it non-enumerable
|
|
163
|
+
// and support for for ... in loop to iterate by item key
|
|
164
|
+
Object.defineProperty(this, "length", {
|
|
165
|
+
value: 0,
|
|
166
|
+
writable: true,
|
|
167
|
+
enumerable: false,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
_push(key, value) {
|
|
172
|
+
let isNumKey = false;
|
|
173
|
+
if (key) {
|
|
174
|
+
// reserved keyworkds
|
|
175
|
+
const isReserved = key === "_items" || key === "length" || key === "_push" || key === "forEach" || key === "map" || key === "_map" || key === "get" || key === "find" || key === "flatMap" || key === "filter";
|
|
176
|
+
|
|
177
|
+
// already a child with the name => there's a problem with the schema
|
|
178
|
+
if (!isReserved && this[key]) throw new Error(`Failed to add element '${key}' to ArrayMap. There's already an item with the same name`);
|
|
179
|
+
|
|
180
|
+
// Set key as a enumerable property, so that elements can be accessed by key,
|
|
181
|
+
// but also iterated on with a for ... in loop
|
|
182
|
+
// For compatibility
|
|
183
|
+
if (!isReserved) this[key] = value;
|
|
184
|
+
this._map[key] = value;
|
|
185
|
+
|
|
186
|
+
// Special case where keys are numbers or strings convertible with numbers
|
|
187
|
+
const numKey = +key;
|
|
188
|
+
if (numKey === numKey) {
|
|
189
|
+
// keys is a number. If it matches the current index, then we are good,
|
|
190
|
+
// and we can add the property as an enumerable property
|
|
191
|
+
isNumKey = true;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (!isNumKey) {
|
|
196
|
+
// Set the index property so that items can be accessed by array index.
|
|
197
|
+
// However, make it non-enumerable to make sure indexes do not show up in a for .. in loop
|
|
198
|
+
Object.defineProperty(this, this._items.length, {
|
|
199
|
+
value: value,
|
|
200
|
+
writable: false,
|
|
201
|
+
enumerable: false,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
// Add to array and set length
|
|
205
|
+
this._items.push(value);
|
|
206
|
+
this.length = this._items.length;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Executes a provided function once for each array element.
|
|
211
|
+
* @param {*} callback Function that is called for every element of the array
|
|
212
|
+
* @param {*} thisArg Optional value to use as this when executing the callback function.
|
|
213
|
+
* @returns a new array
|
|
214
|
+
*/
|
|
215
|
+
forEach(callback, thisArg) {
|
|
216
|
+
return this._items.forEach(callback, thisArg);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Returns the first element that satisfies the provided testing function. If no values satisfy the testing function, undefined is returned.
|
|
221
|
+
* @param {*} callback Function that is called for every element of the array
|
|
222
|
+
* @param {*} thisArg Optional value to use as this when executing the callback function.
|
|
223
|
+
* @returns the first element matching the testing function
|
|
224
|
+
*/
|
|
225
|
+
find(callback, thisArg) {
|
|
226
|
+
return this._items.find(callback, thisArg);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* creates a new array with all elements that pass the test implemented by the provided function.
|
|
231
|
+
* @param {*} callback Function that is called for every element of the array
|
|
232
|
+
* @param {*} thisArg Optional value to use as this when executing the callback function.
|
|
233
|
+
* @returns an array containing elements passing the test function
|
|
234
|
+
*/
|
|
235
|
+
filter(callback, thisArg) {
|
|
236
|
+
return this._items.filter(callback, thisArg);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Get a element by either name (access as a map) or index (access as an array). Returns undefined if the element does not exist or
|
|
241
|
+
* if the array index is out of range.
|
|
242
|
+
* @param {string|number} indexOrKey the name or index of the element
|
|
243
|
+
* @returns the element matching the name or index
|
|
244
|
+
*/
|
|
245
|
+
get(indexOrKey) {
|
|
246
|
+
if (typeof indexOrKey === 'number') return this._items[indexOrKey];
|
|
247
|
+
return this._map[indexOrKey];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Creates a new array populated with the results of calling a provided function on every element in the calling array.
|
|
252
|
+
* @param {*} callback Function that is called for every element of the array
|
|
253
|
+
* @param {*} thisArg Optional value to use as this when executing the callback function.
|
|
254
|
+
* @returns a new array
|
|
255
|
+
*/
|
|
256
|
+
map(callback, thisArg) {
|
|
257
|
+
return this._items.map(callback, thisArg);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Returns a new array formed by applying a given callback function to each element of the array, and then flattening the result by one level.
|
|
262
|
+
* @param {*} callback Function that is called for every element of the array
|
|
263
|
+
* @param {*} thisArg Optional value to use as this when executing the callback function.
|
|
264
|
+
* @returns a new array
|
|
265
|
+
*/
|
|
266
|
+
flatMap(callback, thisArg) {
|
|
267
|
+
return this._items.flatMap(callback, thisArg);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Iterates over all the elements using the for ... of syntax.
|
|
272
|
+
* @returns returns each element one after the other
|
|
273
|
+
*/
|
|
274
|
+
*[Symbol.iterator] () {
|
|
275
|
+
for (const item of this._items) {
|
|
276
|
+
yield item;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
138
281
|
// Public expots
|
|
139
282
|
exports.Util = Util;
|
|
283
|
+
exports.ArrayMap = ArrayMap;
|
|
140
284
|
|
|
141
285
|
})();
|
package/src/xtkCaster.js
CHANGED
|
@@ -431,15 +431,30 @@ class XtkCaster {
|
|
|
431
431
|
return timespan;
|
|
432
432
|
}
|
|
433
433
|
|
|
434
|
+
/**
|
|
435
|
+
* Tests if a given type is a date or time type
|
|
436
|
+
* @param {string|number} type the type name
|
|
437
|
+
* @returns {boolean} true if the type is a date and/or time type
|
|
438
|
+
*/
|
|
434
439
|
static isTimeType(type) {
|
|
435
440
|
return type === "datetime" || type === "datetimetz" || type === "datetimenotz" || type === "timestamp" || type === "date" || type === "time" || type === "timespan" || type === 7 || type === 10 || type === 14;
|
|
436
441
|
}
|
|
437
442
|
|
|
438
|
-
|
|
443
|
+
/**
|
|
444
|
+
* Tests if a given type is a string type
|
|
445
|
+
* @param {string|number} type the type name
|
|
446
|
+
* @returns {boolean} true if the type is a string type
|
|
447
|
+
*/
|
|
448
|
+
static isStringType(type) {
|
|
439
449
|
return type === "string" || type === "memo" || type === 6 || type === 12 || type === 13 || type === "blob" || type === "html" || type === "CDATA";
|
|
440
450
|
}
|
|
441
451
|
|
|
442
|
-
|
|
452
|
+
/**
|
|
453
|
+
* Tests if a given type is a numeric type
|
|
454
|
+
* @param {string|number} type the type name
|
|
455
|
+
* @returns {boolean} true if the type is a numeric type
|
|
456
|
+
*/
|
|
457
|
+
static isNumericType(type) {
|
|
443
458
|
return type === "byte" || type === 1 || type === "short" || type === 2 || type === "int" || type === "long" || type === 3 || type === "float" || type === 4 || type === "double" || type === 5 || type === "timespan" || type === 14;
|
|
444
459
|
}
|
|
445
460
|
}
|