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 futures::{stream::FuturesUnordered, TryStreamExt};
use indexmap::IndexMap;
use indexmap::{IndexMap, IndexSet};
use mime::TEXT_HTML_UTF_8;
pub use node_rendered_source::{create_node_rendered_source, NodeRenderer, NodeRendererVc};
use serde_json::Value as JsonValue;
@ -125,8 +125,10 @@ async fn separate_assets(
};
queue.push(process_asset(intermediate_asset));
let mut processed = HashSet::new();
let mut internal_assets = HashSet::new();
let mut external_asset_entrypoints = HashSet::new();
let mut internal_assets = IndexSet::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? {
match item {
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 named_placeholder_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() {
let sources = if name.starts_with("[[") || name.starts_with("[...") {
&mut catch_all_sources
@ -260,28 +261,31 @@ async fn create_server_rendered_source_for_directory(
};
match entry {
DirectoryEntry::File(file) => {
if let Some((name, extension)) = name.rsplit_once('.') {
if let Some((basename, extension)) = name.rsplit_once('.') {
match extension {
// pageExtensions option from next.js
// defaults: https://github.com/vercel/next.js/blob/611e13f5159457fedf96d850845650616a1f75dd/packages/next/server/config-shared.ts#L499
"js" | "ts" | "jsx" | "tsx" => {
let (dev_server_path, intermediate_output_path) = if name == "index"
{
(server_path.join("index.html"), intermediate_output_path)
} else {
(
server_path.join(name).join("index.html"),
intermediate_output_path.join(name),
)
};
sources.push(create_server_rendered_source_for_file(
context_path,
context,
*file,
runtime_entries,
server_root,
dev_server_path,
intermediate_output_path,
let (dev_server_path, intermediate_output_path) =
if basename == "index" {
(server_path.join("index.html"), intermediate_output_path)
} else {
(
server_path.join(basename).join("index.html"),
intermediate_output_path.join(basename),
)
};
sources.push((
name,
create_server_rendered_source_for_file(
context_path,
context,
*file,
runtime_entries,
server_root,
dev_server_path,
intermediate_output_path,
),
));
}
_ => {}
@ -289,7 +293,8 @@ async fn create_server_rendered_source_for_directory(
}
}
DirectoryEntry::Directory(dir) => {
sources.push(
sources.push((
name,
create_server_rendered_source_for_directory(
context_path,
context,
@ -300,17 +305,23 @@ async fn create_server_rendered_source_for_directory(
intermediate_output_path.join(name),
)
.into(),
);
));
}
_ => {}
}
}
}
let mut ordered_sources = predefined_sources;
ordered_sources.append(&mut named_placeholder_sources);
ordered_sources.append(&mut catch_all_sources);
predefined_sources.sort_by_key(|(k, _)| *k);
named_placeholder_sources.sort_by_key(|(k, _)| *k);
catch_all_sources.sort_by_key(|(k, _)| *k);
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())
}