Skip to content

Documentation · ARDOR

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-infra is 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 in packages/kernel, packages/react or packages/admin, never in aether/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 and DIContainer, 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.

PackageRoleDepends on
@venizia/ardor-kernelIsomorphic 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-reactThe 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-adminThe 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/ardorUmbrella. 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-infraARDOR
src/common/{constants,keys}.ts@venizia/ardor-kernel
src/common/types.tssplit: 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.tsRemoved - 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.

BeforeAfter
AbstractRaApplicationAbstractArdorApplication
BaseRaApplicationBaseArdorApplication
CoreRaApplicationArdorApplication
ICoreRaApplicationIArdorApplication

Three removals and one requirement:

  • DIContainer is gone. It was a second, weaker container beside the IGNIS one. Use the inversion Container the application already is.

  • BaseApiService is gone. Extend BaseService and declare a resource field if the @api() log line should name one; @api() works on any BaseService. For calls to one REST resource, reads and writes, prefer an HttpRepository from @venizia/ardor/repository. The old BaseCrudApiService.find() merged limit: 100 into 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. Pass filter: { limit } where it matters.

  • Module augmentation targets the umbrella. @venizia/ardor re-exports the two override interfaces with export *, and TypeScript follows that chain to the declaring package, so one block on the umbrella merges into both:

    typescript
    declare module '@venizia/ardor' {
      interface IUseInjectableKeysOverrides extends Record<keyof ReturnType<Application['bindingList']>, unknown> {}
      interface IUseTranslateKeysOverrides extends ITranslateKeys {}
    }

    Do not retarget the block to @venizia/ardor-react or @venizia/ardor-admin unless the application depends on that package itself: under a linker that does not hoist (Bun's isolated linker, pnpm) it fails with TS2664 and the keys are missing.

  • @venizia/ignis-inversion must satisfy the peer range in the ARDOR package.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 through this.logger, an IGNIS ILogger, and a debug line goes to console.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.

  1. The dependency. Swap @minimaltech/ra-core-infra for @venizia/ardor in every package.json, and set @venizia/ignis-inversion to the peer range in the ARDOR package.json (a Bun catalog entry, or each manifest).
  2. The import specifier. @minimaltech/ra-core-infra -> @venizia/ardor in every import and export ... from. Nothing else about the import changes: the umbrella re-exports all three layers under the same names.
  3. The four renames from the table above.
  4. The declare module blocks. Retarget each one to @venizia/ardor; one block can hold both override interfaces. Probe it once: a // @ts-expect-error above 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:

bash
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.