Skip to content

Releases: wheels-dev/wheels

Wheels 3.0.0-rc.1+2 (Release Candidate)

20 Oct 22:40

Choose a tag to compare

Pre-release

Release Candidate 1 for Wheels 3.0.0

This is a pre-release version for community testing. Please report any issues to GitHub.

🎉 Major Changes in 3.0.0

Rebrand: CFWheels → Wheels

  • Project renamed from "CFWheels" to "Wheels"
  • New domain: wheels.dev (from cfwheels.org)
  • New GitHub organization: wheels-dev/wheels (from cfwheels/cfwheels)

Architecture Changes

  • New Project Structure: Wheels core moved outside app root for cleaner separation
  • Updated Mappings: Application.cfm paths restructured for better organization
  • CLI Enhancements: New wheels CLI tool with enhanced commands
    • wheels init - Initialize new Wheels projects with Docker support
    • wheels env setup - Environment configuration and switching
    • wheels db create/drop - Database management with Oracle support
  • macOS Installer: Complete macOS installer package with automated setup
  • VSCode Extension API: Enhanced API for better IDE integration

Model Enhancements

  • ignoreColumns(): New model config method to exclude columns from mapping
  • Improved Model Initialization: Better race condition handling with automatic recovery
  • Performance Improvements: Significant findAll() performance optimizations
  • Query Enhancements: Native query returnType support
  • Calculated Properties: Fixed invalidation issues for better reliability

View Enhancements

  • paginationLinks(): Enhanced to set active class on parent elements

Testing & Development

  • Rewritten TestUI: Modern Vue-based test runner interface
  • Database Support: Updated to latest versions of MySQL, PostgreSQL, SQL Server
  • Oracle Support: Full Oracle database support in CLI commands
  • Migration System: Updated null property handling (null → allowNull)

Bug Fixes

  • Fixed model datasource bugs
  • Fixed updateAll() missing JOIN statements with include argument
  • Fixed checkbox bugs when checkedValue is not true
  • Fixed ambiguous column names using wheels alias
  • Fixed duplicate component issues
  • Fixed default route handling
  • Fixed numeric primary key return values
  • Fixed afterFind callback in findAll for structs
  • Fixed reload password check for URL IP exceptions

Documentation

  • Extensive guide updates and improvements
  • Added WHERE clause nested query limitations
  • Updated beginner tutorials
  • Added ignored columns documentation
  • Spelling and grammar fixes throughout
  • Test framework functions added to documentation

Testing Infrastructure

  • Added Lucee 6 and 7 support
  • Added Adobe 2021, 2023, 2025 support
  • Updated to Docker Compose v2 syntax
  • Enhanced GitHub Actions testing matrix

Potentially Breaking Changes

⚠️ Important: Review these changes before upgrading from 2.x

  • Project Structure: Wheels core location changed - requires Application.cfm updates
  • Mappings: New mapping structure in Application.cfm
  • CLI Commands: New command syntax for database operations
  • Dependencies: Updated WireBox (^7.0.0) and TestBox (^6.0.0) requirements

Testing Focus Areas

Please help test these areas:

  • Fresh installations on Lucee 5/6/7, Adobe 2021/2023/2025, BoxLang
  • Upgrades from 2.5.0 to 3.0.0-rc.1
  • New CLI commands (wheels init, wheels db create, etc.)
  • Model ignoreColumns() functionality
  • Application.cfm mapping changes
  • Oracle database support
  • macOS installer

Wheels 3.0.0-rc.1+1 (Release Candidate)

07 Oct 16:52

Choose a tag to compare

Pre-release

Release Candidate 1 for Wheels 3.0.0

This is a pre-release version for community testing. Please report any issues to GitHub Issues.

What's New in 3.0.0

This release represents a major milestone with significant architectural improvements and new features:

Testing Focus Areas

Please help test these critical areas:

  • Fresh installations on all supported CFML engines
  • Upgrades from 2.x versions
  • Plugin compatibility
  • Database operations and migrations
  • CLI command functionality

CFWheels v2.5.1

13 Nov 13:20
0d199a8

Choose a tag to compare

This is a maintenance release fixing an issue introduced with v.2.5.0 release where setting an alternate datasource in the model was being ignored and the default datasource was being used instead.

CFWheels v2.5.0

02 Nov 02:52

