14
14
use function glob ;
15
15
use function in_array ;
16
16
use function is_file ;
17
+ use function ksort ;
17
18
use function realpath ;
18
19
use function str_replace ;
19
20
use function substr ;
@@ -33,7 +34,7 @@ final class ComposerConfigProcess
33
34
private array $ configFiles = [];
34
35
35
36
/**
36
- * @psalm-var array<string, array<string, string| list<string>>>
37
+ * @psalm-var array<string, array<string, array< string, list<string> >>>
37
38
*/
38
39
private array $ mergePlan = [];
39
40
@@ -59,6 +60,7 @@ public function __construct(Composer $composer, array $packagesForCheck, ?bool $
59
60
60
61
$ this ->process ($ rootOptions , $ packagesForCheck , $ forceCheck );
61
62
$ this ->appendRootPackageConfigToMergePlan ($ rootPackage , $ rootOptions );
63
+ $ this ->appendEnvironmentsToMergePlan ($ rootPackage );
62
64
}
63
65
64
66
/**
@@ -74,7 +76,7 @@ public function configFiles(): array
74
76
/**
75
77
* Returns data for changing the merge plan.
76
78
*
77
- * @return array Data for changing the merge plan.
79
+ * @return array<string, array<string, array<string, list<string>>>> Data for changing the merge plan.
78
80
*/
79
81
public function mergePlan (): array
80
82
{
@@ -119,7 +121,7 @@ private function process(Options $rootOptions, array $packagesForCheck, bool $fo
119
121
120
122
// Do not copy variables.
121
123
if (Options::isVariable ($ file )) {
122
- $ this ->mergePlan [$ group ][$ package ->getPrettyName ()][] = $ file ;
124
+ $ this ->mergePlan [Options:: DEFAULT_ENVIRONMENT ][ $ group ][$ package ->getPrettyName ()][] = $ file ;
123
125
continue ;
124
126
}
125
127
@@ -140,7 +142,7 @@ private function process(Options $rootOptions, array $packagesForCheck, bool $fo
140
142
}
141
143
}
142
144
143
- $ this ->mergePlan [$ group ][$ package ->getPrettyName ()][] = $ file ;
145
+ $ this ->mergePlan [Options:: DEFAULT_ENVIRONMENT ][ $ group ][$ package ->getPrettyName ()][] = $ file ;
144
146
continue ;
145
147
}
146
148
@@ -158,7 +160,7 @@ private function process(Options $rootOptions, array $packagesForCheck, bool $fo
158
160
);
159
161
}
160
162
161
- $ this ->mergePlan [$ group ][$ package ->getPrettyName ()][] = $ file ;
163
+ $ this ->mergePlan [Options:: DEFAULT_ENVIRONMENT ][ $ group ][$ package ->getPrettyName ()][] = $ file ;
162
164
}
163
165
}
164
166
}
@@ -186,8 +188,31 @@ private function appendRootPackageConfigToMergePlan(RootPackageInterface $packag
186
188
return $ result . $ file ;
187
189
}, (array ) $ files );
188
190
191
+ $ packageGroups = $ this ->mergePlan [Options::DEFAULT_ENVIRONMENT ][$ group ] ?? [];
189
192
/** @psalm-suppress PropertyTypeCoercion */
190
- $ this ->mergePlan [$ group ] = ['/ ' => $ files ] + ($ this ->mergePlan [$ group ] ?? []);
193
+ $ this ->mergePlan [Options::DEFAULT_ENVIRONMENT ][$ group ] = [Options::ROOT_PACKAGE_NAME => $ files ] + $ packageGroups ;
194
+ ksort ($ this ->mergePlan [Options::DEFAULT_ENVIRONMENT ]);
195
+ }
196
+ }
197
+
198
+ private function appendEnvironmentsToMergePlan (RootPackageInterface $ package ): void
199
+ {
200
+ /** @psalm-var array<string, string|array<string, string|list<string>>> $environments */
201
+ $ environments = (array ) ($ package ->getExtra ()['config-plugin-environments ' ] ?? []);
202
+
203
+ foreach ($ environments as $ environment => $ groups ) {
204
+ if ($ environment === Options::DEFAULT_ENVIRONMENT ) {
205
+ continue ;
206
+ }
207
+
208
+ foreach ((array ) $ groups as $ group => $ files ) {
209
+ /** @psalm-suppress InvalidPropertyAssignmentValue */
210
+ $ this ->mergePlan [$ environment ][$ group ][Options::ROOT_PACKAGE_NAME ] = (array ) $ files ;
211
+ }
212
+
213
+ if (isset ($ this ->mergePlan [$ environment ])) {
214
+ ksort ($ this ->mergePlan [$ environment ]);
215
+ }
191
216
}
192
217
}
193
218
0 commit comments