githubEdit

1.4.0

August 2, 2025

We're excited to announce BoxLang v1.4.0, our biggest release yet! This major update brings powerful new features, performance improvements, and extensive bug fixes that make BoxLang more robust and developer-friendly than ever.

🚀 Core Runtime Updates

Revolutionary Asynchronous Programming Framework

BoxLang v1.4.0 introduces a game-changing asynchronous programming framework that sets a new standard for JVM languages. This isn't just another async implementation—it's a comprehensive, battle-tested framework that makes parallel programming accessible, intuitive, and powerful in ways that other languages and frameworks simply don't offer.

What makes this revolutionary:

  • Zero boilerplate - Write async code as naturally as synchronous code

  • Built-in parallel primitives - No need for complex thread management or executor services

  • Functional composition - Chain, compose, and transform async operations with ease

  • Exception safety - Automatic error propagation and handling across async boundaries

  • Performance optimized - Leverages modern JVM concurrency patterns under the hood

  • Dedicated logging - Separate async.log and scheduler.log files for complete observability of async operations

Core async primitives that change everything:

  • asyncRun() - Transform any operation into a non-blocking future (with runAsync() as an alias)

  • asyncAll() - Execute multiple operations in parallel and aggregate results—no more callback hell or complex coordination

  • asyncAllApply() - Map-reduce operations across collections in parallel with automatic work distribution

  • asyncAny() - Race multiple operations and get the fastest result—perfect for timeout patterns and redundant services

This is async programming reimagined. While other languages force you to deal with complex promises, callbacks, or verbose async/await patterns, BoxLang gives you declarative parallel programming that just works.

This powerful new framework is fully documented in our comprehensive Asynchronous Programming Guidearrow-up-right, including detailed sections on Executorsarrow-up-right, BoxFuturesarrow-up-right, Async Pipelinesarrow-up-right, Parallel Computationsarrow-up-right, and Scheduled Tasksarrow-up-right.

Enhanced BoxLang Mappings

Mappings now support an external flag (defaults to false) for better module organization and security. All mappings in the global runtime config boxlang.json and those in the Application.bx|cfc are external = true by default, meaning they can be accessed via the URL.

All module mappings are external = false by default, meaning they are not accessible via the URL.

Loop Grouping Enhancements

BoxLang now supports complex nested grouping in queries and loops, allowing you to easily group data by multiple fields. This makes it simpler to generate reports and summaries directly in your templates.

⚡Miniserver Updates

Read all about the new miniserver features in our MiniServer Guidearrow-up-right.

Environment Variable Support (.env)

The BoxLang miniserver now supports .env files for configuration management. It will look for a .env file in the root of your project and load environment variables from it. This allows you to easily manage configuration settings without hardcoding them in your codebase.

Miniserver Health Checks

Added simple health check endpoints for container-based deployments, making BoxLang more cloud-native.

Hidden File Protection

Basic protection against serving hidden files (dot files) in the miniserver for improved security.

🔧 Performance & Optimization Improvements

String Performance Enhancements

  • Significant performance improvements for toScript() BIF

  • Optimized string operations throughout the runtime

  • Better memory management for large string operations

Custom Component Lookup Optimization

  • Refactored custom component and class lookup for improved performance

  • Better caching mechanisms for frequently accessed components

  • Reduced overhead in component resolution

Module Class Visibility

  • Module classes are now properly visible to the context classloader

  • Improved module loading and initialization performance

JSON Processing Improvements

  • Removed JSON serialization limits

  • Enhanced JSON serialization of throwable objects

  • Better handling of complex object graphs in JSON serialization

🛠️ Language & Runtime Improvements

Enhanced Date/Time Handling

  • Support for more natural date parsing masks (case-insensitive)

  • Better timezone handling in DateTimeCaster

  • Improved CFML compatibility for partial years

  • Fixed issues with GregorianCalendar.getTime() return types

Improved Type Coercion

  • Skip type coercion for === operator (strict equality)

  • Better handling of Java arrays in modifiable contexts

  • Enhanced casting between BoxLang DateTime and Java Date types

Better Error Handling

  • Improved error messages in expression interpreter

  • Enhanced attempt.orThrow() handling

  • Better parsing errors for unclosed brackets

Array & Collection Enhancements

  • ArrayResize now accepts long values

  • Added missing max and min member functions

  • Fixed WriteDump errors on null array values

Query Improvements

  • Fixed query context issues in nested loops

  • Resolved queryDeleteColumn data integrity issues

  • Better handling of query serialization/deserialization

  • Support for queryObject.columnnames property

