Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
5c0d4a6
Upgrade age-qualified frontend dependencies with compatibility holds
IEvangelist Sep 18, 2026
8de6163
Align repository tooling with age-qualified LTS releases
IEvangelist Sep 18, 2026
d808098
Add an isolated API incremental-build qualification pilot
IEvangelist Sep 18, 2026
84f989d
Retain enterprise-approved pnpm setup and compatible pnpm11
IEvangelist Sep 18, 2026
3922c1f
Generate portable locks against the same registry as CI
IEvangelist Sep 18, 2026
447ef8f
Preserve responsive UI behavior with Starlight native menus
IEvangelist Sep 18, 2026
a175e1e
Make looping media markup deterministic for full-output comparisons
IEvangelist Sep 18, 2026
23920a7
Make incremental qualification use deterministic build inputs
IEvangelist Sep 18, 2026
15526b1
Share the qualification clock with CI cache partitioning
IEvangelist Sep 18, 2026
53e5680
Keep the uncached RSS clock out of API compatibility keys
IEvangelist Sep 18, 2026
4b657dc
Make syntax colors and search manifest generation deterministic
IEvangelist Sep 19, 2026
2821097
Pass a native filesystem cache path to Astro configuration
IEvangelist Sep 19, 2026
ac6fda8
Finalize cached page identity before search indexing with a streaming…
IEvangelist Sep 19, 2026
89cb471
Require a genuinely different identity in pull-request qualification
IEvangelist Sep 19, 2026
e304455
Use exact URL origins in capture fixtures and record identity qualifi…
IEvangelist Sep 19, 2026
ec285a8
Memoize validated identity ranges and measure isolated cache transport
IEvangelist Sep 20, 2026
1f974d2
Stamp validated UTF-8 byte slots with bounded file I/O
IEvangelist Sep 20, 2026
e237d65
perf: scope incremental metadata to cacheable components
IEvangelist Sep 20, 2026
a72df07
Expand incremental pilot to OG images and unchanged search
IEvangelist Sep 21, 2026
9ac09c9
Require successful builds for artifact uploads
IEvangelist Sep 21, 2026
4ffad92
Report parity failures without uploading failed build artifacts
IEvangelist Sep 21, 2026
906b83b
Fix Pagefind test resolution for ESM-only Starlight
IEvangelist Oct 14, 2026
c4b2233
Restore site search test formatting
IEvangelist Oct 14, 2026
da11f41
Avoid deprecated Astro content slug access
IEvangelist Oct 14, 2026
31e63fe
Fix Twoslash paths in prerender bundles
IEvangelist Oct 14, 2026
543eefc
Canonicalize pilot contributor inputs
IEvangelist Oct 14, 2026
2aa5541
Adapt sidebar overrides to Starlight popovers
IEvangelist Oct 14, 2026
6cad40a
Preserve nested picker focus on Escape
IEvangelist Oct 14, 2026
0d3432f
Nest live picker with mobile sidebar
IEvangelist Oct 14, 2026
ccaf3c4
Diagnose incremental dependency hash drift
IEvangelist Oct 16, 2026
8fe6b6e
Backport stable incremental asset hashes
IEvangelist Oct 17, 2026
ab9905f
Allow pilot scenarios to finish browser checks
IEvangelist Oct 17, 2026
928871c
Preserve incremental behavior in hybrid stack
IEvangelist Oct 19, 2026
ce4be4d
Focus incremental builds on hybrid output
IEvangelist Oct 19, 2026
363010b
Fix hybrid Pagefind manifest path
IEvangelist Oct 19, 2026
19d2f90
Prefer Astro content entry ids
IEvangelist Oct 19, 2026
64fc662
Use canonical Astro content IDs
IEvangelist Oct 19, 2026
3e80d8e
Anchor Twoslash types to frontend root
IEvangelist Oct 19, 2026
2f86f4c
Isolate qualification fetch failures
IEvangelist Oct 19, 2026
009475b
Log hybrid parity text differences
IEvangelist Oct 19, 2026
e89a7af
Remove incremental build qualification scaffolding
IEvangelist Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions .github/workflows/frontend-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ jobs:

# Validation has its own checkout so astro sync cannot dirty Lunaria's tree.
- name: Build frontend
id: frontend_build
env:
MODE: production
ASTRO_TELEMETRY_DISABLED: 1
Expand Down Expand Up @@ -152,21 +153,21 @@ jobs:
run: node scripts/measure-build-output.mjs

