No new defect found
I found no actionable regression in the reviewed diff. The route structure survives the migration, the compiled template dependencies match apart from one unused phone-library directive, and both base and head pass the TopFans QA build.
The lazy-load reduction holds up in an independent build. Wallet needs 2,370,199 fewer bytes of JavaScript beyond the initial load, a 58.5% reduction. This is a useful change.
This review does not verify signed-in payment, refund, payout, or fulfillment actions. Those flows still need the checks below before release.
What changed
The app now lazy-loads WALLET_ROUTES instead of WalletModule. The PR removes the wallet routing and feature modules, converts their 35 declared components, and makes eight shared components, directives, and pipes standalone. Referrals is one of the 35 former declarations, though its file lives under Monetize.
Each converted component imports what its template uses. Table and resend verification also replace their SharedModule imports with direct dependencies. Those shared consumers matter because a remaining static import would keep pulling the large module into wallet.
Insights imports TransactionHistoryComponent directly. Its parent route now provides WalletHomeService, which the nested refund modals inject.
The checks that mattered
Routes and permissions stay intact
I parsed the old and new route definitions and compared the old routes with the new wrapper's children. All 26 route records match, including component names, redirects, guards, permission data, nested purchase routes, and the wildcard fallback.
The new empty-path wrapper puts WalletHomeService above both wallet branches. The outer app route still carries the authentication, permission, and creator-approval guards. Wallet remains lazy-loaded at the feature boundary.
Wallet routes · App route and guards
The refund modals retain their service
Transaction history renders transaction details, which can render the refund actions and their accept and reject modals. Those modals inject WalletHomeService. The new provider on the Insights parent route covers this chain when the earnings screen uses transaction history.
I checked the source dependency chain. I did not submit a refund or instantiate these screens with an authenticated account.
Insights provider · Refund modal templates
Template imports match the base
I compiled base and head separately with Angular's compiler, then compared the matched directive and pipe dependencies for all 656 components. The sets match for 652 components. No component gains a matched dependency.
The four differences are connect credit card, current balance, payout account section, and transaction history. Each loses only NativeElementInjectorDirective from ngx-intl-tel-input.
That directive attaches the host element to an Angular form control's nativeElement property. The four templates do not use the phone input widget, and the application search found no consumer of that added control property. I do not consider its removal a defect.
This comparison matters because the repository has strictTemplates: false. A build can succeed even when a plain directive attribute no longer matches an imported directive.
Removed module providers have replacements
The app's shared root providers already supply DatePipe and the circle-progress configuration. Wallet no longer needs its own copies. I also checked wallet templates for mask bindings before accepting the removal of provideNgxMask().
The eight shared declarations move into SharedModule's imports and remain exported, so existing NgModule consumers can still use them.
Measured bundle change
These are raw JavaScript bytes from independent QA build statistics. I followed each route entry's static imports and excluded JavaScript already reachable from the main and polyfills entries. They are not compressed download sizes or load-time measurements.
| Route | Base | PR head | Reduction |
|---|---|---|---|
| Wallet | 4,054,330 bytes | 1,684,131 bytes | 58.5% |
| Insights | 5,301,929 bytes | 4,779,189 bytes | 9.9% |
Wallet's lazy dependency set no longer contains SharedModule. Insights still contains it. Both route totals reproduce the PR description exactly.
The CLI reports an initial total of 8.92 MB on both builds, including styles and global scripts. The PR quotes 6.86 MB for the initial bundle. That figure does not match this run's reporting, so I am not repeating it as a verified result. The initial main and polyfills JavaScript dependency sets total 7,134,586 bytes on base and 7,131,196 bytes on head, excluding the separate global scripts bundle.
Checks run
| Check | Result |
|---|---|
| Exact PR revisions | Reviewed head 9f85284bbcb against base f26da3be4d5 in separate worktrees. Existing local edits stayed out of the builds. |
| TopFans QA builds | Base and head pass. Each emits 42 warning entries. |
| Angular compilation | Base and head pass. Compared all 656 emitted component dependency sets. |
| Wallet route comparison | All 26 original route records match inside the new provider wrapper. |
| Generated white-label build | Pass. Generated the blossom project configuration with the repository generator and reused its existing tenant environment. The QA browser and server build succeeds. No tenant environment file was edited. |
| Lazy dependency sizes | Wallet and Insights totals match the PR's reported byte counts. |
| Signed-in browser actions | Not run. No payment, payout, refund, or fulfillment operation was submitted. |
Builds used Node's 10 GB heap limit and disabled prerendering. The development command could not start because this checkout lacks environment.dev.ts. I used the existing QA configuration instead and left environment files unchanged.
The author's browser dependency checks, 41-URL SSR comparison, and lint results remain author-reported evidence. I did not rerun them. An unauthenticated SSR response for a protected wallet URL checks the shell, not the wallet screen.
Before release
Run these with test accounts on TopFans and a generated white-label site. Use the existing payment test setup for actions that change money or account state.
- Open wallet and Insights earnings directly in fresh sessions. Open a refundable transaction, then open both accept and reject dialogs. Check for missing-provider errors and verify the displayed amounts.
- In the test environment, complete one refund decision. Confirm the list refreshes and wallet counters update. Visit wallet and Insights in both orders.
- Open current balance, add-card, payout verification, and the resend-verification dialog. Check form input, the embedded Stripe interface, and the OTP countdown.
- Open purchase details for a subscription and a ticket. Check refund status, holdback actions, ticket expansion, and the ticket modal.
- Check loyalty point purchase and fulfillment dialogs. For an experience, verify file selection and upload progress.
- Use a delegate account and a non-owner account to check wallet links and direct URLs. Confirm the existing permission and white-label owner restrictions still apply.
Review scope
This is a code and build review of the standalone migration. No source fix is proposed because the review found no new defect. It does not establish that every wallet workflow works in a signed-in browser.
The recommendation applies to the head commit shown above. If the PR changes, repeat the dependency comparison and the affected runtime checks.