diff --git a/app/Console/Commands/StrapiExporter.php b/app/Console/Commands/StrapiExporter.php new file mode 100644 index 0000000..48fd3f5 --- /dev/null +++ b/app/Console/Commands/StrapiExporter.php @@ -0,0 +1,265 @@ +option('remote')) { + config([ + 'strapi.token' => env('STRAPI_STAGING_TOKEN'), + 'strapi.url' => env('STRAPI_STAGING_URL'), + ]); + } else { + config([ + 'strapi.token' => '42338e68cb4f60c659072522d19174b657e489ff36c21d0e19c31b97b4b0ee7176697adc672f17eac251c9f31fb07bd4b968df571f92c2e5b35c33fec5fb9afd7aa1efda7299aa281351f8874a30e60d1aabbb0435e1095fbe4dfbce1b23a6cfb08caaea66a6bf1cb01ae6adc72ed94ca9807cedeb4b04bebee5c3eecb56c5e5', + 'strapi.url' => 'http://localhost:1337/api/', + ]); + } + + $model = $this->argument('model'); + + $options = [ + 'references', + 'posts', + 'customers', + 'services', + ]; + + if (! in_array($model, $options)) { + $this->error('Export not found. Please use one of these options: '.implode(', ', $options)); + + return 1; + } + + $this->info("Exporting $model"); + $this->export($model); + $this->info('Done'); + + return 0; + } + + public function export($model) + { + return match ($model) { + 'references' => $this->exportReferences(), + 'posts' => $this->exportPosts(), + 'customers' => $this->exportCustomers(), + 'services' => $this->exportServices(), + default => null, + }; + } + + public function exportServices() + { + $mappings = [ + 'title' => 'Title', + 'svg' => 'Icon', + 'excerpt' => 'Excerpt', + 'text' => 'Text', + 'list_title' => 'ListTitle', + 'list' => 'List', + ]; + + Service::limit(100) + ->cursor() + ->each(function ($service) use ($mappings) { + $entity = new StrapiEntry('services'); + + $entity->withTranslation( + 'en', + $this->mapToNewKeys( + $service->translate('en')->toArray(), + $mappings + ) + ); + + $response = $entity->create( + $this->mapToNewKeys( + $service->toArray(), + $mappings + ), + ); + + $this->info("Exporting {$service->title}: {$response->status()}"); + }); + + } + + public function exportReferences() + { + $mappings = [ + 'title' => 'Title', + 'subtitle' => 'Subtitle', + 'url' => 'Url', + 'link_text' => 'LinkText', + 'excerpt' => 'Excerpt', + 'text' => 'IntroText', + 'buzzwords' => 'Features', + 'slug' => 'Slug', + ]; + + Reference::limit(100) + ->cursor() + ->each(function ($ref) use ($mappings) { + $entity = new StrapiEntry('references'); + + if ($ref->image) { + $entity->withImage('Image', $ref->image->getPath()); + } + + $entity->withTranslation( + 'en', + $this->mapToNewKeys( + $ref->translate('en')->toArray(), + $mappings + ) + ); + + $response = $entity->create( + $this->mapToNewKeys( + $ref->toArray(), + $mappings + ), + ); + + $this->info("Exporting {$ref->title}: {$response->status()}"); + }); + } + + public function exportPosts() + { + $mappings = [ + 'title' => 'Title', + 'slug' => 'Slug', + 'excerpt' => 'Excerpt', + 'h1' => 'H1', + 'text' => 'Text', + ]; + + Post::limit(100) + ->cursor() + ->each(function ($post) use ($mappings) { + $entity = new StrapiEntry('articles'); + + if ($post->image) { + $entity->withImage('Image', $post->image->getPath()); + } + + $entity->withTranslation( + 'en', + $this->mapToNewKeys( + $post->translate('en')->toArray(), + $mappings + ) + ); + + $response = $entity->create( + array_merge( + $this->mapToNewKeys( + $post->toArray(), + $mappings + ), + [ + 'ReleaseDate' => $post->published_at ?? $post->updated_at, + ] + ), + ); + + $this->info("Exporting {$post->title}: {$response->status()}"); + }); + + } + + public function exportCustomers() + { + $mappings = [ + 'name' => 'Name', + 'logo_scale' => 'Scale', + 'suffix' => 'Addition', + 'description' => 'Description', + 'url' => 'Url', + ]; + + Customer::limit(100) + ->where('active', true) + ->cursor() + ->each(function ($customer) use ($mappings) { + $entity = new StrapiEntry('customers'); + + if ($customer->image) { + $entity->withImage('Logo', $customer->image->getPath()); + } + + $entity->withTranslation( + 'en', + $this->mapToNewKeys( + $customer->translate('en')->toArray(), + $mappings + ) + ); + + $attributes = $this->mapToNewKeys( + $customer->toArray(), + $mappings + ); + + $response = $entity->create( + $attributes + ); + + $this->info("Exporting {$customer->name}: {$response->status()}"); + }); + + } + + public function mapToNewKeys($originalArray, $keyMapping) + { + $mappedArray = []; + + foreach ($originalArray as $key => $value) { + if (isset($keyMapping[$key])) { + $mappedArray[$keyMapping[$key]] = $value; + } + } + + return $mappedArray; + } +} diff --git a/app/Console/Commands/Support/StrapiEntry.php b/app/Console/Commands/Support/StrapiEntry.php new file mode 100644 index 0000000..35a753b --- /dev/null +++ b/app/Console/Commands/Support/StrapiEntry.php @@ -0,0 +1,121 @@ +endpoint = $endpoint; + } + + /** + * @param string $attributeKey Name of the image attribute in Strapi + * @param string $path Absolute path to the image file + */ + public function withImage(string $attributeKey, string $path) + { + $this->images = [ + ...$this->images, + [ + 'key' => $attributeKey, + 'path' => $path, + ], + ]; + } + + public function withTranslation(string $locale, array $attributes) + { + $this->translations[$locale] = $attributes; + } + + public function create($attributes = []) + { + $client = Http::withToken( + config('strapi.token'), + 'Bearer ' + )->withOptions([ + 'base_uri' => config('strapi.url'), + ]); + + $client = $this->addImages($client); + + /** + * If there are images, we send multipart/form-data so we need to + * encode the attributes as JSON. Otherwise, we send a JSON body. + */ + $attributes = $this->images == [] ? $attributes : json_encode($attributes); + + $response = $client->post($this->endpoint, [ + 'data' => $attributes, + ]); + + if (! $response->successful()) { + logger($response->json('error.message')); + + return $response; + } + + $id = $response->json('data.id'); + + $this->createTranslations($response); + + return $response; + + // return $client->get("{$this->endpoint}/{$id}?populate=localizations"); + } + + public function createTranslations($response) + { + if ($this->translations == []) { + return; + } + + $id = $response->json('data.id'); + + foreach ($this->translations as $locale => $attriubutes) { + $client = Http::withToken( + config('strapi.token'), + 'Bearer ' + )->withOptions([ + 'base_uri' => config('strapi.url'), + ]); + + $payload = [ + 'locale' => $locale, + ...$attriubutes, + ]; + $response = $client->post( + $this->endpoint.'/'.$id.'/localizations', + $payload + ); + if (! $response->successful()) { + logger($response->json('error.message')); + } + } + } + + protected function addImages($client) + { + if ($this->images == []) { + return $client; + } + + foreach ($this->images as $image) { + $client->attach( + 'files.'.$image['key'], + fopen($image['path'], 'r') + ); + } + + return $client; + } +} diff --git a/composer.json b/composer.json index 3ae2b31..23db1c7 100644 --- a/composer.json +++ b/composer.json @@ -28,10 +28,12 @@ "barryvdh/laravel-debugbar": "^3.5", "facade/ignition": "^2.5", "fakerphp/faker": "^1.9.1", + "laravel/pint": "^1.13", "laravel/sail": "^1.0.1", "mockery/mockery": "^1.4.2", "nunomaduro/collision": "^5.0", - "phpunit/phpunit": "^9.3.3" + "phpunit/phpunit": "^9.3.3", + "spatie/laravel-ray": "^1.33" }, "config": { "optimize-autoloader": true, diff --git a/composer.lock b/composer.lock index 4476757..cc1acd9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b2f6fa68bc53306bcc12eecd27a70e87", + "content-hash": "159d7d02b30abd76030f991a22718993", "packages": [ { "name": "asm89/stack-cors", @@ -9323,6 +9323,72 @@ }, "time": "2020-07-09T08:09:16+00:00" }, + { + "name": "laravel/pint", + "version": "v1.13.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "4157768980dbd977f1c4b4cc94997416d8b30ece" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/4157768980dbd977f1c4b4cc94997416d8b30ece", + "reference": "4157768980dbd977f1c4b4cc94997416d8b30ece", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.38.0", + "illuminate/view": "^10.30.1", + "laravel-zero/framework": "^10.3.0", + "mockery/mockery": "^1.6.6", + "nunomaduro/larastan": "^2.6.4", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.24.2" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2023-12-05T19:43:12+00:00" + }, { "name": "laravel/sail", "version": "v1.25.0", @@ -10218,6 +10284,59 @@ ], "time": "2023-09-19T05:39:22+00:00" }, + { + "name": "pimple/pimple", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" + }, { "name": "sebastian/cli-parser", "version": "1.0.1", @@ -11182,6 +11301,279 @@ ], "time": "2020-09-28T06:39:44+00:00" }, + { + "name": "spatie/backtrace", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/483f76a82964a0431aa836b6ed0edde0c248e3ab", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-06-28T12:59:17+00:00" + }, + { + "name": "spatie/laravel-ray", + "version": "1.33.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ray.git", + "reference": "5028ae44a09451b26eb44490e3471998650788e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/5028ae44a09451b26eb44490e3471998650788e3", + "reference": "5028ae44a09451b26eb44490e3471998650788e3", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^7.20|^8.19|^9.0|^10.0", + "illuminate/database": "^7.20|^8.19|^9.0|^10.0", + "illuminate/queue": "^7.20|^8.19|^9.0|^10.0", + "illuminate/support": "^7.20|^8.19|^9.0|^10.0", + "php": "^7.4|^8.0", + "spatie/backtrace": "^1.0", + "spatie/ray": "^1.37", + "symfony/stopwatch": "4.2|^5.1|^6.0", + "zbateson/mail-mime-parser": "^1.3.1|^2.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.3", + "laravel/framework": "^7.20|^8.19|^9.0|^10.0", + "orchestra/testbench-core": "^5.0|^6.0|^7.0|^8.0", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^0.12.93", + "phpunit/phpunit": "^9.3", + "spatie/pest-plugin-snapshots": "^1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.29.x-dev" + }, + "laravel": { + "providers": [ + "Spatie\\LaravelRay\\RayServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelRay\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily debug Laravel apps", + "homepage": "https://github.com/spatie/laravel-ray", + "keywords": [ + "laravel-ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-ray/issues", + "source": "https://github.com/spatie/laravel-ray/tree/1.33.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-09-04T10:16:53+00:00" + }, + { + "name": "spatie/macroable", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/macroable.git", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Macroable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to dynamically add methods to a class", + "homepage": "https://github.com/spatie/macroable", + "keywords": [ + "macroable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/macroable/issues", + "source": "https://github.com/spatie/macroable/tree/2.0.0" + }, + "time": "2021-03-26T22:39:02+00:00" + }, + { + "name": "spatie/ray", + "version": "1.40.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ray.git", + "reference": "8e6547ff47aae2e4f615a5dcea1e5e4911b1dc9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ray/zipball/8e6547ff47aae2e4f615a5dcea1e5e4911b1dc9f", + "reference": "8e6547ff47aae2e4f615a5dcea1e5e4911b1dc9f", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": "^7.3|^8.0", + "ramsey/uuid": "^3.0|^4.1", + "spatie/backtrace": "^1.1", + "spatie/macroable": "^1.0|^2.0", + "symfony/stopwatch": "^4.0|^5.1|^6.0", + "symfony/var-dumper": "^4.2|^5.1|^6.0" + }, + "require-dev": { + "illuminate/support": "6.x|^8.18|^9.0", + "nesbot/carbon": "^2.63", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Ray\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Debug with Ray to fix problems faster", + "homepage": "https://github.com/spatie/ray", + "keywords": [ + "ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/ray/issues", + "source": "https://github.com/spatie/ray/tree/1.40.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-11-20T08:20:15+00:00" + }, { "name": "symfony/yaml", "version": "v6.3.3", @@ -11303,6 +11695,213 @@ } ], "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "zbateson/mail-mime-parser", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mail-mime-parser.git", + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/20b3e48eb799537683780bc8782fbbe9bc25934a", + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7.0|^2.0", + "php": ">=7.1", + "pimple/pimple": "^3.0", + "zbateson/mb-wrapper": "^1.0.1", + "zbateson/stream-decorators": "^1.0.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "mikey179/vfsstream": "^1.6.0", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MailMimeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + }, + { + "name": "Contributors", + "homepage": "https://github.com/zbateson/mail-mime-parser/graphs/contributors" + } + ], + "description": "MIME email message parser", + "homepage": "https://mail-mime-parser.org", + "keywords": [ + "MimeMailParser", + "email", + "mail", + "mailparse", + "mime", + "mimeparse", + "parser", + "php-imap" + ], + "support": { + "docs": "https://mail-mime-parser.org/#usage-guide", + "issues": "https://github.com/zbateson/mail-mime-parser/issues", + "source": "https://github.com/zbateson/mail-mime-parser" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2023-02-14T22:58:03+00:00" + }, + { + "name": "zbateson/mb-wrapper", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mb-wrapper.git", + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/faf35dddfacfc5d4d5f9210143eafd7a7fe74334", + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-iconv": "^1.9", + "symfony/polyfill-mbstring": "^1.9" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<=9.0" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MbWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation", + "keywords": [ + "charset", + "encoding", + "http", + "iconv", + "mail", + "mb", + "mb_convert_encoding", + "mbstring", + "mime", + "multibyte", + "string" + ], + "support": { + "issues": "https://github.com/zbateson/mb-wrapper/issues", + "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2023-01-11T23:05:44+00:00" + }, + { + "name": "zbateson/stream-decorators", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/stream-decorators.git", + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/783b034024fda8eafa19675fb2552f8654d3a3e9", + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.9 | ^2.0", + "php": ">=7.2", + "zbateson/mb-wrapper": "^1.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\StreamDecorators\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "PHP psr7 stream decorators for mime message part streams", + "keywords": [ + "base64", + "charset", + "decorators", + "mail", + "mime", + "psr7", + "quoted-printable", + "stream", + "uuencode" + ], + "support": { + "issues": "https://github.com/zbateson/stream-decorators/issues", + "source": "https://github.com/zbateson/stream-decorators/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2023-05-30T22:51:52+00:00" } ], "aliases": [], @@ -11316,5 +11915,5 @@ "php": "^7.3|^8.0" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" }