Skip to content

[Blazor] Aspire Dashboard AoT support - #68291

Draft
javiercn wants to merge 37 commits into
mainfrom
javiercn/aspire-dashboard-aot-review
Draft

[Blazor] Aspire Dashboard AoT support#68291
javiercn wants to merge 37 commits into
mainfrom
javiercn/aspire-dashboard-aot-review

Conversation

@javiercn

@javiercn javiercn commented Aug 8, 2026

Copy link
Copy Markdown
Member

WIP — please refrain from comments for now

This is an early draft of the Aspire Dashboard Native AOT support work. Please hold review comments until this notice is removed.

Current status:

  • Rebased onto origin/main.
  • Clean full repository build passes.
  • Components unit and generator projects pass.
  • JIT and strict Native AOT feature suites pass.
  • The change is being re-rationalized into a possible dependent PR stack with abstractions introduced at their first use.

javiercn and others added 30 commits August 8, 2026 17:47
Use non-generic enum parsing and array conversion so runtime-selected binding no longer depends on emitted generic closures.

Behavior: changed: enum and array binding works without dynamic code
State: builds; tests in #2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Compare the reflectionless enum and array paths with the existing JIT conversion behavior.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Freeze the generated-code-facing component, bindable, JSON, and JS descriptor contracts before their first runtime consumer.

Behavior: preserved
State: builds; contracts are inert until #4
Unused until: #4 (infra(components): add ordered component type-info resolution)
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Normalize generated and reflection metadata behind one ordered resolver with final cache, deduplication, and hot-reload behavior.

Behavior: preserved
State: builds; tests in #5
Unused until: #5 (test(components): cover ordered type-info resolution)
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Exercise resolver ordering, lookup, provider isolation, deduplication, and cache lifecycle.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Use resolved component metadata for construction, injection, parameter assignment, cascades, and persistent members.

Behavior: changed: described components use generated operations before reflection
State: builds; tests in #7
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Prove generated runtime operations preserve activation, parameter, cascading, and persistent-state semantics.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Carry component type info through routing and endpoint discovery so generated metadata can replace assembly scans.

Behavior: changed: described routes and endpoint metadata bypass scans
State: builds; tests in #9
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Cover generated routes, endpoint metadata, discovery, parameter getters, and linker descriptor ownership.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Delete the reflection-oriented builder graph after all discovery consumers use component type info.

Behavior: preserved
State: complete
Review hint: deletion-only cleanup; verify that no surviving caller references these helpers
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Retain the resolved component object through initial, dynamic, and resumed Server root operations.

Behavior: changed: initial, dynamic, and resumed roots retain generated metadata
State: builds; tests in #12
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Cover root operation deserialization, rendering, persistence, disposal, and service registration.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Walk known binding expressions and descriptors instead of compiling expression trees at runtime.

Behavior: preserved
State: builds; tests in #14
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Cover deep members, fields, arrays, indexers, and fallback expression shapes.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Compose framework and application JSON contracts before the compatibility resolver across Blazor wire paths.

Behavior: changed: generated contracts resolve before subsystem-specific fallback
State: builds; tests in #16
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Cover resolver ordering and the framework event, state, marker, initializer, Session, and TempData contracts.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Add typed protected-storage serializers so applications can explicitly supply source-generated contracts.

Behavior: changed: applications can provide typed storage contracts
State: builds; tests in #18
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Cover typed storage options, runtime types, registration, and failure behavior.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Keep the outbound JS result type in a generic pending-call object instead of reconstructing it at completion time.

Behavior: preserved
State: builds; tests in #20
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Cover successful, failed, cancelled, array, nullable, and typed outbound JS completions.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Resolve inbound JS calls through generated descriptors first while isolating all legacy behavior in the reflection resolver.

Behavior: changed: generated inbound JS calls resolve before legacy reflection
State: builds; tests in #22
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Cover generated and reflection invocation, async adaptation, serialization, errors, and Server integration.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Delete the task-generic and lookup helpers made unreachable by typed pending calls and ordered method resolution.

Behavior: preserved
State: complete
Review hint: deletion-only cleanup; verify that no surviving caller references these helpers
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Generate the final application component, bindable, JS, attribute, diagnostic, and inaccessible-member metadata shape directly.

Behavior: changed: metadata contexts receive complete application descriptions
State: builds; tests in #25
Review hint: inspect the component emitter and diagnostics first; the remaining emitters apply the same final model
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Exercise application generation, inheritance, accessibility, diagnostics, constraints, bindables, serialization, and JS shapes.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Add reusable publish, readiness, process-watchdog, and WebSocket routing support for Native AOT feature applications.

Behavior: preserved
State: builds; contains no feature tests until #27
Unused until: #27 (test(nativeaot): exercise the feature matrix under JIT)
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Create the final feature application and cover its customer scenarios in the reflection-compatible JIT lane.

Behavior: preserved
State: complete for JIT feature behavior; strict roots pending
Review hint: the application is created directly at its final testassets path; no historical move is preserved
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Establish owner-assembly descriptors and imports for Components, Web, Forms, and Endpoints.

Behavior: changed: strict metadata covers typical framework-owned components
State: builds; tests in #29
Pattern: establishes owner-assembly built-in descriptor providers
Review hint: scrutinize this exemplar; #30 repeats it with the named package deviations
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Cover the core provider inventory, generic factories, and provider import behavior.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Apply owner-assembly descriptors to Authorization, QuickGrid, Media, and WebAssembly Authentication.

Behavior: changed: referenced optional packages contribute strict metadata
State: builds; tests in #31
Pattern: follows #28 - deviates by package-specific generic factories
Review hint: compare the package-specific factories against the #28 exemplar
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
javiercn and others added 7 commits August 8, 2026 17:48
Cover optional providers, explicit roots, constraints, and package-specific factories.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Describe Web renderer, dynamic-root, virtualization, and InputFile callbacks with typed JS descriptors.

Behavior: changed: strict framework callbacks bypass legacy dispatch
State: builds; tests in #33
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Cover framework callback import keys, payload contracts, and inherited callback behavior.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Disable all three reflection fallbacks, promote completeness diagnostics, and require a warning-free strict publish for the 21 generated-only scenarios.

Behavior: preserved
State: complete; strict publish validation follows
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Keep one JIT-only scenario proving undescribed component, JS method, and JSON payload reflection remains enabled by default.

Behavior: preserved
State: complete
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Avoid broad WebAssembly internals visibility, preserve route type annotations, and isolate linker suppressions to the legacy JS reflection path after rebasing onto main.

Behavior: preserved

State: full repository build and unit suites pass; E2E follow-up remains

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Expose an internal interface-returning bridge so the WebAssembly UnsafeAccessor matches the target method exactly.

Behavior: preserved

State: focused WebAssembly unit tests pass

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 61f1d159-2b62-4725-a7f8-dd109da38995
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant