@plumile/backoffice-core
v0.2.10
Published
Core types and helpers for Kronex backoffice runtime
Maintainers
Readme
@plumile/backoffice-core
Core types, manifests, URL state helpers, and pure utilities for Kronex backoffice runtimes.
Status
Specialized public package. This package is intended for backoffice implementations that adopt Kronex entity manifests, facet resolution, and URL state conventions.
Purpose
@plumile/backoffice-core contains the non-React foundation used by
@plumile/backoffice-react.
It provides:
- manifest builders for list-detail and tool entities
- detail-page normalization and validation helpers
- route and facet resolution helpers
- base64 and detail parameter encoding helpers
- synchronous, destination-aware list navigation contracts and URL codecs
- shared backoffice types
It does not provide:
- React components
- auth flows
- Relay environments
- application-specific business logic
Installation
npm install @plumile/backoffice-corePeer dependencies:
npm install react react-relaySome helpers depend on @plumile/filter-query and Relay runtime concepts
through the package dependency graph.
Main Public Surface
Builders
createListDetailManifestcreateToolManifestcreateListFacetcreatePickerFacetcreateDetailLayoutFacetcreateDetailPageFacetcreateToolFacet
createListDetailManifest requires a non-empty detail-page manifest, one
matching default page, and both detail facet loaders. When hasList is true,
the list loader is required as well. The builder validates the same invariants
at runtime so JavaScript consumers and unsafe casts fail during manifest
construction instead of during navigation.
Detail-page helpers
validateDetailPagesnormalizeDetailPagesresolveDefaultDetailPageresolveDetailPageByIdresolveDetailPageByPath
Resolution and routing
resolveBackofficeListFacetConfigresolveBackofficePickerFacetConfigresolveBackofficeDetailLayoutFacetConfigresolveBackofficeDetailPageFacetConfigresolveBackofficeToolFacetConfigresolveBackofficeToolRoute
URL and encoding helpers
encodeBackofficeDetailParamsdecodeBackofficeDetailParams(value, decoder)parses the transport payload asunknownand returns a value only when the caller-provided decoder validates itcreateBackofficeListNavigationdefineBackofficeListNavigationcreateBackofficeListUrlCodec
Shared contracts
- constants and types exported from the package root
BackofficeListNavigationconverts liststateto structured router{ filters, query }values throughencode, and converts them back throughdecode- list-detail manifests with
hasList: truemust exposelistNavigation; the resolved list config exposes the same synchronous contract - list-detail manifests may provide
detailLabelso React integrations can render a stable detail shell before the detail layout facet has loaded
For the complete public entry points and subpaths, see
package.json and src/index.ts.
List navigation
Define the URL contract next to the lightweight entity manifest so destination links can serialize filters before the lazy list facet has loaded:
const listNavigation = defineBackofficeListNavigation<JobsListQuery>()({
defaults: { where: null, sort: 'CREATED_AT_DESC' },
filterSchema: jobsFilterSchema,
sortIds: ['CREATED_AT_DESC', 'CREATED_AT_ASC'],
});
const destination = listNavigation.encode({
where: { status: 'RUNNING' },
});
// destination.filters -> { status: { eq: 'RUNNING' } }
// destination.query -> { sort: 'CREATED_AT_DESC' }
listNavigation.decode(destination);
// -> { where: { status: 'RUNNING' }, sort: 'CREATED_AT_DESC' }Pass listNavigation.querySchema to the list route and pass the encoded
filters and query to @plumile/router links. Raw URL strings are not part
of this contract.
Quick Start
import {
createToolManifest,
normalizeDetailPages,
} from '@plumile/backoffice-core';
const pages = normalizeDetailPages({
mainPage: {
id: 'overview',
path: '',
content: ['summary'],
},
});
const manifest = createToolManifest({
id: 'jobs',
label: 'Jobs',
routes: {
list: '/jobs',
detail: (id) => `/jobs/${id}`,
detailPage: (id, pageId) => `/jobs/${id}/${pageId}`,
},
facets: {
summary: async () => {
return {
kind: 'tool',
id: 'summary',
label: () => 'Summary',
tool: {
id: 'jobs',
},
};
},
},
});
pages.defaultPage.id; // "overview"
manifest.kind; // "tool"Package Layout
builders.tsmanifest and facet builders used to define public backoffice contractsdetail/*detail-page normalization, validation, and resolution helpersresolve.tsroute and facet resolution helpers that attach resolved public behaviorstate/*list URL state codecs, defaults, and filter-query integrationtypes.tsshared backoffice contracts re-exported from the package root
Validation Notes
- public helpers should stay pure and testable in isolation
- resolution helpers and detail-page utilities are the primary behavioral contracts to validate in unit tests
- package docs should describe behavior by responsibility, not mirror every type export mechanically
Limitations
- this package is intentionally tied to Kronex backoffice concepts
- many types are most useful when paired with
@plumile/backoffice-react - it is not a generic CRUD framework
