What changed in ARDOR, who is affected and what to do about it.
A null key makes useStoredState keep its value in memory, like useState, so a component can store state only when a user id or a flag is known.
The listener of BrowserStorage.subscribe gets { isExternal }, false after a write through BrowserStorage in this tab and true when another tab changed the key.
ArdorApplication no longer needs a Redux store; without one it mounts no Redux provider.
The app preset keeps only the react group in codeSplitting, because its catch-all vendor group put the libraries of lazy routes into the first screen.
useIntersection takes a list of targets and returns one entry for each, takes a root element, and takes a list of thresholds, so a scroll-spy needs no own observer.
FakeIntersectionObserver, FakeMatchMedia, FakeStorage and FakeClipboard join FakeResizeObserver, which now shows its observers; all in @venizia/ardor/testing.
When the session ends, by any route, the auth provider removes the keys under @app/store/ and the application empties the query cache.
getOne, update and delete percent-encode the id, so an id with a slash, a question mark or a hash reaches the server whole; doRequest refuses dot segments.
The app preset sends Content-Security-Policy-Report-Only, hides the nginx version, refuses more secret-looking VITE_ values and checks NGINX_LOCAL_RESOLVERS.
ardor codemod namespace skips a tracked symlink, so --write cannot change a file outside the project that the link points to.
ardor codemod namespace --write stages every file, names a file it cannot rewrite and writes nothing then, and needs --allow-dirty outside a git repository.
The roles ARDOR keeps in the browser, and the permission provider, are not an access check; the docs and the TSDoc now say the backend must check every permission.
IApplicationInfo.id scopes the session keys and the store prefix in browser storage; without it nothing changes, so a single application per origin needs no migration.
paths.afterLogin accepts false so login resolves with redirectTo false; ApplicationProviders.resolve takes isAuthRequired to type the auth provider as present.
A table of every change since 0.4.7 linked to its entry, the IGNIS peer versions, and the ordered checklist an application follows to move to ARDOR 0.4.8.
ISendResponse was a second name for INetworkResponse, and IListFilter.offset an alias of skip; both are removed, and the codemod renames or lists them.
useUntypedTranslate takes a plain string key, so a server error code or a data label needs no cast, while useTranslate keeps its compile-time key check.
useStoredState writeDelayMs updates the UI at once and writes localStorage once after the delay, for a value that changes many times a second.
setValue(updater) of useStoredState runs against the value at the call, so two updaters in one tick both apply; the reference covers sign-out.
StorageCodecs.text() stores a string as it is, with an optional list of allowed values; useStoredState and BrowserStorage take it as a codec.
useResizeEffect observes several elements, and with children their direct children, and calls onResize once per animation frame or before paint.
useSizer measured the element with a given id; useElementSize measures an element or a ref with more options, so useSizer is removed with no alias.
useIntersection returns the latest IntersectionObserverEntry of an element, so lazy content or a load-more sentinel needs no own observer.
Six lodash calls are replaced by destructuring, an existing check and two small helpers, about 10 KB less in an app bundle.
With authRecovery.refreshTokenPath set, the default refreshToken posts to it and saves the new token, so a 401 recovers with no subclass.
useCopyToClipboard returns { copy, isCopied }, and resetMs sets isCopied back to false after a delay, so a "Copied" button needs no state or timer of its own.
BrowserClipboard.writeText and readText answer false or undefined on every refusal; useCopyToClipboard calls it and no longer throws on a server.
BrowserStorage.keys lists the keys of a storage area and removeWhere removes those with a prefix, without throwing.
Three SSR-safe hooks over useSyncExternalStore for a media query, tab visibility and online status, with no hand-written subscribe.
The hook that returns the application's container is renamed to say what it returns; there is no alias, and the upgrade is a find and replace.
encode returns a FormData, a URLSearchParams or the body you passed, and readFilename returns the name in a Content-Disposition header.
DefaultAuthService.subscribe tells the provider about every saved or cleared session, so onSessionStarted fires for a refresh by the network service, and unauthenticatedRejection sets what checkAuth and a 401 reject with.
onSessionStarted and onSessionCleared tell a subclass when the session starts, changes its token or ends, so a socket or a per-user cache stays in step without overriding checkAuth.
useElementSize stays at 0 by 0 and observes nothing on a host without ResizeObserver, instead of throwing in its effect.
useElementSize returns a callback ref when you pass none, takes round, returns measured, and @venizia/ardor/testing has FakeResizeObserver for hosts whose ResizeObserver does nothing.
BrowserStorage reads and writes localStorage and sessionStorage without throwing, useStoredState keeps a value in step across hooks and tabs, and useElementSize measures a ref.
A table of every change since 0.4.6 linked to its entry, the peer versions, and the ordered checklist an application follows to move to ARDOR 0.4.7.
DefaultAuthService.cleanUp no longer removes keys under @app/oauth2/, and LocalStorageKeys.PREFIX_OAUTH2 is removed.
An entry of i18nSources can be a loader such as () => import('./vi'), called the first time its locale is used; a loader that fails leaves the locale on English.
Utilities and helpers are now on classes, Ardor holds all hooks, the logger comes from IGNIS, and a tool updates your code.
A table of every change since 0.4.4 linked to its entry, and the checklist an application follows to move to ARDOR 0.4.5.
useDocumentTitle gains an optional fallback flag; a fallback call shows its title only while no other call is mounted.
The new entry @venizia/ardor/testing exports assertArdorApplicationBoots, which proves an application boots in a unit test, with no browser and no network.
ArdorApplication has a new optional features prop, the list of features to mount, so a shell can mount a filtered list.
A table of every change since 0.4.3 grouped by kind and linked to its entry, and the checklist an application follows to move to ARDOR 0.4.4.
The preset turns on output.strictExecutionOrder so chunks keep import order, and @venizia/ardor/vite adds buildInfoFile for an About page.
The repository sub-path re-exports the HTTP module of IGNIS, so HttpReadShapes and THttpReadShape from IGNIS 0.4.3 are importable from ARDOR.
A table of every change since 0.4.1 linked to its entry, and the checklist an application follows to move to ARDOR 0.4.3.
Passing required to getRuntimeConfig makes it return a string and throw, naming the key, when no value is set; the error carries a code and the key.
The preset image gzips text, answers /health, sends three security headers on every response, and writes the /api proxy only when API_UPSTREAM is set.
DefaultNetworkRequestService stays the class you extend, its request types are closed, and the fetcher and socket client now come from IGNIS.
A series of fixes in the data providers, the network service, the auth service and the React hooks where the code did not do what its documentation said.
The four ARDOR packages move to 0.4.1 and peer on IGNIS 0.4.1; the node fetcher no longer logs the Authorization header or the sign-in password.
NodeFetcher stops logging request headers and bodies, keeps your abort signal with a timeout, sends bodies as they are, and joins params to a url with a query.
The four ARDOR packages move to 0.4.0 and peer on IGNIS 0.4.0; the app preset gets required runtime variables and no formatter config.
The app preset writes config.js from VITE_ variables at container start, getRuntimeConfig reads it, and APP_REQUIRED_ENV stops a container early.
vulcan add --preset ardor --lib <name> adds an ARDOR feature package to a monorepo, with a sample feature and a test that mounts it.
Create a monorepo with an ARDOR admin, or add an admin to an existing monorepo, with the ARDOR preset for VULCAN 0.3.0 or newer.
The four ARDOR packages are published at 0.3.0 on the latest tag, on IGNIS 0.3.0. ARDOR and IGNIS now share a minor version.
The generated admin and the examples use one set of script names (server:dev, compile, typecheck, lint, test, clean). The names dev and build are gone.
toDataUrl builds its promise with new Promise, so it runs on a Chrome older than 119.
Augment IUseInjectableKeysOverrides and IUseTranslateKeysOverrides on @venizia/ardor; a block on -react or -admin fails under a non-hoisting linker.
TPaths no longer names the members of a Date, RegExp, Set, Map, Promise, function or any field as paths, so createdAt.getTime is not a state path.
The IGNIS peers of the four packages are the stable ^0.2.2 range instead of 0.2.2-N prerelease floors. ARDOR 0.1.4 is the first stable line on them.
DefaultAuthProvider.login saves the roles of the sign-in response where getRoles reads them. The four sign-in options of 0.1.4-4 become protected hooks.
ra-i18n-polyglot is a peer of ardor-admin and ardor, so an application needs no resolve.dedupe list.
Kernel utilities take one options object, React hooks take opts with an enabled flag, and features are defined through Features.
Callbacks, flags and setters on the network service, providers and fetchers become protected hooks; an old-to-new table lists every renamed name.
A Vite application registers its decorated classes with IgnisArtifactsVitePlugin and AutoArtifacts instead of listing them; the IGNIS peer floors move.
ardor, ardor-admin and ardor-react name the other ARDOR packages at the exact version released with them, so a fresh install cannot pull a newer sibling.
DefaultAuthProvider signs in the way IGNIS's auth controller expects, and ArdorApplication runs with no auth provider; the old path and body stay expressible.
An artifact index that lists undefined or a non-class, as a module cycle leaves behind, makes start() throw an error that names the position and the cause.
Four fixes: upper-case fetcher methods, one console method per log level, getManyReference without pagination, no NaN count.
artifacts() takes the index ignis-artifacts generate emits, so a bundler keeps every stereotyped class and start() fails on a class that was never discovered.
DefaultAuthProvider reads the bound permission provider from the container itself, so a subclass with its own constructor gets canAccess without forwarding it.
A failed request through the REST data providers rejects with an ApplicationError, and a malformed Content-Range falls back to the row count.
DefaultAuthProvider.checkError falls back to statusCode, so an ApplicationError thrown by the data provider now reaches its 401 and 403 branches.
Two admin hooks - one sets the browser tab title per screen and restores it on unmount, the other keeps the html lang attribute on the UI locale.
TConstValue, TStringConstValue, TNumberConstValue and TStatusFromClass keep their literals when copied into an object literal or a let.
ARDOR adopts IGNIS list extras - getList asks with meta.extra and answers meta.extra, and reads a route's default extras unasked.
An application mounts feature packages - resources, routes, bindings, messages - from features(), and answers react-admin's canAccess from its own provider.
A pinned datasource resolves in a minified build, and start() refuses two classes that derive one binding key. The IGNIS peer floors rise with it.
getDataSourceAuth() fills IGNIS 0.2.1-4's per-send hooks - session headers, timezone, channel, no token on no-auth paths, the server's error code.
HttpRepository writes on IGNIS 0.2.1, shares the data provider's token and one 401 refresh, and replaces BaseCrudService. Providers bind as singletons.
Declare an HttpRepository with @repository({ type: RepositoryTypes.REMOTE }), point a datasource at '/api', and raise the IGNIS peers together.
Register artifacts by stereotype or by hand as in IGNIS, resolve repositories by class, BaseApiService removed, packages load under Node ESM.
Classes register by stereotype, HTTP repositories come from IGNIS, bulk writes send their selector in the body, and requests work on plain-http origins.
ARDOR drops its axios transport and moves the socket client behind a sub-path, so importing the framework pulls no HTTP client and no optional peer.
One logger per scope, singleton services, an application that binds itself, and per-call headers and form-encoded bodies honoured.
The frontend framework splits into four ARDOR packages behind an umbrella import, with four symbol renames and updated dependency requirements.