From 0beb44238219a8f863f5954529561f2549295a75 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 | 15 +- composer.json | 3 +- composer.lock | 276 ++++- 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 -> 66408 bytes resources/views/layouts/app.blade.php | 2 - resources/views/layouts/pdf.blade.php | 7 + resources/views/pdf/order.blade.php | 168 +++ routes/web.php | 1 + 32 files changed, 2227 insertions(+), 17 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.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..04d7108 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 { @@ -116,5 +118,16 @@ 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) + { + Pdf::view('pdf.order', ['order' => Order::find($id)]) + ->withBrowsershot(function (Browsershot $browsershot) { + $browsershot->noSandbox(); + }) + ->save('order.pdf'); + + return redirect('order.pdf'); + } } 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/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..70e517421065751f2a09f7290fd46a05e2901eec GIT binary patch literal 66408 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%0ANbnxvX(ngpk~0v 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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/pdf/order.blade.php b/resources/views/pdf/order.blade.php new file mode 100644 index 0000000..f5c6af1 --- /dev/null +++ b/resources/views/pdf/order.blade.php @@ -0,0 +1,168 @@ +@extends('layouts.pdf') + +
+
+ + {{-- First row of header--}} +
+ +
+
TOP NOTCH
+
+ +
+
+
EMB
+
+
+ +
+
+ Aug 20, 2024 +
+
+ Order Date: +
+
+ +
+ + {{-- 2nd row of header --}} +
+
+
Order Form
+
+ +
+
+
+
RUSH
+
+
+
Event
+
+
+
+ +
+
+ Sep 21, 2024 +
+
+ 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()}}
+
+ + + + +
+
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');