diff --git a/crates/next-api/src/app.rs b/crates/next-api/src/app.rs index 9fcc51dac64a..5392de1d2f4c 100644 --- a/crates/next-api/src/app.rs +++ b/crates/next-api/src/app.rs @@ -2210,13 +2210,13 @@ impl Endpoint for AppEndpoint { async fn entries(self: Vc) -> Result> { let this = self.await?; let app_entry = self.app_endpoint_entry().await?; - // The route's chunking heuristics from `experimental.turbopackChunkingHeuristics`. They are + // The route's chunking heuristics from `experimental.turbopackChunking`. They are // attached to the route's entry chunk group. let heuristics = this .app_project .project() .next_config() - .chunking_heuristics() + .turbopack_chunking() .await? .entry_heuristics_for(&app_entry.pathname); Ok(GraphEntries::from_chunk_groups(vec![ diff --git a/crates/next-api/src/pages.rs b/crates/next-api/src/pages.rs index 4443e36df1e7..b792581a320c 100644 --- a/crates/next-api/src/pages.rs +++ b/crates/next-api/src/pages.rs @@ -1758,7 +1758,7 @@ impl Endpoint for PageEndpoint { .pages_project .project() .next_config() - .chunking_heuristics() + .turbopack_chunking() .await? .entry_heuristics_for(&this.pathname); diff --git a/crates/next-api/src/project.rs b/crates/next-api/src/project.rs index cfc1866601e0..d3c73442b375 100644 --- a/crates/next-api/src/project.rs +++ b/crates/next-api/src/project.rs @@ -1598,7 +1598,7 @@ impl Project { self: Vc, ) -> Result>> { let css_url_suffix = self.next_config().asset_suffix_path(); - let chunking_heuristics = self.next_config().chunking_heuristics().await?; + let turbopack_chunking = self.next_config().turbopack_chunking().await?; Ok(get_client_chunking_context(ClientChunkingContextOptions { mode: self.next_mode(), root_path: self.project_root_path().owned().await?, @@ -1631,9 +1631,13 @@ impl Project { cross_origin: self.next_config().cross_origin(), chunk_loading_global: self.next_config().turbopack_chunk_loading_global(), style_groups_algorithm: self.next_config().css_chunking().owned().await?, - chunking_first_page_load_priority: chunking_heuristics.first_page_load_priority, - chunking_priority_boost_percent: chunking_heuristics.priority_boost_percent, - chunking_request_cost: chunking_heuristics.request_cost, + chunking_first_page_load_priority: turbopack_chunking.first_page_load_priority, + chunking_priority_boost_percent: turbopack_chunking.priority_boost_percent, + chunking_request_cost: turbopack_chunking.request_cost, + chunking_min_chunk_size: turbopack_chunking.min_chunk_size, + chunking_max_chunk_count_per_group: turbopack_chunking.max_chunk_count_per_group, + chunking_max_merge_chunk_size: turbopack_chunking.max_merge_chunk_size, + chunking_min_component_chunk_size: turbopack_chunking.min_component_chunk_size, generate_component_chunks: self.next_config().turbopack_generate_component_chunks(), })) } diff --git a/crates/next-core/src/next_client/context.rs b/crates/next-core/src/next_client/context.rs index 0a44759806c3..e6f18a4816fd 100644 --- a/crates/next-core/src/next_client/context.rs +++ b/crates/next-core/src/next_client/context.rs @@ -499,6 +499,10 @@ pub struct ClientChunkingContextOptions { pub chunking_first_page_load_priority: Option, pub chunking_priority_boost_percent: Option, pub chunking_request_cost: Option, + pub chunking_min_chunk_size: Option, + pub chunking_max_chunk_count_per_group: Option, + pub chunking_max_merge_chunk_size: Option, + pub chunking_min_component_chunk_size: Option, pub generate_component_chunks: Vc, } @@ -543,6 +547,10 @@ pub async fn get_client_chunking_context( chunking_first_page_load_priority, chunking_priority_boost_percent, chunking_request_cost, + chunking_min_chunk_size, + chunking_max_chunk_count_per_group, + chunking_max_merge_chunk_size, + chunking_min_component_chunk_size, generate_component_chunks, } = options; @@ -607,16 +615,16 @@ pub async fn get_client_chunking_context( .chunking_config( Vc::::default().to_resolved().await?, ChunkingConfig { - min_chunk_size: 50_000, - max_chunk_count_per_group: 40, - max_merge_chunk_size: 200_000, + min_chunk_size: chunking_min_chunk_size.unwrap_or(50_000), + max_chunk_count_per_group: chunking_max_chunk_count_per_group.unwrap_or(40), + max_merge_chunk_size: chunking_max_merge_chunk_size.unwrap_or(200_000), first_page_load_priority: chunking_first_page_load_priority, priority_boost_percent: chunking_priority_boost_percent, request_cost: chunking_request_cost, // Generate component chunks alongside the merged chunk so that the browser // runtime can fetch an already-cached one instead of the whole merged chunk. generate_component_chunks: *generate_component_chunks.await?, - min_component_chunk_size: 20_000, + min_component_chunk_size: chunking_min_component_chunk_size.unwrap_or(20_000), ..Default::default() }, ) diff --git a/crates/next-core/src/next_config.rs b/crates/next-core/src/next_config.rs index c08dd119adcc..14bb4f4cd3a3 100644 --- a/crates/next-core/src/next_config.rs +++ b/crates/next-core/src/next_config.rs @@ -1135,7 +1135,7 @@ const DEFAULT_REQUEST_COST: f32 = 20_000.0; /// Default `weightDistribution` for the graph algorithm. const DEFAULT_WEIGHT_DISTRIBUTION: f32 = 0.1; -/// `experimental.chunkingHeuristics`: hints for Turbopack's production chunker. +/// `experimental.turbopackChunking`: hints for Turbopack's production chunker. #[derive( Clone, Debug, @@ -1149,7 +1149,7 @@ const DEFAULT_WEIGHT_DISTRIBUTION: f32 = 0.1; Decode, )] #[serde(rename_all = "camelCase")] -pub struct ChunkingHeuristicsConfig { +pub struct TurbopackChunkingConfig { /// A number between `0.0..=1.0`. Higher values weight the benefit of merging /// chunks for a single page load more heavily. A site's bounce rate is a good /// approximation if you don't have a better value. @@ -1165,10 +1165,24 @@ pub struct ChunkingHeuristicsConfig { /// bytes of code, default is 200 KB), used by the chunker to trade off request /// count against preventing double-fetching. request_cost: Option, + /// Avoid creating more than one chunk smaller than this size, in bytes (default `50000`). + /// Smaller chunks are merged into larger chunks. + min_chunk_size: Option, + /// Avoid creating more than this number of chunks per chunk group (default `40`). + max_chunk_count_per_group: Option, + /// Don't merge chunks bigger than this size, in bytes (default `200000`), with other + /// chunks. This keeps code in big chunks from being duplicated across multiple chunks. + max_merge_chunk_size: Option, + /// Emit each merged production chunk's constituent component chunks alongside it, so the + /// browser runtime can load only the chunks it doesn't already have (default `false`). + generate_component_chunks: Option, + /// Minimum size, in bytes (default `20000`), for a component chunk to be emitted on its + /// own when `generate_component_chunks` is enabled. + min_component_chunk_size: Option, } #[turbo_tasks::value] -pub struct ChunkingHeuristics { +pub struct TurbopackChunking { /// First-page-load priority as an integer percentage (`0..=100`), or `None` if unset. pub first_page_load_priority: Option, /// Route-matching regexes for priority routes. @@ -1178,9 +1192,19 @@ pub struct ChunkingHeuristics { pub priority_boost_percent: Option, /// Global estimated cost of an additional request, in bytes, or `None` if unset. pub request_cost: Option, -} - -impl ChunkingHeuristics { + /// Override for the client JS `min_chunk_size`, or `None` to use the default. + pub min_chunk_size: Option, + /// Override for the client JS `max_chunk_count_per_group`, or `None` to use the default. + pub max_chunk_count_per_group: Option, + /// Override for the client JS `max_merge_chunk_size`, or `None` to use the default. + pub max_merge_chunk_size: Option, + /// Override for the client JS `min_component_chunk_size`, or `None` to use the default. + pub min_component_chunk_size: Option, + /// Whether to emit component chunks alongside merged chunks (default `false`). + pub generate_component_chunks: bool, +} + +impl TurbopackChunking { /// Compute the [`EntryHeuristics`] for a route `pathname` by matching it against the configured /// priority-route regexes. pub fn entry_heuristics_for(&self, pathname: &str) -> EntryHeuristics { @@ -1206,7 +1230,7 @@ fn parse_route_regexes(patterns: &[RegexComponents]) -> Result> { .cloned() .map(|pattern| { EsRegex::try_from(pattern) - .context("Invalid route pattern in `experimental.turbopackChunkingHeuristics`") + .context("Invalid route pattern in `experimental.turbopackChunking`") }) .collect() } @@ -1300,8 +1324,7 @@ pub struct ExperimentalConfig { /// CSS chunking strategy. See [`CssChunkingConfig`] for the accepted shapes. css_chunking: Option, - /// Traffic-shape hints for the production chunker. See [`ChunkingHeuristicsConfig`]. - turbopack_chunking_heuristics: Option, + turbopack_chunking: Option, // --- // UNSUPPORTED @@ -1370,7 +1393,6 @@ pub struct ExperimentalConfig { turbopack_input_source_maps: Option, turbopack_module_fragments: Option, turbopack_scope_hoisting: Option, - turbopack_generate_component_chunks: Option, turbopack_shared_runtime: Option, /// Custom URL prefix for Web Worker URLs (the entrypoint and the module /// chunks loaded inside the worker) produced by @@ -2099,14 +2121,14 @@ impl NextConfig { } #[turbo_tasks::function] - pub fn chunking_heuristics(&self) -> Result> { - let config = self.experimental.turbopack_chunking_heuristics.as_ref(); + pub fn turbopack_chunking(&self) -> Result> { + let config = self.experimental.turbopack_chunking.as_ref(); let priority_routes = parse_route_regexes( config .and_then(|c| c.priority_routes.as_deref()) .unwrap_or_default(), )?; - Ok(ChunkingHeuristics { + Ok(TurbopackChunking { first_page_load_priority: config .and_then(|c| c.first_page_load_priority) .map(|priority| (priority.clamp(0.0, 1.0) * 100.0).round() as u32), @@ -2115,6 +2137,13 @@ impl NextConfig { .and_then(|c| c.priority_boost) .map(|boost| (boost.max(0.0) * 100.0).round() as u32), request_cost: config.and_then(|c| c.request_cost), + min_chunk_size: config.and_then(|c| c.min_chunk_size), + max_chunk_count_per_group: config.and_then(|c| c.max_chunk_count_per_group), + max_merge_chunk_size: config.and_then(|c| c.max_merge_chunk_size), + min_component_chunk_size: config.and_then(|c| c.min_component_chunk_size), + generate_component_chunks: config + .and_then(|c| c.generate_component_chunks) + .unwrap_or(false), } .cell()) } @@ -2521,7 +2550,9 @@ impl NextConfig { pub fn turbopack_generate_component_chunks(&self) -> Vc { Vc::cell( self.experimental - .turbopack_generate_component_chunks + .turbopack_chunking + .as_ref() + .and_then(|c| c.generate_component_chunks) .unwrap_or(false), ) } diff --git a/packages/next/errors.json b/packages/next/errors.json index fcc449f3851e..6312efce9efc 100644 --- a/packages/next/errors.json +++ b/packages/next/errors.json @@ -1460,5 +1460,7 @@ "1459": "[Server HMR] unreachable: unknown HMR instruction type %s", "1460": "[Server HMR] unreachable: unexpected update instruction type %s", "1461": "Expected segment cache to have data for stage '%s'", - "1462": "Unexpected chunk emitted in Before stage" + "1462": "Unexpected chunk emitted in Before stage", + "1463": "\\`experimental.turbopackGenerateComponentChunks\\` has been moved to \\`experimental.turbopackChunking.generateComponentChunks\\`. Please update your next.config.js file accordingly.", + "1464": "\\`experimental.turbopackChunkingHeuristics\\` has been renamed to \\`experimental.turbopackChunking\\`. Please update your next.config.js file accordingly." } diff --git a/packages/next/src/build/swc/index.ts b/packages/next/src/build/swc/index.ts index 6c3eeecd494d..3fa7bbefc13f 100644 --- a/packages/next/src/build/swc/index.ts +++ b/packages/next/src/build/swc/index.ts @@ -1037,21 +1037,20 @@ function bindingToApi( nextConfigSerializable.turbopack = turbopack } - // Serialize `experimental.turbopackChunkingHeuristics` route patterns: convert each RegExp to + // Serialize `experimental.turbopackChunking` route patterns: convert each RegExp to // {source, flags} since RegExp objects are not JSON-serializable. - const chunkingHeuristics = - nextConfigSerializable.experimental?.turbopackChunkingHeuristics - if (chunkingHeuristics) { + const chunkingConfig = + nextConfigSerializable.experimental?.turbopackChunking + if (chunkingConfig) { const regexComponents = (regex: RegExp) => ({ source: regex.source, flags: regex.flags, }) nextConfigSerializable.experimental = { ...nextConfigSerializable.experimental, - turbopackChunkingHeuristics: { - ...chunkingHeuristics, - priorityRoutes: - chunkingHeuristics.priorityRoutes?.map(regexComponents), + turbopackChunking: { + ...chunkingConfig, + priorityRoutes: chunkingConfig.priorityRoutes?.map(regexComponents), }, } } diff --git a/packages/next/src/client/components/router-reducer/should-hard-navigate.test.tsx b/packages/next/src/client/components/router-reducer/should-hard-navigate.test.tsx deleted file mode 100644 index 15f0f642b0e6..000000000000 --- a/packages/next/src/client/components/router-reducer/should-hard-navigate.test.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import React from 'react' -import { - PrefetchHint, - type FlightData, - type FlightRouterState, -} from '../../../shared/lib/app-router-types' -import { shouldHardNavigate } from './should-hard-navigate' - -describe('shouldHardNavigate', () => { - it('should return false if the segments match', () => { - const getInitialRouterStateTree = (): FlightRouterState => [ - '', - { - children: [ - 'linking', - { - children: ['', {}], - }, - ], - }, - undefined, - undefined, - PrefetchHint.IsRootLayoutOrAbove, - ] - const initialRouterStateTree = getInitialRouterStateTree() - const getFlightData = (): FlightData => { - return [ - [ - 'children', - 'linking', - 'children', - 'about', - [ - 'about', - { - children: ['', {}], - }, - ], - ['about', {},

About Page!

], - <> - About page! - , - ], - ] - } - const flightData = getFlightData() - - if (typeof flightData === 'string') { - throw new Error('invalid flight data') - } - - // Mirrors the way router-reducer values are passed in. - const flightDataPath = flightData[0] - const flightSegmentPath = flightDataPath.slice(0, -4) - - const result = shouldHardNavigate( - ['', ...flightSegmentPath], - initialRouterStateTree - ) - - expect(result).toBe(false) - }) - - it('should return false if segments are dynamic and match', () => { - const getInitialRouterStateTree = (): FlightRouterState => [ - '', - { - children: [ - 'link-hard-push', - { - children: [ - ['id', '123', 'd', null], - { - children: ['', {}], - }, - ], - }, - ], - }, - null, - null, - PrefetchHint.IsRootLayoutOrAbove, - ] - const initialRouterStateTree = getInitialRouterStateTree() - const getFlightData = (): FlightData => { - return [ - [ - 'children', - 'link-hard-push', - 'children', - ['id', '123', 'd', null], - [ - ['id', '123', 'd', null], - { - children: ['', {}], - }, - ], - [['id', '123', 'd', null], {}, null], - null, - ], - ] - } - const flightData = getFlightData() - - if (typeof flightData === 'string') { - throw new Error('invalid flight data') - } - - // Mirrors the way router-reducer values are passed in. - const flightDataPath = flightData[0] - const flightSegmentPath = flightDataPath.slice(0, -4) - - const result = shouldHardNavigate( - ['', ...flightSegmentPath], - initialRouterStateTree - ) - - expect(result).toBe(false) - }) - - it('should return true if segments are dynamic and mismatch', () => { - const getInitialRouterStateTree = (): FlightRouterState => [ - '', - { - children: [ - 'link-hard-push', - { - children: [ - ['id', '456', 'd', null], - { - children: ['', {}], - }, - ], - }, - ], - }, - null, - null, - PrefetchHint.IsRootLayoutOrAbove, - ] - const initialRouterStateTree = getInitialRouterStateTree() - const getFlightData = (): FlightData => { - return [ - [ - 'children', - 'link-hard-push', - 'children', - ['id', '123', 'd', null], - [ - ['id', '123', 'd', null], - { - children: ['', {}], - }, - ], - [['id', '123', 'd', null], {}, null], - null, - false, - ], - ] - } - const flightData = getFlightData() - - if (typeof flightData === 'string') { - throw new Error('invalid flight data') - } - - // Mirrors the way router-reducer values are passed in. - const flightDataPath = flightData[0] - const flightSegmentPath = flightDataPath.slice(0, -4) - - const result = shouldHardNavigate( - ['', ...flightSegmentPath], - initialRouterStateTree - ) - - expect(result).toBe(true) - }) -}) diff --git a/packages/next/src/client/components/router-reducer/should-hard-navigate.ts b/packages/next/src/client/components/router-reducer/should-hard-navigate.ts deleted file mode 100644 index e5bdbce22ace..000000000000 --- a/packages/next/src/client/components/router-reducer/should-hard-navigate.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { - FlightRouterState, - FlightDataPath, - Segment, -} from '../../../shared/lib/app-router-types' -import { getNextFlightSegmentPath } from '../../flight-data-helpers' -import { matchSegment } from '../match-segments' - -// TODO-APP: flightSegmentPath will be empty in case of static response, needs to be handled. -export function shouldHardNavigate( - flightSegmentPath: FlightDataPath, - flightRouterState: FlightRouterState -): boolean { - const [segment, parallelRoutes] = flightRouterState - // TODO-APP: Check if `as` can be replaced. - const [currentSegment, parallelRouteKey] = flightSegmentPath as [ - Segment, - string, - ] - - // Check if current segment matches the existing segment. - if (!matchSegment(currentSegment, segment)) { - // If dynamic parameter in tree doesn't match up with segment path a hard navigation is triggered. - if (Array.isArray(currentSegment)) { - return true - } - - // If the existing segment did not match soft navigation is triggered. - return false - } - const lastSegment = flightSegmentPath.length <= 2 - - if (lastSegment) { - return false - } - - return shouldHardNavigate( - getNextFlightSegmentPath(flightSegmentPath), - parallelRoutes[parallelRouteKey] - ) -} diff --git a/packages/next/src/client/flight-data-helpers.ts b/packages/next/src/client/flight-data-helpers.ts index 7b66b0f564b1..e9af7276f8c1 100644 --- a/packages/next/src/client/flight-data-helpers.ts +++ b/packages/next/src/client/flight-data-helpers.ts @@ -112,7 +112,10 @@ export function createInitialRSCPayloadFromFallbackPrerender( ), originalFlightDataPath[1], originalFlightDataPath[2], - originalFlightDataPath[2], + // isHeadPartial. Previously this incorrectly passed the head itself + // (index 2), which is truthy, so the head was always treated + // as partial. + originalFlightDataPath[3], ], ], m: fallbackInitialRSCPayload.m, diff --git a/packages/next/src/server/app-render/collect-segment-data.tsx b/packages/next/src/server/app-render/collect-segment-data.tsx index 17a702609881..97cfee878f50 100644 --- a/packages/next/src/server/app-render/collect-segment-data.tsx +++ b/packages/next/src/server/app-render/collect-segment-data.tsx @@ -246,7 +246,9 @@ function onSegmentPrerenderError(error: unknown) { /** * Extract the FlightRouterState, seed data, and head from a prerendered * InitialRSCPayload. Returns null if the payload doesn't match the expected - * shape (single path with 3 elements). + * shape: a single root path with no segment prefix, which has 4 elements + * ([tree, seedData, head, isHeadPartial], per getRSCPayload) or 3 when + * reconstructed without the isHeadPartial flag (per instant-validation). */ function extractFlightData(initialRSCPayload: InitialRSCPayload): { buildId: string | undefined @@ -256,7 +258,10 @@ function extractFlightData(initialRSCPayload: InitialRSCPayload): { } | null { const flightDataPaths = initialRSCPayload.f // FlightDataPath is an unsound type, hence the additional checks. - if (flightDataPaths.length !== 1 && flightDataPaths[0].length !== 3) { + if ( + flightDataPaths.length !== 1 || + (flightDataPaths[0].length !== 3 && flightDataPaths[0].length !== 4) + ) { console.error( 'Internal Next.js error: InitialRSCPayload does not match the expected ' + 'shape for a prerendered page during segment prefetch generation.' diff --git a/packages/next/src/server/app-render/instant-validation/instant-validation.tsx b/packages/next/src/server/app-render/instant-validation/instant-validation.tsx index 34715433c3f3..771268791d5d 100644 --- a/packages/next/src/server/app-render/instant-validation/instant-validation.tsx +++ b/packages/next/src/server/app-render/instant-validation/instant-validation.tsx @@ -665,9 +665,16 @@ export async function createCombinedPayloadStream( } function getRootDataFromPayload(initialRSCPayload: InitialRSCPayload) { - // FlightDataPath is an unsound type, hence the additional checks. + // FlightDataPath is an unsound type, hence the additional checks. The + // valid shapes are a single root path with no segment prefix: 4 elements + // ([tree, seedData, head, isHeadPartial], per getRSCPayload) or 3 when + // reconstructed without the isHeadPartial flag (see the payload literals + // in this module). const flightDataPaths = initialRSCPayload.f - if (flightDataPaths.length !== 1 && flightDataPaths[0].length !== 3) { + if ( + flightDataPaths.length !== 1 || + (flightDataPaths[0].length !== 3 && flightDataPaths[0].length !== 4) + ) { throw new InvariantError( 'InitialRSCPayload does not match the expected shape during instant validation.' ) diff --git a/packages/next/src/server/config-schema.ts b/packages/next/src/server/config-schema.ts index f93751df2204..e4452203b77e 100644 --- a/packages/next/src/server/config-schema.ts +++ b/packages/next/src/server/config-schema.ts @@ -383,14 +383,18 @@ export const experimentalSchema = { turbopackRemoveUnusedImports: z.boolean().optional(), turbopackRemoveUnusedExports: z.boolean().optional(), turbopackScopeHoisting: z.boolean().optional(), - turbopackGenerateComponentChunks: z.boolean().optional(), turbopackSharedRuntime: z.boolean().optional(), - turbopackChunkingHeuristics: z + turbopackChunking: z .object({ firstPageLoadPriority: z.number().min(0).max(1).optional(), priorityRoutes: z.array(z.instanceof(RegExp)).optional(), priorityBoost: z.number().min(1).optional(), requestCost: z.number().min(0).max(1_000_000).optional(), + minChunkSize: z.number().min(0).optional(), + maxChunkCountPerGroup: z.number().min(0).optional(), + maxMergeChunkSize: z.number().min(0).optional(), + minComponentChunkSize: z.number().min(0).optional(), + generateComponentChunks: z.boolean().optional(), }) .optional(), turbopackWorkerAssetPrefix: z.string().optional(), diff --git a/packages/next/src/server/config-shared.ts b/packages/next/src/server/config-shared.ts index 33fc7987d2d6..87892fb7c960 100644 --- a/packages/next/src/server/config-shared.ts +++ b/packages/next/src/server/config-shared.ts @@ -763,13 +763,6 @@ export interface ExperimentalConfig { */ turbopackScopeHoisting?: boolean - /** - * (`next --turbopack` only) Emit each merged production chunk's constituent component chunks - * alongside it, so the browser runtime can load only the ones it doesn't already have. - * Defaults to `false`. Only applies in build mode. - */ - turbopackGenerateComponentChunks?: boolean - /** * Share the browser runtime across routes in a single `runtime.js` asset and inline the * per-route chunk-group bootstrap into the HTML, dropping the per-route runtime. Defaults to @@ -778,10 +771,10 @@ export interface ExperimentalConfig { turbopackSharedRuntime?: boolean /** - * (`next --turbopack` only) Traffic-related hints for the production chunker. These change the - * assumptions Turbopack makes when making chunk merging decisions. + * (`next --turbopack` only) These options change the assumptions Turbopack makes when + * making chunk merging decisions and the raw size thresholds it uses. */ - turbopackChunkingHeuristics?: { + turbopackChunking?: { /** * This is a number between `0..1`, when higher, we weight the benefits of * merging chunks for a signal page load higher. If you don't know a good @@ -808,6 +801,32 @@ export interface ExperimentalConfig { * is approximately 5x the size of compressed and minified code. */ requestCost?: number + /** + * Avoid creating more than one chunk smaller than this size, in bytes. Smaller + * chunks are merged into bigger ones to avoid that. Defaults to `50000` (50 KB). + */ + minChunkSize?: number + /** + * Avoid creating more than this number of chunks per chunk group. Chunks are + * merged into bigger ones to avoid that. Defaults to `40`. + */ + maxChunkCountPerGroup?: number + /** + * Never merge chunks bigger than this size, in bytes, with other chunks. This keeps code + * in big chunks from being duplicated across multiple chunks. Defaults to `200000` (200 KB). + */ + maxMergeChunkSize?: number + /** + * Emit each merged production chunk's constituent component chunks alongside it, so the + * browser runtime can load only the ones it doesn't already have. Defaults to `false`. + */ + generateComponentChunks?: boolean + /** + * Minimum size, in bytes, for a component chunk to be emitted on its own when + * `generateComponentChunks` is enabled. Component chunks smaller than this are folded into a + * single remainder chunk. Defaults to `20000` (20 KB). + */ + minComponentChunkSize?: number } /** diff --git a/packages/next/src/server/config.ts b/packages/next/src/server/config.ts index a3bb3b657ee4..169f3da84172 100644 --- a/packages/next/src/server/config.ts +++ b/packages/next/src/server/config.ts @@ -2036,6 +2036,28 @@ async function loadConfigImpl( userConfig.experimental.supportsImmutableAssets } + // `experimental.turbopackGenerateComponentChunks` has moved into + // `experimental.turbopackChunking.generateComponentChunks`. + if ( + (userConfig.experimental as any)?.turbopackGenerateComponentChunks !== + undefined + ) { + throw new Error( + `\`experimental.turbopackGenerateComponentChunks\` has been moved to \`experimental.turbopackChunking.generateComponentChunks\`. Please update your ${configFileName} file accordingly.` + ) + } + + // `experimental.turbopackChunkingHeuristics` has been renamed to + // `experimental.turbopackChunking`. + if ( + (userConfig.experimental as any)?.turbopackChunkingHeuristics !== + undefined + ) { + throw new Error( + `\`experimental.turbopackChunkingHeuristics\` has been renamed to \`experimental.turbopackChunking\`. Please update your ${configFileName} file accordingly.` + ) + } + // Always validate the config against schema in non minimal mode if (!process.env.NEXT_MINIMAL && !silent) { await validateConfigSchema( diff --git a/test/e2e/app-dir/fallback-shells/app/without-io/metadata-hub/page.jsx b/test/e2e/app-dir/fallback-shells/app/without-io/metadata-hub/page.jsx new file mode 100644 index 000000000000..e5723e7f32ba --- /dev/null +++ b/test/e2e/app-dir/fallback-shells/app/without-io/metadata-hub/page.jsx @@ -0,0 +1,18 @@ +import { LinkAccordion } from '../../../components/link-accordion' + +export const metadata = { + title: 'Metadata Hub Title', +} + +export default function Page() { + return ( + <> +
Metadata hub page content
+
+ + Back to fallback page + +
+ + ) +} diff --git a/test/e2e/app-dir/fallback-shells/app/without-io/with-metadata/[slug]/page.jsx b/test/e2e/app-dir/fallback-shells/app/without-io/with-metadata/[slug]/page.jsx new file mode 100644 index 000000000000..b68ceb1d8aa6 --- /dev/null +++ b/test/e2e/app-dir/fallback-shells/app/without-io/with-metadata/[slug]/page.jsx @@ -0,0 +1,23 @@ +import { LinkAccordion } from '../../../../components/link-accordion' + +export const metadata = { + title: 'Fallback Shell Metadata Title', +} + +export default async function Page({ params }) { + const { slug } = await params + return ( + <> +
Hello /{slug}
+
+ + Go to metadata hub + +
+ + ) +} + +export async function generateStaticParams() { + return [{ slug: 'foo' }] +} diff --git a/test/e2e/app-dir/fallback-shells/components/link-accordion.tsx b/test/e2e/app-dir/fallback-shells/components/link-accordion.tsx new file mode 100644 index 000000000000..40e57151e305 --- /dev/null +++ b/test/e2e/app-dir/fallback-shells/components/link-accordion.tsx @@ -0,0 +1,36 @@ +'use client' + +import Link, { type LinkProps } from 'next/link' +import { useState } from 'react' + +export function LinkAccordion({ + href, + children, + prefetch, + id, +}: { + href: string + children: string + prefetch?: LinkProps['prefetch'] + id?: string +}) { + const [isVisible, setIsVisible] = useState(false) + return ( + <> + setIsVisible(!isVisible)} + data-link-accordion={href} + id={id} + /> + {isVisible ? ( + + {children} + + ) : ( + `${children} (link is hidden)` + )} + + ) +} diff --git a/test/e2e/app-dir/fallback-shells/fallback-shells.test.ts b/test/e2e/app-dir/fallback-shells/fallback-shells.test.ts index a0d59cfc1c33..a86f6c407b2c 100644 --- a/test/e2e/app-dir/fallback-shells/fallback-shells.test.ts +++ b/test/e2e/app-dir/fallback-shells/fallback-shells.test.ts @@ -1,5 +1,7 @@ import { nextTestSetup } from 'e2e-utils' import { assertNoConsoleErrors } from 'next-test-utils' +import type * as Playwright from 'playwright' +import { createRouterAct } from 'router-act' describe('fallback-shells', () => { const { next, isNextDev, isNextDeploy, isNextStart } = nextTestSetup({ @@ -18,6 +20,91 @@ describe('fallback-shells', () => { // response, and therefore shouldn't have sent the postponed header. expect(headers['x-nextjs-postponed']).not.toBe('1') }) + + // Coverage for the head (metadata) surviving hydration of a fallback + // shell page for an uncovered param: the title must be correct after + // hydration, the head must be included in prefetched data, and a return + // navigation must be served entirely from the cache that was populated + // during the initial hydration. + // + // NOTE: This does not exercise the client resume path + // (createInitialRSCPayloadFromFallbackPrerender). In deployed + // environments an uncovered param currently gets a blocking on-demand + // render rather than the prerendered fallback shell, and `next start` + // renders uncovered params on demand as well. The resume script is only + // present in the build-time fallback shell artifact. + describe('with metadata', () => { + if (isNextDev) { + // Fallback shells (and prefetching) only exist in production builds. + test('disabled in development', () => {}) + return + } + + it('preserves metadata when hydrating a fallback shell page', async () => { + let act: ReturnType + const { browser, response } = await next.browserWithResponse( + '/without-io/with-metadata/world', + { + beforePageLoad(p: Playwright.Page) { + act = createRouterAct(p) + }, + } + ) + expect(response.headers()['x-nextjs-postponed']).not.toBe('1') + expect(await browser.elementById('slug').text()).toBe('Hello /world') + expect(await browser.eval('document.title')).toBe( + 'Fallback Shell Metadata Title' + ) + + // Prefetch the hub page. The head (title) should be included in the + // prefetched data. + await act( + async () => { + const toggle = await browser.elementByCss( + 'input[data-link-accordion="/without-io/metadata-hub"]' + ) + await toggle.click() + }, + { includes: 'Metadata Hub Title' } + ) + + // Navigate to the hub. It was fully prefetched, so no additional + // requests should be needed. This also proves hydration of the + // initial page completed, since it requires the client router to + // be interactive. + await act(async () => { + const link = await browser.elementByCss( + 'a[href="/without-io/metadata-hub"]' + ) + await link.click() + }, 'no-requests') + expect(await browser.elementById('hub').text()).toBe( + 'Metadata hub page content' + ) + expect(await browser.eval('document.title')).toBe('Metadata Hub Title') + + // Navigate back to the fallback page. Hydrating the initial page + // wrote its data — including the head — into the segment cache, so + // the return navigation should be served entirely from the cache. + await act(async () => { + const toggle = await browser.elementByCss( + 'input[data-link-accordion="/without-io/with-metadata/world"]' + ) + await toggle.click() + }, 'no-requests') + await act(async () => { + const link = await browser.elementByCss( + 'a[href="/without-io/with-metadata/world"]' + ) + await link.click() + }, 'no-requests') + expect(await browser.elementById('slug').text()).toBe('Hello /world') + expect(await browser.eval('document.title')).toBe( + 'Fallback Shell Metadata Title' + ) + await assertNoConsoleErrors(browser) + }) + }) }) describe('with cached IO', () => { diff --git a/test/production/app-dir/turbopack-chunking-removed-config/app/layout.tsx b/test/production/app-dir/turbopack-chunking-removed-config/app/layout.tsx new file mode 100644 index 000000000000..7758e801dc83 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking-removed-config/app/layout.tsx @@ -0,0 +1,9 @@ +import { ReactNode } from 'react' + +export default function RootLayout({ children }: { children: ReactNode }) { + return ( + + {children} + + ) +} diff --git a/test/production/app-dir/turbopack-chunking-removed-config/app/page.tsx b/test/production/app-dir/turbopack-chunking-removed-config/app/page.tsx new file mode 100644 index 000000000000..4cceff47208e --- /dev/null +++ b/test/production/app-dir/turbopack-chunking-removed-config/app/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

hello

+} diff --git a/test/production/app-dir/turbopack-chunking-removed-config/next.config.js b/test/production/app-dir/turbopack-chunking-removed-config/next.config.js new file mode 100644 index 000000000000..5a877d2dbfab --- /dev/null +++ b/test/production/app-dir/turbopack-chunking-removed-config/next.config.js @@ -0,0 +1,2 @@ +/** @type {import('next').NextConfig} */ +module.exports = {} diff --git a/test/production/app-dir/turbopack-chunking-removed-config/turbopack-chunking-removed-config.test.ts b/test/production/app-dir/turbopack-chunking-removed-config/turbopack-chunking-removed-config.test.ts new file mode 100644 index 000000000000..62712a0908e5 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking-removed-config/turbopack-chunking-removed-config.test.ts @@ -0,0 +1,47 @@ +import { nextTestSetup } from 'e2e-utils' + +describe('experimental.turbopackChunking removed/renamed config', () => { + const { next } = nextTestSetup({ + files: __dirname, + skipStart: true, + }) + + it('errors when the removed `turbopackGenerateComponentChunks` flag is used', async () => { + await next.patchFile( + 'next.config.js', + `module.exports = { + experimental: { turbopackGenerateComponentChunks: true }, + }` + ) + const { cliOutput } = await next.build() + expect(cliOutput).toContain( + '`experimental.turbopackGenerateComponentChunks` has been moved to `experimental.turbopackChunking.generateComponentChunks`' + ) + }) + + it('errors when the renamed `turbopackChunkingHeuristics` key is used', async () => { + await next.patchFile( + 'next.config.js', + `module.exports = { + experimental: { turbopackChunkingHeuristics: { requestCost: 100000 } }, + }` + ) + const { cliOutput } = await next.build() + expect(cliOutput).toContain( + '`experimental.turbopackChunkingHeuristics` has been renamed to `experimental.turbopackChunking`' + ) + }) + + it('accepts a valid `turbopackChunking` config', async () => { + await next.patchFile( + 'next.config.js', + `module.exports = { + experimental: { turbopackChunking: { maxMergeChunkSize: 100000 } }, + }` + ) + const { exitCode, cliOutput } = await next.build() + expect(exitCode).toBe(0) + expect(cliOutput).not.toContain('has been moved to') + expect(cliOutput).not.toContain('has been renamed to') + }) +}) diff --git a/test/production/app-dir/turbopack-chunking/app/a/page.tsx b/test/production/app-dir/turbopack-chunking/app/a/page.tsx new file mode 100644 index 000000000000..04783eb14362 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/app/a/page.tsx @@ -0,0 +1,14 @@ +import { BulkyA } from '../../components/bulky-a' +import { BulkyB } from '../../components/bulky-b' +import { BulkyC } from '../../components/bulky-c' + +export default function Page() { + return ( +
+

page a

+ + + +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/app/b/page.tsx b/test/production/app-dir/turbopack-chunking/app/b/page.tsx new file mode 100644 index 000000000000..9aa1348c3d32 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/app/b/page.tsx @@ -0,0 +1,14 @@ +import { BulkyB } from '../../components/bulky-b' +import { BulkyC } from '../../components/bulky-c' +import { BulkyD } from '../../components/bulky-d' + +export default function Page() { + return ( +
+

page b

+ + + +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/app/c/page.tsx b/test/production/app-dir/turbopack-chunking/app/c/page.tsx new file mode 100644 index 000000000000..292c92d15e06 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/app/c/page.tsx @@ -0,0 +1,14 @@ +import { BulkyC } from '../../components/bulky-c' +import { BulkyD } from '../../components/bulky-d' +import { BulkyE } from '../../components/bulky-e' + +export default function Page() { + return ( +
+

page c

+ + + +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/app/d/page.tsx b/test/production/app-dir/turbopack-chunking/app/d/page.tsx new file mode 100644 index 000000000000..90a00106bcaf --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/app/d/page.tsx @@ -0,0 +1,14 @@ +import { BulkyD } from '../../components/bulky-d' +import { BulkyE } from '../../components/bulky-e' +import { BulkyA } from '../../components/bulky-a' + +export default function Page() { + return ( +
+

page d

+ + + +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/app/e/page.tsx b/test/production/app-dir/turbopack-chunking/app/e/page.tsx new file mode 100644 index 000000000000..8e11be61d79d --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/app/e/page.tsx @@ -0,0 +1,14 @@ +import { BulkyE } from '../../components/bulky-e' +import { BulkyA } from '../../components/bulky-a' +import { BulkyB } from '../../components/bulky-b' + +export default function Page() { + return ( +
+

page e

+ + + +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/app/layout.tsx b/test/production/app-dir/turbopack-chunking/app/layout.tsx new file mode 100644 index 000000000000..2305a7fdecc8 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/app/layout.tsx @@ -0,0 +1,15 @@ +import { ReactNode } from 'react' + +export default function RootLayout({ children }: { children: ReactNode }) { + return ( + + + + {children} + + + ) +} diff --git a/test/production/app-dir/turbopack-chunking/app/page.tsx b/test/production/app-dir/turbopack-chunking/app/page.tsx new file mode 100644 index 000000000000..fb3c39c5deb0 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/app/page.tsx @@ -0,0 +1,12 @@ +import { BulkyA } from '../components/bulky-a' +import { BulkyB } from '../components/bulky-b' + +export default function Home() { + return ( +
+

home

+ + +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/components/bulky-a.tsx b/test/production/app-dir/turbopack-chunking/components/bulky-a.tsx new file mode 100644 index 000000000000..75e945d2342f --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/components/bulky-a.tsx @@ -0,0 +1,417 @@ +'use client' + +import { Shared } from './shared' + +// Unique bulk so component a is a distinct, sizeable client module. +const DATA_A: string[] = [ + 'bulky-a-item-0-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-1-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-2-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-3-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-4-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-5-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-6-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-7-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-8-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-9-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-10-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-11-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-12-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-13-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-14-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-15-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-16-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-17-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-18-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-19-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-20-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-21-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-22-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-23-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-24-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-25-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-26-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-27-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-28-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-29-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-30-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-31-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-32-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-33-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-34-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-35-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-36-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-37-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-38-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-39-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-40-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-41-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-42-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-43-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-44-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-45-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-46-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-47-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-48-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-49-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-50-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-51-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-52-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-53-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-54-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-55-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-56-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-57-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-58-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-59-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-60-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-61-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-62-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-63-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-64-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-65-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-66-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-67-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-68-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-69-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-70-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-71-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-72-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-73-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-74-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-75-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-76-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-77-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-78-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-79-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-80-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-81-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-82-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-83-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-84-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-85-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-86-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-87-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-88-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-89-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-90-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-91-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-92-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-93-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-94-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-95-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-96-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-97-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-98-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-99-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-100-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-101-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-102-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-103-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-104-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-105-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-106-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-107-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-108-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-109-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-110-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-111-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-112-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-113-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-114-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-115-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-116-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-117-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-118-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-119-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-120-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-121-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-122-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-123-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-124-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-125-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-126-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-127-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-128-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-129-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-130-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-131-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-132-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-133-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-134-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-135-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-136-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-137-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-138-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-139-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-140-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-141-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-142-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-143-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-144-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-145-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-146-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-147-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-148-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-149-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-150-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-151-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-152-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-153-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-154-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-155-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-156-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-157-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-158-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-159-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-160-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-161-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-162-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-163-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-164-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-165-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-166-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-167-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-168-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-169-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-170-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-171-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-172-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-173-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-174-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-175-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-176-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-177-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-178-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-179-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-180-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-181-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-182-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-183-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-184-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-185-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-186-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-187-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-188-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-189-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-190-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-191-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-192-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-193-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-194-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-195-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-196-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-197-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-198-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-199-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-200-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-201-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-202-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-203-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-204-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-205-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-206-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-207-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-208-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-209-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-210-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-211-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-212-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-213-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-214-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-215-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-216-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-217-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-218-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-219-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-220-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-221-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-222-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-223-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-224-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-225-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-226-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-227-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-228-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-229-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-230-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-231-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-232-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-233-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-234-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-235-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-236-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-237-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-238-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-239-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-240-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-241-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-242-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-243-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-244-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-245-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-246-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-247-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-248-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-249-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-250-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-251-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-252-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-253-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-254-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-255-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-256-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-257-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-258-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-259-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-260-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-261-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-262-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-263-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-264-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-265-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-266-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-267-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-268-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-269-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-270-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-271-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-272-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-273-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-274-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-275-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-276-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-277-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-278-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-279-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-280-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-281-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-282-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-283-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-284-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-285-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-286-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-287-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-288-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-289-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-290-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-291-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-292-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-293-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-294-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-295-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-296-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-297-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-298-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-299-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-300-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-301-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-302-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-303-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-304-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-305-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-306-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-307-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-308-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-309-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-310-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-311-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-312-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-313-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-314-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-315-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-316-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-317-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-318-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-319-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-320-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-321-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-322-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-323-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-324-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-325-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-326-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-327-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-328-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-329-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-330-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-331-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-332-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-333-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-334-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-335-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-336-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-337-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-338-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-339-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-340-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-341-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-342-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-343-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-344-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-345-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-346-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-347-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-348-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-349-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-350-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-351-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-352-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-353-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-354-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-355-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-356-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-357-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-358-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-359-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-360-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-361-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-362-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-363-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-364-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-365-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-366-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-367-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-368-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-369-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-370-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-371-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-372-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-373-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-374-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-375-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-376-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-377-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-378-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-379-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-380-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-381-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-382-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-383-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-384-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-385-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-386-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-387-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-388-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-389-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-390-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-391-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-392-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-393-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-394-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-395-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-396-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-397-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-398-xxxxxxxxxxxxxxxxxxxx', + 'bulky-a-item-399-xxxxxxxxxxxxxxxxxxxx', +] + +export function BulkyA() { + const total = DATA_A.reduce((n, s) => n + s.length, 0) + return ( +
+

bulky-a:{total}

+ +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/components/bulky-b.tsx b/test/production/app-dir/turbopack-chunking/components/bulky-b.tsx new file mode 100644 index 000000000000..80ffa3cfb785 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/components/bulky-b.tsx @@ -0,0 +1,417 @@ +'use client' + +import { Shared } from './shared' + +// Unique bulk so component b is a distinct, sizeable client module. +const DATA_B: string[] = [ + 'bulky-b-item-0-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-1-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-2-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-3-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-4-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-5-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-6-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-7-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-8-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-9-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-10-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-11-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-12-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-13-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-14-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-15-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-16-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-17-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-18-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-19-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-20-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-21-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-22-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-23-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-24-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-25-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-26-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-27-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-28-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-29-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-30-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-31-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-32-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-33-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-34-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-35-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-36-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-37-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-38-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-39-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-40-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-41-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-42-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-43-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-44-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-45-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-46-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-47-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-48-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-49-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-50-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-51-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-52-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-53-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-54-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-55-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-56-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-57-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-58-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-59-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-60-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-61-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-62-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-63-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-64-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-65-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-66-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-67-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-68-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-69-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-70-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-71-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-72-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-73-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-74-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-75-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-76-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-77-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-78-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-79-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-80-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-81-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-82-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-83-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-84-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-85-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-86-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-87-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-88-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-89-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-90-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-91-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-92-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-93-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-94-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-95-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-96-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-97-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-98-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-99-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-100-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-101-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-102-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-103-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-104-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-105-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-106-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-107-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-108-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-109-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-110-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-111-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-112-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-113-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-114-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-115-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-116-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-117-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-118-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-119-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-120-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-121-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-122-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-123-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-124-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-125-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-126-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-127-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-128-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-129-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-130-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-131-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-132-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-133-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-134-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-135-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-136-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-137-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-138-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-139-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-140-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-141-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-142-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-143-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-144-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-145-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-146-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-147-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-148-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-149-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-150-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-151-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-152-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-153-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-154-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-155-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-156-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-157-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-158-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-159-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-160-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-161-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-162-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-163-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-164-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-165-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-166-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-167-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-168-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-169-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-170-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-171-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-172-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-173-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-174-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-175-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-176-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-177-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-178-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-179-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-180-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-181-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-182-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-183-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-184-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-185-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-186-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-187-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-188-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-189-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-190-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-191-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-192-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-193-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-194-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-195-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-196-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-197-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-198-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-199-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-200-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-201-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-202-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-203-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-204-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-205-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-206-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-207-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-208-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-209-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-210-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-211-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-212-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-213-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-214-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-215-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-216-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-217-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-218-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-219-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-220-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-221-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-222-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-223-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-224-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-225-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-226-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-227-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-228-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-229-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-230-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-231-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-232-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-233-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-234-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-235-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-236-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-237-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-238-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-239-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-240-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-241-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-242-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-243-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-244-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-245-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-246-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-247-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-248-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-249-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-250-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-251-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-252-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-253-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-254-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-255-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-256-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-257-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-258-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-259-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-260-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-261-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-262-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-263-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-264-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-265-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-266-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-267-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-268-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-269-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-270-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-271-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-272-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-273-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-274-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-275-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-276-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-277-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-278-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-279-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-280-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-281-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-282-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-283-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-284-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-285-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-286-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-287-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-288-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-289-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-290-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-291-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-292-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-293-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-294-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-295-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-296-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-297-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-298-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-299-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-300-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-301-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-302-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-303-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-304-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-305-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-306-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-307-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-308-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-309-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-310-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-311-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-312-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-313-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-314-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-315-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-316-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-317-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-318-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-319-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-320-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-321-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-322-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-323-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-324-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-325-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-326-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-327-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-328-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-329-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-330-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-331-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-332-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-333-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-334-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-335-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-336-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-337-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-338-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-339-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-340-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-341-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-342-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-343-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-344-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-345-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-346-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-347-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-348-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-349-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-350-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-351-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-352-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-353-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-354-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-355-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-356-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-357-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-358-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-359-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-360-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-361-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-362-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-363-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-364-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-365-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-366-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-367-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-368-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-369-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-370-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-371-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-372-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-373-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-374-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-375-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-376-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-377-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-378-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-379-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-380-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-381-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-382-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-383-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-384-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-385-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-386-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-387-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-388-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-389-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-390-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-391-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-392-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-393-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-394-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-395-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-396-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-397-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-398-xxxxxxxxxxxxxxxxxxxx', + 'bulky-b-item-399-xxxxxxxxxxxxxxxxxxxx', +] + +export function BulkyB() { + const total = DATA_B.reduce((n, s) => n + s.length, 0) + return ( +
+

bulky-b:{total}

+ +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/components/bulky-c.tsx b/test/production/app-dir/turbopack-chunking/components/bulky-c.tsx new file mode 100644 index 000000000000..084c672dfd32 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/components/bulky-c.tsx @@ -0,0 +1,417 @@ +'use client' + +import { Shared } from './shared' + +// Unique bulk so component c is a distinct, sizeable client module. +const DATA_C: string[] = [ + 'bulky-c-item-0-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-1-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-2-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-3-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-4-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-5-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-6-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-7-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-8-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-9-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-10-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-11-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-12-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-13-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-14-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-15-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-16-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-17-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-18-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-19-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-20-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-21-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-22-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-23-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-24-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-25-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-26-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-27-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-28-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-29-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-30-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-31-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-32-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-33-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-34-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-35-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-36-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-37-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-38-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-39-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-40-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-41-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-42-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-43-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-44-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-45-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-46-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-47-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-48-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-49-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-50-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-51-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-52-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-53-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-54-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-55-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-56-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-57-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-58-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-59-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-60-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-61-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-62-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-63-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-64-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-65-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-66-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-67-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-68-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-69-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-70-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-71-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-72-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-73-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-74-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-75-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-76-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-77-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-78-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-79-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-80-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-81-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-82-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-83-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-84-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-85-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-86-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-87-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-88-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-89-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-90-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-91-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-92-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-93-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-94-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-95-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-96-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-97-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-98-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-99-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-100-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-101-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-102-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-103-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-104-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-105-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-106-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-107-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-108-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-109-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-110-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-111-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-112-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-113-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-114-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-115-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-116-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-117-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-118-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-119-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-120-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-121-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-122-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-123-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-124-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-125-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-126-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-127-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-128-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-129-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-130-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-131-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-132-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-133-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-134-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-135-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-136-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-137-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-138-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-139-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-140-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-141-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-142-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-143-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-144-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-145-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-146-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-147-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-148-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-149-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-150-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-151-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-152-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-153-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-154-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-155-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-156-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-157-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-158-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-159-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-160-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-161-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-162-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-163-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-164-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-165-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-166-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-167-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-168-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-169-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-170-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-171-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-172-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-173-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-174-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-175-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-176-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-177-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-178-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-179-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-180-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-181-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-182-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-183-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-184-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-185-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-186-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-187-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-188-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-189-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-190-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-191-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-192-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-193-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-194-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-195-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-196-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-197-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-198-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-199-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-200-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-201-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-202-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-203-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-204-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-205-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-206-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-207-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-208-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-209-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-210-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-211-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-212-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-213-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-214-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-215-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-216-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-217-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-218-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-219-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-220-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-221-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-222-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-223-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-224-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-225-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-226-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-227-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-228-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-229-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-230-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-231-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-232-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-233-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-234-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-235-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-236-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-237-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-238-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-239-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-240-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-241-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-242-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-243-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-244-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-245-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-246-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-247-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-248-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-249-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-250-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-251-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-252-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-253-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-254-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-255-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-256-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-257-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-258-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-259-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-260-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-261-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-262-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-263-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-264-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-265-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-266-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-267-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-268-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-269-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-270-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-271-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-272-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-273-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-274-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-275-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-276-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-277-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-278-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-279-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-280-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-281-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-282-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-283-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-284-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-285-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-286-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-287-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-288-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-289-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-290-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-291-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-292-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-293-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-294-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-295-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-296-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-297-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-298-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-299-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-300-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-301-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-302-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-303-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-304-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-305-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-306-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-307-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-308-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-309-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-310-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-311-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-312-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-313-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-314-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-315-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-316-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-317-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-318-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-319-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-320-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-321-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-322-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-323-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-324-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-325-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-326-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-327-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-328-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-329-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-330-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-331-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-332-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-333-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-334-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-335-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-336-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-337-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-338-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-339-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-340-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-341-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-342-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-343-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-344-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-345-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-346-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-347-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-348-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-349-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-350-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-351-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-352-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-353-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-354-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-355-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-356-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-357-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-358-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-359-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-360-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-361-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-362-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-363-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-364-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-365-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-366-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-367-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-368-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-369-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-370-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-371-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-372-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-373-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-374-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-375-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-376-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-377-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-378-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-379-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-380-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-381-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-382-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-383-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-384-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-385-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-386-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-387-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-388-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-389-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-390-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-391-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-392-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-393-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-394-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-395-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-396-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-397-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-398-xxxxxxxxxxxxxxxxxxxx', + 'bulky-c-item-399-xxxxxxxxxxxxxxxxxxxx', +] + +export function BulkyC() { + const total = DATA_C.reduce((n, s) => n + s.length, 0) + return ( +
+

bulky-c:{total}

+ +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/components/bulky-d.tsx b/test/production/app-dir/turbopack-chunking/components/bulky-d.tsx new file mode 100644 index 000000000000..57086f296d8e --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/components/bulky-d.tsx @@ -0,0 +1,417 @@ +'use client' + +import { Shared } from './shared' + +// Unique bulk so component d is a distinct, sizeable client module. +const DATA_D: string[] = [ + 'bulky-d-item-0-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-1-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-2-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-3-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-4-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-5-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-6-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-7-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-8-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-9-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-10-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-11-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-12-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-13-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-14-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-15-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-16-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-17-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-18-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-19-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-20-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-21-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-22-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-23-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-24-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-25-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-26-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-27-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-28-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-29-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-30-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-31-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-32-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-33-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-34-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-35-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-36-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-37-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-38-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-39-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-40-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-41-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-42-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-43-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-44-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-45-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-46-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-47-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-48-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-49-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-50-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-51-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-52-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-53-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-54-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-55-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-56-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-57-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-58-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-59-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-60-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-61-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-62-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-63-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-64-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-65-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-66-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-67-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-68-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-69-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-70-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-71-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-72-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-73-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-74-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-75-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-76-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-77-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-78-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-79-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-80-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-81-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-82-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-83-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-84-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-85-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-86-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-87-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-88-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-89-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-90-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-91-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-92-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-93-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-94-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-95-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-96-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-97-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-98-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-99-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-100-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-101-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-102-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-103-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-104-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-105-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-106-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-107-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-108-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-109-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-110-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-111-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-112-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-113-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-114-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-115-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-116-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-117-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-118-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-119-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-120-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-121-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-122-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-123-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-124-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-125-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-126-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-127-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-128-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-129-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-130-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-131-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-132-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-133-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-134-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-135-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-136-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-137-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-138-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-139-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-140-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-141-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-142-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-143-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-144-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-145-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-146-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-147-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-148-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-149-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-150-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-151-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-152-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-153-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-154-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-155-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-156-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-157-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-158-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-159-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-160-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-161-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-162-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-163-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-164-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-165-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-166-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-167-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-168-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-169-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-170-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-171-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-172-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-173-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-174-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-175-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-176-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-177-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-178-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-179-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-180-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-181-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-182-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-183-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-184-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-185-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-186-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-187-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-188-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-189-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-190-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-191-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-192-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-193-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-194-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-195-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-196-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-197-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-198-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-199-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-200-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-201-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-202-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-203-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-204-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-205-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-206-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-207-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-208-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-209-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-210-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-211-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-212-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-213-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-214-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-215-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-216-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-217-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-218-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-219-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-220-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-221-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-222-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-223-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-224-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-225-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-226-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-227-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-228-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-229-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-230-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-231-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-232-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-233-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-234-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-235-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-236-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-237-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-238-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-239-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-240-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-241-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-242-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-243-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-244-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-245-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-246-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-247-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-248-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-249-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-250-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-251-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-252-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-253-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-254-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-255-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-256-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-257-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-258-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-259-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-260-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-261-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-262-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-263-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-264-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-265-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-266-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-267-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-268-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-269-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-270-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-271-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-272-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-273-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-274-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-275-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-276-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-277-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-278-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-279-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-280-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-281-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-282-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-283-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-284-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-285-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-286-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-287-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-288-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-289-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-290-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-291-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-292-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-293-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-294-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-295-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-296-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-297-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-298-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-299-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-300-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-301-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-302-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-303-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-304-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-305-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-306-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-307-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-308-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-309-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-310-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-311-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-312-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-313-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-314-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-315-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-316-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-317-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-318-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-319-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-320-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-321-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-322-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-323-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-324-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-325-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-326-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-327-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-328-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-329-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-330-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-331-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-332-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-333-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-334-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-335-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-336-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-337-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-338-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-339-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-340-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-341-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-342-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-343-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-344-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-345-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-346-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-347-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-348-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-349-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-350-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-351-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-352-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-353-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-354-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-355-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-356-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-357-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-358-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-359-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-360-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-361-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-362-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-363-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-364-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-365-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-366-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-367-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-368-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-369-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-370-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-371-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-372-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-373-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-374-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-375-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-376-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-377-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-378-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-379-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-380-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-381-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-382-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-383-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-384-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-385-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-386-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-387-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-388-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-389-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-390-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-391-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-392-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-393-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-394-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-395-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-396-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-397-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-398-xxxxxxxxxxxxxxxxxxxx', + 'bulky-d-item-399-xxxxxxxxxxxxxxxxxxxx', +] + +export function BulkyD() { + const total = DATA_D.reduce((n, s) => n + s.length, 0) + return ( +
+

bulky-d:{total}

+ +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/components/bulky-e.tsx b/test/production/app-dir/turbopack-chunking/components/bulky-e.tsx new file mode 100644 index 000000000000..76ed5565c324 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/components/bulky-e.tsx @@ -0,0 +1,417 @@ +'use client' + +import { Shared } from './shared' + +// Unique bulk so component e is a distinct, sizeable client module. +const DATA_E: string[] = [ + 'bulky-e-item-0-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-1-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-2-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-3-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-4-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-5-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-6-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-7-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-8-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-9-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-10-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-11-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-12-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-13-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-14-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-15-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-16-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-17-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-18-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-19-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-20-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-21-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-22-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-23-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-24-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-25-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-26-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-27-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-28-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-29-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-30-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-31-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-32-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-33-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-34-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-35-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-36-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-37-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-38-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-39-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-40-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-41-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-42-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-43-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-44-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-45-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-46-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-47-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-48-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-49-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-50-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-51-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-52-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-53-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-54-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-55-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-56-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-57-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-58-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-59-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-60-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-61-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-62-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-63-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-64-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-65-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-66-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-67-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-68-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-69-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-70-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-71-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-72-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-73-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-74-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-75-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-76-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-77-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-78-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-79-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-80-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-81-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-82-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-83-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-84-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-85-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-86-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-87-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-88-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-89-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-90-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-91-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-92-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-93-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-94-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-95-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-96-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-97-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-98-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-99-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-100-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-101-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-102-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-103-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-104-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-105-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-106-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-107-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-108-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-109-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-110-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-111-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-112-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-113-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-114-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-115-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-116-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-117-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-118-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-119-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-120-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-121-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-122-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-123-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-124-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-125-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-126-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-127-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-128-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-129-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-130-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-131-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-132-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-133-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-134-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-135-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-136-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-137-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-138-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-139-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-140-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-141-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-142-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-143-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-144-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-145-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-146-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-147-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-148-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-149-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-150-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-151-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-152-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-153-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-154-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-155-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-156-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-157-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-158-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-159-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-160-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-161-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-162-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-163-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-164-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-165-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-166-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-167-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-168-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-169-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-170-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-171-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-172-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-173-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-174-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-175-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-176-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-177-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-178-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-179-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-180-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-181-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-182-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-183-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-184-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-185-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-186-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-187-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-188-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-189-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-190-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-191-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-192-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-193-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-194-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-195-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-196-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-197-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-198-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-199-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-200-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-201-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-202-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-203-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-204-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-205-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-206-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-207-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-208-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-209-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-210-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-211-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-212-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-213-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-214-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-215-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-216-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-217-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-218-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-219-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-220-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-221-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-222-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-223-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-224-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-225-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-226-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-227-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-228-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-229-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-230-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-231-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-232-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-233-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-234-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-235-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-236-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-237-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-238-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-239-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-240-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-241-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-242-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-243-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-244-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-245-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-246-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-247-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-248-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-249-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-250-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-251-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-252-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-253-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-254-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-255-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-256-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-257-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-258-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-259-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-260-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-261-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-262-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-263-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-264-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-265-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-266-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-267-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-268-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-269-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-270-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-271-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-272-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-273-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-274-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-275-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-276-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-277-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-278-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-279-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-280-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-281-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-282-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-283-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-284-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-285-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-286-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-287-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-288-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-289-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-290-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-291-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-292-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-293-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-294-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-295-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-296-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-297-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-298-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-299-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-300-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-301-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-302-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-303-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-304-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-305-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-306-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-307-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-308-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-309-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-310-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-311-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-312-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-313-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-314-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-315-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-316-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-317-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-318-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-319-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-320-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-321-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-322-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-323-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-324-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-325-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-326-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-327-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-328-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-329-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-330-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-331-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-332-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-333-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-334-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-335-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-336-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-337-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-338-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-339-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-340-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-341-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-342-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-343-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-344-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-345-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-346-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-347-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-348-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-349-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-350-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-351-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-352-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-353-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-354-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-355-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-356-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-357-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-358-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-359-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-360-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-361-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-362-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-363-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-364-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-365-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-366-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-367-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-368-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-369-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-370-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-371-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-372-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-373-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-374-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-375-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-376-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-377-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-378-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-379-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-380-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-381-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-382-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-383-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-384-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-385-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-386-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-387-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-388-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-389-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-390-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-391-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-392-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-393-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-394-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-395-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-396-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-397-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-398-xxxxxxxxxxxxxxxxxxxx', + 'bulky-e-item-399-xxxxxxxxxxxxxxxxxxxx', +] + +export function BulkyE() { + const total = DATA_E.reduce((n, s) => n + s.length, 0) + return ( +
+

bulky-e:{total}

+ +
+ ) +} diff --git a/test/production/app-dir/turbopack-chunking/components/shared.tsx b/test/production/app-dir/turbopack-chunking/components/shared.tsx new file mode 100644 index 000000000000..efe7de80de78 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/components/shared.tsx @@ -0,0 +1,15 @@ +'use client' + +import { useState } from 'react' + +// Shared client component imported by every route. Because it is used by +// multiple chunk groups it becomes a candidate for a shared chunk, which the +// chunker may or may not merge depending on the configured thresholds. +export function Shared({ label }: { label: string }) { + const [count, setCount] = useState(0) + return ( + + ) +} diff --git a/test/production/app-dir/turbopack-chunking/next.config.js b/test/production/app-dir/turbopack-chunking/next.config.js new file mode 100644 index 000000000000..5a877d2dbfab --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/next.config.js @@ -0,0 +1,2 @@ +/** @type {import('next').NextConfig} */ +module.exports = {} diff --git a/test/production/app-dir/turbopack-chunking/turbopack-chunking.test.ts b/test/production/app-dir/turbopack-chunking/turbopack-chunking.test.ts new file mode 100644 index 000000000000..db11898c4148 --- /dev/null +++ b/test/production/app-dir/turbopack-chunking/turbopack-chunking.test.ts @@ -0,0 +1,96 @@ +import { nextTestSetup } from 'e2e-utils' +import { listClientChunks } from 'next-test-utils' +import { join } from 'path' + +// `experimental.turbopackChunking` only affects Turbopack production builds, so +// this suite is Turbopack-only. Webpack uses a different chunker and ignores it. +;(process.env.IS_TURBOPACK_TEST ? describe : describe.skip)( + 'experimental.turbopackChunking', + () => { + const { next } = nextTestSetup({ + files: __dirname, + skipStart: true, + }) + + async function buildWith(turbopackChunking: object | undefined) { + const experimental = turbopackChunking ? { turbopackChunking } : {} + await next.patchFile( + 'next.config.js', + `module.exports = ${JSON.stringify({ experimental }, null, 2)}` + ) + const { exitCode } = await next.build() + expect(exitCode).toBe(0) + const chunks = await listClientChunks(join(next.testDir, '.next')) + return chunks.filter( + (name) => name.includes('chunks') && name.endsWith('.js') + ) + } + + // Force the chunker to merge as much as possible into as few chunks as + // possible. + const mergeAll = { + minChunkSize: 100_000_000, + maxMergeChunkSize: 100_000_000, + maxChunkCountPerGroup: 1, + } + + // Disable merging entirely, so every chunk group emits its own chunks. + const noMerge = { + minChunkSize: 0, + maxChunkCountPerGroup: 0, + maxMergeChunkSize: 0, + } + + let mergeAllChunks: string[] + let noMergeChunks: string[] + let mergeAllWithComponentChunks: string[] + + beforeAll(async () => { + mergeAllChunks = await buildWith(mergeAll) + noMergeChunks = await buildWith(noMerge) + mergeAllWithComponentChunks = await buildWith({ + ...mergeAll, + generateComponentChunks: true, + minComponentChunkSize: 0, + }) + }) + + it('changes the client chunk output based on the size thresholds', () => { + // Disabling merging produces strictly more client chunks than merging + // everything, proving the size thresholds are wired through. + expect(noMergeChunks.length).toBeGreaterThan(mergeAllChunks.length) + }) + + it('emits additional component chunks when generateComponentChunks is enabled', () => { + // With the same merge settings, enabling component chunks emits extra + // per-component chunks alongside the merged chunks. + expect(mergeAllWithComponentChunks.length).toBeGreaterThan( + mergeAllChunks.length + ) + }) + + it('renders and navigates correctly with custom chunking', async () => { + await next.patchFile( + 'next.config.js', + `module.exports = ${JSON.stringify( + { experimental: { turbopackChunking: mergeAll } }, + null, + 2 + )}` + ) + await next.build() + await next.start() + try { + const browser = await next.browser('/') + expect(await browser.elementByCss('#home').text()).toBe('home') + await browser + .elementByCss('a[href="/a"]') + .click() + .waitForElementByCss('#page-a') + expect(await browser.elementByCss('#page-a').text()).toBe('page a') + } finally { + await next.stop() + } + }) + } +)