@@ -153,10 +153,11 @@ public function postUpdate(Event $event)
153153 $ composer ->getPackage ()->getDevRequires (),
154154 ];
155155
156- $ missingRequires = $ this ->getMissingRequires ($ repo , $ requires );
156+ $ missingRequires = $ this ->getMissingRequires ($ repo , $ requires, ' project ' === $ composer -> getPackage ()-> getType () );
157157 $ missingRequires = [
158158 'require ' => array_fill_keys (array_merge ([], ...array_values ($ missingRequires [0 ])), '* ' ),
159159 'require-dev ' => array_fill_keys (array_merge ([], ...array_values ($ missingRequires [1 ])), '* ' ),
160+ 'remove ' => array_fill_keys (array_merge ([], ...array_values ($ missingRequires [2 ])), '* ' ),
160161 ];
161162
162163 if (!$ missingRequires = array_filter ($ missingRequires )) {
@@ -224,7 +225,7 @@ public function postUpdate(Event $event)
224225 }
225226 }
226227
227- public function getMissingRequires (InstalledRepositoryInterface $ repo , array $ requires ): array
228+ public function getMissingRequires (InstalledRepositoryInterface $ repo , array $ requires, bool $ isProject ): array
228229 {
229230 $ allPackages = [];
230231 $ devPackages = array_flip ($ repo ->getDevPackageNames ());
@@ -234,9 +235,8 @@ public function getMissingRequires(InstalledRepositoryInterface $repo, array $re
234235 $ requires [(int ) isset ($ devPackages [$ package ->getName ()])] += $ package ->getRequires ();
235236 }
236237
237-
238238 $ abstractions = [];
239- $ missingRequires = [[], []];
239+ $ missingRequires = [[], [], [] ];
240240 $ versionParser = new VersionParser ();
241241
242242 foreach ($ requires as $ dev => $ rules ) {
@@ -249,15 +249,25 @@ public function getMissingRequires(InstalledRepositoryInterface $repo, array $re
249249 if (!isset ($ allPackages [$ candidate ])) {
250250 continue ;
251251 }
252- $ missingRequires [$ dev ][$ abstraction ] = !$ dev && isset ($ devPackages [$ candidate ]) ? [$ candidate ] : [];
252+
253+ if ($ isProject && !$ dev && isset ($ devPackages [$ candidate ])) {
254+ $ missingRequires [0 ][$ abstraction ] = [$ candidate ];
255+ $ missingRequires [2 ][$ abstraction ] = [$ candidate ];
256+ } else {
257+ $ missingRequires [$ dev ][$ abstraction ] = [];
258+ }
253259
254260 foreach ($ deps as $ dep ) {
255261 if (isset (self ::PROVIDE_RULES [$ dep ])) {
256262 $ rules [$ dep ] = self ::PROVIDE_RULES [$ dep ];
257- } elseif (!isset ($ allPackages [$ dep ]) || (! $ dev && isset ( $ devPackages [ $ dep ])) ) {
263+ } elseif (!isset ($ allPackages [$ dep ])) {
258264 $ missingRequires [$ dev ][$ abstraction ][] = $ dep ;
265+ } elseif ($ isProject && !$ dev && isset ($ devPackages [$ dep ])) {
266+ $ missingRequires [0 ][$ abstraction ][] = $ dep ;
267+ $ missingRequires [2 ][$ abstraction ][] = $ dep ;
259268 }
260269 }
270+ break ;
261271 }
262272 }
263273
@@ -270,14 +280,14 @@ public function getMissingRequires(InstalledRepositoryInterface $repo, array $re
270280 $ candidates = self ::PROVIDE_RULES [$ abstraction ];
271281
272282 foreach ($ candidates as $ candidate => $ deps ) {
273- if (isset ($ allPackages [$ candidate ]) && (!$ dev || isset ($ devPackages [$ candidate ]))) {
283+ if (isset ($ allPackages [$ candidate ]) && (!$ isProject || $ dev || ! isset ($ devPackages [$ candidate ]))) {
274284 continue 2 ;
275285 }
276286 }
277287
278288 foreach (array_intersect_key (self ::STICKYNESS_RULES , $ candidates ) as $ candidate => $ stickyRule ) {
279289 [$ stickyName , $ stickyVersion ] = explode (': ' , $ stickyRule , 2 ) + [1 => null ];
280- if (!isset ($ allPackages [$ stickyName ]) || (!$ dev && isset ($ devPackages [$ stickyName ]))) {
290+ if (!isset ($ allPackages [$ stickyName ]) || ($ isProject && !$ dev && isset ($ devPackages [$ stickyName ]))) {
281291 continue ;
282292 }
283293 if (null !== $ stickyVersion && !$ repo ->findPackage ($ stickyName , $ versionParser ->parseConstraints ($ stickyVersion ))) {
@@ -293,14 +303,17 @@ public function getMissingRequires(InstalledRepositoryInterface $repo, array $re
293303 foreach (current ($ candidates ) as $ dep ) {
294304 if (isset (self ::PROVIDE_RULES [$ dep ])) {
295305 $ abstractions [] = $ dep ;
296- } elseif (!isset ($ allPackages [$ dep ]) || (! $ dev && isset ( $ devPackages [ $ dep ])) ) {
306+ } elseif (!isset ($ allPackages [$ dep ])) {
297307 $ missingRequires [$ dev ][$ abstraction ][] = $ dep ;
308+ } elseif ($ isProject && !$ dev && isset ($ devPackages [$ dep ])) {
309+ $ missingRequires [0 ][$ abstraction ][] = $ dep ;
310+ $ missingRequires [2 ][$ abstraction ][] = $ dep ;
298311 }
299312 }
300313 }
301314 }
302315
303- if (!isset ($ allPackages ['nyholm/psr7 ' ])) {
316+ if (!isset ($ allPackages ['nyholm/psr7 ' ]) && ! isset ( $ allPackages [ ' php-http/discovery ' ]) ) {
304317 foreach ($ missingRequires as $ dev => $ abstractions ) {
305318 if (\in_array ('nyholm/psr7 ' , $ missingRequires [$ dev ]['psr/http-factory-implementation ' ] ?? [], true )) {
306319 continue ;
@@ -328,7 +341,11 @@ public function updateComposerJson(array $missingRequires, bool $sortPackages)
328341
329342 foreach ($ missingRequires as $ key => $ packages ) {
330343 foreach ($ packages as $ package => $ constraint ) {
331- $ manipulator ->addLink ($ key , $ package , $ constraint , $ sortPackages );
344+ if ('remove ' === $ key ) {
345+ $ manipulator ->removeSubNode ('require-dev ' , $ package );
346+ } else {
347+ $ manipulator ->addLink ($ key , $ package , $ constraint , $ sortPackages );
348+ }
332349 }
333350 }
334351
0 commit comments