Skip to content

Snapshot for @system-core/core 0.14.x. Current docs live at /.

Changelog / Migration Guide

0.11.0

This release moves admin UI authorship out of plugin packages and into the UI layer. Plugins now declare typed capability schemas; the UI generates pages automatically. It also introduces a namespaced i18n system with plugin-seeded UI strings.

0.11.0 Highlights

  • Admin Vue pages removed from all plugin packages — capability metadata drives UI generation
  • i18n namespace system: content, ui, ui:plugin-<id> namespaces
  • Plugin seedTranslations — per-locale JSON files seeded idempotently on install
  • TranslationStore adds bulkUpsertTranslations() and getUiStrings()
  • Expanded AppCapability: policies, tenancy, publicConfig surfaces
  • API path convention: /admin/<resource> (no /api prefix)
  • Package renames for three plugins

Breaking Changes

1. Plugin package renames

Old nameNew name
@system-core/plugin-events@system-core/plugin-event
@system-core/plugin-jobs@system-core/plugin-job
@system-core/plugin-team-faqs-testimonials@system-core/plugin-team-faq-testimonial

Update package.json and all import paths.

2. Admin pages removed from plugin packages

Plugins no longer ship Vue pages under src/pages/. The AppCapabilityCrudResource entries on each capability now include typed field schemas that the UI layer (@maxnate-ui/system-core) uses to auto-generate list and edit pages.

If you were importing Vue components from plugin packages directly:

ts
// Before — no longer exported
import PostsPage from '@system-core/plugin-blog/pages/admin/cms/blog/posts.vue'

Use the CRUD resource capability metadata from the plugin instead and let the UI layer render it.

3. API path convention change

Plugin admin API paths no longer include a leading /api segment.

Before: /api/admin/events
After:  /admin/events

Update any hardcoded fetch paths in your integration layer or admin shell.

4. Translation row gains namespace field

The Translation interface now requires namespace: string. If you maintain a custom TranslationDeps implementation, add the field to your store and schema.

ts
// Before
export interface Translation {
  entityType: string
  entityId: string
  locale: Locale
  fields: Record<string, string>
  // ...
}

// After
export interface Translation {
  namespace: string   // NEW — required
  entityType: string
  entityId: string
  locale: Locale
  fields: Record<string, string>
  // ...
}

5. TranslationDeps signature changes

ts
// Before
find(entityType, entityId, locale): Promise<Translation | null>
findMany(entityType, entityId): Promise<Translation[]>
delete(entityType, entityId, locale): Promise<void>

// After
find(entityType, entityId, locale, namespace?): Promise<Translation | null>
findMany(filters?: TranslationFilters): Promise<Translation[]>
delete(entityType, entityId, locale, namespace?): Promise<void>

New Features

Plugin seed translations

Plugins can now seed UI strings at install time:

ts
export const backend = installCapabilityPlugin(capability, {
  version: VERSION,
  seedTranslations: {
    en: { 'events.list.title': 'Events', 'events.action.new': 'New Event' },
    fr: { 'events.list.title': 'Événements', 'events.action.new': 'Nouvel événement' }
  }
})

Conventional file layout:

src/
  i18n/
    en.json
    fr.json

Seeds are written once per locale per capability namespace. Admin edits are never overwritten.

getUiStrings() on the public config

createSystem() exposes seeded and persisted UI strings:

ts
const system = await createSystem({ prisma, plugins: [...] })

// server-side
system.uiStrings      // Record<string, string> for the default locale

// via public config endpoint
publicConfig.uiStrings

Expanded AppCapability surfaces

Three new surfaces are available on plugin capabilities:

ts
export interface AppCapability {
  // ...existing...
  policies?: PolicyDefinition[]
  tenancy?: AppCapabilityTenancy
  publicConfig?: Record<string, unknown>
}

Upgrade Checklist

  1. Update package names in package.json:
    • plugin-eventsplugin-event
    • plugin-jobsplugin-job
    • plugin-team-faqs-testimonialsplugin-team-faq-testimonial
  2. Remove any direct imports of Vue admin pages from plugin packages.
  3. Update admin API fetch paths from /api/admin/<resource> to /admin/<resource>.
  4. If you have a custom TranslationDeps implementation, add namespace: string to your store schema and update the find / findMany / delete signatures.
  5. Optionally add seedTranslations to your own plugins for UI string localisation.

system-core documentation for maintainers, integrators, and AI build agents.