Migrating from @minimaltech/ra-core-infra to ARDOR
@minimaltech/ra-core-infra became ARDOR. The code is the same code; it was split along its real dependency seams and rebranded. Everything a consumer imported is still importable from one specifier, so the migration is four mechanical edits, not a redesign.
@minimaltech/ra-core-infrais frozen at 0.0.3-18. No further release will be cut from it. ARDOR is the only home for this code - a fix belongs inpackages/kernel,packages/reactorpackages/admin, never inaether/packages/ra-core-infra. Export parity was verified against that final state: 146 exported symbols, all present in ARDOR under the same names except the four renames below andDIContainer, which was dropped.
What ARDOR is
ARDOR is the frontend member of the VENIZIA family. IGNIS is the backend framework; ARDOR is a consumer of IGNIS - it builds a frontend application on @venizia/ignis-inversion for inversion of control and @venizia/ignis-filter for the query vocabulary the data layer speaks.
| Package | Role | Depends on |
|---|---|---|
@venizia/ardor-kernel | Isomorphic core: application base, service base, request and auth constants, binding keys, network helpers. No React, no react-admin. | The IGNIS packages in its peer list |
@venizia/ardor-react | The application context, the hooks that read it (useInjectable, useApplicationContext), the typed Redux hook factories, and the UI hooks (useDebounce, useAutosave, useConfirm, ...). No react-admin. | kernel, React, the IGNIS packages in its peer list |
@venizia/ardor-admin | The react-admin adapter: REST data provider, auth provider, i18n provider, the ArdorApplication root component, useTranslate, useNotifyError, and the English and Vietnamese message bundles. | kernel, react, ra-core |
@venizia/ardor | Umbrella. Re-exports all three, so an application needs one dependency and one import specifier. | the three above |
Install @venizia/ardor unless a package genuinely needs only one layer.
Where the old code went
ra-core-infra | ARDOR |
|---|---|
src/common/{constants,keys}.ts | @venizia/ardor-kernel |
src/common/types.ts | split: the pure types to ardor-kernel, the ra-core provider contracts (IDataProvider, IAuthProvider, II18nProviderOptions) to ardor-admin |
src/common/locales/{en,vi}.ts | @venizia/ardor-admin |
src/helpers/** (networks) | @venizia/ardor-kernel; the logger, fetchers and socket client moved to IGNIS helpers or were removed |
src/utilities/** | @venizia/ardor-kernel |
src/base/applications, src/base/services, src/base/decorators | @venizia/ardor-kernel |
src/base/services/base-crud.service.ts | Removed - use an HttpRepository from @venizia/ardor/repository |
src/base/providers/base.provider.ts | @venizia/ardor-kernel |
src/base/providers/{default-rest-data,count-rest-data,default-auth,default-i18n} | @venizia/ardor-admin |
src/ui/{context,hooks} (framework-agnostic hooks) | @venizia/ardor-react |
src/ui/hooks/{use-translate,use-notify-error,use-refresh-token,use-request-header-locale} | @venizia/ardor-admin - each one calls a ra-core hook |
src/ui/components/CoreRaApplication.tsx | @venizia/ardor-admin as ArdorApplication |
File names follow the family convention - named by role, never repeating the folder - so providers/default-rest-data.provider.ts is now providers/rest-data.ts. This is invisible to consumers, which import from the barrel.
Breaking changes
As of ra-core-infra 0.0.3-18 there are exactly four renames. Every other exported symbol keeps its name. Later ARDOR releases removed and moved names too: after the move, run ardor codemod namespace and read Upgrading ARDOR.
| Before | After |
|---|---|
AbstractRaApplication | AbstractArdorApplication |
BaseRaApplication | BaseArdorApplication |
CoreRaApplication | ArdorApplication |
ICoreRaApplication | IArdorApplication |
Three removals and one requirement:
DIContaineris gone. It was a second, weaker container beside the IGNIS one. Use the inversionContainerthe application already is.BaseApiServiceis gone. ExtendBaseServiceand declare aresourcefield if the@api()log line should name one;@api()works on anyBaseService. For calls to one REST resource, reads and writes, prefer anHttpRepositoryfrom@venizia/ardor/repository. The oldBaseCrudApiService.find()mergedlimit: 100into every filter that had none;HttpRepository.find()sends the filter as given, so a call site that relied on that default gets the server's own page size. Passfilter: { limit }where it matters.Module augmentation targets the umbrella.
@venizia/ardorre-exports the two override interfaces withexport *, and TypeScript follows that chain to the declaring package, so one block on the umbrella merges into both:typescriptdeclare module '@venizia/ardor' { interface IUseInjectableKeysOverrides extends Record<keyof ReturnType<Application['bindingList']>, unknown> {} interface IUseTranslateKeysOverrides extends ITranslateKeys {} }Do not retarget the block to
@venizia/ardor-reactor@venizia/ardor-adminunless the application depends on that package itself: under a linker that does not hoist (Bun'sisolatedlinker, pnpm) it fails with TS2664 and the keys are missing.@venizia/ignis-inversionmust satisfy the peer range in the ARDORpackage.json. ARDOR resolves a binding from a class through the metadata registry (useInjectable({ target })), which the 0.1 line does not expose.
One logger change worth knowing about, because it changes the call:
- The per-instance debug toggle is gone, and so is the kernel
Logger: a service logs throughthis.logger, an IGNISILogger, and a debug line goes toconsole.debug(see the 2026-11-01 changelog).
Migrating a consumer, by hand
Work through these four edits per repository, in this order, then let the type checker close the gap. They are mechanical, but the last one is the reason this is a reviewed pass rather than a search-and-replace.
- The dependency. Swap
@minimaltech/ra-core-infrafor@venizia/ardorin everypackage.json, and set@venizia/ignis-inversionto the peer range in the ARDORpackage.json(a Bun catalog entry, or each manifest). - The import specifier.
@minimaltech/ra-core-infra->@venizia/ardorin everyimportandexport ... from. Nothing else about the import changes: the umbrella re-exports all three layers under the same names. - The four renames from the table above.
- The
declare moduleblocks. Retarget each one to@venizia/ardor; one block can hold both override interfaces. Probe it once: a// @ts-expect-errorabove a key you did not declare must be a real error (see Module augmentation).
Grep for DIContainer before you start - it was dropped, and every use becomes the inversion Container the application already is.
Then install and type-check per application. The type checker is what catches what a manual pass misses. If the consumer ships its own Vietnamese message bundle, note that ra-core 5.15.3 requires ra.validation.unique; ARDOR's bundled vietnameseMessages now provides it.
Retiring the old package
Once every consumer is on ARDOR, close the old package out so nobody installs it by accident:
npm deprecate '@minimaltech/ra-core-infra' 'Moved to @venizia/ardor - see https://github.com/VENIZIA-AI/ardor/blob/develop/docs/migration/ra-core-infra.md'This guide can be deleted once every consumer is across - it exists only to carry them, and nothing in ARDOR depends on it.