Thanks to the extensive effort of the Neos team and our passionate contributors, we are thrilled to deliver many new features. Neos 3.2 and Flow 4.2 dramatically improve stability and usability for both end users and programmers. Below you will find essential information explaining the benefits and technical details.
Neos 3.2.0 New Features
Domain specific languages for Fusion
Fusion now allows the implementation of domain-specific sub languages. Those DSLs can take a piece of code that is optimized to express a specific class of problems and return the equivalent Fusion code to be cached and executed by the Fusion runtime afterwards.
Fusion-DSLs use the syntax of tagged template literals from ES6 and can be used in all value assignments:
value = dslIdentifier'... the code that is passed to the dsl ...'
If such a syntax-block is detected, fusion will:
- Look up the key dslIdentifier in the Setting Neos.Fusion.dsl to find the matching DSL implementation.
- Instantiate the DSL implementation class that was found registered.
- Check that the DSL implementation satisfies the interface \Neos\Fusion\Core\DslInterface
- Pass the code between the backticks to the DSL implementation.
- Finally parse the returned Fusion code
Fusion DSLs cannot extend the Fusion language and runtime itself, they are meant to enable a more efficient syntax for specific problems.
An already published example for a domain specific fusion-language is AFX, a Fusion port of React JSX. In fact, this is the language that the extension point was initially created for: The AFX DSL Package
Fallback graph visualization
To ensure that editors are always in control of their project’s content dimensions and their respective fallbacks, this milestone includes an interactive graphic visualization. It allows editors to see in great detail which fallbacks apply, even illustrating the priority of the fallback with higher opacity.
Specifically, the new backend module has two parts: the intra-dimensional fallback graph and the inter-dimensional fallback graph.
Selecting all changes in a document with one click
The workspace module shows a list of changes, grouped by document. So far, you could only apply either all changes at once, or had to click all individual ones of a document for further actions. To simplify the editor's job, you can now select all changes within one document with a single click.
Setting authentication provider on user creation in backend module
If more than one authentication provider is available, you can now select the appropriate one while creating a new user in the backend module.
Further features and smaller improvements
Every release brings a list of improvements to help developers create a powerful application. Most of those are hidden, “under the hood” of Neos. To make sure, you don’t miss them, here’s a short summary.
- Non-uuid node identifiers are now allowed.
- The ModulePrivilege helps protect Neos backend modules and automatically hides links to inaccessible modules. The setting ‘privilegeTarget’ is still supported, but deprecated.
- Neos.Neos:ImageUri and Neos.Neos:ImageTag now support generating asynchronous image URIs if the requested image hasn’t finished rendering.
- The conditional @if in Fusion evaluated falsy and truthy values like in PHP by no longer checking for an exact ‘false’ value in the condition-expression.
- The CachingHelper::nodeTypeTag became much more flexible, now allowing arrays in addition to strings.
For further details, see the full change log
Flow 4.2.0 New Features
Allow for dynamic label overrides
This replaces the previous physical file model with the file model defined by the XLIFF standard.
Files IDs are no longer defined by their location in the file system but by their _product-name_ and _orginal_ XLIFF attributes. The location serves as a fallback to prevent this from being a breaking change.
The XLIFF file provider, therefore, parses all registered packages and in addition the Data/Translations folder in search of file entries in .xlf files, changes are monitored and automatically triggers cache clearing.
Overriding labels is now as easy as putting a valid XLIFF file with defined _product-name_ (Package) and _orginal_ (Source) in any translation folder.
HTTP-stack PSR-7 compatibility
This adds all missing methods and implementations to make our HTTP implementation PSR-7 compatible. Further adjustments to Flow are not included yet.
ViewHelper compilation for increased speed
Compilation and static rendering to a couple of ViewHelpers was added. The modified ViewHelpers should all render faster in all scenarios.
Add Date.formatCldr helper
This change adds CLDR formatting capability to the Date Eel helper to match the functionality of the 'format.date' Fluid ViewHelper.
This static method allows instantiating a given class with an array of arguments in an efficient way. Most of this method was previously hidden in the ''ObjectManager'' of Flow but as the same code is replicated in other packages it makes sense to open it as the generic method for re-use.
Allow Nullable action params to be annotated
Action arguments can now be annotated "|null" or "null|" when they are optional with default value 'null'.
Add 'range' method to Eel Array-helper
The range method is a wrapper around the php range function that creates a sequence of integers or characters as array. This is especially helpful to create paginations in pure fusion.
Allow setting the package type when kick-starting a package
You can now do './flow kickstart:package Foo.Bar --packageType neos-plugin', like in the PackageCommandController.
For further details see the full change log.
This release is the product of a great community! Join the conversation at discuss.neos.io or on Slack and be part of our community and help us build the next release of Neos. If you are considering Neos for your organization, but have some unanswered questions, please feel free to get in touch with the Neos Team. We would be happy to help you get started on your Neos journey!
And if Neos helps you with your business, how about supporting the Neos Team financially, so we can meet in person and work on the next releases?