From c3ce17bd96312131c42c8e85b0349a4218624a5e 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 | 12 +- 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 | 1281 ++++++++++++++++- 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 | 17 +- resources/views/pdf/order-footer.blade.php | 10 + resources/views/pdf/order.blade.php | 236 +++ routes/web.php | 1 + 43 files changed, 2345 insertions(+), 25 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\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 @@ public function store(OrderRequest $request) '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 @@ public function edit(int $id) {} 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\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 @@ public static function boot(): void }); } + 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 @@ public function definition(): array '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 @@ public function definition(): array '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 @@ public function definition(): array '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 @@ public function up(): void $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 @@ public function up(): void $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 @@ public function up(): void $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..14bed35 100644 --- a/database/seeders/CustomerSeeder.php +++ b/database/seeders/CustomerSeeder.php @@ -25,8 +25,9 @@ public function run(): void ->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(); } @@ -89,11 +90,12 @@ public function run(): void '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,6 +1437,45 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "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": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", @@ -908,6 +1489,67 @@ "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", @@ -915,6 +1557,41 @@ "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..99cdff8250b4986f8cfdfa12722b8470feb0ecbe 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 @@ class="form-control form-control-sm @error('service_file_name') is-invalid @ende
- + >{{ old('service_notes') }}
diff --git a/resources/views/orders/show.blade.php b/resources/views/orders/show.blade.php index b81e358..aba1421 100644 --- a/resources/views/orders/show.blade.php +++ b/resources/views/orders/show.blade.php @@ -124,7 +124,7 @@ class="py-0 form-control-plaintext text-secondary"
- {{$order->customer_po}} + {{$order->customer_po}}
@@ -205,13 +205,24 @@ class="py-0 form-control-plaintext text-secondary"
-
@@ -379,7 +390,7 @@ class="py-0 form-control-plaintext text-secondary"
- {{$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('shipping-entries', ShippingEntryController::class); Route::resource('orders', OrderController::class); +Route::get('orders/{order}/pdf', [OrderController::class, 'pdf'])->name('orders.pdf');