June release - 2021
This is the first release after the major release of v5. So, this is special as it contains a handful of bug fixes and some improvements that didn't make it to the main release last month.
As always, let's start with the highlights of the release.
Here's the summary of all the completed tasks and their related commits/PRs.
Upgrading to the latest versions
The following packages have been updated during the current release.
- Updated
@adonisjs/assembler
from version5.1.1 -> 5.3.1
- Updated
@adonisjs/ally
from version3.2.1 -> 4.0.2
- Updated
@adonisjs/lucid
from version14.0.0 -> 15.0.1
- Updated
@adonisjs/mail
from version7.1.1 -> 7.2.1
- Updated
@adonisjs/core
from version5.1.6 -> 5.1.8
You can upgrade to the latest versions of all the packages using the npm update
command or manually installing packages with the @latest
tag.
npm i @adonisjs/assembler@latest
npm i @adonisjs/ally@latest
npm i @adonisjs/lucid@latest
npm i @adonisjs/mail@latest
npm i @adonisjs/core@latest
Async local storage and HTTP Context
This is a big one, contributed by @targos . We are using ALS (async local storage) within the HTTP requests to make the HTTP context available anywhere inside your codebase.
For example, with ALS enabled, you can write the following code.
import HttpContext from '@ioc:Adonis/Core/HttpContext'
class User extends BaseModel {
public static query() {
const ctx = HttpContext.get()!
return super.query(ctx.tenant.connection)
}
}
ALS is a complicated topic, as you first have to understand how the Node.js event loop works and its impact on how we write and structure our code.
We recommend first reading about async hooks and async local storage in general and then head over to AdonisJS ALS guide to learn about the usage within the framework.
Facebook, Linkedin, and Discord social auth drivers
Along with the existing set of Ally drivers. We now also have the following drivers available.
- Discord driver is contributed by
Mesteery
PR#120 - Facebook driver is contributed by
irwing-reza
PR#121
Check out this boilerplate repo to create your custom ally drivers. We will appreciate it if you can publish it as a package on npm and share it with the rest of the community.
Support for calendar events in the mailer
The mailer now allows sending calendar invites by either attaching an existing invite (.ics file) or creating one on the fly using the calendar's fluent API. For example:
Mail.sendLater((message) => {
message.icalEvent((calendar) => {
calendar
.createEvent({
summary: 'Adding support for ALS',
start: DateTime.local().plus({ minutes: 30 }),
end: DateTime.local().plus({ minutes: 60 }),
})
})
})
The docs have been updated to cover the calendar invites API.
Events error handler
The error handling with events so far was not that good. To capture errors that occurred during the emit lifecycle of an event, you will have to wrap your Event.emit
calls inside a try/catch
statement.
After this release, you can register a custom onError
handler
to listen for errors occurred during the emit life cycle an event.
import Event from '@ioc:Adonis/Core/Event'
Event.onError((event, error, eventData) => {
// handle the error
})
Run migrations programmatically
The latest release of @adonisjs/lucid
allows running migrations programmatically using the Migrator
module. For example:
import Route from '@ioc:Adonis/Core/Route'
import Migrator from '@ioc:Adonis/Lucid/Migrator'
import Database from '@ioc:Adonis/Lucid/Database'
import Application from '@ioc:Adonis/Core/Application'
Route.get('/', async () => {
const migrator = new Migrator(Database, Application, {
direction: 'up',
dryRun: true,
})
await migrator.run()
return migrator.migratedFiles
})
Read the migration docs to learn more about the API.
Breaking changes
We have two very minor breaking changes in this release inside the @adonisjs/lucid
and @adonisjs/ally
packages.
Lucid
We have renamed the following TypeScript ambient modules. This change will ideally not impact your applications, as these modules only contains the static types and were not commonly used.
- Changed
@ioc:Adonis/Lucid/Model
to@ioc:Adonis/Lucid/Orm
- Changed
@ioc:Adonis/Lucid/Relations
to@ioc:Adonis/Lucid/Orm
- Changed
@ioc:Adonis/Lucid/DatabaseQueryBuilder
to@ioc:Adonis/Lucid/Database
Ally
As we are adding new drivers to the codebase, the possibility of not able to get a user's email address is increasing. Hence, we have to update the email property in the AllyUserContract
type to be null | string
.
After this change, you will have to guard against missing emails as follows.
const facebookUser = await ally.use('facebook').user()
if (!facebookUser.email) {
// handle the use case for missing email
}
Features & small improvements
- feat: add nl2br helper 42ba955af
- feat: add stringify global helper fd0cd1ae5
- improvement: do not report SQL errors to validator 5480de78d
- feat: add support to serializing props by giving preference to user input ef4668fe4
- feat: add withScopes method 039defb13 , 65ab31ec8
- feat: add support for query isolation b808f03b7
- improvement: detect port for the encore dev server when default one cb877cf6e .
- improvement: cleanup build directory when there is an error during the build process e88001fac
- improvement: pass debug flag and custom reporter data to cloned queries 091dea1bb
- feat: expose default naming strategy from Orm binding b69305497
- improvement: improve database config options 398b24a87
- feat: add helpers shortcut to repl context e43695bcf
- feat: add support for serializing models directly from paginator 6b67cad88
Bug fixes
- fix:
request.completeUrl
should include the port alongwith the hostname 068c63aa3 - fix: allow runtime variables in aliases dynamic imports 4355e448d
- fix: do not attempt to serialize relationship values set as
null
85e440783 - fix: apply relationship constraints during
paginate
andfirst
methods 7fd7ea417 - fix: use correct query for health checks for oracledb 48dc522ab
- fix(httpexceptionhandler): add missing await to view.render method call 34e613323
- fix: broken extend logic for ally manager 1a722f8e4
- fix webpack dev server not being killed by
CTRL + C
on windows 232f1ad51