make less things to rely on HashSet and HashMap order

This commit is contained in:
Tobias Koppers 2022-10-13 15:50:01 +02:00
parent 4760f0dbfd
commit 79ea25f491
2 changed files with 41 additions and 28 deletions

View file

@ -5,7 +5,7 @@ use std::{
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use futures::{stream::FuturesUnordered, TryStreamExt}; use futures::{stream::FuturesUnordered, TryStreamExt};
use indexmap::IndexMap; use indexmap::{IndexMap, IndexSet};
use mime::TEXT_HTML_UTF_8; use mime::TEXT_HTML_UTF_8;
pub use node_rendered_source::{create_node_rendered_source, NodeRenderer, NodeRendererVc}; pub use node_rendered_source::{create_node_rendered_source, NodeRenderer, NodeRendererVc};
use serde_json::Value as JsonValue; use serde_json::Value as JsonValue;
@ -125,8 +125,10 @@ async fn separate_assets(
}; };
queue.push(process_asset(intermediate_asset)); queue.push(process_asset(intermediate_asset));
let mut processed = HashSet::new(); let mut processed = HashSet::new();
let mut internal_assets = HashSet::new(); let mut internal_assets = IndexSet::new();
let mut external_asset_entrypoints = HashSet::new(); let mut external_asset_entrypoints = IndexSet::new();
// TODO(sokra) This is not deterministic, since it's using FuturesUnordered.
// This need to be fixed!
while let Some(item) = queue.try_next().await? { while let Some(item) = queue.try_next().await? {
match item { match item {
Type::Internal(asset, assets) => { Type::Internal(asset, assets) => {

View file

@ -249,7 +249,8 @@ async fn create_server_rendered_source_for_directory(
let mut predefined_sources = vec![]; let mut predefined_sources = vec![];
let mut named_placeholder_sources = vec![]; let mut named_placeholder_sources = vec![];
let mut catch_all_sources = vec![]; let mut catch_all_sources = vec![];
if let DirectoryContent::Entries(entries) = &*input_dir.read_dir().await? { let dir_content = input_dir.read_dir().await?;
if let DirectoryContent::Entries(entries) = &*dir_content {
for (name, entry) in entries.iter() { for (name, entry) in entries.iter() {
let sources = if name.starts_with("[[") || name.starts_with("[...") { let sources = if name.starts_with("[[") || name.starts_with("[...") {
&mut catch_all_sources &mut catch_all_sources
@ -260,28 +261,31 @@ async fn create_server_rendered_source_for_directory(
}; };
match entry { match entry {
DirectoryEntry::File(file) => { DirectoryEntry::File(file) => {
if let Some((name, extension)) = name.rsplit_once('.') { if let Some((basename, extension)) = name.rsplit_once('.') {
match extension { match extension {
// pageExtensions option from next.js // pageExtensions option from next.js
// defaults: https://github.com/vercel/next.js/blob/611e13f5159457fedf96d850845650616a1f75dd/packages/next/server/config-shared.ts#L499 // defaults: https://github.com/vercel/next.js/blob/611e13f5159457fedf96d850845650616a1f75dd/packages/next/server/config-shared.ts#L499
"js" | "ts" | "jsx" | "tsx" => { "js" | "ts" | "jsx" | "tsx" => {
let (dev_server_path, intermediate_output_path) = if name == "index" let (dev_server_path, intermediate_output_path) =
{ if basename == "index" {
(server_path.join("index.html"), intermediate_output_path) (server_path.join("index.html"), intermediate_output_path)
} else { } else {
( (
server_path.join(name).join("index.html"), server_path.join(basename).join("index.html"),
intermediate_output_path.join(name), intermediate_output_path.join(basename),
) )
}; };
sources.push(create_server_rendered_source_for_file( sources.push((
context_path, name,
context, create_server_rendered_source_for_file(
*file, context_path,
runtime_entries, context,
server_root, *file,
dev_server_path, runtime_entries,
intermediate_output_path, server_root,
dev_server_path,
intermediate_output_path,
),
)); ));
} }
_ => {} _ => {}
@ -289,7 +293,8 @@ async fn create_server_rendered_source_for_directory(
} }
} }
DirectoryEntry::Directory(dir) => { DirectoryEntry::Directory(dir) => {
sources.push( sources.push((
name,
create_server_rendered_source_for_directory( create_server_rendered_source_for_directory(
context_path, context_path,
context, context,
@ -300,17 +305,23 @@ async fn create_server_rendered_source_for_directory(
intermediate_output_path.join(name), intermediate_output_path.join(name),
) )
.into(), .into(),
); ));
} }
_ => {} _ => {}
} }
} }
} }
let mut ordered_sources = predefined_sources; predefined_sources.sort_by_key(|(k, _)| *k);
ordered_sources.append(&mut named_placeholder_sources); named_placeholder_sources.sort_by_key(|(k, _)| *k);
ordered_sources.append(&mut catch_all_sources); catch_all_sources.sort_by_key(|(k, _)| *k);
Ok(CombinedContentSource { Ok(CombinedContentSource {
sources: ordered_sources, sources: predefined_sources
.into_iter()
.chain(named_placeholder_sources.into_iter())
.chain(catch_all_sources.into_iter())
.map(|(_, v)| v)
.collect(),
} }
.cell()) .cell())
} }