@@ -483,54 +483,97 @@ public function resolveMergeProps(Request $request): array
483483 {
484484 $ mergeProps = $ this ->getMergePropsForRequest ($ request );
485485
486- $ mergePropsWithAppendOrPrependPath = $ mergeProps
487- ->filter (fn (Mergeable $ prop ) => $ prop ->hasAppendPaths () || $ prop ->hasPrependPaths ())
488- ->keys ();
486+ return array_filter ([
487+ 'mergeProps ' => $ this ->resolveAppendMergeProps ($ mergeProps ),
488+ 'prependProps ' => $ this ->resolvePrependMergeProps ($ mergeProps ),
489+ 'deepMergeProps ' => $ this ->resolveDeepMergeProps ($ mergeProps ),
490+ 'matchPropsOn ' => $ this ->resolveMergeMatchingKeys ($ mergeProps ),
491+ ], fn ($ prop ) => count ($ prop ) > 0 );
492+ }
489493
490- $ deepMergeProps = $ mergeProps
491- ->reject (fn ($ _ , string $ key ) => $ mergePropsWithAppendOrPrependPath ->contains ($ key ))
492- ->filter (fn (Mergeable $ prop ) => $ prop ->shouldDeepMerge ())
494+ /**
495+ * Resolve props that should be appended during merging.
496+ *
497+ * @param \Illuminate\Support\Collection<string, \Inertia\Mergeable> $mergeProps
498+ * @return array<int, string>
499+ */
500+ protected function resolveAppendMergeProps (Collection $ mergeProps ): array
501+ {
502+ [$ regularMergeProps , $ appendPaths ] = $ mergeProps
503+ ->reject (fn (Mergeable $ prop ) => $ prop ->shouldDeepMerge ())
504+ ->partition (fn (Mergeable $ prop ) => $ prop ->shouldMergeAtRootLevel ());
505+
506+ // Regular merge props (root level merging)
507+ $ regularMergeProps = $ regularMergeProps
508+ ->filter (fn (Mergeable $ prop ) => $ prop ->shouldAppend ())
493509 ->keys ();
494510
495- $ matchPropsOn = $ mergeProps
496- ->map (function (Mergeable $ prop , $ key ) {
497- return collect ($ prop ->matchesOn ())
498- ->map (fn ($ strategy ) => $ key .'. ' .$ strategy )
499- ->toArray ();
500- })
501- ->flatten ()
511+ // Specific append paths from MergeProp instances
512+ $ appendPaths = $ appendPaths
513+ ->flatMap (fn (Mergeable $ prop , string $ key ) => collect ($ prop ->appendPaths ())->map (fn ($ path ) => $ path ? $ key .'. ' .$ path : $ key ))
514+ ->unique ()
502515 ->values ();
503516
504- $ prependProps = $ mergeProps
505- ->reject (fn ($ _ , string $ key ) => $ mergePropsWithAppendOrPrependPath ->contains ($ key ))
506- ->filter (fn (Mergeable $ prop ) => ! $ prop ->shouldAppend () && ! $ prop ->shouldDeepMerge ())
507- ->keys ();
517+ return $ regularMergeProps ->merge ($ appendPaths )->values ()->toArray ();
518+ }
519+
520+ /**
521+ * Resolve props that should be prepended during merging.
522+ *
523+ * @param \Illuminate\Support\Collection<string, \Inertia\Mergeable> $mergeProps
524+ * @return array<int, string>
525+ */
526+ protected function resolvePrependMergeProps (Collection $ mergeProps ): array
527+ {
528+ [$ regularPrependProps , $ prependPaths ] = $ mergeProps
529+ ->reject (fn (Mergeable $ prop ) => $ prop ->shouldDeepMerge ())
530+ ->partition (fn (Mergeable $ prop ) => $ prop ->shouldMergeAtRootLevel ());
508531
509- $ mergeProps = $ mergeProps
510- -> reject ( fn ( $ _ , string $ key ) => $ mergePropsWithAppendOrPrependPath -> contains ( $ key ))
511- ->filter (fn (Mergeable $ prop ) => $ prop -> shouldAppend () && ! $ prop ->shouldDeepMerge ())
532+ // Regular prepend props (root level merging)
533+ $ regularPrependProps = $ regularPrependProps
534+ ->filter (fn (Mergeable $ prop ) => ! $ prop ->shouldAppend ())
512535 ->keys ();
513536
514- $ appendPaths = collect ( $ this -> props )
515- -> filter ( fn ( $ prop ) => $ prop instanceof MergeProp)
516- ->flatMap (fn (MergeProp $ prop , string $ key ) => collect ($ prop ->appendPaths ())->map (fn ($ path ) => $ path ? $ key .'. ' .$ path : $ key ))
537+ // Specific prepend paths from MergeProp instances
538+ $ prependPaths = $ mergeProps
539+ ->flatMap (fn (Mergeable $ prop , string $ key ) => collect ($ prop ->prependPaths ())->map (fn ($ path ) => $ path ? $ key .'. ' .$ path : $ key ))
517540 ->unique ()
518541 ->values ();
519542
520- $ prependPaths = collect ($ this ->props )
521- ->filter (fn ($ prop ) => $ prop instanceof MergeProp)
522- ->flatMap (fn (MergeProp $ prop , string $ key ) => collect ($ prop ->prependPaths ())->map (fn ($ path ) => $ path ? $ key .'. ' .$ path : $ key ))
523- ->unique ()
524- ->values ();
543+ return $ regularPrependProps ->merge ($ prependPaths )->values ()->toArray ();
544+ }
525545
526- return array_filter ([
527- 'mergeProps ' => $ mergeProps ->toArray (),
528- 'prependProps ' => $ prependProps ->toArray (),
529- 'deepMergeProps ' => $ deepMergeProps ->toArray (),
530- 'matchPropsOn ' => $ matchPropsOn ->toArray (),
531- 'appendPaths ' => $ appendPaths ->toArray (),
532- 'prependPaths ' => $ prependPaths ->toArray (),
533- ], fn ($ prop ) => count ($ prop ) > 0 );
546+ /**
547+ * Resolve props that should be deep merged.
548+ *
549+ * @param \Illuminate\Support\Collection<string, \Inertia\Mergeable> $mergeProps
550+ * @return array<int, string>
551+ */
552+ protected function resolveDeepMergeProps (Collection $ mergeProps ): array
553+ {
554+ return $ mergeProps
555+ ->filter (fn (Mergeable $ prop ) => $ prop ->shouldDeepMerge ())
556+ ->keys ()
557+ ->toArray ();
558+ }
559+
560+ /**
561+ * Resolve the matching keys for merge props.
562+ *
563+ * @param \Illuminate\Support\Collection<string, \Inertia\Mergeable> $mergeProps
564+ * @return array<int, string>
565+ */
566+ protected function resolveMergeMatchingKeys (Collection $ mergeProps ): array
567+ {
568+ return $ mergeProps
569+ ->map (function (Mergeable $ prop , $ key ) {
570+ return collect ($ prop ->matchesOn ())
571+ ->map (fn ($ strategy ) => $ key .'. ' .$ strategy )
572+ ->toArray ();
573+ })
574+ ->flatten ()
575+ ->values ()
576+ ->toArray ();
534577 }
535578
536579 /**
0 commit comments