[
  {
    "path": ".gitattributes",
    "content": "# This file was generated by the lean package validator (http://git.io/lean-package-validator).\n\n* text=auto eol=lf\n\n.codeclimate.yml export-ignore\n.gitattributes export-ignore\n.github/ export-ignore\n.gitignore export-ignore\n.idea/ export-ignore\n.php-cs-fixer.dist.php export-ignore\nCHANGELOG.md export-ignore\nLICENSE export-ignore\nphpunit.xml.dist export-ignore\nREADME.md export-ignore\ntests/ export-ignore\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**What version does this affect?**\n - Laravel Version: [e.g. 10.0.0]\n - Package Version: [e.g. 1.5.0]\n\n**To Reproduce**\nSteps to reproduce the behavior:\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest a new feature idea or improvement\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/workflows/php-cs-fixer.yml",
    "content": "name: Code Style\n\non: [ pull_request, push ]\n\njobs:\n  coverage:\n    runs-on: ubuntu-latest\n\n    name: Run code style checks\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v5\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: 8.3\n          extensions: dom, curl, libxml, mbstring, zip, pcntl, bcmath, intl, iconv\n          coverage: none\n          \n      - name: Get composer cache directory\n        id: composer-cache\n        run: |\n          echo \"dir=$(composer config cache-files-dir)\" >> $GITHUB_OUTPUT\n\n      - name: Cache dependencies\n        uses: actions/cache@v5\n        with:\n          path: ${{ steps.composer-cache.outputs.dir }}\n          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-composer-\n\n      - name: Install dependencies\n        env:\n          COMPOSER_DISCARD_CHANGES: true\n        run: composer require --no-progress --no-interaction --prefer-dist --update-with-all-dependencies \"laravel/framework:12.*\"\n\n      - name: Run PHP CS Fixer\n        run: ./vendor/bin/php-cs-fixer fix --diff --dry-run\n"
  },
  {
    "path": ".github/workflows/phpunit.yml",
    "content": "name: PHPUnit\n\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: '0 14 * * 3' # Run Wednesdays at 2pm EST\n\njobs:\n  php-tests:\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        php: [ 8.1, 8.2, 8.3, 8.4, 8.5 ]\n        laravel: [ 13.*, 12.*, 11.*, 10.* ]\n        dependency-version: [ stable, lowest ]\n        exclude:\n          - { laravel: 13.*, php: 8.2 }\n          - { laravel: 13.*, php: 8.1 }\n          - { laravel: 12.*, php: 8.1 }\n          - { laravel: 11.*, php: 8.5 }\n          - { laravel: 11.*, php: 8.1 }\n          - { laravel: 10.*, php: 8.5 }\n          - { laravel: 10.*, php: 8.4 }\n          \n    timeout-minutes: 10\n\n    name: \"${{ matrix.php }} / ${{ matrix.laravel }} (${{ matrix.dependency-version }})\"\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v5\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php }}\n          extensions: dom, curl, libxml, mbstring, zip, pcntl, bcmath, intl, iconv\n          tools: composer:v2\n\n      - name: Register composer cache directory\n        id: composer-cache\n        run: |\n          echo \"dir=$(composer config cache-files-dir)\" >> $GITHUB_OUTPUT  \n\n      - name: Cache dependencies\n        uses: actions/cache@v5\n        with:\n          path: ${{ steps.composer-cache.outputs.dir }}\n          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-composer-\n\n      - name: Install dependencies\n        run: |\n          composer require --no-interaction --prefer-dist --prefer-${{ matrix.dependency-version }} --update-with-all-dependencies \"laravel/framework:${{ matrix.laravel }}\"\n\n      - name: Execute tests\n        run: vendor/bin/phpunit\n"
  },
  {
    "path": ".github/workflows/update-changelog.yml",
    "content": "name: Update Changelog\n\non:\n  release:\n    types: [ published ]\n\njobs:\n  update-publish:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v5\n        with:\n          repository: ${{ github.event.repository.full_name }}\n          ref: 'main'\n\n      - name: Update changelog\n        uses: thomaseizinger/keep-a-changelog-new-release@v2\n        with:\n          version: ${{ github.event.release.tag_name }}\n\n      - name: Commit changelog back to repo\n        uses: EndBug/add-and-commit@v9\n        with:\n          add: 'CHANGELOG.md'\n          message: ${{ github.event.release.tag_name }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "vendor/\ncomposer.phar\ncomposer.lock\nphpunit.xml\n.phpunit.result.cache\n.php_cs.cache\n.php-cs-fixer.cache\n.env\n\n.DS_Store\n.phpstorm.meta.php\n_ide_helper.php\n\nnode_modules\nmix-manifest.json\nyarn-error.log\n"
  },
  {
    "path": ".idea/.gitignore",
    "content": "# Default ignored files\n/shelf/\n/workspace.xml\n# Datasource local storage ignored files\n/dataSources/\n/dataSources.local.xml\n# Editor-based HTTP Client requests\n/httpRequests/\n\nlaravel-idea-personal.xml"
  },
  {
    "path": ".idea/blade.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"BladeInjectionConfiguration\" default=\"false\">\n    <directives>\n      <data directive=\"@append\" />\n      <data directive=\"@auth\" injection=\"true\" prefix=\"&lt;?php if(auth()-&gt;guard(\" suffix=\")-&gt;check()): ?&gt;\" />\n      <data directive=\"@aware\" injection=\"true\" prefix=\"&lt;?php $attributes = $attributes-&gt;exceptProps(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@break\" injection=\"true\" prefix=\"&lt;?php if(\" suffix=\") break; ?&gt;\" />\n      <data directive=\"@can\" injection=\"true\" prefix=\"&lt;?php if (app(\\Illuminate\\Contracts\\Auth\\Access\\Gate::class)-&gt;check(\" suffix=\")): ?&gt;\" />\n      <data directive=\"@canany\" injection=\"true\" prefix=\"&lt;?php if (app(\\Illuminate\\Contracts\\Auth\\Access\\Gate::class)-&gt;any(\" suffix=\")): ?&gt;\" />\n      <data directive=\"@cannot\" injection=\"true\" prefix=\"&lt;?php if (app(\\Illuminate\\Contracts\\Auth\\Access\\Gate::class)-&gt;denies(\" suffix=\")): ?&gt;\" />\n      <data directive=\"@case\" injection=\"true\" prefix=\"&lt;?php case (\" suffix=\"): ?&gt;\" />\n      <data directive=\"@checked\" injection=\"true\" prefix=\"&lt;?php if(\" suffix=\") {echo 'checked';}?&gt;\" />\n      <data directive=\"@choice\" injection=\"true\" prefix=\"&lt;?php echo app('translator')-&gt;choice(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@class\" injection=\"true\" prefix=\"class=&quot;&lt;?php echo \\Illuminate\\Support\\Arr::toCssClasses(\" suffix=\")?&gt;&quot;\" />\n      <data directive=\"@component\" injection=\"true\" prefix=\"&lt;?php $__env-&gt;startComponent(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@componentfirst\" injection=\"true\" prefix=\"&lt;?php $__env-&gt;startComponentFirst(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@continue\" injection=\"true\" prefix=\"&lt;?php if(\" suffix=\") continue; ?&gt;\" />\n      <data directive=\"@csrf\" />\n      <data directive=\"@dd\" injection=\"true\" prefix=\"&lt;?php dd(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@default\" />\n      <data directive=\"@disabled\" injection=\"true\" prefix=\"&lt;?php if(\" suffix=\") {echo 'disabled';}?&gt;\" />\n      <data directive=\"@dump\" injection=\"true\" prefix=\"&lt;?php dump(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@each\" injection=\"true\" prefix=\"&lt;?php echo $__env-&gt;renderEach(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@else\" />\n      <data directive=\"@elseauth\" injection=\"true\" prefix=\"&lt;?php elseif(auth()-&gt;guard(\" suffix=\")-&gt;check()): ?&gt;\" />\n      <data directive=\"@elsecan\" injection=\"true\" prefix=\"&lt;?php elseif (app(\\Illuminate\\Contracts\\Auth\\Access\\Gate::class)-&gt;check(\" suffix=\")): ?&gt;\" />\n      <data directive=\"@elsecanany\" injection=\"true\" prefix=\"&lt;?php elseif (app(\\Illuminate\\Contracts\\Auth\\Access\\Gate::class)-&gt;any(\" suffix=\")): ?&gt;\" />\n      <data directive=\"@elsecannot\" injection=\"true\" prefix=\"&lt;?php elseif (app(\\Illuminate\\Contracts\\Auth\\Access\\Gate::class)-&gt;denies(\" suffix=\")): ?&gt;\" />\n      <data directive=\"@elseguest\" injection=\"true\" prefix=\"&lt;?php elseif(auth()-&gt;guard(\" suffix=\")-&gt;guest()): ?&gt;\" />\n      <data directive=\"@elseif\" injection=\"true\" prefix=\"&lt;?php elseif(\" suffix=\"): ?&gt;\" />\n      <data directive=\"@empty\" injection=\"true\" prefix=\"&lt;?php if(empty(\" suffix=\")): ?&gt;\" />\n      <data directive=\"@endauth\" />\n      <data directive=\"@endcan\" />\n      <data directive=\"@endcanany\" />\n      <data directive=\"@endcannot\" />\n      <data directive=\"@endcomponent\" />\n      <data directive=\"@endcomponentClass\" />\n      <data directive=\"@endcomponentfirst\" />\n      <data directive=\"@endempty\" />\n      <data directive=\"@endenv\" />\n      <data directive=\"@enderror\" />\n      <data directive=\"@endfor\" />\n      <data directive=\"@endforeach\" />\n      <data directive=\"@endforelse\" />\n      <data directive=\"@endguest\" />\n      <data directive=\"@endif\" />\n      <data directive=\"@endisset\" />\n      <data directive=\"@endlang\" />\n      <data directive=\"@endonce\" />\n      <data directive=\"@endphp\" />\n      <data directive=\"@endprepend\" />\n      <data directive=\"@endproduction\" />\n      <data directive=\"@endpush\" />\n      <data directive=\"@endsection\" />\n      <data directive=\"@endsession\" />\n      <data directive=\"@endslot\" />\n      <data directive=\"@endswitch\" />\n      <data directive=\"@endunless\" />\n      <data directive=\"@endverbatim\" />\n      <data directive=\"@endwhile\" />\n      <data directive=\"@env\" injection=\"true\" prefix=\"&lt;?php if(app()-&gt;environment(\" suffix=\")): ?&gt;\" />\n      <data directive=\"@error\" injection=\"true\" prefix=\"&lt;?php $__errorArgs = [\" suffix=\"];&#10;$__bag = $errors-&gt;getBag($__errorArgs[1] ?? 'default');&#10;if ($__bag-&gt;has($__errorArgs[0])) :&#10;if (isset($message)) { $__messageOriginal = $message; }&#10;$message = $__bag-&gt;first($__errorArgs[0]); ?&gt;\" />\n      <data directive=\"@extends\" injection=\"true\" prefix=\"&lt;?php echo $__env-&gt;make(\" suffix=\", \\Illuminate\\Support\\Arr::except(get_defined_vars(), ['__data', '__path']))-&gt;render(); ?&gt;\" />\n      <data directive=\"@extendsfirst\" injection=\"true\" prefix=\"&lt;?php echo $__env-&gt;first(\" suffix=\", \\Illuminate\\Support\\Arr::except(get_defined_vars(), ['__data', '__path']))-&gt;render(); ?&gt;\" />\n      <data directive=\"@for\" injection=\"true\" prefix=\"&lt;?php for(\" suffix=\"): ?&gt;\" />\n      <data directive=\"@foreach\" injection=\"true\" prefix=\"&lt;?php foreach(\" suffix=\"): ?&gt;\" />\n      <data directive=\"@forelse\" injection=\"true\" prefix=\"&lt;?php foreach(\" suffix=\"): ?&gt;\" />\n      <data directive=\"@guest\" injection=\"true\" prefix=\"&lt;?php if(auth()-&gt;guard(\" suffix=\")-&gt;guest()): ?&gt;\" />\n      <data directive=\"@hasSection\" injection=\"true\" prefix=\"&lt;?php if (! empty(trim($__env-&gt;yieldContent(\" suffix=\")))): ?&gt;\" />\n      <data directive=\"@if\" injection=\"true\" prefix=\"&lt;?php if(\" suffix=\"): ?&gt;\" />\n      <data directive=\"@include\" injection=\"true\" prefix=\"&lt;?php echo $__env-&gt;make(\" suffix=\", \\Illuminate\\Support\\Arr::except(get_defined_vars(), ['__data', '__path']))-&gt;render(); ?&gt;\" />\n      <data directive=\"@includeFirst\" injection=\"true\" prefix=\"&lt;?php echo $__env-&gt;first(\" suffix=\", \\Illuminate\\Support\\Arr::except(get_defined_vars(), ['__data', '__path']))-&gt;render(); ?&gt;\" />\n      <data directive=\"@includeUnless\" injection=\"true\" prefix=\"&lt;?php echo $__env-&gt;renderWhen(! \" suffix=\", \\Illuminate\\Support\\Arr::except(get_defined_vars(), ['__data', '__path'])); ?&gt;\" />\n      <data directive=\"@includeWhen\" injection=\"true\" prefix=\"&lt;?php echo $__env-&gt;renderWhen(\" suffix=\", \\Illuminate\\Support\\Arr::except(get_defined_vars(), ['__data', '__path'])); ?&gt;\" />\n      <data directive=\"@isset\" injection=\"true\" prefix=\"&lt;?php if(isset(\" suffix=\")): ?&gt;\" />\n      <data directive=\"@js\" injection=\"true\" prefix=\"&lt;?php _bladeDirective(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@json\" injection=\"true\" prefix=\"&lt;?php echo json_encode(\" suffix=\") ?&gt;\" />\n      <data directive=\"@lang\" injection=\"true\" prefix=\"&lt;?php echo app('translator')-&gt;get(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@measure\" />\n      <data directive=\"@method\" injection=\"true\" prefix=\"&lt;?php echo method_field(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@once\" />\n      <data directive=\"@overwrite\" />\n      <data directive=\"@parent\" />\n      <data directive=\"@php\" injection=\"true\" prefix=\"&lt;?php (\" suffix=\"); ?&gt;\" />\n      <data directive=\"@prepend\" injection=\"true\" prefix=\"&lt;?php $__env-&gt;startPrepend(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@production\" />\n      <data directive=\"@props\" injection=\"true\" prefix=\"&lt;?php $attributes = $attributes-&gt;exceptProps(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@push\" injection=\"true\" prefix=\"&lt;?php $__env-&gt;startPush(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@ray\" injection=\"true\" prefix=\"&lt;?php ray(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@section\" injection=\"true\" prefix=\"&lt;?php $__env-&gt;startSection(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@sectionMissing\" injection=\"true\" prefix=\"&lt;?php if (empty(trim($__env-&gt;yieldContent(\" suffix=\")))): ?&gt;\" />\n      <data directive=\"@selected\" injection=\"true\" prefix=\"&lt;?php if(\" suffix=\") {echo 'selected';}?&gt;\" />\n      <data directive=\"@session\" injection=\"true\" prefix=\"&lt;?php $value = session()-&gt;get(\" suffix=\")?&gt;&quot;\" />\n      <data directive=\"@show\" />\n      <data directive=\"@slot\" injection=\"true\" prefix=\"&lt;?php $__env-&gt;slot(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@stack\" injection=\"true\" prefix=\"&lt;?php echo $__env-&gt;yieldPushContent(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@stop\" />\n      <data directive=\"@style\" injection=\"true\" prefix=\"class=&quot;&lt;?php echo \\Illuminate\\Support\\Arr::toCssStyles(\" suffix=\")?&gt;&quot;\" />\n      <data directive=\"@switch\" injection=\"true\" prefix=\"&lt;?php switch(\" suffix=\"): ?&gt;\" />\n      <data directive=\"@unless\" injection=\"true\" prefix=\"&lt;?php if (! (\" suffix=\")): ?&gt;\" />\n      <data directive=\"@unset\" injection=\"true\" prefix=\"&lt;?php unset(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@verbatim\" />\n      <data directive=\"@vite\" injection=\"true\" prefix=\"&lt;?php echo vite_func(\" suffix=\"); ?&gt;\" />\n      <data directive=\"@viteReactRefresh\" />\n      <data directive=\"@while\" injection=\"true\" prefix=\"&lt;?php while(\" suffix=\"): ?&gt;\" />\n      <data directive=\"@xray\" />\n      <data directive=\"@yield\" injection=\"true\" prefix=\"&lt;?php echo $__env-&gt;yieldContent(\" suffix=\"); ?&gt;\" />\n    </directives>\n  </component>\n</project>"
  },
  {
    "path": ".idea/inspectionProfiles/Project_Default.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project Default\" />\n    <inspection_tool class=\"ForgottenDebugOutputInspection\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\">\n      <option name=\"configuration\">\n        <list>\n          <option value=\"\\Codeception\\Util\\Debug::debug\" />\n          <option value=\"\\Codeception\\Util\\Debug::pause\" />\n          <option value=\"\\Doctrine\\Common\\Util\\Debug::dump\" />\n          <option value=\"\\Doctrine\\Common\\Util\\Debug::export\" />\n          <option value=\"\\Illuminate\\Support\\Debug\\Dumper::dump\" />\n          <option value=\"\\Symfony\\Component\\Debug\\Debug::enable\" />\n          <option value=\"\\Symfony\\Component\\Debug\\DebugClassLoader::enable\" />\n          <option value=\"\\Symfony\\Component\\Debug\\ErrorHandler::register\" />\n          <option value=\"\\Symfony\\Component\\Debug\\ExceptionHandler::register\" />\n          <option value=\"\\TYPO3\\CMS\\Core\\Utility\\DebugUtility::debug\" />\n          <option value=\"\\Zend\\Debug\\Debug::dump\" />\n          <option value=\"\\Zend\\Di\\Display\\Console::export\" />\n          <option value=\"dd\" />\n          <option value=\"debug_print_backtrace\" />\n          <option value=\"debug_zval_dump\" />\n          <option value=\"dpm\" />\n          <option value=\"dpq\" />\n          <option value=\"dsm\" />\n          <option value=\"dump\" />\n          <option value=\"dvm\" />\n          <option value=\"error_log\" />\n          <option value=\"kpr\" />\n          <option value=\"phpinfo\" />\n          <option value=\"print_r\" />\n          <option value=\"var_dump\" />\n          <option value=\"var_export\" />\n          <option value=\"wp_die\" />\n          <option value=\"xdebug_break\" />\n          <option value=\"xdebug_call_class\" />\n          <option value=\"xdebug_call_file\" />\n          <option value=\"xdebug_call_function\" />\n          <option value=\"xdebug_call_line\" />\n          <option value=\"xdebug_code_coverage_started\" />\n          <option value=\"xdebug_debug_zval\" />\n          <option value=\"xdebug_debug_zval_stdout\" />\n          <option value=\"xdebug_dump_superglobals\" />\n          <option value=\"xdebug_enable\" />\n          <option value=\"xdebug_get_code_coverage\" />\n          <option value=\"xdebug_get_collected_errors\" />\n          <option value=\"xdebug_get_declared_vars\" />\n          <option value=\"xdebug_get_function_stack\" />\n          <option value=\"xdebug_get_headers\" />\n          <option value=\"xdebug_get_monitored_functions\" />\n          <option value=\"xdebug_get_profiler_filename\" />\n          <option value=\"xdebug_get_stack_depth\" />\n          <option value=\"xdebug_get_tracefile_name\" />\n          <option value=\"xdebug_is_enabled\" />\n          <option value=\"xdebug_memory_usage\" />\n          <option value=\"xdebug_peak_memory_usage\" />\n          <option value=\"xdebug_print_function_stack\" />\n          <option value=\"xdebug_start_code_coverage\" />\n          <option value=\"xdebug_start_error_collection\" />\n          <option value=\"xdebug_start_function_monitor\" />\n          <option value=\"xdebug_start_trace\" />\n          <option value=\"xdebug_stop_code_coverage\" />\n          <option value=\"xdebug_stop_error_collection\" />\n          <option value=\"xdebug_stop_function_monitor\" />\n          <option value=\"xdebug_stop_trace\" />\n          <option value=\"xdebug_time_index\" />\n          <option value=\"xdebug_var_dump\" />\n        </list>\n      </option>\n      <option name=\"migratedIntoUserSpace\" value=\"true\" />\n    </inspection_tool>\n    <inspection_tool class=\"PhpCSFixerValidationInspection\" enabled=\"true\" level=\"WEAK WARNING\" enabled_by_default=\"true\" />\n    <inspection_tool class=\"PhpUnhandledExceptionInspection\" enabled=\"false\" level=\"WEAK WARNING\" enabled_by_default=\"false\" />\n    <inspection_tool class=\"SecurityAdvisoriesInspection\" enabled=\"false\" level=\"WARNING\" enabled_by_default=\"false\">\n      <option name=\"optionConfiguration\">\n        <list>\n          <option value=\"barryvdh/laravel-debugbar\" />\n          <option value=\"behat/behat\" />\n          <option value=\"brianium/paratest\" />\n          <option value=\"codeception/codeception\" />\n          <option value=\"codedungeon/phpunit-result-printer\" />\n          <option value=\"composer/composer\" />\n          <option value=\"doctrine/coding-standard\" />\n          <option value=\"filp/whoops\" />\n          <option value=\"friendsofphp/php-cs-fixer\" />\n          <option value=\"humbug/humbug\" />\n          <option value=\"infection/infection\" />\n          <option value=\"jakub-onderka/php-parallel-lint\" />\n          <option value=\"johnkary/phpunit-speedtrap\" />\n          <option value=\"kalessil/production-dependencies-guard\" />\n          <option value=\"mikey179/vfsStream\" />\n          <option value=\"mockery/mockery\" />\n          <option value=\"mybuilder/phpunit-accelerator\" />\n          <option value=\"orchestra/testbench\" />\n          <option value=\"pdepend/pdepend\" />\n          <option value=\"phan/phan\" />\n          <option value=\"phing/phing\" />\n          <option value=\"phpcompatibility/php-compatibility\" />\n          <option value=\"phpmd/phpmd\" />\n          <option value=\"phpro/grumphp\" />\n          <option value=\"phpspec/phpspec\" />\n          <option value=\"phpspec/prophecy\" />\n          <option value=\"phpstan/phpstan\" />\n          <option value=\"phpunit/phpunit\" />\n          <option value=\"povils/phpmnd\" />\n          <option value=\"roave/security-advisories\" />\n          <option value=\"satooshi/php-coveralls\" />\n          <option value=\"sebastian/phpcpd\" />\n          <option value=\"slevomat/coding-standard\" />\n          <option value=\"spatie/phpunit-watcher\" />\n          <option value=\"squizlabs/php_codesniffer\" />\n          <option value=\"sstalle/php7cc\" />\n          <option value=\"symfony/debug\" />\n          <option value=\"symfony/maker-bundle\" />\n          <option value=\"symfony/phpunit-bridge\" />\n          <option value=\"symfony/var-dumper\" />\n          <option value=\"vimeo/psalm\" />\n          <option value=\"wimg/php-compatibility\" />\n          <option value=\"wp-coding-standards/wpcs\" />\n          <option value=\"yiisoft/yii2-coding-standards\" />\n          <option value=\"yiisoft/yii2-debug\" />\n          <option value=\"yiisoft/yii2-gii\" />\n          <option value=\"zendframework/zend-coding-standard\" />\n          <option value=\"zendframework/zend-debug\" />\n          <option value=\"zendframework/zend-test\" />\n        </list>\n      </option>\n    </inspection_tool>\n  </profile>\n</component>"
  },
  {
    "path": ".idea/laravel-idea.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"InertiaPackage\">\n    <option name=\"directoryPaths\">\n      <list />\n    </option>\n  </component>\n  <component name=\"LaravelIdeaMainSettings\">\n    <option name=\"appDirectory\" value=\"src\" />\n    <option name=\"frameworkFound\" value=\"true\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/linen.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"WEB_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\">\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/src\" isTestSource=\"false\" packagePrefix=\"Glhd\\Linen\\\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/tests\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/tests\" isTestSource=\"true\" packagePrefix=\"Glhd\\Linen\\Tests\\\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/nikic/php-parser\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/nette/schema\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/nette/utils\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/brick/math\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/voku/portable-ascii\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/opis/closure\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psr/http-factory\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psr/simple-cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psr/log\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psr/container\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psr/http-message\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psr/event-dispatcher\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psr/cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/composer\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/php-cs-fixer/diff\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/friendsofphp/php-cs-fixer\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/swiftmailer/swiftmailer\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/guzzlehttp/psr7\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/resource-operations\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/exporter\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/environment\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/graham-campbell/result-type\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpdocumentor/reflection-docblock\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpdocumentor/type-resolver\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpdocumentor/reflection-common\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/dragonmantank/cron-expression\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/tijsverkoyen/css-to-inline-styles\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/complexity\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/object-reflector\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/object-enumerator\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/global-state\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/comparator\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/ralouphie/getallheaders\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpoption/phpoption\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/orchestra/testbench-core\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/code-unit\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/cli-parser\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/version\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/type\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/lines-of-code\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/recursion-context\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/diff\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/sebastian/code-unit-reverse-lookup\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/doctrine/inflector\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/doctrine/lexer\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/orchestra/testbench\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/hamcrest/hamcrest-php\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/fakerphp/faker\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/doctrine/instantiator\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/doctrine/annotations\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/theseer/tokenizer\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-intl-grapheme\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-mbstring\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/console\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/process\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/error-handler\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/http-foundation\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/finder\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/event-dispatcher-contracts\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/css-selector\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-intl-normalizer\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-intl-idn\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/options-resolver\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/filesystem\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/var-dumper\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/service-contracts\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/routing\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/deprecation-contracts\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/string\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/mime\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/yaml\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/http-kernel\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/stopwatch\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpunit/php-file-iterator\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpunit/php-invoker\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpunit/php-code-coverage\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/event-dispatcher\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/translation-contracts\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/translation\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-php81\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-ctype\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-php80\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-php73\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/mockery/mockery\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/laravel/serializable-closure\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/laravel/framework\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/egulias/email-validator\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/dflydev/dot-access-data\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/vlucas/phpdotenv\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpunit/php-text-template\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpunit/phpunit\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpunit/php-timer\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phpspec/prophecy\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phar-io/version\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/phar-io/manifest\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/myclabs/deep-copy\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/monolog/monolog\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/league/config\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/league/mime-type-detection\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/ramsey/uuid\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/ramsey/collection\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/pimple/pimple\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/nesbot/carbon\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/league/commonmark\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/league/flysystem\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/_laravel_idea\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/carbonphp/carbon-doctrine-types\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/clue/ndjson-react\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/evenement/evenement\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/fidry/cpu-core-counter\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/filp/whoops\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/fruitcake/php-cors\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/guzzlehttp/uri-template\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/laravel/prompts\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/laravel/tinker\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/league/flysystem-local\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/nunomaduro/collision\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/nunomaduro/termwind\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/openspout/openspout\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/orchestra/canvas\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/orchestra/canvas-core\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/orchestra/workbench\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psr/clock\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psy/psysh\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/react/cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/react/child-process\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/react/dns\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/react/event-loop\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/react/promise\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/react/socket\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/react/stream\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/mailer\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-php83\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-uuid\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/uid\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/guzzlehttp/guzzle\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/guzzlehttp/promises\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/laravel/pail\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/league/uri\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/league/uri-interfaces\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/orchestra/sidekick\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/psr/http-client\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/staabm/side-effects-detector\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/clock\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-php84\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/vendor/symfony/polyfill-php85\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/linen.iml\" filepath=\"$PROJECT_DIR$/.idea/linen.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/php-test-framework.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"PhpTestFrameworkVersionCache\">\n    <tools_cache>\n      <tool tool_name=\"PHPUnit\">\n        <cache>\n          <versions>\n            <info id=\"Local/Users/inxilpro/Development/open-source/linen/vendor/autoload.php\" version=\"10.5.28\" />\n            <info id=\"Local/vendor/autoload.php\" version=\"10.5.28\" />\n          </versions>\n        </cache>\n      </tool>\n    </tools_cache>\n  </component>\n</project>"
  },
  {
    "path": ".idea/php.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"MessDetectorOptionsConfiguration\">\n    <option name=\"transferred\" value=\"true\" />\n  </component>\n  <component name=\"PHPCSFixerOptionsConfiguration\">\n    <option name=\"codingStandard\" value=\"Custom\" />\n    <option name=\"rulesetPath\" value=\"$PROJECT_DIR$/.php-cs-fixer.dist.php\" />\n    <option name=\"transferred\" value=\"true\" />\n  </component>\n  <component name=\"PHPCodeSnifferOptionsConfiguration\">\n    <option name=\"highlightLevel\" value=\"WARNING\" />\n    <option name=\"transferred\" value=\"true\" />\n  </component>\n  <component name=\"PhpCSFixer\">\n    <phpcsfixer_settings>\n      <PhpCSFixerConfiguration tool_path=\"$PROJECT_DIR$/vendor/bin/php-cs-fixer\" />\n    </phpcsfixer_settings>\n  </component>\n  <component name=\"PhpIncludePathManager\">\n    <include_path>\n      <path value=\"$PROJECT_DIR$/vendor/nikic/php-parser\" />\n      <path value=\"$PROJECT_DIR$/vendor/nette/schema\" />\n      <path value=\"$PROJECT_DIR$/vendor/nette/utils\" />\n      <path value=\"$PROJECT_DIR$/vendor/brick/math\" />\n      <path value=\"$PROJECT_DIR$/vendor/voku/portable-ascii\" />\n      <path value=\"$PROJECT_DIR$/vendor/opis/closure\" />\n      <path value=\"$PROJECT_DIR$/vendor/psr/http-factory\" />\n      <path value=\"$PROJECT_DIR$/vendor/psr/simple-cache\" />\n      <path value=\"$PROJECT_DIR$/vendor/psr/log\" />\n      <path value=\"$PROJECT_DIR$/vendor/psr/container\" />\n      <path value=\"$PROJECT_DIR$/vendor/psr/http-message\" />\n      <path value=\"$PROJECT_DIR$/vendor/psr/event-dispatcher\" />\n      <path value=\"$PROJECT_DIR$/vendor/psr/cache\" />\n      <path value=\"$PROJECT_DIR$/vendor/composer\" />\n      <path value=\"$PROJECT_DIR$/vendor/php-cs-fixer/diff\" />\n      <path value=\"$PROJECT_DIR$/vendor/friendsofphp/php-cs-fixer\" />\n      <path value=\"$PROJECT_DIR$/vendor/swiftmailer/swiftmailer\" />\n      <path value=\"$PROJECT_DIR$/vendor/guzzlehttp/psr7\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/resource-operations\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/exporter\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/environment\" />\n      <path value=\"$PROJECT_DIR$/vendor/graham-campbell/result-type\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpdocumentor/reflection-docblock\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpdocumentor/type-resolver\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpdocumentor/reflection-common\" />\n      <path value=\"$PROJECT_DIR$/vendor/dragonmantank/cron-expression\" />\n      <path value=\"$PROJECT_DIR$/vendor/tijsverkoyen/css-to-inline-styles\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/complexity\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/object-reflector\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/object-enumerator\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/global-state\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/comparator\" />\n      <path value=\"$PROJECT_DIR$/vendor/ralouphie/getallheaders\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpoption/phpoption\" />\n      <path value=\"$PROJECT_DIR$/vendor/orchestra/testbench-core\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/code-unit\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/cli-parser\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/version\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/type\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/lines-of-code\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/recursion-context\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/diff\" />\n      <path value=\"$PROJECT_DIR$/vendor/sebastian/code-unit-reverse-lookup\" />\n      <path value=\"$PROJECT_DIR$/vendor/doctrine/inflector\" />\n      <path value=\"$PROJECT_DIR$/vendor/doctrine/lexer\" />\n      <path value=\"$PROJECT_DIR$/vendor/orchestra/testbench\" />\n      <path value=\"$PROJECT_DIR$/vendor/hamcrest/hamcrest-php\" />\n      <path value=\"$PROJECT_DIR$/vendor/fakerphp/faker\" />\n      <path value=\"$PROJECT_DIR$/vendor/doctrine/instantiator\" />\n      <path value=\"$PROJECT_DIR$/vendor/doctrine/annotations\" />\n      <path value=\"$PROJECT_DIR$/vendor/theseer/tokenizer\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-intl-grapheme\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-mbstring\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/console\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/process\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/error-handler\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/http-foundation\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/finder\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/event-dispatcher-contracts\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/css-selector\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-intl-normalizer\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-intl-idn\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/options-resolver\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/filesystem\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/var-dumper\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/service-contracts\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/routing\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/deprecation-contracts\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/string\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/mime\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/yaml\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/http-kernel\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/stopwatch\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpunit/php-file-iterator\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpunit/php-invoker\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpunit/php-code-coverage\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/event-dispatcher\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/translation-contracts\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/translation\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-php81\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-ctype\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-php80\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-php73\" />\n      <path value=\"$PROJECT_DIR$/vendor/mockery/mockery\" />\n      <path value=\"$PROJECT_DIR$/vendor/laravel/serializable-closure\" />\n      <path value=\"$PROJECT_DIR$/vendor/laravel/framework\" />\n      <path value=\"$PROJECT_DIR$/vendor/egulias/email-validator\" />\n      <path value=\"$PROJECT_DIR$/vendor/dflydev/dot-access-data\" />\n      <path value=\"$PROJECT_DIR$/vendor/vlucas/phpdotenv\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpunit/php-text-template\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpunit/phpunit\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpunit/php-timer\" />\n      <path value=\"$PROJECT_DIR$/vendor/phpspec/prophecy\" />\n      <path value=\"$PROJECT_DIR$/vendor/phar-io/version\" />\n      <path value=\"$PROJECT_DIR$/vendor/phar-io/manifest\" />\n      <path value=\"$PROJECT_DIR$/vendor/myclabs/deep-copy\" />\n      <path value=\"$PROJECT_DIR$/vendor/monolog/monolog\" />\n      <path value=\"$PROJECT_DIR$/vendor/league/config\" />\n      <path value=\"$PROJECT_DIR$/vendor/league/mime-type-detection\" />\n      <path value=\"$PROJECT_DIR$/vendor/ramsey/uuid\" />\n      <path value=\"$PROJECT_DIR$/vendor/ramsey/collection\" />\n      <path value=\"$PROJECT_DIR$/vendor/pimple/pimple\" />\n      <path value=\"$PROJECT_DIR$/vendor/nesbot/carbon\" />\n      <path value=\"$PROJECT_DIR$/vendor/league/commonmark\" />\n      <path value=\"$PROJECT_DIR$/vendor/league/flysystem\" />\n      <path value=\"$PROJECT_DIR$/vendor/carbonphp/carbon-doctrine-types\" />\n      <path value=\"$PROJECT_DIR$/vendor/league/flysystem-local\" />\n      <path value=\"$PROJECT_DIR$/vendor/laravel/prompts\" />\n      <path value=\"$PROJECT_DIR$/vendor/clue/ndjson-react\" />\n      <path value=\"$PROJECT_DIR$/vendor/laravel/tinker\" />\n      <path value=\"$PROJECT_DIR$/vendor/orchestra/canvas\" />\n      <path value=\"$PROJECT_DIR$/vendor/orchestra/workbench\" />\n      <path value=\"$PROJECT_DIR$/vendor/orchestra/canvas-core\" />\n      <path value=\"$PROJECT_DIR$/vendor/filp/whoops\" />\n      <path value=\"$PROJECT_DIR$/vendor/evenement/evenement\" />\n      <path value=\"$PROJECT_DIR$/vendor/fruitcake/php-cors\" />\n      <path value=\"$PROJECT_DIR$/vendor/psr/clock\" />\n      <path value=\"$PROJECT_DIR$/vendor/psy/psysh\" />\n      <path value=\"$PROJECT_DIR$/vendor/fidry/cpu-core-counter\" />\n      <path value=\"$PROJECT_DIR$/vendor/react/stream\" />\n      <path value=\"$PROJECT_DIR$/vendor/react/promise\" />\n      <path value=\"$PROJECT_DIR$/vendor/react/socket\" />\n      <path value=\"$PROJECT_DIR$/vendor/react/dns\" />\n      <path value=\"$PROJECT_DIR$/vendor/react/cache\" />\n      <path value=\"$PROJECT_DIR$/vendor/react/event-loop\" />\n      <path value=\"$PROJECT_DIR$/vendor/react/child-process\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-php83\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/mailer\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/uid\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-uuid\" />\n      <path value=\"$PROJECT_DIR$/vendor/guzzlehttp/uri-template\" />\n      <path value=\"$PROJECT_DIR$/vendor/nunomaduro/termwind\" />\n      <path value=\"$PROJECT_DIR$/vendor/nunomaduro/collision\" />\n      <path value=\"$PROJECT_DIR$/vendor/openspout/openspout\" />\n      <path value=\"$PROJECT_DIR$/vendor/_laravel_idea\" />\n      <path value=\"$PROJECT_DIR$/vendor/psr/http-client\" />\n      <path value=\"$PROJECT_DIR$/vendor/orchestra/sidekick\" />\n      <path value=\"$PROJECT_DIR$/vendor/staabm/side-effects-detector\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-php85\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/clock\" />\n      <path value=\"$PROJECT_DIR$/vendor/symfony/polyfill-php84\" />\n      <path value=\"$PROJECT_DIR$/vendor/league/uri\" />\n      <path value=\"$PROJECT_DIR$/vendor/league/uri-interfaces\" />\n      <path value=\"$PROJECT_DIR$/vendor/guzzlehttp/guzzle\" />\n      <path value=\"$PROJECT_DIR$/vendor/laravel/pail\" />\n      <path value=\"$PROJECT_DIR$/vendor/guzzlehttp/promises\" />\n    </include_path>\n  </component>\n  <component name=\"PhpProjectSharedConfiguration\" php_language_level=\"8.1\">\n    <option name=\"suggestChangeDefaultLanguageLevel\" value=\"false\" />\n  </component>\n  <component name=\"PhpStan\">\n    <PhpStan_settings>\n      <PhpStanConfiguration tool_path=\"$PROJECT_DIR$/vendor/bin/phpstan\" />\n    </PhpStan_settings>\n  </component>\n  <component name=\"PhpStanOptionsConfiguration\">\n    <option name=\"transferred\" value=\"true\" />\n  </component>\n  <component name=\"PhpUnit\">\n    <phpunit_settings>\n      <PhpUnitSettings configuration_file_path=\"$PROJECT_DIR$/phpunit.xml.dist\" custom_loader_path=\"$PROJECT_DIR$/vendor/autoload.php\" use_configuration_file=\"true\" />\n    </phpunit_settings>\n  </component>\n  <component name=\"PsalmOptionsConfiguration\">\n    <option name=\"transferred\" value=\"true\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": ".php-cs-fixer.dist.php",
    "content": "<?php\n\nrequire_once __DIR__.'/vendor/autoload.php';\n\nreturn (new PhpCsFixer\\Config())\n\t->setRiskyAllowed(true)\n\t->setIndent(\"\\t\")\n\t->setLineEnding(\"\\n\")\n\t->setRules([\n\t\t'@PSR2' => true,\n\t\t'function_declaration' => [\n\t\t\t'closure_function_spacing' => 'none',\n\t\t\t'closure_fn_spacing' => 'none',\n\t\t],\n\t\t'ordered_imports' => [\n\t\t\t'sort_algorithm' => 'alpha',\n\t\t],\n\t\t'array_indentation' => true,\n\t\t'braces' => [\n\t\t\t'allow_single_line_closure' => true,\n\t\t],\n\t\t'no_break_comment' => false,\n\t\t'return_type_declaration' => [\n\t\t\t'space_before' => 'none',\n\t\t],\n\t\t'blank_line_after_opening_tag' => true,\n\t\t'compact_nullable_typehint' => true,\n\t\t'cast_spaces' => true,\n\t\t'concat_space' => [\n\t\t\t'spacing' => 'none',\n\t\t],\n\t\t'declare_equal_normalize' => [\n\t\t\t'space' => 'none',\n\t\t],\n\t\t'function_typehint_space' => true,\n\t\t'new_with_braces' => true,\n\t\t'method_argument_space' => true,\n\t\t'no_empty_statement' => true,\n\t\t'no_empty_comment' => true,\n\t\t'no_empty_phpdoc' => true,\n\t\t'no_extra_blank_lines' => [\n\t\t\t'tokens' => [\n\t\t\t\t'extra',\n\t\t\t\t'use',\n\t\t\t\t'use_trait',\n\t\t\t\t'return',\n\t\t\t],\n\t\t],\n\t\t'no_leading_import_slash' => true,\n\t\t'no_leading_namespace_whitespace' => true,\n\t\t'no_blank_lines_after_class_opening' => true,\n\t\t'no_blank_lines_after_phpdoc' => true,\n\t\t'no_whitespace_in_blank_line' => false,\n\t\t'no_whitespace_before_comma_in_array' => true,\n\t\t'no_useless_else' => true,\n\t\t'no_useless_return' => true,\n\t\t'single_trait_insert_per_statement' => true,\n\t\t'psr_autoloading' => true,\n\t\t'dir_constant' => true,\n\t\t'single_line_comment_style' => [\n\t\t\t'comment_types' => ['hash'],\n\t\t],\n\t\t'include' => true,\n\t\t'is_null' => true,\n\t\t'linebreak_after_opening_tag' => true,\n\t\t'lowercase_cast' => true,\n\t\t'lowercase_static_reference' => true,\n\t\t'magic_constant_casing' => true,\n\t\t'magic_method_casing' => true,\n\t\t'class_attributes_separation' => [\n\t\t\t// TODO: This can be reverted when https://github.com/FriendsOfPHP/PHP-CS-Fixer/pull/5869 is merged\n\t\t\t'elements' => ['const' => 'one', 'method' => 'one', 'property' => 'one'],\n\t\t],\n\t\t'modernize_types_casting' => true,\n\t\t'native_function_casing' => true,\n\t\t'native_function_type_declaration_casing' => true,\n\t\t'no_alias_functions' => true,\n\t\t'no_multiline_whitespace_around_double_arrow' => true,\n\t\t'multiline_whitespace_before_semicolons' => true,\n\t\t'no_short_bool_cast' => true,\n\t\t'no_unused_imports' => true,\n\t\t'no_php4_constructor' => true,\n\t\t'no_singleline_whitespace_before_semicolons' => true,\n\t\t'no_spaces_around_offset' => true,\n\t\t'no_trailing_comma_in_list_call' => true,\n\t\t'no_trailing_comma_in_singleline_array' => true,\n\t\t'normalize_index_brace' => true,\n\t\t'object_operator_without_whitespace' => true,\n\t\t'phpdoc_annotation_without_dot' => true,\n\t\t'phpdoc_indent' => true,\n\t\t'phpdoc_no_package' => true,\n\t\t'phpdoc_no_access' => true,\n\t\t'phpdoc_no_useless_inheritdoc' => true,\n\t\t'phpdoc_single_line_var_spacing' => true,\n\t\t'phpdoc_trim' => true,\n\t\t'phpdoc_types' => true,\n\t\t'semicolon_after_instruction' => true,\n\t\t'array_syntax' => [\n\t\t\t'syntax' => 'short',\n\t\t],\n\t\t'list_syntax' => [\n\t\t\t'syntax' => 'short',\n\t\t],\n\t\t'short_scalar_cast' => true,\n\t\t'single_blank_line_before_namespace' => true,\n\t\t'single_quote' => true,\n\t\t'standardize_not_equals' => true,\n\t\t'ternary_operator_spaces' => true,\n\t\t'whitespace_after_comma_in_array' => true,\n\t\t'not_operator_with_successor_space' => true,\n\t\t'trailing_comma_in_multiline' => true,\n\t\t'trim_array_spaces' => true,\n\t\t'binary_operator_spaces' => true,\n\t\t'unary_operator_spaces' => true,\n\t\t'php_unit_method_casing' => [\n\t\t\t'case' => 'snake_case',\n\t\t],\n\t\t'php_unit_test_annotation' => [\n\t\t\t'style' => 'prefix',\n\t\t],\n\t])\n\t->setFinder(\n\t\tPhpCsFixer\\Finder::create()\n\t\t\t->exclude('.circleci')\n\t\t\t->exclude('bin')\n\t\t\t->exclude('node_modules')\n\t\t\t->exclude('vendor')\n\t\t\t->notPath('.phpstorm.meta.php')\n\t\t\t->notPath('_ide_helper.php')\n\t\t\t->notPath('artisan')\n\t\t\t->in(__DIR__)\n\t);\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes will be documented in this file following the [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) \nformat. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n## [0.1.0] - 2026-03-23\n\n## [0.0.4] - 2025-11-11\n\n## [0.0.3] - 2025-07-16\n\n## [0.0.2] - 2024-08-02\n\n## [0.0.1] - 2024-07-25\n\n## [0.0.1]\n\n# Keep a Changelog Syntax\n\n-   `Added` for new features.\n-   `Changed` for changes in existing functionality.\n-   `Deprecated` for soon-to-be removed features.\n-   `Removed` for now removed features.\n-   `Fixed` for any bug fixes. \n-   `Security` in case of vulnerabilities.\n\n[Unreleased]: https://github.com/glhd/linen/compare/0.1.0...HEAD\n\n[0.1.0]: https://github.com/glhd/linen/compare/0.0.4...0.1.0\n\n[0.0.4]: https://github.com/glhd/linen/compare/0.0.3...0.0.4\n\n[0.0.3]: https://github.com/glhd/linen/compare/0.0.2...0.0.3\n\n[0.0.2]: https://github.com/glhd/linen/compare/0.0.1...0.0.2\n\n[0.0.1]: https://github.com/glhd/linen/compare/0.0.1...0.0.1\n\n[0.0.1]: https://github.com/glhd/linen/compare/0.0.1...0.0.1\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2024 Galahad, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<div style=\"float: right;\">\n\t<a href=\"https://github.com/glhd/linen/actions\" target=\"_blank\">\n\t\t<img \n\t\t\tsrc=\"https://github.com/glhd/linen/workflows/PHPUnit/badge.svg\" \n\t\t\talt=\"Build Status\" \n\t\t/>\n\t</a>\n\t<a href=\"https://packagist.org/packages/glhd/linen\" target=\"_blank\">\n        <img \n            src=\"https://poser.pugx.org/glhd/linen/v/stable\" \n            alt=\"Latest Stable Release\" \n        />\n\t</a>\n\t<a href=\"./LICENSE\" target=\"_blank\">\n        <img \n            src=\"https://poser.pugx.org/glhd/linen/license\" \n            alt=\"MIT Licensed\" \n        />\n    </a>\n    <a href=\"https://bsky.app/profile/cmorrell.com\" target=\"_blank\">\n        <img \n            src=\"https://img.shields.io/bluesky/followers/cmorrell.com\" \n            alt=\"Follow @cmorrell.com on bsky\" \n        />\n    </a>\n</div>\n\n<h1>\n    <img src=\"art/linen.png\" height=\"147\" alt=\"Linen\" />\n</h1>\n\nLinen is a lightweight spreadsheet utility for Laravel. It's a simple wrapper for \n[openspout](https://github.com/openspout/openspout) with some data normalization conveniences.\n\n## Installation\n\n```shell\ncomposer require glhd/linen\n```\n\n## Usage\n\nTo read a spreadsheet:\n\n```php\nforeach (Linen::read('path/to/your.xlsx') as $row) {\n    // $row is a collection, keyed by the headers in snake_case\n}\n```\n\nTo write a spreadsheet:\n\n```php\n// $data can be any iterable/Enumerable/etc\n$path = Linen::write($data, 'path/to/your.xlsx');\n```\n"
  },
  {
    "path": "composer.json",
    "content": "{\n  \"name\": \"glhd/linen\",\n  \"description\": \"\",\n  \"keywords\": [\n    \"laravel\"\n  ],\n  \"authors\": [\n    {\n      \"name\": \"Chris Morrell\",\n      \"homepage\": \"http://www.cmorrell.com\"\n    }\n  ],\n  \"type\": \"library\",\n  \"license\": \"MIT\",\n  \"require\": {\n    \"illuminate/support\": \"^10|^11|^12|^13|dev-master\",\n    \"ext-json\": \"*\",\n    \"openspout/openspout\": \"^4.24\"\n  },\n  \"require-dev\": {\n    \"orchestra/testbench\": \"^8.37|^9.17|^10.11|^11.0|^12.x-dev\",\n    \"friendsofphp/php-cs-fixer\": \"^3.94\",\n    \"mockery/mockery\": \"^1.6\",\n    \"phpunit/phpunit\": \"^10.5|^11.5|^12.5|^13.0\"\n  },\n  \"autoload\": {\n    \"psr-4\": {\n      \"Glhd\\\\Linen\\\\\": \"src/\"\n    },\n    \"files\": [\n      \"src/helpers.php\"\n    ]\n  },\n  \"autoload-dev\": {\n    \"classmap\": [\n      \"tests/TestCase.php\"\n    ],\n    \"psr-4\": {\n      \"Glhd\\\\Linen\\\\Tests\\\\\": \"tests/\"\n    }\n  },\n  \"scripts\": {\n    \"fix-style\": \"vendor/bin/php-cs-fixer fix\",\n    \"check-style\": \"vendor/bin/php-cs-fixer fix --diff --dry-run\"\n  },\n  \"extra\": {\n    \"laravel\": {\n      \"providers\": []\n    }\n  },\n  \"minimum-stability\": \"dev\",\n  \"prefer-stable\": true\n}\n"
  },
  {
    "path": "config/linen.php",
    "content": "<?php\n\nreturn [\n\t/*\n\t|--------------------------------------------------------------------------\n\t| Section\n\t|--------------------------------------------------------------------------\n\t|\n\t| Description\n\t|\n\t*/\n];\n"
  },
  {
    "path": "ide.json",
    "content": "{\n    \"$schema\": \"https://laravel-ide.com/schema/laravel-ide-v2.json\",\n    \"completions\": [\n        {\n            \"complete\": \"directoryFiles\",\n            \"options\": {\n                \"directory\": \"tests/fixtures\"\n            },\n            \"condition\": [\n                {\n                    \"methodNames\": [\n                        \"fixture\"\n                    ],\n                    \"parameters\": [\n                        1\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"./vendor/phpunit/phpunit/phpunit.xsd\"\n         bootstrap=\"vendor/autoload.php\"\n         colors=\"true\"\n>\n  <testsuites>\n    <testsuite name=\"Tests\">\n      <directory>./tests</directory>\n    </testsuite>\n  </testsuites>\n  <source>\n    <include>\n      <directory>./src</directory>\n    </include>\n  </source>\n  <php>\n    <env name=\"APP_ENV\" value=\"testing\"/>\n    <env name=\"APP_KEY\" value=\"base64:tfsezwCu4ZRixRLA/+yL/qoouX++Q3lPAPOAbtnBCG8=\"/>\n    <env name=\"BCRYPT_ROUNDS\" value=\"4\"/>\n    <env name=\"CACHE_DRIVER\" value=\"array\"/>\n    <env name=\"SESSION_DRIVER\" value=\"array\"/>\n    <env name=\"QUEUE_DRIVER\" value=\"sync\"/>\n    <env name=\"MAIL_DRIVER\" value=\"array\"/>\n    <env name=\"DB_CONNECTION\" value=\"testing\"/>\n    <env name=\"TERMINAL_EMULATOR\" value=\"JetBrains-JediTerm\" />\n  </php>\n</phpunit>\n"
  },
  {
    "path": "src/CsvReader.php",
    "content": "<?php\n\nnamespace Glhd\\Linen;\n\nuse OpenSpout\\Common\\Entity\\Cell;\nuse OpenSpout\\Reader\\ReaderInterface;\n\nclass CsvReader extends Reader\n{\n\tprotected function reader(): ReaderInterface\n\t{\n\t\treturn new \\OpenSpout\\Reader\\CSV\\Reader();\n\t}\n\t\n\tprotected function castCell(Cell $cell): mixed\n\t{\n\t\t$value = $cell->getValue();\n\t\t\n\t\treturn match (true) {\n\t\t\tis_numeric($value) => (float) $value == (int) $value ? (int) $value : (float) $value,\n\t\t\t'' === $value => null,\n\t\t\tdefault => $value,\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "src/CsvWriter.php",
    "content": "<?php\n\nnamespace Glhd\\Linen;\n\nuse Closure;\nuse Glhd\\Linen\\Support\\WriteIterator;\nuse OpenSpout\\Writer\\CSV as OpenSpout;\nuse OpenSpout\\Writer\\WriterInterface;\n\nclass CsvWriter extends Writer\n{\n\tprotected string $delimiter = ',';\n\t\n\tprotected string $enclosure = '\"';\n\t\n\tprotected bool $bom = true;\n\t\n\tprotected bool $empty_new_line = false;\n\t\n\tpublic function withDelimiter(string $delimiter): static\n\t{\n\t\t$this->delimiter = $delimiter;\n\t\t\n\t\treturn $this;\n\t}\n\t\n\tpublic function withEnclosure(string $enclosure): static\n\t{\n\t\t$this->enclosure = $enclosure;\n\t\t\n\t\treturn $this;\n\t}\n\t\n\tpublic function withoutBom(): static\n\t{\n\t\t$this->bom = false;\n\t\t\n\t\treturn $this;\n\t}\n\t\n\tpublic function withEmptyNewLineAtEndOfFile(): static\n\t{\n\t\t$this->empty_new_line = true;\n\t\t\n\t\treturn $this;\n\t}\n\t\n\tpublic function withoutEmptyNewLineAtEndOfFile(): static\n\t{\n\t\t$this->empty_new_line = false;\n\t\t\n\t\treturn $this;\n\t}\n\t\n\tpublic function getIterator(?string $path = null): WriteIterator\n\t{\n\t\t$path ??= tempnam_with_cleanup();\n\t\t\n\t\treturn new WriteIterator(\n\t\t\tpath: $path,\n\t\t\tgenerator: $this->rows(),\n\t\t\twriter: $this->writer(),\n\t\t\tcleanup: $this->cleanupCallback(),\n\t\t);\n\t}\n\t\n\tprotected function writer(): WriterInterface\n\t{\n\t\t$options = new OpenSpout\\Options();\n\t\t$options->FIELD_DELIMITER = $this->delimiter;\n\t\t$options->FIELD_ENCLOSURE = $this->enclosure;\n\t\t$options->SHOULD_ADD_BOM = $this->bom;\n\t\t\n\t\treturn new OpenSpout\\Writer($options);\n\t}\n\t\n\tprotected function cleanupCallback(): ?Closure\n\t{\n\t\tif (! $this->empty_new_line) {\n\t\t\treturn fn($path) => file_put_contents($path, rtrim(file_get_contents($path), PHP_EOL));\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/ExcelReader.php",
    "content": "<?php\n\nnamespace Glhd\\Linen;\n\nuse Carbon\\CarbonImmutable;\nuse OpenSpout\\Common\\Entity\\Cell;\nuse OpenSpout\\Reader\\ReaderInterface;\n\nclass ExcelReader extends Reader\n{\n\tprotected function reader(): ReaderInterface\n\t{\n\t\treturn new \\OpenSpout\\Reader\\XLSX\\Reader();\n\t}\n\t\n\tprotected function castCell(Cell $cell): mixed\n\t{\n\t\tif ($cell instanceof Cell\\DateTimeCell) {\n\t\t\treturn CarbonImmutable::createFromInterface($cell->getValue());\n\t\t}\n\t\t\n\t\tif ($cell instanceof Cell\\EmptyCell) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\treturn parent::castCell($cell);\n\t}\n}\n"
  },
  {
    "path": "src/ExcelWriter.php",
    "content": "<?php\n\nnamespace Glhd\\Linen;\n\nuse OpenSpout\\Writer\\WriterInterface;\nuse OpenSpout\\Writer\\XLSX as OpenSpout;\n\nclass ExcelWriter extends Writer\n{\n\tprotected function writer(): WriterInterface\n\t{\n\t\treturn new OpenSpout\\Writer(new OpenSpout\\Options());\n\t}\n}\n"
  },
  {
    "path": "src/Facades/.gitkeep",
    "content": ""
  },
  {
    "path": "src/Facades/Linen.php",
    "content": "<?php\n\nnamespace Glhd\\Linen\\Facades;\n\nuse Glhd\\Linen\\Support\\FileTypeHelper;\nuse Illuminate\\Support\\Facades\\Facade;\n\nclass Linen extends Facade\n{\n\tprotected static function getFacadeAccessor()\n\t{\n\t\treturn FileTypeHelper::class;\n\t}\n}\n"
  },
  {
    "path": "src/Reader.php",
    "content": "<?php\n\nnamespace Glhd\\Linen;\n\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse IteratorAggregate;\nuse OpenSpout\\Common\\Entity\\Cell;\nuse OpenSpout\\Common\\Entity\\Row;\nuse OpenSpout\\Reader\\ReaderInterface;\nuse Traversable;\nuse UnexpectedValueException;\n\n/** @extends IteratorAggregate<int, Collection> */\nabstract class Reader implements IteratorAggregate\n{\n\tpublic static function from(string $path): static\n\t{\n\t\treturn new static($path);\n\t}\n\t\n\tpublic static function read(string $path): LazyCollection\n\t{\n\t\treturn static::from($path)->collect();\n\t}\n\t\n\tpublic function __construct(\n\t\tprotected string $path,\n\t) {\n\t}\n\t\n\tpublic function getIterator(): Traversable\n\t{\n\t\treturn $this->collect();\n\t}\n\t\n\tpublic function collect(): LazyCollection\n\t{\n\t\treturn new LazyCollection(function() {\n\t\t\t$reader = $this->reader();\n\t\t\t$reader->open($this->path);\n\t\t\t\n\t\t\ttry {\n\t\t\t\tforeach ($reader->getSheetIterator() as $sheet) {\n\t\t\t\t\t$columns = 0;\n\t\t\t\t\t$keys = null;\n\t\t\t\t\t\n\t\t\t\t\tforeach ($sheet->getRowIterator() as $row) {\n\t\t\t\t\t\t/** @var \\OpenSpout\\Common\\Entity\\Row $row */\n\t\t\t\t\t\tif (null === $keys) {\n\t\t\t\t\t\t\t$keys = array_map($this->headerToKey(...), $row->toArray());\n\t\t\t\t\t\t\t$columns = count($keys);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t$data = $this->castRow($row);\n\t\t\t\t\t\t$data_columns = count($data);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ($columns < $data_columns) {\n\t\t\t\t\t\t\tforeach (range(1, $data_columns) as $index => $column) {\n\t\t\t\t\t\t\t\t$keys[$index] ??= \"column{$column}\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$columns = count($keys);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ($columns > $data_columns) {\n\t\t\t\t\t\t\t$data = array_merge($data, array_fill(0, $columns - $data_columns, null));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tyield Collection::make(array_combine($keys, $data));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\t$reader->close();\n\t\t\t}\n\t\t});\n\t}\n\t\n\tabstract protected function reader(): ReaderInterface;\n\t\n\tprotected function castRow(Row $data): array\n\t{\n\t\treturn array_map($this->castCell(...), $data->getCells());\n\t}\n\t\n\tprotected function castCell(Cell $cell): mixed\n\t{\n\t\treturn $cell->getValue();\n\t}\n\t\n\tprotected function headerToKey(string $value): string\n\t{\n\t\treturn Str::snake(strtolower($value));\n\t}\n}\n"
  },
  {
    "path": "src/Support/FileTypeHelper.php",
    "content": "<?php\n\nnamespace Glhd\\Linen\\Support;\n\nuse Generator;\nuse Glhd\\Linen\\CsvReader;\nuse Glhd\\Linen\\CsvWriter;\nuse Glhd\\Linen\\ExcelReader;\nuse Glhd\\Linen\\ExcelWriter;\nuse Glhd\\Linen\\Reader;\nuse Illuminate\\Contracts\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Enumerable;\nuse InvalidArgumentException;\nuse Symfony\\Component\\Mime\\MimeTypes;\n\nclass FileTypeHelper\n{\n\tpublic function read(string $path): Reader\n\t{\n\t\t$mime = MimeTypes::getDefault()->guessMimeType($path);\n\t\t\n\t\treturn match ($mime) {\n\t\t\t'application/msexcel',\n\t\t\t'application/x-msexcel',\n\t\t\t'zz-application/zz-winassoc-xls',\n\t\t\t'application/vnd.ms-excel',\n\t\t\t'application/vnd.ms-excel.sheet.binary.macroenabled.12',\n\t\t\t'application/vnd.ms-excel.sheet.macroenabled.12',\n\t\t\t'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t\t\t'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => ExcelReader::from($path),\n\t\t\t'application/csv',\n\t\t\t'text/csv',\n\t\t\t'text/csv-schema',\n\t\t\t'text/x-comma-separated-values',\n\t\t\t'text/x-csv',\n\t\t\t'text/plain' => CsvReader::from($path),\n\t\t\tdefault => throw new InvalidArgumentException(\"Unable to infer file type for '{$path}'\"),\n\t\t};\n\t}\n\t\n\tpublic function write(array|Enumerable|Generator|Builder $data, string $path): string\n\t{\n\t\t$extension = pathinfo($path, PATHINFO_EXTENSION);\n\t\t\n\t\t$writer = match ($extension) {\n\t\t\t'xlsx', 'xls' => ExcelWriter::for($data),\n\t\t\t'csv' => CsvWriter::for($data),\n\t\t\tdefault => throw new InvalidArgumentException(\"Unable to infer file type for '{$path}'\"),\n\t\t};\n\t\t\n\t\treturn $writer->write($path);\n\t}\n}\n"
  },
  {
    "path": "src/Support/WriteIterator.php",
    "content": "<?php\n\nnamespace Glhd\\Linen\\Support;\n\nuse Closure;\nuse Generator;\nuse Iterator;\nuse OpenSpout\\Common\\Entity\\Row;\nuse OpenSpout\\Writer\\WriterInterface;\n\nclass WriteIterator implements Iterator\n{\n\tprotected int $written = 0;\n\t\n\tprotected bool $open = false;\n\t\n\tprotected bool $pending = false;\n\t\n\tpublic function __construct(\n\t\tpublic readonly string $path,\n\t\tprotected Generator $generator,\n\t\tprotected WriterInterface $writer,\n\t\tprotected ?Closure $cleanup = null,\n\t) {\n\t}\n\t\n\tpublic function drain(): string\n\t{\n\t\tif (! $this->open) {\n\t\t\t$this->rewind();\n\t\t}\n\t\t\n\t\twhile ($this->valid()) {\n\t\t\t$this->writeCurrentRow();\n\t\t\t$this->next();\n\t\t}\n\t\t\n\t\treturn $this->path;\n\t}\n\t\n\tpublic function rewind(): void\n\t{\n\t\t$this->written = 0;\n\t\t$this->pending = true;\n\t\t\n\t\t$this->generator->rewind();\n\t\t\n\t\t$this->openWriter();\n\t}\n\t\n\tpublic function key(): mixed\n\t{\n\t\treturn $this->generator->key();\n\t}\n\t\n\t/**\n\t * To prevent unintended memory issues, we're only going to return the write count\n\t * from the iterator. The iterator is just for handling progress/stepping, and not\n\t * for accessing the underlying data.\n\t *\n\t * @return int\n\t */\n\tpublic function current(): int\n\t{\n\t\t$this->writeCurrentRow();\n\t\t\n\t\treturn $this->written;\n\t}\n\t\n\tpublic function next(): void\n\t{\n\t\tif (! $this->open) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t$this->generator->next();\n\t\t\n\t\t$this->pending = true;\n\t}\n\t\n\tpublic function valid(): bool\n\t{\n\t\tif (! $valid = $this->generator->valid()) {\n\t\t\t$this->closeWriter();\n\t\t}\n\t\t\n\t\treturn $valid;\n\t}\n\t\n\tpublic function __destruct()\n\t{\n\t\t$this->closeWriter();\n\t}\n\t\n\tprotected function openWriter(): void\n\t{\n\t\tif (! $this->open) {\n\t\t\t$this->writer->openToFile($this->path);\n\t\t\t$this->open = true;\n\t\t}\n\t}\n\t\n\tprotected function writeCurrentRow(): void\n\t{\n\t\tif ($this->pending) {\n\t\t\t$this->writer->addRow(\n\t\t\t\tRow::fromValues($this->generator->current()->toArray())\n\t\t\t);\n\t\t\t\n\t\t\t$this->written++;\n\t\t\t$this->pending = false;\n\t\t}\n\t}\n\t\n\tprotected function closeWriter(): void\n\t{\n\t\tif ($this->open) {\n\t\t\t$this->writer->close();\n\t\t\t\n\t\t\tif ($this->cleanup) {\n\t\t\t\tcall_user_func($this->cleanup, $this->path);\n\t\t\t}\n\t\t\t\n\t\t\t$this->open = false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Writer.php",
    "content": "<?php\n\nnamespace Glhd\\Linen;\n\nuse Closure;\nuse Generator;\nuse Glhd\\Linen\\Support\\WriteIterator;\nuse Illuminate\\Contracts\\Database\\Query\\Builder;\nuse Illuminate\\Http\\File;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Enumerable;\nuse Illuminate\\Support\\LazyCollection;\nuse Illuminate\\Support\\Str;\nuse OpenSpout\\Writer\\WriterInterface;\n\nabstract class Writer\n{\n\tprotected bool $headers = true;\n\t\n\tprotected Closure $header_formatter;\n\t\n\tpublic static function for(array|Enumerable|Closure|Builder $data): static\n\t{\n\t\treturn new static($data);\n\t}\n\t\n\tpublic function __construct(\n\t\tprotected array|Enumerable|Closure|Builder $data,\n\t) {\n\t\t$this->header_formatter = Str::headline(...);\n\t}\n\t\n\tpublic function withoutHeaders(): static\n\t{\n\t\t$this->headers = false;\n\t\t\n\t\treturn $this;\n\t}\n\t\n\tpublic function withHeaderFormatter(Closure $header_formatter): static\n\t{\n\t\t$this->header_formatter = $header_formatter;\n\t\t\n\t\treturn $this;\n\t}\n\t\n\tpublic function withOriginalKeysAsHeaders(): static\n\t{\n\t\treturn $this->withHeaderFormatter(static fn($key) => $key);\n\t}\n\t\n\tpublic function getIterator(?string $path = null): WriteIterator\n\t{\n\t\t$path ??= tempnam_with_cleanup();\n\t\t\n\t\treturn new WriteIterator($path, $this->rows(), $this->writer());\n\t}\n\t\n\tpublic function write(string $path): string\n\t{\n\t\treturn $this->getIterator($path)->drain();\n\t}\n\t\n\tpublic function writeToHttpFile(): File\n\t{\n\t\treturn new File($this->writeToTemporaryFile());\n\t}\n\t\n\tpublic function writeToTemporaryFile(): string\n\t{\n\t\treturn $this->write(tempnam_with_cleanup());\n\t}\n\t\n\tabstract protected function writer(): WriterInterface;\n\t\n\t/** @return Generator<Collection> */\n\tprotected function rows(): Generator\n\t{\n\t\t$source = match (true) {\n\t\t\t$this->data instanceof Closure => LazyCollection::make($this->data),\n\t\t\tis_array($this->data) => Collection::make($this->data),\n\t\t\t$this->data instanceof Builder => $this->data->lazyById(),\n\t\t\tdefault => $this->data,\n\t\t};\n\t\t\n\t\t$needs_headers = $this->headers;\n\t\t\n\t\tforeach ($source as $row) {\n\t\t\t$row = Collection::make($row);\n\t\t\t\n\t\t\tif ($needs_headers) {\n\t\t\t\t$needs_headers = false;\n\t\t\t\tyield $row->keys()->map($this->header_formatter);\n\t\t\t}\n\t\t\t\n\t\t\tyield $row;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/helpers.php",
    "content": "<?php\n\nnamespace Glhd\\Linen;\n\nuse Illuminate\\Support\\Facades\\App;\n\nfunction tempnam_with_cleanup(): string\n{\n\t$path = tempnam(sys_get_temp_dir(), 'glhd-linen-data');\n\t\n\tApp::terminating(static fn() => @unlink($path));\n\t\n\treturn $path;\n}\n"
  },
  {
    "path": "tests/Feature/CsvReaderTest.php",
    "content": "<?php\n\nnamespace Glhd\\Linen\\Tests\\Feature;\n\nuse Glhd\\Linen\\CsvReader;\nuse Glhd\\Linen\\Tests\\TestCase;\n\nclass CsvReaderTest extends TestCase\n{\n\tpublic function test_it_can_read_a_basic_csv_file_as_an_iterator(): void\n\t{\n\t\t$reader = CsvReader::from($this->fixture('basic.csv'));\n\t\t\n\t\tforeach ($reader as $index => $row) {\n\t\t\t$this->assertSame(match ($index) {\n\t\t\t\t0 => ['user_id' => 1, 'name' => 'Chris', 'nullable' => null, 'number' => 40.2],\n\t\t\t\t1 => ['user_id' => 10, 'name' => 'Bogdan', 'nullable' => 'not null', 'number' => -37],\n\t\t\t}, $row->toArray());\n\t\t}\n\t}\n\t\n\tpublic function test_it_can_read_a_basic_csv_file_as_a_collection(): void\n\t{\n\t\t$collection = CsvReader::from($this->fixture('basic.csv'))->collect();\n\t\t\n\t\tforeach ($collection as $index => $row) {\n\t\t\t$this->assertSame(match ($index) {\n\t\t\t\t0 => ['user_id' => 1, 'name' => 'Chris', 'nullable' => null, 'number' => 40.2],\n\t\t\t\t1 => ['user_id' => 10, 'name' => 'Bogdan', 'nullable' => 'not null', 'number' => -37],\n\t\t\t}, $row->toArray());\n\t\t}\n\t}\n\t\n\tpublic function test_if_headers_are_missing_column_numbers_are_used_as_keys(): void\n\t{\n\t\t$collection = CsvReader::from($this->fixture('more-columns-than-headers.csv'))->collect();\n\t\t\n\t\tforeach ($collection as $index => $row) {\n\t\t\t$this->assertSame(match ($index) {\n\t\t\t\t0 => ['user_id' => 1, 'name' => 'Chris', 'column3' => null, 'column4' => 40.2, 'column5' => null, 'column6' => null, 'column7' => null],\n\t\t\t\t1 => ['user_id' => 10, 'name' => 'Bogdan', 'column3' => 'not null', 'column4' => -37, 'column5' => null, 'column6' => null, 'column7' => null],\n\t\t\t}, $row->toArray());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tests/Feature/CsvWriterTest.php",
    "content": "<?php\n\nnamespace Feature;\n\nuse Glhd\\Linen\\CsvWriter;\nuse Glhd\\Linen\\Tests\\TestCase;\nuse function Glhd\\Linen\\tempnam_with_cleanup;\n\nclass CsvWriterTest extends TestCase\n{\n\tpublic function test_it_can_write_to_a_csv(): void\n\t{\n\t\t$data = [\n\t\t\t['user_id' => 1, 'name' => 'Chris', 'nullable' => null, 'number' => 40.2],\n\t\t\t['user_id' => 10, 'name' => 'Bogdan', 'nullable' => 'not null', 'number' => -37],\n\t\t];\n\t\t\n\t\t$path = CsvWriter::for($data)->writeToTemporaryFile();\n\t\t\n\t\t$written = file_get_contents($path);\n\t\t$expected = <<<CSV\n\t\t﻿\"User Id\",Name,Nullable,Number\n\t\t1,Chris,,40.2\n\t\t10,Bogdan,\"not null\",-37\n\t\tCSV;\n\t\t\n\t\t$this->assertSame($expected, $written);\n\t}\n\t\n\tpublic function test_it_can_write_to_a_csv_with_a_new_line_at_end(): void\n\t{\n\t\t$data = [\n\t\t\t['user_id' => 1, 'name' => 'Chris', 'nullable' => null, 'number' => 40.2],\n\t\t\t['user_id' => 10, 'name' => 'Bogdan', 'nullable' => 'not null', 'number' => -37],\n\t\t];\n\t\t\n\t\t$path = CsvWriter::for($data)->withEmptyNewLineAtEndOfFile()->writeToTemporaryFile();\n\t\t\n\t\t$written = file_get_contents($path);\n\t\t$expected = <<<CSV\n\t\t﻿\"User Id\",Name,Nullable,Number\n\t\t1,Chris,,40.2\n\t\t10,Bogdan,\"not null\",-37\n\t\t\n\t\tCSV;\n\t\t\n\t\t$this->assertSame($expected, $written);\n\t}\n\t\n\tpublic function test_it_can_write_with_an_iterator(): void\n\t{\n\t\t$data = [\n\t\t\t['user_id' => 1, 'name' => 'Chris'],\n\t\t\t['user_id' => 10, 'name' => 'Skyler'],\n\t\t];\n\t\t\n\t\t$iterator = CsvWriter::for($data)->getIterator(tempnam_with_cleanup());\n\t\t\n\t\t// Iterator returns [original key] => [rows written]\n\t\t$this->assertEquals(\n\t\t\t[0 => 1, 1 => 2, 2 => 3],\n\t\t\titerator_to_array($iterator)\n\t\t);\n\t\t\n\t\t$written = file_get_contents($iterator->path);\n\t\t$expected = <<<CSV\n\t\t﻿\"User Id\",Name\n\t\t1,Chris\n\t\t10,Skyler\n\t\tCSV;\n\t\t\n\t\t$this->assertSame($expected, $written);\n\t}\n}\n"
  },
  {
    "path": "tests/Feature/ExcelReaderTest.php",
    "content": "<?php\n\nnamespace Feature;\n\nuse Glhd\\Linen\\ExcelReader;\nuse Glhd\\Linen\\Tests\\TestCase;\n\nclass ExcelReaderTest extends TestCase\n{\n\tpublic function test_it_can_read_a_basic_excel_file_as_an_iterator(): void\n\t{\n\t\t$reader = ExcelReader::from($this->fixture('basic.xlsx'));\n\t\t\n\t\tforeach ($reader as $index => $row) {\n\t\t\tif (0 === $index) {\n\t\t\t\t$this->assertEquals(1, $row['user_id']);\n\t\t\t\t$this->assertEquals('Chris', $row['name']);\n\t\t\t\t$this->assertEquals('2024-07-25', $row['date']->format('Y-m-d'));\n\t\t\t\t$this->assertEquals(40.20, $row['number']);\n\t\t\t} elseif (1 === $index) {\n\t\t\t\t$this->assertEquals(10, $row['user_id']);\n\t\t\t\t$this->assertEquals('Bogdan', $row['name']);\n\t\t\t\t$this->assertEquals('2024-07-20', $row['date']->format('Y-m-d'));\n\t\t\t\t$this->assertEquals(-37.0, $row['number']);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic function test_it_can_read_a_basic_excel_file_as_a_collection(): void\n\t{\n\t\t$collection = ExcelReader::from($this->fixture('basic.xlsx'))->collect();\n\t\t\n\t\tforeach ($collection as $index => $row) {\n\t\t\tif (0 === $index) {\n\t\t\t\t$this->assertEquals(1, $row['user_id']);\n\t\t\t\t$this->assertEquals('Chris', $row['name']);\n\t\t\t\t$this->assertEquals('2024-07-25', $row['date']->format('Y-m-d'));\n\t\t\t\t$this->assertEquals(40.20, $row['number']);\n\t\t\t} elseif (1 === $index) {\n\t\t\t\t$this->assertEquals(10, $row['user_id']);\n\t\t\t\t$this->assertEquals('Bogdan', $row['name']);\n\t\t\t\t$this->assertEquals('2024-07-20', $row['date']->format('Y-m-d'));\n\t\t\t\t$this->assertEquals(-37.0, $row['number']);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tests/Feature/ExcelWriterTest.php",
    "content": "<?php\n\nnamespace Feature;\n\nuse Glhd\\Linen\\ExcelReader;\nuse Glhd\\Linen\\ExcelWriter;\nuse Glhd\\Linen\\Tests\\TestCase;\n\nclass ExcelWriterTest extends TestCase\n{\n\tpublic function test_it_can_write_to_an_excel_file(): void\n\t{\n\t\t$data = [\n\t\t\t['user_id' => 1, 'name' => 'Chris', 'nullable' => null, 'number' => 40.2],\n\t\t\t['user_id' => 10, 'name' => 'Bogdan', 'nullable' => 'not null', 'number' => -37],\n\t\t];\n\t\t\n\t\t$tempfile = ExcelWriter::for($data)->writeToTemporaryFile();\n\t\t\n\t\t$read = ExcelReader::read($tempfile)->toArray();\n\t\t\n\t\t$this->assertSame($data, $read);\n\t}\n\t\n\tpublic function test_it_can_write_to_an_excel_file_with_iterator(): void\n\t{\n\t\t$data = [\n\t\t\t['user_id' => 1, 'name' => 'Chris', 'nullable' => null, 'number' => 40.2],\n\t\t\t['user_id' => 10, 'name' => 'Bogdan', 'nullable' => 'not null', 'number' => -37],\n\t\t];\n\t\t\n\t\t$iterator = ExcelWriter::for($data)->getIterator();\n\t\t\n\t\t$this->assertEquals(\n\t\t\t[0 => 1, 1 => 2, 2 => 3],\n\t\t\titerator_to_array($iterator),\n\t\t);\n\t\t\n\t\t$read = ExcelReader::read($iterator->path)->toArray();\n\t\t\n\t\t$this->assertSame($data, $read);\n\t}\n}\n"
  },
  {
    "path": "tests/Feature/FacadeTest.php",
    "content": "<?php\n\nnamespace Feature;\n\nuse Glhd\\Linen\\ExcelReader;\nuse Glhd\\Linen\\Facades\\Linen;\nuse Glhd\\Linen\\Tests\\TestCase;\n\nclass FacadeTest extends TestCase\n{\n\tpublic function test_it_can_read_a_basic_csv_file_via_the_facade(): void\n\t{\n\t\t$read = Linen::read($this->fixture('basic.csv'));\n\t\t\n\t\tforeach ($read as $index => $row) {\n\t\t\t$this->assertSame(match ($index) {\n\t\t\t\t0 => ['user_id' => 1, 'name' => 'Chris', 'nullable' => null, 'number' => 40.2],\n\t\t\t\t1 => ['user_id' => 10, 'name' => 'Bogdan', 'nullable' => 'not null', 'number' => -37],\n\t\t\t}, $row->toArray());\n\t\t}\n\t}\n\t\n\tpublic function test_it_can_read_a_basic_excel_file_via_the_facade(): void\n\t{\n\t\t$read = Linen::read($this->fixture('basic.xlsx'));\n\t\t\n\t\tforeach ($read as $index => $row) {\n\t\t\tif (0 === $index) {\n\t\t\t\t$this->assertEquals(1, $row['user_id']);\n\t\t\t\t$this->assertEquals('Chris', $row['name']);\n\t\t\t\t$this->assertEquals('2024-07-25', $row['date']->format('Y-m-d'));\n\t\t\t\t$this->assertEquals(40.20, $row['number']);\n\t\t\t} elseif (1 === $index) {\n\t\t\t\t$this->assertEquals(10, $row['user_id']);\n\t\t\t\t$this->assertEquals('Bogdan', $row['name']);\n\t\t\t\t$this->assertEquals('2024-07-20', $row['date']->format('Y-m-d'));\n\t\t\t\t$this->assertEquals(-37.0, $row['number']);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic function test_it_can_write_a_basic_csv_file_via_the_facade(): void\n\t{\n\t\t$data = [\n\t\t\t['user_id' => 1, 'name' => 'Chris', 'nullable' => null, 'number' => 40.2],\n\t\t\t['user_id' => 10, 'name' => 'Bogdan', 'nullable' => 'not null', 'number' => -37],\n\t\t];\n\t\t\n\t\t$path = tempnam(sys_get_temp_dir(), 'glhd-linen-data').'.csv';\n\t\t\n\t\t$written = file_get_contents(Linen::write($data, $path));\n\t\t$expected = <<<CSV\n\t\t﻿\"User Id\",Name,Nullable,Number\n\t\t1,Chris,,40.2\n\t\t10,Bogdan,\"not null\",-37\n\t\tCSV;\n\t\t\n\t\t$this->assertSame($expected, $written);\n\t\t\n\t\tunlink($path);\n\t}\n\t\n\tpublic function test_it_can_write_a_basic_excel_file_via_the_facade(): void\n\t{\n\t\t$data = [\n\t\t\t['user_id' => 1, 'name' => 'Chris', 'nullable' => null, 'number' => 40.2],\n\t\t\t['user_id' => 10, 'name' => 'Bogdan', 'nullable' => 'not null', 'number' => -37],\n\t\t];\n\t\t\n\t\t$path = tempnam(sys_get_temp_dir(), 'glhd-linen-data').'.xlsx';\n\t\t\n\t\tLinen::write($data, $path);\n\t\t\n\t\t$read = ExcelReader::read($path)->toArray();\n\t\t\n\t\t$this->assertSame($data, $read);\n\t\t\n\t\t@unlink($path);\n\t}\n}\n"
  },
  {
    "path": "tests/TestCase.php",
    "content": "<?php\n\nnamespace Glhd\\Linen\\Tests;\n\nuse Orchestra\\Testbench\\TestCase as Orchestra;\n\nabstract class TestCase extends Orchestra\n{\n\tprotected function fixture(string $filename): string\n\t{\n\t\treturn __DIR__.'/fixtures/'.$filename;\n\t}\n\t\n\tprotected function getPackageProviders($app)\n\t{\n\t\treturn [];\n\t}\n\t\n\tprotected function getPackageAliases($app)\n\t{\n\t\treturn [];\n\t}\n\t\n\tprotected function getApplicationTimezone($app)\n\t{\n\t\treturn 'America/New_York';\n\t}\n}\n"
  },
  {
    "path": "tests/fixtures/basic.csv",
    "content": "User ID,Name,Nullable,Number\r\n1,Chris,,40.2\r\n10,Bogdan,\"not null\",-37\r\n"
  },
  {
    "path": "tests/fixtures/more-columns-than-headers.csv",
    "content": "User ID,Name\r\n1,Chris,,40.2,,,\r\n10,Bogdan,\"not null\",-37\r\n"
  }
]