From 976bdf9bf58c988983e3f16bf6b7018430495135 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 -> 93664 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, 2346 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..707cdf3998e9f30490779772d98f19957cca78d9 GIT binary patch literal 93664 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 Nh+J5#ma#V1{{eV1ufG5Q 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..8ff4989 100644 --- a/resources/views/orders/show.blade.php +++ b/resources/views/orders/show.blade.php @@ -72,6 +72,17 @@
+ +
@@ -124,7 +135,7 @@ class="py-0 form-control-plaintext text-secondary"
- {{$order->customer_po}} + {{$order->customer_po}}
@@ -205,13 +216,14 @@ class="py-0 form-control-plaintext text-secondary"
-
+
{{$order->notes}}
+
@@ -379,7 +391,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');