Commit Graph

62 Commits

Author SHA1 Message Date
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 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 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
gnezim 7d8cb63600 Add flight display components and barrel exports
StationDisplay, TimeGroup, FlightStatus, DurationDisplay compose into
FlightCard; FlightList renders a list of cards with skeleton loading.
All components are props-driven with no data fetching.
2026-04-15 07:57:02 +03:00
gnezim b3ab73253d Add data model types, datetime utils, and dictionary hook
Port Angular flight types (ISimpleFlight, IFlightLeg, ITimesSet, etc.)
to minimal React-friendly interfaces. Add formatDuration/formatTime/
formatDate/isDayChange as pure functions. Stub useCityName hook as
passthrough pending customer dictionary API endpoint.
2026-04-15 07:55:00 +03:00
gnezim 7db39cbeec Fix type errors and lint warnings in health and shutdown modules
Use proper type-safe interfaces instead of Node.js http types for the
health handler, and avoid vi.spyOn type issues in shutdown tests by
directly intercepting process.on.
2026-04-15 00:59:59 +03:00
gnezim ca6ae0eea2 Add graceful shutdown handler with TDD
registerGracefulShutdown drains in-flight requests for 30s on SIGTERM,
flushes logs, then exits cleanly. Force-exits with code 1 on timeout.
2026-04-15 00:55:09 +03:00
gnezim f0e540aa3f Add health endpoint factory with TDD
healthMiddleware returns 200 if upstream was reachable within 60s, 503 otherwise.
Exports a factory function — registration in modern.config.ts is a future step.
2026-04-15 00:55:08 +03:00
gnezim 59d5a7314e Fix lint: exempt storage test from no-restricted-globals, remove non-null assertion 2026-04-15 00:50:46 +03:00
gnezim 5d041cc4c6 Implement security headers middleware for HSTS, COOP, CORP, and more 2026-04-15 00:49:07 +03:00
gnezim 4f93d0a9bf Implement SSR stream nonce injection as workaround for React #24883 2026-04-15 00:48:54 +03:00
gnezim 10b97339bf Implement CSP middleware with per-request nonce and React context 2026-04-15 00:48:02 +03:00
gnezim 2742568a85 Implement safe storage abstraction with Zod validation and namespace prefix 2026-04-15 00:47:22 +03:00
gnezim ebe6c38713 Fix lint warnings in SignalR wrapper and hook tests
Remove unused imports, eliminate non-null assertions,
drop invalid eslint-disable comment for missing rule.
2026-04-15 00:44:31 +03:00
gnezim 4c52bb4032 Add useLiveFlights SSR-safe hook with tests
Generic hook wrapping SignalR subscription with SSR guard
(typeof window check). Includes tests for subscribe, data
updates, cleanup, and SSR path.
2026-04-15 00:42:51 +03:00
gnezim 7052052742 Add SignalRConnection ref-counted wrapper with tests
Reference-counted connection management with grace period,
dynamic import to keep @microsoft/signalr out of SSR bundle,
and singleton sharing via getSharedConnection.
2026-04-15 00:41:28 +03:00
gnezim b6da51fce5 Add smoke route exercising logger, i18n, and locale display 2026-04-15 00:36:54 +03:00
gnezim 6d3e3ae986 Add error pages for 404, 500, 503 codes 2026-04-15 00:35:05 +03:00
gnezim 858b8e1d1f Wire root layout provider stack and locale-scoped layout with i18n
Root layout wraps children with LoggerProvider, ApiClientProvider, and
ErrorBoundary. Locale layout validates lang param against 9 supported
languages and provides a request-scoped I18nProvider.
2026-04-15 00:34:16 +03:00
gnezim fc57556010 Add errorToResponse mapper with TDD tests covering all mapping rules 2026-04-15 00:31:37 +03:00
gnezim 2eb118cb8b Add ErrorBoundary class component with retry support 2026-04-15 00:30:34 +03:00
gnezim bb50e63866 Add SeoHead component with canonical, hreflang, OG, Twitter, and JSON-LD 2026-04-15 00:20:40 +03:00
gnezim 599f35f14a Add JsonLdRenderer and serializeJsonLd with schema-dts typing 2026-04-15 00:20:07 +03:00
gnezim 8abe8acf70 Add buildHreflangSet for 9 languages + x-default 2026-04-15 00:18:35 +03:00
gnezim 6a4be07911 Add useAnalytics hook with server-safe NoopAnalytics fallback 2026-04-15 00:15:43 +03:00
gnezim 8878dcb6c8 Add AnalyticsLoader component with idle-callback initialization 2026-04-15 00:15:43 +03:00
gnezim 515151ed81 Add analytics facade with adapter fan-out and consent gating 2026-04-15 00:15:11 +03:00
gnezim fe31bbfb65 Add four stub analytics adapters (metrica, ctm, variocube, dynatrace) 2026-04-15 00:13:49 +03:00
gnezim e95781a069 Add test-observable analytics event sink 2026-04-15 00:13:13 +03:00
gnezim 0b25a1a9e7 Add 8 custom metric instruments using OTel proxy meter 2026-04-15 00:10:49 +03:00
gnezim 2dc1a1f194 Add OTel server/browser initializers with getMeter/getTracer accessors 2026-04-15 00:10:21 +03:00
gnezim dfa9e0283d Add LoggerProvider React context with useLogger hook 2026-04-14 23:57:56 +03:00
gnezim 498d049acd Add createRootLogger factory with transport selection by env 2026-04-14 23:57:30 +03:00
gnezim 9a1b4bace1 Add JsonLinesHttpTransport with batching, backpressure, and redaction 2026-04-14 23:55:12 +03:00
gnezim 98414ee4af Add dev-mode ConsoleTransport for logger 2026-04-14 23:54:01 +03:00
gnezim 1a40686490 Add LoggerImpl with transport dispatch and child context propagation 2026-04-14 23:53:13 +03:00
gnezim 7992d2705a Add ApiClient React context provider with useApiClient hook 2026-04-14 23:46:20 +03:00
gnezim 04c5432aef Add CachedApiClient decorator layered above ApiClient 2026-04-14 23:45:56 +03:00
gnezim 65c8c8b55f Add ApiClient with retry, timeout, and error mapping 2026-04-14 23:42:22 +03:00
gnezim cb5e5b0106 Add three cache types (request-scoped, client TTL, server byte-capped LRU) 2026-04-14 23:39:35 +03:00
gnezim fd62d6f123 Add circuit breaker with closed/open/half-open state machine 2026-04-14 23:30:53 +03:00
gnezim 6ef9ce4ed7 Add typed API error classes (ApiHttpError, ApiTimeoutError, ApiNetworkError) 2026-04-14 23:30:00 +03:00
gnezim 7103b9ffb1 Add I18nProvider with useTranslation re-export for feature code 2026-04-14 23:21:25 +03:00
gnezim a8c648c818 Add SSR↔client i18n hydration serializer 2026-04-14 23:21:01 +03:00