Commit Graph

149 Commits

Author SHA1 Message Date
gnezim b6df5530ca Fix security audit step for deprecated npm endpoint 2026-04-15 16:32:54 +03:00
gnezim 664e2133b8 Add provider and ErrorBoundary tests to meet 70% coverage threshold
CI / ci (push) Failing after 28s
Deploy / build-and-deploy (push) Failing after 6s
2026-04-15 16:29:06 +03:00
gnezim 936adab6e4 Add Phase 1 README with setup, debugging, and runbook pointers
CI / ci (push) Failing after 39s
Deploy / build-and-deploy (push) Failing after 6s
2026-04-15 16:22:06 +03:00
gnezim 1b0f15b082 Add bundle-size gate script for CI 2026-04-15 16:20:55 +03:00
gnezim 3c17459b4e Add CI pipeline with typecheck, lint, test, build, and security audit 2026-04-15 16:19:18 +03:00
gnezim 0c914d8d4e Add @vitest/coverage-v8 for test coverage reporting 2026-04-15 16:19:00 +03:00
gnezim aae632c742 Fix SSR: align @modern-js/runtime to v2.70.8 and re-enable stream SSR
The server build was failing with "window is not defined" during SSR because
@modern-js/runtime@3.1.3 had an SSR-unsafe window reference in its router
plugin. Pinning runtime to 2.70.8 (matching app-tools) resolves the version
mismatch and eliminates the server-side window access.
2026-04-15 16:16:28 +03:00
gnezim 1facfd8050 Fix runtime rendering: Outlet, process guards, env defaults
Deploy / build-and-deploy (push) Failing after 5s
Three root causes of blank page:
1. Modern.js layouts use <Outlet /> not {children} for nested routes
2. process.env not available in browser — guard with typeof checks
3. getEnv() schema required all fields — add defaults for browser context

Also: add source.entriesDir, runtime.router to modern.config.ts,
disable SSR temporarily until the SSR server build alias issue is
resolved (framework-level @_modern_js_src resolution).
2026-04-15 15:24:32 +03:00
gnezim b4266e4b0f Fix flaky ESLint probe tests: use Node API instead of subprocess
Deploy / build-and-deploy (push) Failing after 6s
The 10 ESLint boundary and restricted-imports probe tests spawned a
fresh eslint subprocess per test (~2.7s each), causing timeout flakes
under load. Replaced with ESLint's Node API (single instance reused
across all tests in a file) — first test pays ~5s init, subsequent
tests ~1.3s each. Added 30s timeout to accommodate the init cost.
2026-04-15 12:32:59 +03:00
gnezim 1a01b31f91 Merge pull request 'plan/react-rewrite' (#1) from plan/react-rewrite into main
Deploy / build-and-deploy (push) Failing after 11s
Reviewed-on: #1
2026-04-15 12:21:16 +03:00
gnezim 9cbc28074b Add Module Federation build artifacts to .gitignore
Ignore @mf-types.zip, @mf-types/ directory, and .mf/ cache directory
that are generated during MF builds.
2026-04-15 10:56:55 +03:00
gnezim 8a5279745c Wire root route redirect to /{lang}/onlineboard
Replace the 1A-2 placeholder with a loader redirect matching Angular's
default routing: bare `/` sends users to `/ru/onlineboard`.
2026-04-15 10:56:40 +03:00
gnezim 98c6eca90e Add Phase 6 cutover runbook and operational checklist
Comprehensive operational procedure for the Angular-to-React traffic
cutover: pre-cutover gates, proxy config templates (nginx/HAProxy),
72-hour traffic ramp schedule, monitoring checklist, rollback procedure,
1-week soak criteria, and Angular decommission steps. Also adds Phase 6
cross-reference sections to the Phase 1 runbook.
2026-04-15 10:56:34 +03:00
gnezim 031ad7c15d Fix lint warnings and test environment for Phase 5 tests
Remove unused type alias, unused variable, add jsdom environment
directive, and use container.textContent for cross-element text
assertions.
2026-04-15 10:09:56 +03:00
gnezim 78205c378e Add Phase 5C integration tests for PopularRequestsPanel
Covers all 5 request modes, loading/error states, keyboard
accessibility, and the 4-item display limit.
2026-04-15 10:02:09 +03:00
gnezim 99af1fe00d Add Phase 5D useSearchHistory hook with per-language namespacing
Persists search history to localStorage via @/shared/storage with
language-scoped keys (afl_history_{lang}). Supports dedup by URL,
max 10 items, and clear functionality.
2026-04-15 10:01:31 +03:00
gnezim e172df8cf9 Add Phase 5B components, route page, and update MF expose
PopularRequestsPanel renders up to 4 popular request items in a
grid. MF expose upgraded from stub to real component. Route page
at /{lang}/popular provides standalone access.
2026-04-15 10:01:22 +03:00
gnezim 0a8ccfe36e Add Phase 5A types, API function, and usePopularRequests hook
Ports Angular PopularRequestsApiService and IPopularRequest types
to React with pure API function + React hook pattern matching
existing features (online-board, schedule).
2026-04-15 10:01:11 +03:00
gnezim 7d202b9436 Add Phase 5 Popular Requests master plan
Documents the Angular feature analysis and sub-plan breakdown for
porting popular-requests to React with useSearchHistory hook.
2026-04-15 09:58:14 +03:00
gnezim 5839692e52 Fix lint and typecheck issues in flights-map feature
Add explicit undefined to optional properties for exactOptionalPropertyTypes
compatibility. Remove unused import. Fix non-null assertions with proper
null guards. Remove invalid eslint-disable comment.
2026-04-15 09:51:23 +03:00
gnezim 8dde2db9d2 Add Phase 4 master plan and install leaflet dependency
Write the flights-map master plan covering sub-plans 4A-4D.
Add leaflet + @types/leaflet to support the map canvas component.
2026-04-15 09:44:01 +03:00
gnezim a60494366f Update flights-map barrel and MF expose from stub to real
Populate the feature barrel with all 4A-4D exports. Replace the
FlightsMap MF expose stub with lazy-loaded FlightsMapStartPage,
gated by the flightsMap feature flag.
2026-04-15 09:43:54 +03:00
gnezim 0f5d7915be Add flights-map SEO builder and JSON-LD WebPage schema
Phase 4D: buildFlightsMapSeo generates meta tags, canonical, hreflang, OG
and Twitter Card props. buildFlightsMapJsonLd produces a schema.org WebPage
object for structured data. 10 tests cover both builders.
2026-04-15 09:43:24 +03:00
gnezim a2cf781b02 Add flights-map route page, start page container, and filter
Phase 4C: FlightsMapStartPage manages filter state and drives search/calendar
hooks. FlightsMapFilter provides departure/arrival/connections/domestic/
international controls. Route page gates on flightsMap feature flag, rendering
404 when disabled.
2026-04-15 09:42:31 +03:00
gnezim dc030aceea Add Leaflet map wrapper and ClientOnly SSR-safe component
Phase 4B: MapCanvas.tsx is the sole Leaflet consumer in the codebase.
Renders markers (blue/orange), polylines (solid/dashed) with great-circle
arcs, popups and tooltips. Accepts all data as props (stateless).
ClientOnly.tsx provides SSR safety by deferring render until mount.
2026-04-15 09:41:11 +03:00
gnezim aa61049229 Add flights-map types, API functions, hooks, and feature flag
Phase 4A: Define IFlightRoute, IMapMarker, IMapPolyline types; implement
searchDestinations and getFlightsMapCalendar API functions with 11 tests;
add useFlightsMapSearch, useFlightsMapCalendar hooks; add FEATURE_FLIGHTS_MAP
env var for feature flag gating.
2026-04-15 09:40:19 +03:00
gnezim 6703c5a2f2 Fix lint issues in schedule feature code 2026-04-15 09:33:26 +03:00
gnezim c67686463a Add schedule parity harness, integration tests, barrel, and MF expose (Phase 3E)
Registers schedule URL serializer in parity harness with 18-entry fixture
corpus and fast-check fuzz. 10 URL round-trip integration tests, 6 SEO/
JSON-LD integration tests. Updates barrel and MF expose from stub to real.
2026-04-15 09:31:19 +03:00
gnezim 93f49cddae Add schedule SEO and JSON-LD tests (Phase 3D)
Tests cover start page, search, and details SEO builders plus
Flight/ItemList JSON-LD schema generation for schedule pages.
2026-04-15 09:28:04 +03:00
gnezim a072cd3bd2 Add schedule route pages and feature components (Phase 3C)
Four Modern.js routes: start page, one-way search, round-trip search,
and catch-all multi-flight details. Components wire hooks for data
fetching and render flight results with calendar navigation.
2026-04-15 09:26:42 +03:00
gnezim 7ad61554cb Add schedule API functions and React hooks (Phase 3B)
POST schedule/1 for search, GET schedule/details with indexed query
params, GET days/.../schedule/v1 for calendar. Three hooks wrap the
API functions with loading/error state management.
2026-04-15 09:22:50 +03:00
gnezim 1c5e85ea8e Implement schedule URL serializer/parser with TDD (Phase 3A)
Covers one-way search, round-trip search, multi-flight details (catch-all),
and airport-code-interleaved details format. Reuses online-board's flight
param parser for individual flight segments.
2026-04-15 09:20:56 +03:00
gnezim f7813b04b1 Add Phase 3 (Schedule) master plan and 3A sub-plan 2026-04-15 09:18:16 +03:00
gnezim 969281c71a Fix type error in flight-details integration test
Use ISimpleFlight union type for setupWithFlight parameter to accept
both IDirectFlight and IMultiLegFlight fixtures.
2026-04-15 08:56:42 +03:00
gnezim 008bc3339c Add 60 integration tests for Online Board feature
6 test files covering start page, flight search, flight details,
URL round-tripping, error handling, and SEO output verification.
All tests use mocked API and SignalR layers with jsdom environment.
2026-04-15 08:55:24 +03:00
gnezim 5bcf23ee4e Configure vitest and TypeScript for integration test files
Install @testing-library/jest-dom, add tests/**/*.test.tsx to vitest
include and tsconfig include patterns.
2026-04-15 08:55:15 +03:00
gnezim 728193e8b0 Add Phase 2H integration test plan
Defines scope, test inventory, mocking strategy, and exit criteria
for component-level integration tests of the Online Board feature.
2026-04-15 08:55:02 +03:00
gnezim 9bd3697a17 Add URL and SEO parity harnesses with fast-check fuzz testing
Generic URL parity harness (table-driven + property-based roundtrip)
and SEO parity harness (shape/completeness validation) registered for
Online Board. 170 tests covering all 6 route types with 200-iteration
fast-check fuzz runs ensuring no serialization asymmetry.
2026-04-15 08:45:09 +03:00
gnezim 1e9523088b Add Phase 2G parity harness implementation plan
Defines tasks for URL parity harness (table-driven + fast-check fuzz),
SEO parity harness, and Online Board registration against both.
2026-04-15 08:40:59 +03:00
gnezim e20686b11f Wire SEO and JSON-LD into all 6 Online Board route pages
Each route page now renders <SeoHead> with title, description,
canonical, hreflang, OG, and Twitter card from the SEO builders.
Search pages render <JsonLdRenderer> with ItemList of Flight
schemas. Details page renders Flight JSON-LD. Barrel exports
updated with 2F SEO and JSON-LD functions.
2026-04-15 08:37:47 +03:00
gnezim 44ae7f1642 Add Phase 2F JSON-LD builders for Flight and ItemList schemas
TDD-driven schema.org JSON-LD builders using schema-dts types.
buildFlightJsonLd maps ISimpleFlight to Flight schema with
airports, times, and provider. buildFlightListJsonLd wraps
search results as an ItemList of ListItems.
2026-04-15 08:32:31 +03:00
gnezim c68d53dfa6 Add Phase 2F SEO builders with EN locale translations
SEO builder pure functions for all 6 Online Board route types,
each returning SeoHeadProps with title, description, canonical,
hreflang, OG, and Twitter card. Populated empty EN locale SEO
keys with English translations matching the Russian pattern.
2026-04-15 08:32:24 +03:00
gnezim 6788f609e6 Update barrel exports and MF expose for 2E route pages
- Feature barrel now exports OnlineBoardStartPage, OnlineBoardSearchPage,
  OnlineBoardDetailsPage
- MF expose renders start page via React.lazy + Suspense
- Fix exactOptionalPropertyTypes issues with suffix param
- Remove unused import
2026-04-15 08:24:41 +03:00
gnezim cd07542dc5 Add 6 online board route pages
Start page, flight/departure/arrival/route search pages,
and flight details page. Each route is thin: parses URL
params, lazy-loads the feature component with Suspense.
2026-04-15 08:22:26 +03:00
gnezim 80b9090ef9 Add feature components for online board pages
OnlineBoardSearchPage (shared by all 4 search routes),
OnlineBoardStartPage (search form landing), and
OnlineBoardDetailsPage (flight detail view with legs).
All wired to existing hooks from 2C/2D. 21 tests passing.
2026-04-15 08:21:32 +03:00
gnezim 98971cab26 Add Phase 2E routes implementation plan
Covers 6 route pages, 3 feature components, barrel updates, and MF expose.
2026-04-15 08:18:12 +03:00
gnezim c6c0ce2bfc Wire useLiveFlights to TrackerHub channels for Online Board (Phase 2D)
Two thin composition hooks that connect the generic SignalR hook (1E)
to board-specific channels: useLiveBoardSearch for search pages
(SubscribeDate channel) and useLiveFlightDetails for the details page
(Subscribe channel). Both are SSR-safe and client-only.
2026-04-15 08:15:09 +03:00
gnezim 3bed4f9173 Add Phase 2D SignalR wiring implementation plan 2026-04-15 08:12:08 +03:00
gnezim 8218dffcd9 Add Phase 2C: Online Board API functions and React hooks
Pure API functions (searchFlights, getFlightDetails, getCalendarDays)
with dependency-injected ApiClient, plus three thin React hooks
(useOnlineBoard, useFlightDetails, useCalendarDays) for search,
details, and calendar pages. 17 TDD tests for API layer covering
URL construction, response mapping, and error handling.
2026-04-15 08:09:53 +03:00
gnezim 9e08057704 Implement Phase 2B URL serializer with TDD (73 tests)
Pure TypeScript port of Angular OnlineBoardUrlBuilder/Parser covering
all 6 URL types (start, flight, departure, arrival, route, details).
Includes roundtrip parity tests and edge cases for suffixed flights,
variable-length flight numbers, time ranges, and 3-char carriers.
2026-04-15 08:05:40 +03:00