Choose a tag to compare

Model Enhancements

  • PR-1183-Allow datasource argument in finders #1183 - [Adam Chapman]
  • PR-1201-Issue #929 validate not nullable columns with default #1201 - [Adam Chapman]
  • PR-1202-Remove old oracle test workaround #1202 - [Adam Chapman]
  • PR-1205-issue-1182-adds-simplelock-to-sql-caching #1205 - [Adam Chapman]
  • PR-1222-Findall() performance bottleneck #1222 - [Adam Chapman]
  • PR-1223-refactor-queryCallback-with-inbuilt-query-functions #1223 - [Adam Chapman]
  • PR-1226-Invalid column not throwing exception in select argument #1226 - [Zain Ul Abideen]
  • PR-1265-improve-performance-refactor-out-listfind #1265 - [Adam Chapman]
  • PR-1260-Adds support for native query returnType #1260 - [Adam Chapman]
  • PR-1249-Removed the original IF/ELSE condition that invalidates calculated props and added condition #1240 - [Zain Ul Abideen]

View Enhancements

  • PR-1254-issue 908 enable paginationLinks() to set active class on parent #1254 - [Zain Ul Abideen]

Bug Fixes

  • PR-1227-Return a numeric value if the primary key is Numeric #1227 - [Zain Ul Abideen]
  • PR-1257-Checkbox bug when checkedvalue is not true #1257 - [Adam Chapman]
  • PR-1246-set the default route if it is not passed in the function #1246 - [Zain Ul Abideen]
  • PR-1256-issue 889 unable to duplicate component #1256 - [Zain Ul Abideen]
  • PR-1253-Issue 580 select ambiguous column name using the wheels alias #1253 - [Zain Ul Abideen]
  • PR-1245-Added afterFind callback hook in the findAll function in case of structs #1245 - [Zain Ul Abideen]
  • PR-1302-Check for Reload Password when setting a url IP exception #1302 - Peter Amiri

Miscellaneous

  • PR-1175-restoreTestRunnerApplicationScope setting #1175 - [Adam Chapman]
  • PR-1176-fix text in core readme file #1176 - [Per Djurner]
  • PR-1177-fix text in base template readme file #1177 - [Per Djurner]
  • PR-1178-fix text in default template file #1178 - [Per Djurner]
  • PR-1185-adds-root-docker-volume #1185 - [Adam Chapman]
  • PR-1200-Update the docker-compose command to docker compose v2 syntax #1200 - [Adam Chapman, Peter Amiri]
  • PR-1204-Add Lucee 6 to test matrix on local Docker test suite #1204 - [Peter Amiri]
  • PR-1203-ensure testing params maintained #1203 - [Adam Chapman]
  • PR-1228-Adding addClass attribute in the function textField #1228 - [Zain Ul Abideen]
  • PR-1230-Add Adobe 2021 Support to local Docker and GitHub Actions testing - #1230 - Peter Amiri
  • PR-1264-update Lucee 6 version used for tests to latest #1264 - [Zac Spitzer - * New Contributor *]
  • PR-1241-Fix spelling and remove whitespace from link #1241 - [John Bampton]
  • PR-1247-show the current git branch in the debug layout #1247 - [Michael Diederich]
  • PR-1250-Added test framework functions in the docs #1250 - [Zain Ul Abideen]
  • PR-1255-issue 1179 Downloaded the CDN files and changed paths in files #1255 - [Zain Ul Abideen]

Guides

  • PR-1198-Documentation-fixes #1198 - [Adam Chapman]

CFWheels v2.4.0

18 Aug 03:09

Choose a tag to compare

Bug Fixes

  • issue-1091-wheels-paths-in-error-template #1091 - [Adam Chapman]
  • issue-1082-validations should not trim properties #1082 - [Adam Chapman]
  • issue-1088-Adds SQL parsing regex tweak which correctly handles whitespace #1088 - [Adam Chapman, Adam Cameron]