- name: Upload build diagnostics
if: ${{ always() && inputs.profile_build }}
if: ${{ inputs.profile_build }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: frontend-performance
path: ${{ runner.temp }}/frontend-performance
if-no-files-found: warn
retention-days: 7

# Upload before the dist sanity-check so the artifact is always
# available for debugging, even when the check step fails.
# Upload only a successful build, before later checks so their failures
# don't hide an otherwise valid build artifact.
# Note: `uses` actions ignore the job-level working-directory,
# so the path is repo-root-relative (src/frontend/dist).
- name: Upload build artifact
id: upload_build_artifact
if: ${{ always() }}
if: ${{ !cancelled() && steps.frontend_build.outcome == 'success' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: frontend-dist
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"dev": "pnpm --dir ./src/frontend run dev",
"build": "pnpm --dir ./src/frontend run build",
"build:skip-search": "pnpm --dir ./src/frontend run build:skip-search",
"build:incremental": "pnpm --dir ./src/frontend run build:incremental",
"preview": "pnpm --dir ./src/frontend run preview",
"test": "pnpm --dir ./src/frontend run test",
"test:all": "pnpm --dir ./src/frontend run test:all",
Expand Down
27 changes: 26 additions & 1 deletion src/frontend/astro.config.mjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// @ts-check
import { defineConfig } from 'astro/config';
import { fileURLToPath } from 'node:url';
import { unified } from '@astrojs/markdown-remark';
import { sidebarTopics } from './config/sidebar/sidebar.topics.ts';
import { redirects } from './config/redirects.mjs';
Expand All @@ -23,6 +24,7 @@ import starlightSidebarTopics from 'starlight-sidebar-topics';
import starlightPageActions from 'starlight-page-actions';
import buildTiming from './config/build-timing.mjs';
import { contributorCacheIntegration } from './src/utils/contributors.ts';
import { loadIncrementalBuildSettings } from './config/incremental-build.mjs';
import UnoCSS from 'unocss/astro';
import Icons from 'starlight-plugin-icons';
import node from '@astrojs/node';
Expand All @@ -33,6 +35,18 @@ const modeArgIndex = process.argv.indexOf('--mode');
const isSkipSearchBuild = modeArgIndex >= 0 && process.argv[modeArgIndex + 1] === 'skip-search';
const outDir = process.env.ASTRO_OUT_DIR;
const isBuildTimingEnabled = process.env.BUILD_TIMING === '1';
const incrementalRequested = process.env.ASPIRE_INCREMENTAL_BUILD === '1';
const isIncrementalBuild =
hybridApiDocs &&
incrementalRequested &&
process.argv.includes('build');
if (incrementalRequested && process.argv.includes('build') && !hybridApiDocs) {
throw new Error('Incremental builds require the hybrid API documentation architecture.');
}
const mode = modeArgIndex >= 0 ? process.argv[modeArgIndex + 1] : 'production';
const incremental = isIncrementalBuild
? await loadIncrementalBuildSettings(new URL('.', import.meta.url), mode)
: undefined;
const siteDescription = aspireProject.description;

// Under `aspire run` the frontend dev server (Vite) and StaticHost are separate
Expand All @@ -58,7 +72,11 @@ const buildConcurrency = Number(process.env.ASPIRE_BUILD_CONCURRENCY) || 4;

// https://astro.build/config
export default defineConfig({
cacheDir: hybridApiDocs ? './node_modules/.astro-hybrid' : './node_modules/.astro',
cacheDir: incremental
? fileURLToPath(incremental.cacheDir)
: hybridApiDocs
? './node_modules/.astro-hybrid'
: './node_modules/.astro',
...(hybridApiDocs
? {
outDir: hybridOutputDirectory(process.cwd(), outDir),
Expand All @@ -67,12 +85,18 @@ export default defineConfig({
...hybridApiCacheConfig(),
}
: outDir ? { outDir } : {}),
...(incremental ? { experimental: { incrementalBuild: true } } : {}),
vite: {
define: {
// Resolve filesystem-backed redirects before prerender modules are bundled.
__ASPIRE_REDIRECT_PATHS__: JSON.stringify(Object.keys(redirects)),
__ASPIRE_HYBRID_API_DOCS__: JSON.stringify(hybridApiDocs),
},
...(incremental
? {
plugins: [incremental.privateIdentityPlugin],
}
: {}),
...(staticHostUrl
? {
server: {
Expand Down Expand Up @@ -253,6 +277,7 @@ export default defineConfig({
...(isBuildTimingEnabled ? [buildTiming()] : []),
aspireVersionPlaceholdersIntegration(),
...(hybridApiDocs ? [hybridApiDocsIntegration(redirects)] : []),
...(incremental ? [incremental.integration] : []),
],
build: {
concurrency: buildConcurrency,
Expand Down
Loading
Loading