@adobe/acc-js-sdk 1.0.9 → 1.1.0
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 +17 -0
- package/MIGRATION.md +160 -0
- package/README.md +138 -14
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/application.js +347 -141
- package/src/index.js +1 -1
- 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/util.test.js +167 -1
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/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
|
}
|