src/models/store.model.ts— new file exportingAppState(the root NgRx store shape) plus slice state interfaces keyed by each reducer's exact feature-key string. Six slices consumed by the services in this package (Search,user,filters,account,viewConfig,linked-data-entity) are fully typed; the remaining 23 slices are declared as opaqueRecord<string, unknown>soAppStatestays complete without pulling host-internal field types into the public API.AppStatere-exported from the package barrel (src/index.ts) so consumer remotes can write their own typed selectors.
StateHelperselector methods are now generic overAppState.select$,selectOnce, andselectSignalsignatures changed fromselector: anytoselector: (state: AppState) => T. The internalStoreis cast toStore<AppState>sostore.select(selector)type-checks.- All six state services retyped (
search-state,user-state,filter-state,account-state,view-config-state,entity-state). Every(state: any) => state.Foo?.barselector callback now reads(state: AppState) => state.Foo?.barand is fully type-checked at compile time — a typo in a feature-key string or a renamed field is now atscerror instead of a silent runtimeundefined. AccountStatestatus fields (loansStatus,requestsStatus,finesStatus,savedSearchesStatus,searchHistoryStatus) are typed asLoadingStatus(notstring) so service selectors returningObservable<LoadingStatus | undefined>type-check correctly.package.json— added@ngrx/entity ^19.0.0as a peer dependency (already transitively required — now declared explicitly becauseSearchState extends EntityState<Doc>is part of the public surface).
- README.md — new "Typed store access" subsection noting that
AppStateis exported and selector callbacks are fully typed.
- Analytics model — new
EventsNameskeys:TOPIC_OVERVIEW('Topic Overview'),LEGANTO_COURSE_INFO('Leganto Course Info'),EXPORT_ALL('Export All') - Search model — new
SearchData.facetsCacheKey?: number— host uses this to skip re-fetching facets when the cache is still valid - Search model — new
ElectronicService.displayInEmbedViewer?: boolean— indicates the service can be shown in the embedded viewer - Search model — new
SearchWithinJournalContextinterface —{ recordId: string; recordTitle: string }used for journal search context - View-config model — new
SystemConfigurationfields:expand_results_toggles_visible: boolean,export_all_for_user_email_only: boolean - View-config model — new
MappingTablesentry:'Resource Sharing Additional Information': MappingTable[] - View-config model — new
ResultFullTileInterface.authorityitemview: Resultitemview[] - Account model — new
PageTypetype alias:'loans' | 'requests' | 'fines' | 'searchHistory' | 'savedSearches' loadFiltersAction— added optionalfacetsCacheKey?: numberprop — allows callers to pass the cache key to the host's filter effectFilterStateService.loadFilters()— added optionalfacetsCacheKey?: numberparameter
shared-actions.tsheader comment extended to document three new excluded actions:triggerExportAllSendEmail(downstream HTTP email effect),patronDefaultSortUpdateAction(downstream sort-save HTTP effect),selectAllResourceTypeFilterAction(downstream search-trigger effect)
- README.md:
EventsNamescount updated to ~53;SearchDatatable — addedfacetsCacheKeyrow;ElectronicServicetable — addeddisplayInEmbedViewerrow;SystemConfigurationsection — addedexpand_results_toggles_visibleandexport_all_for_user_email_onlyfields table;MappingTablessection — noted new'Resource Sharing Additional Information'entry; addedSearchWithinJournalContextinterface block; addedPageTypetype block;loadFiltersActionprops updated withfacetsCacheKey?;FilterStateServicedispatch helpers updatedloadFilters(params, facetsCacheKey?); version tarball references bumped to2026.5.1
- Search model — new
SearchParamsfields:conVoc,authorityQuery,originatingSystem,originatingSystemId - Search model — new
Info.controlledVocabularyof new interfaceControlledVocabulary { errorMessages: string[] } - Search model — new
Doc.registerUser(string flag) - Search model — new
Controlfields:originatingSystem,originatingSystemId - Search model — new
DocDelivery.titleRequestableAtItemLevel - Search model — new
ElectronicServicefields:serviceNotAvailable,serviceNotAvailableReason,researchFileList,researchLinksList - Search model — new interfaces:
EsploroResearchFile,EsploroResearchLink(Esploro research-output records attached to electronic services) - Search model — new
FullDisplayQueryParams.authfulldisplayandFullDisplayParams.authfulldisplay - User model — new
DecodedJwtfields:selfRegistered: boolean,restrictedUser: boolean - Entity model — new
AutoCompleteBaseEntity.score?: number - View-config model — new
ViewConfigData.patron_default_sort: boolean - View-config model — new
ViewConfigData.searchWithinJournalConfigof new interfaceSearchWithinJournal { tab?, scope?, summonUrl? } - View-config model — new
SystemConfigurationfields:enable_search_inside_journal: boolean,display_register_button_by_restricted_user_groups: boolean,primo_loan_list_sorting: string - New filter actions:
removeIncludeFilterAction([Filter Group Dropdown] Remove Include Filter),removeExcludeFilterAction([Filter Group Dropdown] Remove Exclude Filter) - New search UI action:
setIsResourceRecommenderExpandedAction([search] Set Is Resource Recommender Expanded— trailing space) EntityStateService— new flat-field selectors:selectEntityId$,selectEntity$,selectWikiData$,selectWikiDataStatus$,selectRelatedDocsStatus$,selectRelatedEntitiesStatus$plus Signal and Promise equivalents where applicable- API symmetry — every selector now has all three variants (Observable / Signal / Promise). Added missing Signals and Promises across every state service so remotes can pick the shape that fits the call site:
UserStateService:getUserState,getDecodedJwt,getUserName,getUserGroupSearchStateService:docByIdSignal(id)+ PromisesgetSearchMetaData,getSearchStatus,getTotalResults,getPageSize,isLoading,getSearchNotificationMsg,getPcAvailabilityToggleValue,getSearchInFullTextToggleValue,isSnackBarOpen,getDisplaySummary,isReportAProblemOpen,getCurrentSearchTerm,getSelectedSortByFilterStateService: PromisesgetFilterState,getResourceTypeFilter,isFiltersOpen,isRememberAllViewConfigStateService: SignalsprimoViewSignal,tilesSignal,institutionNameSignal+ PromisesgetStatus,getPrimoView,getScopes,getTabs,getTiles,getNdeAddons,getInstitutionName,getInterfaceLanguageEntityStateService: SignalswikiDataStatusSignal,relatedDocsStatusSignal,relatedEntitiesStatusSignal+ PromisesgetWikiData,getWikiDataStatus,getRelatedDocsStatus,getRelatedEntitiesStatusAccountStateService: SignalsloansStatusSignal,requestsStatusSignal,finesStatusSignal+ PromisesgetBlocksCounter,getFavoritesCounter,getLoansList,getRequestsList,getFinesList,getSearchHistoryList,getInstitutionsList,getLoansStatus,getRequestsStatus,getFinesStatus
Doc.pnx.links.unpaywalllinkrenamed tolinkunpaywallto match the host's current field nameEntityStateServicerewritten to use the correct feature keystate['linked-data-entity'](was previouslystate.linkedDataEntity— latent bug since 2026.3.1)EntityStateService.selectRelatedEntities$()now returnsRelatedEntitiesMultiLangDataList[](host flattened state — entities are multi-language; remotes compose a language projection themselves)
- Removed
fetchUnpaywallLinksAction— the host no longer loads Unpaywall links asynchronously. The URL is now read inline fromDoc.pnx.links.linkunpaywall. - Removed
Doc.unpaywallStatus— no async load happens, so there is no status to track. - Removed
EntityStateService.selectEntityViewModel$(),entityViewModelSignal(), andgetEntityViewModel()— the host's linked-data-entity state was flattened; the compositeentityViewModelfield no longer exists as raw state. Remotes that need a language-mapped projection must compose it themselves fromselectEntity$/selectRelatedEntities$/selectWikiData$using their own language selector.
- README.md:
EntityStateServicetables rewritten to reflect the new flat API; staleentityViewModelfields removed fromQuick startsnippets; SearchParams table updated with 4 new fields; Doc table showslinkunpaywallrename and removal ofunpaywallStatus; Control table updated withoriginatingSystem/originatingSystemId; DecodedJwt updated withselfRegistered/restrictedUser; newControlledVocabulary,EsploroResearchFile,EsploroResearchLink,SearchWithinJournalinterfaces documented; ViewConfigData / SystemConfiguration additions documented;EntityViewModel/BasicEntityData/EntityDetails/RelatedDocList/RelatedEntitiesMultiLangDataListtables corrected to match the actual source shapes (previous entries had fabricated field names); Filter and Search UI actions tables updated with the three new actions; install-command version strings bumped to2026.4.1. - EXAMPLES.md: Entity card example rewritten to use the new flat API and multi-language
EntityMultiLangDatashape, showing how to pick a language viaViewConfigService.interfaceLanguageSignal(). - README.md — API reference tables for every
*StateServiceupdated to list the new Signal and Promise methods added by the symmetry pass.
- New model:
analytics.model.ts—EventsNames,PageNames,SearchTypesconst maps for consistent analytics tracking across remotes - New model:
entity.model.ts—EntityType,EntityViewModel,EntityDetails,EntityThumbnail,BasicEntityData,EntityMultiLangData,RelatedDocList,RelatedEntitiesList, linked-data API response types, AutoComplete entity models - New model:
view-config.model.ts—ViewConfigData,SystemConfiguration(140+ properties),MappingTables(50+ tables),PrimoView,Scope,Tiles,FeatureFlags,NdeAddonData,SavedSearchInterface,AtozLanguage,SearchHeaderType, and all supporting sub-interfaces - New model:
account.model.ts(partial) —Counters,MenuOption,accountViewModel,LoanItem,FineItem,RequestItem,MappedRequestItem,MappedFineItem,FavoriteItem,MappedInstItem,SearchHistoryItem,CrossNetworkResponse(excluded:RequestOptions,NestedRequestOptions,PersonalDetailsInfo) - New service:
ViewConfigStateService— read-only selectors for config, systemConfiguration, mappingTables, scopes, tabs, featureFlags, ndeAddons, institutionCode, vid, interfaceLanguage (Observable + Signal + Promise APIs) - New service:
EntityStateService— read-only selectors for entity view model, status, related docs, related entities (Observable + Signal + Promise APIs) - New service:
AccountStateService— read-only selectors for counters, loans, requests, fines, saved searches, search history, institutions (Observable + Signal + Promise APIs) - New filter actions:
IncludeFilterButtonClickedAction,ExcludeFilterButtonClickedAction,applyMultiSelectFiltersAction,clearAllFiltersAction,resourceTypeFilterSelectedAction,setIsFiltersOpenAction,rememberAllChangeValueAction - New search UI actions:
setDisplaySummaryAction,setIsSnackBarOpenAction,setIsReportAProblemOpenAction,setPresentNotificationAction,pcAvailabilityToggleChanged,changePcAvailabilityToggleValue,searchInFullTextToggleChanged,changeSearchInFullTextToggleValue - New
FilterGroupValueinterface — exported fromshared-actions.tsfor multi-select filter dispatch - FilterStateService: 7 new typed dispatch helpers —
includeFilter(),excludeFilter(),applyMultiSelectFilters(),clearAllFilters(),selectResourceType(),setFiltersOpen(),setRememberAll() - SearchStateService: 8 new Observable selectors, 8 new Signal selectors, 6 new typed dispatch helpers —
setDisplaySummary(),setIsSnackBarOpen(),setIsReportAProblemOpen(),toggleExpandMyResults(),toggleSearchInFullText(),saveCurrentSearchTerm()
SearchParams: added optionalsearchTermfieldshared-actions.ts: JSDoc safety comments added to all 37 exported action creatorsshared-actions.ts: added header comment block listing all intentionally excluded (unsafe) actions- Version scheme changed from semver (
1.0.0) toYYYY.M.regenerateCount(2026.3.1)
Initial release with Search, Filter, and User state slices.