From 08f0a9955199d0b6b1a6688e45e7f6582d5d5f2e Mon Sep 17 00:00:00 2001 From: Nisse Date: Fri, 20 Sep 2024 12:12:45 -0700 Subject: [PATCH] PDF Setup and Order PDF view --- README.md | 4 + app/Http/Controllers/OrderController.php | 20 +- app/Models/Order.php | 12 + app/Models/ProductService.php | 1 + composer.json | 3 +- composer.lock | 276 +++- database/factories/OrderFactory.php | 3 +- database/factories/ProductServiceFactory.php | 1 + database/factories/ServiceFileFactory.php | 1 - .../2024_09_09_194631_create_orders_table.php | 1 + ...0_224947_create_product_services_table.php | 1 + ...9_10_225029_create_service_files_table.php | 2 +- database/seeders/CustomerSeeder.php | 16 +- docker-compose.yml | 4 +- docker/8.0/Dockerfile | 65 + docker/8.0/php.ini | 5 + docker/8.0/start-container | 26 + docker/8.0/supervisord.conf | 14 + docker/8.1/Dockerfile | 64 + docker/8.1/php.ini | 5 + docker/8.1/start-container | 26 + docker/8.1/supervisord.conf | 14 + docker/8.2/Dockerfile | 70 + docker/8.2/php.ini | 5 + docker/8.2/start-container | 26 + docker/8.2/supervisord.conf | 14 + docker/8.3/Dockerfile | 75 + docker/8.3/php.ini | 5 + docker/8.3/start-container | 26 + docker/8.3/supervisord.conf | 14 + docker/mariadb/create-testing-database.sh | 6 + docker/mysql/create-testing-database.sh | 6 + docker/pgsql/create-testing-database.sql | 2 + package-lock.json | 1299 ++++++++++++++++- package.json | 3 +- public/order.pdf | Bin 0 -> 93360 bytes resources/views/layouts/app.blade.php | 2 - resources/views/layouts/pdf.blade.php | 7 + .../livewire/order-products-create.blade.php | 4 +- resources/views/orders/show.blade.php | 18 +- resources/views/pdf/order-footer.blade.php | 10 + resources/views/pdf/order.blade.php | 236 +++ routes/web.php | 1 + 43 files changed, 2357 insertions(+), 36 deletions(-) create mode 100644 docker/8.0/Dockerfile create mode 100644 docker/8.0/php.ini create mode 100644 docker/8.0/start-container create mode 100644 docker/8.0/supervisord.conf create mode 100644 docker/8.1/Dockerfile create mode 100644 docker/8.1/php.ini create mode 100644 docker/8.1/start-container create mode 100644 docker/8.1/supervisord.conf create mode 100644 docker/8.2/Dockerfile create mode 100644 docker/8.2/php.ini create mode 100644 docker/8.2/start-container create mode 100644 docker/8.2/supervisord.conf create mode 100644 docker/8.3/Dockerfile create mode 100644 docker/8.3/php.ini create mode 100644 docker/8.3/start-container create mode 100644 docker/8.3/supervisord.conf create mode 100644 docker/mariadb/create-testing-database.sh create mode 100644 docker/mysql/create-testing-database.sh create mode 100644 docker/pgsql/create-testing-database.sql create mode 100644 public/order.pdf create mode 100644 resources/views/layouts/pdf.blade.php create mode 100644 resources/views/pdf/order-footer.blade.php create mode 100644 resources/views/pdf/order.blade.php diff --git a/README.md b/README.md index 1a4c26b..8f1db69 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +https://github.com/spatie/laravel-pdf/discussions/90 + +for spatie/pdf stuff +

Laravel Logo

