Angular checkup
primo-brandeis
Overview
parentCtrl reads to rebuild for NDE.
InfoAngular version & toolingNo @angular/core: a Primo VE customization package, on AngularJS (see Primo NDE migration).
InfoDeprecated APIsThe Angular type definitions could not be read, neither installed nor from the npm registry, so deprecations are not checked.
InfoThird-party compatibilityNo Angular dependency to check against.
InfoChange detection & zoneless readinessNo Angular components.
InfoComponents & templatesNo @Component classes found.
InfoState managementNo state-management library or signal usage found.
InfoArchitectureNo application code to check.
InfoTestingNo unit-test runner detected, 0 spec files, 0% of components and services with a spec.
InfoType safetyNo application tsconfig found.
InfoSecurityNo application code to check.
InfoCircular dependenciesNo TypeScript application code to check.
InfoBundle sizeNo build stats found, so the bundle size is not part of this report.
Top priorities
- HighPrimo VE customizations do not carry over to NDE, announced as the only Primo UI from January 2028 Primo NDE migration
- Medium22 Primo hooks to rebuild, with 5 helper components Primo NDE migration
- Medium
parentCtrlread in 11 places Primo NDE migration - Medium3 third-party integrations to rebuild or replace Primo NDE migration
Migration plan: Primo VE customizations (AngularJS) → Primo NDE
4 phases, each shipping on its own, from deciding what NDE still needs to switching view by view.
-
1Decide and set up
A list of the customizations NDE still needs, and the custom module building for your institution and view.
- Check each customization against NDE as it ships 27
NDE was redesigned from the ground up; some VE customizations fill gaps it no longer has. Dropping those first is the cheapest part of the migration.
- Set up the NDE custom module (Angular 18)
git clone https://github.com/ExLibrisGroup/customModule.git && cd customModule && npm installSet the institution and view in
build-settings.env;npm run buildwrites the package to upload per view.
- Check each customization against NDE as it ships 27
-
2Branding and static pages
The NDE view looks like the library again.
- Move logos, images and CSS 1
Images to
src/assets/images, CSS tosrc/assets/css/custom.cssor the Material 3 theme insrc/app/styles. - Move the static home pages 1
To
src/assets/homepage/homepage_<lang>.html; AngularJS markup in them has to go. Languages: en.
- Move logos, images and CSS 1
-
3Rebuild the hooks
Every customization that is still needed runs as an Angular component in NDE.
- Rebuild each hook as an Angular component 22
Map it in
selectorComponentMapto the matchingnde-…-before,-after,-topor-bottomselector, found in the NDE UI. - Rebuild the helper components the hooks render 5
- Replace
parentCtrlreads 11With
@Input() hostComponentor NgRx store selectors (store.selectSignal(...)). - Rebuild or replace Google Analytics / Tag Manager
Check for the vendor's NDE version first.
- Rebuild or replace HathiTrust
Check for the vendor's NDE version first.
- Rebuild or replace LibChat (Springshare)
Check for the vendor's NDE version first.
- Rebuild each hook as an Angular component 22
-
4Test and switch
Each view runs on NDE, before the VE UI goes away.
- Test against the live view in proxy mode
npm run start:proxyOr open the NDE view with
?useLocalCustomPackage=truewhilenpm run startruns. - Build, upload and switch view by view 1
npm run buildBefore January 2028, when NDE is announced as the only UI.
- Test against the live view in proxy mode
Primo NDE migration
PoorPrimo VE customization: 22 hooks, 11 parentCtrl reads to rebuild for NDE.
- Views
- 1
- customization packages
- Hooks
- 22
- 5 helper components
- parentCtrl reads
- 11
- in 1 file
- Integrations
- 3
- third-party
- Requests
- 0
- `$http` calls
-
HighPrimo VE customizations do not carry over to NDE, announced as the only Primo UI from January 2028
The New Discovery Experience is extended through an Angular custom module (ExLibrisGroup/customModule, Angular 18), where each customization is an Angular component mapped to an
nde-…selector inselectorComponentMap. There is no hybrid route as for an AngularJS app: the package is rebuilt hook by hook, and it can be developed against the live view with the module's proxy mode before go-live. -
Medium22 Primo hooks to rebuild, with 5 helper components
Each
prm-…-after/-beforeslot the package fills becomes an Angular component in the custom module, mapped to the matchingnde-…selector; NDE's names follow its own layout, so each slot's counterpart is found in the NDE UI first. Hooks used:prm-action-container-after,prm-action-list-after,prm-advanced-search-after,prm-atoz-search-bar-after,prm-blank-ill-after,prm-brief-result-after,prm-explore-footer-after,prm-facet-after, ….- 01BRAND_INST-BRAND/js/custom.js:89
- and 21 more
-
Medium
parentCtrlread in 11 placesparentCtrlis the VE hook's handle on the internal AngularJS controller of the Primo component it extends. NDE has no such controller: a custom component getshostComponent(the Angular component instance, with a different shape) and reads the app state through NgRx selectors. Each read is found again there, and it is where most of the effort and the risk of a hook sits. Read most:actionName(3),searchStateService.searchObject(3),item.pnx(2),facetGroup.facetGroupCollapsed(1),facetGroup.name(1),term(1).- 01BRAND_INST-BRAND/js/custom.js:246
-
Medium3 third-party integrations to rebuild or replace
Google Analytics / Tag Manager, HathiTrust, LibChat (Springshare). Check each vendor for an NDE version first (Third Iron has announced one for BrowZine and LibKey); whatever has none is rebuilt as a component of the custom module.
-
LowStatic home pages in 1 language (en)
They move to
src/assets/homepage/homepage_<lang>.htmlof the custom module, with the CSS and images tosrc/assets. Mostly copying, but the markup is Angular now: AngularJS directives in it stop working.
Angular version & tooling
InfoNo @angular/core: a Primo VE customization package, on AngularJS (see Primo NDE migration).
- Latest Angular
- 22
- npm registry
Deprecated APIs
InfoThe Angular type definitions could not be read, neither installed nor from the npm registry, so deprecations are not checked.
- Legacy template directives
- 0
-
NoteInstall the dependencies, or run without --offline so the typings of the exact versions can be downloaded
Deprecations are read from the
@deprecatedtags of the@angular/*,@ngrx/*andrxjstype definitions of the versions the project uses: installed innode_modules, else the versions the lockfile pins, downloaded once into the cache.
Third-party compatibility
InfoNo Angular dependency to check against.
Change detection & zoneless readiness
InfoNo Angular components.
- Mode
- zone.js
- OnPush
- 0%
- 0 of 0 components
- Files injecting NgZone
- 0
- Zone test helpers
- 0
Components & templates
InfoNo @Component classes found.
State management
InfoNo state-management library or signal usage found.
- Classic NgRx files
- 0
- Signal store files
- 0
- signal() / computed()
- 0
- 0 toSignal()
- BehaviorSubject services
- 0
Architecture
InfoNo application code to check.
- Lazy routes
- 0%
- 0 of 0
- Large files
- 0
- over 500 lines
- Constructor injection
- 0
- classes; 0 inject() calls
- Class guards
- 0
- and interceptors
- Hotspots
- -
- shallow clone: no history (fetch-depth: 0)
Testing
InfoNo unit-test runner detected, 0 spec files, 0% of components and services with a spec.
- Unit-test runner
- none
- Spec files
- 0
- With a spec
- 0%
- 0 of 0 component/service files
- End-to-end
- none
Type safety
InfoNo application tsconfig found.
- strictNullChecks
- off
- default in TypeScript ?
- strictTemplates
- off
- default in Angular ?
- noImplicitAny
- off
- default in TypeScript ?
- Explicit any
- 0
- 0.0 per 1 000 lines
- Non-null assertions
- 0
Security
InfoNo application code to check.
- Direct DOM HTML writes
- 0
- innerHTML =, insertAdjacentHTML
- Sanitizer bypasses
- 0
- bypassSecurityTrust*
- eval / new Function
- 0
- [innerHTML] bindings
- 0
- sanitized by Angular
- Known vulnerabilities
- 0
- in 0 direct dependencies checked
Circular dependencies
InfoNo TypeScript application code to check.
Bundle size
InfoNo build stats found, so the bundle size is not part of this report.
-
NoteRun
ng build --stats-json(ornx build <app> --stats-json) and re-run to include the bundle size