boxlang-modules-and-packages
BoxLang Modules and Packages
Overview
BoxLang's module system allows the runtime to be extended with additional built-in
functions (BIFs), components, and services. Modules are installed via CommandBox's
box CLI and configured in boxlang.json or Application.bx. Many modules
auto-register their BIFs globally — no imports required after installation.
Installing Modules
# Install via CommandBox
box install bx-redis
box install bx-pdf
box install bx-csv
box install bx-spreadsheet
# Install a specific version
box install bx-redis@2.1.0
# Install multiple at once
box install bx-redis bx-csv bx-mail
# List installed modules
box list
Configuring Modules in boxlang.json
{
"modules": {
"bx-redis": {
"enabled": true,
"settings": {
"host": "${REDIS_HOST:localhost}",
"port": 6379,
"password": "${REDIS_PASSWORD:}"
}
},
"bx-mail": {
"enabled": true,
"settings": {
"spooling": true,
"serverInterval": 5000,
"smtp": {
"host": "${SMTP_HOST}",
"port": 587,
"tls": true,
"auth": true,
"username": "${SMTP_USER}",
"password": "${SMTP_PASS}"
}
}
},
"compat-cfml": {
"enabled": true,
"settings": {
"engine": "Lucee"
}
}
}
}
Disabling a Module
{
"modules": {
"bx-orm": {
"enabled": false
}
}
}
Core Free Modules
bx-compat-cfml — CFML Compatibility
Enables CFML syntax parsing and CFML-specific functions/components for migrating legacy ColdFusion or Lucee applications:
{
"modules": {
"compat-cfml": {
"enabled": true,
"settings": { "engine": "Lucee" }
}
}
}
Once enabled, .cfm, .cfc, and CFML syntax are recognized alongside BoxLang syntax.
bx-web-support — Web Server Integration
Provides web request/response handling, session management, and CGI scope support. Required for any web application. Usually auto-loaded by CommandBox/MiniServer.
bx-mail — Email
// Send an email
bx:mail
to="user@example.com"
from="noreply@myapp.com"
subject="Welcome to MyApp!"
type="html" {
writeOutput( "<h1>Welcome, #name#!</h1>" )
writeOutput( "<p>Your account is ready.</p>" )
}
// Plain text with attachment
bx:mail to="admin@myapp.com" from="app@myapp.com" subject="Report" {
bx:mailpart type="text" {
writeOutput( "See attached report." )
}
bx:mailparam file=expandPath("./reports/daily.pdf") disposition="attachment"
}
bx-orm — Object Relational Mapping (Hibernate)
// In Application.bx
class {
this.ormEnabled = true
this.ormSettings = {
datasource : "mainDB",
dbcreate : "update",
flushAtRequestEnd : true,
autoManageSession : true
}
}
// Persistent entity: models/User.bx
class persistent="true" table="users" accessors="true" {
property name="id" column="id" fieldtype="id" generator="native"
property name="name" column="name" type="string"
property name="email" column="email" type="string"
// Relationship
property name="orders" fieldtype="one-to-many" cfc="models.Order"
cascade="all" lazy="true"
}
// ORM operations
var user = entityLoad( "User", userId )
entitySave( new models.User( name="Ada", email="ada@example.com" ) )
entityDelete( user )
// HQL queries
var users = ORMExecuteQuery( "FROM User WHERE status = :status", { status: "active" } )
BoxLang+ Premium Modules
BoxLang+ modules require a subscription at boxlang.io.
bx-pdf — PDF Generation
// Generate PDF from HTML
bx:pdf action="write" filename=expandPath("./output/report.pdf") overwrite="true" {
bx:pdfparam type="header" {
writeOutput( "<h3>Monthly Report</h3>" )
}
writeOutput( "<h1>Sales Summary</h1>" )
writeOutput( "<p>Total: $#totalSales#</p>" )
include "views/sales-table.bxm"
}
// Merge PDFs
bx:pdf action="merge" destination=expandPath("./merged.pdf") overwrite="true" {
bx:pdfparam source=expandPath("./cover.pdf")
bx:pdfparam source=expandPath("./report.pdf")
}
bx-csv — CSV Processing
// Parse CSV
var data = csvParse( fileRead("data.csv") )
// Parse with options
var data = csvParse(
fileRead( "data.csv" ),
{
hasHeaders : true,
delimiter : ",",
quoteChar : '"',
charset : "UTF-8"
}
)
// Iterate rows
for ( var row in data ) {
processRow( row )
}
// Generate CSV
var output = csvSerialize(
queryExecute( "SELECT id, name, email FROM users" ),
{ hasHeaders: true, delimiter: "," }
)
fileWrite( "export.csv", output )
bx-spreadsheet — Excel (XLSX)
// Read a spreadsheet
var wb = spreadsheetRead( expandPath("./data.xlsx") )
var sheet = spreadsheetGetSheetName( wb, 1 )
var data = spreadsheetRead( expandPath("./data.xlsx"), true, true )
// Create a spreadsheet
var wb = spreadsheetNew( "Report" )
spreadsheetAddRow( wb, ["Name", "Email", "Revenue"] )
for ( var user in users ) {
spreadsheetAddRow( wb, [user.name, user.email, user.revenue] )
}
// Format header row
spreadsheetFormatRow( wb, {
bold : true,
bgcolor : "##336699",
fontcolor : "##FFFFFF"
}, 1 )
spreadsheetWrite( wb, expandPath("./report.xlsx") )
bx-redis — Redis Integration
// After configuring the module, use Redis as a cache provider
// (see caching skill for full details)
// Direct Redis operations via the Redis client
var redis = getBoxService( "RedisService" )
redis.set( "key", "value", 3600 ) // with TTL in seconds
var val = redis.get( "key" )
redis.del( "key" )
redis.incr( "counter" )
redis.lpush( "queue", serializeJSON(job) )
var job = redis.rpop( "queue" )
bx-ldap — LDAP Directory
bx:ldap
server="ldap.example.com"
port="389"
username="cn=admin,dc=example,dc=com"
password="#ldapPassword#"
action="query"
name="result"
start="dc=example,dc=com"
attributes="cn,mail,sn"
filter="(objectClass=person)"
for ( var person in result ) {
writeOutput( "#person.cn# — #person.mail#<br>" )
}
bx-image — Image Manipulation
// Read and resize
var img = imageRead( expandPath("./upload/photo.jpg") )
imageResize( img, 800, 600 )
imageWrite( img, expandPath("./output/photo-resized.jpg") )
// Crop
imageCrop( img, x=0, y=0, width=400, height=300 )
// Add watermark
var watermark = imageNew( "", 200, 50, "argb", "##00000000" )
imageDrawText( watermark, "© 2024 MyApp", 10, 30, { size: 16, color: "##FFFFFF" } )
imagePaste( img, watermark, 600, 550 )
// Get info
var info = imageInfo( img )
writeOutput( "Width: #info.width#, Height: #info.height#" )
Module Introspection
// List all loaded modules
var modules = getBoxService( "ModuleService" ).getLoadedModules()
modules.each( (name) -> writeOutput( name & "<br>" ) )
// Get module info
var info = getModuleInfo( "bx-redis" )
writeOutput( "Version: #info.version#" )
writeOutput( "Author: #info.author#" )
// Check if a module is loaded
if ( isModuleLoaded( "bx-redis" ) ) {
// use Redis
}
References
More from ortus-boxlang/skills
boxlang-functional-programming
Use this skill when working with BoxLang lambdas, closures, arrow functions, higher-order functions, functional array/struct pipelines (map, filter, reduce, flatMap, groupBy, etc.), destructuring, or spread syntax.
10boxlang-code-reviewer
Use this skill when reviewing BoxLang code for quality, correctness, security vulnerabilities, performance issues, style violations, or when providing structured code review feedback following BoxLang best practices and security guidelines.
9boxlang-best-practices
Use this skill when writing, reviewing, or improving BoxLang code to ensure it follows community best practices for naming, structure, scoping, error handling, performance, and maintainability.
9boxlang-classes-and-oop
Use this skill when writing BoxLang classes, components, interfaces, inheritance hierarchies, annotations, properties, constructors, or applying object-oriented design patterns in BoxLang.
9boxlang-web-development
Use this skill when building BoxLang web applications: Application.bx lifecycle, request/response handling, sessions, forms, REST APIs, HTTP clients, routing, CSRF protection, Server-Sent Events, or configuring CommandBox/MiniServer.
8boxlang-configuration
Use this skill when configuring BoxLang runtime settings via boxlang.json, setting environment variables for config overrides, configuring datasources, caches, executors, modules, logging, security, or schedulers — or when helping someone understand the BoxLang configuration system.
8