Changelog - 2026-11-02
Everything since ARDOR 0.4.6 in one place, with an upgrade checklist
Breaking Change New Feature Enhancement Bug FixIn one line. ARDOR 0.4.7 removes the old bare names and the kernel logger, so an application on 0.4.6 does not compile until it runs the codemod. It also moves the IGNIS peers to the IGNIS 0.4.7 release, adds the Ardor namespace and adds lazy i18n sources.
bun add @venizia/ardorWhat changed
Each change has its own entry in the changelog list, newest first.
Four size budgets are raised, and all are repository gates, not something an application does: the @venizia/ardor entry from 350 B to 700 B (the Ardor namespace), @venizia/ardor-admin from 10 KB to 10.65 KB (lazy sources, the session hooks and the token change hook), @venizia/ardor-react to 2.55 KB and the @venizia/ardor/testing entry from 900 B to 1.1 KB (useElementSize and FakeResizeObserver).
| Package | ARDOR 0.4.6 | ARDOR 0.4.7 |
|---|---|---|
@venizia/ardor | 0.4.6 | 0.4.7 |
@venizia/ardor-kernel | 0.4.6 | 0.4.7 |
@venizia/ardor-react, @venizia/ardor-admin | 0.4.6 | 0.4.7 |
| Peer | 0.4.6 | 0.4.7 |
|---|---|---|
@venizia/ignis-helpers, -kernel, -connectors, -boot | ^0.4.1 | ^0.4.7 |
@venizia/ignis-inversion, -filter | ^0.4.1 | ^0.4.6 |
typescript (@venizia/ardor, optional) | none | >=5.0.0 |
IGNIS 0.4.6 does not satisfy ^0.4.7, so it is not accepted for helpers, kernel, connectors and boot. It does satisfy ^0.4.6 of inversion and filter.
Who is affected
- An application on 0.4.6 that uses a removed name, the kernel
LoggerorBaseHelper, orenableDebug. It does not compile until you update. Steps 1 to 3. - A class that
implements ILogger, or code that passes a logger toAuthRecovery. Step 4. - An application that only calls
this.logger, or only uses hooks. Steps 1 and 5 only. - A project with a test that calls
assertArdorApplicationBoots. Step 6. - A project that uses
buildInfoFilein its Vite config. Step 7. - A project with a subclass of
DefaultI18nProvider. Step 8. - An app made from the preset. Step 9.
- An app that stores OAuth2 state under
@app/oauth2/. Step 10. - An app that overrides
checkAuth,logoutorsaveSessionto sync a socket or a cache with the session. Step 13. - An app with its own
localStoragehelper orResizeObserverhook. Step 14. - A guest app with no login page. Step 15.
Upgrade checklist
Move the four ARDOR packages together to
0.4.7, and every@venizia/ignis-*package to the IGNIS 0.4.7 release: helpers, kernel, connectors and boot at^0.4.7or newer, inversion and filter at^0.4.6or newer.Run the codemod. Install
typescript(>=5.0.0, an optional peer of@venizia/ardor; without it the tool exits with code 2), commit your work, then preview, write, and run your formatter:bashbun run ardor codemod namespace src bun run ardor codemod namespace src --writeAdd
--allow-dirtyafter another codemod,--hooksto move hooks toArdor.useX, and--checkin CI. The tool reads.ts,.tsx,.mtsand.ctsfiles only. See how to update your project.Fix what the codemod only lists: a name the file declares itself, re-exports by name,
Loggersubclasses andinstanceof,Logger.getInstancewithout a{ scope }object,enableDebugonArdorApplicationor on a wrapper component of your own, and the removed names that have no replacement.Check your loggers. The IGNIS
ILoggeraddsemerg,log(level, ...)andfor(methodName), so a class thatimplements ILoggerneeds those three. Theloggeroption ofAuthRecoveryis an IGNISILogger.Check debug logs. The IGNIS console logger writes
debuglines only whenDEBUGis truthy andNODE_ENVallows it. See debug logs in production and development.If a test calls
assertArdorApplicationBoots: it needs@venizia/ignis-inversion0.4.6-1or newer, and an older copy fails with a new message. Step 1 already covers it.If your Vite config uses
buildInfoFile: it no longer installs a quiet logger. WithDEBUGset, the IGNIS git lines print. Nothing else changes.If you subclass
DefaultI18nProvider: read a locale throughthis.localeSources.readNow({ locale }), noti18nProviderOptions.i18nSources[locale], which can now be a loader.Features.hasPendingMessagesandFeatures.loadMessagesalso wait for lazy application sources.If your app was made from the preset: copy two changes by hand. In
src/configurations/admin.configuration.ts, replacegetRuntimeConfig({ ... })withRuntimeConfig.get({ ... })and importRuntimeConfig. Insrc/application.test.ts, writeconst result = await restUrlOf(); expect(result)instead ofexpect(await restUrlOf()), if you use the async-style lint rules below.If your app keeps keys under
@app/oauth2/: sign-out no longer removes them, andLocalStorageKeys.PREFIX_OAUTH2is gone. Clear those keys yourself when the user signs out. See Sign-out and@app/oauth2/.Optional: the async-style lint rules.
@venizia/dev-configs0.4.7hasasyncStyleConfigs(no-inline-await,no-return-await,no-await-promise-chain,no-silent-catch) andreactAsyncStyleConfigs(no-async-hook-callback,effect-cleanup-consistency). They are off until you spread them next tohouseConfigsorreactHouseConfigsin your ESLint config. The preset does not turn them on, and ARDOR's behavior does not depend on them.Optional: lazy i18n sources. Turn a catalogue the first screen does not need into
() => import('./vi'). See Lazy i18n sources.Optional: session hooks. If you override
checkAuth,logoutorsaveSessiononly to keep a socket or a cache in step with the session, move that code intoonSessionStarted({ token, user })andonSessionCleared({ reason })of yourDefaultAuthProvidersubclass, and delete the overrides. Each hook fires once per change of the session, is awaited, and cannot break sign-in or sign-out when it throws. Do not callthis.logout()orthis.refreshToken()from a hook: the call waits behind the hook until the 10 secondsessionHookTimeout. See Session hooks.Optional: browser storage and element size. Replace your own
localStoragehelper withBrowserStorage(get,set,removeandsubscribe; a failing storage gives the fallback, never an exception) and your own hook withuseStoredState({ key, defaultValue }). Keys are used as you give them, so your existing keys keep working. Name new ones@app/store/<name>, and never write under@app/auth/:BrowserStoragerefuses it. Replace aResizeObserverhook you wrote withuseElementSize({ ref })and a stablereffromuseRef, or withuseElementSize()and therefit returns when the element mounts later.measuredtells a measured0by0from one not read yet, and a test delivers a size withFakeResizeObserverfrom@venizia/ardor/testing. See Typed browser storage and useElementSize.Optional: a guest app. If your app has no login page, override
unauthenticatedRejectionin yourDefaultAuthProvidersubclass: return{ redirectTo: false, message: false }for the reasonrejectedand{ logoutUser: false, message: false }forunauthorized.{ message: false }alone still redirects to/login. A 401 withlogoutUser: falsekeeps the stored session. The session hooks now also fire for a token your network service refreshes and for acleanUpmade outside the provider (reasonexternal). See Token hook and guest rejection.