Regular Expression Enhancements

  • Fixed back reference handling (including references > 9)

  • Improved upper/lower case escapes in replacement text

  • Better support for complex regex patterns

🐛 Major Bug Fixes

JDBC & Database

  • Fixed race conditions in threaded query execution

  • Resolved nested transaction issues

  • Fixed savepoint name length limitations

  • Improved query caching with Redis integration

File Operations

  • Fixed cfcontent file corruption issues

  • Better handling of relative file paths in fileRead

  • Improved MIME type detection with strict mode

  • Enhanced multipart form handling

Session Management

  • Fixed SessionRotate and SessionInvalidate JSessionId handling

  • Better SameSite cookie attribute handling

  • Improved session shutdown cache interceptor

Component & Scope Handling

  • Fixed private static struct function access

  • Resolved scope access issues in custom tags

  • Better handling of thisComponent scope (renamed from thisTag)

Serialization & Casting

  • Fixed DeSerializeJSON strictMapping parameter

  • Better handling of Java primitive arrays

  • Improved object serialization in various contexts

🏗️ Architectural Changes

Dependency Updates

  • Updated Jackson-jr to latest patch version

  • Bumped semver4j from 5.8.0 to 6.0.0

  • Updated Apache Commons FileUpload to jakarta-servlet5

  • Updated Commons Text from 1.13.1 to 1.14.0

  • Updated Commons IO from 2.19.0 to 2.20.0

Code Organization

  • Refactored customTagsDirectory to customComponentsDirectory (with backward compatibility)

  • Renamed thisTag scope to thisComponent scope for consistency

  • Removed external JavaParser dependencies unless explicitly checked

Base64 & Encoding

  • Improved base64 string handling with padding tolerance

  • Better UTF-8 encoding support for multipart form data

  • Enhanced encoding handling across the platform

📚 New Documentation

We've significantly expanded our documentation with comprehensive new guides:

Comprehensive Asynchronous Programming Documentation

🎯 CFML Compatibility Improvements

This release includes numerous CFML compatibility enhancements:

  • Better parseDateTime compatibility with ACF

  • Improved handling of date masks and formatting

  • Enhanced numeric operations and casting

  • Better list BIF consistency across multi-character delimiters


Release Notes

Improvement

BL-1517arrow-up-right Update the feature audit tool with the correct modules

BL-1518arrow-up-right Remove all JavaParser dependencies externally unless you check if it exists

BL-1565arrow-up-right improve error message on expression interpreter

BL-1566arrow-up-right Handle attempt.orThrow() better

BL-1571arrow-up-right Support some more natural date parsing masks which aren't case sensitive

BL-1577arrow-up-right lookup of custom componets and classes refactoring for performance

BL-1579arrow-up-right String performance and optimizations improvements for toScript() bif

BL-1581arrow-up-right Bump org.semver4j:semver4j from 5.8.0 to 6.0.0

BL-1601arrow-up-right avoid calling unputStream.available() due to FusionReactor bug

BL-1604arrow-up-right make module classes visible to context classloader

BL-1618arrow-up-right Update jackson-jr to latest patch

BL-1625arrow-up-right skip type coercion for === operator

BL-1636arrow-up-right default non-existent request bodies to an empty string

BL-1642arrow-up-right Ignore extra padding on base64 encoded strings

BL-1647arrow-up-right remove JSON serialization limit

BL-1648arrow-up-right Improve JSON serialization of throwable

BL-1651arrow-up-right org.apache.commons:commons-fileupload2-jakarta-servlet5

BL-1653arrow-up-right Re-organize and add validation to loaded miniserver config options

