···4141 async_runtime.block_on(async { build(routes, content_sources, options).await })
4242}
43434444-/// Returns the log prefix for a given tree depth
4545-fn log_prefix(tree_depth: usize) -> &'static str {
4646- match tree_depth {
4747- 0 => "",
4848- 1 => "├─ ",
4949- _ => "│ ├─ ",
5050- }
5151-}
5252-5344pub async fn build(
5445 routes: &[&dyn FullRoute],
5546 content_sources: &mut ContentSources,
···136127 // how fast most sites build. Ideally, it'd be configurable and default to serial, but I haven't found an ergonomic way to do that yet.
137128 // If you manage to make it parallel and it actually improves performance, please open a PR!
138129 for route in routes {
130130+ let route_start = Instant::now();
139131 let cached_route = CachedRoute::new(*route);
140132 let base_path = route.route_raw();
141133 let variants = cached_route.variants();
···144136145137 let has_base_route = !base_path.is_empty();
146138147147- // If no base route but has variants, show "(variants only)" header
148139 if !has_base_route && !variants.is_empty() {
149140 info!(target: "pages", "(variants only)");
150141 }
···153144 if has_base_route {
154145 let base_params = extract_params_from_raw_route(&base_path);
155146147147+ // Static base route
156148 if base_params.is_empty() {
157157- // Static base route
158149 let mut route_assets =
159150 RouteAssets::new(&route_assets_options, Some(image_cache.clone()));
151151+160152 let params = PageParams::default();
161153 let url = cached_route.url(¶ms);
162162- let file_path = cached_route.file_path(¶ms, &options.output_dir);
163154164155 let result = route.build(&mut PageContext::from_static_route(
165156 content_sources,
···169160 None,
170161 ))?;
171162163163+ let file_path = cached_route.file_path(¶ms, &options.output_dir);
164164+172165 write_route_file(&result, &file_path)?;
173166174174- info!(target: "pages", "{} -> {}", url, file_path.to_string_lossy().dimmed());
167167+ info!(target: "pages", "{} -> {} {}", url, file_path.to_string_lossy().dimmed(), format_elapsed_time(route_start.elapsed(), &route_format_options));
175168176169 build_pages_images.extend(route_assets.images);
177170 build_pages_scripts.extend(route_assets.scripts);
···195188 });
196189197190 if pages.is_empty() {
198198- warn!(target: "build", "{} has dynamic parameters but Route::pages returned an empty Vec. No pages will be generated.", base_path.bold());
191191+ warn!(target: "build", "{} is a dynamic route, but its implementation of Route::pages returned an empty Vec. No pages will be generated for this route.", base_path.bold());
192192+ continue;
199193 } else {
200194 // Log the pattern first
201195 info!(target: "pages", "{}", base_path);
202196203203- // Build all pages for this group
197197+ // Build all pages for this route
204198 for page in pages {
205199 let url = cached_route.url(&page.0);
206200 let file_path = cached_route.file_path(&page.0, &options.output_dir);
···216210217211 write_route_file(&content, &file_path)?;
218212219219- info!(target: "pages", "{}{}", log_prefix(1), file_path.to_string_lossy().dimmed());
213213+ info!(target: "pages", "├─ {} {}", file_path.to_string_lossy().dimmed(), format_elapsed_time(route_start.elapsed(), &route_format_options));
220214221215 build_metadata.add_page(
222216 base_path.clone(),
···236230237231 // Handle variants
238232 for (variant_id, variant_path) in variants {
233233+ let variant_start = Instant::now();
239234 let variant_params = extract_params_from_raw_route(&variant_path);
240240- let variant_depth = 1;
241235242236 if variant_params.is_empty() {
243237 // Static variant
···259253260254 write_route_file(&result, &file_path)?;
261255262262- info!(target: "pages", "{}{}", log_prefix(variant_depth), file_path.to_string_lossy().dimmed());
256256+ info!(target: "pages", "├─ {} {}", file_path.to_string_lossy().dimmed(), format_elapsed_time(variant_start.elapsed(), &route_format_options));
263257264258 build_pages_images.extend(route_assets.images);
265259 build_pages_scripts.extend(route_assets.scripts);
···286280 warn!(target: "build", "Variant {} has dynamic parameters but Route::pages returned an empty Vec.", variant_id.bold());
287281 } else {
288282 // Log the variant pattern first
289289- info!(target: "pages", "{}{}", log_prefix(variant_depth), variant_path);
283283+ info!(target: "pages", "├─ {}", variant_path);
290284291285 // Build all pages for this variant group
292286 for page in pages {
287287+ let variant_page_start = Instant::now();
293288 let url = cached_route.variant_url(&page.0, &variant_id)?;
294289 let file_path = cached_route.variant_file_path(
295290 &page.0,
···308303309304 write_route_file(&content, &file_path)?;
310305311311- info!(target: "pages", "{}{}", log_prefix(variant_depth + 1), file_path.to_string_lossy().dimmed());
306306+ info!(target: "pages", "│ ├─ {} {}", file_path.to_string_lossy().dimmed(), format_elapsed_time(variant_page_start.elapsed(), &route_format_options));
312307313308 build_metadata.add_page(
314314- format!("{} ({})", base_path, variant_id),
309309+ route.route_raw().to_string(),
315310 file_path.to_string_lossy().to_string(),
316316- Some(page.0.0.clone()),
311311+ Some(page.0.0),
317312 );
318313319314 page_count += 1;