| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | 
							- <?php
 
- namespace Aws\Script\Composer;
 
- use Composer\Script\Event;
 
- use Symfony\Component\Filesystem\Exception\IOException;
 
- use Symfony\Component\Filesystem\Filesystem;
 
- class Composer
 
- {
 
-     public static function removeUnusedServicesInDev(Event $event, Filesystem $filesystem = null)
 
-     {
 
-         self::removeUnusedServicesWithConfig($event, $filesystem, true);
 
-     }
 
-     public static function removeUnusedServices(Event $event, Filesystem $filesystem = null)
 
-     {
 
-         self::removeUnusedServicesWithConfig($event, $filesystem, false);
 
-     }
 
-     private static function removeUnusedServicesWithConfig(Event $event, Filesystem $filesystem = null, $isDev = false)
 
-     {
 
-         if ($isDev && !$event->isDevMode()){
 
-             return;
 
-         }
 
-         $composer = $event->getComposer();
 
-         $extra = $composer->getPackage()->getExtra();
 
-         $listedServices = isset($extra['aws/aws-sdk-php'])
 
-             ? $extra['aws/aws-sdk-php']
 
-             : [];
 
-         if ($listedServices) {
 
-             $serviceMapping = self::buildServiceMapping();
 
-             self::verifyListedServices($serviceMapping, $listedServices);
 
-             $filesystem = $filesystem ?: new Filesystem();
 
-             $vendorPath = $composer->getConfig()->get('vendor-dir');
 
-             self::removeServiceDirs(
 
-                 $event,
 
-                 $filesystem,
 
-                 $serviceMapping,
 
-                 $listedServices,
 
-                 $vendorPath
 
-             );
 
-         } else {
 
-             throw new \InvalidArgumentException(
 
-                 'There are no services listed. Did you intend to use this script?'
 
-             );
 
-         }
 
-     }
 
-     public static function buildServiceMapping()
 
-     {
 
-         $serviceMapping = [];
 
-         $manifest = require(__DIR__ . '/../../data/manifest.json.php');
 
-         foreach ($manifest as $service => $attributes) {
 
-             $serviceMapping[$attributes['namespace']] = $service;
 
-         }
 
-         return $serviceMapping;
 
-     }
 
-     private static function verifyListedServices($serviceMapping, $listedServices)
 
-     {
 
-         foreach ($listedServices as $serviceToKeep) {
 
-             if (!isset($serviceMapping[$serviceToKeep])) {
 
-                 throw new \InvalidArgumentException(
 
-                     "'$serviceToKeep' is not a valid AWS service namespace. Please check spelling and casing."
 
-                 );
 
-             }
 
-         }
 
-     }
 
-     private static function removeServiceDirs(
 
-         $event,
 
-         $filesystem,
 
-         $serviceMapping,
 
-         $listedServices,
 
-         $vendorPath
 
-     ) {
 
-         $unsafeForDeletion = ['Kms', 'S3', 'SSO', 'SSOOIDC', 'Sts'];
 
-         if (in_array('DynamoDbStreams', $listedServices)) {
 
-             $unsafeForDeletion[] = 'DynamoDb';
 
-         }
 
-         $clientPath = $vendorPath . '/aws/aws-sdk-php/src/';
 
-         $modelPath = $clientPath . 'data/';
 
-         $deleteCount = 0;
 
-         foreach ($serviceMapping as $clientName => $modelName) {
 
-             if (!in_array($clientName, $listedServices) &&
 
-                 !in_array($clientName, $unsafeForDeletion)
 
-             ) {
 
-                 $clientDir = $clientPath . $clientName;
 
-                 $modelDir = $modelPath . $modelName;
 
-                 if ($filesystem->exists([$clientDir, $modelDir])) {
 
-                     $attempts = 3;
 
-                     $delay = 2;
 
-                     while ($attempts) {
 
-                         try {
 
-                             $filesystem->remove([$clientDir, $modelDir]);
 
-                             $deleteCount++;
 
-                             break;
 
-                         } catch (IOException $e) {
 
-                             $attempts--;
 
-                             if (!$attempts) {
 
-                                 throw new IOException(
 
-                                     "Removal failed after several attempts. Last error: " . $e->getMessage()
 
-                                 );
 
-                             } else {
 
-                                 sleep($delay);
 
-                                 $event->getIO()->write(
 
-                                     "Error encountered: " . $e->getMessage() . ". Retrying..."
 
-                                 );
 
-                                 $delay += 2;
 
-                             }
 
-                     }
 
-                 }
 
-                 }
 
-             }
 
-         }
 
-         $event->getIO()->write(
 
-             "Removed $deleteCount AWS service" . ($deleteCount === 1 ? '' : 's')
 
-         );
 
-     }
 
- }
 
 
  |