BL-1656arrow-up-right Bump org.apache.commons:commons-text from 1.13.1 to 1.14.0 (#288)

BL-1657arrow-up-right Bump commons-io:commons-io from 2.19.0 to 2.20.0

BL-1659arrow-up-right Re-instate parsing errors for unclosed brackets

Bug

BL-1214arrow-up-right Documentation of Image module

BL-1367arrow-up-right BX Compiler Issues

BL-1415arrow-up-right Cast error on BoxFuture.all()

BL-1496arrow-up-right Can't cast a Java Array to a modifiable Array.

BL-1539arrow-up-right DateFormat vs TimeFormat vs DateTimeFormat BIF Separations

BL-1548arrow-up-right Private static struct function not found

BL-1555arrow-up-right round does not accept second argument for number of places, despite being documented

BL-1562arrow-up-right Issue with clone when using zonedatetimes

BL-1564arrow-up-right dump template for Java class not handling static field

BL-1567arrow-up-right java boxpiler not always compiling array literal

BL-1568arrow-up-right JDBC - Unable to execute query in nested transaction unless outer transaction has a query that executes first

BL-1569arrow-up-right JDBC - Failed to set savepoint... is too long

BL-1570arrow-up-right date mask when parsing string dates

BL-1573arrow-up-right Fix for this scope access from function in custom tag

BL-1575arrow-up-right stack overflow in session shutdown cache interceptor

BL-1578arrow-up-right ToscriptTest not accounting for the timezone of the tests

BL-1580arrow-up-right ParseDateTimeTest using non timezone tests and would be unpredictable on certain conditions

BL-1582arrow-up-right bx:component is missing attributecollection argument

BL-1584arrow-up-right DateTimeCaster does not handle request timezones Zones correctly

BL-1585arrow-up-right CFML Compat with partial years

BL-1587arrow-up-right Different return type when calling `getTime()` on `java.util.GregorianCalendar`

BL-1588arrow-up-right StructSort numeric not sorting on values

BL-1589arrow-up-right Regular expression back reference is being ignored

BL-1592arrow-up-right ASM not compiling self-closing custom components the same as Java boxpiler

BL-1593arrow-up-right outer loop loses query context after inner loop

BL-1594arrow-up-right Issue with JSON serialization of dates in a BL class

BL-1596arrow-up-right session cookie - samesite handling

BL-1597arrow-up-right ArrayResize does not accept long

BL-1598arrow-up-right WriteDump Error on Null Array Values

BL-1606arrow-up-right Compat: DeSerializeJSON strictMapping ignored

BL-1607arrow-up-right SessionRotate and SessionInvalidate null out JSessionId

BL-1610arrow-up-right ACF parseDateTime compat

BL-1611arrow-up-right Casting ortus.boxlang.runtime.types.DateTime to java.util.Date

BL-1612arrow-up-right outer for loop loses query context with inner for loop

BL-1613arrow-up-right queryDeleteColumn deletes the column but not the data from the query object

BL-1615arrow-up-right fileRead should handle relative files

BL-1616arrow-up-right now isn't being cast to java.util.Date

BL-1620arrow-up-right Grouped looping is not showing expected output when not inner grouping

BL-1621arrow-up-right JDBC - Query caching into bx-redis throws 'failed to serialize object'

BL-1622arrow-up-right Httpparam formfield is adding a break line on values when multipart is true

BL-1623arrow-up-right FileGetMimeType with strict should be based on file content

BL-1624arrow-up-right Deserialized Query Columns are Invalid because they no longer contain query reference

BL-1626arrow-up-right DateTime does not properly deserialize because formatter is transient

BL-1627arrow-up-right val() with negative value returns 0

BL-1628arrow-up-right regex replacement backreferences greater than 9 don't wor

BL-1629arrow-up-right regex upper/lower case escapes should apply to all replacement text

BL-1630arrow-up-right JDBC race conditions present in threaded (or Future-ed) query execution

BL-1632arrow-up-right Zip includes target directory as first level parent.

BL-1633arrow-up-right queryObject.columnnames not supported

BL-1634arrow-up-right cfcontent is causing files to be corrupted

BL-1635arrow-up-right java double[] not handled by writeoutput / SerializeJSON

BL-1639arrow-up-right `max` and `min` member functions missing

BL-1641arrow-up-right list BIFs have inconsistent support for multiCharacterDelimiter

BL-1652arrow-up-right PlacehbolderReplacer was not using the String Caster when dealing with map bindings.

BL-1658arrow-up-right Servlet: Missing UTF-8 encoding for form fields with multipart/form-data

New Feature

BL-842arrow-up-right .env support for the BoxLang miniserver

BL-1464arrow-up-right implement nested grouped output/looping

BL-1515arrow-up-right Add zipparam support for ZIP functionality

BL-1525arrow-up-right BoxLang mappings need to have an extra definition: external which defaults to false

BL-1595arrow-up-right runAsync is the alias, the main method is asyncRun() so we can use the `asyncX` namespace

BL-1609arrow-up-right asyncAll, asyncAllApply, asyncAny bifs and constructs for parallel programming

BL-1654arrow-up-right Add simple health checks for miniserver, especially for container based loading

BL-1655arrow-up-right Basic hidden file protection in MiniServer

Task

BL-1576arrow-up-right Refactor customTagsDirectory to customComponentsDirectory and add shim to support it

BL-1637arrow-up-right Rename thisTag scope to thisComponent scope for consistency and transpile the old scope

Last updated

Was this helpful?