Release r202510
What's New
This release contains the following new or changed functionality:
New Array functions
The following Array functions are now available:
at(index)flat(depth)flatMap(callbackFn)groupBy(attribute)indexBy(attribute)inSlicesOf(size)reduce(callbackFn, initialValue)uniq()
The usage of these functions is explained in the sections below. The examples use the following data:
let people = [
{ name: "John", age: 30 },
{ name: "Peter", age: 25 },
{ name: "Mary", age: 25 }
]
at(index)
Returns the element at the index.
people.at(1)
// => { name: "Peter", age: 25 }
flat([depth])
Returns a new array with all sub-array elements concatenated into it recursively up to the specified depth. Defaults to depth of 1:
[1, [2, [3, 4]], 5].flat()
// => [1, 2, [[3], 4], 5]
[1, [2, [[3], 4]], 5].flat(2)
// => [1, 2, [3], 4, 5]
flatMap(callbackFn)
Identical to map() followed by a flat() of depth 1.
people.flatMap((person) => [person.name, person.age])
// => ["John", 30, "Peter", 25, "Mary", 25]
groupBy(attribute)
Splits an array into sets, grouped by the attribute.
people.groupBy("age");
// => {
// 25: [{ name: "Peter", age: 25 }, { name: "Mary", age: 25 }],
// 30: [{ name: "John", age: 30 }]
// }
indexBy(attribute)
Just like groupBy, but for when you know your attribute values are unique.
people.indexBy("name");
// => {
// John: { name: "John", age: 30 },
// Peter: { name: "Peter", age: 25 },
// Mary: { name: "Mary", age: 25 }
// }
When you use this on an array with non-unique values for attribute, the last value is returned.
people.indexBy("age");
// => {
// 25: { name: "Mary", age: 25 },
// 30: { name: "John", age: 30 }
// }
inSlicesOf(size)
Creates an array of elements split into groups the length of size.
people.inSlicesOf(2);
// => [
// [{ name: "John", age: 30 }, { name: "Peter", age: 25 }],
// [{ name: "Mary", age: 25 }]
// ]
reduce(callbackFn, [initialValue])
Executes a user-supplied "reducer" callback function on each element of the array, passing in the previous return value or, in case of the first element and if specified, the initialValue.
let initialValue = 10;
[1, 2, 3].reduce(
(accumulator, element) => accumulator + element,
initialValue
);
// => 16
uniq()
Returns a duplicate-free version of the array.
[3, 1, 2, 1, 3, 2, 3].uniq()
// => [3, 1, 2]
Support for bulk SQL operations
It is now possible to perform SQL operations in bulk by passing in an array of arrays or objects to the sql function. For example:
sql("CREATE TABLE people (name TEXT, age INTEGER)")
sql("INSERT INTO people (name, age) VALUES (:name, :age)", people)
sql("SELECT * FROM people")
// => [
// { "name": "John", "age": 30 },
// { "name": "Peter", "age": 25 },
// { "name": "Mary", "age": 25 }
// ]
Remove profile lock on logout
When users log out of the automator application, all of their profile locks are now automatically removed as well.
Important
This release contains the following important updates:
Reset of MFA device
After this release has been deployed, when users log in for the first time they will have to set up their MFA device again. This is a side-effect caused by the replacement of the backend that serves the user interface, one that we unfortunately cannot avoid.
Note that this only applies to users that are using a profile where MFA is required.
Timeline
The deployments of the release will be performed on
| Environment | Date |
|---|---|
| Demo | Friday, November 7th |
| Production | Thursday, November 20th |
The deployment of the Production environments will be conducted outside of office hours (Central European Time Zone).