@@ -476,6 +476,120 @@ full, log entries are written synchronously until the queue has space again.
476476
477477## Miscellaneous changes
478478
479+ ### V8 and ICU library upgrades
480+
481+ The bundled V8 JavaScript engine has been upgraded from version 7.9.317 to
482+ 12.1.165. As part of this upgrade, the bundled Unicode character handling library
483+ ICU has been upgraded as well, from version 64.2 to 73.1.
484+
485+ Note that ArangoDB's build of V8 has pointer compression disabled to allow for
486+ more than 4 GB of heap memory.
487+
488+ The V8 upgrade brings various language features to JavaScript contexts in ArangoDB
489+ like arangosh, Foxx, and JavaScript Transactions. These features are part of the
490+ ECMAScript specifications ES2020 through ES2024. The following list is non-exhaustive:
491+
492+ - Optional chaining, like ` obj.foo?.bar?.length ` to easily access an object
493+ property or call a function but stop evaluating the expression as soon as the
494+ value is ` undefined ` or ` null ` and return ` undefined ` instead of throwing an error
495+
496+ - Nullish coalescing operator, like ` foo ?? bar ` to evaluate to the value of ` bar `
497+ if ` foo ` is ` null ` or ` undefined ` , otherwise to the value of ` foo `
498+
499+ - Return the array element at the given index, allowing positive as well as
500+ negative integer values, like ` [1,2,3].at(-1) `
501+
502+ - Copying versions of the array methods ` reverse() ` , ` sort() ` , and ` splice() `
503+ that perform in-place operations, and a copying version of the bracket notation
504+ for changing the value at a given index
505+ - Return a new array with the elements in reverse order, like ` [1,2,3].toReversed() `
506+ - Return a new array with the elements sorted in ascending order, like ` [2,3,1].toSorted() `
507+ - Return a new array with elements removed and optionally inserted at a given
508+ index, like ` [1,2,3,4].toSpliced(1,2,"new", "items") `
509+ - Return a new array with one element replaced at a given index, allowing
510+ positive and negative integer values, like ` [1,2,3,4].with(-2, "three") `
511+
512+ - Find array elements from the end with ` findLast() ` and ` findLastIndex() ` , like
513+ ` [1,2,3,4].findLast(v => v % 2 == 1) `
514+
515+ - Return a new string with all matches of a pattern replaced with a provided value,
516+ not requiring a regular expression, like ` "foo bar foo".replaceAll("foo", "baz") `
517+
518+ - If the ` matchAll() ` method of a string is used with a regular expression that
519+ misses the global ` g ` flag, an error is thrown
520+
521+ - A new regular expression flag ` d ` to include capture group start and end indices,
522+ like ` /f(o+)/d.exec("foobar").indices[1] `
523+
524+ - A new regular expression flag ` v ` to enable the Unicode sets mode, like
525+ ` /^\p{RGI_Emoji}$/v.test("👨🏾⚕️") ` or ` /[\p{Script_Extensions=Greek}--[α-γ]]/v.test('β') `
526+
527+ - A static method to check whether an object directly defines a property, like
528+ ` Object.hasOwn({ foo: 42 }) ` , superseding ` Object.prototype.hasOwnProperty() `
529+
530+ - ` Object.groupBy() ` and ` Map.groupBy() ` to group the elements of an iterable
531+ according to the string values returned by a provided callback function
532+
533+ - Logical assignment operators ` &&= ` , ` ||= ` , ` ??= `
534+
535+ - Private properties that cannot be referenced outside of the class,
536+ like ` class P { #privField = 42; #privMethod() { } } `
537+
538+ - Static initialization blocks in classes that run when the class itself is
539+ evaluated, like ` class S { static { console.log("init block") } } `
540+
541+ - ` WeakRef ` to hold a weak reference to another object, without preventing that
542+ object from getting garbage-collected
543+
544+ - A ` cause ` property for Error instances to indicate the original cause of the error
545+
546+ - Extended internationalization APIs. Examples:
547+
548+ ``` js
549+ let egyptLocale = new Intl.Locale (" ar-EG" )
550+ egyptLocale .numberingSystems // [ "arab" ]
551+ egyptLocale .calendars // [ "gregory", "coptic", "islamic", "islamic-civil", "islamic-tbla" ]
552+ egyptLocale .hourCycles // [ "hc12" ]
553+ egyptLocale .timeZones // [ "Africa/Cairo" ]
554+ egyptLocale .textInfo // { "direction": "rtl" }
555+ egyptLocale .weekInfo // { "firstDay": 6, "weekend" : [5, 6], "minimalDays": 1 }
556+
557+ Intl .supportedValuesOf (" collation" ); // [ "compat", "emoji", "eor", "phonebk", ... ]
558+ Intl .supportedValuesOf (" calendar" ); // [ "buddhist", "chinese", "coptic", "dangi", ... ]
559+ // Other supported values: "currency", "numberingSystem", "timeZone", "unit"
560+
561+ let germanLocale = new Intl.Locale (" de" )
562+ germanLocale .collations // [ "emoji", "eor", "phonebk" ]
563+ germanLocale .weekInfo // { "firstDay": 1, "weekend" : [6, 7], "minimalDays": 4 }
564+
565+ let ukrainianCalendarNames = new Intl.DisplayNames ([" uk" ], { type: " calendar" })
566+ ukrainianCalendarNames .of (" buddhist" ) // "буддійський календар"
567+
568+ let frenchDateTimeFieldNames = new Intl.DisplayNames ([" fr" ], { type: " dateTimeField" })
569+ frenchDateTimeFieldNames .of (" day" ) // "jour"
570+
571+ let japaneseDialectLangNames = new Intl.DisplayNames ([" ja" ], { type: " language" })
572+ let japaneseStandardLangNames = new Intl.DisplayNames ([" ja" ], { type: " language" , languageDisplay: " standard" })
573+ japaneseDialectLangNames .of (' en-US' ) // "アメリカ英語"
574+ japaneseDialectLangNames .of (' en-GB' ) // "イギリス英語"
575+ japaneseStandardLangNames .of (' en-US' ) // "英語 (アメリカ合衆国)"
576+ japaneseStandardLangNames .of (' en-GB' ) // "英語 (イギリス)"
577+
578+ let americanDateTimeFormat = new Intl.DateTimeFormat (" en-US" , { timeZoneName: " longGeneric" })
579+ americanDateTimeFormat .formatRange (new Date (0 ), new Date ()) // e.g. with a German local time:
580+ // "1/1/1970, Central European Standard Time – 1/16/2024, Central European Time"
581+
582+ let swedishCurrencyNames = new Intl.DisplayNames ([" sv" ], { type: " currency" })
583+ swedishCurrencyNames .of (" TZS" ) // "tanzanisk shilling"
584+
585+ let americanNumberFormat = new Intl.NumberFormat (" en-US" , {
586+ style: " currency" , currency: " EUR" , maximumFractionDigits: 0 })
587+ americanNumberFormat .formatRange (1.5 , 10 ) // "€2 – €10"
588+
589+ let welshPluralRules = new Intl.PluralRules (" cy" )
590+ welshPluralRules .selectRange (1 , 3 ) // "few"
591+ ```
592+
479593### Active AQL query cursors metric
480594
481595The ` arangodb_aql_cursors_active ` metric has been added and shows the number
0 commit comments