diff --git a/app/Http/Controllers/OrderController.php b/app/Http/Controllers/OrderController.php index 419a896..6e8a457 100644 --- a/app/Http/Controllers/OrderController.php +++ b/app/Http/Controllers/OrderController.php @@ -16,6 +16,8 @@ use Illuminate\Foundation\Application; use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Illuminate\View\View; +use Spatie\Browsershot\Browsershot; +use Spatie\LaravelPdf\Facades\Pdf; class OrderController extends Controller { @@ -97,6 +99,7 @@ class OrderController extends Controller 'placement' => $request->get('placement')[$i], 'amount' => $request->get('amount')[$i], 'amount_price' => $request->get('amount_price')[$i], + 'notes' => $request->get('service_notes')[$i], ]); } @@ -116,5 +119,20 @@ class OrderController extends Controller public function update(Request $request, $id) {} - public function destroy($id) {} + public function destroy(int $id): void {} + + public function pdf(int $id) + { + $order = Order::find($id); + + Pdf::view('pdf.order', ['order' => $order]) + ->withBrowsershot(function (Browsershot $browsershot) { + $browsershot->noSandbox(); + }) + ->margins(8, 8, 15, 8) + ->footerView('pdf.order-footer', ['order' => $order]) + ->save('order.pdf'); + + return redirect('order.pdf'); + } } diff --git a/app/Models/Order.php b/app/Models/Order.php index 18a8935..b6ce87f 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Carbon; class Order extends Model { @@ -30,6 +31,7 @@ class Order extends Model 'new_art', 'digitizing', 'repeat', + 'event', 'purchased_garments', 'customer_supplied_file', 'notes', @@ -49,6 +51,16 @@ class Order extends Model }); } + public function dueDatePdf(): string + { + return Carbon::createFromDate($this->due_date)->format('M d, Y'); + } + + public function orderDatePdf(): string + { + return Carbon::createFromDate($this->order_date)->format('M d, Y'); + } + public function generateInternalPo(int $id): string { $po = str_pad(strval($id), 4, '0', STR_PAD_LEFT); diff --git a/app/Models/ProductService.php b/app/Models/ProductService.php index 961919c..a74c48b 100644 --- a/app/Models/ProductService.php +++ b/app/Models/ProductService.php @@ -20,6 +20,7 @@ class ProductService extends Model 'placement', 'amount', 'amount_price', + 'notes', ]; /** diff --git a/composer.json b/composer.json index 57395d8..29ffe9a 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,8 @@ "davidhsianturi/blade-bootstrap-icons": "^1.5", "laravel/framework": "^11.9", "laravel/tinker": "^2.9", - "livewire/livewire": "^3.5" + "livewire/livewire": "^3.5", + "spatie/laravel-pdf": "^1.5" }, "require-dev": { "fakerphp/faker": "^1.23", diff --git a/composer.lock b/composer.lock index a0b71ae..0c68b22 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": "364673414a3a1d429fd6bb98138661e6", + "content-hash": "837be2b0dd2a854686dc8a65f4e0a719", "packages": [ { "name": "blade-ui-kit/blade-icons", @@ -3327,6 +3327,280 @@ ], "time": "2024-04-27T21:32:50+00:00" }, + { + "name": "spatie/browsershot", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/browsershot.git", + "reference": "601f2758191d8c46b2ea587eea935a87da4f39e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/browsershot/zipball/601f2758191d8c46b2ea587eea935a87da4f39e8", + "reference": "601f2758191d8c46b2ea587eea935a87da4f39e8", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "ext-json": "*", + "php": "^8.2", + "spatie/temporary-directory": "^2.0", + "symfony/process": "^6.0|^7.0" + }, + "require-dev": { + "pestphp/pest": "^1.20", + "spatie/image": "^3.6", + "spatie/pdf-to-text": "^1.52", + "spatie/phpunit-snapshot-assertions": "^4.2.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Browsershot\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://github.com/freekmurze", + "role": "Developer" + } + ], + "description": "Convert a webpage to an image or pdf using headless Chrome", + "homepage": "https://github.com/spatie/browsershot", + "keywords": [ + "chrome", + "convert", + "headless", + "image", + "pdf", + "puppeteer", + "screenshot", + "webpage" + ], + "support": { + "source": "https://github.com/spatie/browsershot/tree/4.3.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-08-22T09:14:07+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.16.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/c7413972cf22ffdff97b68499c22baa04eddb6a2", + "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.28|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.7|^8.0", + "pestphp/pest": "^1.22", + "phpunit/phpunit": "^9.5.24", + "spatie/pest-plugin-test-time": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.5" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-08-27T18:56:10+00:00" + }, + { + "name": "spatie/laravel-pdf", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-pdf.git", + "reference": "fadf23c6249c491fd4924f8ec37166a283269966" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-pdf/zipball/fadf23c6249c491fd4924f8ec37166a283269966", + "reference": "fadf23c6249c491fd4924f8ec37166a283269966", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0", + "php": "^8.2", + "spatie/browsershot": "^4.0", + "spatie/laravel-package-tools": "^1.16.1", + "spatie/temporary-directory": "^2.2.1" + }, + "require-dev": { + "ext-imagick": "*", + "larastan/larastan": "^2.7.0", + "laravel/pint": "^1.13.7", + "nunomaduro/collision": "^7.10", + "orchestra/testbench": "^8.18", + "pestphp/pest": "^2.30", + "pestphp/pest-plugin-arch": "^2.5", + "pestphp/pest-plugin-laravel": "^2.2", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan-deprecation-rules": "^1.1.4", + "phpstan/phpstan-phpunit": "^1.3.15", + "spatie/image": "^3.3.2", + "spatie/laravel-ray": "^1.33", + "spatie/pdf-to-image": "^2.2", + "spatie/pdf-to-text": "^1.52.1", + "spatie/pest-expectations": "^1.5", + "spatie/pest-plugin-snapshots": "^2.1", + "spatie/pixelmatch-php": "^1.0", + "wnx/sidecar-browsershot": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelPdf\\PdfServiceProvider" + ], + "aliases": { + "LaravelPdf": "Pdf" + } + } + }, + "autoload": { + "files": [ + "src/Support/functions.php" + ], + "psr-4": { + "Spatie\\LaravelPdf\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Create PDFs in Laravel apps", + "homepage": "https://github.com/spatie/laravel-pdf", + "keywords": [ + "laravel", + "laravel-pdf", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-pdf/issues", + "source": "https://github.com/spatie/laravel-pdf/tree/1.5.2" + }, + "time": "2024-07-16T07:42:10+00:00" + }, + { + "name": "spatie/temporary-directory", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a", + "reference": "76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\TemporaryDirectory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", + "keywords": [ + "php", + "spatie", + "temporary-directory" + ], + "support": { + "issues": "https://github.com/spatie/temporary-directory/issues", + "source": "https://github.com/spatie/temporary-directory/tree/2.2.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-12-25T11:46:58+00:00" + }, { "name": "symfony/clock", "version": "v7.1.1", diff --git a/database/factories/OrderFactory.php b/database/factories/OrderFactory.php index 18dfcfb..7faf28d 100644 --- a/database/factories/OrderFactory.php +++ b/database/factories/OrderFactory.php @@ -24,8 +24,9 @@ class OrderFactory extends Factory 'order_type' => $this->faker->randomElement(OrderType::cases())->value, 'order_date' => $order_date, 'due_date' => $due_date, - 'status' => $this->faker->randomELement(OrderStatus::cases())->value, + 'status' => $this->faker->randomElement(OrderStatus::cases())->value, 'rush' => $this->faker->boolean(10), + 'event' => $this->faker->boolean(), 'new_art' => $this->faker->boolean(), 'digitizing' => $this->faker->boolean(), 'repeat' => $this->faker->boolean(), diff --git a/database/factories/ProductServiceFactory.php b/database/factories/ProductServiceFactory.php index 277576e..b9b63f9 100644 --- a/database/factories/ProductServiceFactory.php +++ b/database/factories/ProductServiceFactory.php @@ -19,6 +19,7 @@ class ProductServiceFactory extends Factory 'placement' => $this->faker->randomElement(['l/c', 'c/f', 'f/b', 'r/c']), 'amount' => $this->faker->randomNumber(1), 'amount_price' => 0, + 'notes' => $this->faker->randomElement(['1) 1149 2) grey 3) white', '1) white', '1) black 2) white']), ]; } } diff --git a/database/factories/ServiceFileFactory.php b/database/factories/ServiceFileFactory.php index 36ebf03..6a2dc22 100644 --- a/database/factories/ServiceFileFactory.php +++ b/database/factories/ServiceFileFactory.php @@ -20,7 +20,6 @@ class ServiceFileFactory extends Factory 'width' => round($this->faker->randomFloat(2, 0, 10), 1), 'height' => round($this->faker->randomFloat(2, 0, 10), 1), 'unit' => 'inch', - 'notes' => $this->faker->randomElement(['1) 1149 2) grey 3) white', '1) white', '1) black 2) white']), ]; } } diff --git a/database/migrations/2024_09_09_194631_create_orders_table.php b/database/migrations/2024_09_09_194631_create_orders_table.php index 5d1078a..c6dfce1 100644 --- a/database/migrations/2024_09_09_194631_create_orders_table.php +++ b/database/migrations/2024_09_09_194631_create_orders_table.php @@ -19,6 +19,7 @@ return new class extends Migration $table->date('due_date'); $table->string('status'); $table->boolean('rush')->default(0); + $table->boolean('event')->default(0); $table->boolean('new_art')->default(0); $table->boolean('digitizing')->default(0); $table->boolean('repeat')->default(0); diff --git a/database/migrations/2024_09_10_224947_create_product_services_table.php b/database/migrations/2024_09_10_224947_create_product_services_table.php index 8a2fbeb..2d713c7 100644 --- a/database/migrations/2024_09_10_224947_create_product_services_table.php +++ b/database/migrations/2024_09_10_224947_create_product_services_table.php @@ -16,6 +16,7 @@ return new class extends Migration $table->string('placement'); $table->string('amount')->nullable(); $table->string('amount_price')->nullable(); + $table->string('notes')->nullable(); $table->softDeletes(); $table->timestamps(); }); diff --git a/database/migrations/2024_09_10_225029_create_service_files_table.php b/database/migrations/2024_09_10_225029_create_service_files_table.php index 8d89d5d..f156ad4 100644 --- a/database/migrations/2024_09_10_225029_create_service_files_table.php +++ b/database/migrations/2024_09_10_225029_create_service_files_table.php @@ -16,7 +16,7 @@ return new class extends Migration $table->decimal('height')->nullable(); $table->string('unit')->default('inch'); $table->integer('setup_number')->nullable(); - $table->string('notes')->nullable(); + // $table->string('notes')->nullable(); $table->softDeletes(); $table->timestamps(); }); diff --git a/database/seeders/CustomerSeeder.php b/database/seeders/CustomerSeeder.php index 821f2a3..866caac 100644 --- a/database/seeders/CustomerSeeder.php +++ b/database/seeders/CustomerSeeder.php @@ -17,16 +17,17 @@ class CustomerSeeder extends Seeder { public function run(): void { - for ($i = 0; $i < 10; $i++) { + for ($i = 0; $i < 5; $i++) { Customer::factory() ->has(Contact::factory(rand(1, 5))) ->has(PackingSlip::factory(rand(1, 10))) ->has(ShippingEntry::factory(rand(1, 3))) - ->has(Order::factory(rand(2, 10)) + ->has(Order::factory(rand(2, 20)) ->has(OrderProduct::factory(rand(1, 10)) ->has(productSize::factory(rand(1, 8)))) - ->has(ProductService::factory(rand(1, 10)) - ->for(ServiceFile::factory()))) + ->has(ProductService::factory(rand(1, 10), [ + 'service_file_id' => ServiceFile::factory(), + ]))) ->create(); } @@ -89,11 +90,12 @@ class CustomerSeeder extends Seeder 'notify' => 'Jane Wellman', 'notes' => 'Don\'t CC Kathlyn for SOF orders', ])) - ->has(Order::factory(10) + ->has(Order::factory(rand(2, 10)) ->has(OrderProduct::factory(rand(1, 10)) ->has(productSize::factory(rand(1, 8)))) - ->has(ProductService::factory(rand(1, 10)) - ->for(ServiceFile::factory()))) + ->has(ProductService::factory(rand(1, 10), [ + 'service_file_id' => ServiceFile::factory(), + ]))) ->create(); } } diff --git a/docker-compose.yml b/docker-compose.yml index 475e655..aa5eb79 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ services: laravel.test: build: - context: ./vendor/laravel/sail/runtimes/8.3 + context: ./docker/8.3 dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' @@ -40,7 +40,7 @@ services: MYSQL_ALLOW_EMPTY_PASSWORD: 1 volumes: - 'sail-mysql:/var/lib/mysql' - - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh' + - './docker/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh' networks: - sail healthcheck: diff --git a/docker/8.0/Dockerfile b/docker/8.0/Dockerfile new file mode 100644 index 0000000..e95e340 --- /dev/null +++ b/docker/8.0/Dockerfile @@ -0,0 +1,65 @@ +FROM ubuntu:20.04 + +LABEL maintainer="Taylor Otwell" + +ARG WWWGROUP +ARG NODE_VERSION=20 +ARG POSTGRES_VERSION=13 + +WORKDIR /var/www/html + +ENV DEBIAN_FRONTEND noninteractive +ENV TZ=UTC +ENV SUPERVISOR_PHP_COMMAND="/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80" +ENV SUPERVISOR_PHP_USER="sail" + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt-get update \ + && mkdir -p /etc/apt/keyrings \ + && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils librsvg2-bin fswatch ffmpeg nano \ + && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /usr/share/keyrings/ppa_ondrej_php.gpg > /dev/null \ + && echo "deb [signed-by=/usr/share/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu focal main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \ + && apt-get update \ + && apt-get install -y php8.0-cli php8.0-dev \ + php8.0-pgsql php8.0-sqlite3 php8.0-gd php8.0-imagick \ + php8.0-curl php8.0-memcached \ + php8.0-imap php8.0-mysql php8.0-mbstring \ + php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap \ + php8.0-intl php8.0-readline php8.0-pcov \ + php8.0-msgpack php8.0-igbinary php8.0-ldap \ + php8.0-redis php8.0-swoole php8.0-xdebug \ + && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && npm install -g npm \ + && npm install -g bun \ + && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null \ + && echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \ + && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/pgdg.gpg >/dev/null \ + && echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt focal-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ + && apt-get update \ + && apt-get install -y yarn \ + && apt-get install -y mysql-client \ + && apt-get install -y postgresql-client-$POSTGRES_VERSION \ + && apt-get -y autoremove \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN update-alternatives --set php /usr/bin/php8.0 + +RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.0 + +RUN groupadd --force -g $WWWGROUP sail +RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail + +COPY start-container /usr/local/bin/start-container +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY php.ini /etc/php/8.0/cli/conf.d/99-sail.ini +RUN chmod +x /usr/local/bin/start-container + +EXPOSE 80/tcp + +ENTRYPOINT ["start-container"] diff --git a/docker/8.0/php.ini b/docker/8.0/php.ini new file mode 100644 index 0000000..0d8ce9e --- /dev/null +++ b/docker/8.0/php.ini @@ -0,0 +1,5 @@ +[PHP] +post_max_size = 100M +upload_max_filesize = 100M +variables_order = EGPCS +pcov.directory = . diff --git a/docker/8.0/start-container b/docker/8.0/start-container new file mode 100644 index 0000000..40c55df --- /dev/null +++ b/docker/8.0/start-container @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +if [ "$SUPERVISOR_PHP_USER" != "root" ] && [ "$SUPERVISOR_PHP_USER" != "sail" ]; then + echo "You should set SUPERVISOR_PHP_USER to either 'sail' or 'root'." + exit 1 +fi + +if [ ! -z "$WWWUSER" ]; then + usermod -u $WWWUSER sail +fi + +if [ ! -d /.composer ]; then + mkdir /.composer +fi + +chmod -R ugo+rw /.composer + +if [ $# -gt 0 ]; then + if [ "$SUPERVISOR_PHP_USER" = "root" ]; then + exec "$@" + else + exec gosu $WWWUSER "$@" + fi +else + exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf +fi diff --git a/docker/8.0/supervisord.conf b/docker/8.0/supervisord.conf new file mode 100644 index 0000000..656da8a --- /dev/null +++ b/docker/8.0/supervisord.conf @@ -0,0 +1,14 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:php] +command=%(ENV_SUPERVISOR_PHP_COMMAND)s +user=%(ENV_SUPERVISOR_PHP_USER)s +environment=LARAVEL_SAIL="1" +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/docker/8.1/Dockerfile b/docker/8.1/Dockerfile new file mode 100644 index 0000000..c2fae85 --- /dev/null +++ b/docker/8.1/Dockerfile @@ -0,0 +1,64 @@ +FROM ubuntu:22.04 + +LABEL maintainer="Taylor Otwell" + +ARG WWWGROUP +ARG NODE_VERSION=20 +ARG POSTGRES_VERSION=15 + +WORKDIR /var/www/html + +ENV DEBIAN_FRONTEND noninteractive +ENV TZ=UTC +ENV SUPERVISOR_PHP_COMMAND="/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80" +ENV SUPERVISOR_PHP_USER="sail" + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt-get update \ + && mkdir -p /etc/apt/keyrings \ + && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils librsvg2-bin fswatch ffmpeg nano \ + && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /usr/share/keyrings/ppa_ondrej_php.gpg > /dev/null \ + && echo "deb [signed-by=/usr/share/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \ + && apt-get update \ + && apt-get install -y php8.1-cli php8.1-dev \ + php8.1-pgsql php8.1-sqlite3 php8.1-gd php8.1-imagick \ + php8.1-curl \ + php8.1-imap php8.1-mysql php8.1-mbstring \ + php8.1-xml php8.1-zip php8.1-bcmath php8.1-soap \ + php8.1-intl php8.1-readline \ + php8.1-ldap \ + php8.1-msgpack php8.1-igbinary php8.1-redis php8.1-swoole \ + php8.1-memcached php8.1-pcov php8.1-xdebug \ + && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && npm install -g npm \ + && npm install -g bun \ + && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarn.gpg >/dev/null \ + && echo "deb [signed-by=/usr/share/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \ + && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/pgdg.gpg >/dev/null \ + && echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ + && apt-get update \ + && apt-get install -y yarn \ + && apt-get install -y mysql-client \ + && apt-get install -y postgresql-client-$POSTGRES_VERSION \ + && apt-get -y autoremove \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.1 + +RUN groupadd --force -g $WWWGROUP sail +RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail + +COPY start-container /usr/local/bin/start-container +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY php.ini /etc/php/8.1/cli/conf.d/99-sail.ini +RUN chmod +x /usr/local/bin/start-container + +EXPOSE 80/tcp + +ENTRYPOINT ["start-container"] diff --git a/docker/8.1/php.ini b/docker/8.1/php.ini new file mode 100644 index 0000000..0d8ce9e --- /dev/null +++ b/docker/8.1/php.ini @@ -0,0 +1,5 @@ +[PHP] +post_max_size = 100M +upload_max_filesize = 100M +variables_order = EGPCS +pcov.directory = . diff --git a/docker/8.1/start-container b/docker/8.1/start-container new file mode 100644 index 0000000..40c55df --- /dev/null +++ b/docker/8.1/start-container @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +if [ "$SUPERVISOR_PHP_USER" != "root" ] && [ "$SUPERVISOR_PHP_USER" != "sail" ]; then + echo "You should set SUPERVISOR_PHP_USER to either 'sail' or 'root'." + exit 1 +fi + +if [ ! -z "$WWWUSER" ]; then + usermod -u $WWWUSER sail +fi + +if [ ! -d /.composer ]; then + mkdir /.composer +fi + +chmod -R ugo+rw /.composer + +if [ $# -gt 0 ]; then + if [ "$SUPERVISOR_PHP_USER" = "root" ]; then + exec "$@" + else + exec gosu $WWWUSER "$@" + fi +else + exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf +fi diff --git a/docker/8.1/supervisord.conf b/docker/8.1/supervisord.conf new file mode 100644 index 0000000..656da8a --- /dev/null +++ b/docker/8.1/supervisord.conf @@ -0,0 +1,14 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:php] +command=%(ENV_SUPERVISOR_PHP_COMMAND)s +user=%(ENV_SUPERVISOR_PHP_USER)s +environment=LARAVEL_SAIL="1" +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/docker/8.2/Dockerfile b/docker/8.2/Dockerfile new file mode 100644 index 0000000..45e7105 --- /dev/null +++ b/docker/8.2/Dockerfile @@ -0,0 +1,70 @@ +FROM ubuntu:22.04 + +LABEL maintainer="Taylor Otwell" + +ARG WWWGROUP +ARG NODE_VERSION=20 +ARG POSTGRES_VERSION=15 + +WORKDIR /var/www/html + +ENV DEBIAN_FRONTEND noninteractive +ENV TZ=UTC +ENV SUPERVISOR_PHP_COMMAND="/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80" +ENV SUPERVISOR_PHP_USER="sail" + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt-get update \ + && mkdir -p /etc/apt/keyrings \ + && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils librsvg2-bin fswatch ffmpeg nano \ + && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \ + && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \ + && apt-get update \ + && apt-get install -y php8.2-cli php8.2-dev \ + php8.2-pgsql php8.2-sqlite3 php8.2-gd php8.2-imagick \ + php8.2-curl \ + php8.2-imap php8.2-mysql php8.2-mbstring \ + php8.2-xml php8.2-zip php8.2-bcmath php8.2-soap \ + php8.2-intl php8.2-readline \ + php8.2-ldap \ + php8.2-msgpack php8.2-igbinary php8.2-redis php8.2-swoole \ + php8.2-memcached php8.2-pcov php8.2-xdebug \ + && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && npm install -g npm \ + && npm install -g pnpm \ + && npm install -g bun \ + && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null \ + && echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \ + && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/keyrings/pgdg.gpg >/dev/null \ + && echo "deb [signed-by=/etc/apt/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ + && apt-get update \ + && apt-get install -y yarn \ + && apt-get install -y mysql-client \ + && apt-get install -y postgresql-client-$POSTGRES_VERSION \ + && apt-get -y autoremove \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.2 + +RUN groupadd --force -g $WWWGROUP sail +RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail + +COPY start-container /usr/local/bin/start-container +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY php.ini /etc/php/8.2/cli/conf.d/99-sail.ini +RUN chmod +x /usr/local/bin/start-container + +RUN apt-get update \ + && apt-get install -y gconf-service libasound2 libappindicator3-1 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget libgbm-dev libatk-bridge2.0-0 \ + && npm install --global --unsafe-perm puppeteer \ + && chmod -R o+rx /usr/lib/node_modules/puppeteer/.local-chromium + +EXPOSE 80/tcp + +ENTRYPOINT ["start-container"] diff --git a/docker/8.2/php.ini b/docker/8.2/php.ini new file mode 100644 index 0000000..0d8ce9e --- /dev/null +++ b/docker/8.2/php.ini @@ -0,0 +1,5 @@ +[PHP] +post_max_size = 100M +upload_max_filesize = 100M +variables_order = EGPCS +pcov.directory = . diff --git a/docker/8.2/start-container b/docker/8.2/start-container new file mode 100644 index 0000000..40c55df --- /dev/null +++ b/docker/8.2/start-container @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +if [ "$SUPERVISOR_PHP_USER" != "root" ] && [ "$SUPERVISOR_PHP_USER" != "sail" ]; then + echo "You should set SUPERVISOR_PHP_USER to either 'sail' or 'root'." + exit 1 +fi + +if [ ! -z "$WWWUSER" ]; then + usermod -u $WWWUSER sail +fi + +if [ ! -d /.composer ]; then + mkdir /.composer +fi + +chmod -R ugo+rw /.composer + +if [ $# -gt 0 ]; then + if [ "$SUPERVISOR_PHP_USER" = "root" ]; then + exec "$@" + else + exec gosu $WWWUSER "$@" + fi +else + exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf +fi diff --git a/docker/8.2/supervisord.conf b/docker/8.2/supervisord.conf new file mode 100644 index 0000000..656da8a --- /dev/null +++ b/docker/8.2/supervisord.conf @@ -0,0 +1,14 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:php] +command=%(ENV_SUPERVISOR_PHP_COMMAND)s +user=%(ENV_SUPERVISOR_PHP_USER)s +environment=LARAVEL_SAIL="1" +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/docker/8.3/Dockerfile b/docker/8.3/Dockerfile new file mode 100644 index 0000000..bfa8732 --- /dev/null +++ b/docker/8.3/Dockerfile @@ -0,0 +1,75 @@ +FROM ubuntu:22.04 + +LABEL maintainer="Taylor Otwell" + +ARG WWWGROUP +ARG NODE_VERSION=20 +ARG MYSQL_CLIENT="mysql-client" +ARG POSTGRES_VERSION=15 + +WORKDIR /var/www/html + +ENV DEBIAN_FRONTEND noninteractive +ENV TZ=UTC +ENV SUPERVISOR_PHP_COMMAND="/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80" +ENV SUPERVISOR_PHP_USER="sail" + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt-get update \ + && mkdir -p /etc/apt/keyrings \ + && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils librsvg2-bin fswatch ffmpeg nano \ + && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \ + && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \ + && apt-get update \ + && apt-get install -y php8.3-cli php8.3-dev \ + php8.3-pgsql php8.3-sqlite3 php8.3-gd \ + php8.3-curl \ + php8.3-imap php8.3-mysql php8.3-mbstring \ + php8.3-xml php8.3-zip php8.3-bcmath php8.3-soap \ + php8.3-intl php8.3-readline \ + php8.3-ldap \ + php8.3-msgpack php8.3-igbinary php8.3-redis php8.3-swoole \ + php8.3-memcached php8.3-pcov php8.3-imagick php8.3-xdebug \ + && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && npm install -g npm \ + && npm install -g pnpm \ + && npm install -g bun \ + && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null \ + && echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \ + && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/keyrings/pgdg.gpg >/dev/null \ + && echo "deb [signed-by=/etc/apt/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ + && apt-get update \ + && apt-get install -y yarn \ + && apt-get install -y $MYSQL_CLIENT \ + && apt-get install -y postgresql-client-$POSTGRES_VERSION \ + && apt-get -y autoremove \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.3 + +RUN groupadd --force -g $WWWGROUP sail +RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail + +COPY start-container /usr/local/bin/start-container +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY php.ini /etc/php/8.3/cli/conf.d/99-sail.ini +RUN chmod +x /usr/local/bin/start-container + +RUN npx puppeteer browsers install chrome \ + && mkdir /home/sail/.cache \ + && mv /root/.cache/puppeteer /home/sail/.cache \ + && apt-get update \ + && apt-get install -y ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 \ + libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 \ + libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 \ + libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils + +EXPOSE 80/tcp + +ENTRYPOINT ["start-container"] diff --git a/docker/8.3/php.ini b/docker/8.3/php.ini new file mode 100644 index 0000000..0d8ce9e --- /dev/null +++ b/docker/8.3/php.ini @@ -0,0 +1,5 @@ +[PHP] +post_max_size = 100M +upload_max_filesize = 100M +variables_order = EGPCS +pcov.directory = . diff --git a/docker/8.3/start-container b/docker/8.3/start-container new file mode 100644 index 0000000..40c55df --- /dev/null +++ b/docker/8.3/start-container @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +if [ "$SUPERVISOR_PHP_USER" != "root" ] && [ "$SUPERVISOR_PHP_USER" != "sail" ]; then + echo "You should set SUPERVISOR_PHP_USER to either 'sail' or 'root'." + exit 1 +fi + +if [ ! -z "$WWWUSER" ]; then + usermod -u $WWWUSER sail +fi + +if [ ! -d /.composer ]; then + mkdir /.composer +fi + +chmod -R ugo+rw /.composer + +if [ $# -gt 0 ]; then + if [ "$SUPERVISOR_PHP_USER" = "root" ]; then + exec "$@" + else + exec gosu $WWWUSER "$@" + fi +else + exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf +fi diff --git a/docker/8.3/supervisord.conf b/docker/8.3/supervisord.conf new file mode 100644 index 0000000..656da8a --- /dev/null +++ b/docker/8.3/supervisord.conf @@ -0,0 +1,14 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:php] +command=%(ENV_SUPERVISOR_PHP_COMMAND)s +user=%(ENV_SUPERVISOR_PHP_USER)s +environment=LARAVEL_SAIL="1" +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/docker/mariadb/create-testing-database.sh b/docker/mariadb/create-testing-database.sh new file mode 100644 index 0000000..d3b19d9 --- /dev/null +++ b/docker/mariadb/create-testing-database.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +/usr/bin/mariadb --user=root --password="$MYSQL_ROOT_PASSWORD" <<-EOSQL + CREATE DATABASE IF NOT EXISTS testing; + GRANT ALL PRIVILEGES ON \`testing%\`.* TO '$MYSQL_USER'@'%'; +EOSQL diff --git a/docker/mysql/create-testing-database.sh b/docker/mysql/create-testing-database.sh new file mode 100644 index 0000000..aeb1826 --- /dev/null +++ b/docker/mysql/create-testing-database.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +mysql --user=root --password="$MYSQL_ROOT_PASSWORD" <<-EOSQL + CREATE DATABASE IF NOT EXISTS testing; + GRANT ALL PRIVILEGES ON \`testing%\`.* TO '$MYSQL_USER'@'%'; +EOSQL diff --git a/docker/pgsql/create-testing-database.sql b/docker/pgsql/create-testing-database.sql new file mode 100644 index 0000000..d84dc07 --- /dev/null +++ b/docker/pgsql/create-testing-database.sql @@ -0,0 +1,2 @@ +SELECT 'CREATE DATABASE testing' +WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'testing')\gexec diff --git a/package-lock.json b/package-lock.json index 74000de..6bd91ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,12 @@ { - "name": "topnotch_website", + "name": "html", "lockfileVersion": 3, "requires": true, "packages": { "": { "dependencies": { - "bootstrap-icons": "^1.11.3" + "bootstrap-icons": "^1.11.3", + "puppeteer": "^23.4.0" }, "devDependencies": { "@popperjs/core": "^2.11.6", @@ -16,6 +17,43 @@ "vite": "^5.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -418,6 +456,28 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@puppeteer/browsers": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.0.tgz", + "integrity": "sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.3.6", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", @@ -642,6 +702,12 @@ "win32" ] }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -649,6 +715,59 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -663,6 +782,24 @@ "node": ">= 8" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -682,6 +819,88 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "license": "Apache-2.0" + }, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", + "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "b4a": "^1.6.6", + "streamx": "^2.20.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -744,6 +963,62 @@ "node": ">=8" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -769,6 +1044,49 @@ "fsevents": "~2.3.2" } }, + "node_modules/chromium-bidi": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.5.tgz", + "integrity": "sha512-RuLrmzYrxSb0s9SgpB+QN5jJucPduZQ/9SIe76MDxYJuecPW5mxMdacJ1f4EtgiV+R0p3sCkznTMvH0MPGFqjA==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -782,6 +1100,72 @@ "node": ">= 0.8" } }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -792,6 +1176,45 @@ "node": ">=0.4.0" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1342118", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1342118.tgz", + "integrity": "sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==", + "license": "BSD-3-Clause" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -831,6 +1254,111 @@ "@esbuild/win32-x64": "0.21.5" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -880,6 +1408,20 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -895,26 +1437,161 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "pump": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/immutable": { - "version": "4.3.7", + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/immutable": { + "version": "4.3.7", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true, "license": "MIT" }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -938,6 +1615,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -961,6 +1647,48 @@ "node": ">=0.12.0" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/laravel-vite-plugin": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.0.5.tgz", @@ -981,6 +1709,21 @@ "vite": "^5.0.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1004,6 +1747,18 @@ "node": ">= 0.6" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -1023,6 +1778,15 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1033,11 +1797,87 @@ "node": ">=0.10.0" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -1082,11 +1922,92 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.4.0.tgz", + "integrity": "sha512-FxgFFJI7NAsX8uebiEDSjS86vufz9TaqERQHShQT0lCbSRI3jUPEcz/0HdwLiYvfYNsc1zGjqY3NsGZya4PvUA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.4.0", + "chromium-bidi": "0.6.5", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1342118", + "puppeteer-core": "23.4.0", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.4.0.tgz", + "integrity": "sha512-fqkIP5FOcb38jfBj/OcBz1wFaI9nk40uQKSORvnXws6wCbep2dg8yxZ3ddJxBIfQsxoiEOvnrykFinUScrB/ew==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.4.0", + "chromium-bidi": "0.6.5", + "debug": "^4.3.7", + "devtools-protocol": "0.0.1342118", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", "license": "MIT" }, "node_modules/readdirp": { @@ -1102,6 +2023,24 @@ "node": ">=8.10.0" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/rollup": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", @@ -1156,6 +2095,66 @@ "node": ">=14.0.0" } }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", @@ -1166,6 +2165,104 @@ "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/streamx": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", + "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", + "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1179,6 +2276,50 @@ "node": ">=8.0" } }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "license": "MIT" + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT", + "optional": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "license": "MIT" + }, "node_modules/vite": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", @@ -1249,6 +2390,138 @@ "picocolors": "^1.0.0", "picomatch": "^2.3.1" } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index d36526f..9368f1f 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "vite": "^5.0" }, "dependencies": { - "bootstrap-icons": "^1.11.3" + "bootstrap-icons": "^1.11.3", + "puppeteer": "^23.4.0" } } diff --git a/public/order.pdf b/public/order.pdf new file mode 100644 index 0000000000000000000000000000000000000000..71c16728cad0e485a05d4d3de94e991fc57e78e3 GIT binary patch literal 93360 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 literal 0 HcmV?d00001 diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 9ef0aae..b0bec03 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -16,7 +16,6 @@ @vite(['resources/sass/app.scss', 'resources/js/app.js']) -{{-- @livewireStyles--}}

@@ -28,6 +27,5 @@
-{{--@livewireScripts--}} diff --git a/resources/views/layouts/pdf.blade.php b/resources/views/layouts/pdf.blade.php new file mode 100644 index 0000000..98b229a --- /dev/null +++ b/resources/views/layouts/pdf.blade.php @@ -0,0 +1,7 @@ + + + +@yield('content') \ No newline at end of file diff --git a/resources/views/livewire/order-products-create.blade.php b/resources/views/livewire/order-products-create.blade.php index 5ed0ec3..a93c596 100644 --- a/resources/views/livewire/order-products-create.blade.php +++ b/resources/views/livewire/order-products-create.blade.php @@ -277,11 +277,11 @@
- + >{{ old('service_notes') }}
diff --git a/resources/views/orders/show.blade.php b/resources/views/orders/show.blade.php index b81e358..8ff4989 100644 --- a/resources/views/orders/show.blade.php +++ b/resources/views/orders/show.blade.php @@ -72,6 +72,17 @@
+ +
@@ -124,7 +135,7 @@
- {{$order->customer_po}} + {{$order->customer_po}}
@@ -205,13 +216,14 @@
-
+
{{$order->notes}}
+
@@ -379,7 +391,7 @@
- {{$service->serviceFile->notes}} + {{$service->notes}}
diff --git a/resources/views/pdf/order-footer.blade.php b/resources/views/pdf/order-footer.blade.php new file mode 100644 index 0000000..90d7dc6 --- /dev/null +++ b/resources/views/pdf/order-footer.blade.php @@ -0,0 +1,10 @@ + + +
+ {{$order->internal_po}}, page @pageNumber of @totalPages +
' \ No newline at end of file diff --git a/resources/views/pdf/order.blade.php b/resources/views/pdf/order.blade.php new file mode 100644 index 0000000..5a8db5d --- /dev/null +++ b/resources/views/pdf/order.blade.php @@ -0,0 +1,236 @@ +@extends('layouts.pdf') + +
+
+ + {{-- First row of header--}} +
+ +
+
TOP NOTCH
+
+ +
+
+
{{$order->order_type}}
+
+
+ +
+
+ {{$order->orderDatePdf()}} +
+
+ Order Date: +
+
+ +
+ + {{-- 2nd row of header --}} +
+
+
Order Form
+
+ +
+
+
+
RUSH
+
+
+
Event
+
+
+
+ +
+
+ {{$order->dueDatePdf()}} +
+
+ Date Required: +
+
+
+ +
+ + +
+
+
+ {{$order->customer->company_name}} +
+
+ +
+ +
+
+
+
+ +
+
+
+
New Art
+
+ +
+
+
+
+ +
+
+
+
Repeat
+
+ +
+
+
+
+ +
+
+
+
Digitizing
+
+ +
+
+ + +
+
+
+ PO# +
+
+ {{$order->customer_po}} +
+
+ +
+ +
+
+
+
+ +
+
+
+
Purchased Garments
+
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + @foreach($order->orderProducts as $product) + + + + + + + + + + + + + + + + @endforeach + + +
SKUProduct NameColorXSSMLXL2XL3XLOSFATotal
{{$product->sku}}{{$product->product_name}}{{$product->color}}{{$product->productSizes()->get()->where('size', 'xs')->first()->amount ?? ''}}{{$product->productSizes()->get()->where('size', 's')->first()->amount ?? ''}}{{$product->productSizes()->get()->where('size', 'm')->first()->amount ?? ''}}{{$product->productSizes()->get()->where('size', 'l')->first()->amount ?? ''}}{{$product->productSizes()->get()->where('size', 'xl')->first()->amount ?? ''}}{{$product->productSizes()->get()->where('size', '2xl')->first()->amount ?? ''}}{{$product->productSizes()->get()->where('size', '3xl')->first()->amount ?? ''}}{{$product->productSizes()->get()->where('size', 'osfa')->first()->amount ?? ''}}{{$product->totalQuantity()}}
+
+
+
+ TOTAL QUANTITY: {{$order->totalProductQuantity()}} +
+
+ + +
+ + + + + + + + + + + @foreach($order->productServices as $service) + + + + + + + + + @endforeach + + +
Placement & ServiceLogo Name & InstructionsWidthHeightQTY
+
+ {{$service->placement}} +
+
+
+ + {{$service->serviceFile->code}} + +
+
+
+ {{$service->serviceFile->name}} +
+
+
+ {{$service->notes}} +
+
+ {{$service->serviceFile->width}} + + {{$service->serviceFile->height}} + + {{$service->amount}} +
+
+ +
+ {{$order->notes}} +
+ +
+
+ diff --git a/routes/web.php b/routes/web.php index 08cdcb7..50734b2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -37,3 +37,4 @@ Route::resource('packing-slips', PackingSlipController::class); Route::resource('shipping-entries', ShippingEntryController::class); Route::resource('orders', OrderController::class); +Route::get('orders/{order}/pdf', [OrderController::class, 'pdf'])->name('orders.pdf');