Miscellaneous

  • Adds cfformat ignore marker comments around core "view" cfm files that contain html markup - [Adam Chapman]
  • Adds the ability to scroll large items horizontally in the test runner UI #1130 - [Adam Chapman]
  • Fix cfformat ignore markers #1129 - [Adam Chapman]
  • Enable finder model methods to returnAs "sql", mainly for debugging #1141 - [Adam Chapman]
  • Show the Test Runner buttons in the CFWheels GUI on the Package List screen allowing the developer to run the entire test suite instead of one package at a time. - [Peter Amiri]
  • The Base Template now contains all necessary placeholders for the CLI to interact with the application and be able to inject code properly. - [Peter Amiri]
  • By default the Core tests will run in the application datasource, but the developer can setup a different database for running the Core tests to ensure there is no side effects from running the tests. If you do end up setting a different database for the coreTestDatasourceName, make sure to reload your application after running the Core tests. - [Peter Amiri]
  • Fix two broken links in README. [#1150] - [John Bampton - * New Contributor *]
  • Fix spelling [#1151][#1158] - [John Bampton - * New Contributor *]
  • Add .env parser to parse .env files and add the properties found in the file to this.env scope. #1157 - [Peter Amiri]
  • Update the local test suite to supported ARM architecture docker images to make the suite compatible with the Apple Silicon Macs. #1143 - [Peter Amiri]

Guides

  • Fix broken links throughout the guides. - [Peter Amiri]
  • Fixed mailto link in CONTRIBUTING.md #1123 - [Coleman Sperando * New Contributor *]
  • Fix test guides examples #1125 [Adam Chapman]
  • Fix typos in the guides #1161 [Adam Chapman]

CFWheels Version v2.3.0

11 May 17:45

Choose a tag to compare

This is the official 2.3.0 release. There were no new enhancements or bug fixes introduced from release candidate 1 so the change log is essentially the same as v2.3.0.rc.1.

CFWheels Version v2.3.0-rc.1

03 May 12:51

Choose a tag to compare

Pre-release

View Enhancements

  • Adds association error support via includeAssociations argument #1080 - [Nikolaj Frey]

Bug Fixes

  • onerror handler should increase user defined requestTimeout value #1056 - [Adam Chapman]
  • deletedAt should also respect timestamp mode (UTC) #1063 - [David Belanger]
  • Fixes No output from Debug() usage in plugin test cases #1061 - [Tom King]
  • Development mode will now properly return a 404 status if view not found #1067 - [Adam Cameron, Tom King]
  • 404 status now properly returned without URL rewriting #1067 - [Adam Cameron, Tom King]
  • Internal Docs in ACF2018 should now not display duplicate categories [Tom King]
  • Internal Docs search now resets itself properly on backspace with empty value #982 - [Brandon Shea, Tom King]
  • ValidatesConfirmationOf() now correctly enforces prescence of confirmation property #1070 - [Adam Cameron, Tom King]
  • resource()/resources() now allows empty only property to utilise as non-route parent #1083 - [Brian Ramsey]
  • Handle XSS Injection in development enviroment - [Michael Diederich]
  • Fix params bug in CLI API [#1106] - [Peter Amiri]

Miscellaneous

  • Update Docker Lucee Commandbox version to 5.2.0 - [Adam Chapman, Tom King]
  • Minor internal obselete reference to modelComponentPath removed - [Adam Chapman, Tom King]
  • Minor visual fix for long migration logs overflow in modal (scroll) - [Brian Ramsey]
  • Add test suite for Lucee and H2 Database to the GitHub Actions test suite. - [Peter Amiri]
  • On going changes to update the H2 drivers [#1107] - [Peter Amiri]
  • Fixes some syntax formating introduced by cfformat [#1111] - [Adam Chapman]
  • Minimum ColdFusion version is now ColdFusion (2018 release) Update 3 (2018,0,03,314033) / ColdFusion (2016 release) Update 10 (2016,0,10,314028) / ColdFusion 11 Update 18 (11,0,18,314030) #923 - [Michael Diederich]
  • Wheels save(allowExplicitTimestamps=true) doesn't produce the expected result [#1113] - [SebastienFCT]

Potentially Breaking Changes

  • Automatic Time Stamps: the deletedAt column was using the server's local time for the timestamp while createdAt / updatedAt were using the timestamp selected for the timestamp mode. The default for CFWheels' timestamp mode is UTC and therefore all future deletedAt timestamps will be in UTC unless you've changed the default. Please review any SQL that uses deletedAt for datetime comparison.

CFWheels Version 2.2.0

22 Nov 10:03

Choose a tag to compare

Controller Enhancements

  • Added the status argument to all render*() functions to force returning a specific HTTP status code #1025 - [Adam Chapman, Tom King]
  • CORS accessControlAllowOrigin can now match subdomain wildcards #1031 - [Tom King]

Model Enhancements

  • Experimental adapter for Oracle database - [Andrei B]
  • Added automaticValidations argument to the property method - [Per Djurner]
  • Support named second argument in findOneBy[Property]And[Property] and findAllBy[Property]And[Property] - [Per Djurner]
  • Support value argument in findOrCreateBy[Property] - [Per Djurner]
  • Minor fix for full null support - [Michael Diederich]

View Enhancements

  • Added the required argument to imageTag to suppress exceptions if using non-existent files #979 - [Adam Chapman, Michael Diederich]

Bug Fixes

  • Removed authenticity token id attribute to avoid non-unique id warnings in Chrome #953 - [Per Djurner]
  • Fixes regular expression bug when using the SQL IN operator #944 - [Adam Chapman, Per Djurner]
  • Display content in maintenance mode on newer Lucee versions #848 - [Per Djurner]
  • validatesUniquenessOf does not respect allowBlank #914 - [Adam Chapman]
  • Wheels.RouteNotFound Error page now escapes the arguments.path to prevent XSS attacks - [Michael Diederich]
  • buttonTo() now uses <button> internally instead of <input> allowing for html in content - #798 - [Tom Sucaet, Tom King, Per Djurner]
  • Minor SQL preview fix in GUI - #992 - [Brandon Shea, Tom King]

Miscellaneous

  • Added the refresh url parameter for auto refreshing test framework html - #986 - [Adam Chapman]
  • Allow custom migrator templates by scanning the /migrator/templates directory - [Adam Chapman]
  • Minimum Lucee 5 version is now 5.3.2.77 - Tests added - [Michael Diederich]
  • Use http_x_forwarded_proto to determine if the application is running behind a loadbalancer that is performing SSL offloading - [Peter Amiri]
  • Allow the combination of url and params arguments with redirectTo - [Adam Chapman]
  • Fixed some variable scoping - [Michael Diederich]
  • Github Actions CI Pipeline - [Adam Chapman, Tom King]
  • Flash Cookie can now be disabled via set(flashStorage="none") #978 [Tom King]
  • processRequest() accepts a route param -#1030 - [Adam Chapman]
  • Migration files are written with 664 mode -#1034 - [Adam Chapman]

CFWheels Version 2.1.0

12 Apr 09:21

Choose a tag to compare

Bug Fixes

  • Fixed pagination order ambiguous column name exception - #980 [Adam Chapman, Mike Lange]
  • Renames findLast() to findLastOne() for [email protected]+92 upwards compatibility #988

CFWheels Version 2.1.0 Beta

24 Feb 13:30

Choose a tag to compare

Pre-release

Potentially breaking changes

(Or, just things to look out for...)

  • The new CFWheels internal GUI is more isolated and runs in it's own component: previously this was extending the developers main Controller.cfc which caused multiple issues. The migrator, test runner and routing GUIs have therefore all been re-written.
  • The plugins system behaviour no longer chains multiple functions of the same name as this was a major performance hit. It's recommended that plugin authors check their plugins to run on 2.1
  • HTTP Verb/Method switching is now no longer allowed via GET requests and must be performed via POST (i.e via _method)

Model Enhancements

  • Migrator now automatically manages the timestamp columns on addRecord() and updateRecord() calls - #852 [Charley Contreras]
  • Migrator correctly honors CFWheels Timestamp configuration settings (setUpdatedAtOnCreate, softDeleteProperty, timeStampMode, timeStampOnCreateProperty, timeStampOnUpdateProperty) - #852 [Charley Contreras]
  • MSSQL now uses NVARCHAR(max) instead of TEXT #896 [Reuben Brown]
  • Allow createdAt and updatedAt to be explicitly assigned using the allowExplicitTimestamps=true argument - #887 - [Adam Chapman]

Controller Enhancements

  • New set(flashAppend=true) option allows for appending of a Flash key instead of replacing - #855 - [Tom King]
  • flashMessages() now checks for an array of strings or just a string and outputs appropriately - #855 - [Tom King]
  • flashInsert() can now accept a one dimensional array - #855 - [Tom King]

Bug Fixes

  • Allow uppercase table names containing reserved substrings like OR and AND - #765 [Dmitry Yakhnov, Adam Chapman]
  • Calculated properties can now override an existing property - #764 [Adam Chapman, Andy Bellenie]
  • Filters are now correctly called if there is more than one after filter - #853 [Brandon Shea, Tom King, Adam Chapman]
  • Minor fix for duplicate debug output in the test suite - #176 [Adam Chapman, Tom King]
  • Convert handle to a valid variable name so it doesn't break when using dot notation - #846 [Per Djurner]
  • The validatesUniquenessOf() check now handles cases when duplicates already exist - #480 [Randall Meeker, Per Djurner]
  • validatesConfirmationOf() now has a caseSensitive argument to optionally perform a case sensitive comparison - #918 [Tom King]
  • sendFile() no longer expands an already expanded directory on ACF2016 - #873 [David Paul Belanger, Tom King, strubenstein]
  • Automatic database migrations onApplicationStart now correctly reference appropriate Application scope - #870 [Tom King]
  • usesLayout() now can be called more than once and properly respects the order called - #891 [David Paul Belanger]
  • Migrator MSSQL adapter now respects Time and Timestamp Column Types - #906 [Reuben Brown]
  • Automatic migrations fail on application start - #913 [Adam Chapman]
  • Default cacheFileChecking to true in development mode - [Adam Chapman, Steve Harvey]
  • Migrator columnNames list values are now trimmed - #919 [Adam Chapman]
  • Fixes bug when httpRequestData content is a JSON array - #926 [Adam Chapman]
  • When httpRequestData content is a JSON array, contents are now automatically added to params._json - #939 [Tom King]
  • Fixes bug where Migrator $execute() always appends semi-colon - #924 [Adam Chapman]
  • Fixes bug where model createdAt property is changed upon update - #927 [Brandon Shea, Adam Chapman]
  • Fixed silent application.wheels scope exception hampering autoMigrateDatabase - #957 [Adam Chapman, Tom King]

Miscellaneous

  • Added the ability to pass &lock=false in the URL for when reload requests won't work due to locking - [Per Djurner]
  • Basic 302 redirects now available in mapper via redirect argument for GET/PUT/PATCH/POST/DELETE - #847 - [Tom King]
  • .[format] based routes can now be turned off in resources() and resource() via mapFormat=false - #899 - [Tom King]
  • mapFormat can now be set as a default in mapper() for all child resources() and resource() calls - #899 - [Tom King]
  • HEAD requests are now aliased to GET requests #860 - [Tom King]
  • Added the includeFilters argument to the processRequest function for skipping execution of filters during controller unit tests - [Adam Chapman]
  • Added the useIndex argument to finders for adding table index hints #864 - [Adam Chapman]
  • HTTP Verb/Method switching is now no longer allowed via GET requests and must be performed via POST #886 - [Tom King]
  • CORS Header Access-Control-Allow-Origin can now be set either via a simple value or list in accessControlAllowOrigin() #888 [Tom King]
  • CORS Header Access-Control-Allow-Methods can now be set via accessControlAllowMethods(value) #888 [Tom King]
  • CORS Header Access-Control-Allow-Credentials can now be turned on via accessControlAllowCredentials(true); #888 [Tom King]
  • accessControlAllowMethodsByRoute() now allows for automatic matching of available methods for a route and sets CORS Header Access-Control-Allow-Methods appropriately #888 [Tom King]
  • CORS Header can now be set via accessControlAllowHeaders(value) #888 [Tom King]
  • Performance Improvement: Scanning of Models and Controllers #917 [Adam Chapman]
  • Added the authenticityToken() function for returning the raw CSRF authenticity token #925 [Adam Chapman]
  • Adds enablePublicComponent, enableMigratorComponent,enablePluginsComponent enviroment settings to completely disable those features #926 [Tom King]
  • New CFWheels Internal GUI #931 [Tom King]
  • pluginRunner() now removed in favour of 1.x plugin behaviour for performance purposes #916 [Core Team]
  • Adds validateTestPackageMetaData environment setting for skipping test package validation on large test suites #950 [Adam Chapman]
  • Added aliases for migrator.TableDefinition functions to allow singular variant of the columnNames property #922 [Sébastien FOCK CHOW THO]
  • onAbort is now supported via events/onabort.cfm #962 [Brian Ramsey]