From f46bb430825950def62f65108ed623c6f903e91f Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Wed, 29 Oct 2025 13:59:02 -0700 Subject: [PATCH] WIP: Turbopack: Implement bincode Encode/Decode traits on all turbo task values --- Cargo.lock | 41 ++- Cargo.toml | 4 +- crates/napi/Cargo.toml | 1 + crates/napi/src/next_api/project.rs | 3 + crates/next-api/Cargo.toml | 2 + crates/next-api/src/app.rs | 19 +- crates/next-api/src/client_references.rs | 13 +- crates/next-api/src/dynamic_imports.rs | 16 +- crates/next-api/src/entrypoints.rs | 1 + crates/next-api/src/module_graph.rs | 2 +- crates/next-api/src/next_server_nft.rs | 14 +- crates/next-api/src/operation.rs | 28 +- crates/next-api/src/pages.rs | 3 + crates/next-api/src/project.rs | 33 +- crates/next-api/src/route.rs | 9 +- crates/next-api/src/server_actions.rs | 6 +- crates/next-api/src/versioned_content_map.rs | 54 +++- crates/next-core/Cargo.toml | 28 +- crates/next-core/src/app_structure.rs | 39 ++- crates/next-core/src/bootstrap.rs | 2 +- .../next_app/app_client_references_chunks.rs | 3 + crates/next-core/src/next_app/mod.rs | 11 + .../visit_client_reference.rs | 5 + crates/next-core/src/next_config.rs | 301 ++++++++++++++++-- .../next-core/src/next_font/font_fallback.rs | 3 +- .../src/next_font/google/font_fallback.rs | 11 +- crates/next-core/src/next_font/google/mod.rs | 2 +- .../next-core/src/next_font/google/options.rs | 9 +- .../next-core/src/next_font/local/errors.rs | 5 +- .../src/next_font/local/font_fallback.rs | 10 +- .../next-core/src/next_font/local/options.rs | 9 +- .../next-core/src/next_font/local/request.rs | 5 + crates/next-core/src/next_image/module.rs | 3 + crates/next-core/src/next_manifests/mod.rs | 7 + crates/next-core/src/next_root_params/mod.rs | 1 + crates/next-core/src/next_server/resolve.rs | 5 +- .../transforms/modularize_imports.rs | 5 + .../src/next_shared/webpack_rules/mod.rs | 3 + crates/next-core/src/raw_ecmascript_module.rs | 19 +- crates/next-core/src/segment_config.rs | 43 ++- crates/next-core/src/util.rs | 13 +- turbopack/crates/turbo-esregex/Cargo.toml | 1 + turbopack/crates/turbo-esregex/src/lib.rs | 31 +- turbopack/crates/turbo-rcstr/Cargo.toml | 1 + turbopack/crates/turbo-rcstr/src/lib.rs | 17 + .../turbo-tasks-auto-hash-map/Cargo.toml | 1 + .../turbo-tasks-auto-hash-map/src/map.rs | 59 +++- .../turbo-tasks-auto-hash-map/src/set.rs | 8 +- .../crates/turbo-tasks-backend/Cargo.toml | 1 + .../crates/turbo-tasks-backend/tests/bug.rs | 9 +- .../crates/turbo-tasks-backend/tests/bug2.rs | 27 +- turbopack/crates/turbo-tasks-bytes/Cargo.toml | 1 + .../crates/turbo-tasks-bytes/src/bytes.rs | 33 ++ .../crates/turbo-tasks-bytes/src/stream.rs | 41 +++ turbopack/crates/turbo-tasks-env/Cargo.toml | 1 + turbopack/crates/turbo-tasks-env/src/lib.rs | 6 +- turbopack/crates/turbo-tasks-fs/Cargo.toml | 2 + turbopack/crates/turbo-tasks-fs/src/glob.rs | 41 ++- turbopack/crates/turbo-tasks-fs/src/lib.rs | 64 +++- turbopack/crates/turbo-tasks-fs/src/rope.rs | 48 +++ .../crates/turbo-tasks-fs/src/watcher.rs | 12 +- .../turbo-tasks-macros/src/value_macro.rs | 3 + turbopack/crates/turbo-tasks/Cargo.toml | 1 + turbopack/crates/turbo-tasks/src/id.rs | 99 ++++-- .../crates/turbo-tasks/src/invalidation.rs | 25 ++ .../crates/turbo-tasks/src/macro_helpers.rs | 1 + turbopack/crates/turbo-tasks/src/manager.rs | 3 +- turbopack/crates/turbo-tasks/src/raw_vc.rs | 5 +- turbopack/crates/turbo-tasks/src/read_ref.rs | 28 ++ .../src/serialization_invalidation.rs | 25 ++ turbopack/crates/turbo-tasks/src/state.rs | 66 ++-- turbopack/crates/turbo-tasks/src/util.rs | 42 ++- turbopack/crates/turbo-tasks/src/vc/mod.rs | 4 +- .../crates/turbo-tasks/src/vc/operation.rs | 24 +- .../crates/turbo-tasks/src/vc/resolved.rs | 4 +- turbopack/crates/turbopack-analyze/Cargo.toml | 1 + .../turbopack-analyze/src/split_chunk.rs | 9 +- turbopack/crates/turbopack-browser/Cargo.toml | 2 + .../turbopack-browser/src/chunking_context.rs | 6 + .../src/ecmascript/content_entry.rs | 1 + .../src/ecmascript/list/asset.rs | 3 + .../src/ecmascript/list/content.rs | 6 +- turbopack/crates/turbopack-core/Cargo.toml | 2 + .../src/chunk/availability_info.rs | 7 +- .../src/chunk/available_modules.rs | 7 +- .../src/chunk/chunk_item_batch.rs | 14 +- .../turbopack-core/src/chunk/chunking/mod.rs | 12 +- .../src/chunk/chunking_context.rs | 13 +- .../crates/turbopack-core/src/chunk/mod.rs | 18 +- .../turbopack-core/src/compile_time_info.rs | 61 +++- .../crates/turbopack-core/src/condition.rs | 5 +- .../turbopack-core/src/diagnostics/mod.rs | 4 +- turbopack/crates/turbopack-core/src/ident.rs | 3 + .../turbopack-core/src/introspect/mod.rs | 7 +- .../crates/turbopack-core/src/issue/mod.rs | 5 + .../src/module_graph/chunk_group_info.rs | 51 ++- .../turbopack-core/src/module_graph/mod.rs | 20 +- .../src/module_graph/module_batch.rs | 5 + .../src/module_graph/module_batches.rs | 13 +- .../src/module_graph/style_groups.rs | 1 + .../src/module_graph/traced_di_graph.rs | 12 +- turbopack/crates/turbopack-core/src/output.rs | 4 +- .../turbopack-core/src/reference_type.rs | 60 ++-- .../turbopack-core/src/resolve/alias_map.rs | 11 +- .../crates/turbopack-core/src/resolve/mod.rs | 22 +- .../turbopack-core/src/resolve/options.rs | 46 ++- .../turbopack-core/src/resolve/pattern.rs | 3 + .../turbopack-core/src/resolve/remap.rs | 5 +- .../turbopack-core/src/source_map/mod.rs | 25 ++ .../src/source_map/source_map_asset.rs | 13 +- .../crates/turbopack-core/src/source_pos.rs | 3 + turbopack/crates/turbopack-core/src/target.rs | 53 ++- turbopack/crates/turbopack-css/Cargo.toml | 2 + turbopack/crates/turbopack-css/src/lib.rs | 3 + .../crates/turbopack-css/src/module_asset.rs | 4 +- turbopack/crates/turbopack-css/src/process.rs | 6 +- .../crates/turbopack-dev-server/Cargo.toml | 2 + .../crates/turbopack-dev-server/src/html.rs | 14 +- .../src/source/asset_graph.rs | 5 +- .../turbopack-dev-server/src/source/mod.rs | 19 +- .../src/source/route_tree.rs | 17 +- .../turbopack-ecmascript-plugins/Cargo.toml | 1 + .../src/transform/emotion.rs | 14 +- .../src/transform/relay.rs | 23 +- .../crates/turbopack-ecmascript/Cargo.toml | 2 + .../src/analyzer/imports.rs | 1 + .../turbopack-ecmascript/src/analyzer/mod.rs | 17 +- .../turbopack-ecmascript/src/chunk/batch.rs | 14 +- .../turbopack-ecmascript/src/chunk/item.rs | 28 +- .../turbopack-ecmascript/src/code_gen.rs | 13 +- .../crates/turbopack-ecmascript/src/lib.rs | 9 + .../src/references/amd.rs | 17 +- .../src/references/async_module.rs | 19 +- .../src/references/cjs.rs | 37 ++- .../src/references/constant_condition.rs | 28 +- .../src/references/constant_value.rs | 5 +- .../src/references/dynamic_expression.rs | 27 +- .../src/references/esm/base.rs | 9 +- .../src/references/esm/binding.rs | 21 +- .../src/references/esm/dynamic.rs | 19 +- .../src/references/esm/export.rs | 46 ++- .../src/references/esm/meta.rs | 25 +- .../src/references/esm/module_id.rs | 19 +- .../src/references/esm/module_item.rs | 13 +- .../src/references/esm/url.rs | 18 +- .../src/references/exports_info.rs | 25 +- .../src/references/external_module.rs | 16 +- .../src/references/ident.rs | 15 +- .../src/references/member.rs | 15 +- .../src/references/mod.rs | 69 ++-- .../src/references/pattern_mapping.rs | 15 +- .../references/replace_parent_with_child.rs | 14 +- .../src/references/require_context.rs | 25 +- .../src/references/unreachable.rs | 14 +- .../src/references/worker.rs | 13 +- .../locals/chunk_item.rs | 2 +- .../src/side_effect_optimization/reference.rs | 21 +- .../crates/turbopack-ecmascript/src/utils.rs | 37 ++- .../turbopack-ecmascript/src/webpack/mod.rs | 1 + turbopack/crates/turbopack-image/Cargo.toml | 2 + .../crates/turbopack-image/src/process/mod.rs | 14 +- turbopack/crates/turbopack-node/Cargo.toml | 2 + .../turbopack-node/src/source_map/mod.rs | 2 +- .../turbopack-node/src/source_map/trace.rs | 31 ++ .../turbopack-node/src/transforms/postcss.rs | 16 +- .../turbopack-node/src/transforms/webpack.rs | 21 +- turbopack/crates/turbopack-nodejs/Cargo.toml | 2 + .../turbopack-nodejs/src/chunking_context.rs | 3 + .../crates/turbopack-test-utils/Cargo.toml | 1 + .../crates/turbopack-test-utils/src/jest.rs | 5 +- turbopack/crates/turbopack-tests/Cargo.toml | 1 + .../crates/turbopack-tests/tests/execution.rs | 12 +- turbopack/crates/turbopack-wasm/Cargo.toml | 1 + turbopack/crates/turbopack-wasm/src/source.rs | 3 + turbopack/crates/turbopack/Cargo.toml | 1 + .../src/module_options/match_mode.rs | 15 +- .../module_options/module_options_context.rs | 13 +- .../src/module_options/module_rule.rs | 5 +- .../src/module_options/rule_condition.rs | 5 +- .../src/module_options/transition_rule.rs | 11 +- 180 files changed, 2570 insertions(+), 433 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 39befb557cdfe..49889b0e8c831 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -407,6 +407,7 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" name = "auto-hash-map" version = "0.1.0" dependencies = [ + "bincode 2.0.1", "hashbrown 0.14.5", "rustc-hash 2.1.1", "serde", @@ -4274,6 +4275,7 @@ name = "next-api" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "byteorder", "either", "futures", @@ -4288,6 +4290,7 @@ dependencies = [ "tempfile", "tokio", "tracing", + "turbo-bincode", "turbo-rcstr", "turbo-tasks", "turbo-tasks-backend", @@ -4348,6 +4351,7 @@ dependencies = [ "anyhow", "async-trait", "base64 0.21.4", + "bincode 2.0.1", "either", "futures", "indexmap 2.9.0", @@ -4372,6 +4376,7 @@ dependencies = [ "swc_sourcemap", "thiserror 1.0.69", "tracing", + "turbo-bincode", "turbo-esregex", "turbo-rcstr", "turbo-tasks", @@ -4434,6 +4439,7 @@ name = "next-swc-napi" version = "0.0.0" dependencies = [ "anyhow", + "bincode 2.0.1", "console-subscriber", "dhat", "either", @@ -6771,7 +6777,9 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ + "bincode 2.0.1", "serde", + "unty", ] [[package]] @@ -9117,6 +9125,7 @@ name = "turbo-esregex" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "regex", "regress", "serde", @@ -9165,6 +9174,7 @@ version = "0.1.0" name = "turbo-rcstr" version = "0.1.0" dependencies = [ + "bincode 2.0.1", "bytes-str", "codspeed-criterion-compat", "napi", @@ -9204,6 +9214,7 @@ dependencies = [ "anyhow", "async-trait", "auto-hash-map", + "bincode 2.0.1", "codspeed-criterion-compat", "concurrent-queue", "dashmap 6.1.0", @@ -9243,6 +9254,7 @@ dependencies = [ "anyhow", "arc-swap", "auto-hash-map", + "bincode 2.0.1", "bitfield", "byteorder", "codspeed-criterion-compat", @@ -9296,6 +9308,7 @@ name = "turbo-tasks-bytes" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "bytes", "futures", "serde", @@ -9310,6 +9323,7 @@ version = "0.1.0" dependencies = [ "anyhow", "dotenvs", + "turbo-bincode", "turbo-rcstr", "turbo-tasks", "turbo-tasks-fs", @@ -9340,6 +9354,7 @@ version = "0.1.0" dependencies = [ "anyhow", "auto-hash-map", + "bincode 2.0.1", "bitflags 1.3.2", "bytes", "codspeed-criterion-compat", @@ -9365,6 +9380,7 @@ dependencies = [ "tokio", "tracing", "triomphe 0.1.12", + "turbo-bincode", "turbo-rcstr", "turbo-tasks", "turbo-tasks-backend", @@ -9455,6 +9471,7 @@ name = "turbopack" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "either", "regex", "rustc-hash 2.1.1", @@ -9487,6 +9504,7 @@ name = "turbopack-analyze" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "rustc-hash 2.1.1", "serde", "serde_json", @@ -9530,12 +9548,14 @@ name = "turbopack-browser" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "either", "indoc", "serde", "serde_json", "serde_qs", "tracing", + "turbo-bincode", "turbo-rcstr", "turbo-tasks", "turbo-tasks-fs", @@ -9611,6 +9631,7 @@ dependencies = [ "anyhow", "async-trait", "auto-hash-map", + "bincode 2.0.1", "bitfield", "browserslist-rs", "bytes-str", @@ -9634,6 +9655,7 @@ dependencies = [ "swc_sourcemap", "tokio", "tracing", + "turbo-bincode", "turbo-prehash", "turbo-rcstr", "turbo-tasks", @@ -9666,6 +9688,7 @@ name = "turbopack-css" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "indoc", "lightningcss", "parcel_selectors", @@ -9676,6 +9699,7 @@ dependencies = [ "swc_core", "tokio", "tracing", + "turbo-bincode", "turbo-rcstr", "turbo-tasks", "turbo-tasks-fs", @@ -9691,6 +9715,7 @@ dependencies = [ "anyhow", "async-compression", "auto-hash-map", + "bincode 2.0.1", "futures", "hyper 0.14.32", "hyper-tungstenite", @@ -9707,6 +9732,7 @@ dependencies = [ "tokio-stream", "tokio-util", "tracing", + "turbo-bincode", "turbo-rcstr", "turbo-tasks", "turbo-tasks-backend", @@ -9727,6 +9753,7 @@ dependencies = [ "anyhow", "async-trait", "auto-hash-map", + "bincode 2.0.1", "bytes-str", "codspeed-criterion-compat", "dashmap 6.1.0", @@ -9750,6 +9777,7 @@ dependencies = [ "swc_sourcemap", "tokio", "tracing", + "turbo-bincode", "turbo-esregex", "turbo-rcstr", "turbo-tasks", @@ -9782,6 +9810,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", + "bincode 2.0.1", "indexmap 2.9.0", "rustc-hash 2.1.1", "serde", @@ -9834,6 +9863,7 @@ version = "0.1.0" dependencies = [ "anyhow", "base64 0.21.4", + "bincode 2.0.1", "image", "mime", "once_cell", @@ -9841,6 +9871,7 @@ dependencies = [ "rustc-hash 2.1.1", "serde", "serde_with", + "turbo-bincode", "turbo-rcstr", "turbo-tasks", "turbo-tasks-fs", @@ -9908,6 +9939,7 @@ dependencies = [ "async-stream", "async-trait", "base64 0.21.4", + "bincode 2.0.1", "const_format", "either", "futures", @@ -9923,6 +9955,7 @@ dependencies = [ "serde_with", "tokio", "tracing", + "turbo-bincode", "turbo-rcstr", "turbo-tasks", "turbo-tasks-bytes", @@ -9939,8 +9972,10 @@ name = "turbopack-nodejs" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "indoc", "tracing", + "turbo-bincode", "turbo-rcstr", "turbo-tasks", "turbo-tasks-fs", @@ -9998,6 +10033,7 @@ name = "turbopack-test-utils" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "once_cell", "regex", "rustc-hash 2.1.1", @@ -10016,6 +10052,7 @@ name = "turbopack-tests" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "dunce", "once_cell", "rustc-hash 2.1.1", @@ -10112,6 +10149,7 @@ name = "turbopack-wasm" version = "0.1.0" dependencies = [ "anyhow", + "bincode 2.0.1", "indoc", "serde", "turbo-rcstr", @@ -10468,8 +10506,7 @@ dependencies = [ [[package]] name = "virtue" version = "0.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" +source = "git+https://github.com/bgw/virtue.git?branch=bgw%2Ffix-generic-default-parsing#e386f35cf7f22d04a4db32231904cbe5dc52c01d" [[package]] name = "vlq" diff --git a/Cargo.toml b/Cargo.toml index c57eec013feff..4ad0d8b247422 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -455,11 +455,12 @@ serde_bytes = "0.11.15" serde_path_to_error = "0.1.16" serde_qs = "0.13.0" serde_with = "3.12.0" -smallvec = { version = "1.13.1", features = [ +smallvec = { version = "1.15.1", features = [ "serde", "const_generics", "union", "const_new", + "impl_bincode", ] } swc_sourcemap = "9.3.4" strsim = "0.11.1" @@ -484,4 +485,5 @@ inventory = "0.3.21" [patch.crates-io] bincode = { git = "https://github.com/bgw/bincode.git", branch = "bgw/patches" } +virtue = { git = "https://github.com/bgw/virtue.git", branch = "bgw/fix-generic-default-parsing" } mdxjs = { git = "https://github.com/mischnic/mdxjs-rs.git", branch = "swc-core-32" } diff --git a/crates/napi/Cargo.toml b/crates/napi/Cargo.toml index a0a3ddec1f039..f754b9ab80b84 100644 --- a/crates/napi/Cargo.toml +++ b/crates/napi/Cargo.toml @@ -56,6 +56,7 @@ ignored = [ [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } console-subscriber = { workspace = true, optional = true } dhat = { workspace = true, optional = true } either = { workspace = true } diff --git a/crates/napi/src/next_api/project.rs b/crates/napi/src/next_api/project.rs index 3b82cb491e8fe..5b01d39529ffc 100644 --- a/crates/napi/src/next_api/project.rs +++ b/crates/napi/src/next_api/project.rs @@ -1,6 +1,7 @@ use std::{borrow::Cow, io::Write, path::PathBuf, sync::Arc, thread, time::Duration}; use anyhow::{Context, Result, anyhow, bail}; +use bincode::{Decode, Encode}; use flate2::write::GzEncoder; use futures_util::TryFutureExt; use napi::{ @@ -1529,6 +1530,8 @@ pub fn project_compilation_events_subscribe( Serialize, TaskInput, TraceRawVcs, + Encode, + Decode, )] pub struct StackFrame { pub is_server: bool, diff --git a/crates/next-api/Cargo.toml b/crates/next-api/Cargo.toml index 71b93963e174c..1c2d5d32e4c65 100644 --- a/crates/next-api/Cargo.toml +++ b/crates/next-api/Cargo.toml @@ -14,6 +14,7 @@ workspace = true [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } byteorder = { workspace = true } either = { workspace = true } futures = { workspace = true } @@ -26,6 +27,7 @@ serde = { workspace = true } serde_json = { workspace = true } swc_core = { workspace = true } tracing = { workspace = true } +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-hash = { workspace = true } diff --git a/crates/next-api/src/app.rs b/crates/next-api/src/app.rs index db8fb9b056655..1ef321611db41 100644 --- a/crates/next-api/src/app.rs +++ b/crates/next-api/src/app.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use next_core::{ app_structure::{ AppPageLoaderTree, CollectedRootParams, Entrypoint as AppEntrypoint, @@ -1036,13 +1037,27 @@ pub fn app_entry_point_to_route( #[turbo_tasks::value(transparent)] struct OutputAssetsWithAvailability((ResolvedVc, AvailabilityInfo)); -#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, Eq, Debug, TraceRawVcs, NonLocalValue)] +#[derive( + Copy, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, + Debug, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, +)] enum AppPageEndpointType { Html, Rsc, } -#[derive(Clone, Serialize, Deserialize, PartialEq, Eq, Debug, TraceRawVcs, NonLocalValue)] +#[derive( + Clone, Serialize, Deserialize, PartialEq, Eq, Debug, TraceRawVcs, NonLocalValue, Encode, Decode, +)] enum AppEndpointType { Page { ty: AppPageEndpointType, diff --git a/crates/next-api/src/client_references.rs b/crates/next-api/src/client_references.rs index 5428b1729956c..1dc1923c267ea 100644 --- a/crates/next-api/src/client_references.rs +++ b/crates/next-api/src/client_references.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use next_core::{ next_client_reference::{CssClientReferenceModule, EcmascriptClientReferenceModule}, next_server_component::server_component_module::NextServerComponentModule, @@ -12,7 +13,17 @@ use turbopack::css::chunk::CssChunkPlaceable; use turbopack_core::{module::Module, module_graph::SingleModuleGraph}; #[derive( - Copy, Clone, Serialize, Deserialize, Eq, PartialEq, TraceRawVcs, ValueDebugFormat, NonLocalValue, + Copy, + Clone, + Serialize, + Deserialize, + Eq, + PartialEq, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Encode, + Decode, )] pub enum ClientManifestEntryType { EcmascriptClientReference { diff --git a/crates/next-api/src/dynamic_imports.rs b/crates/next-api/src/dynamic_imports.rs index 436a375f13f2f..42cc6be791f24 100644 --- a/crates/next-api/src/dynamic_imports.rs +++ b/crates/next-api/src/dynamic_imports.rs @@ -20,6 +20,7 @@ //! won't occur use anyhow::{Context, Result}; +use bincode::{Decode, Encode}; use next_core::{ next_app::ClientReferencesChunks, next_client_reference::EcmascriptClientReferenceModule, next_dynamic::NextDynamicEntryModule, @@ -102,6 +103,7 @@ pub(crate) async fn collect_next_dynamic_chunks( #[turbo_tasks::value(transparent)] #[derive(Default)] pub struct DynamicImportedChunks( + #[bincode(with = "turbo_bincode::indexmap")] pub FxIndexMap< ResolvedVc, (ResolvedVc, ResolvedVc), @@ -109,7 +111,16 @@ pub struct DynamicImportedChunks( ); #[derive( - Clone, PartialEq, Eq, ValueDebugFormat, Serialize, Deserialize, TraceRawVcs, NonLocalValue, + Clone, + PartialEq, + Eq, + ValueDebugFormat, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, )] pub enum DynamicImportEntriesMapType { DynamicEntry(ResolvedVc), @@ -118,7 +129,8 @@ pub enum DynamicImportEntriesMapType { #[turbo_tasks::value(transparent)] pub struct DynamicImportEntries( - pub FxIndexMap>, DynamicImportEntriesMapType>, + #[bincode(with = "turbo_bincode::indexmap")] + pub FxIndexMap>, DynamicImportEntriesMapType>, ); #[turbo_tasks::function] diff --git a/crates/next-api/src/entrypoints.rs b/crates/next-api/src/entrypoints.rs index 9567dfb0154c0..732e82d60bfc9 100644 --- a/crates/next-api/src/entrypoints.rs +++ b/crates/next-api/src/entrypoints.rs @@ -8,6 +8,7 @@ use crate::{ #[turbo_tasks::value(shared)] pub struct Entrypoints { + #[bincode(with = "turbo_bincode::indexmap")] pub routes: FxIndexMap, pub middleware: Option, pub instrumentation: Option, diff --git a/crates/next-api/src/module_graph.rs b/crates/next-api/src/module_graph.rs index 488749f2ab0d6..b236d12267881 100644 --- a/crates/next-api/src/module_graph.rs +++ b/crates/next-api/src/module_graph.rs @@ -756,7 +756,7 @@ impl Issue for CssGlobalImportIssue { type FxModuleNameMap = FxIndexMap>, RcStr>; #[turbo_tasks::value(transparent)] -struct ModuleNameMap(pub FxModuleNameMap); +struct ModuleNameMap(#[bincode(with = "turbo_bincode::indexmap")] pub FxModuleNameMap); #[tracing::instrument(level = "info", name = "validate pages css imports", skip_all)] #[turbo_tasks::function] diff --git a/crates/next-api/src/next_server_nft.rs b/crates/next-api/src/next_server_nft.rs index 2732409b6b51f..527f4ff23a3d9 100644 --- a/crates/next-api/src/next_server_nft.rs +++ b/crates/next-api/src/next_server_nft.rs @@ -1,6 +1,7 @@ use std::collections::BTreeSet; use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use either::Either; use next_core::{get_next_package, next_server::get_tracing_compile_time_info}; use serde::{Deserialize, Serialize}; @@ -29,7 +30,18 @@ use crate::{ }; #[derive( - PartialEq, Eq, TraceRawVcs, NonLocalValue, Deserialize, Serialize, Debug, Clone, Hash, TaskInput, + PartialEq, + Eq, + TraceRawVcs, + NonLocalValue, + Deserialize, + Serialize, + Debug, + Clone, + Hash, + TaskInput, + Encode, + Decode, )] enum ServerNftType { Minimal, diff --git a/crates/next-api/src/operation.rs b/crates/next-api/src/operation.rs index 4056a1cf7e7f2..f8cd7488c80ec 100644 --- a/crates/next-api/src/operation.rs +++ b/crates/next-api/src/operation.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{ @@ -22,6 +23,7 @@ use crate::{ /// This is needed to call `write_to_disk` which expects an `OperationVc`. #[turbo_tasks::value(shared)] pub struct EntrypointsOperation { + #[bincode(with = "turbo_bincode::indexmap")] pub routes: FxIndexMap, pub middleware: Option, pub instrumentation: Option, @@ -204,13 +206,33 @@ async fn pick_endpoint( Ok(Vc::cell(endpoint)) } -#[derive(Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, ValueDebugFormat, NonLocalValue)] +#[derive( + Serialize, + Deserialize, + TraceRawVcs, + PartialEq, + Eq, + ValueDebugFormat, + NonLocalValue, + Encode, + Decode, +)] pub struct InstrumentationOperation { pub node_js: OperationVc, pub edge: OperationVc, } -#[derive(Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, ValueDebugFormat, NonLocalValue)] +#[derive( + Serialize, + Deserialize, + TraceRawVcs, + PartialEq, + Eq, + ValueDebugFormat, + NonLocalValue, + Encode, + Decode, +)] pub struct MiddlewareOperation { pub endpoint: OperationVc, pub is_proxy: bool, @@ -244,6 +266,8 @@ pub enum RouteOperation { Clone, Debug, NonLocalValue, + Encode, + Decode, )] pub struct AppPageRouteOperation { pub original_name: RcStr, diff --git a/crates/next-api/src/pages.rs b/crates/next-api/src/pages.rs index 96a7382219a5e..228d52886d149 100644 --- a/crates/next-api/src/pages.rs +++ b/crates/next-api/src/pages.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use futures::future::BoxFuture; use next_core::{ PageLoaderAsset, create_page_loader_entry_module, get_asset_path_from_pathname, @@ -596,6 +597,8 @@ struct PageEndpoint { TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] enum PageEndpointType { Api, diff --git a/crates/next-api/src/project.rs b/crates/next-api/src/project.rs index 1a34b46902451..c87270f0eab91 100644 --- a/crates/next-api/src/project.rs +++ b/crates/next-api/src/project.rs @@ -1,6 +1,7 @@ use std::time::Duration; use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use indexmap::map::Entry; use next_core::{ app_structure::find_app_dir, @@ -99,6 +100,8 @@ use crate::{ TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct DraftModeOptions { @@ -121,6 +124,8 @@ pub struct DraftModeOptions { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct WatchOptions { @@ -144,6 +149,8 @@ pub struct WatchOptions { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct ProjectOptions { @@ -257,6 +264,8 @@ pub struct PartialProjectOptions { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct DefineEnv { @@ -265,13 +274,33 @@ pub struct DefineEnv { pub nodejs: Vec<(RcStr, Option)>, } -#[derive(Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, ValueDebugFormat, NonLocalValue)] +#[derive( + Serialize, + Deserialize, + TraceRawVcs, + PartialEq, + Eq, + ValueDebugFormat, + NonLocalValue, + Encode, + Decode, +)] pub struct Middleware { pub endpoint: ResolvedVc>, pub is_proxy: bool, } -#[derive(Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, ValueDebugFormat, NonLocalValue)] +#[derive( + Serialize, + Deserialize, + TraceRawVcs, + PartialEq, + Eq, + ValueDebugFormat, + NonLocalValue, + Encode, + Decode, +)] pub struct Instrumentation { pub node_js: ResolvedVc>, pub edge: ResolvedVc>, diff --git a/crates/next-api/src/route.rs b/crates/next-api/src/route.rs index 2dd77f52dd19e..11ff78be4cea1 100644 --- a/crates/next-api/src/route.rs +++ b/crates/next-api/src/route.rs @@ -1,6 +1,7 @@ use std::fmt::Display; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{ @@ -24,6 +25,8 @@ use crate::{operation::OptionEndpoint, paths::ServerPath, project::Project}; Clone, Debug, NonLocalValue, + Encode, + Decode, )] pub struct AppPageRoute { pub original_name: RcStr, @@ -84,6 +87,8 @@ pub trait Endpoint { Clone, Debug, NonLocalValue, + Encode, + Decode, )] pub enum EndpointGroupKey { Instrumentation, @@ -119,6 +124,8 @@ impl Display for EndpointGroupKey { Clone, Debug, NonLocalValue, + Encode, + Decode, )] pub struct EndpointGroup { pub primary: Vec>>, @@ -266,4 +273,4 @@ pub enum EndpointOutputPaths { /// The routes as map from pathname to route. (pathname includes the leading /// slash) #[turbo_tasks::value(transparent)] -pub struct Routes(FxIndexMap); +pub struct Routes(#[bincode(with = "turbo_bincode::indexmap")] FxIndexMap); diff --git a/crates/next-api/src/server_actions.rs b/crates/next-api/src/server_actions.rs index 258bc4d2a765a..cfb604eb0c97f 100644 --- a/crates/next-api/src/server_actions.rs +++ b/crates/next-api/src/server_actions.rs @@ -432,6 +432,7 @@ impl AllActions { #[turbo_tasks::value] #[derive(Debug)] pub struct ActionMap { + #[bincode(with = "turbo_bincode::indexmap")] pub actions: FxIndexMap, pub entry_path: String, pub entry_query: String, @@ -444,7 +445,10 @@ struct OptionActionMap(Option>); type LayerAndActions = (ActionLayer, ResolvedVc); /// A mapping of every module module containing Server Actions, mapping to its layer and actions. #[turbo_tasks::value(transparent)] -pub struct AllModuleActions(FxIndexMap>, LayerAndActions>); +pub struct AllModuleActions( + #[bincode(with = "turbo_bincode::indexmap")] + FxIndexMap>, LayerAndActions>, +); #[turbo_tasks::function] pub async fn map_server_actions(graph: Vc) -> Result> { diff --git a/crates/next-api/src/versioned_content_map.rs b/crates/next-api/src/versioned_content_map.rs index 7aa8d232e9724..cbf23eee6d80d 100644 --- a/crates/next-api/src/versioned_content_map.rs +++ b/crates/next-api/src/versioned_content_map.rs @@ -1,4 +1,5 @@ use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use next_core::emit_assets; use rustc_hash::{FxHashMap, FxHashSet}; use serde::{Deserialize, Serialize}; @@ -25,6 +26,8 @@ use turbopack_core::{ Deserialize, Debug, NonLocalValue, + Encode, + Decode, )] struct MapEntry { assets_operation: OperationVc, @@ -38,19 +41,48 @@ unsafe impl OperationValue for MapEntry {} #[turbo_tasks::value(transparent, operation)] struct OptionMapEntry(Option); -#[turbo_tasks::value] -#[derive(Debug)] +#[derive( + Clone, + TraceRawVcs, + PartialEq, + Eq, + ValueDebugFormat, + Serialize, + Deserialize, + Debug, + NonLocalValue, + Encode, + Decode, +)] pub struct PathToOutputOperation( /// We need to use an operation for outputs as it's stored for later usage and we want to /// reconnect this operation when it's received from the map again. /// - /// It may not be 100% correct for the key (`FileSystemPath`) to be in a `ResolvedVc` here, but - /// it's impractical to make it an `OperationVc`/`OperationValue`, and it's unlikely to + /// It may not be 100% correct for the key (`FileSystemPath`) to contain a `ResolvedVc` here, + /// but it's impractical to make it an `OperationVc`/`OperationValue`, and it's unlikely to /// change/break? - FxHashMap>>, + FxHashMap, ); -// HACK: This is technically incorrect because the map's key is a `ResolvedVc`... +#[derive( + Clone, + Default, + TraceRawVcs, + PartialEq, + Eq, + ValueDebugFormat, + Serialize, + Deserialize, + Debug, + NonLocalValue, + Encode, + Decode, +)] +struct ExpandedOutputAssetsOperationSet( + #[bincode(with = "turbo_bincode::indexset")] FxIndexSet>, +); + +// HACK: This is technically incorrect because the map's key contains a `ResolvedVc`... unsafe impl OperationValue for PathToOutputOperation {} // A precomputed map for quick access to output asset by filepath @@ -133,7 +165,12 @@ impl VersionedContentMap { let mut stale_assets = map.0.keys().cloned().collect::>(); for (k, _) in entries.iter().flatten() { - let res = map.0.entry(k.clone()).or_default().insert(assets_operation); + let res = map + .0 + .entry(k.clone()) + .or_default() + .0 + .insert(assets_operation); stale_assets.remove(k); changed = changed || res; } @@ -145,6 +182,7 @@ impl VersionedContentMap { .get_mut(k) // guaranteed .unwrap() + .0 .swap_remove(&assets_operation); changed = changed || res } @@ -235,7 +273,7 @@ impl VersionedContentMap { fn raw_get(&self, path: FileSystemPath) -> Vc { let assets = { let map = &self.map_path_to_op.get().0; - map.get(&path).and_then(|m| m.iter().next().copied()) + map.get(&path).and_then(|m| m.0.iter().next().copied()) }; let Some(assets) = assets else { return Vc::cell(None); diff --git a/crates/next-core/Cargo.toml b/crates/next-core/Cargo.toml index 90f77cbcd556f..591e2d13dd39c 100644 --- a/crates/next-core/Cargo.toml +++ b/crates/next-core/Cargo.toml @@ -15,27 +15,28 @@ workspace = true anyhow = { workspace = true } async-trait = { workspace = true } base64 = "0.21.0" +allsorts = { workspace = true } +bincode = { workspace = true } either = { workspace = true, features = ["serde"] } +futures = { workspace = true } +indexmap = { workspace = true, features = ["serde"] } +indoc = { workspace = true } +itertools = { workspace = true } +mime_guess = "2.0.4" once_cell = { workspace = true } +percent-encoding = "2.3.1" qstring = { workspace = true } +react_remove_properties = { workspace = true } regex = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -indexmap = { workspace = true, features = ["serde"] } -mime_guess = "2.0.4" -indoc = { workspace = true } -allsorts = { workspace = true } -futures = { workspace = true } -thiserror = { workspace = true } -tracing = { workspace = true } regress = { workspace = true } -rustc-hash = { workspace = true } -react_remove_properties = { workspace = true } remove_console = { workspace = true } -itertools = { workspace = true } -percent-encoding = "2.3.1" +rustc-hash = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } serde_path_to_error = { workspace = true } swc_sourcemap = { workspace = true } +thiserror = { workspace = true } +tracing = { workspace = true } swc_core = { workspace = true, features = [ "base", @@ -59,6 +60,7 @@ modularize_imports = { workspace = true } next-custom-transforms = { workspace = true } next-taskless = { workspace = true } +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-esregex = { workspace = true } turbo-tasks = { workspace = true } diff --git a/crates/next-core/src/app_structure.rs b/crates/next-core/src/app_structure.rs index f4b973458394e..0e39928fd58e1 100644 --- a/crates/next-core/src/app_structure.rs +++ b/crates/next-core/src/app_structure.rs @@ -1,6 +1,7 @@ use std::collections::BTreeMap; use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use indexmap::map::{Entry, OccupiedEntry}; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; @@ -86,7 +87,9 @@ impl AppDirModules { } /// A single metadata file plus an optional "alt" text file. -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, TraceRawVcs, NonLocalValue)] +#[derive( + Clone, Debug, Serialize, Deserialize, PartialEq, Eq, TraceRawVcs, NonLocalValue, Encode, Decode, +)] pub enum MetadataWithAltItem { Static { path: FileSystemPath, @@ -99,7 +102,18 @@ pub enum MetadataWithAltItem { /// A single metadata file. #[derive( - Clone, Debug, Hash, Serialize, Deserialize, PartialEq, Eq, TaskInput, TraceRawVcs, NonLocalValue, + Clone, + Debug, + Hash, + Serialize, + Deserialize, + PartialEq, + Eq, + TaskInput, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, )] pub enum MetadataItem { Static { path: FileSystemPath }, @@ -146,7 +160,17 @@ impl From for MetadataItem { /// Metadata file that can be placed in any segment of the app directory. #[derive( - Default, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, TraceRawVcs, NonLocalValue, + Default, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, )] pub struct Metadata { #[serde(skip_serializing_if = "Vec::is_empty", default)] @@ -412,6 +436,7 @@ async fn get_directory_tree_internal( pub struct AppPageLoaderTree { pub page: AppPage, pub segment: RcStr, + #[bincode(with = "turbo_bincode::indexmap")] pub parallel_routes: FxIndexMap, pub modules: AppDirModules, pub global_metadata: ResolvedVc, @@ -516,6 +541,8 @@ impl ValueDefault for FileSystemPathVec { Debug, TaskInput, NonLocalValue, + Encode, + Decode, )] pub enum Entrypoint { AppPage { @@ -554,7 +581,9 @@ impl Entrypoint { } #[turbo_tasks::value(transparent)] -pub struct Entrypoints(FxIndexMap); +pub struct Entrypoints( + #[bincode(with = "turbo_bincode::indexmap")] FxIndexMap, +); fn is_parallel_route(name: &str) -> bool { name.starts_with('@') @@ -768,7 +797,7 @@ pub fn get_entrypoints( } #[turbo_tasks::value(transparent)] -pub struct CollectedRootParams(FxIndexSet); +pub struct CollectedRootParams(#[bincode(with = "turbo_bincode::indexset")] FxIndexSet); #[turbo_tasks::function] pub async fn collect_root_params( diff --git a/crates/next-core/src/bootstrap.rs b/crates/next-core/src/bootstrap.rs index 6134147fa7ec2..17d341c98bc6f 100644 --- a/crates/next-core/src/bootstrap.rs +++ b/crates/next-core/src/bootstrap.rs @@ -32,7 +32,7 @@ pub fn route_bootstrap( } #[turbo_tasks::value(transparent)] -pub struct BootstrapConfig(FxIndexMap); +pub struct BootstrapConfig(#[bincode(with = "turbo_bincode::indexmap")] FxIndexMap); #[turbo_tasks::value_impl] impl BootstrapConfig { diff --git a/crates/next-core/src/next_app/app_client_references_chunks.rs b/crates/next-core/src/next_app/app_client_references_chunks.rs index 552768dc589cd..21b2e04dfffd9 100644 --- a/crates/next-core/src/next_app/app_client_references_chunks.rs +++ b/crates/next-core/src/next_app/app_client_references_chunks.rs @@ -22,10 +22,13 @@ use crate::{ #[turbo_tasks::value] pub struct ClientReferencesChunks { + #[bincode(with = "turbo_bincode::indexmap")] pub client_component_client_chunks: FxIndexMap>, + #[bincode(with = "turbo_bincode::indexmap")] pub client_component_ssr_chunks: FxIndexMap>, + #[bincode(with = "turbo_bincode::indexmap")] pub layout_segment_client_chunks: FxIndexMap, ResolvedVc>, } diff --git a/crates/next-core/src/next_app/mod.rs b/crates/next-core/src/next_app/mod.rs index c10501a3f8075..b804fe2e78e92 100644 --- a/crates/next-core/src/next_app/mod.rs +++ b/crates/next-core/src/next_app/mod.rs @@ -12,6 +12,7 @@ use std::{ }; use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{NonLocalValue, TaskInput, trace::TraceRawVcs}; @@ -38,6 +39,8 @@ pub use crate::next_app::{ TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub enum PageSegment { /// e.g. `/dashboard` @@ -143,6 +146,8 @@ impl Display for PageSegment { TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub enum PageType { Page, @@ -173,6 +178,8 @@ impl Display for PageType { TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub struct AppPage(pub Vec); @@ -357,6 +364,8 @@ impl PartialOrd for AppPage { TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub enum PathSegment { /// e.g. `/dashboard` @@ -409,6 +418,8 @@ impl Display for PathSegment { TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub struct AppPath(pub Vec); diff --git a/crates/next-core/src/next_client_reference/visit_client_reference.rs b/crates/next-core/src/next_client_reference/visit_client_reference.rs index 5d11617b600c1..a7a5903baf8a3 100644 --- a/crates/next-core/src/next_client_reference/visit_client_reference.rs +++ b/crates/next-core/src/next_client_reference/visit_client_reference.rs @@ -1,6 +1,7 @@ use std::future::Future; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use tracing::{Instrument, Level, Span}; use turbo_rcstr::RcStr; @@ -36,6 +37,8 @@ use crate::{ ValueDebugFormat, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub struct ClientReference { pub server_component: Option>, @@ -54,6 +57,8 @@ pub struct ClientReference { ValueDebugFormat, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub enum ClientReferenceType { EcmascriptClientReference(ResolvedVc), diff --git a/crates/next-core/src/next_config.rs b/crates/next-core/src/next_config.rs index 7a1f1e702187b..832861c1ae267 100644 --- a/crates/next-core/src/next_config.rs +++ b/crates/next-core/src/next_config.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use either::Either; use rustc_hash::FxHashSet; use serde::{Deserialize, Deserializer, Serialize}; @@ -49,7 +50,9 @@ struct CustomRoutes { } #[turbo_tasks::value(transparent)] -pub struct ModularizeImports(FxIndexMap); +pub struct ModularizeImports( + #[bincode(with = "turbo_bincode::indexmap")] FxIndexMap, +); #[turbo_tasks::value(transparent)] #[derive(Clone, Debug)] @@ -87,7 +90,9 @@ pub struct NextConfig { cache_max_memory_size: Option, /// custom path to a cache handler to use cache_handler: Option, + #[bincode(with_serde)] cache_handlers: Option>, + #[bincode(with = "turbo_bincode::serde_json")] env: FxIndexMap, experimental: ExperimentalConfig, images: ImageConfig, @@ -96,10 +101,12 @@ pub struct NextConfig { react_production_profiling: Option, react_strict_mode: Option, transpile_packages: Option>, + #[bincode(with = "turbo_bincode::serde_json")] modularize_imports: Option>, dist_dir: RcStr, dist_dir_root: RcStr, deployment_id: Option, + #[bincode(with = "turbo_bincode::serde_json")] sass_options: Option, trailing_slash: Option, asset_prefix: Option, @@ -112,7 +119,9 @@ pub struct NextConfig { output: Option, turbopack: Option, production_browser_source_maps: bool, + #[bincode(with = "turbo_bincode::serde_json")] output_file_tracing_includes: Option, + #[bincode(with = "turbo_bincode::serde_json")] output_file_tracing_excludes: Option, // TODO: This option is not respected, it uses Turbopack's root instead. output_file_tracing_root: Option, @@ -142,20 +151,25 @@ pub struct NextConfig { eslint: EslintConfig, exclude_default_moment_locales: bool, // this can be a function in js land + #[bincode(with = "turbo_bincode::serde_json")] export_path_map: Option, // this is a function in js land + #[bincode(with = "turbo_bincode::serde_json")] generate_build_id: Option, generate_etags: bool, http_agent_options: HttpAgentConfig, on_demand_entries: OnDemandEntriesConfig, powered_by_header: bool, + #[bincode(with = "turbo_bincode::serde_json")] public_runtime_config: FxIndexMap, + #[bincode(with = "turbo_bincode::serde_json")] server_runtime_config: FxIndexMap, static_page_generation_timeout: f64, target: Option, typescript: TypeScriptConfig, use_file_system_public_routes: bool, cache_components: Option, + #[bincode(with = "turbo_bincode::serde_json")] webpack: Option, } @@ -171,7 +185,17 @@ impl NextConfig { } #[derive( - Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum CrossOriginConfig { @@ -192,6 +216,8 @@ pub struct OptionCrossOriginConfig(Option); TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] struct EslintConfig { @@ -209,6 +235,8 @@ struct EslintConfig { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum BuildActivityPositions { @@ -229,6 +257,8 @@ pub enum BuildActivityPositions { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct DevIndicatorsOptions { @@ -237,7 +267,16 @@ pub struct DevIndicatorsOptions { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(untagged)] pub enum DevIndicatorsConfig { @@ -255,6 +294,8 @@ pub enum DevIndicatorsConfig { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] struct OnDemandEntriesConfig { @@ -272,6 +313,8 @@ struct OnDemandEntriesConfig { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] struct HttpAgentConfig { @@ -279,7 +322,17 @@ struct HttpAgentConfig { } #[derive( - Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct DomainLocale { @@ -290,7 +343,17 @@ pub struct DomainLocale { } #[derive( - Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct I18NConfig { @@ -304,7 +367,17 @@ pub struct I18NConfig { pub struct OptionI18NConfig(Option); #[derive( - Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum OutputType { @@ -329,6 +402,8 @@ pub struct OptionOutputType(Option); Deserialize, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(tag = "type", rename_all = "kebab-case")] pub enum RouteHas { @@ -375,7 +450,16 @@ pub struct Header { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub enum RedirectStatus { @@ -384,7 +468,16 @@ pub enum RedirectStatus { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct Redirect { @@ -403,7 +496,9 @@ pub struct Redirect { pub status: RedirectStatus, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue)] +#[derive( + Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, Encode, Decode, +)] #[serde(rename_all = "camelCase")] pub struct Rewrite { pub source: String, @@ -437,6 +532,8 @@ pub struct Rewrites { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct TypeScriptConfig { @@ -496,7 +593,16 @@ impl Default for ImageConfig { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum ImageLoader { @@ -508,7 +614,16 @@ pub enum ImageLoader { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] pub enum ImageFormat { #[serde(rename = "image/webp")] @@ -527,6 +642,8 @@ pub enum ImageFormat { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct RemotePattern { @@ -540,7 +657,16 @@ pub struct RemotePattern { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum RemotePatternProtocol { @@ -558,12 +684,14 @@ pub enum RemotePatternProtocol { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct TurbopackConfig { - /// This option has been replaced by `rules`. - pub loaders: Option, + #[bincode(with = "turbo_bincode::serde_json")] pub rules: Option>, + #[bincode(with = "turbo_bincode::serde_json")] pub resolve_alias: Option>, pub resolve_extensions: Option>, pub debug_ids: Option, @@ -731,7 +859,16 @@ pub enum ModuleIds { pub struct OptionModuleIds(pub Option); #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(untagged)] pub enum MdxRsOptions { @@ -771,7 +908,16 @@ pub struct ReactCompilerOptions { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(untagged)] pub enum ReactCompilerOptionsOrBoolean { @@ -793,6 +939,8 @@ pub struct OptionalReactCompilerOptions(Option> ValueDebugFormat, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct ExperimentalConfig { @@ -810,6 +958,7 @@ pub struct ExperimentalConfig { /// @see [api reference](https://nextjs.org/docs/app/api-reference/next-config-js/mdxRs) mdx_rs: Option, strict_next_head: Option, + #[bincode(with = "turbo_bincode::serde_json")] swc_plugins: Option>, external_middleware_rewrites_resolve: Option, scroll_restoration: Option, @@ -818,6 +967,7 @@ pub struct ExperimentalConfig { middleware_prefetch: Option, /// optimizeCss can be boolean or critters' option object /// Use Record as critters doesn't export its Option type ([link](https://github.com/GoogleChromeLabs/critters/blob/a590c05f9197b656d2aeaae9369df2483c26b072/packages/critters/src/index.d.ts)) + #[bincode(with = "turbo_bincode::serde_json")] optimize_css: Option, next_script_workers: Option, web_vitals_attribution: Option>, @@ -835,6 +985,7 @@ pub struct ExperimentalConfig { adjust_font_fallbacks_with_size_adjust: Option, after: Option, app_document_preloading: Option, + #[bincode(with = "turbo_bincode::serde_json")] cache_life: Option>, case_sensitive_routes: Option, cpus: Option, @@ -842,6 +993,7 @@ pub struct ExperimentalConfig { disable_optimized_loading: Option, disable_postcss_preset_env: Option, esm_externals: Option, + #[bincode(with = "turbo_bincode::serde_json")] extension_alias: Option, external_dir: Option, /// If set to `false`, webpack won't fall back to polyfill Node.js modules @@ -856,6 +1008,7 @@ pub struct ExperimentalConfig { instrumentation_hook: Option, client_trace_metadata: Option>, large_page_data_bytes: Option, + #[bincode(with = "turbo_bincode::serde_json")] logging: Option, memory_based_workers_count: Option, /// Optimize React APIs for server builds. @@ -874,6 +1027,7 @@ pub struct ExperimentalConfig { /// @internal Used by the Next.js internals only. trust_host_header: Option, + #[bincode(with = "turbo_bincode::serde_json")] url_imports: Option, /// This option is to enable running the Webpack build in a worker thread /// (doesn't apply to Turbopack). @@ -964,7 +1118,17 @@ fn test_cache_life_profiles_invalid() { } #[derive( - Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct SubResourceIntegrity { @@ -972,7 +1136,16 @@ pub struct SubResourceIntegrity { } #[derive( - Clone, Debug, PartialEq, Deserialize, Serialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Deserialize, + Serialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(untagged)] pub enum ServerActionsOrLegacyBool { @@ -985,7 +1158,16 @@ pub enum ServerActionsOrLegacyBool { } #[derive( - Clone, Debug, PartialEq, Deserialize, Serialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Deserialize, + Serialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum EsmExternalsValue { @@ -993,7 +1175,16 @@ pub enum EsmExternalsValue { } #[derive( - Clone, Debug, PartialEq, Deserialize, Serialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Deserialize, + Serialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(untagged)] pub enum EsmExternals { @@ -1031,6 +1222,8 @@ fn test_esm_externals_deserialization() { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct ServerActions { @@ -1038,7 +1231,9 @@ pub struct ServerActions { pub body_size_limit: Option, } -#[derive(Clone, Debug, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue)] +#[derive( + Clone, Debug, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, Encode, Decode, +)] #[serde(untagged)] pub enum SizeLimit { Number(f64), @@ -1060,7 +1255,16 @@ impl PartialEq for SizeLimit { impl Eq for SizeLimit {} #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum MiddlewarePrefetchType { @@ -1069,7 +1273,16 @@ pub enum MiddlewarePrefetchType { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(untagged)] pub enum EmotionTransformOptionsOrBoolean { @@ -1087,7 +1300,16 @@ impl EmotionTransformOptionsOrBoolean { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(untagged)] pub enum StyledComponentsTransformOptionsOrBoolean { @@ -1116,7 +1338,16 @@ pub struct CompilerConfig { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(untagged, rename_all = "camelCase")] pub enum ReactRemoveProperties { @@ -1134,7 +1365,16 @@ impl ReactRemoveProperties { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(untagged)] pub enum RemoveConsoleConfig { @@ -1155,7 +1395,9 @@ impl RemoveConsoleConfig { pub struct ResolveExtensions(Option>); #[turbo_tasks::value(transparent)] -pub struct SwcPlugins(Vec<(RcStr, serde_json::Value)>); +pub struct SwcPlugins( + #[bincode(with = "turbo_bincode::serde_json")] Vec<(RcStr, serde_json::Value)>, +); #[turbo_tasks::value(transparent)] pub struct OptionalMdxTransformOptions(Option>); @@ -1171,7 +1413,9 @@ pub struct OptionFileSystemPath(Option); pub struct OptionServerActions(Option); #[turbo_tasks::value(transparent)] -pub struct OptionJsonValue(pub Option); +pub struct OptionJsonValue( + #[bincode(with = "turbo_bincode::serde_json")] pub Option, +); fn turbopack_config_documentation_link() -> RcStr { rcstr!("https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopack#configuring-webpack-loaders") @@ -1223,6 +1467,7 @@ impl Issue for InvalidLoaderRuleRenameAsIssue { #[turbo_tasks::value(shared)] struct InvalidLoaderRuleConditionIssue { + #[bincode(with = "turbo_bincode::serde_json")] condition: ConfigConditionItem, config_file_path: FileSystemPath, } diff --git a/crates/next-core/src/next_font/font_fallback.rs b/crates/next-core/src/next_font/font_fallback.rs index 56f467a2b6e02..ffa52a079db46 100644 --- a/crates/next-core/src/next_font/font_fallback.rs +++ b/crates/next-core/src/next_font/font_fallback.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; @@ -79,7 +80,7 @@ impl FontFallbacks { /// An adjustment to be made to a fallback font to approximate the geometry of /// the main webfont. Rendered as e.g. `ascent-override: 56.8%;` in the /// stylesheet -#[derive(Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue)] +#[derive(Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, Encode, Decode)] pub(crate) struct FontAdjustment { pub ascent: f64, pub descent: f64, diff --git a/crates/next-core/src/next_font/google/font_fallback.rs b/crates/next-core/src/next_font/google/font_fallback.rs index 41e0c4077e151..a830d3f63892e 100644 --- a/crates/next-core/src/next_font/google/font_fallback.rs +++ b/crates/next-core/src/next_font/google/font_fallback.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result}; +use bincode::{Decode, Encode}; use once_cell::sync::Lazy; use regex::Regex; use serde::{Deserialize, Serialize}; @@ -7,13 +8,13 @@ use turbo_tasks::{FxIndexMap, NonLocalValue, Vc, trace::TraceRawVcs}; use turbo_tasks_fs::FileSystemPath; use turbopack_core::issue::{IssueExt, IssueSeverity, StyledString}; -use super::options::NextFontGoogleOptions; use crate::{ next_font::{ font_fallback::{ AutomaticFontFallback, DEFAULT_SANS_SERIF_FONT, DEFAULT_SERIF_FONT, FontAdjustment, FontFallback, }, + google::options::NextFontGoogleOptions, issue::NextFontIssue, util::{FontFamilyType, get_scoped_font_family}, }, @@ -21,7 +22,9 @@ use crate::{ }; /// An entry in the Google fonts metrics map -#[derive(Deserialize, Serialize, Debug, PartialEq, Eq, TraceRawVcs, NonLocalValue)] +#[derive( + Deserialize, Serialize, Debug, PartialEq, Eq, TraceRawVcs, NonLocalValue, Encode, Decode, +)] #[serde(rename_all = "camelCase")] pub(super) struct FontMetricsMapEntry { category: RcStr, @@ -34,7 +37,9 @@ pub(super) struct FontMetricsMapEntry { #[derive(Debug)] #[turbo_tasks::value] -pub(super) struct FontMetricsMap(pub FxIndexMap); +pub(super) struct FontMetricsMap( + #[bincode(with = "turbo_bincode::indexmap")] pub FxIndexMap, +); #[derive(Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue)] struct Fallback { diff --git a/crates/next-core/src/next_font/google/mod.rs b/crates/next-core/src/next_font/google/mod.rs index d966412f0c3a6..ab983dbcf5dae 100644 --- a/crates/next-core/src/next_font/google/mod.rs +++ b/crates/next-core/src/next_font/google/mod.rs @@ -74,7 +74,7 @@ pub const USER_AGENT_FOR_GOOGLE_FONTS: &str = "Mozilla/5.0 (Macintosh; Intel Mac pub const GOOGLE_FONTS_INTERNAL_PREFIX: &str = "@vercel/turbopack-next/internal/font/google/font"; #[turbo_tasks::value(transparent)] -struct FontData(FxIndexMap); +struct FontData(#[bincode(with = "turbo_bincode::indexmap")] FxIndexMap); #[turbo_tasks::value(shared)] pub(crate) struct NextFontGoogleReplacer { diff --git a/crates/next-core/src/next_font/google/options.rs b/crates/next-core/src/next_font/google/options.rs index 4efd8ae974f3b..ecb1ebbe2e307 100644 --- a/crates/next-core/src/next_font/google/options.rs +++ b/crates/next-core/src/next_font/google/options.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; use turbo_tasks::{ @@ -56,20 +57,24 @@ impl NextFontGoogleOptions { TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub(super) enum FontWeights { Variable, Fixed(Vec), } -#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, TraceRawVcs, NonLocalValue)] +#[derive( + Debug, PartialEq, Eq, Deserialize, Serialize, TraceRawVcs, NonLocalValue, Encode, Decode, +)] pub(super) struct FontDataEntry { pub weights: Vec, pub styles: Vec, pub axes: Option>, } -#[derive(Debug, PartialEq, Deserialize, Serialize, TraceRawVcs, NonLocalValue)] +#[derive(Debug, PartialEq, Deserialize, Serialize, TraceRawVcs, NonLocalValue, Encode, Decode)] #[serde(rename_all = "camelCase")] pub(super) struct Axis { pub tag: RcStr, diff --git a/crates/next-core/src/next_font/local/errors.rs b/crates/next-core/src/next_font/local/errors.rs index da8f442dacd93..97e85013e4554 100644 --- a/crates/next-core/src/next_font/local/errors.rs +++ b/crates/next-core/src/next_font/local/errors.rs @@ -1,5 +1,6 @@ use std::fmt::Display; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{NonLocalValue, trace::TraceRawVcs}; @@ -9,7 +10,9 @@ pub(crate) enum FontResult { FontFileNotFound(FontFileNotFound), } -#[derive(Debug, Eq, PartialEq, Serialize, Deserialize, NonLocalValue, TraceRawVcs)] +#[derive( + Debug, Eq, PartialEq, Serialize, Deserialize, NonLocalValue, TraceRawVcs, Encode, Decode, +)] pub(crate) struct FontFileNotFound(pub RcStr); impl Display for FontFileNotFound { diff --git a/crates/next-core/src/next_font/local/font_fallback.rs b/crates/next-core/src/next_font/local/font_fallback.rs index 6f4a1ffe06eca..1b5c31e178682 100644 --- a/crates/next-core/src/next_font/local/font_fallback.rs +++ b/crates/next-core/src/next_font/local/font_fallback.rs @@ -7,16 +7,16 @@ use turbo_rcstr::rcstr; use turbo_tasks::{ResolvedVc, Vc}; use turbo_tasks_fs::{FileContent, FileSystemPath}; -use super::{ - errors::{FontFileNotFound, FontResult}, - options::{FontDescriptor, FontDescriptors, FontWeight, NextFontLocalOptions}, - request::AdjustFontFallback, -}; use crate::next_font::{ font_fallback::{ AutomaticFontFallback, DEFAULT_SANS_SERIF_FONT, DEFAULT_SERIF_FONT, DefaultFallbackFont, FontAdjustment, FontFallback, FontFallbacks, }, + local::{ + errors::{FontFileNotFound, FontResult}, + options::{FontDescriptor, FontDescriptors, FontWeight, NextFontLocalOptions}, + request::AdjustFontFallback, + }, util::{FontFamilyType, get_scoped_font_family}, }; diff --git a/crates/next-core/src/next_font/local/options.rs b/crates/next-core/src/next_font/local/options.rs index bb1aef545a303..95f66e07425e8 100644 --- a/crates/next-core/src/next_font/local/options.rs +++ b/crates/next-core/src/next_font/local/options.rs @@ -1,6 +1,7 @@ use std::{fmt::Display, str::FromStr}; use anyhow::{Context, Result}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{NonLocalValue, TaskInput, Vc, trace::TraceRawVcs}; @@ -66,6 +67,8 @@ impl NextFontLocalOptions { TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub(super) struct FontDescriptor { pub weight: Option, @@ -108,6 +111,8 @@ impl FontDescriptor { TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub(super) enum FontDescriptors { /// `One` is a special case when the user did not provide a `src` field and @@ -131,6 +136,8 @@ pub(super) enum FontDescriptors { TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub(super) enum FontWeight { Variable(RcStr, RcStr), @@ -141,7 +148,7 @@ pub struct ParseFontWeightErr; impl FromStr for FontWeight { type Err = ParseFontWeightErr; - fn from_str(weight_str: &str) -> std::result::Result { + fn from_str(weight_str: &str) -> Result { if let Some((start, end)) = weight_str.split_once(' ') { Ok(FontWeight::Variable(start.into(), end.into())) } else { diff --git a/crates/next-core/src/next_font/local/request.rs b/crates/next-core/src/next_font/local/request.rs index 93da711afe02a..193c4ac797190 100644 --- a/crates/next-core/src/next_font/local/request.rs +++ b/crates/next-core/src/next_font/local/request.rs @@ -1,3 +1,4 @@ +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; use turbo_tasks::{NonLocalValue, TaskInput, trace::TraceRawVcs}; @@ -25,6 +26,8 @@ pub(super) struct NextFontLocalRequest { Deserialize, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub(super) struct NextFontLocalDeclaration { pub prop: RcStr, @@ -79,6 +82,8 @@ pub(super) struct SrcDescriptor { TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub(super) enum AdjustFontFallback { Arial, diff --git a/crates/next-core/src/next_image/module.rs b/crates/next-core/src/next_image/module.rs index 81c0ad1f2e310..bf867b01e6342 100644 --- a/crates/next-core/src/next_image/module.rs +++ b/crates/next-core/src/next_image/module.rs @@ -1,4 +1,5 @@ use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::rcstr; use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, Vc, fxindexmap, trace::TraceRawVcs}; @@ -26,6 +27,8 @@ use super::source_asset::StructuredImageFileSource; NonLocalValue, Serialize, Deserialize, + Encode, + Decode, )] pub enum BlurPlaceholderMode { /// Do not generate a blur placeholder at all. diff --git a/crates/next-core/src/next_manifests/mod.rs b/crates/next-core/src/next_manifests/mod.rs index c7e48d03bd87e..2e0028da3ac6b 100644 --- a/crates/next-core/src/next_manifests/mod.rs +++ b/crates/next-core/src/next_manifests/mod.rs @@ -4,6 +4,7 @@ pub mod client_reference_manifest; mod encode_uri_component; use anyhow::{Context, Result}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{ @@ -32,6 +33,7 @@ pub struct BuildManifest { pub polyfill_files: Vec>>, pub root_main_files: Vec>>, + #[bincode(with = "turbo_bincode::indexmap")] pub pages: FxIndexMap>, } @@ -164,6 +166,7 @@ pub struct ClientBuildManifest { pub output_path: FileSystemPath, pub client_relative_path: FileSystemPath, + #[bincode(with = "turbo_bincode::indexmap")] pub pages: FxIndexMap>>, } @@ -244,6 +247,8 @@ impl Default for MiddlewaresManifest { Serialize, Deserialize, NonLocalValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase", default)] pub struct ProxyMatcher { @@ -419,6 +424,8 @@ pub enum ActionManifestModuleId<'a> { Serialize, Deserialize, NonLocalValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum ActionLayer { diff --git a/crates/next-core/src/next_root_params/mod.rs b/crates/next-core/src/next_root_params/mod.rs index 792242dacde4e..667ab2dc15fcb 100644 --- a/crates/next-core/src/next_root_params/mod.rs +++ b/crates/next-core/src/next_root_params/mod.rs @@ -67,6 +67,7 @@ async fn get_next_root_params_mapping( #[turbo_tasks::value] struct NextRootParamsMapper { is_root_params_enabled: ResolvedVc, + #[bincode(with = "turbo_bincode::either")] context_type: Either, collected_root_params: Option>, } diff --git a/crates/next-core/src/next_server/resolve.rs b/crates/next-core/src/next_server/resolve.rs index 456302e4b6b09..666380ac64959 100644 --- a/crates/next-core/src/next_server/resolve.rs +++ b/crates/next-core/src/next_server/resolve.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use next_taskless::NEVER_EXTERNAL_RE; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; @@ -426,7 +427,9 @@ impl AfterResolvePlugin for ExternalCjsModulesResolvePlugin { } } -#[derive(Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, Debug, NonLocalValue)] +#[derive( + Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, Debug, NonLocalValue, Encode, Decode, +)] pub struct PackagesGlobs { path_glob: ResolvedVc, request_glob: ResolvedVc, diff --git a/crates/next-core/src/next_shared/transforms/modularize_imports.rs b/crates/next-core/src/next_shared/transforms/modularize_imports.rs index 15a6b74f7d1f2..8a4b4999def43 100644 --- a/crates/next-core/src/next_shared/transforms/modularize_imports.rs +++ b/crates/next-core/src/next_shared/transforms/modularize_imports.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use anyhow::Result; use async_trait::async_trait; +use bincode::{Decode, Encode}; use modularize_imports::{Config, PackageConfig, modularize_imports}; use serde::{Deserialize, Serialize}; use swc_core::ecma::ast::Program; @@ -22,6 +23,8 @@ use super::module_rule_match_js_no_url; TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct ModularizeImportPackageConfig { @@ -43,6 +46,8 @@ pub struct ModularizeImportPackageConfig { TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(untagged)] pub enum Transform { diff --git a/crates/next-core/src/next_shared/webpack_rules/mod.rs b/crates/next-core/src/next_shared/webpack_rules/mod.rs index 6eb0d7433a6f7..48e112221d95b 100644 --- a/crates/next-core/src/next_shared/webpack_rules/mod.rs +++ b/crates/next-core/src/next_shared/webpack_rules/mod.rs @@ -1,6 +1,7 @@ use std::{collections::BTreeSet, str::FromStr}; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; use turbo_tasks::{NonLocalValue, OperationValue, ResolvedVc, TaskInput, Vc, trace::TraceRawVcs}; @@ -46,6 +47,8 @@ pub(crate) mod sass; TraceRawVcs, NonLocalValue, OperationValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum WebpackLoaderBuiltinCondition { diff --git a/crates/next-core/src/raw_ecmascript_module.rs b/crates/next-core/src/raw_ecmascript_module.rs index 143de297b6144..de785c7a0cd94 100644 --- a/crates/next-core/src/raw_ecmascript_module.rs +++ b/crates/next-core/src/raw_ecmascript_module.rs @@ -215,15 +215,16 @@ impl EcmascriptChunkItem for RawEcmascriptChunkItem { name, if let Some(value) = replacements.get(&DefinableNameSegment::Name(name.into())) - && let Some((_, value)) = value.iter().find(|(path, _)| { - matches!( - path.as_slice(), - [ - DefinableNameSegment::Name(a), - DefinableNameSegment::Name(b) - ] if a == "process" && b == "env" - ) - }) + && let Some((_, value)) = + value.0.iter().find(|(path, _)| { + matches!( + path.as_slice(), + [ + DefinableNameSegment::Name(a), + DefinableNameSegment::Name(b) + ] if a == "process" && b == "env" + ) + }) { let value = value.await?; let value = match &*value { diff --git a/crates/next-core/src/segment_config.rs b/crates/next-core/src/segment_config.rs index c6065d16804f5..a194e87e9d7fa 100644 --- a/crates/next-core/src/segment_config.rs +++ b/crates/next-core/src/segment_config.rs @@ -1,6 +1,7 @@ use std::{borrow::Cow, future::Future}; use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use serde_json::Value; use swc_core::{ @@ -42,7 +43,18 @@ use crate::{ }; #[derive( - Default, PartialEq, Eq, Clone, Copy, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue, + Default, + PartialEq, + Eq, + Clone, + Copy, + Debug, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum NextSegmentDynamic { @@ -54,7 +66,18 @@ pub enum NextSegmentDynamic { } #[derive( - Default, PartialEq, Eq, Clone, Copy, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue, + Default, + PartialEq, + Eq, + Clone, + Copy, + Debug, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum NextSegmentFetchCache { @@ -69,7 +92,18 @@ pub enum NextSegmentFetchCache { } #[derive( - Default, PartialEq, Eq, Clone, Copy, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue, + Default, + PartialEq, + Eq, + Clone, + Copy, + Debug, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, )] pub enum NextRevalidate { #[default] @@ -95,6 +129,7 @@ pub struct NextSegmentConfig { pub generate_image_metadata: bool, pub generate_sitemaps: bool, #[turbo_tasks(trace_ignore)] + #[bincode(with_serde)] pub generate_static_params: Option, } @@ -284,6 +319,8 @@ impl Issue for NextSegmentConfigParsingIssue { TaskInput, NonLocalValue, TraceRawVcs, + Encode, + Decode, )] pub enum ParseSegmentMode { Base, diff --git a/crates/next-core/src/util.rs b/crates/next-core/src/util.rs index 06c17d4b98dcb..3caf7e5051ca6 100644 --- a/crates/next-core/src/util.rs +++ b/crates/next-core/src/util.rs @@ -1,6 +1,7 @@ use std::{fmt::Display, str::FromStr}; use anyhow::{Result, anyhow, bail}; +use bincode::{Decode, Encode}; use next_taskless::expand_next_js_template; use serde::{Deserialize, Serialize, de::DeserializeOwned}; use turbo_rcstr::{RcStr, rcstr}; @@ -27,7 +28,11 @@ const NEXT_TEMPLATE_PATH: &str = "dist/esm/build/templates"; /// As opposed to [`EnvMap`], this map allows for `None` values, which means that the variables /// should be replace with undefined. #[turbo_tasks::value(transparent)] -pub struct OptionEnvMap(#[turbo_tasks(trace_ignore)] FxIndexMap>); +pub struct OptionEnvMap( + #[turbo_tasks(trace_ignore)] + #[bincode(with = "turbo_bincode::indexmap")] + FxIndexMap>, +); pub fn defines(define_env: &FxIndexMap>) -> CompileTimeDefines { let mut defines = FxIndexMap::default(); @@ -198,6 +203,8 @@ pub fn pages_function_name(page: impl Display) -> String { Ord, TaskInput, NonLocalValue, + Encode, + Decode, )] #[serde(rename_all = "lowercase")] pub enum NextRuntime { @@ -228,7 +235,9 @@ impl NextRuntime { } } -#[derive(PartialEq, Eq, Clone, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue)] +#[derive( + PartialEq, Eq, Clone, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue, Encode, Decode, +)] pub enum MiddlewareMatcherKind { Str(String), Matcher(ProxyMatcher), diff --git a/turbopack/crates/turbo-esregex/Cargo.toml b/turbopack/crates/turbo-esregex/Cargo.toml index d360e17aaffda..78e7aa28cc7fc 100644 --- a/turbopack/crates/turbo-esregex/Cargo.toml +++ b/turbopack/crates/turbo-esregex/Cargo.toml @@ -6,6 +6,7 @@ license = "MIT" [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } regex = { workspace = true } regress = { workspace = true } serde = { workspace = true } diff --git a/turbopack/crates/turbo-esregex/src/lib.rs b/turbopack/crates/turbo-esregex/src/lib.rs index 8f74b927dafe4..02dadca4bbecb 100644 --- a/turbopack/crates/turbo-esregex/src/lib.rs +++ b/turbopack/crates/turbo-esregex/src/lib.rs @@ -3,12 +3,20 @@ use std::vec; use anyhow::{Result, bail}; +use bincode::{ + Decode, Encode, + de::Decoder, + enc::Encoder, + error::{DecodeError, EncodeError}, + impl_borrow_decode, +}; +use serde::{Deserialize, Serialize}; /// A simple regular expression implementation following ecmascript semantics /// /// Delegates to the `regex` crate when possible and `regress` otherwise. -#[derive(Debug, Clone)] -#[turbo_tasks::value(eq = "manual", shared)] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[turbo_tasks::value(eq = "manual", shared, serialization = "custom")] #[serde(into = "RegexForm", try_from = "RegexForm")] pub struct EsRegex { #[turbo_tasks(trace_ignore)] @@ -60,6 +68,25 @@ impl From for RegexForm { } } +impl Encode for EsRegex { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.pattern.encode(encoder)?; + self.flags.encode(encoder)?; + Ok(()) + } +} + +impl Decode for EsRegex { + fn decode>(decoder: &mut D) -> Result { + let pattern: String = Decode::decode(decoder)?; + let flags: String = Decode::decode(decoder)?; + // TODO: perf: there's cloning happening here, we should be able to just move the `String` + EsRegex::new(&pattern, &flags).map_err(|err| DecodeError::OtherString(err.to_string())) + } +} + +impl_borrow_decode!(EsRegex); + impl EsRegex { /// Support ecmascript style regular expressions by selecting the `regex` crate when possible /// and using regress when not. diff --git a/turbopack/crates/turbo-rcstr/Cargo.toml b/turbopack/crates/turbo-rcstr/Cargo.toml index 3ab1b82b70aa5..9e726a405f51f 100644 --- a/turbopack/crates/turbo-rcstr/Cargo.toml +++ b/turbopack/crates/turbo-rcstr/Cargo.toml @@ -10,6 +10,7 @@ atom_size_128 = [] napi = ["dep:napi"] [dependencies] +bincode = { workspace = true } triomphe = { workspace = true } turbo-tasks-hash = { workspace = true } serde = { workspace = true } diff --git a/turbopack/crates/turbo-rcstr/src/lib.rs b/turbopack/crates/turbo-rcstr/src/lib.rs index 206a9ae2ad57c..944c001335692 100644 --- a/turbopack/crates/turbo-rcstr/src/lib.rs +++ b/turbopack/crates/turbo-rcstr/src/lib.rs @@ -9,6 +9,7 @@ use std::{ path::{Path, PathBuf}, }; +use bincode::{Decode, Encode, de::Decoder, enc::Encoder, error::EncodeError, impl_borrow_decode}; use bytes_str::BytesStr; use debug_unreachable::debug_unreachable; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -369,6 +370,22 @@ impl<'de> Deserialize<'de> for RcStr { } } +impl Encode for RcStr { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.as_str().encode(encoder) + } +} + +impl Decode for RcStr { + fn decode>( + decoder: &mut D, + ) -> Result { + Ok(RcStr::from(String::decode(decoder)?)) + } +} + +impl_borrow_decode!(RcStr); + impl Drop for RcStr { fn drop(&mut self) { match self.tag() { diff --git a/turbopack/crates/turbo-tasks-auto-hash-map/Cargo.toml b/turbopack/crates/turbo-tasks-auto-hash-map/Cargo.toml index 1b15fd8e643b9..caa7430c0bcef 100644 --- a/turbopack/crates/turbo-tasks-auto-hash-map/Cargo.toml +++ b/turbopack/crates/turbo-tasks-auto-hash-map/Cargo.toml @@ -9,6 +9,7 @@ edition = "2024" workspace = true [dependencies] +bincode = { workspace = true } hashbrown = { workspace = true, features = ["serde"]} rustc-hash = { workspace = true } serde = { workspace = true, features = ["derive"] } diff --git a/turbopack/crates/turbo-tasks-auto-hash-map/src/map.rs b/turbopack/crates/turbo-tasks-auto-hash-map/src/map.rs index 2054dd33c9eb7..92d599b459235 100644 --- a/turbopack/crates/turbo-tasks-auto-hash-map/src/map.rs +++ b/turbopack/crates/turbo-tasks-auto-hash-map/src/map.rs @@ -5,6 +5,13 @@ use std::{ marker::PhantomData, }; +use bincode::{ + Decode, Encode, + de::Decoder, + enc::Encoder, + error::{DecodeError, EncodeError}, + impl_borrow_decode, +}; use hashbrown::hash_map::HashMap; use rustc_hash::FxHasher; use serde::{ @@ -54,7 +61,7 @@ impl AutoMap, 0> { } } -impl AutoMap { +impl AutoMap { /// see [HashMap::with_hasher](https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#method.with_hasher) pub const fn with_hasher() -> Self { AutoMap::List(SmallVec::new_const()) @@ -813,6 +820,56 @@ where } } +impl Encode for AutoMap +where + K: Encode, + V: Encode, +{ + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + // Encode the length first + self.len().encode(encoder)?; + // Then encode each key-value tuple + for entry in self.iter() { + entry.encode(encoder)?; + } + Ok(()) + } +} + +impl Decode for AutoMap +where + K: Decode + Eq + Hash, + V: Decode, + H: BuildHasher + Default, +{ + fn decode>(decoder: &mut D) -> Result { + let len = usize::decode(decoder)?; + if len <= MAX_LIST_SIZE { + let mut list = SmallVec::with_capacity(len); + for _ in 0..len { + let entry = <(K, V)>::decode(decoder)?; + list.push(entry); + } + Ok(AutoMap::List(list)) + } else { + let mut map = HashMap::with_capacity_and_hasher(len, H::default()); + for _ in 0..len { + let (key, value) = <(K, V)>::decode(decoder)?; + map.insert(key, value); + } + Ok(AutoMap::Map(Box::new(map))) + } + } +} + +impl_borrow_decode!( + AutoMap, + K: Decode<__Context> + Eq + Hash, + V: Decode<__Context>, + H: BuildHasher + Default, + const I: usize, +); + impl PartialEq for AutoMap { fn eq(&self, other: &Self) -> bool { match (self, other) { diff --git a/turbopack/crates/turbo-tasks-auto-hash-map/src/set.rs b/turbopack/crates/turbo-tasks-auto-hash-map/src/set.rs index e879cdd400006..2231b50a395ab 100644 --- a/turbopack/crates/turbo-tasks-auto-hash-map/src/set.rs +++ b/turbopack/crates/turbo-tasks-auto-hash-map/src/set.rs @@ -4,13 +4,19 @@ use std::{ marker::PhantomData, }; +use bincode::{Decode, Encode}; use rustc_hash::FxHasher; use serde::{Deserialize, Serialize}; use shrink_to_fit::ShrinkToFit; use crate::AutoMap; -#[derive(Clone)] +#[derive(Clone, Encode, Decode)] +#[bincode( + encode_bounds = "K: Encode + Hash + Eq, H: BuildHasher + Default", + decode_bounds = "K: Decode<__Context> + Hash + Eq, H: BuildHasher + Default", + borrow_decode_bounds = "K: Decode<__Context> + Hash + Eq, H: BuildHasher + Default" +)] pub struct AutoSet, const I: usize = 0> { map: AutoMap, } diff --git a/turbopack/crates/turbo-tasks-backend/Cargo.toml b/turbopack/crates/turbo-tasks-backend/Cargo.toml index e224fc985b779..7f9d3f43a4872 100644 --- a/turbopack/crates/turbo-tasks-backend/Cargo.toml +++ b/turbopack/crates/turbo-tasks-backend/Cargo.toml @@ -30,6 +30,7 @@ lmdb = ["dep:lmdb-rkv"] [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } arc-swap = { version = "1.7.1" } auto-hash-map = { workspace = true } bitfield = { workspace = true } diff --git a/turbopack/crates/turbo-tasks-backend/tests/bug.rs b/turbopack/crates/turbo-tasks-backend/tests/bug.rs index 5f81a317a2d76..b0c0c537a88f4 100644 --- a/turbopack/crates/turbo-tasks-backend/tests/bug.rs +++ b/turbopack/crates/turbo-tasks-backend/tests/bug.rs @@ -3,20 +3,25 @@ #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, Vc, trace::TraceRawVcs}; use turbo_tasks_testing::{Registration, register, run_once}; static REGISTRATION: Registration = register!(); -#[derive(Debug, Clone, PartialEq, Eq, NonLocalValue, Serialize, Deserialize, TraceRawVcs)] +#[derive( + Debug, Clone, PartialEq, Eq, NonLocalValue, Serialize, Deserialize, TraceRawVcs, Encode, Decode, +)] struct TaskReferenceSpec { task: u16, read: bool, read_strongly_consistent: bool, } -#[derive(Debug, Clone, PartialEq, Eq, NonLocalValue, Serialize, Deserialize, TraceRawVcs)] +#[derive( + Debug, Clone, PartialEq, Eq, NonLocalValue, Serialize, Deserialize, TraceRawVcs, Encode, Decode, +)] struct TaskSpec { references: Vec, } diff --git a/turbopack/crates/turbo-tasks-backend/tests/bug2.rs b/turbopack/crates/turbo-tasks-backend/tests/bug2.rs index 1c175e44ac6ae..041dd6e7f52ee 100644 --- a/turbopack/crates/turbo-tasks-backend/tests/bug2.rs +++ b/turbopack/crates/turbo-tasks-backend/tests/bug2.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, State, TaskInput, Vc, trace::TraceRawVcs}; use turbo_tasks_testing::{Registration, register, run_once}; @@ -12,7 +13,18 @@ use turbo_tasks_testing::{Registration, register, run_once}; static REGISTRATION: Registration = register!(); #[derive( - Clone, Debug, PartialEq, Eq, Hash, NonLocalValue, Serialize, Deserialize, TraceRawVcs, TaskInput, + Clone, + Debug, + PartialEq, + Eq, + Hash, + NonLocalValue, + Serialize, + Deserialize, + TraceRawVcs, + TaskInput, + Encode, + Decode, )] pub struct TaskReferenceSpec { task: u16, @@ -22,7 +34,18 @@ pub struct TaskReferenceSpec { } #[derive( - Clone, Debug, PartialEq, Eq, Hash, NonLocalValue, Serialize, Deserialize, TraceRawVcs, TaskInput, + Clone, + Debug, + PartialEq, + Eq, + Hash, + NonLocalValue, + Serialize, + Deserialize, + TraceRawVcs, + TaskInput, + Encode, + Decode, )] pub struct TaskSpec { references: Vec, diff --git a/turbopack/crates/turbo-tasks-bytes/Cargo.toml b/turbopack/crates/turbo-tasks-bytes/Cargo.toml index 1c3e7a07a4a4d..d4fe5390a1981 100644 --- a/turbopack/crates/turbo-tasks-bytes/Cargo.toml +++ b/turbopack/crates/turbo-tasks-bytes/Cargo.toml @@ -13,6 +13,7 @@ workspace = true [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } bytes = { workspace = true } futures = { workspace = true } serde = { workspace = true } diff --git a/turbopack/crates/turbo-tasks-bytes/src/bytes.rs b/turbopack/crates/turbo-tasks-bytes/src/bytes.rs index 8b7a8bb0cd565..4f2ff83b613a6 100644 --- a/turbopack/crates/turbo-tasks-bytes/src/bytes.rs +++ b/turbopack/crates/turbo-tasks-bytes/src/bytes.rs @@ -4,6 +4,13 @@ use std::{ }; use anyhow::Result; +use bincode::{ + Decode, Encode, + de::Decoder, + enc::Encoder, + error::{DecodeError, EncodeError}, + impl_borrow_decode, +}; use bytes::Bytes as CBytes; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -32,6 +39,22 @@ impl<'de> Deserialize<'de> for Bytes { } } +impl Encode for Bytes { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self[..].encode(encoder) + } +} + +impl Decode for Bytes { + fn decode>(decoder: &mut D) -> Result { + // bincode uses the same encoding for slices and vecs + // https://docs.rs/bincode/latest/bincode/spec/index.html#linear-collections-vec-arrays-etc + Ok(Bytes(CBytes::from(Vec::::decode(decoder)?))) + } +} + +impl_borrow_decode!(Bytes); + impl Deref for Bytes { type Target = CBytes; fn deref(&self) -> &Self::Target { @@ -95,6 +118,16 @@ mod tests { assert_tokens(&s, &[Token::Bytes(b"test")]) } + #[test] + fn bincode() { + let s = Bytes::from("test"); + let c = bincode::config::standard(); + let decoded: Bytes = bincode::decode_from_slice(&bincode::encode_to_vec(&s, c).unwrap(), c) + .unwrap() + .0; + assert_eq!(decoded, s); + } + #[test] fn from_into() { let b = Bytes::from("foo"); diff --git a/turbopack/crates/turbo-tasks-bytes/src/stream.rs b/turbopack/crates/turbo-tasks-bytes/src/stream.rs index c51518702e3ac..3ee67be5ee983 100644 --- a/turbopack/crates/turbo-tasks-bytes/src/stream.rs +++ b/turbopack/crates/turbo-tasks-bytes/src/stream.rs @@ -6,6 +6,12 @@ use std::{ }; use anyhow::Result; +use bincode::{ + BorrowDecode, Decode, Encode, + de::{BorrowDecoder, Decoder}, + enc::Encoder, + error::DecodeError, +}; use futures::{Stream as StreamTrait, StreamExt, TryStreamExt}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -168,6 +174,41 @@ impl<'de, T: Clone + Send + Deserialize<'de>> Deserialize<'de> for Stream { } } +impl Encode for Stream { + fn encode(&self, encoder: &mut E) -> Result<(), bincode::error::EncodeError> { + use bincode::error::EncodeError; + let lock = self + .inner + .lock() + .map_err(|_| EncodeError::Other("failed to lock stream, lock is poisoned?"))?; + match &*lock { + StreamState { + pulled, + source: None, + } => Encode::encode(pulled, encoder), + _ => Err(EncodeError::Other("cannot encode open stream")), + } + } +} + +impl> Decode for Stream { + fn decode>(decoder: &mut D) -> Result { + let data = >::decode(decoder)?; + Ok(Stream::new_closed(data)) + } +} + +impl<'de, Context, T: Clone + Send + BorrowDecode<'de, Context>> BorrowDecode<'de, Context> + for Stream +{ + fn borrow_decode>( + decoder: &mut D, + ) -> Result { + let data = >::borrow_decode(decoder)?; + Ok(Stream::new_closed(data)) + } +} + impl fmt::Debug for StreamState { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("StreamState") diff --git a/turbopack/crates/turbo-tasks-env/Cargo.toml b/turbopack/crates/turbo-tasks-env/Cargo.toml index 3dc6645d0286b..9d1ea1d677bf3 100644 --- a/turbopack/crates/turbo-tasks-env/Cargo.toml +++ b/turbopack/crates/turbo-tasks-env/Cargo.toml @@ -14,6 +14,7 @@ workspace = true [dependencies] anyhow = { workspace = true } dotenvs = "0.1.0" +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-fs = { workspace = true } diff --git a/turbopack/crates/turbo-tasks-env/src/lib.rs b/turbopack/crates/turbo-tasks-env/src/lib.rs index 26e5c5e94601a..ac3e2f9a2109f 100644 --- a/turbopack/crates/turbo-tasks-env/src/lib.rs +++ b/turbopack/crates/turbo-tasks-env/src/lib.rs @@ -18,7 +18,11 @@ pub use self::{ }; #[turbo_tasks::value(transparent)] -pub struct EnvMap(#[turbo_tasks(trace_ignore)] FxIndexMap); +pub struct EnvMap( + #[turbo_tasks(trace_ignore)] + #[bincode(with = "turbo_bincode::indexmap")] + FxIndexMap, +); #[turbo_tasks::value_impl] impl EnvMap { diff --git a/turbopack/crates/turbo-tasks-fs/Cargo.toml b/turbopack/crates/turbo-tasks-fs/Cargo.toml index 18b784bdd2f36..1d42455d80fbd 100644 --- a/turbopack/crates/turbo-tasks-fs/Cargo.toml +++ b/turbopack/crates/turbo-tasks-fs/Cargo.toml @@ -25,6 +25,7 @@ workspace = true [dependencies] anyhow = { workspace = true } auto-hash-map = { workspace = true } +bincode = { workspace = true } bitflags = "1.3.2" bytes = { workspace = true } concurrent-queue = { workspace = true } @@ -46,6 +47,7 @@ serde_path_to_error = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } triomphe = { workspace = true } +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-hash = { workspace = true } diff --git a/turbopack/crates/turbo-tasks-fs/src/glob.rs b/turbopack/crates/turbo-tasks-fs/src/glob.rs index 8cc3a16077c23..7504c43be3bd7 100644 --- a/turbopack/crates/turbo-tasks-fs/src/glob.rs +++ b/turbopack/crates/turbo-tasks-fs/src/glob.rs @@ -1,6 +1,12 @@ use std::fmt::Display; use anyhow::{Result, bail}; +use bincode::{ + Decode, Encode, + de::Decoder, + enc::Encoder, + error::{DecodeError, EncodeError}, +}; use regex::bytes::{Regex, RegexBuilder}; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; @@ -20,8 +26,8 @@ use crate::globset::parse; // Note: a/**/b does match a/b, so we need some special logic about path // separators -#[turbo_tasks::value(eq = "manual")] -#[derive(Debug, Clone)] +#[turbo_tasks::value(eq = "manual", serialization = "custom")] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(into = "GlobForm", try_from = "GlobForm")] pub struct Glob { glob: RcStr, @@ -46,8 +52,37 @@ impl Display for Glob { write!(f, "Glob({})", self.glob) } } + +impl Encode for Glob { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.glob.encode(encoder)?; + self.opts.encode(encoder)?; + Ok(()) + } +} + +impl Decode for Glob { + fn decode>(decoder: &mut D) -> Result { + let glob = RcStr::decode(decoder)?; + let opts = GlobOptions::decode(decoder)?; + Glob::parse(glob, opts).map_err(|err| DecodeError::OtherString(err.to_string())) + } +} + #[derive( - Serialize, Deserialize, Copy, Clone, PartialEq, Eq, Hash, Default, TaskInput, TraceRawVcs, Debug, + Serialize, + Deserialize, + Copy, + Clone, + PartialEq, + Eq, + Hash, + Default, + TaskInput, + TraceRawVcs, + Debug, + Encode, + Decode, )] pub struct GlobOptions { diff --git a/turbopack/crates/turbo-tasks-fs/src/lib.rs b/turbopack/crates/turbo-tasks-fs/src/lib.rs index 8b585b9d61624..12437ba168b41 100644 --- a/turbopack/crates/turbo-tasks-fs/src/lib.rs +++ b/turbopack/crates/turbo-tasks-fs/src/lib.rs @@ -44,6 +44,7 @@ use std::{ use anyhow::{Context, Result, anyhow, bail}; use auto_hash_map::{AutoMap, AutoSet}; +use bincode::{Decode, Encode}; use bitflags::bitflags; use dunce::simplified; use indexmap::IndexSet; @@ -252,31 +253,37 @@ struct DiskFileSystemApplyContext { created_directories: FxHashSet, } -#[derive(Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue)] +#[derive(Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Encode, Decode)] struct DiskFileSystemInner { pub name: RcStr, pub root: RcStr, #[turbo_tasks(debug_ignore, trace_ignore)] #[serde(skip)] + #[bincode(skip)] mutex_map: MutexMap, #[turbo_tasks(debug_ignore, trace_ignore)] #[serde(skip)] + #[bincode(skip)] invalidator_map: InvalidatorMap, #[turbo_tasks(debug_ignore, trace_ignore)] #[serde(skip)] + #[bincode(skip)] dir_invalidator_map: InvalidatorMap, /// Lock that makes invalidation atomic. It will keep a write lock during /// watcher invalidation and a read lock during other operations. #[turbo_tasks(debug_ignore, trace_ignore)] #[serde(skip)] + #[bincode(skip)] invalidation_lock: RwLock<()>, /// Semaphore to limit the maximum number of concurrent file operations. #[turbo_tasks(debug_ignore, trace_ignore)] #[serde(skip, default = "create_read_semaphore")] + #[bincode(skip, default = "create_read_semaphore")] read_semaphore: tokio::sync::Semaphore, /// Semaphore to limit the maximum number of concurrent file operations. #[turbo_tasks(debug_ignore, trace_ignore)] #[serde(skip, default = "create_write_semaphore")] + #[bincode(skip, default = "create_write_semaphore")] write_semaphore: tokio::sync::Semaphore, #[turbo_tasks(debug_ignore, trace_ignore)] @@ -1678,13 +1685,26 @@ pub struct RealPathResult { /// Errors that can occur when resolving a path with symlinks. /// Many of these can be transient conditions that might happen when package managers are running. -#[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize, Deserialize, NonLocalValue, TraceRawVcs)] +#[derive( + Debug, + Clone, + Hash, + Eq, + PartialEq, + Serialize, + Deserialize, + NonLocalValue, + TraceRawVcs, + Encode, + Decode, +)] pub enum RealPathResultError { TooManySymlinks, CycleDetected, Invalid, NotFound, } + impl RealPathResultError { /// Formats the error message pub fn as_error_message(&self, orig: &FileSystemPath, result: &RealPathResult) -> String { @@ -1847,7 +1867,16 @@ impl FileContent { } bitflags! { - #[derive(Default, Serialize, Deserialize, TraceRawVcs, NonLocalValue, DeterministicHash)] + #[derive( + Default, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + DeterministicHash, + Encode, + Decode, + )] pub struct LinkType: u8 { const DIRECTORY = 0b00000001; const ABSOLUTE = 0b00000010; @@ -2057,6 +2086,7 @@ pub struct FileMeta { // len: u64, permissions: Permissions, #[serde(with = "mime_option_serde")] + #[bincode(with = "turbo_bincode::mime_option")] #[turbo_tasks(trace_ignore)] content_type: Option, } @@ -2325,7 +2355,19 @@ pub enum FileLinesContent { NotFound, } -#[derive(Hash, Clone, Debug, PartialEq, Eq, TraceRawVcs, Serialize, Deserialize, NonLocalValue)] +#[derive( + Hash, + Clone, + Debug, + PartialEq, + Eq, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, +)] pub enum RawDirectoryEntry { File, Directory, @@ -2334,7 +2376,19 @@ pub enum RawDirectoryEntry { Other, } -#[derive(Hash, Clone, Debug, PartialEq, Eq, TraceRawVcs, Serialize, Deserialize, NonLocalValue)] +#[derive( + Hash, + Clone, + Debug, + PartialEq, + Eq, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, +)] pub enum DirectoryEntry { File(FileSystemPath), Directory(FileSystemPath), diff --git a/turbopack/crates/turbo-tasks-fs/src/rope.rs b/turbopack/crates/turbo-tasks-fs/src/rope.rs index 9d49f8e48e3d8..a293bcb62665a 100644 --- a/turbopack/crates/turbo-tasks-fs/src/rope.rs +++ b/turbopack/crates/turbo-tasks-fs/src/rope.rs @@ -11,6 +11,13 @@ use std::{ use RopeElem::{Local, Shared}; use anyhow::{Context, Result}; +use bincode::{ + Decode, Encode, + de::{Decoder, read::Reader as _}, + enc::{Encoder, write::Writer as _}, + error::{DecodeError, EncodeError}, + impl_borrow_decode, +}; use bytes::{Buf, Bytes}; use futures::Stream; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -407,6 +414,47 @@ impl<'de> Deserialize<'de> for Rope { } } +/// Encode as a len + raw bytes format using the encoder's [`bincode::enc::write::Writer`]. Encoding +/// [`Rope::to_bytes`] instead would be easier, but would require copying to an intermediate buffer. +/// +/// This len + bytes format is similar to how bincode would normally encode a `&[u8]`: +/// https://docs.rs/bincode/latest/bincode/spec/index.html#collections +impl Encode for Rope { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.length.encode(encoder)?; + let mut reader = self.read(); + for chunk in &mut reader { + encoder.writer().write(&chunk)?; + } + + Ok(()) + } +} + +impl Decode for Rope { + #[allow(clippy::uninit_vec)] + fn decode>(decoder: &mut D) -> Result { + let length = usize::decode(decoder)?; + let mut bytes = Vec::with_capacity(length); + + // SAFETY: + // - `bytes` has capacity of `length` already + // - `read` writes to (does not read) `bytes` and will return an error if exactly `length` + // bytes is not written, so no uninitialized memory ever escapes this function. + // We can't use `MaybeUninit` here because `read` doesn't support it. + unsafe { + bytes.set_len(length); + } + // the decoder API requires that we claim a length *before* reading (not after) + decoder.claim_bytes_read(length)?; + decoder.reader().read(&mut bytes)?; + + Ok(Rope::from(bytes)) + } +} + +impl_borrow_decode!(Rope); + pub mod ser_as_string { use serde::{Serializer, ser::Error}; diff --git a/turbopack/crates/turbo-tasks-fs/src/watcher.rs b/turbopack/crates/turbo-tasks-fs/src/watcher.rs index f479f10ac8265..7172b80dd414d 100644 --- a/turbopack/crates/turbo-tasks-fs/src/watcher.rs +++ b/turbopack/crates/turbo-tasks-fs/src/watcher.rs @@ -12,6 +12,7 @@ use std::{ }; use anyhow::{Context, Result}; +use bincode::{Decode, Encode}; use notify::{ Config, EventKind, PollWatcher, RecommendedWatcher, RecursiveMode, Watcher, event::{MetadataKind, ModifyKind, RenameMode}, @@ -60,9 +61,10 @@ static WATCH_RECURSIVE_MODE: LazyLock = LazyLock::new(|| { } }); -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Encode, Decode)] pub(crate) struct DiskWatcher { - #[serde(skip, default = "State::new_stopped")] + #[serde(skip)] + #[bincode(skip)] state: State, } @@ -73,6 +75,12 @@ enum State { NonRecursive(RwLock), } +impl Default for State { + fn default() -> Self { + State::new_stopped() + } +} + enum StateWriteGuard<'a> { Recursive(RwLockWriteGuard<'a, RecursiveState>), NonRecursive(RwLockWriteGuard<'a, NonRecursiveState>), diff --git a/turbopack/crates/turbo-tasks-macros/src/value_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_macro.rs index 487180e55314c..986db0af8921a 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_macro.rs @@ -302,8 +302,11 @@ pub fn value(args: TokenStream, input: TokenStream) -> TokenStream { #[derive( turbo_tasks::macro_helpers::serde::Serialize, turbo_tasks::macro_helpers::serde::Deserialize, + turbo_tasks::macro_helpers::bincode::Encode, + turbo_tasks::macro_helpers::bincode::Decode, )] #[serde(crate = "turbo_tasks::macro_helpers::serde")] + #[bincode(crate = "turbo_tasks::macro_helpers::bincode")] }); if transparent { struct_attributes.push(quote! { diff --git a/turbopack/crates/turbo-tasks/Cargo.toml b/turbopack/crates/turbo-tasks/Cargo.toml index 200867e933292..71aeb02d79bd7 100644 --- a/turbopack/crates/turbo-tasks/Cargo.toml +++ b/turbopack/crates/turbo-tasks/Cargo.toml @@ -25,6 +25,7 @@ workspace = true anyhow = { workspace = true } async-trait = { workspace = true } auto-hash-map = { workspace = true } +bincode = { workspace = true } concurrent-queue = { workspace = true } dashmap = { workspace = true } either = { workspace = true } diff --git a/turbopack/crates/turbo-tasks/src/id.rs b/turbopack/crates/turbo-tasks/src/id.rs index 5d50eb7574c9d..7374aadd0b425 100644 --- a/turbopack/crates/turbo-tasks/src/id.rs +++ b/turbopack/crates/turbo-tasks/src/id.rs @@ -5,6 +5,13 @@ use std::{ ops::Deref, }; +use bincode::{ + Decode, Encode, + de::Decoder, + enc::Encoder, + error::{DecodeError, EncodeError}, + impl_borrow_decode, +}; use serde::{Deserialize, Serialize, de::Visitor}; use crate::{ @@ -118,20 +125,24 @@ macro_rules! define_id { }; } -define_id!(TaskId: u32, derive(Serialize, Deserialize), serde(transparent)); +define_id!(TaskId: u32, derive(Serialize, Deserialize, Encode, Decode), serde(transparent)); define_id!(FunctionId: u16); define_id!(ValueTypeId: u16); define_id!(TraitTypeId: u16); -define_id!(SessionId: u32, derive(Debug, Serialize, Deserialize), serde(transparent)); +define_id!( + SessionId: u32, + derive(Debug, Serialize, Deserialize, Encode, Decode), + serde(transparent), +); define_id!( LocalTaskId: u32, - derive(Debug, Serialize, Deserialize), + derive(Debug, Serialize, Deserialize, Encode, Decode), serde(transparent), doc = "Represents the nth `local` function call inside a task.", ); define_id!( ExecutionId: u16, - derive(Debug, Serialize, Deserialize), + derive(Debug, Serialize, Deserialize, Encode, Decode), serde(transparent), doc = "An identifier for a specific task execution. Used to assert that local `Vc`s don't \ leak. This value may overflow and re-use old values.", @@ -159,8 +170,8 @@ impl TaskId { } } -macro_rules! make_serializable { - ($ty:ty, $get_object:path, $validate_type_id:path, $visitor_name:ident) => { +macro_rules! make_registered_serializable { + ($ty:ty, $primitive:ty, $get_object:path, $validate_type_id:path $(,)?) => { impl Serialize for $ty { fn serialize(&self, serializer: S) -> Result where @@ -175,33 +186,32 @@ macro_rules! make_serializable { where D: serde::Deserializer<'de>, { - deserializer.deserialize_u16($visitor_name) - } - } + struct DeserializeVisitor; + impl<'de> Visitor<'de> for DeserializeVisitor { + type Value = $ty; - struct $visitor_name; - - impl<'de> Visitor<'de> for $visitor_name { - type Value = $ty; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str(concat!("an id of a registered ", stringify!($ty))) - } + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str(concat!("an id of a registered ", stringify!($ty))) + } - fn visit_u16(self, v: u16) -> Result - where - E: serde::de::Error, - { - match Self::Value::new(v) { - Some(value) => { - if let Some(error) = $validate_type_id(value) { - Err(E::custom(error)) - } else { - Ok(value) + fn visit_u16(self, v: u16) -> Result + where + E: serde::de::Error, + { + match Self::Value::new(v) { + Some(value) => { + if let Some(error) = $validate_type_id(value) { + Err(E::custom(error)) + } else { + Ok(value) + } + } + None => Err(E::unknown_variant(&format!("{v}"), &["a non zero u16"])), } } - None => Err(E::unknown_variant(&format!("{v}"), &["a non zero u16"])), } + + deserializer.deserialize_u16(DeserializeVisitor) } } @@ -213,24 +223,45 @@ macro_rules! make_serializable { .finish() } } + + impl Encode for $ty { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + as Encode>::encode(&self.id, encoder) + } + } + + impl Decode for $ty { + fn decode>(decoder: &mut D) -> Result { + let value = Self { + id: NonZero::<$primitive>::decode(decoder)?, + }; + if let Some(error) = $validate_type_id(value) { + Err(DecodeError::OtherString(error.to_string())) + } else { + Ok(value) + } + } + } + + impl_borrow_decode!($ty); }; } -make_serializable!( +make_registered_serializable!( ValueTypeId, + u16, registry::get_value_type, registry::validate_value_type_id, - ValueTypeVisitor ); -make_serializable!( +make_registered_serializable!( TraitTypeId, + u16, registry::get_trait, registry::validate_trait_type_id, - TraitTypeVisitor ); -make_serializable!( +make_registered_serializable!( FunctionId, + u16, registry::get_native_function, registry::validate_function_id, - FunctionTypeVisitor ); diff --git a/turbopack/crates/turbo-tasks/src/invalidation.rs b/turbopack/crates/turbo-tasks/src/invalidation.rs index 9531b6b10af89..7b1ee82d01e47 100644 --- a/turbopack/crates/turbo-tasks/src/invalidation.rs +++ b/turbopack/crates/turbo-tasks/src/invalidation.rs @@ -6,6 +6,13 @@ use std::{ }; use anyhow::Result; +use bincode::{ + Decode, Encode, + de::Decoder, + enc::Encoder, + error::{DecodeError, EncodeError}, + impl_borrow_decode, +}; use indexmap::map::Entry; use serde::{Deserialize, Serialize, de::Visitor}; use tokio::runtime::Handle; @@ -144,6 +151,24 @@ impl<'de> Deserialize<'de> for Invalidator { } } +impl Encode for Invalidator { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + Encode::encode(&self.task, encoder) + } +} + +impl Decode for Invalidator { + fn decode>(decoder: &mut D) -> Result { + Ok(Invalidator { + task: Decode::decode(decoder)?, + turbo_tasks: with_turbo_tasks(Arc::downgrade), + handle: tokio::runtime::Handle::current(), + }) + } +} + +impl_borrow_decode!(Invalidator); + /// A user-facing reason why a task was invalidated. This should only be used /// for invalidation that were triggered by the user. /// diff --git a/turbopack/crates/turbo-tasks/src/macro_helpers.rs b/turbopack/crates/turbo-tasks/src/macro_helpers.rs index 10b3be172cb25..eda78c557366d 100644 --- a/turbopack/crates/turbo-tasks/src/macro_helpers.rs +++ b/turbopack/crates/turbo-tasks/src/macro_helpers.rs @@ -1,6 +1,7 @@ //! Runtime helpers for [turbo-tasks-macro]. pub use async_trait::async_trait; +pub use bincode; pub use once_cell::sync::{Lazy, OnceCell}; use rustc_hash::FxHashMap; pub use serde; diff --git a/turbopack/crates/turbo-tasks/src/manager.rs b/turbopack/crates/turbo-tasks/src/manager.rs index 7c2e58e8e6659..bbd39c16dc1de 100644 --- a/turbopack/crates/turbo-tasks/src/manager.rs +++ b/turbopack/crates/turbo-tasks/src/manager.rs @@ -13,6 +13,7 @@ use std::{ use anyhow::{Result, anyhow}; use auto_hash_map::AutoMap; +use bincode::{Decode, Encode}; use rustc_hash::FxHasher; use serde::{Deserialize, Serialize}; use tokio::{select, sync::mpsc::Receiver, task_local}; @@ -267,7 +268,7 @@ pub struct UpdateInfo { placeholder_for_future_fields: (), } -#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, Encode, Decode)] pub enum TaskPersistence { /// Tasks that may be persisted across sessions using serialization. Persistent, diff --git a/turbopack/crates/turbo-tasks/src/raw_vc.rs b/turbopack/crates/turbo-tasks/src/raw_vc.rs index 60aaf0a0f86cb..4776c34eac6e1 100644 --- a/turbopack/crates/turbo-tasks/src/raw_vc.rs +++ b/turbopack/crates/turbo-tasks/src/raw_vc.rs @@ -7,6 +7,7 @@ use std::{ use anyhow::Result; use auto_hash_map::AutoSet; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -35,7 +36,7 @@ pub enum ResolveTypeError { ReadError { source: anyhow::Error }, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Encode, Decode)] pub struct CellId { pub type_id: ValueTypeId, pub index: u32, @@ -61,7 +62,7 @@ impl Display for CellId { /// otherwise be treated as an internal implementation detail of `turbo-tasks`. /// /// [monomorphization]: https://doc.rust-lang.org/book/ch10-01-syntax.html#performance-of-code-using-generics -#[derive(Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Encode, Decode)] pub enum RawVc { /// The synchronous return value of a task (after argument resolution). This is the /// representation used by [`OperationVc`][crate::OperationVc]. diff --git a/turbopack/crates/turbo-tasks/src/read_ref.rs b/turbopack/crates/turbo-tasks/src/read_ref.rs index 76571dc6276f0..0478fd6a10623 100644 --- a/turbopack/crates/turbo-tasks/src/read_ref.rs +++ b/turbopack/crates/turbo-tasks/src/read_ref.rs @@ -7,6 +7,13 @@ use std::{ ops::Deref, }; +use bincode::{ + Decode, Encode, + de::Decoder, + enc::Encoder, + error::{DecodeError, EncodeError}, + impl_borrow_decode_with_context, +}; use serde::{Deserialize, Serialize}; use turbo_tasks_hash::DeterministicHash; @@ -212,6 +219,27 @@ where } } +impl Encode for ReadRef +where + T: Encode, +{ + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + Self::as_raw_ref(self).encode(encoder) + } +} + +impl Decode for ReadRef +where + T: Decode, +{ + fn decode>(decoder: &mut D) -> Result { + let value = T::decode(decoder)?; + Ok(Self(triomphe::Arc::new(value))) + } +} + +impl_borrow_decode_with_context!(ReadRef, Context, Context, T: Decode); + impl ReadRef { pub fn new_owned(value: T) -> Self { Self(triomphe::Arc::new(value)) diff --git a/turbopack/crates/turbo-tasks/src/serialization_invalidation.rs b/turbopack/crates/turbo-tasks/src/serialization_invalidation.rs index 6e6dbdf007855..b33871a64fa71 100644 --- a/turbopack/crates/turbo-tasks/src/serialization_invalidation.rs +++ b/turbopack/crates/turbo-tasks/src/serialization_invalidation.rs @@ -3,6 +3,13 @@ use std::{ sync::{Arc, Weak}, }; +use bincode::{ + Decode, Encode, + de::Decoder, + enc::Encoder, + error::{DecodeError, EncodeError}, + impl_borrow_decode, +}; use serde::{Deserialize, Serialize, de::Visitor}; use tokio::runtime::Handle; @@ -94,3 +101,21 @@ impl<'de> Deserialize<'de> for SerializationInvalidator { deserializer.deserialize_newtype_struct("SerializationInvalidator", V) } } + +impl Encode for SerializationInvalidator { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + Encode::encode(&self.task, encoder) + } +} + +impl Decode for SerializationInvalidator { + fn decode>(decoder: &mut D) -> Result { + Ok(SerializationInvalidator { + task: Decode::decode(decoder)?, + turbo_tasks: with_turbo_tasks(Arc::downgrade), + handle: tokio::runtime::Handle::current(), + }) + } +} + +impl_borrow_decode!(SerializationInvalidator); diff --git a/turbopack/crates/turbo-tasks/src/state.rs b/turbopack/crates/turbo-tasks/src/state.rs index 84720648ad0cd..ca498c121ed9b 100644 --- a/turbopack/crates/turbo-tasks/src/state.rs +++ b/turbopack/crates/turbo-tasks/src/state.rs @@ -6,6 +6,7 @@ use std::{ }; use auto_hash_map::AutoSet; +use bincode::{Decode, Encode}; use parking_lot::{Mutex, MutexGuard}; use serde::{Deserialize, Serialize}; use tracing::trace_span; @@ -15,7 +16,7 @@ use crate::{ mark_stateful, trace::TraceRawVcs, }; -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Encode, Decode)] struct StateInner { value: T, invalidators: AutoSet, @@ -102,6 +103,41 @@ impl Drop for StateRef<'_, T> { } } +mod parking_lot_mutex_bincode { + use bincode::{ + BorrowDecode, + de::{BorrowDecoder, Decoder}, + enc::Encoder, + error::{DecodeError, EncodeError}, + }; + + use super::*; + + pub fn encode( + mutex: &Mutex, + encoder: &mut E, + ) -> Result<(), EncodeError> { + mutex.lock().encode(encoder) + } + + pub fn decode, D: Decoder>( + decoder: &mut D, + ) -> Result, DecodeError> { + Ok(Mutex::new(T::decode(decoder)?)) + } + + pub fn borrow_decode< + 'de, + Context, + T: BorrowDecode<'de, Context>, + D: BorrowDecoder<'de, Context = Context>, + >( + decoder: &mut D, + ) -> Result, DecodeError> { + Ok(Mutex::new(T::borrow_decode(decoder)?)) + } +} + /// **This API violates core assumption of turbo-tasks, is believed to be unsound, and there's no /// plan fix it.** You should prefer to use [collectibles][crate::CollectiblesSource] instead of /// state where at all possible. This API may be removed in the future. @@ -125,9 +161,10 @@ impl Drop for StateRef<'_, T> { /// [strong consistency]: crate::OperationVc::read_strongly_consistent /// [`OperationVc`]: crate::OperationVc /// [`OperationValue`]: crate::OperationValue -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Encode, Decode)] pub struct State { serialization_invalidator: SerializationInvalidator, + #[bincode(with = "parking_lot_mutex_bincode")] inner: Mutex>, } @@ -235,29 +272,16 @@ impl State { } } +#[derive(Serialize, Deserialize, Encode, Decode)] +#[bincode(bounds = "")] pub struct TransientState { + #[serde(skip, default = "default_transient_state_inner")] + #[bincode(skip, default = "default_transient_state_inner")] inner: Mutex>>, } -impl Serialize for TransientState { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - Serialize::serialize(&(), serializer) - } -} - -impl<'de, T> Deserialize<'de> for TransientState { - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: serde::Deserializer<'de>, - { - let () = Deserialize::deserialize(deserializer)?; - Ok(TransientState { - inner: Mutex::new(StateInner::new(Default::default())), - }) - } +fn default_transient_state_inner() -> Mutex>> { + Mutex::new(StateInner::new(None)) } impl Debug for TransientState { diff --git a/turbopack/crates/turbo-tasks/src/util.rs b/turbopack/crates/turbo-tasks/src/util.rs index fe5432766c453..19c8d34fa780e 100644 --- a/turbopack/crates/turbo-tasks/src/util.rs +++ b/turbopack/crates/turbo-tasks/src/util.rs @@ -14,10 +14,11 @@ use std::{ }; use anyhow::{Error, anyhow}; +use bincode::{Decode, Encode, de::Decoder, error::DecodeError}; use pin_project_lite::pin_project; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -pub use super::{ +pub use crate::{ id_factory::{IdFactory, IdFactoryWithReuse}, once_map::*, }; @@ -89,10 +90,10 @@ impl<'de> Deserialize<'de> for SharedError { fn deserialize>(deserializer: D) -> Result { use serde::de::Error; let mut messages = >::deserialize(deserializer)?; - let mut e = match messages.pop() { - Some(e) => anyhow!(e), - None => return Err(Error::custom("expected at least 1 error message")), - }; + let msg = messages + .pop() + .ok_or_else(|| Error::custom("expected at least 1 error message"))?; + let mut e = anyhow!(msg); while let Some(message) = messages.pop() { e = e.context(message); } @@ -100,6 +101,37 @@ impl<'de> Deserialize<'de> for SharedError { } } +impl Encode for SharedError { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), bincode::error::EncodeError> { + let mut v = vec![self.to_string()]; + let mut source = self.source(); + while let Some(s) = source { + v.push(s.to_string()); + source = s.source(); + } + Encode::encode(&v, encoder) + } +} + +impl Decode for SharedError { + fn decode>(decoder: &mut D) -> Result { + let mut messages = >::decode(decoder)?; + let msg = messages + .pop() + .ok_or(DecodeError::Other("expected at least 1 error message"))?; + let mut e = anyhow!(msg); + while let Some(message) = messages.pop() { + e = e.context(message); + } + Ok(SharedError::new(e)) + } +} + +bincode::impl_borrow_decode!(SharedError); + impl Deref for SharedError { type Target = Arc; fn deref(&self) -> &Self::Target { diff --git a/turbopack/crates/turbo-tasks/src/vc/mod.rs b/turbopack/crates/turbo-tasks/src/vc/mod.rs index 62c2b31ba2cd7..65818ea3ec922 100644 --- a/turbopack/crates/turbo-tasks/src/vc/mod.rs +++ b/turbopack/crates/turbo-tasks/src/vc/mod.rs @@ -17,6 +17,7 @@ use std::{ }; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use shrink_to_fit::ShrinkToFit; @@ -161,8 +162,9 @@ type VcReadTarget = <::Read as VcRead>::Target; /// [book-cells]: https://turbopack-rust-docs.vercel.sh/turbo-engine/cells.html /// [collectibles]: crate::CollectiblesSource #[must_use] -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Encode, Decode)] #[serde(transparent, bound = "")] +#[bincode(bounds = "T: ?Sized")] #[repr(transparent)] pub struct Vc where diff --git a/turbopack/crates/turbo-tasks/src/vc/operation.rs b/turbopack/crates/turbo-tasks/src/vc/operation.rs index f423f798278c4..d259f68d41f71 100644 --- a/turbopack/crates/turbo-tasks/src/vc/operation.rs +++ b/turbopack/crates/turbo-tasks/src/vc/operation.rs @@ -2,6 +2,7 @@ use std::{fmt::Debug, hash::Hash, marker::PhantomData}; use anyhow::Result; use auto_hash_map::AutoSet; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; pub use turbo_tasks_macros::OperationValue; @@ -48,6 +49,9 @@ use crate::{ /// [`State`]: crate::State /// [`ReadRef`]: crate::ReadRef #[must_use] +#[derive(Serialize, Deserialize, Encode, Decode)] +#[serde(transparent, bound = "")] +#[bincode(bounds = "T: ?Sized")] #[repr(transparent)] pub struct OperationVc where @@ -203,26 +207,6 @@ where } } -impl Serialize for OperationVc -where - T: ?Sized, -{ - fn serialize(&self, serializer: S) -> Result { - self.node.serialize(serializer) - } -} - -impl<'de, T> Deserialize<'de> for OperationVc -where - T: ?Sized, -{ - fn deserialize>(deserializer: D) -> Result { - Ok(OperationVc { - node: Vc::deserialize(deserializer)?, - }) - } -} - impl TraceRawVcs for OperationVc where T: ?Sized, diff --git a/turbopack/crates/turbo-tasks/src/vc/resolved.rs b/turbopack/crates/turbo-tasks/src/vc/resolved.rs index 5455e200e8806..a0aa4b442d535 100644 --- a/turbopack/crates/turbo-tasks/src/vc/resolved.rs +++ b/turbopack/crates/turbo-tasks/src/vc/resolved.rs @@ -9,6 +9,7 @@ use std::{ }; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use crate::{ @@ -64,8 +65,9 @@ use crate::{ /// [`NonLocalValue`]: crate::NonLocalValue /// [rewritten external signature]: https://turbopack-rust-docs.vercel.sh/turbo-engine/tasks.html#external-signature-rewriting /// [`ReadRef`]: crate::ReadRef -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Encode, Decode)] #[serde(transparent, bound = "")] +#[bincode(bounds = "T: ?Sized")] #[repr(transparent)] pub struct ResolvedVc where diff --git a/turbopack/crates/turbopack-analyze/Cargo.toml b/turbopack/crates/turbopack-analyze/Cargo.toml index f469b901d5d1e..c70b422816b69 100644 --- a/turbopack/crates/turbopack-analyze/Cargo.toml +++ b/turbopack/crates/turbopack-analyze/Cargo.toml @@ -10,6 +10,7 @@ bench = false [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } rustc-hash = { workspace = true } serde = { workspace = true, features = ["derive"] } turbo-rcstr = { workspace = true } diff --git a/turbopack/crates/turbopack-analyze/src/split_chunk.rs b/turbopack/crates/turbopack-analyze/src/split_chunk.rs index 657b4081b2b22..36731733e4675 100644 --- a/turbopack/crates/turbopack-analyze/src/split_chunk.rs +++ b/turbopack/crates/turbopack-analyze/src/split_chunk.rs @@ -1,6 +1,7 @@ use std::mem::replace; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{FxIndexMap, NonLocalValue, ValueToString, Vc, trace::TraceRawVcs}; @@ -11,14 +12,18 @@ use turbopack_core::{ source_map::{GenerateSourceMap, OriginalToken, SourceMap, SyntheticToken, Token}, }; -#[derive(Clone, Debug, Deserialize, Eq, NonLocalValue, PartialEq, Serialize, TraceRawVcs)] +#[derive( + Clone, Debug, Deserialize, Eq, NonLocalValue, PartialEq, Serialize, TraceRawVcs, Encode, Decode, +)] pub struct ChunkPartRange { pub line: u32, pub start_column: u32, pub end_column: u32, } -#[derive(Clone, Debug, Deserialize, Eq, NonLocalValue, PartialEq, Serialize, TraceRawVcs)] +#[derive( + Clone, Debug, Deserialize, Eq, NonLocalValue, PartialEq, Serialize, TraceRawVcs, Encode, Decode, +)] pub struct ChunkPart { pub source: RcStr, pub real_size: u32, diff --git a/turbopack/crates/turbopack-browser/Cargo.toml b/turbopack/crates/turbopack-browser/Cargo.toml index 35553e214435c..fd634233594b7 100644 --- a/turbopack/crates/turbopack-browser/Cargo.toml +++ b/turbopack/crates/turbopack-browser/Cargo.toml @@ -20,6 +20,7 @@ workspace = true [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } either = { workspace = true } indoc = { workspace = true } serde = { workspace = true } @@ -28,6 +29,7 @@ serde_qs = { workspace = true } tracing = { workspace = true } urlencoding = { workspace = true } +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-fs = { workspace = true } diff --git a/turbopack/crates/turbopack-browser/src/chunking_context.rs b/turbopack/crates/turbopack-browser/src/chunking_context.rs index 6636684f8e95c..f9c516f66aacd 100644 --- a/turbopack/crates/turbopack-browser/src/chunking_context.rs +++ b/turbopack/crates/turbopack-browser/src/chunking_context.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use tracing::Instrument; use turbo_rcstr::{RcStr, rcstr}; @@ -64,6 +65,8 @@ pub const CURRENT_CHUNK_METHOD_DOCUMENT_CURRENT_SCRIPT_EXPR: &str = TraceRawVcs, DeterministicHash, NonLocalValue, + Encode, + Decode, )] pub enum ContentHashing { /// Direct content hashing: Embeds the chunk content hash directly into the referencing chunk. @@ -243,12 +246,14 @@ pub struct BrowserChunkingContext { /// This path is used to compute the url to request assets from client_root: FileSystemPath, /// This path is used to compute the url to request chunks or assets from + #[bincode(with = "turbo_bincode::indexmap")] client_roots: FxIndexMap, /// Chunks are placed at this path chunk_root_path: FileSystemPath, /// Static assets are placed at this path asset_root_path: FileSystemPath, /// Static assets are placed at this path + #[bincode(with = "turbo_bincode::indexmap")] asset_root_paths: FxIndexMap, /// Base path that will be prepended to all chunk URLs when loading them. /// This path will not appear in chunk paths or chunk data. @@ -261,6 +266,7 @@ pub struct BrowserChunkingContext { asset_base_path: Option, /// URL prefix that will be prepended to all static asset URLs when loading /// them. + #[bincode(with = "turbo_bincode::indexmap")] asset_base_paths: FxIndexMap, /// Enable HMR for this chunking enable_hot_module_replacement: bool, diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/content_entry.rs b/turbopack/crates/turbopack-browser/src/ecmascript/content_entry.rs index f3adfadd418ff..a9c0ed7a6fe4c 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/content_entry.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/content_entry.rs @@ -38,6 +38,7 @@ impl EcmascriptDevChunkContentEntry { #[turbo_tasks::value(transparent)] pub struct EcmascriptBrowserChunkContentEntries( + #[bincode(with = "turbo_bincode::indexmap")] FxIndexMap, EcmascriptDevChunkContentEntry>, ); diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/list/asset.rs b/turbopack/crates/turbopack-browser/src/ecmascript/list/asset.rs index ade85ada809a3..626f6b7f953f8 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/list/asset.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/list/asset.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, ValueToString, Vc, trace::TraceRawVcs}; @@ -128,6 +129,8 @@ impl Asset for EcmascriptDevChunkList { TraceRawVcs, Serialize, Deserialize, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub enum EcmascriptDevChunkListSource { diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/list/content.rs b/turbopack/crates/turbopack-browser/src/ecmascript/list/content.rs index 76014bb7518c9..809be582863cd 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/list/content.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/list/content.rs @@ -1,6 +1,7 @@ use std::io::Write; use anyhow::{Context, Result}; +use bincode::{Decode, Encode}; use either::Either; use indoc::writedoc; use serde::{Deserialize, Serialize}; @@ -29,7 +30,9 @@ use crate::chunking_context::{ CURRENT_CHUNK_METHOD_DOCUMENT_CURRENT_SCRIPT_EXPR, CurrentChunkMethod, }; -#[derive(Clone, Debug, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue)] +#[derive( + Clone, Debug, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue, Encode, Decode, +)] enum CurrentChunkMethodWithData { StringLiteral(RcStr), DocumentCurrentScript, @@ -39,6 +42,7 @@ enum CurrentChunkMethodWithData { #[turbo_tasks::value] pub(super) struct EcmascriptDevChunkListContent { current_chunk_method: CurrentChunkMethodWithData, + #[bincode(with = "turbo_bincode::indexmap")] pub(super) chunks_contents: FxIndexMap>>, source: EcmascriptDevChunkListSource, } diff --git a/turbopack/crates/turbopack-core/Cargo.toml b/turbopack/crates/turbopack-core/Cargo.toml index 9a1101b3f5d6f..ff4adad721881 100644 --- a/turbopack/crates/turbopack-core/Cargo.toml +++ b/turbopack/crates/turbopack-core/Cargo.toml @@ -16,6 +16,7 @@ workspace = true anyhow = { workspace = true } async-trait = { workspace = true } auto-hash-map = { workspace = true } +bincode = { workspace = true } bitfield = { workspace = true } browserslist-rs = { workspace = true } bytes-str = { workspace = true } @@ -37,6 +38,7 @@ smallvec = { workspace = true } swc_sourcemap = { workspace = true } swc_core = { workspace = true, features = ["ecma_preset_env", "common"] } tracing = { workspace = true } +turbo-bincode = { workspace = true } turbo-prehash = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } diff --git a/turbopack/crates/turbopack-core/src/chunk/availability_info.rs b/turbopack/crates/turbopack-core/src/chunk/availability_info.rs index b1506dbc116c4..56d151d5687c1 100644 --- a/turbopack/crates/turbopack-core/src/chunk/availability_info.rs +++ b/turbopack/crates/turbopack-core/src/chunk/availability_info.rs @@ -1,13 +1,14 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use bitfield::bitfield; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, Vc, trace::TraceRawVcs}; -use super::available_modules::{AvailableModules, AvailableModulesSet}; +use crate::chunk::available_modules::{AvailableModules, AvailableModulesSet}; bitfield! { - #[derive(Clone, Copy, Default, TaskInput, TraceRawVcs, NonLocalValue, Serialize, Deserialize, PartialEq, Eq, Hash)] + #[derive(Clone, Copy, Default, TaskInput, TraceRawVcs, NonLocalValue, Serialize, Deserialize, PartialEq, Eq, Hash, Encode, Decode)] pub struct AvailabilityFlags(u8); impl Debug; pub is_in_async_module, set_is_in_async_module: 0; @@ -25,6 +26,8 @@ bitfield! { NonLocalValue, Serialize, Deserialize, + Encode, + Decode, )] pub struct AvailabilityInfo { flags: AvailabilityFlags, diff --git a/turbopack/crates/turbopack-core/src/chunk/available_modules.rs b/turbopack/crates/turbopack-core/src/chunk/available_modules.rs index 61323e264489f..da3e6b7ab8535 100644 --- a/turbopack/crates/turbopack-core/src/chunk/available_modules.rs +++ b/turbopack/crates/turbopack-core/src/chunk/available_modules.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{ FxIndexSet, NonLocalValue, ReadRef, ResolvedVc, TaskInput, TryJoinIterExt, ValueToString, Vc, @@ -24,6 +25,8 @@ use crate::{ TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub enum AvailableModuleItem { Module(ResolvedVc>), @@ -61,7 +64,9 @@ impl From for AvailableModuleItem { #[turbo_tasks::value(transparent)] #[derive(Debug, Clone)] -pub struct AvailableModulesSet(FxIndexSet); +pub struct AvailableModulesSet( + #[bincode(with = "turbo_bincode::indexset")] FxIndexSet, +); /// Allows to gather information about which assets are already available. /// Adding more roots will form a linked list like structure to allow caching diff --git a/turbopack/crates/turbopack-core/src/chunk/chunk_item_batch.rs b/turbopack/crates/turbopack-core/src/chunk/chunk_item_batch.rs index bde7d7d5d34d9..e8f7a7aface82 100644 --- a/turbopack/crates/turbopack-core/src/chunk/chunk_item_batch.rs +++ b/turbopack/crates/turbopack-core/src/chunk/chunk_item_batch.rs @@ -1,6 +1,7 @@ use std::{future::Future, hash::Hash, ops::Deref}; use anyhow::Result; +use bincode::{Decode, Encode}; use either::Either; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; @@ -49,7 +50,18 @@ pub async fn attach_async_info_to_chunkable_module( } #[derive( - Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, TraceRawVcs, NonLocalValue, TaskInput, + Debug, + Clone, + PartialEq, + Eq, + Hash, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + TaskInput, + Encode, + Decode, )] pub enum ChunkItemOrBatchWithAsyncModuleInfo { ChunkItem(ChunkItemWithAsyncModuleInfo), diff --git a/turbopack/crates/turbopack-core/src/chunk/chunking/mod.rs b/turbopack/crates/turbopack-core/src/chunk/chunking/mod.rs index 4a2f4841bc303..5d0621cd43348 100644 --- a/turbopack/crates/turbopack-core/src/chunk/chunking/mod.rs +++ b/turbopack/crates/turbopack-core/src/chunk/chunking/mod.rs @@ -1,6 +1,7 @@ use std::future::IntoFuture; use anyhow::Result; +use bincode::{Decode, Encode}; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; use smallvec::{SmallVec, smallvec}; @@ -50,7 +51,16 @@ struct BatchChunkItemsWithInfo( ); #[derive( - Clone, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, ValueDebugFormat, + Clone, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + ValueDebugFormat, + Encode, + Decode, )] enum ChunkItemOrBatchWithInfo { ChunkItem { diff --git a/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs b/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs index 9914e2d05a3f8..f81375f0a89dc 100644 --- a/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs +++ b/turbopack/crates/turbopack-core/src/chunk/chunking_context.rs @@ -1,4 +1,5 @@ use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; @@ -6,10 +7,12 @@ use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, Upcast, Vc, trace::Trace use turbo_tasks_fs::FileSystemPath; use turbo_tasks_hash::DeterministicHash; -use super::{ChunkableModule, EvaluatableAssets, availability_info::AvailabilityInfo}; use crate::{ asset::Asset, - chunk::{ChunkItem, ChunkType, ModuleId}, + chunk::{ + ChunkItem, ChunkType, ChunkableModule, EvaluatableAssets, ModuleId, + availability_info::AvailabilityInfo, + }, environment::Environment, ident::AssetIdent, module::Module, @@ -36,6 +39,8 @@ use crate::{ TraceRawVcs, DeterministicHash, NonLocalValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum MangleType { @@ -85,6 +90,8 @@ pub enum SourceMapsType { TraceRawVcs, DeterministicHash, NonLocalValue, + Encode, + Decode, )] pub enum ChunkGroupType { Entry, @@ -225,6 +232,8 @@ pub struct EntryChunkGroupResult { TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub struct ChunkingConfig { /// Try to avoid creating more than 1 chunk smaller than this size. diff --git a/turbopack/crates/turbopack-core/src/chunk/mod.rs b/turbopack/crates/turbopack-core/src/chunk/mod.rs index 55af21221e55b..b4cd44f58bdac 100644 --- a/turbopack/crates/turbopack-core/src/chunk/mod.rs +++ b/turbopack/crates/turbopack-core/src/chunk/mod.rs @@ -14,6 +14,7 @@ use std::fmt::Display; use anyhow::Result; use auto_hash_map::AutoSet; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{ @@ -159,6 +160,8 @@ impl MergeableModules { NonLocalValue, TaskInput, Hash, + Encode, + Decode, )] pub enum MergeableModuleExposure { // This module is only used from within the current group, and only individual exports are @@ -265,6 +268,8 @@ pub trait OutputChunk: Asset { PartialEq, ValueDebugFormat, NonLocalValue, + Encode, + Decode, )] pub enum ChunkingType { /// The referenced module is placed in the same chunk group and is loaded in parallel. @@ -508,7 +513,18 @@ impl AsyncModuleInfo { } #[derive( - Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash, TraceRawVcs, TaskInput, NonLocalValue, + Serialize, + Deserialize, + Debug, + Clone, + PartialEq, + Eq, + Hash, + TraceRawVcs, + TaskInput, + NonLocalValue, + Encode, + Decode, )] pub struct ChunkItemWithAsyncModuleInfo { pub chunk_item: ResolvedVc>, diff --git a/turbopack/crates/turbopack-core/src/compile_time_info.rs b/turbopack/crates/turbopack-core/src/compile_time_info.rs index 0737a64b681de..ee0afc764dec5 100644 --- a/turbopack/crates/turbopack-core/src/compile_time_info.rs +++ b/turbopack/crates/turbopack-core/src/compile_time_info.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{FxIndexMap, NonLocalValue, ResolvedVc, Vc, trace::TraceRawVcs}; @@ -180,12 +181,16 @@ impl From for DefinableNameSegment { #[turbo_tasks::value(transparent)] #[derive(Debug, Clone)] -pub struct CompileTimeDefines(pub FxIndexMap, CompileTimeDefineValue>); +pub struct CompileTimeDefines( + #[bincode(with = "turbo_bincode::indexmap")] + pub FxIndexMap, CompileTimeDefineValue>, +); #[turbo_tasks::value(transparent)] #[derive(Debug, Clone)] pub struct CompileTimeDefinesIndividual( - pub FxIndexMap, ResolvedVc>, + #[bincode(with = "turbo_bincode::indexmap")] + pub FxIndexMap, ResolvedVc>, ); impl IntoIterator for CompileTimeDefines { @@ -219,7 +224,19 @@ impl CompileTimeDefines { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue)] +#[derive( + Debug, + Clone, + Copy, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, +)] pub enum InputRelativeConstant { // The project relative directory name of the source file DirName, @@ -273,16 +290,35 @@ impl From for FreeVarReference { #[turbo_tasks::value(transparent)] #[derive(Debug, Clone)] -pub struct FreeVarReferences(pub FxIndexMap, FreeVarReference>); +pub struct FreeVarReferences( + #[bincode(with = "turbo_bincode::indexmap")] + pub FxIndexMap, FreeVarReference>, +); + +#[derive( + Debug, + Default, + Clone, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, +)] +pub struct FreeVarReferenceVcs( + #[bincode(with = "turbo_bincode::indexmap")] + pub FxIndexMap, ResolvedVc>, +); /// A map from the last element (the member prop) to a map of the rest of the name to the value. #[turbo_tasks::value(transparent)] #[derive(Debug, Clone)] pub struct FreeVarReferencesIndividual( - pub FxIndexMap< - DefinableNameSegment, - FxIndexMap, ResolvedVc>, - >, + #[bincode(with = "turbo_bincode::indexmap")] + pub FxIndexMap, ); #[turbo_tasks::value_impl] @@ -294,22 +330,21 @@ impl FreeVarReferences { #[turbo_tasks::function] pub fn individual(&self) -> Vc { - let mut result: FxIndexMap< - DefinableNameSegment, - FxIndexMap, ResolvedVc>, - > = FxIndexMap::default(); + let mut result: FxIndexMap = + FxIndexMap::default(); for (key, value) in &self.0 { let (last_key, key) = key.split_last().unwrap(); result .entry(last_key.clone()) .or_default() + .0 .insert(key.to_vec(), value.clone().resolved_cell()); } // Sort keys to make order as deterministic as possible result.sort_keys(); - result.iter_mut().for_each(|(_, inner)| inner.sort_keys()); + result.iter_mut().for_each(|(_, inner)| inner.0.sort_keys()); Vc::cell(result) } diff --git a/turbopack/crates/turbopack-core/src/condition.rs b/turbopack/crates/turbopack-core/src/condition.rs index 3620f2f7933db..bc2d3af2f6699 100644 --- a/turbopack/crates/turbopack-core/src/condition.rs +++ b/turbopack/crates/turbopack-core/src/condition.rs @@ -1,8 +1,11 @@ +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, trace::TraceRawVcs}; use turbo_tasks_fs::FileSystemPath; -#[derive(Debug, Clone, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue)] +#[derive( + Debug, Clone, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue, Encode, Decode, +)] pub enum ContextCondition { All(Vec), Any(Vec), diff --git a/turbopack/crates/turbopack-core/src/diagnostics/mod.rs b/turbopack/crates/turbopack-core/src/diagnostics/mod.rs index 5a65c3c4634e2..ccc695dd50359 100644 --- a/turbopack/crates/turbopack-core/src/diagnostics/mod.rs +++ b/turbopack/crates/turbopack-core/src/diagnostics/mod.rs @@ -45,7 +45,9 @@ impl PartialOrd for PlainDiagnostic { } #[turbo_tasks::value(transparent)] -pub struct DiagnosticPayload(pub FxIndexMap); +pub struct DiagnosticPayload( + #[bincode(with = "turbo_bincode::indexmap")] pub FxIndexMap, +); /// An arbitrary payload can be used to analyze, diagnose /// Turbopack's behavior. diff --git a/turbopack/crates/turbopack-core/src/ident.rs b/turbopack/crates/turbopack-core/src/ident.rs index 360c6d4a76eb7..91eca4b7710e9 100644 --- a/turbopack/crates/turbopack-core/src/ident.rs +++ b/turbopack/crates/turbopack-core/src/ident.rs @@ -1,6 +1,7 @@ use std::fmt::Write; use anyhow::Result; +use bincode::{Decode, Encode}; use once_cell::sync::Lazy; use regex::Regex; use serde::{Deserialize, Serialize}; @@ -26,6 +27,8 @@ use crate::resolve::ModulePart; Serialize, Deserialize, NonLocalValue, + Encode, + Decode, )] pub struct Layer { name: RcStr, diff --git a/turbopack/crates/turbopack-core/src/introspect/mod.rs b/turbopack/crates/turbopack-core/src/introspect/mod.rs index 9a0b63a12b374..cf06178c05597 100644 --- a/turbopack/crates/turbopack-core/src/introspect/mod.rs +++ b/turbopack/crates/turbopack-core/src/introspect/mod.rs @@ -6,10 +6,11 @@ pub mod utils; use turbo_rcstr::RcStr; use turbo_tasks::{FxIndexSet, ResolvedVc, Vc}; -type VcDynIntrospectable = ResolvedVc>; - #[turbo_tasks::value(transparent)] -pub struct IntrospectableChildren(FxIndexSet<(RcStr, VcDynIntrospectable)>); +pub struct IntrospectableChildren( + #[bincode(with = "turbo_bincode::indexset")] + FxIndexSet<(RcStr, ResolvedVc>)>, +); #[turbo_tasks::value_trait] pub trait Introspectable { diff --git a/turbopack/crates/turbopack-core/src/issue/mod.rs b/turbopack/crates/turbopack-core/src/issue/mod.rs index afd7822d4397a..6cd2a462ef8f0 100644 --- a/turbopack/crates/turbopack-core/src/issue/mod.rs +++ b/turbopack/crates/turbopack-core/src/issue/mod.rs @@ -10,6 +10,7 @@ use std::{ use anyhow::{Result, anyhow}; use auto_hash_map::AutoSet; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{ @@ -290,6 +291,8 @@ impl CapturedIssues { TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub struct IssueSource { source: ResolvedVc>, @@ -309,6 +312,8 @@ pub struct IssueSource { TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] enum SourceRange { LineColumn(SourcePos, SourcePos), diff --git a/turbopack/crates/turbopack-core/src/module_graph/chunk_group_info.rs b/turbopack/crates/turbopack-core/src/module_graph/chunk_group_info.rs index 0b3f99b9ffb1d..cbc73f4a61826 100644 --- a/turbopack/crates/turbopack-core/src/module_graph/chunk_group_info.rs +++ b/turbopack/crates/turbopack-core/src/module_graph/chunk_group_info.rs @@ -4,6 +4,7 @@ use std::{ }; use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use either::Either; use indexmap::map::Entry; use roaring::RoaringBitmap; @@ -23,10 +24,23 @@ use crate::{ }; #[derive( - Clone, Debug, Default, PartialEq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, + Clone, + Debug, + Default, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + Encode, + Decode, )] #[repr(transparent)] -pub struct RoaringBitmapWrapper(#[turbo_tasks(trace_ignore)] pub RoaringBitmap); +pub struct RoaringBitmapWrapper( + #[turbo_tasks(trace_ignore)] + #[bincode(with_serde)] + pub RoaringBitmap, +); impl TaskInput for RoaringBitmapWrapper { fn is_transient(&self) -> bool { @@ -84,8 +98,10 @@ impl Hash for RoaringBitmapWrapper { pub struct ChunkGroupInfo { pub module_chunk_groups: FxHashMap>, RoaringBitmapWrapper>, #[turbo_tasks(trace_ignore)] + #[bincode(with = "turbo_bincode::indexset")] pub chunk_groups: FxIndexSet, #[turbo_tasks(trace_ignore)] + #[bincode(with = "turbo_bincode::indexset")] pub chunk_group_keys: FxIndexSet, } @@ -111,7 +127,18 @@ impl ChunkGroupInfo { } #[derive( - Debug, Clone, Hash, TaskInput, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, + Debug, + Clone, + Hash, + TaskInput, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, )] pub enum ChunkGroupEntry { /// e.g. a page @@ -148,7 +175,19 @@ impl ChunkGroupEntry { } } -#[derive(Debug, Clone, Hash, TaskInput, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs)] +#[derive( + Debug, + Clone, + Hash, + TaskInput, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + Encode, + Decode, +)] pub enum ChunkGroup { /// e.g. a page Entry(Vec>>), @@ -266,7 +305,7 @@ impl ChunkGroup { } } -#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, Encode, Decode)] pub enum ChunkGroupKey { /// e.g. a page Entry(Vec>>), @@ -329,7 +368,7 @@ impl ChunkGroupKey { } } -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Encode, Decode)] pub struct ChunkGroupId(u32); impl From for ChunkGroupId { diff --git a/turbopack/crates/turbopack-core/src/module_graph/mod.rs b/turbopack/crates/turbopack-core/src/module_graph/mod.rs index 68544bc8d9f9b..2c3620c6a0770 100644 --- a/turbopack/crates/turbopack-core/src/module_graph/mod.rs +++ b/turbopack/crates/turbopack-core/src/module_graph/mod.rs @@ -6,6 +6,7 @@ use std::{ use anyhow::{Context, Result, bail}; use auto_hash_map::AutoSet; +use bincode::{Decode, Encode}; use petgraph::{ graph::{DiGraph, EdgeIndex, NodeIndex}, visit::{EdgeRef, IntoNeighbors, IntoNodeReferences, NodeIndexable, Reversed}, @@ -51,12 +52,25 @@ mod traced_di_graph; pub use self::module_batches::BatchingConfig; #[derive( - Debug, Copy, Clone, Eq, PartialOrd, Ord, Hash, PartialEq, Serialize, Deserialize, TraceRawVcs, + Debug, + Copy, + Clone, + Eq, + PartialOrd, + Ord, + Hash, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + Encode, + Decode, )] pub struct GraphNodeIndex { #[turbo_tasks(trace_ignore)] graph_idx: u32, #[turbo_tasks(trace_ignore)] + #[bincode(with_serde)] node_idx: NodeIndex, } impl GraphNodeIndex { @@ -71,6 +85,7 @@ unsafe impl NonLocalValue for GraphNodeIndex {} #[turbo_tasks::value] #[derive(Clone, Debug)] pub struct VisitedModules { + #[bincode(with = "turbo_bincode::indexmap")] pub modules: FxIndexMap>, GraphNodeIndex>, next_graph_idx: u32, } @@ -184,6 +199,7 @@ pub struct SingleModuleGraph { // // This contains Vcs, but they are already contained in the graph, so no need to trace this. #[turbo_tasks(trace_ignore)] + #[bincode(with_serde)] modules: FxHashMap>, NodeIndex>, #[turbo_tasks(trace_ignore)] @@ -1364,7 +1380,7 @@ impl SingleModuleGraph { } } -#[derive(Clone, Debug, Serialize, Deserialize, TraceRawVcs, NonLocalValue)] +#[derive(Clone, Debug, Serialize, Deserialize, TraceRawVcs, NonLocalValue, Encode, Decode)] pub enum SingleModuleGraphNode { Module(ResolvedVc>), // Models a module that is referenced but has already been visited by an earlier graph. diff --git a/turbopack/crates/turbopack-core/src/module_graph/module_batch.rs b/turbopack/crates/turbopack-core/src/module_graph/module_batch.rs index 83158b9a55fa3..20fe9a3fda216 100644 --- a/turbopack/crates/turbopack-core/src/module_graph/module_batch.rs +++ b/turbopack/crates/turbopack-core/src/module_graph/module_batch.rs @@ -1,6 +1,7 @@ use std::fmt::Debug; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{ @@ -24,6 +25,8 @@ use crate::{ TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub enum ModuleOrBatch { Module(ResolvedVc>), @@ -55,6 +58,8 @@ impl ModuleOrBatch { TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub enum ChunkableModuleOrBatch { Module(ResolvedVc>), diff --git a/turbopack/crates/turbopack-core/src/module_graph/module_batches.rs b/turbopack/crates/turbopack-core/src/module_graph/module_batches.rs index ec33427329202..d27890ea537b6 100644 --- a/turbopack/crates/turbopack-core/src/module_graph/module_batches.rs +++ b/turbopack/crates/turbopack-core/src/module_graph/module_batches.rs @@ -5,6 +5,7 @@ use std::{ }; use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use either::Either; use petgraph::graph::{DiGraph, EdgeIndex, NodeIndex}; use rustc_hash::{FxHashMap, FxHashSet, FxHasher}; @@ -48,7 +49,10 @@ pub struct ModuleBatchesGraphEdge { pub module: Option>>, } -type EntriesList = FxIndexSet>>; +#[derive(Debug, Clone, Serialize, Deserialize, TraceRawVcs, NonLocalValue, Encode, Decode)] +struct EntriesList( + #[bincode(with = "turbo_bincode::indexset")] pub FxIndexSet>>, +); #[turbo_tasks::value(cell = "new", eq = "manual")] pub struct ModuleBatchesGraph { @@ -61,6 +65,7 @@ pub struct ModuleBatchesGraph { // // This contains Vcs, but they are already contained in the graph, so no need to trace this. #[turbo_tasks(trace_ignore)] + #[bincode(with_serde)] entries: FxHashMap>, NodeIndex>, batch_groups: FxHashMap>, @@ -92,7 +97,7 @@ impl ModuleBatchesGraph { chunk_group_info: &'l ChunkGroupInfo, idx: usize, ) -> impl Iterator>> + 'l { - if let Some(ordered_entries) = self + if let Some(EntriesList(ordered_entries)) = self .ordered_entries .get(idx) .as_ref() @@ -444,7 +449,7 @@ pub async fn compute_module_batches( .as_ref() .map_or_else( || Either::Left(chunk_group.entries()), - |v| Either::Right(v.iter().copied()), + |v| Either::Right(v.0.iter().copied()), ) .map(|module| { let idx = *pre_batches.entries.get(&module).unwrap(); @@ -500,7 +505,7 @@ pub async fn compute_module_batches( .chunk_group_keys .get_index_of(&chunk_group_key) .unwrap(); - ordered_entries[idx] = Some(merged_modules); + ordered_entries[idx] = Some(EntriesList(merged_modules)); } } } diff --git a/turbopack/crates/turbopack-core/src/module_graph/style_groups.rs b/turbopack/crates/turbopack-core/src/module_graph/style_groups.rs index ec8a550d65d86..f9c750723ad08 100644 --- a/turbopack/crates/turbopack-core/src/module_graph/style_groups.rs +++ b/turbopack/crates/turbopack-core/src/module_graph/style_groups.rs @@ -37,6 +37,7 @@ pub struct StyleGroupsConfig { pub struct StyleGroups { /// The key chunk item is contained in the value chunk item batch. All chunk items that are not /// contained in this map are placed in a separate chunk per chunk item. + #[bincode(with = "turbo_bincode::indexmap")] pub shared_chunk_items: FxIndexMap>, } diff --git a/turbopack/crates/turbopack-core/src/module_graph/traced_di_graph.rs b/turbopack/crates/turbopack-core/src/module_graph/traced_di_graph.rs index 978d54c6912dd..2e2918dda2eeb 100644 --- a/turbopack/crates/turbopack-core/src/module_graph/traced_di_graph.rs +++ b/turbopack/crates/turbopack-core/src/module_graph/traced_di_graph.rs @@ -1,15 +1,21 @@ use std::ops::Deref; +use bincode::{Decode, Encode}; use petgraph::graph::{DiGraph, EdgeIndex, NodeIndex}; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize, de::DeserializeOwned}; use turbo_tasks::{ NonLocalValue, debug::ValueDebugFormat, trace::{TraceRawVcs, TraceRawVcsContext}, }; -#[derive(Clone, Debug, ValueDebugFormat, Serialize, Deserialize)] -pub struct TracedDiGraph(pub DiGraph); +#[derive(Clone, Debug, ValueDebugFormat, Serialize, Deserialize, Encode, Decode)] +#[bincode( + encode_bounds = "N: Serialize, E: Serialize", + decode_bounds = "N: DeserializeOwned, E: DeserializeOwned", + borrow_decode_bounds = "N: Deserialize<'__de>, E: Deserialize<'__de>" +)] +pub struct TracedDiGraph(#[bincode(with_serde)] pub DiGraph); impl Default for TracedDiGraph { fn default() -> Self { Self(Default::default()) diff --git a/turbopack/crates/turbopack-core/src/output.rs b/turbopack/crates/turbopack-core/src/output.rs index 8f7542f8d6cb9..4bbc0ffd09f45 100644 --- a/turbopack/crates/turbopack-core/src/output.rs +++ b/turbopack/crates/turbopack-core/src/output.rs @@ -107,7 +107,9 @@ pub struct ExpandedOutputAssets(Vec>>); /// A set of [OutputAsset]s #[turbo_tasks::value(transparent)] -pub struct OutputAssetsSet(FxIndexSet>>); +pub struct OutputAssetsSet( + #[bincode(with = "turbo_bincode::indexset")] FxIndexSet>>, +); #[turbo_tasks::value(shared)] #[derive(Clone)] diff --git a/turbopack/crates/turbopack-core/src/reference_type.rs b/turbopack/crates/turbopack-core/src/reference_type.rs index 35099bd467b7d..f3d9c1d7a3313 100644 --- a/turbopack/crates/turbopack-core/src/reference_type.rs +++ b/turbopack/crates/turbopack-core/src/reference_type.rs @@ -1,6 +1,8 @@ use std::fmt::Display; use anyhow::Result; +use bincode::{Decode, Encode}; +use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{FxIndexMap, NonLocalValue, ResolvedVc, TaskInput, Vc, trace::TraceRawVcs}; @@ -11,7 +13,9 @@ use crate::{module::Module, resolve::ModulePart}; /// /// Name is usually in UPPER_CASE to make it clear that this is an inner asset. #[turbo_tasks::value(transparent)] -pub struct InnerAssets(FxIndexMap>>); +pub struct InnerAssets( + #[bincode(with = "turbo_bincode::indexmap")] FxIndexMap>>, +); #[turbo_tasks::value_impl] impl InnerAssets { @@ -32,14 +36,16 @@ impl InnerAssets { Eq, TraceRawVcs, NonLocalValue, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, Debug, Default, Clone, Copy, Hash, TaskInput, + Encode, + Decode, )] pub enum CommonJsReferenceSubType { Custom(u8), @@ -52,13 +58,15 @@ pub enum CommonJsReferenceSubType { Eq, TraceRawVcs, NonLocalValue, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, Debug, Clone, Copy, Hash, TaskInput, + Encode, + Decode, )] pub enum ImportWithType { Json, @@ -70,13 +78,15 @@ pub enum ImportWithType { Eq, TraceRawVcs, NonLocalValue, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, Debug, Default, Clone, Hash, TaskInput, + Encode, + Decode, )] pub enum EcmaScriptModulesReferenceSubType { ImportPart(ModulePart), @@ -210,14 +220,16 @@ impl ImportContext { Eq, TraceRawVcs, NonLocalValue, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, Debug, Default, Clone, Copy, Hash, TaskInput, + Encode, + Decode, )] pub enum CssReferenceSubType { AtImport(Option>), @@ -238,14 +250,16 @@ pub enum CssReferenceSubType { Eq, TraceRawVcs, NonLocalValue, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, Debug, Default, Clone, Copy, Hash, TaskInput, + Encode, + Decode, )] pub enum UrlReferenceSubType { EcmaScriptNewUrl, @@ -260,13 +274,15 @@ pub enum UrlReferenceSubType { Eq, TraceRawVcs, NonLocalValue, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, Debug, Clone, Copy, Hash, TaskInput, + Encode, + Decode, )] pub enum TypeScriptReferenceSubType { Custom(u8), @@ -278,13 +294,15 @@ pub enum TypeScriptReferenceSubType { Eq, TraceRawVcs, NonLocalValue, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, Debug, Clone, Copy, Hash, TaskInput, + Encode, + Decode, )] pub enum WorkerReferenceSubType { WebWorker, @@ -302,13 +320,15 @@ pub enum WorkerReferenceSubType { Eq, TraceRawVcs, NonLocalValue, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, Debug, Clone, Copy, Hash, TaskInput, + Encode, + Decode, )] pub enum EntryReferenceSubType { Web, @@ -332,13 +352,15 @@ pub enum EntryReferenceSubType { Eq, TraceRawVcs, NonLocalValue, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, Debug, Default, Clone, Hash, TaskInput, + Encode, + Decode, )] pub enum ReferenceType { CommonJs(CommonJsReferenceSubType), diff --git a/turbopack/crates/turbopack-core/src/resolve/alias_map.rs b/turbopack/crates/turbopack-core/src/resolve/alias_map.rs index a6c85fdd18fe9..dfa9f569bd58c 100644 --- a/turbopack/crates/turbopack-core/src/resolve/alias_map.rs +++ b/turbopack/crates/turbopack-core/src/resolve/alias_map.rs @@ -5,8 +5,9 @@ use std::{ }; use anyhow::Result; +use bincode::{Decode, Encode}; use patricia_tree::PatriciaMap; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize, de::DeserializeOwned}; use turbo_rcstr::RcStr; use turbo_tasks::{ NonLocalValue, @@ -24,9 +25,15 @@ use super::pattern::Pattern; /// /// If the pattern does not have a wildcard character, it will only match the /// exact string, and return the template as-is. -#[derive(Clone, Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize, Encode, Decode)] #[serde(transparent)] +#[bincode( + encode_bounds = "T: Serialize", + decode_bounds = "T: DeserializeOwned", + borrow_decode_bounds = "T: Deserialize<'__de>" +)] pub struct AliasMap { + #[bincode(with_serde)] map: PatriciaMap>, } diff --git a/turbopack/crates/turbopack-core/src/resolve/mod.rs b/turbopack/crates/turbopack-core/src/resolve/mod.rs index ae51146660d32..95d6c7f3d7d47 100644 --- a/turbopack/crates/turbopack-core/src/resolve/mod.rs +++ b/turbopack/crates/turbopack-core/src/resolve/mod.rs @@ -7,6 +7,7 @@ use std::{ }; use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use rustc_hash::{FxHashMap, FxHashSet}; use serde::{Deserialize, Serialize}; use tracing::{Instrument, Level}; @@ -357,6 +358,8 @@ impl ModuleResolveResult { TraceRawVcs, Serialize, Deserialize, + Encode, + Decode, )] pub enum ExternalTraced { Untraced, @@ -384,6 +387,8 @@ impl Display for ExternalTraced { TraceRawVcs, TaskInput, NonLocalValue, + Encode, + Decode, )] pub enum ExternalType { Url, @@ -1231,7 +1236,9 @@ pub async fn find_context_file_or_package_key( Ok(find_context_file(lookup_path.parent(), names, false)) } -#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, Debug, NonLocalValue)] +#[derive( + Clone, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, Debug, NonLocalValue, Encode, Decode, +)] enum FindPackageItem { PackageDirectory { name: RcStr, dir: FileSystemPath }, PackageFile { name: RcStr, file: FileSystemPath }, @@ -3178,7 +3185,18 @@ async fn error_severity(resolve_options: Vc) -> Result); +pub struct ExcludedExtensions(#[bincode(with = "turbo_bincode::indexset")] pub FxIndexSet); /// A location where to resolve modules. #[derive( @@ -37,6 +38,8 @@ pub struct ExcludedExtensions(pub FxIndexSet); Deserialize, ValueDebugFormat, NonLocalValue, + Encode, + Decode, )] pub enum ResolveModules { /// when inside of path, use the list of directories to @@ -50,7 +53,18 @@ pub enum ResolveModules { } #[derive( - TraceRawVcs, Hash, PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize, NonLocalValue, + TraceRawVcs, + Hash, + PartialEq, + Eq, + Clone, + Copy, + Debug, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, )] pub enum ConditionValue { Set, @@ -71,7 +85,19 @@ impl From for ConditionValue { pub type ResolutionConditions = BTreeMap; /// The different ways to resolve a package, as described in package.json. -#[derive(TraceRawVcs, Hash, PartialEq, Eq, Clone, Debug, Serialize, Deserialize, NonLocalValue)] +#[derive( + TraceRawVcs, + Hash, + PartialEq, + Eq, + Clone, + Debug, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, +)] pub enum ResolveIntoPackage { /// Using the [exports] field. /// @@ -89,7 +115,19 @@ pub enum ResolveIntoPackage { } // The different ways to resolve a request within a package -#[derive(TraceRawVcs, Hash, PartialEq, Eq, Clone, Debug, Serialize, Deserialize, NonLocalValue)] +#[derive( + TraceRawVcs, + Hash, + PartialEq, + Eq, + Clone, + Debug, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, +)] pub enum ResolveInPackage { /// Using a alias field which allows to map requests AliasField(RcStr), diff --git a/turbopack/crates/turbopack-core/src/resolve/pattern.rs b/turbopack/crates/turbopack-core/src/resolve/pattern.rs index f5df097b570ed..f566822777395 100644 --- a/turbopack/crates/turbopack-core/src/resolve/pattern.rs +++ b/turbopack/crates/turbopack-core/src/resolve/pattern.rs @@ -5,6 +5,7 @@ use std::{ }; use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use regex::Regex; use rustc_hash::{FxHashMap, FxHashSet}; use serde::{Deserialize, Serialize}; @@ -1498,6 +1499,8 @@ impl ValueToString for Pattern { Deserialize, ValueDebugFormat, NonLocalValue, + Encode, + Decode, )] pub enum PatternMatch { File(RcStr, FileSystemPath), diff --git a/turbopack/crates/turbopack-core/src/resolve/remap.rs b/turbopack/crates/turbopack-core/src/resolve/remap.rs index b526d0c0616f3..8c5c86c4e2cee 100644 --- a/turbopack/crates/turbopack-core/src/resolve/remap.rs +++ b/turbopack/crates/turbopack-core/src/resolve/remap.rs @@ -1,6 +1,7 @@ use std::{borrow::Cow, collections::BTreeMap, fmt::Display, ops::Deref}; use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; use serde_json::Value; @@ -363,7 +364,7 @@ impl<'a> Iterator for ResultsIterMut<'a> { } /// Content of an "exports" field in a package.json -#[derive(PartialEq, Eq, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Serialize, Deserialize, Encode, Decode)] pub struct ExportsField(AliasMap); impl TryFrom<&Value> for ExportsField { @@ -457,7 +458,7 @@ impl Deref for ExportsField { } /// Content of an "imports" field in a package.json -#[derive(PartialEq, Eq, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Serialize, Deserialize, Encode, Decode)] pub struct ImportsField(AliasMap); impl TryFrom<&Value> for ImportsField { diff --git a/turbopack/crates/turbopack-core/src/source_map/mod.rs b/turbopack/crates/turbopack-core/src/source_map/mod.rs index d0eec0a954b7c..4f20b9fc8114b 100644 --- a/turbopack/crates/turbopack-core/src/source_map/mod.rs +++ b/turbopack/crates/turbopack-core/src/source_map/mod.rs @@ -1,6 +1,7 @@ use std::{borrow::Cow, io::Write, ops::Deref, sync::Arc}; use anyhow::Result; +use bincode::{Decode, Encode, de::Decoder, error::DecodeError}; use bytes_str::BytesStr; use either::Either; use once_cell::sync::Lazy; @@ -705,3 +706,27 @@ impl<'de> Deserialize<'de> for CrateMapWrapper { Ok(CrateMapWrapper(map)) } } + +impl Encode for CrateMapWrapper { + fn encode( + &self, + encoder: &mut E, + ) -> Result<(), bincode::error::EncodeError> { + let mut bytes = vec![]; + self.0 + .to_writer(&mut bytes) + .map_err(|e| bincode::error::EncodeError::OtherString(e.to_string()))?; + bytes.encode(encoder) + } +} + +impl Decode for CrateMapWrapper { + fn decode>(decoder: &mut D) -> Result { + let bytes = Vec::::decode(decoder)?; + let map = DecodedMap::from_reader(&*bytes) + .map_err(|e| DecodeError::OtherString(e.to_string()))?; + Ok(CrateMapWrapper(map)) + } +} + +bincode::impl_borrow_decode!(CrateMapWrapper); diff --git a/turbopack/crates/turbopack-core/src/source_map/source_map_asset.rs b/turbopack/crates/turbopack-core/src/source_map/source_map_asset.rs index db0e18da26d19..2dee830f8b73c 100644 --- a/turbopack/crates/turbopack-core/src/source_map/source_map_asset.rs +++ b/turbopack/crates/turbopack-core/src/source_map/source_map_asset.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; use turbo_tasks::{ @@ -16,7 +17,17 @@ use crate::{ source_map::{GenerateSourceMap, SourceMap}, }; -#[derive(PartialEq, Eq, Serialize, Deserialize, NonLocalValue, TraceRawVcs, ValueDebugFormat)] +#[derive( + PartialEq, + Eq, + Serialize, + Deserialize, + NonLocalValue, + TraceRawVcs, + ValueDebugFormat, + Encode, + Decode, +)] enum PathType { Fixed { path: FileSystemPath, diff --git a/turbopack/crates/turbopack-core/src/source_pos.rs b/turbopack/crates/turbopack-core/src/source_pos.rs index 9d19c0d01afb6..321ddee8d563a 100644 --- a/turbopack/crates/turbopack-core/src/source_pos.rs +++ b/turbopack/crates/turbopack-core/src/source_pos.rs @@ -1,3 +1,4 @@ +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, TaskInput, trace::TraceRawVcs}; use turbo_tasks_hash::DeterministicHash; @@ -23,6 +24,8 @@ const U8_CR: u8 = 0x0D; Deserialize, DeterministicHash, NonLocalValue, + Encode, + Decode, )] pub struct SourcePos { /// The line, 0-indexed. diff --git a/turbopack/crates/turbopack-core/src/target.rs b/turbopack/crates/turbopack-core/src/target.rs index ba7a7e44834b3..6d2274e09b975 100644 --- a/turbopack/crates/turbopack-core/src/target.rs +++ b/turbopack/crates/turbopack-core/src/target.rs @@ -1,5 +1,6 @@ use std::fmt::Display; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, Vc, trace::TraceRawVcs}; @@ -174,7 +175,18 @@ impl CompileTarget { } #[derive( - PartialEq, Eq, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize, NonLocalValue, + PartialEq, + Eq, + Hash, + Debug, + Copy, + Clone, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, )] #[repr(u8)] #[non_exhaustive] @@ -217,7 +229,18 @@ impl Display for Arch { } #[derive( - PartialEq, Eq, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize, NonLocalValue, + PartialEq, + Eq, + Hash, + Debug, + Copy, + Clone, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, )] #[repr(u8)] #[non_exhaustive] @@ -256,7 +279,18 @@ impl Display for Platform { } #[derive( - PartialEq, Eq, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize, NonLocalValue, + PartialEq, + Eq, + Hash, + Debug, + Copy, + Clone, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, )] #[repr(u8)] pub enum Endianness { @@ -280,7 +314,18 @@ impl Display for Endianness { } #[derive( - PartialEq, Eq, Hash, Debug, Copy, Clone, TraceRawVcs, Serialize, Deserialize, NonLocalValue, + PartialEq, + Eq, + Hash, + Debug, + Copy, + Clone, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, )] #[repr(u8)] pub enum Libc { diff --git a/turbopack/crates/turbopack-css/Cargo.toml b/turbopack/crates/turbopack-css/Cargo.toml index 410d989f982a1..6368a4aba208f 100644 --- a/turbopack/crates/turbopack-css/Cargo.toml +++ b/turbopack/crates/turbopack-css/Cargo.toml @@ -14,6 +14,7 @@ workspace = true [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } indoc = { workspace = true } lightningcss = { workspace = true } parcel_selectors = { workspace = true } @@ -28,6 +29,7 @@ swc_core = { workspace = true, features = [ ] } tokio = { workspace = true } tracing = { workspace = true } +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-fs = { workspace = true } diff --git a/turbopack/crates/turbopack-css/src/lib.rs b/turbopack/crates/turbopack-css/src/lib.rs index f4c7091ca4546..7c1cdf0dc0dce 100644 --- a/turbopack/crates/turbopack-css/src/lib.rs +++ b/turbopack/crates/turbopack-css/src/lib.rs @@ -16,6 +16,7 @@ pub(crate) mod references; pub(crate) mod util; pub use asset::CssModuleAsset; +use bincode::{Decode, Encode}; pub use module_asset::ModuleCssAsset; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, TaskInput, trace::TraceRawVcs}; @@ -38,6 +39,8 @@ use crate::references::import::ImportAssetReference; TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub enum CssModuleAssetType { /// Default parsing mode. diff --git a/turbopack/crates/turbopack-css/src/module_asset.rs b/turbopack/crates/turbopack-css/src/module_asset.rs index 93e1aad721267..0a8b2deda2133 100644 --- a/turbopack/crates/turbopack-css/src/module_asset.rs +++ b/turbopack/crates/turbopack-css/src/module_asset.rs @@ -154,7 +154,9 @@ enum ModuleCssClass { /// 3. class3: [Local("exported_class3), Import("class4", "./other.module.css")] #[turbo_tasks::value(transparent)] #[derive(Debug, Clone)] -struct ModuleCssClasses(FxIndexMap>); +struct ModuleCssClasses( + #[bincode(with = "turbo_bincode::indexmap")] FxIndexMap>, +); #[turbo_tasks::value_impl] impl ModuleCssAsset { diff --git a/turbopack/crates/turbopack-css/src/process.rs b/turbopack/crates/turbopack-css/src/process.rs index 396707a9b7050..1e9c230bc14be 100644 --- a/turbopack/crates/turbopack-css/src/process.rs +++ b/turbopack/crates/turbopack-css/src/process.rs @@ -46,7 +46,11 @@ use crate::{ pub type CssOutput = (ToCssResult, Option); #[turbo_tasks::value(transparent)] -struct LightningCssTargets(#[turbo_tasks(trace_ignore)] pub Targets); +struct LightningCssTargets( + #[turbo_tasks(trace_ignore)] + #[bincode(with_serde)] + pub Targets, +); /// Returns the LightningCSS targets for the given browserslist query. #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-dev-server/Cargo.toml b/turbopack/crates/turbopack-dev-server/Cargo.toml index 25f4af60201b7..38e046b8090d7 100644 --- a/turbopack/crates/turbopack-dev-server/Cargo.toml +++ b/turbopack/crates/turbopack-dev-server/Cargo.toml @@ -19,6 +19,7 @@ workspace = true anyhow = { workspace = true } async-compression = { workspace = true } auto-hash-map = { workspace = true } +bincode = { workspace = true } futures = { workspace = true } hyper = { version = "0.14", features = ["full"] } hyper-tungstenite = "0.9.0" @@ -35,6 +36,7 @@ tokio = { workspace = true } tokio-stream = "0.1.9" tokio-util = { workspace = true } tracing = { workspace = true } +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-bytes = { workspace = true } diff --git a/turbopack/crates/turbopack-dev-server/src/html.rs b/turbopack/crates/turbopack-dev-server/src/html.rs index 3e333cd80d854..b983fae505930 100644 --- a/turbopack/crates/turbopack-dev-server/src/html.rs +++ b/turbopack/crates/turbopack-dev-server/src/html.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use mime_guess::mime::TEXT_HTML_UTF_8; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; @@ -20,7 +21,18 @@ use turbopack_core::{ }; #[derive( - Clone, Debug, Deserialize, Eq, Hash, NonLocalValue, PartialEq, Serialize, TaskInput, TraceRawVcs, + Clone, + Debug, + Deserialize, + Eq, + Hash, + NonLocalValue, + PartialEq, + Serialize, + TaskInput, + TraceRawVcs, + Encode, + Decode, )] pub struct DevHtmlEntry { pub chunkable_module: ResolvedVc>, diff --git a/turbopack/crates/turbopack-dev-server/src/source/asset_graph.rs b/turbopack/crates/turbopack-dev-server/src/source/asset_graph.rs index caac20386eac9..3a5475705b2d7 100644 --- a/turbopack/crates/turbopack-dev-server/src/source/asset_graph.rs +++ b/turbopack/crates/turbopack-dev-server/src/source/asset_graph.rs @@ -20,7 +20,10 @@ use super::{ }; #[turbo_tasks::value(transparent)] -struct OutputAssetsMap(FxIndexMap>>); +struct OutputAssetsMap( + #[bincode(with = "turbo_bincode::indexmap")] + FxIndexMap>>, +); type ExpandedState = State>; diff --git a/turbopack/crates/turbopack-dev-server/src/source/mod.rs b/turbopack/crates/turbopack-dev-server/src/source/mod.rs index 9ee7972e67f0c..fb9aef416706b 100644 --- a/turbopack/crates/turbopack-dev-server/src/source/mod.rs +++ b/turbopack/crates/turbopack-dev-server/src/source/mod.rs @@ -15,6 +15,7 @@ pub mod wrapping_source; use std::collections::BTreeSet; use anyhow::Result; +use bincode::{Decode, Encode}; use futures::{TryStreamExt, stream::Stream as StreamTrait}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; @@ -261,7 +262,19 @@ impl ValueDefault for Body { } /// Filter function that describes which information is required. -#[derive(Debug, Clone, PartialEq, Eq, TraceRawVcs, Hash, Serialize, Deserialize, NonLocalValue)] +#[derive( + Debug, + Clone, + PartialEq, + Eq, + TraceRawVcs, + Hash, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, +)] pub enum ContentSourceDataFilter { All, Subset(BTreeSet), @@ -486,7 +499,9 @@ impl ContentSource for NoContentSource { } } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue)] +#[derive( + Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, Encode, Decode, +)] pub enum RewriteType { Location { /// The new path and query used to lookup content. This _does not_ need to be the original diff --git a/turbopack/crates/turbopack-dev-server/src/source/route_tree.rs b/turbopack/crates/turbopack-dev-server/src/source/route_tree.rs index 48c99ddd5fcc7..70bc99d530d70 100644 --- a/turbopack/crates/turbopack-dev-server/src/source/route_tree.rs +++ b/turbopack/crates/turbopack-dev-server/src/source/route_tree.rs @@ -1,6 +1,7 @@ use std::{fmt::Write, mem::replace}; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{ @@ -8,7 +9,7 @@ use turbo_tasks::{ fxindexmap, trace::TraceRawVcs, }; -use super::{GetContentSourceContent, GetContentSourceContents}; +use crate::source::{GetContentSourceContent, GetContentSourceContents}; /// The type of the route. This will decide about the remaining segments of the /// route after the base. @@ -24,7 +25,18 @@ pub enum RouteType { /// Some normal segment of a route. #[derive( - TaskInput, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TraceRawVcs, NonLocalValue, + TaskInput, + Clone, + Debug, + PartialEq, + Eq, + Hash, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, )] pub enum BaseSegment { Static(RcStr), @@ -106,6 +118,7 @@ impl RouteTrees { pub struct RouteTree { base: Vec, sources: Vec>>, + #[bincode(with = "turbo_bincode::indexmap")] static_segments: FxIndexMap>, dynamic_segments: Vec>, catch_all_sources: Vec>>, diff --git a/turbopack/crates/turbopack-ecmascript-plugins/Cargo.toml b/turbopack/crates/turbopack-ecmascript-plugins/Cargo.toml index c468b577c6218..4114e7ce426ed 100644 --- a/turbopack/crates/turbopack-ecmascript-plugins/Cargo.toml +++ b/turbopack/crates/turbopack-ecmascript-plugins/Cargo.toml @@ -25,6 +25,7 @@ workspace = true [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } +bincode = { workspace = true } indexmap = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/turbopack/crates/turbopack-ecmascript-plugins/src/transform/emotion.rs b/turbopack/crates/turbopack-ecmascript-plugins/src/transform/emotion.rs index b654a75eb48f4..ef1ec7ee98081 100644 --- a/turbopack/crates/turbopack-ecmascript-plugins/src/transform/emotion.rs +++ b/turbopack/crates/turbopack-ecmascript-plugins/src/transform/emotion.rs @@ -6,6 +6,7 @@ use std::{ use anyhow::Result; use async_trait::async_trait; +use bincode::{Decode, Encode}; use indexmap::IndexMap; use rustc_hash::{FxBuildHasher, FxHasher}; use serde::{Deserialize, Serialize}; @@ -23,7 +24,17 @@ use turbo_tasks::{NonLocalValue, OperationValue, ValueDefault, Vc, trace::TraceR use turbopack_ecmascript::{CustomTransformer, TransformContext}; #[derive( - Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue, OperationValue, + Clone, + PartialEq, + Eq, + Debug, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum EmotionLabelKind { @@ -70,6 +81,7 @@ pub struct EmotionTransformConfig { pub sourcemap: Option, pub label_format: Option, pub auto_label: Option, + #[bincode(with_serde)] pub import_map: Option>, } diff --git a/turbopack/crates/turbopack-ecmascript-plugins/src/transform/relay.rs b/turbopack/crates/turbopack-ecmascript-plugins/src/transform/relay.rs index 2a33062352d47..2154802db3cb6 100644 --- a/turbopack/crates/turbopack-ecmascript-plugins/src/transform/relay.rs +++ b/turbopack/crates/turbopack-ecmascript-plugins/src/transform/relay.rs @@ -2,6 +2,7 @@ use std::{path::PathBuf, sync::Arc}; use anyhow::{Context, Result}; use async_trait::async_trait; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{common::FileName, ecma::ast::Program}; use swc_relay::RelayLanguageConfig; @@ -10,7 +11,16 @@ use turbo_tasks_fs::FileSystemPath; use turbopack_ecmascript::{CustomTransformer, TransformContext}; #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase")] pub struct RelayConfig { @@ -20,7 +30,16 @@ pub struct RelayConfig { } #[derive( - Clone, Debug, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, OperationValue, + Clone, + Debug, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + OperationValue, + Encode, + Decode, )] #[serde(rename_all = "lowercase")] pub enum RelayLanguage { diff --git a/turbopack/crates/turbopack-ecmascript/Cargo.toml b/turbopack/crates/turbopack-ecmascript/Cargo.toml index 4340c1159bff0..cfcf8149c9770 100644 --- a/turbopack/crates/turbopack-ecmascript/Cargo.toml +++ b/turbopack/crates/turbopack-ecmascript/Cargo.toml @@ -24,6 +24,7 @@ workspace = true anyhow = { workspace = true } async-trait = { workspace = true } auto-hash-map = { workspace = true } +bincode = { workspace = true } bytes-str = { workspace = true } data-encoding = { workspace = true } either = { workspace = true } @@ -45,6 +46,7 @@ smallvec = { workspace = true } strsim = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } +turbo-bincode = { workspace = true } turbo-esregex = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } diff --git a/turbopack/crates/turbopack-ecmascript/src/analyzer/imports.rs b/turbopack/crates/turbopack-ecmascript/src/analyzer/imports.rs index efd891e87a564..f4d573d17d1a5 100644 --- a/turbopack/crates/turbopack-ecmascript/src/analyzer/imports.rs +++ b/turbopack/crates/turbopack-ecmascript/src/analyzer/imports.rs @@ -29,6 +29,7 @@ use crate::{ pub struct ImportAnnotations { // TODO store this in more structured way #[turbo_tasks(trace_ignore)] + #[bincode(with_serde)] map: BTreeMap, } diff --git a/turbopack/crates/turbopack-ecmascript/src/analyzer/mod.rs b/turbopack/crates/turbopack-ecmascript/src/analyzer/mod.rs index 981086bdd490d..8b3389f47eea0 100644 --- a/turbopack/crates/turbopack-ecmascript/src/analyzer/mod.rs +++ b/turbopack/crates/turbopack-ecmascript/src/analyzer/mod.rs @@ -25,9 +25,9 @@ use swc_core::{ }; use turbo_esregex::EsRegex; use turbo_rcstr::RcStr; -use turbo_tasks::{FxIndexMap, FxIndexSet, Vc}; +use turbo_tasks::{FxIndexMap, FxIndexSet, ResolvedVc, Vc}; use turbopack_core::compile_time_info::{ - CompileTimeDefineValue, DefinableNameSegment, FreeVarReference, + CompileTimeDefineValue, DefinableNameSegment, FreeVarReference, FreeVarReferenceVcs, }; use self::imports::ImportAnnotations; @@ -2097,19 +2097,16 @@ impl JsValue { /// /// Uses the `VarGraph` to verify that the first segment is not a local /// variable/was not reassigned. - pub fn match_free_var_reference<'a, T>( + pub fn match_free_var_reference( &self, var_graph: &VarGraph, - free_var_references: &'a FxIndexMap< - DefinableNameSegment, - FxIndexMap, T>, - >, + free_var_references: &FxIndexMap, prop: &DefinableNameSegment, - ) -> Option<&'a T> { + ) -> Option> { if let Some(def_name_len) = self.get_definable_name_len() && let Some(references) = free_var_references.get(prop) { - for (name, value) in references { + for (name, value) in &references.0 { if name.len() != def_name_len { continue; } @@ -2128,7 +2125,7 @@ impl JsValue { } } - return Some(value); + return Some(*value); } } } diff --git a/turbopack/crates/turbopack-ecmascript/src/chunk/batch.rs b/turbopack/crates/turbopack-ecmascript/src/chunk/batch.rs index 8df254d87683b..c2c06c08b3aeb 100644 --- a/turbopack/crates/turbopack-ecmascript/src/chunk/batch.rs +++ b/turbopack/crates/turbopack-ecmascript/src/chunk/batch.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, TryJoinIterExt, Vc, trace::TraceRawVcs}; use turbopack_core::{ @@ -11,7 +12,18 @@ use turbopack_core::{ use crate::chunk::EcmascriptChunkItemWithAsyncInfo; #[derive( - Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, TaskInput, + Debug, + Clone, + Hash, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + TaskInput, + Encode, + Decode, )] pub enum EcmascriptChunkItemOrBatchWithAsyncInfo { ChunkItem(EcmascriptChunkItemWithAsyncInfo), diff --git a/turbopack/crates/turbopack-ecmascript/src/chunk/item.rs b/turbopack/crates/turbopack-ecmascript/src/chunk/item.rs index 1c8370f53dc58..6311b29bf58da 100644 --- a/turbopack/crates/turbopack-ecmascript/src/chunk/item.rs +++ b/turbopack/crates/turbopack-ecmascript/src/chunk/item.rs @@ -1,6 +1,7 @@ use std::io::Write; use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use smallvec::SmallVec; use turbo_rcstr::{RcStr, rcstr}; @@ -40,6 +41,8 @@ use crate::{ TaskInput, NonLocalValue, Default, + Encode, + Decode, )] pub enum RewriteSourcePath { AbsoluteFilePath(FileSystemPath), @@ -177,7 +180,17 @@ impl EcmascriptChunkItemContent { } #[derive( - PartialEq, Eq, Default, Debug, Clone, Serialize, Deserialize, TraceRawVcs, NonLocalValue, + PartialEq, + Eq, + Default, + Debug, + Clone, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, )] pub struct EcmascriptChunkItemOptions { /// Whether this chunk item should be in "use strict" mode. @@ -195,7 +208,18 @@ pub struct EcmascriptChunkItemOptions { } #[derive( - Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash, TraceRawVcs, TaskInput, NonLocalValue, + Serialize, + Deserialize, + Debug, + Clone, + PartialEq, + Eq, + Hash, + TraceRawVcs, + TaskInput, + NonLocalValue, + Encode, + Decode, )] pub struct EcmascriptChunkItemWithAsyncInfo { pub chunk_item: ResolvedVc>, diff --git a/turbopack/crates/turbopack-ecmascript/src/code_gen.rs b/turbopack/crates/turbopack-ecmascript/src/code_gen.rs index 6258795317468..1e973c89b6750 100644 --- a/turbopack/crates/turbopack-ecmascript/src/code_gen.rs +++ b/turbopack/crates/turbopack-ecmascript/src/code_gen.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ base::SwcComments, @@ -175,7 +176,17 @@ impl_modify!(visit_mut_switch_case, SwitchCase); impl_modify!(visit_mut_program, Program); #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub enum CodeGen { // AMD occurs very rarely and makes the enum much bigger diff --git a/turbopack/crates/turbopack-ecmascript/src/lib.rs b/turbopack/crates/turbopack-ecmascript/src/lib.rs index 71f6e874f50e5..d7f95f4833128 100644 --- a/turbopack/crates/turbopack-ecmascript/src/lib.rs +++ b/turbopack/crates/turbopack-ecmascript/src/lib.rs @@ -45,6 +45,7 @@ use std::{ }; use anyhow::{Context, Result, anyhow, bail}; +use bincode::{Decode, Encode}; use chunk::EcmascriptChunkItem; use code_gen::{CodeGeneration, CodeGenerationHoistedStmt}; use either::Either; @@ -143,6 +144,8 @@ use crate::{ NonLocalValue, Serialize, Deserialize, + Encode, + Decode, )] pub enum SpecifiedModuleType { #[default] @@ -166,6 +169,8 @@ pub enum SpecifiedModuleType { TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] #[serde(rename_all = "kebab-case")] pub enum TreeShakingMode { @@ -189,6 +194,8 @@ pub enum TreeShakingMode { TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub enum AnalyzeMode { /// For bundling only, no tracing of referenced files. @@ -232,6 +239,8 @@ pub struct OptionTreeShaking(pub Option); TraceRawVcs, NonLocalValue, TaskInput, + Encode, + Decode, )] pub enum TypeofWindow { Object, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/amd.rs b/turbopack/crates/turbopack-ecmascript/src/references/amd.rs index ccaa1136b3e57..931835b37825b 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/amd.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/amd.rs @@ -1,6 +1,7 @@ use std::mem::take; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::DUMMY_SP, @@ -99,6 +100,8 @@ impl ChunkableModuleReference for AmdDefineAssetReference {} Clone, NonLocalValue, Hash, + Encode, + Decode, )] pub enum AmdDefineDependencyElement { Request { @@ -122,6 +125,8 @@ pub enum AmdDefineDependencyElement { Clone, NonLocalValue, Hash, + Encode, + Decode, )] pub enum AmdDefineFactoryType { Unknown, @@ -130,7 +135,17 @@ pub enum AmdDefineFactoryType { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct AmdDefineWithDependenciesCodeGen { dependencies_requests: Vec, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/async_module.rs b/turbopack/crates/turbopack-ecmascript/src/references/async_module.rs index 8056f8cd8c605..ea789b9bbab94 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/async_module.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/async_module.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::DUMMY_SP, @@ -16,17 +17,27 @@ use turbopack_core::{ resolve::ExternalType, }; -use super::esm::base::ReferencedAsset; use crate::{ ScopeHoistingContext, code_gen::{CodeGeneration, CodeGenerationHoistedStmt}, + references::esm::base::ReferencedAsset, utils::AstSyntaxContext, }; /// Information needed for generating the async module wrapper for /// [EcmascriptChunkItem](crate::chunk::EcmascriptChunkItem)s. #[derive( - PartialEq, Eq, Default, Debug, Clone, Serialize, Deserialize, TraceRawVcs, NonLocalValue, + PartialEq, + Eq, + Default, + Debug, + Clone, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, )] pub struct AsyncModuleOptions { pub has_top_level_await: bool, @@ -83,7 +94,9 @@ impl OptionAsyncModule { /// The identifiers (and their corresponding syntax context) of all async modules referenced by the /// current module. #[turbo_tasks::value(transparent)] -struct AsyncModuleIdents(FxIndexSet<(String, AstSyntaxContext)>); +struct AsyncModuleIdents( + #[bincode(with = "turbo_bincode::indexset")] FxIndexSet<(String, AstSyntaxContext)>, +); async fn get_inherit_async_referenced_asset( r: ResolvedVc>, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/cjs.rs b/turbopack/crates/turbopack-ecmascript/src/references/cjs.rs index d22a482133973..236a451829365 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/cjs.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/cjs.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::util::take::Take, @@ -151,7 +152,17 @@ impl IntoCodeGenReference for CjsRequireAssetReference { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct CjsRequireAssetReferenceCodeGen { reference: ResolvedVc, @@ -277,7 +288,17 @@ impl IntoCodeGenReference for CjsRequireResolveAssetReference { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct CjsRequireResolveAssetReferenceCodeGen { reference: ResolvedVc, @@ -339,7 +360,17 @@ impl CjsRequireResolveAssetReferenceCodeGen { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Debug, Hash, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Debug, + Hash, + Encode, + Decode, )] pub struct CjsRequireCacheAccess { pub path: AstPath, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/constant_condition.rs b/turbopack/crates/turbopack-ecmascript/src/references/constant_condition.rs index 390aae2ba6b2b..7c0c99a103e4f 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/constant_condition.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/constant_condition.rs @@ -1,16 +1,28 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::quote; use turbo_tasks::{NonLocalValue, debug::ValueDebugFormat, trace::TraceRawVcs}; -use super::AstPath; use crate::{ code_gen::{CodeGen, CodeGeneration}, create_visitor, + references::AstPath, }; #[derive( - Copy, Clone, Hash, PartialEq, Eq, Debug, Serialize, Deserialize, TraceRawVcs, NonLocalValue, + Copy, + Clone, + Hash, + PartialEq, + Eq, + Debug, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, )] pub enum ConstantConditionValue { Truthy, @@ -19,7 +31,17 @@ pub enum ConstantConditionValue { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Debug, Hash, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Debug, + Hash, + Encode, + Decode, )] pub struct ConstantConditionCodeGen { value: ConstantConditionValue, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/constant_value.rs b/turbopack/crates/turbopack-ecmascript/src/references/constant_value.rs index 2d18b212a5114..e510f63911e48 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/constant_value.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/constant_value.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::{DUMMY_SP, FileName, SourceMap, sync::Lrc}, @@ -12,10 +13,10 @@ use turbo_rcstr::RcStr; use turbo_tasks::{NonLocalValue, debug::ValueDebugFormat, trace::TraceRawVcs}; use turbopack_core::compile_time_info::CompileTimeDefineValue; -use super::AstPath; use crate::{ code_gen::{CodeGen, CodeGeneration}, create_visitor, + references::AstPath, }; #[derive( @@ -29,6 +30,8 @@ use crate::{ TraceRawVcs, ValueDebugFormat, NonLocalValue, + Encode, + Decode, )] pub struct ConstantValueCodeGen { value: CompileTimeDefineValue, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/dynamic_expression.rs b/turbopack/crates/turbopack-ecmascript/src/references/dynamic_expression.rs index 45fea8527893b..ac3e27e761741 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/dynamic_expression.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/dynamic_expression.rs @@ -1,17 +1,28 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::quote; use turbo_tasks::{NonLocalValue, Vc, debug::ValueDebugFormat, trace::TraceRawVcs}; use turbopack_core::chunk::ChunkingContext; -use super::AstPath; use crate::{ code_gen::{CodeGen, CodeGeneration}, create_visitor, + references::AstPath, }; #[derive( - PartialEq, Eq, TraceRawVcs, Serialize, Deserialize, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + TraceRawVcs, + Serialize, + Deserialize, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] enum DynamicExpressionType { Promise, @@ -19,7 +30,17 @@ enum DynamicExpressionType { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Debug, Hash, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Debug, + Hash, + Encode, + Decode, )] pub struct DynamicExpression { path: AstPath, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/esm/base.rs b/turbopack/crates/turbopack-ecmascript/src/references/esm/base.rs index 1b106967b041e..7b8f93fc81aac 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/esm/base.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/esm/base.rs @@ -35,7 +35,6 @@ use turbopack_core::{ }; use turbopack_resolve::ecmascript::esm_resolve; -use super::export::{all_known_export_names, is_export_missing}; use crate::{ ScopeHoistingContext, TreeShakingMode, analyzer::imports::ImportAnnotations, @@ -43,7 +42,13 @@ use crate::{ code_gen::{CodeGeneration, CodeGenerationHoistedStmt}, export::Liveness, magic_identifier, - references::{esm::EsmExport, util::throw_module_not_found_expr}, + references::{ + esm::{ + EsmExport, + export::{all_known_export_names, is_export_missing}, + }, + util::throw_module_not_found_expr, + }, runtime_functions::{TURBOPACK_EXTERNAL_IMPORT, TURBOPACK_EXTERNAL_REQUIRE, TURBOPACK_IMPORT}, tree_shake::{TURBOPACK_PART_IMPORT_SOURCE, asset::EcmascriptModulePartAsset}, utils::module_id_to_lit, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/esm/binding.rs b/turbopack/crates/turbopack-ecmascript/src/references/esm/binding.rs index ef7f5e6916b6b..3b60b50157abe 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/esm/binding.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/esm/binding.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::ecma::{ ast::{Expr, KeyValueProp, Prop, PropName, SimpleAssignTarget}, @@ -8,18 +9,32 @@ use turbo_rcstr::RcStr; use turbo_tasks::{NonLocalValue, ResolvedVc, Vc, trace::TraceRawVcs}; use turbopack_core::chunk::ChunkingContext; -use super::EsmAssetReference; use crate::{ ScopeHoistingContext, code_gen::{CodeGen, CodeGeneration}, create_visitor, references::{ AstPath, - esm::base::{ReferencedAsset, ReferencedAssetIdent}, + esm::{ + EsmAssetReference, + base::{ReferencedAsset, ReferencedAssetIdent}, + }, }, }; -#[derive(Hash, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, TraceRawVcs, NonLocalValue)] +#[derive( + Hash, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, +)] pub struct EsmBinding { reference: ResolvedVc, export: Option, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/esm/dynamic.rs b/turbopack/crates/turbopack-ecmascript/src/references/esm/dynamic.rs index 33f438f3ed423..597fcbf409df1 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/esm/dynamic.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/esm/dynamic.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::{DUMMY_SP, util::take::Take}, @@ -23,12 +24,14 @@ use turbopack_core::{ }; use turbopack_resolve::ecmascript::esm_resolve; -use super::super::pattern_mapping::{PatternMapping, ResolveType}; use crate::{ analyzer::imports::ImportAnnotations, code_gen::{CodeGen, CodeGeneration, IntoCodeGenReference}, create_visitor, - references::AstPath, + references::{ + AstPath, + pattern_mapping::{PatternMapping, ResolveType}, + }, }; #[turbo_tasks::value] @@ -122,7 +125,17 @@ impl IntoCodeGenReference for EsmAsyncAssetReference { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct EsmAsyncAssetReferenceCodeGen { path: AstPath, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/esm/export.rs b/turbopack/crates/turbopack-ecmascript/src/references/esm/export.rs index 47aef131ff84c..7850dbec6f412 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/esm/export.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/esm/export.rs @@ -1,6 +1,7 @@ use std::{borrow::Cow, collections::BTreeMap, ops::ControlFlow}; use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use rustc_hash::FxHashSet; use serde::{Deserialize, Serialize}; use swc_core::{ @@ -26,13 +27,13 @@ use turbopack_core::{ resolve::ModulePart, }; -use super::base::ReferencedAsset; use crate::{ EcmascriptModuleAsset, ScopeHoistingContext, analyzer::graph::EvalContext, chunk::{EcmascriptChunkPlaceable, EcmascriptExports}, code_gen::{CodeGeneration, CodeGenerationHoistedStmt}, magic_identifier, + references::esm::base::ReferencedAsset, runtime_functions::{TURBOPACK_DYNAMIC, TURBOPACK_ESM}, tree_shake::asset::EcmascriptModulePartAsset, utils::module_id_to_lit, @@ -42,7 +43,18 @@ use crate::{ /// All ESM exports are technically live but many never change and we can optimize representation to /// support that, this enum tracks the actual behavior of the export binding. #[derive( - Copy, Clone, Hash, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue, + Copy, + Clone, + Hash, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, )] pub enum Liveness { // The binding never changes after module evaluation @@ -55,7 +67,19 @@ pub enum Liveness { Mutable, } -#[derive(Clone, Hash, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue)] +#[derive( + Clone, + Hash, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, +)] pub enum EsmExport { /// A local binding that is exported (export { a } or export const a = 1) /// @@ -134,7 +158,19 @@ pub async fn all_known_export_names( Ok(Vc::cell(export_names.esm_exports.keys().cloned().collect())) } -#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue)] +#[derive( + Copy, + Clone, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, +)] pub enum FoundExportType { Found, Dynamic, @@ -323,6 +359,7 @@ async fn find_export_from_reexports( #[turbo_tasks::value] struct AllExportNamesResult { + #[bincode(with = "turbo_bincode::indexmap")] esm_exports: FxIndexMap>>, dynamic_exporting_modules: Vec>>, } @@ -381,6 +418,7 @@ async fn get_all_export_names( #[turbo_tasks::value] pub struct ExpandStarResult { + #[bincode(with = "turbo_bincode::indexmap")] pub esm_exports: FxIndexMap>>, pub dynamic_exporting_modules: Vec>>, } diff --git a/turbopack/crates/turbopack-ecmascript/src/references/esm/meta.rs b/turbopack/crates/turbopack-ecmascript/src/references/esm/meta.rs index 8b516d39e7e76..97e6df63af99a 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/esm/meta.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/esm/meta.rs @@ -1,6 +1,7 @@ use std::borrow::Cow; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::DUMMY_SP, @@ -27,7 +28,17 @@ use crate::{ /// /// This singleton behavior must be enforced by the caller! #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Debug, Hash, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Debug, + Hash, + Encode, + Decode, )] pub struct ImportMetaBinding { path: FileSystemPath, @@ -88,7 +99,17 @@ impl From for CodeGen { /// There can be many references to import.meta, and they appear at any nesting /// in the file. But all references refer to the same mutable object. #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct ImportMetaRef { ast_path: AstPath, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/esm/module_id.rs b/turbopack/crates/turbopack-ecmascript/src/references/esm/module_id.rs index a5f69e967d526..80a970e486624 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/esm/module_id.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/esm/module_id.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::quote; use turbo_rcstr::RcStr; @@ -11,11 +12,13 @@ use turbopack_core::{ resolve::ModuleResolveResult, }; -use super::{EsmAssetReference, base::ReferencedAsset}; use crate::{ code_gen::{CodeGen, CodeGeneration, IntoCodeGenReference}, create_visitor, - references::AstPath, + references::{ + AstPath, + esm::{EsmAssetReference, base::ReferencedAsset}, + }, utils::module_id_to_lit, }; @@ -74,7 +77,17 @@ impl IntoCodeGenReference for EsmModuleIdAssetReference { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct EsmModuleIdAssetReferenceCodeGen { path: AstPath, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/esm/module_item.rs b/turbopack/crates/turbopack-ecmascript/src/references/esm/module_item.rs index 67dc999ca5571..fb99c51faa3b4 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/esm/module_item.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/esm/module_item.rs @@ -1,6 +1,7 @@ use std::mem::replace; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::DUMMY_SP, @@ -23,7 +24,17 @@ use crate::{ /// expr/decl in a normal statement. Unnamed expr/decl will be named with the /// magic identifier "export default" #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Debug, Hash, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Debug, + Hash, + Encode, + Decode, )] pub struct EsmModuleItem { pub path: AstPath, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/esm/url.rs b/turbopack/crates/turbopack-ecmascript/src/references/esm/url.rs index 18a9a8bfa2856..a4fc63ec15956 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/esm/url.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/esm/url.rs @@ -1,4 +1,5 @@ use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ ecma::ast::{Expr, ExprOrSpread, NewExpr}, @@ -23,11 +24,10 @@ use turbopack_core::{ }, }; -use super::base::ReferencedAsset; use crate::{ code_gen::{CodeGen, CodeGeneration, IntoCodeGenReference}, create_visitor, - references::AstPath, + references::{AstPath, esm::base::ReferencedAsset}, runtime_functions::{ TURBOPACK_RELATIVE_URL, TURBOPACK_REQUIRE, TURBOPACK_RESOLVE_MODULE_ID_PATH, }, @@ -49,6 +49,8 @@ use crate::{ TraceRawVcs, TaskInput, NonLocalValue, + Encode, + Decode, )] pub enum UrlRewriteBehavior { /// Omits base, resulting in a relative URL. @@ -147,7 +149,17 @@ impl IntoCodeGenReference for UrlAssetReference { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct UrlAssetReferenceCodeGen { reference: ResolvedVc, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/exports_info.rs b/turbopack/crates/turbopack-ecmascript/src/references/exports_info.rs index d37379a9f91c1..2f9fafe9e9334 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/exports_info.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/exports_info.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::DUMMY_SP, @@ -24,7 +25,17 @@ use crate::{ /// /// This singleton behavior must be enforced by the caller! #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct ExportsInfoBinding {} @@ -92,7 +103,17 @@ impl From for CodeGen { /// There can be many references, and they appear at any nesting in the file. But all references /// refer to the same mutable object. #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct ExportsInfoRef { ast_path: AstPath, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs b/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs index 12eb45f2e30e6..262cacb7652d7 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/external_module.rs @@ -1,6 +1,7 @@ use std::{fmt::Display, io::Write}; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, TryJoinIterExt, Vc, trace::TraceRawVcs}; @@ -47,6 +48,8 @@ use crate::{ TaskInput, Hash, NonLocalValue, + Encode, + Decode, )] pub enum CachedExternalType { CommonJs, @@ -57,7 +60,18 @@ pub enum CachedExternalType { } #[derive( - Clone, Debug, Eq, PartialEq, Serialize, Deserialize, TraceRawVcs, TaskInput, Hash, NonLocalValue, + Clone, + Debug, + Eq, + PartialEq, + Serialize, + Deserialize, + TraceRawVcs, + TaskInput, + Hash, + NonLocalValue, + Encode, + Decode, )] /// Whether to add a traced reference to the external module using the given context and resolve /// origin. diff --git a/turbopack/crates/turbopack-ecmascript/src/references/ident.rs b/turbopack/crates/turbopack-ecmascript/src/references/ident.rs index 8e6167e87b445..d3d75dbbaff1a 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/ident.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/ident.rs @@ -1,18 +1,29 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ecma::ast::Expr, quote}; use turbo_rcstr::RcStr; use turbo_tasks::{NonLocalValue, Vc, debug::ValueDebugFormat, trace::TraceRawVcs}; use turbopack_core::chunk::ChunkingContext; -use super::AstPath; use crate::{ code_gen::{CodeGen, CodeGeneration}, create_visitor, + references::AstPath, }; #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Debug, Hash, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Debug, + Hash, + Encode, + Decode, )] pub struct IdentReplacement { value: RcStr, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/member.rs b/turbopack/crates/turbopack-ecmascript/src/references/member.rs index d78141970e210..d27d0617285de 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/member.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/member.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ atoms::atom, @@ -14,14 +15,24 @@ use turbo_rcstr::RcStr; use turbo_tasks::{NonLocalValue, Vc, debug::ValueDebugFormat, trace::TraceRawVcs}; use turbopack_core::chunk::ChunkingContext; -use super::AstPath; use crate::{ code_gen::{CodeGen, CodeGeneration}, create_visitor, + references::AstPath, }; #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct MemberReplacement { key: RcStr, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/mod.rs b/turbopack/crates/turbopack-ecmascript/src/references/mod.rs index f4f8d61622d44..5a7cc5702ae18 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/mod.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/mod.rs @@ -30,6 +30,7 @@ use std::{ }; use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use constant_condition::{ConstantConditionCodeGen, ConstantConditionValue}; use constant_value::ConstantValueCodeGen; use either::Either; @@ -72,7 +73,8 @@ use turbo_tasks_fs::FileSystemPath; use turbopack_core::{ compile_time_info::{ CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, DefinableNameSegment, - FreeVarReference, FreeVarReferences, FreeVarReferencesIndividual, InputRelativeConstant, + FreeVarReference, FreeVarReferenceVcs, FreeVarReferences, FreeVarReferencesIndividual, + InputRelativeConstant, }, environment::Rendering, error::PrettyPrintError, @@ -111,40 +113,27 @@ use self::{ raw::{DirAssetReference, FileSourceReference}, typescript::{TsConfigReference, TsReferencePathAssetReference, TsReferenceTypeAssetReference}, }; -use super::{ - EcmascriptModuleAssetType, ModuleTypeResult, - analyzer::{ - ConstantValue as JsConstantValue, JsValue, ObjectPart, WellKnownFunctionKind, - WellKnownObjectKind, - builtin::replace_builtin, - graph::{Effect, create_graph}, - linker::link, - well_known::replace_well_known, - }, - errors, - parse::ParseResult, - utils::js_value_to_pattern, - webpack::{ - WebpackChunkAssetReference, WebpackEntryAssetReference, WebpackRuntimeAssetReference, - parse::{WebpackRuntime, webpack_runtime}, - }, -}; pub use crate::references::esm::export::{FollowExportsResult, follow_reexports}; use crate::{ - AnalyzeMode, EcmascriptInputTransforms, EcmascriptModuleAsset, EcmascriptParsable, - SpecifiedModuleType, TreeShakingMode, TypeofWindow, + AnalyzeMode, EcmascriptInputTransforms, EcmascriptModuleAsset, EcmascriptModuleAssetType, + EcmascriptParsable, ModuleTypeResult, SpecifiedModuleType, TreeShakingMode, TypeofWindow, analyzer::{ - ConstantNumber, ConstantString, JsValueUrlKind, RequireContextValue, - builtin::early_replace_builtin, - graph::{ConditionalKind, EffectArg, EvalContext, VarGraph}, + ConstantNumber, ConstantString, ConstantValue as JsConstantValue, JsValue, JsValueUrlKind, + ObjectPart, RequireContextValue, WellKnownFunctionKind, WellKnownObjectKind, + builtin::{early_replace_builtin, replace_builtin}, + graph::{ConditionalKind, Effect, EffectArg, EvalContext, VarGraph, create_graph}, imports::{ImportAnnotations, ImportAttributes, ImportedSymbol, Reexport}, + linker::link, parse_require_context, top_level_await::has_top_level_await, + well_known::replace_well_known, }, chunk::EcmascriptExports, code_gen::{CodeGen, CodeGens, IntoCodeGenReference}, + errors, export::Liveness, magic_identifier, + parse::ParseResult, references::{ async_module::{AsyncModule, OptionAsyncModule}, cjs::{CjsRequireAssetReference, CjsRequireCacheAccess, CjsRequireResolveAssetReference}, @@ -167,7 +156,11 @@ use crate::{ }, source_map::parse_source_map_comment, tree_shake::{find_turbopack_part_id_in_asserts, part_of_module, split_module}, - utils::{AstPathRange, module_value_to_well_known_object}, + utils::{AstPathRange, js_value_to_pattern, module_value_to_well_known_object}, + webpack::{ + WebpackChunkAssetReference, WebpackEntryAssetReference, WebpackRuntimeAssetReference, + parse::{WebpackRuntime, webpack_runtime}, + }, }; #[turbo_tasks::value(shared)] @@ -2727,7 +2720,7 @@ async fn handle_member( if let Some(references) = references { let obj = obj.as_ref().unwrap(); if let Some(def_name_len) = obj.get_definable_name_len() { - for (name, value) in references { + for (name, value) in &references.0 { if name.len() != def_name_len { continue; } @@ -2769,7 +2762,7 @@ async fn handle_typeof( ) -> Result<()> { if let Some(value) = arg.match_free_var_reference( state.var_graph, - &*state.free_var_references, + &state.free_var_references, &DefinableNameSegment::TypeOf, ) { handle_free_var_reference(ast_path, &*value.await?, span, state, analysis).await?; @@ -2788,7 +2781,7 @@ async fn handle_free_var( if let Some(def_name_len) = var.get_definable_name_len() { let first = var.iter_definable_name_rev().next().unwrap(); if let Some(references) = state.free_var_references.get(&*first) { - for (name, value) in references { + for (name, value) in &references.0 { if name.len() + 1 != def_name_len { continue; } @@ -3142,10 +3135,7 @@ async fn value_visitor( origin: Vc>, v: JsValue, compile_time_info: Vc, - free_var_references: &FxIndexMap< - DefinableNameSegment, - FxIndexMap, ResolvedVc>, - >, + free_var_references: &FxIndexMap, var_graph: &VarGraph, attributes: &ImportAttributes, allow_project_root_tracing: bool, @@ -3168,10 +3158,7 @@ async fn value_visitor_inner( origin: Vc>, v: JsValue, compile_time_info: Vc, - free_var_references: &FxIndexMap< - DefinableNameSegment, - FxIndexMap, ResolvedVc>, - >, + free_var_references: &FxIndexMap, var_graph: &VarGraph, attributes: &ImportAttributes, allow_project_root_tracing: bool, @@ -3895,8 +3882,14 @@ async fn resolve_as_webpack_runtime( } } -#[derive(Hash, Debug, Clone, Eq, Serialize, Deserialize, PartialEq, TraceRawVcs)] -pub struct AstPath(#[turbo_tasks(trace_ignore)] Vec); +#[derive( + Hash, Debug, Clone, Eq, Serialize, Deserialize, PartialEq, TraceRawVcs, Encode, Decode, +)] +pub struct AstPath( + #[bincode(with_serde)] + #[turbo_tasks(trace_ignore)] + Vec, +); impl TaskInput for AstPath { fn is_transient(&self) -> bool { diff --git a/turbopack/crates/turbopack-ecmascript/src/references/pattern_mapping.rs b/turbopack/crates/turbopack-ecmascript/src/references/pattern_mapping.rs index b933aca1ec55b..28059c1741a78 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/pattern_mapping.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/pattern_mapping.rs @@ -1,6 +1,7 @@ use std::{borrow::Cow, collections::HashSet}; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::DUMMY_SP, @@ -37,7 +38,17 @@ use crate::{ utils::module_id_to_lit, }; -#[derive(PartialEq, Eq, ValueDebugFormat, TraceRawVcs, Serialize, Deserialize, NonLocalValue)] +#[derive( + PartialEq, + Eq, + ValueDebugFormat, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + Encode, + Decode, +)] pub(crate) enum SinglePatternMapping { /// Invalid request. Invalid, @@ -83,7 +94,7 @@ pub(crate) enum PatternMapping { /// ```js /// require(`./images/${name}.png`) /// ``` - Map(FxIndexMap), + Map(#[bincode(with = "turbo_bincode::indexmap")] FxIndexMap), } #[derive( diff --git a/turbopack/crates/turbopack-ecmascript/src/references/replace_parent_with_child.rs b/turbopack/crates/turbopack-ecmascript/src/references/replace_parent_with_child.rs index d3972d5ba1b48..aa970d81fa4e8 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/replace_parent_with_child.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/replace_parent_with_child.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::util::take::Take, @@ -18,9 +19,18 @@ use crate::{ /// Used to replace expressions like ` || ` with `` #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Debug, Hash, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Debug, + Hash, + Encode, + Decode, )] - pub struct ReplaceParentWithChild { path: AstPath, } diff --git a/turbopack/crates/turbopack-ecmascript/src/references/require_context.rs b/turbopack/crates/turbopack-ecmascript/src/references/require_context.rs index a01febe9287b4..3c4a2eddf65f2 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/require_context.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/require_context.rs @@ -1,6 +1,7 @@ use std::{borrow::Cow, collections::VecDeque, sync::Arc}; use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::DUMMY_SP, @@ -60,7 +61,9 @@ pub(crate) enum DirListEntry { } #[turbo_tasks::value(transparent)] -pub(crate) struct DirList(FxIndexMap); +pub(crate) struct DirList( + #[bincode(with = "turbo_bincode::indexmap")] FxIndexMap, +); #[turbo_tasks::value_impl] impl DirList { @@ -150,7 +153,9 @@ impl DirList { } #[turbo_tasks::value(transparent)] -pub(crate) struct FlatDirList(FxIndexMap); +pub(crate) struct FlatDirList( + #[bincode(with = "turbo_bincode::indexmap")] FxIndexMap, +); #[turbo_tasks::value_impl] impl FlatDirList { @@ -170,7 +175,9 @@ pub struct RequireContextMapEntry { /// The resolved context map for a `require.context(..)` call. #[turbo_tasks::value(transparent)] -pub struct RequireContextMap(FxIndexMap); +pub struct RequireContextMap( + #[bincode(with = "turbo_bincode::indexmap")] FxIndexMap, +); #[turbo_tasks::value_impl] impl RequireContextMap { @@ -317,7 +324,17 @@ impl IntoCodeGenReference for RequireContextAssetReference { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct RequireContextAssetReferenceCodeGen { path: AstPath, diff --git a/turbopack/crates/turbopack-ecmascript/src/references/unreachable.rs b/turbopack/crates/turbopack-ecmascript/src/references/unreachable.rs index 087375d6ac932..6106e481bfff7 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/unreachable.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/unreachable.rs @@ -1,6 +1,7 @@ use std::mem::take; use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ atoms::{Atom, atom}, @@ -32,9 +33,18 @@ use crate::{ }; #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Debug, Hash, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Debug, + Hash, + Encode, + Decode, )] - pub struct Unreachable { range: AstPathRange, } diff --git a/turbopack/crates/turbopack-ecmascript/src/references/worker.rs b/turbopack/crates/turbopack-ecmascript/src/references/worker.rs index 8c8d555a73325..95f5fa839533e 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/worker.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/worker.rs @@ -1,4 +1,5 @@ use anyhow::{Result, bail}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::util::take::Take, @@ -126,7 +127,17 @@ impl IntoCodeGenReference for WorkerAssetReference { } #[derive( - PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, Hash, Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Hash, + Debug, + Encode, + Decode, )] pub struct WorkerAssetReferenceCodeGen { reference: ResolvedVc, diff --git a/turbopack/crates/turbopack-ecmascript/src/side_effect_optimization/locals/chunk_item.rs b/turbopack/crates/turbopack-ecmascript/src/side_effect_optimization/locals/chunk_item.rs index bc0ad50a29208..9c3ec219f8082 100644 --- a/turbopack/crates/turbopack-ecmascript/src/side_effect_optimization/locals/chunk_item.rs +++ b/turbopack/crates/turbopack-ecmascript/src/side_effect_optimization/locals/chunk_item.rs @@ -7,10 +7,10 @@ use turbopack_core::{ output::OutputAssetsReference, }; -use super::module::EcmascriptModuleLocalsModule; use crate::{ EcmascriptAnalyzableExt, chunk::{EcmascriptChunkItem, EcmascriptChunkItemContent, EcmascriptChunkType}, + side_effect_optimization::locals::module::EcmascriptModuleLocalsModule, }; /// The chunk item for [EcmascriptModuleLocalsModule]. diff --git a/turbopack/crates/turbopack-ecmascript/src/side_effect_optimization/reference.rs b/turbopack/crates/turbopack-ecmascript/src/side_effect_optimization/reference.rs index b0f0004cbfa08..01047263ef871 100644 --- a/turbopack/crates/turbopack-ecmascript/src/side_effect_optimization/reference.rs +++ b/turbopack/crates/turbopack-ecmascript/src/side_effect_optimization/reference.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::DUMMY_SP, @@ -17,19 +18,31 @@ use turbopack_core::{ resolve::{ExportUsage, ModulePart, ModuleResolveResult}, }; -use super::{ - facade::module::EcmascriptModuleFacadeModule, locals::module::EcmascriptModuleLocalsModule, -}; use crate::{ ScopeHoistingContext, chunk::EcmascriptChunkPlaceable, code_gen::{CodeGeneration, CodeGenerationHoistedStmt}, references::esm::base::{ReferencedAsset, ReferencedAssetIdent}, runtime_functions::TURBOPACK_IMPORT, + side_effect_optimization::{ + facade::module::EcmascriptModuleFacadeModule, locals::module::EcmascriptModuleLocalsModule, + }, utils::module_id_to_lit, }; -#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, NonLocalValue, TraceRawVcs)] +#[derive( + Debug, + Clone, + Eq, + PartialEq, + Hash, + Serialize, + Deserialize, + NonLocalValue, + TraceRawVcs, + Encode, + Decode, +)] enum EcmascriptModulePartReferenceMode { Synthesize, Normal, diff --git a/turbopack/crates/turbopack-ecmascript/src/utils.rs b/turbopack/crates/turbopack-ecmascript/src/utils.rs index a8649de3acd73..eee825e35183d 100644 --- a/turbopack/crates/turbopack-ecmascript/src/utils.rs +++ b/turbopack/crates/turbopack-ecmascript/src/utils.rs @@ -1,5 +1,6 @@ use std::ops::Deref; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use swc_core::{ common::{DUMMY_SP, SyntaxContext}, @@ -178,13 +179,33 @@ format_iter!(std::fmt::Pointer); format_iter!(std::fmt::UpperExp); format_iter!(std::fmt::UpperHex); -#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, Debug, NonLocalValue, Hash)] +#[derive( + Clone, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + Debug, + NonLocalValue, + Hash, + Encode, + Decode, +)] pub enum AstPathRange { /// The ast path to the block or expression. - Exact(#[turbo_tasks(trace_ignore)] Vec), + Exact( + #[bincode(with_serde)] + #[turbo_tasks(trace_ignore)] + Vec, + ), /// The ast path to a expression just before the range in the parent of the /// specific ast path. - StartAfter(#[turbo_tasks(trace_ignore)] Vec), + StartAfter( + #[bincode(with_serde)] + #[turbo_tasks(trace_ignore)] + Vec, + ), } /// Converts a module value (ie an import) to a well known object, @@ -226,8 +247,14 @@ pub fn module_value_to_well_known_object(module_value: &ModuleValue) -> Option bool { diff --git a/turbopack/crates/turbopack-ecmascript/src/webpack/mod.rs b/turbopack/crates/turbopack-ecmascript/src/webpack/mod.rs index cc12e26f1a0b4..56945fa10709d 100644 --- a/turbopack/crates/turbopack-ecmascript/src/webpack/mod.rs +++ b/turbopack/crates/turbopack-ecmascript/src/webpack/mod.rs @@ -68,6 +68,7 @@ impl Module for WebpackModuleAsset { #[turbo_tasks::value(shared)] pub struct WebpackChunkAssetReference { #[turbo_tasks(trace_ignore)] + #[bincode(with_serde)] pub chunk_id: Lit, pub runtime: ResolvedVc, pub transforms: ResolvedVc, diff --git a/turbopack/crates/turbopack-image/Cargo.toml b/turbopack/crates/turbopack-image/Cargo.toml index 0a234ad5ffeb1..94f27b7398288 100644 --- a/turbopack/crates/turbopack-image/Cargo.toml +++ b/turbopack/crates/turbopack-image/Cargo.toml @@ -21,6 +21,7 @@ workspace = true [dependencies] anyhow = { workspace = true } base64 = "0.21.0" +bincode = { workspace = true } image = { workspace = true, default-features = false, features = [ "gif", "png", @@ -35,6 +36,7 @@ regex = { workspace = true } rustc-hash = { workspace = true } serde = { workspace = true } serde_with = { workspace = true } +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-fs = { workspace = true } diff --git a/turbopack/crates/turbopack-image/src/process/mod.rs b/turbopack/crates/turbopack-image/src/process/mod.rs index 1a4386aee8b38..2935f6a37c373 100644 --- a/turbopack/crates/turbopack-image/src/process/mod.rs +++ b/turbopack/crates/turbopack-image/src/process/mod.rs @@ -4,6 +4,7 @@ use std::{io::Cursor, str::FromStr}; use anyhow::{Context, Result, bail}; use base64::{display::Base64Display, engine::general_purpose::STANDARD}; +use bincode::{Decode, Encode}; use image::{ DynamicImage, GenericImageView, ImageEncoder, ImageFormat, codecs::{ @@ -32,7 +33,17 @@ use turbopack_core::{ use self::svg::calculate; /// Small placeholder version of the image. -#[derive(PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue)] +#[derive( + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Encode, + Decode, +)] pub struct BlurPlaceholder { pub data_url: String, pub width: u32, @@ -62,6 +73,7 @@ pub struct ImageMetaData { pub height: u32, #[turbo_tasks(trace_ignore, debug_ignore)] #[serde_as(as = "Option")] + #[bincode(with = "turbo_bincode::mime_option")] pub mime_type: Option, pub blur_placeholder: Option, } diff --git a/turbopack/crates/turbopack-node/Cargo.toml b/turbopack/crates/turbopack-node/Cargo.toml index 646d64b259793..ad8ec886484cb 100644 --- a/turbopack/crates/turbopack-node/Cargo.toml +++ b/turbopack/crates/turbopack-node/Cargo.toml @@ -21,6 +21,7 @@ anyhow = { workspace = true } async-stream = "0.3.4" async-trait = { workspace = true } base64 = "0.21.0" +bincode = { workspace = true } const_format = { workspace = true } either = { workspace = true, features = ["serde"] } futures = { workspace = true } @@ -36,6 +37,7 @@ serde_json = { workspace = true } serde_with = { workspace = true, features = ["base64"] } tokio = { workspace = true, features = ["full"] } tracing = { workspace = true } +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-bytes = { workspace = true } diff --git a/turbopack/crates/turbopack-node/src/source_map/mod.rs b/turbopack/crates/turbopack-node/src/source_map/mod.rs index eeaf2e6cab1f6..78d67cb8f5992 100644 --- a/turbopack/crates/turbopack-node/src/source_map/mod.rs +++ b/turbopack/crates/turbopack-node/src/source_map/mod.rs @@ -8,7 +8,6 @@ use anyhow::Result; use const_format::concatcp; use once_cell::sync::Lazy; use regex::Regex; -pub use trace::{StackFrame, TraceResult, trace_source_map}; use turbo_tasks::{ReadRef, Vc}; use turbo_tasks_fs::{ FileLinesContent, FileSystemPath, source_context::get_source_context, to_sys_path, @@ -20,6 +19,7 @@ use turbopack_core::{ }; use turbopack_ecmascript::magic_identifier::unmangle_identifiers; +pub use crate::source_map::trace::{StackFrame, TraceResult, trace_source_map}; use crate::{AssetsForSourceMapping, pool::FormattingMode}; pub mod trace; diff --git a/turbopack/crates/turbopack-node/src/source_map/trace.rs b/turbopack/crates/turbopack-node/src/source_map/trace.rs index cd336d5afc49c..e4064f956b92d 100644 --- a/turbopack/crates/turbopack-node/src/source_map/trace.rs +++ b/turbopack/crates/turbopack-node/src/source_map/trace.rs @@ -1,5 +1,12 @@ use std::{borrow::Cow, fmt::Display}; +use bincode::{ + Decode, Encode, + de::Decoder, + enc::Encoder, + error::{DecodeError, EncodeError}, + impl_borrow_decode, +}; use serde::{Deserialize, Serialize}; use turbopack_core::source_map::{SourceMap, Token}; use turbopack_ecmascript::magic_identifier::unmangle_identifiers; @@ -73,6 +80,30 @@ impl Display for StackFrame<'_> { } } +impl Encode for StackFrame<'_> { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + self.file.encode(encoder)?; + self.line.encode(encoder)?; + self.column.encode(encoder)?; + self.name.encode(encoder)?; + Ok(()) + } +} + +// needs a manual implementation because the derive macro doesn't handle the lifetime correctly +impl Decode for StackFrame<'_> { + fn decode>(decoder: &mut D) -> Result { + Ok(Self { + file: Decode::decode(decoder)?, + line: Decode::decode(decoder)?, + column: Decode::decode(decoder)?, + name: Decode::decode(decoder)?, + }) + } +} + +impl_borrow_decode!(StackFrame<'_>); + /// The result of performing a source map trace. #[derive(Debug)] pub enum TraceResult { diff --git a/turbopack/crates/turbopack-node/src/transforms/postcss.rs b/turbopack/crates/turbopack-node/src/transforms/postcss.rs index 2092d7bb5e55d..494c3625628ac 100644 --- a/turbopack/crates/turbopack-node/src/transforms/postcss.rs +++ b/turbopack/crates/turbopack-node/src/transforms/postcss.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result, bail}; +use bincode::{Decode, Encode}; use indoc::formatdoc; use serde::{Deserialize, Serialize}; use turbo_rcstr::{RcStr, rcstr}; @@ -25,13 +26,14 @@ use turbopack_core::{ }; use turbopack_ecmascript::runtime_functions::TURBOPACK_EXTERNAL_IMPORT; -use super::{ - util::{EmittedAsset, emitted_assets_to_virtual_sources}, - webpack::WebpackLoaderContext, -}; use crate::{ - embed_js::embed_file_path, evaluate::get_evaluate_entries, execution_context::ExecutionContext, - transforms::webpack::evaluate_webpack_loader, + embed_js::embed_file_path, + evaluate::get_evaluate_entries, + execution_context::ExecutionContext, + transforms::{ + util::{EmittedAsset, emitted_assets_to_virtual_sources}, + webpack::{WebpackLoaderContext, evaluate_webpack_loader}, + }, }; #[derive(Debug, Serialize, Deserialize, Clone)] @@ -56,6 +58,8 @@ struct PostCssProcessingResult { Deserialize, TaskInput, NonLocalValue, + Encode, + Decode, )] pub enum PostCssConfigLocation { #[default] diff --git a/turbopack/crates/turbopack-node/src/transforms/webpack.rs b/turbopack/crates/turbopack-node/src/transforms/webpack.rs index 899849fb15520..8d4dddc333962 100644 --- a/turbopack/crates/turbopack-node/src/transforms/webpack.rs +++ b/turbopack/crates/turbopack-node/src/transforms/webpack.rs @@ -2,6 +2,7 @@ use std::mem::take; use anyhow::{Context, Result, bail}; use base64::Engine; +use bincode::{Decode, Encode}; use either::Either; use futures::try_join; use serde::{Deserialize, Serialize}; @@ -49,7 +50,6 @@ use turbopack_resolve::{ resolve_options_context::ResolveOptionsContext, }; -use super::util::{EmittedAsset, emitted_assets_to_virtual_sources}; use crate::{ AssetsForSourceMapping, debug::should_debug, @@ -61,6 +61,7 @@ use crate::{ execution_context::ExecutionContext, pool::{FormattingMode, NodeJsPool}, source_map::{StackFrame, StructuredError}, + transforms::util::{EmittedAsset, emitted_assets_to_virtual_sources}, }; #[serde_as] @@ -83,11 +84,22 @@ struct WebpackLoadersProcessingResult { } #[derive( - Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue, OperationValue, + Clone, + PartialEq, + Eq, + Debug, + TraceRawVcs, + Serialize, + Deserialize, + NonLocalValue, + OperationValue, + Encode, + Decode, )] pub struct WebpackLoaderItem { pub loader: RcStr, #[serde(default)] + #[bincode(with = "turbo_bincode::serde_json")] pub options: serde_json::Map, } @@ -325,7 +337,7 @@ pub(crate) async fn evaluate_webpack_loader( custom_evaluate(webpack_loader_context).await } -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Encode, Decode)] #[serde(rename_all = "camelCase")] enum LogType { Error, @@ -344,11 +356,12 @@ enum LogType { Status, } -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Encode, Decode)] #[serde(rename_all = "camelCase")] pub struct LogInfo { time: u64, log_type: LogType, + #[bincode(with = "turbo_bincode::serde_json")] args: Vec, trace: Option>>, } diff --git a/turbopack/crates/turbopack-nodejs/Cargo.toml b/turbopack/crates/turbopack-nodejs/Cargo.toml index a763e4a423066..d9fce0535a524 100644 --- a/turbopack/crates/turbopack-nodejs/Cargo.toml +++ b/turbopack/crates/turbopack-nodejs/Cargo.toml @@ -20,10 +20,12 @@ workspace = true [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } indoc = { workspace = true } tracing = { workspace = true } urlencoding = { workspace = true } +turbo-bincode = { workspace = true } turbo-rcstr = { workspace = true } turbo-tasks = { workspace = true } turbo-tasks-fs = { workspace = true } diff --git a/turbopack/crates/turbopack-nodejs/src/chunking_context.rs b/turbopack/crates/turbopack-nodejs/src/chunking_context.rs index 516f8d20629ce..b0400b7c3db2f 100644 --- a/turbopack/crates/turbopack-nodejs/src/chunking_context.rs +++ b/turbopack/crates/turbopack-nodejs/src/chunking_context.rs @@ -156,16 +156,19 @@ pub struct NodeJsChunkingContext { /// This path is used to compute the url to request chunks or assets from client_root: FileSystemPath, /// This path is used to compute the url to request chunks or assets from + #[bincode(with = "turbo_bincode::indexmap")] client_roots: FxIndexMap, /// Chunks are placed at this path chunk_root_path: FileSystemPath, /// Static assets are placed at this path asset_root_path: FileSystemPath, /// Static assets are placed at this path + #[bincode(with = "turbo_bincode::indexmap")] asset_root_paths: FxIndexMap, /// Static assets requested from this url base asset_prefix: Option, /// Static assets requested from this url base + #[bincode(with = "turbo_bincode::indexmap")] asset_prefixes: FxIndexMap, /// The environment chunks will be evaluated in. environment: ResolvedVc, diff --git a/turbopack/crates/turbopack-test-utils/Cargo.toml b/turbopack/crates/turbopack-test-utils/Cargo.toml index 36a29cb646f20..7d5ff3ec60d6f 100644 --- a/turbopack/crates/turbopack-test-utils/Cargo.toml +++ b/turbopack/crates/turbopack-test-utils/Cargo.toml @@ -14,6 +14,7 @@ workspace = true [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } once_cell = { workspace = true } regex = { workspace = true, features = ["pattern"] } serde = { workspace = true } diff --git a/turbopack/crates/turbopack-test-utils/src/jest.rs b/turbopack/crates/turbopack-test-utils/src/jest.rs index 297fd705680fa..aa78b8c70027f 100644 --- a/turbopack/crates/turbopack-test-utils/src/jest.rs +++ b/turbopack/crates/turbopack-test-utils/src/jest.rs @@ -1,3 +1,4 @@ +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; // Defines common structures returned by jest/jest-circus. Shared across turbo @@ -5,13 +6,13 @@ use serde::{Deserialize, Serialize}; /// The serialized form of the JS object returned from jest.run() /// describing results. -#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] +#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq, Encode, Decode)] #[serde(rename_all = "camelCase")] pub struct JestRunResult { pub test_results: Vec, } -#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] +#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq, Encode, Decode)] #[serde(rename_all = "camelCase")] pub struct JestTestResult { pub test_path: Vec, diff --git a/turbopack/crates/turbopack-tests/Cargo.toml b/turbopack/crates/turbopack-tests/Cargo.toml index d173fc14c0de9..9055e79866969 100644 --- a/turbopack/crates/turbopack-tests/Cargo.toml +++ b/turbopack/crates/turbopack-tests/Cargo.toml @@ -17,6 +17,7 @@ turbopack = { workspace = true } [dev-dependencies] anyhow = { workspace = true } +bincode = { workspace = true } dunce = { workspace = true } once_cell = { workspace = true } rustc-hash = { workspace = true } diff --git a/turbopack/crates/turbopack-tests/tests/execution.rs b/turbopack/crates/turbopack-tests/tests/execution.rs index c3e369f46b77b..f83b4e08b1dbb 100644 --- a/turbopack/crates/turbopack-tests/tests/execution.rs +++ b/turbopack/crates/turbopack-tests/tests/execution.rs @@ -8,6 +8,7 @@ mod util; use std::{env, path::PathBuf}; use anyhow::{Context, Result}; +use bincode::{Decode, Encode}; use dunce::canonicalize; use serde::{Deserialize, Serialize}; use tracing_subscriber::{Registry, layer::SubscriberExt, util::SubscriberInitExt}; @@ -233,7 +234,16 @@ async fn run_inner_operation( } #[derive( - PartialEq, Eq, Debug, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue, + PartialEq, + Eq, + Debug, + Serialize, + Deserialize, + TraceRawVcs, + ValueDebugFormat, + NonLocalValue, + Encode, + Decode, )] #[serde(rename_all = "camelCase", deny_unknown_fields)] struct TestOptions { diff --git a/turbopack/crates/turbopack-wasm/Cargo.toml b/turbopack/crates/turbopack-wasm/Cargo.toml index 86b5e77be8bb2..5156042b7689a 100644 --- a/turbopack/crates/turbopack-wasm/Cargo.toml +++ b/turbopack/crates/turbopack-wasm/Cargo.toml @@ -14,6 +14,7 @@ workspace = true [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } indoc = { workspace = true } serde = { workspace = true } turbo-rcstr = { workspace = true } diff --git a/turbopack/crates/turbopack-wasm/src/source.rs b/turbopack/crates/turbopack-wasm/src/source.rs index bda03b3ef14cb..650ab297e10fe 100644 --- a/turbopack/crates/turbopack-wasm/src/source.rs +++ b/turbopack/crates/turbopack-wasm/src/source.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, Vc, trace::TraceRawVcs}; use turbo_tasks_fs::{File, FileContent}; @@ -22,6 +23,8 @@ use turbopack_core::{ TaskInput, TraceRawVcs, NonLocalValue, + Encode, + Decode, )] pub enum WebAssemblySourceType { /// Binary WebAssembly files (.wasm). diff --git a/turbopack/crates/turbopack/Cargo.toml b/turbopack/crates/turbopack/Cargo.toml index 557ef25204aaf..a806180a409f7 100644 --- a/turbopack/crates/turbopack/Cargo.toml +++ b/turbopack/crates/turbopack/Cargo.toml @@ -14,6 +14,7 @@ workspace = true [dependencies] anyhow = { workspace = true } +bincode = { workspace = true } either = { workspace = true } regex = { workspace = true } rustc-hash = { workspace = true } diff --git a/turbopack/crates/turbopack/src/module_options/match_mode.rs b/turbopack/crates/turbopack/src/module_options/match_mode.rs index 23b8db59460bd..861e2505e49a5 100644 --- a/turbopack/crates/turbopack/src/module_options/match_mode.rs +++ b/turbopack/crates/turbopack/src/module_options/match_mode.rs @@ -1,8 +1,21 @@ +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, trace::TraceRawVcs}; use turbopack_core::reference_type::ReferenceType; -#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, NonLocalValue)] +#[derive( + Copy, + Clone, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + TraceRawVcs, + NonLocalValue, + Encode, + Decode, +)] pub enum MatchMode { // Match all but internal references. NonInternal, diff --git a/turbopack/crates/turbopack/src/module_options/module_options_context.rs b/turbopack/crates/turbopack/src/module_options/module_options_context.rs index 0f6789e3604e6..4e0385628793c 100644 --- a/turbopack/crates/turbopack/src/module_options/module_options_context.rs +++ b/turbopack/crates/turbopack/src/module_options/module_options_context.rs @@ -1,5 +1,6 @@ use std::fmt::Debug; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_esregex::EsRegex; use turbo_rcstr::RcStr; @@ -21,7 +22,9 @@ use turbopack_node::{ use super::ModuleRule; use crate::module_options::RuleCondition; -#[derive(Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue)] +#[derive( + Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue, Encode, Decode, +)] pub struct LoaderRuleItem { pub loaders: ResolvedVc, pub rename_as: Option, @@ -37,7 +40,9 @@ pub struct LoaderRuleItem { #[turbo_tasks::value(transparent)] pub struct WebpackRules(Vec<(RcStr, LoaderRuleItem)>); -#[derive(Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue)] +#[derive( + Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue, Encode, Decode, +)] pub enum ConditionPath { Glob(RcStr), Regex(ResolvedVc), @@ -104,7 +109,9 @@ impl WebpackLoaderBuiltinConditionSet for EmptyWebpackLoaderBuiltinConditionSet /// The kind of decorators transform to use. /// [TODO]: might need bikeshed for the name (Ecma) -#[derive(Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue)] +#[derive( + Clone, PartialEq, Eq, Debug, TraceRawVcs, Serialize, Deserialize, NonLocalValue, Encode, Decode, +)] pub enum DecoratorsKind { Legacy, Ecma, diff --git a/turbopack/crates/turbopack/src/module_options/module_rule.rs b/turbopack/crates/turbopack/src/module_options/module_rule.rs index 28ff609703b32..2711e2dde367c 100644 --- a/turbopack/crates/turbopack/src/module_options/module_rule.rs +++ b/turbopack/crates/turbopack/src/module_options/module_rule.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{NonLocalValue, ResolvedVc, trace::TraceRawVcs}; @@ -13,7 +14,9 @@ use turbopack_wasm::source::WebAssemblySourceType; use super::{CustomModuleType, RuleCondition, match_mode::MatchMode}; -#[derive(Debug, Clone, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue)] +#[derive( + Debug, Clone, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue, Encode, Decode, +)] pub struct ModuleRule { condition: RuleCondition, effects: Vec, diff --git a/turbopack/crates/turbopack/src/module_options/rule_condition.rs b/turbopack/crates/turbopack/src/module_options/rule_condition.rs index 0fd96dc1d3a8d..51471faa444f8 100644 --- a/turbopack/crates/turbopack/src/module_options/rule_condition.rs +++ b/turbopack/crates/turbopack/src/module_options/rule_condition.rs @@ -4,6 +4,7 @@ use std::{ }; use anyhow::Result; +use bincode::{Decode, Encode}; use either::Either; use serde::{Deserialize, Serialize}; use smallvec::SmallVec; @@ -14,7 +15,9 @@ use turbopack_core::{ asset::Asset, reference_type::ReferenceType, source::Source, virtual_source::VirtualSource, }; -#[derive(Debug, Clone, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue)] +#[derive( + Debug, Clone, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue, Encode, Decode, +)] pub enum RuleCondition { All(Vec), Any(Vec), diff --git a/turbopack/crates/turbopack/src/module_options/transition_rule.rs b/turbopack/crates/turbopack/src/module_options/transition_rule.rs index 7308178c2e69f..0de49e4da394e 100644 --- a/turbopack/crates/turbopack/src/module_options/transition_rule.rs +++ b/turbopack/crates/turbopack/src/module_options/transition_rule.rs @@ -1,13 +1,18 @@ use anyhow::Result; +use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, ResolvedVc, trace::TraceRawVcs}; use turbo_tasks_fs::FileSystemPath; use turbopack_core::{reference_type::ReferenceType, source::Source}; -use super::{RuleCondition, match_mode::MatchMode}; -use crate::transition::Transition; +use crate::{ + module_options::{RuleCondition, match_mode::MatchMode}, + transition::Transition, +}; -#[derive(Debug, Clone, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue)] +#[derive( + Debug, Clone, Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, NonLocalValue, Encode, Decode, +)] pub struct TransitionRule { condition: RuleCondition, transition: ResolvedVc>,