diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index bef1b2f..0000000
--- a/.dockerignore
+++ /dev/null
@@ -1,32 +0,0 @@
-# Ignore .env files
-.env
-.env.*
-.envrc
-
-# Ignore node_modules
-node_modules/
-
-# Ignore vendor folder
-vendor/
-
-# Ignore log files
-*.log
-
-# Ignore IDE and editor files
-.idea/
-.vscode/
-
-# Ignore system files
-.DS_Store
-Thumbs.db
-
-# Ignore Laravel storage
-/storage/*.key
-/storage/*.log
-/storage/framework/cache/*
-/storage/framework/sessions/*
-/storage/framework/views/*
-/storage/logs/*
-
-# Ignore database files if in development
-database/database.sqlite
\ No newline at end of file
diff --git a/.env.dusk.local.example b/.env.dusk.local.example
deleted file mode 100644
index f5671cc..0000000
--- a/.env.dusk.local.example
+++ /dev/null
@@ -1,72 +0,0 @@
-DUSK_HEADLESS_DISABLED=true
-ADMIN_EMAIL=login-test@example.com
-APP_ENV=testing
-DB_DATABASE=database/dusk.sqlite
-
-APP_NAME=Laravel
-APP_KEY=base64:YOUR_GENERATED_KEY_HERE=
-APP_DEBUG=true
-APP_URL=http://127.0.0.1:8000
-
-APP_LOCALE=en
-APP_FALLBACK_LOCALE=en
-APP_FAKER_LOCALE=en_US
-
-APP_MAINTENANCE_DRIVER=file
-# APP_MAINTENANCE_STORE=database
-
-# PHP_CLI_SERVER_WORKERS=4
-
-BCRYPT_ROUNDS=12
-
-LOG_CHANNEL=stack
-LOG_STACK=single
-LOG_DEPRECATIONS_CHANNEL=null
-LOG_LEVEL=debug
-
-DB_CONNECTION=sqlite
-# DB_HOST=127.0.0.1
-# DB_PORT=3306
-# DB_DATABASE=laravel
-# DB_USERNAME=root
-# DB_PASSWORD=
-
-SESSION_DRIVER=database
-SESSION_LIFETIME=120
-SESSION_ENCRYPT=false
-SESSION_PATH=/
-SESSION_DOMAIN=null
-
-BROADCAST_CONNECTION=log
-FILESYSTEM_DISK=local
-QUEUE_CONNECTION=database
-
-CACHE_STORE=database
-# CACHE_PREFIX=
-
-MEMCACHED_HOST=127.0.0.1
-
-REDIS_CLIENT=phpredis
-REDIS_HOST=127.0.0.1
-REDIS_PASSWORD=null
-REDIS_PORT=6379
-
-MAIL_MAILER=log
-MAIL_SCHEME=null
-MAIL_HOST=127.0.0.1
-MAIL_PORT=2525
-MAIL_USERNAME=null
-MAIL_PASSWORD=null
-MAIL_FROM_ADDRESS="hello@example.com"
-MAIL_FROM_NAME="${APP_NAME}"
-
-AWS_ACCESS_KEY_ID=
-AWS_SECRET_ACCESS_KEY=
-AWS_DEFAULT_REGION=us-east-1
-AWS_BUCKET=
-AWS_USE_PATH_STYLE_ENDPOINT=false
-
-MEDIA_DISK=s3
-
-VITE_APP_NAME="${APP_NAME}"
-
diff --git a/.env.example b/.env.example
index d1ef0f7..c0660ea 100644
--- a/.env.example
+++ b/.env.example
@@ -61,7 +61,5 @@ AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
-# AWS_BUCKET=share-lt-images
-# MEDIA_DISK=s3
VITE_APP_NAME="${APP_NAME}"
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 14b76b5..bc83191 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -9,15 +9,11 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for
This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions.
- php - 8.3.6
-- filament/filament (FILAMENT) - v4
- laravel/fortify (FORTIFY) - v1
- laravel/framework (LARAVEL) - v12
- laravel/prompts (PROMPTS) - v0
-- laravel/reverb (REVERB) - v1
-- laravel/sanctum (SANCTUM) - v4
- livewire/flux (FLUXUI_FREE) - v2
- livewire/livewire (LIVEWIRE) - v3
-- laravel/dusk (DUSK) - v8
- laravel/mcp (MCP) - v0
- laravel/pint (PINT) - v1
- laravel/sail (SAIL) - v1
@@ -500,12 +496,3 @@ Fortify is a headless authentication backend that provides authentication routes
- `Features::updatePasswords()` to let users change their passwords.
- `Features::resetPasswords()` for password reset via email.
-
-
-=== docker/core rules ===
-## Over-Engineering & Bloat
-- Do not add unnecessary boilerplate or "nice-to-have" features.
-- Only implement what solves the immediate problem.
-- Ask before adding optional infrastructure or configuration sections.
-- If a system worked before without something, don't add it "just in case".
-- Minimize configuration, complexity, and dependencies.
diff --git a/.gitignore b/.gitignore
index be34b8d..c7cf1fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,7 +9,6 @@
.env
.env.backup
.env.production
-.env.dev
.phpactor.json
.phpunit.result.cache
Homestead.json
@@ -22,13 +21,3 @@ yarn-error.log
/.nova
/.vscode
/.zed
-.vite
-*.deleted
-.env.dusk.local
-log*.txt
-.envrc
-database/backups
-*backup.tar.gz
-public/css
-public/js
-notes
diff --git a/.woodpecker/share-lt-build.yaml b/.woodpecker/share-lt-build.yaml
deleted file mode 100644
index f1963ca..0000000
--- a/.woodpecker/share-lt-build.yaml
+++ /dev/null
@@ -1,64 +0,0 @@
-when:
- - event: push
- branch: dev
-steps:
- build-local:
- image: docker:24-dind
- privileged: true
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock
- commands:
- - echo "Pulling base images to ensure latest layers..."
- - docker pull --quiet php:8.4-fpm-alpine3.23 || true
- - echo "Try to pull previous image to use as cache ..."
- - docker pull quay.io/marshyon/share-lt:latest || true
- - echo "Building image for testing (amd64 only for CI compatibility)..."
- - docker build --platform linux/amd64 --cache-from=quay.io/marshyon/share-lt:latest -t share-lt:test .
- - echo "Tagging test image as quay.io/marshyon/share-lt:v0.0.8..."
- - docker tag share-lt:test quay.io/marshyon/share-lt:v0.0.8
- - echo "Generating SBOM..."
- - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock anchore/syft:latest scan quay.io/marshyon/share-lt:v0.0.8 -o cyclonedx-json > sbom.json
- scan-vulnerabilities:
- image: aquasec/trivy:0.67.2
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock
- commands:
- - echo "Ensuring latest Trivy image is pulled..."
- - docker pull aquasec/trivy:latest || true
- - echo "Scanning for vulnerabilities via Docker daemon..."
- # Disabling scan for testing, will re-enable once a fix for
- # vulnerability is available.
- # Scan the image present in the Docker daemon; fail on CRITICAL severities
- # - trivy image --exit-code 1 --severity CRITICAL --no-progress share-lt:test
- # Run a full scan without failing just for logs
- - trivy image --severity HIGH,MEDIUM,LOW --no-progress share-lt:test
- - echo "Generating vulnerability report..."
- - trivy image --format cyclonedx --output trivy-vuln-bom.json share-lt:test
- - echo "Vulnerability Summary:"
- - trivy image --format table share-lt:test | tee trivy-vuln-summary.txt
- publish:
- image: woodpeckerci/plugin-docker-buildx
- settings:
- registry: quay.io
- repo: quay.io/marshyon/share-lt
- platforms: linux/amd64
- tags:
- - v0.0.8
- - latest
- username:
- from_secret: QUAY_USERNAME
- password:
- from_secret: QUAY_PASSWORD
- upload-sbom:
- image: cgr.dev/chainguard/cosign:latest
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock
- environment:
- COSIGN_REGISTRY_USERNAME:
- from_secret: QUAY_USERNAME
- COSIGN_REGISTRY_PASSWORD:
- from_secret: QUAY_PASSWORD
- commands:
- - cosign attach sbom --sbom sbom.json quay.io/marshyon/share-lt:v0.0.8 || echo "SBOM attach failed"
- - echo "Done - trivy report saved to workspace for manual review"
-
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b613975..1fe24d7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,67 +1,5 @@
-
# CHANGELOG
-## 2026-02-17
-
-added reverb, echo and toast messages for site builds
-
-added change log for go-live logging and audit
-
-## 2026-02-09
-
-added reference compose files
-
-added basic NATS integration
-
-## 2026-01-25
-
-added s3, docker build
-
-## 2026-01-19
-
-added text widgets
-
-added categories
-
-updated api to access text widgets and categories
-
-added url and call to action for entries for use in cards
-
-added import image and blogs import commands
-
-## 2026-01-08
-
-added tags to entry model
-
-added text widget and category
-
-## 2026-01-07
-
-added simple API for entries model
-- to view entries
-- implement initial access control
-
-this is sufficient to test static site generation
-
-## 2026-01-06
-
-added
-- Spatie Media Library
-- media library configuration file
-- Updated Entry model to support media handling
-- featured image upload with gallery selection and preview
-- login tests with Dusk for user authentication
-- Dusk test for featured image selection
-
-## 2026-01-02
-
-added initial model and filament resource
-
## 2026-01-01
-added: laravel 12
-
-added: AGPLv3
-
-
-
+added: laravel 12
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 97bc76d..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,107 +0,0 @@
-# Build stage for NATS CLI
-FROM golang:1.26-alpine AS nats-builder
-RUN apk add --no-cache git
-RUN git clone --depth 1 https://github.com/nats-io/natscli.git /src
-WORKDIR /src/nats
-RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o nats .
-
-
-
-FROM php:8.4-fpm-alpine3.23
-
-ENV APP_ENV=production
-ENV APP_DEBUG=false
-WORKDIR /var/www
-RUN apk update && apk add --no-cache \
- build-base \
- libpng-dev \
- libjpeg-turbo-dev \
- freetype-dev \
- zip \
- jpegoptim optipng pngquant gifsicle \
- vim \
- unzip \
- git \
- curl \
- libzip-dev \
- oniguruma-dev \
- nodejs \
- npm \
- icu-dev \
- sqlite-dev \
- sqlite-libs \
- nginx \
- supervisor \
- su-exec \
- tini \
- unzip \
- bash \
- jq \
- && rm -rf /var/cache/apk/*
-
-COPY --from=nats-builder /src/nats/nats /usr/local/bin/nats
-RUN chmod +x /usr/local/bin/nats
-
-RUN rm -rf /var/cache/apk/*
-RUN docker-php-ext-install mbstring zip exif pcntl intl gd pdo pdo_sqlite bcmath
-RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
-
-# Copy entrypoint script
-COPY cmd/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
-RUN chmod +x /usr/local/bin/docker-entrypoint.sh
-
-# Copy supervisord configuration
-COPY ./docker/supervisord.conf /etc/supervisord.conf
-RUN mkdir -p /var/log/supervisor \
- && mkdir -p /run/nginx /var/cache/nginx /var/lib/nginx /var/tmp/nginx \
- && chown -R root:root /run/nginx /var/cache/nginx /var/lib/nginx /var/tmp/nginx
-
-# Create www user and add to www-data group
-RUN adduser -u 1000 -G www-data -s /bin/sh -D www
-
-# Configure PHP-FPM to run as www user
-RUN sed -i 's/user = www-data/user = www/g' /usr/local/etc/php-fpm.d/www.conf
-
-# Remove the semicolon to uncomment the listen directive
-RUN sed -i 's/;listen = 127.0.0.1:9000/listen = 9000/' /usr/local/etc/php-fpm.d/www.conf
-
-# Ensure the worker running the code is correct (usually www-data or nginx)
-RUN sed -i 's/;listen.owner = www-data/listen.owner = www/' /usr/local/etc/php-fpm.d/www.conf
-RUN sed -i 's/;listen.group = www-data/listen.group = www-data/' /usr/local/etc/php-fpm.d/www.conf
-
-# Update nginx.conf to use 'www' user instead of 'nginx'
-RUN sed -i 's/user nginx;/user www;/' /etc/nginx/nginx.conf
-
-# Remove user and group directives from nginx and php-fpm configs to avoid conflicts
-RUN sed -i '/^user /d' /etc/nginx/nginx.conf
-RUN sed -i '/^user = /d' /usr/local/etc/php-fpm.d/www.conf
-RUN sed -i '/^group = /d' /usr/local/etc/php-fpm.d/www.conf
-
-# Set permissions for nginx directories
-RUN mkdir -p /var/lib/nginx/tmp/client_body /var/log/nginx \
- && chown -R www:www-data /var/lib/nginx /var/log/nginx \
- && chmod -R 755 /var/lib/nginx /var/log/nginx \
- && touch /run/nginx/nginx.pid \
- && chown www:www-data /run/nginx/nginx.pid
-
-# Copy application code (includes database/migrations/) and excluding
-# files in .dockerignore
-COPY --chown=www:www-data . /var/www
-RUN chown -R www:www-data /var/www
-RUN chown -R www:www-data /var/log/supervisor
-
-# Switch to www user
-USER www
-
-# Install app dependencies
-RUN composer install --optimize-autoloader --no-dev
-RUN npm ci
-RUN npm run build
-
-# run laravel cache optimization
-RUN php artisan optimize
-
-EXPOSE 8889
-
-ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
-CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]
diff --git a/GEMINI.md b/GEMINI.md
index e74e11a..bc83191 100644
--- a/GEMINI.md
+++ b/GEMINI.md
@@ -9,15 +9,11 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for
This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions.
- php - 8.3.6
-- filament/filament (FILAMENT) - v4
- laravel/fortify (FORTIFY) - v1
- laravel/framework (LARAVEL) - v12
- laravel/prompts (PROMPTS) - v0
-- laravel/reverb (REVERB) - v1
-- laravel/sanctum (SANCTUM) - v4
- livewire/flux (FLUXUI_FREE) - v2
- livewire/livewire (LIVEWIRE) - v3
-- laravel/dusk (DUSK) - v8
- laravel/mcp (MCP) - v0
- laravel/pint (PINT) - v1
- laravel/sail (SAIL) - v1
diff --git a/LICENSE b/LICENSE
index aaddaf1..9926d4b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,68 +1,71 @@
-GNU AFFERO GENERAL PUBLIC LICENSE
-Version 3, 19 November 2007
+GNU GENERAL PUBLIC LICENSE
+Version 3, 29 June 2007
-Copyright (C) 2007 Free Software Foundation, Inc.
+Copyright © 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
- Preamble
+Preamble
-The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software.
+The GNU General Public License is a free, copyleft license for software and other kinds of works.
-The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users.
+The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
-Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software.
+To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
-A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public.
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version.
+Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
-An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license.
+For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
+
+Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
+
+Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and modification follow.
- TERMS AND CONDITIONS
+TERMS AND CONDITIONS
0. Definitions.
-"This License" refers to version 3 of the GNU Affero General Public License.
+“This License” refers to version 3 of the GNU General Public License.
-"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
+“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
-"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations.
+“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
-To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.
+To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
-A "covered work" means either the unmodified Program or a work based on the Program.
+A “covered work” means either the unmodified Program or a work based on the Program.
-To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
+To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
-To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
+To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
-An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
+An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
1. Source Code.
-The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work.
+The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
-A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
+A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
-The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
+The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
-The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
+The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
The Corresponding Source for a work in source code form is that same work.
2. Basic Permissions.
-All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
+All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
-You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
+You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
-Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
+Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
@@ -77,159 +80,153 @@ You may charge any price or no price for each copy that you convey, and you may
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
- a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
+ a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
- b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices".
+ b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
- c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
+ c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
- d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
+ d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
-A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
+A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
- a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
+ a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
- b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
+ b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
- c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
+ c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
- d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
+ d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
- e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
+ e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
-A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
+A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
-"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
+“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
-If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
+If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
-The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
+The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
7. Additional Terms.
-"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
+“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
-When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
+When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
- a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
+ a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
- b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
+ b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
- c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
+ c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
- d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
+ d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
- e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
+ e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
- f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
+ f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
-All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
+All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
8. Termination.
-
-You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
+You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
-Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
+Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
9. Acceptance Not Required for Having Copies.
-
-You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
+You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
+Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
-Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
+An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
-An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
-
-You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
+You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
11. Patents.
+A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
-A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version".
-
-A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
+A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
-In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
+In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
-If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
+If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
-A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
+A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
+If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
-If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
-
-13. Remote Network Interaction; Use with the GNU General Public License.
-
-Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph.
-
-Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License.
+13. Use with the GNU Affero General Public License.
+Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
14. Revised Versions of this License.
+The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
-Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation.
+If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
-If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
-
-Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
+Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
15. Disclaimer of Warranty.
-
-THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
-
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
-
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
- How to Apply These Terms to Your New Programs
+How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.
share-lt
- Copyright (C) 2026 jon
+ Copyright (C) 2026 headshed
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
+ You should have received a copy of the GNU General Public License along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
-If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements.
+If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
-You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see .
\ No newline at end of file
+ share-lt Copyright (C) 2026 headshed
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.
+
+You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see .
+
+The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read .
diff --git a/README.md b/README.md
index 4bb8aa8..6e2d099 100644
--- a/README.md
+++ b/README.md
@@ -1,52 +1,10 @@
# share-lt
-Share Light CMS - Headless CMS with Real-time Publishing
-
-[](https://wpk.headshed.dev/repos/2) [](https://quay.io/repository/marshyon/share-lt)
-
-## Overview
-
-Share Light is a modern headless CMS built with Laravel 12 that enables real-time content management and automated static site generation. It provides a complete backend solution for content creators and developers who need a robust, scalable CMS with live preview capabilities.
-
-## Architecture
-
-This application runs as a **fat container** orchestrated by **tini** and **supervisor**, managing multiple services:
-
-- **Laravel 12** - Core CMS application with Filament admin interface
-- **PHP-FPM** - PHP process manager
-- **nginx** - Web server and reverse proxy
-- **Queue Worker** - Background job processing
-- **Laravel Reverb** - WebSocket server for real-time communication
-
-### Integration with External Services
-
-- **NATS Messaging** - Publishes messages to NATS streams when content changes
-- **share-lt-astro-consumer** - Companion application that consumes NATS messages to rebuild static sites
-- **Real-time Notifications** - Uses Reverb to send toast alerts to users about build status
-
-## Features
-
-### Content Management
-- **Entry Model** - Core content entities with media library support
-- **Text Widgets** - Reusable content blocks
-- **Categories** - Content organization and taxonomy
-- **Media Library** - Image and file management with Spatie Media Library
-
-### Real-time Publishing Workflow
-1. **Content Updates** - When entries are modified, messages are automatically sent to NATS streams
-2. **Consumer Notifications** - External applications (like share-lt-astro-consumer) listen for these messages
-3. **Preview Generation** - Consumers rebuild preview websites based on content changes
-4. **Status Updates** - Build results are sent back via API
-5. **Live Alerts** - Users receive real-time toast notifications about build status through Reverb
-
-### API & Integration
-- **RESTful API** - Complete API for content retrieval and management
-- **Access Control** - Built-in authorization and authentication
-- **NATS Integration** - Message streaming for distributed architecture
+Share Light CMS
this project is in 'Alpha'
-it is published as "R&D", open source, [GNU AFFERO GENERAL PUBLIC V3](LICENSE)
+it is published as "R&D", open source, [GPLv3](LICENSE)
default branch is currently `dev`
diff --git a/app/Console/Commands/ImportBlogs.php b/app/Console/Commands/ImportBlogs.php
deleted file mode 100644
index eef0702..0000000
--- a/app/Console/Commands/ImportBlogs.php
+++ /dev/null
@@ -1,144 +0,0 @@
-
\nIn FlowiseAI, applications based on the JavaScript fork of LangChain are modeled in a 'no/low-code' environment. If you are coming from a closed source world, yet trying to implement devops principles this may fill you with fear, dread and uncertainty. FlowiseAI offers the advantage of using plain-text JSON files to represent each workflow. These files are easy to understand, open, and readily backup-able, unlike opaque proprietary binary formats\nThe data used at runtime and other component prerequisites like credentials are stored in the FlowiseAI data volume, which looks like this
\nbash\nMode LastWriteTime ..... 8ZS1C0ZBB.webp",
- "created_at": "2024-12-17 11:24:59",
- "updated_at": "2024-12-17 12:53:54",
- "category_id": 1,
- "blog_date": "2024-02-26 00:00",
- "is_featured": 0,
- "published": 1
- },
-
- */
-
- $filePath = '/home/user/projects/laravel/12/media_library/boring-astro-static/imported_database/blogs.json';
-
- if (!file_exists($filePath)) {
- $this->error("File not found: $filePath");
- return 1;
- }
-
- $jsonContent = file_get_contents($filePath);
- $blogs = json_decode($jsonContent, true);
-
- if (!$blogs) {
- $this->error("Could not parse JSON file: $filePath");
- return 1;
- }
-
- foreach ($blogs as $blog) {
- // Only process the blog with ID 51
- if (($blog['id'] ?? null) !== 51) {
- continue;
- }
-
- $slug = $blog['slug'] ?? null;
- $this->info("Processing blog ID: {$blog['id']} with slug: {$slug}");
- // Check if the entry already exists
- $existingEntry = Entry::where('slug', $slug)->first();
-
- if ($existingEntry) {
- // Update existing entry with cleaned content
- $existingEntry->update([
- 'content' => $this->cleanHtmlForFilament($blog['content'] ?? ''),
- 'description' => $this->extractPlainTextFromHtml($blog['content'] ?? ''),
- ]);
- $this->info("Updated content for: {$existingEntry->title}");
- } else {
- // Create new entry
- Entry::create([
- 'title' => $blog['title'] ?? null,
- 'slug' => $slug,
- 'description' => $this->extractPlainTextFromHtml($blog['content'] ?? ''),
- 'is_published' => $blog['published'] ?? false,
- 'is_featured' => $blog['is_featured'] ?? false,
- 'published_at' => $blog['blog_date'] ?? null,
- 'content' => $this->cleanHtmlForFilament($blog['content'] ?? ''),
- 'category_id' => 1, // Default category
- ]);
- $this->info("Created new entry: " . ($blog['title'] ?? 'Untitled'));
- }
- }
-
- $this->info('Blogs imported successfully.');
- }
-
- /**
- * Extract plain text from HTML for description field
- */
- private function extractPlainTextFromHtml(string $html): string
- {
- if (empty($html)) {
- return '';
- }
-
- // Decode HTML entities and strip tags
- $text = html_entity_decode(strip_tags($html));
-
- // Clean up whitespace
- $text = preg_replace('/\s+/', ' ', $text);
-
- // Limit to reasonable length for description
- return trim(substr($text, 0, 500));
- }
-
- /**
- * Clean HTML content for Filament rich editor
- */
- private function cleanHtmlForFilament(string $html): string
- {
- if (empty($html)) {
- return '';
- }
-
- // Convert escaped newlines to actual newlines
- $html = str_replace(['\\n', '\\r\\n', '\\r'], "\n", $html);
-
- // Decode HTML entities
- $html = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8');
-
- // Clean up excessive whitespace but preserve paragraph structure
- $html = preg_replace('/\s*\n\s*/', ' ', $html);
- $html = preg_replace('/[ \t]+/', ' ', $html);
-
- // Ensure paragraphs have proper spacing
- $html = str_replace('
', '
' . "\n" . '', $html);
-
- return trim($html);
- }
-}
diff --git a/app/Console/Commands/ImportImages.php b/app/Console/Commands/ImportImages.php
deleted file mode 100644
index 7c93d12..0000000
--- a/app/Console/Commands/ImportImages.php
+++ /dev/null
@@ -1,61 +0,0 @@
-option('entry-id');
- $entry = Entry::find($entryId);
-
- if (!$entry) {
- $this->error("Entry with ID {$entryId} not found");
- return;
- }
-
- $files = Storage::disk('public')->files('imported_images');
-
- if (empty($files)) {
- $this->info('No files found in storage/app/public/imported_images/');
- return;
- }
-
- $this->info("Found " . count($files) . " files to import");
-
- foreach ($files as $filePath) {
- try {
- $fullPath = storage_path('app/public/' . $filePath);
- $fileName = pathinfo($fullPath, PATHINFO_BASENAME);
-
- if (!file_exists($fullPath)) {
- $this->error("File not found: {$fullPath}");
- continue;
- }
-
- // Check if already exists
- $existingMedia = $entry->getMedia()->where('file_name', $fileName)->first();
- if ($existingMedia) {
- $this->info("Skipping existing: {$fileName}");
- continue;
- }
-
- $media = $entry->addMedia($fullPath)
- ->toMediaCollection('default');
-
- $this->info("Imported: {$fileName}");
- } catch (\Exception $e) {
- $this->error("Failed to import {$filePath}: " . $e->getMessage());
- }
- }
-
- $this->info('Import completed');
- }
-}
diff --git a/app/Console/Commands/RemediateBlogS3Images.php b/app/Console/Commands/RemediateBlogS3Images.php
deleted file mode 100644
index 2d3f531..0000000
--- a/app/Console/Commands/RemediateBlogS3Images.php
+++ /dev/null
@@ -1,61 +0,0 @@
-info('Entry ID: ' . $entry->id);
- if (str_contains($entry->content, $stringToFind)) {
- $this->info(' - Found occurrence in entry ID: ' . $entry->id);
- // Extract all image srcs that match the pattern
- preg_match_all('/src=\"http:\/\/127.0.0.1:8000\/storage([^\"]*)/', $entry->content, $matches);
- if (!empty($matches[0])) {
- foreach ($matches[0] as $i => $foundUrl) {
- $this->info(' - Found image src: ' . $foundUrl);
- // Compute the replacement for this specific image
- $relativePath = $matches[1][$i] ?? '';
- $newUrl = 'src="https://your-s3-bucket-here/yours-site-static-media-dir-here' . $relativePath;
- $this->info(' - Will replace with: ' . $newUrl);
- }
- }
- $updatedContent = \str_replace($stringToFind, $stringToReplace, $entry->content);
- // uncomment the following when your sure about the changes
- // $entry->content = $updatedContent;
- // $entry->save();
- // $this->info(' - Updated entry ID: ' . $entry->id);
- }
- }
- }
-}
diff --git a/app/Console/Commands/SendPreviewSiteBuiltNotification.php b/app/Console/Commands/SendPreviewSiteBuiltNotification.php
deleted file mode 100644
index b65e1a5..0000000
--- a/app/Console/Commands/SendPreviewSiteBuiltNotification.php
+++ /dev/null
@@ -1,38 +0,0 @@
-option('message');
-
- $this->info("Command :: Broadcasting preview site built notification: {$message}");
-
- PreviewSiteBuilt::dispatch($message, 'success');
-
- $this->info('Notification broadcasted successfully!');
- $this->info('Check your Filament admin panel for the toast notification.');
- }
-}
diff --git a/app/Events/PreviewSiteBuilt.php b/app/Events/PreviewSiteBuilt.php
deleted file mode 100644
index 4ec8cac..0000000
--- a/app/Events/PreviewSiteBuilt.php
+++ /dev/null
@@ -1,31 +0,0 @@
- ListAssets::route('/'),
- 'create' => CreateAsset::route('/create'),
- 'edit' => EditAsset::route('/{record}/edit'),
- ];
- }
-}
diff --git a/app/Filament/Resources/Assets/Pages/CreateAsset.php b/app/Filament/Resources/Assets/Pages/CreateAsset.php
deleted file mode 100644
index 867bcbc..0000000
--- a/app/Filament/Resources/Assets/Pages/CreateAsset.php
+++ /dev/null
@@ -1,11 +0,0 @@
-components([
- TextInput::make('alt_text'),
- SpatieMediaLibraryFileUpload::make('image')
- ->collection('default')
- ->image()
- ->disk('s3')
- ->visibility('public')
- ->label('Upload Image'),
- ]);
- }
-}
diff --git a/app/Filament/Resources/Assets/Tables/AssetsTable.php b/app/Filament/Resources/Assets/Tables/AssetsTable.php
deleted file mode 100644
index 3bd5fff..0000000
--- a/app/Filament/Resources/Assets/Tables/AssetsTable.php
+++ /dev/null
@@ -1,40 +0,0 @@
-columns([
- TextColumn::make('alt_text')
- ->searchable(),
- TextColumn::make('created_at')
- ->dateTime()
- ->sortable()
- ->toggleable(isToggledHiddenByDefault: true),
- TextColumn::make('updated_at')
- ->dateTime()
- ->sortable()
- ->toggleable(isToggledHiddenByDefault: true),
- ])
- ->filters([
- //
- ])
- ->recordActions([
- EditAction::make(),
- ])
- ->toolbarActions([
- BulkActionGroup::make([
- DeleteBulkAction::make(),
- ]),
- ]);
- }
-}
diff --git a/app/Filament/Resources/Categroys/CategroyResource.php b/app/Filament/Resources/Categroys/CategroyResource.php
deleted file mode 100644
index 323c762..0000000
--- a/app/Filament/Resources/Categroys/CategroyResource.php
+++ /dev/null
@@ -1,50 +0,0 @@
- ListCategroys::route('/'),
- 'create' => CreateCategroy::route('/create'),
- 'edit' => EditCategroy::route('/{record}/edit'),
- ];
- }
-}
diff --git a/app/Filament/Resources/Categroys/Pages/CreateCategroy.php b/app/Filament/Resources/Categroys/Pages/CreateCategroy.php
deleted file mode 100644
index 594d595..0000000
--- a/app/Filament/Resources/Categroys/Pages/CreateCategroy.php
+++ /dev/null
@@ -1,11 +0,0 @@
-components([
- TextInput::make('name')
- ->label('Category Name')
- ->required()
- ->maxLength(255),
- ]);
- }
-}
diff --git a/app/Filament/Resources/Categroys/Tables/CategroysTable.php b/app/Filament/Resources/Categroys/Tables/CategroysTable.php
deleted file mode 100644
index 211a64a..0000000
--- a/app/Filament/Resources/Categroys/Tables/CategroysTable.php
+++ /dev/null
@@ -1,34 +0,0 @@
-columns([
- TextColumn::make('name')
- ->label('Category Name')
- ->sortable()
- ->searchable(),
- ])
- ->filters([
- //
- ])
- ->recordActions([
- EditAction::make(),
- ])
- ->toolbarActions([
- BulkActionGroup::make([
- DeleteBulkAction::make(),
- ]),
- ]);
- }
-}
diff --git a/app/Filament/Resources/Changes/ChangeResource.php b/app/Filament/Resources/Changes/ChangeResource.php
deleted file mode 100644
index 5fb9dcf..0000000
--- a/app/Filament/Resources/Changes/ChangeResource.php
+++ /dev/null
@@ -1,53 +0,0 @@
- ListChanges::route('/'),
- 'create' => CreateChange::route('/create'),
- 'edit' => EditChange::route('/{record}/edit'),
- ];
- }
-}
diff --git a/app/Filament/Resources/Changes/Pages/CreateChange.php b/app/Filament/Resources/Changes/Pages/CreateChange.php
deleted file mode 100644
index 25d1806..0000000
--- a/app/Filament/Resources/Changes/Pages/CreateChange.php
+++ /dev/null
@@ -1,18 +0,0 @@
-id();
-
- return $data;
- }
-}
diff --git a/app/Filament/Resources/Changes/Pages/EditChange.php b/app/Filament/Resources/Changes/Pages/EditChange.php
deleted file mode 100644
index 93e57a0..0000000
--- a/app/Filament/Resources/Changes/Pages/EditChange.php
+++ /dev/null
@@ -1,16 +0,0 @@
-components([
- Textarea::make('note')
- ->label('Note')
- ->required(),
- FormSelect::make('type')
- ->label('Type')
- ->options([
- 'go-live' => 'Go Live',
- 'general' => 'General',
- ])
- ->default('go-live')
- ->required(),
- ]);
- }
-}
diff --git a/app/Filament/Resources/Changes/Tables/ChangesTable.php b/app/Filament/Resources/Changes/Tables/ChangesTable.php
deleted file mode 100644
index f8b99dc..0000000
--- a/app/Filament/Resources/Changes/Tables/ChangesTable.php
+++ /dev/null
@@ -1,34 +0,0 @@
-columns([
- TextColumn::make('note')
- ->label('Note')
- ->wrap(),
- TextColumn::make('type')
- ->label('Type'),
- TextColumn::make('user.name')
- ->label('User'),
- ])
- ->filters([
- //
- ])
- ->recordActions([])
- ->toolbarActions([
- BulkActionGroup::make([
- DeleteBulkAction::make(),
- ]),
- ]);
- }
-}
diff --git a/app/Filament/Resources/Entries/EntryResource.php b/app/Filament/Resources/Entries/EntryResource.php
deleted file mode 100644
index d404dd6..0000000
--- a/app/Filament/Resources/Entries/EntryResource.php
+++ /dev/null
@@ -1,58 +0,0 @@
- ListEntries::route('/'),
- 'create' => CreateEntry::route('/create'),
- 'view' => ViewEntry::route('/{record}'),
- 'edit' => EditEntry::route('/{record}/edit'),
- ];
- }
-}
diff --git a/app/Filament/Resources/Entries/Pages/CreateEntry.php b/app/Filament/Resources/Entries/Pages/CreateEntry.php
deleted file mode 100644
index 222b29b..0000000
--- a/app/Filament/Resources/Entries/Pages/CreateEntry.php
+++ /dev/null
@@ -1,11 +0,0 @@
-components([
- Select::make('type')
- ->options([
- 'article' => 'Article',
- 'card' => 'Card',
- 'text' => 'Text',
- 'image' => 'Image',
- ])
- ->default('article')
- ->required()
- ->live(),
- TextInput::make('title')
- ->required()
- ->live(onBlur: true)
- ->afterStateUpdated(function ($state, $set): void {
- $set('slug', Str::slug((string) $state));
- }),
- TextInput::make('slug')
- ->required()
- ->visible(fn($get) => $get('type') === 'article')
- ->dehydrated()
- ->readOnly(),
- Textarea::make('description')
- ->visible(fn($get) => $get('type') === 'article')
- ->columnSpanFull(),
- SpatieTagsInput::make('tags')
- ->type('entry-tags')
- ->visible(fn($get) => $get('type') === 'article')
- ->columnSpanFull(),
- SpatieMediaLibraryFileUpload::make('featured_image')
- ->multiple() // <- force array handling for Filament v4 bug
- ->visible(
- fn($get) =>
- $get('type') === 'article' || $get('type') === 'image'
- )
- ->collection('featured-image')
- ->image()
- ->imageEditor()
- ->disk(config('media-library.disk_name', 'public'))
- ->visibility('public')
- ->columnSpanFull()
- ->dehydrated(false)
- ->saveUploadedFileUsing(function ($file, $record) {
- if (is_array($file)) {
- $file = reset($file);
- }
-
- // Validate upload object early
- if (
- ! is_object($file) ||
- ! (method_exists($file, 'getRealPath') || method_exists($file, 'getPathname') || method_exists($file, 'getStream') || method_exists($file, 'store'))
- ) {
- Log::error('Invalid upload object', ['type' => gettype($file)]);
- throw new \Exception('Invalid upload object provided to saveUploadedFileUsing');
- }
-
- // Use safe variables for further calls
- $realPath = method_exists($file, 'getRealPath') ? $file->getRealPath() : null;
- $exists = $realPath ? file_exists($realPath) : false;
- $name = method_exists($file, 'getClientOriginalName') ? $file->getClientOriginalName() : null;
-
-
-
-
- Log::info('TemporaryUploadedFile Debug', [
- 'path' => $file->getRealPath(),
- 'exists' => file_exists($file->getRealPath()),
- 'name' => $file->getClientOriginalName(),
- 'temp_dir' => sys_get_temp_dir(),
- 'disk_root' => config('filesystems.disks.local.root'),
- 'is_readable' => is_readable($file->getRealPath()),
- 'is_writable' => is_writable($file->getRealPath()),
- ]);
-
- // Additional debug: Check if the file is being moved to livewire-tmp
- $livewireTmpPath = storage_path('framework/livewire-tmp');
- Log::info('Livewire Temp Directory Debug', [
- 'livewire_tmp_path' => $livewireTmpPath,
- 'exists' => file_exists($livewireTmpPath),
- 'is_writable' => is_writable($livewireTmpPath),
- ]);
-
- // Check if the file is being moved
- $tempFilePath = $file->getRealPath();
- $newFilePath = $livewireTmpPath . '/' . $file->getClientOriginalName();
- if (file_exists($tempFilePath)) {
- Log::info('File exists in temp directory', ['temp_file_path' => $tempFilePath]);
- } else {
- Log::error('File does not exist in temp directory', ['temp_file_path' => $tempFilePath]);
- }
-
-
-
-
-
-
- // $diskName = config('media-library.disk_name', 'public');
- $diskName = config('media-library.disk_name');
-
- if (config('logging.channels.' . config('logging.default') . '.level') === 'debug') {
- Log::info('Featured Image Upload Debug', [
- 'disk' => $diskName,
- 'file_name' => $file->getClientOriginalName(),
- 'file_size' => $file->getSize(),
- 'file_mime' => $file->getMimeType(),
- 'file_path' => $file->getRealPath(),
- 'record_id' => $record?->id,
- 'aws_config' => [
- 'bucket' => config('filesystems.disks.s3.bucket'),
- 'region' => config('filesystems.disks.s3.region'),
- 'key_exists' => !empty(config('filesystems.disks.s3.key')),
- 'secret_exists' => !empty(config('filesystems.disks.s3.secret')),
- ]
- ]);
- }
-
- try {
- if (!$record) {
- throw new \Exception('Record not found during upload');
- }
-
- // Test S3 connection if using S3
- if ($diskName === 's3') {
- $disk = \Storage::disk('s3');
-
- // Test basic S3 connectivity
- $testFile = 'test-' . time() . '.txt';
- $disk->put($testFile, 'test content');
- $disk->delete($testFile);
-
- if (config('logging.channels.' . config('logging.default') . '.level') === 'debug') {
- Log::info('S3 connectivity test passed');
- }
- }
-
- // Use addMedia with the file directly, not addMediaFromRequest
- // Generate secure filename similar to Livewire temp files
- $originalName = $file->getClientOriginalName();
- $extension = pathinfo($originalName, PATHINFO_EXTENSION);
- $baseName = pathinfo($originalName, PATHINFO_FILENAME);
-
- // Generate secure filename with encoded original name
- $encodedName = base64_encode($originalName);
- $secureFileName = Str::random(32) . '-meta' . $encodedName . '-.' . $extension;
-
-
-
-
-
- // Resolve possibly-relative Livewire temp path + safe fallbacks
- $realPath = $realPath ?: (method_exists($file, 'getRealPath') ? $file->getRealPath() : null);
- $candidates = [];
-
- if ($realPath && str_starts_with($realPath, '/')) {
- $candidates[] = $realPath;
- } else {
- $candidates[] = sys_get_temp_dir() . '/' . ltrim((string)$realPath, '/');
- $candidates[] = storage_path('framework/' . ltrim((string)$realPath, '/'));
- $candidates[] = storage_path(ltrim((string)$realPath, '/'));
- $candidates[] = base_path(ltrim((string)$realPath, '/'));
- }
-
- if ($realPath) {
- $candidates[] = storage_path('framework/livewire-tmp/' . basename($realPath));
- $candidates[] = sys_get_temp_dir() . '/' . basename($realPath);
- }
-
- // 1) Try storing to local disk (creates an absolute path we control)
- $stored = null;
- if (method_exists($file, 'store')) {
- try {
- $stored = $file->store('livewire-temp', 'local'); // storage/app/livewire-temp/...
- if ($stored && \Storage::disk('local')->exists($stored)) {
- $resolved = \Storage::disk('local')->path($stored);
- }
- } catch (\Throwable $e) {
- Log::debug('store() fallback failed', ['err' => $e->getMessage()]);
- }
- }
-
- // 2) If not resolved, check candidates
- if (! isset($resolved)) {
- foreach ($candidates as $p) {
- if ($p && file_exists($p)) {
- $resolved = $p;
- break;
- }
- }
- }
-
- // 3) If still not resolved, try stream -> temp file copy
- $is_tmp_copy = false;
- if (! isset($resolved)) {
- try {
- $stream = null;
- if (method_exists($file, 'getStream')) {
- $stream = $file->getStream();
- } elseif (method_exists($file, 'getRealPath') && is_readable($file->getRealPath())) {
- $stream = fopen($file->getRealPath(), 'r');
- }
-
- if ($stream) {
- $tmpPath = tempnam(sys_get_temp_dir(), 'filament-upload-');
- $out = fopen($tmpPath, 'w');
- stream_copy_to_stream($stream, $out);
- fclose($out);
- if (is_resource($stream)) {
- @fclose($stream);
- }
- $resolved = $tmpPath;
- $is_tmp_copy = true;
- }
- } catch (\Throwable $e) {
- Log::debug('stream fallback failed', ['err' => $e->getMessage()]);
- }
- }
-
- // 4) Still nothing -> error
- if (empty($resolved)) {
- Log::error('Featured Image Upload: could not resolve temp path', [
- 'original' => $realPath,
- 'checked_candidates' => $candidates,
- 'stored' => $stored,
- ]);
- throw new \Exception("File `{$realPath}` does not exist");
- }
-
- // 5) Use resolved absolute path
- $media = $record->addMedia($resolved)
- ->usingName($baseName)
- ->usingFileName($secureFileName)
- ->toMediaCollection('featured-image', $diskName);
-
- // 6) Cleanup short-lived artifacts
- if (! empty($is_tmp_copy) && file_exists($resolved)) {
- @unlink($resolved);
- }
- if (! empty($stored) && \Storage::disk('local')->exists($stored)) {
- \Storage::disk('local')->delete($stored);
- }
-
- Log::info('Featured image resolved', ['resolved' => $resolved, 'media_id' => $media->id ?? null]);
-
-
-
-
-
-
-
-
-
-
- if (config('logging.channels.' . config('logging.default') . '.level') === 'debug') {
- Log::info('Featured Image Upload Success', [
- 'media_id' => $media->id,
- 'media_url' => $media->getUrl(),
- 'media_path' => $media->getPathRelativeToRoot(),
- 'disk' => $media->disk
- ]);
- }
-
- return $media->getUrl();
- } catch (\Exception $e) {
- Log::error('Featured Image Upload Failed', [
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString(),
- 'disk' => $diskName,
- 'file_name' => $file->getClientOriginalName()
- ]);
-
-
- // Also show error to user
- \Filament\Notifications\Notification::make()
- ->danger()
- ->title('Upload Failed')
- ->body($e->getMessage())
- ->persistent()
- ->send();
-
- throw $e;
- }
- })
- ->hintAction(
- Action::make('featured_picker')
- ->label('Featured Image from Gallery')
- ->icon('heroicon-m-photo')
- ->extraAttributes(['id' => 'featured-picker-button'])
- ->schema([
- Select::make('image_id')
- ->label('Select an existing image')
- ->allowHtml()
- ->options(function () {
- $currentDisk = config('media-library.disk_name', 'public');
- return Media::where('disk', $currentDisk)
- ->latest()
- ->limit(50)
- ->get(['id', 'file_name', 'name', 'disk'])
- ->mapWithKeys(function (Media $item) {
- try {
- $url = $item->getUrl();
- $fileName = e($item->file_name);
- $name = e($item->name ?? '');
-
- $html = "
" .
- "

" .
- "
" .
- "{$name}" .
- "{$fileName}" .
- '
';
-
- return [$item->id => $html];
- } catch (\Exception $e) {
- return [];
- }
- })->toArray();
- })
- ->searchable()
- ->preload()
- ->required(),
- ])
- ->action(function (array $data, SpatieMediaLibraryFileUpload $component): void {
- $record = $component->getRecord();
- $diskName = config('media-library.disk_name', 'public');
-
- if (config('logging.channels.' . config('logging.default') . '.level') === 'debug') {
- Log::info('Featured Image Picker Action Debug', [
- 'disk' => $diskName,
- 'record_id' => $record?->id,
- 'image_id' => $data['image_id'] ?? null
- ]);
- }
-
- if (! $record) {
- \Filament\Notifications\Notification::make()
- ->warning()
- ->title('Save the entry first')
- ->send();
-
- return;
- }
-
- if (! $data['image_id']) {
- return;
- }
-
- $sourceMedia = Media::find($data['image_id']);
- if (! $sourceMedia) {
- Log::error('Source media not found', ['image_id' => $data['image_id']]);
- \Filament\Notifications\Notification::make()
- ->danger()
- ->title('Source image not found in database')
- ->send();
- return;
- }
-
- try {
- // For S3, we need to handle file copying differently
- if ($sourceMedia->disk === 's3') {
- if (config('logging.channels.' . config('logging.default') . '.level') === 'debug') {
- Log::info('Copying S3 media to new collection', [
- 'source_disk' => $sourceMedia->disk,
- 'source_path' => $sourceMedia->getPathRelativeToRoot(),
- 'target_disk' => $diskName
- ]);
- }
-
- // Copy from S3 to S3 or download temporarily
- $sourceDisk = \Storage::disk($sourceMedia->disk);
- $sourceContent = $sourceDisk->get($sourceMedia->getPathRelativeToRoot());
-
- if (!$sourceContent) {
- throw new \Exception('Could not read source file from S3');
- }
-
- $tempCopy = sys_get_temp_dir() . '/' . uniqid() . '_' . $sourceMedia->file_name;
- file_put_contents($tempCopy, $sourceContent);
- } else {
- // Local file handling
- $sourceFile = $sourceMedia->getPath();
- if (! file_exists($sourceFile)) {
- throw new \Exception('Source file not found on disk');
- }
-
- $tempCopy = sys_get_temp_dir() . '/' . uniqid() . '_' . $sourceMedia->file_name;
- copy($sourceFile, $tempCopy);
- }
-
- // Verify record has ID
- if (! $record->id) {
- \Filament\Notifications\Notification::make()
- ->danger()
- ->title('Entry must be saved first')
- ->send();
- return;
- }
-
- // Add the copy to the entry's featured-image collection
- $newMedia = $record->addMedia($tempCopy)
- ->usingName($sourceMedia->name ?: pathinfo($sourceMedia->file_name, PATHINFO_FILENAME))
- ->usingFileName($sourceMedia->file_name)
- ->toMediaCollection('featured-image', $diskName);
-
- if (config('logging.channels.' . config('logging.default') . '.level') === 'debug') {
- Log::info('Featured Image Picker Success', [
- 'new_media_id' => $newMedia->id,
- 'new_media_disk' => $newMedia->disk,
- 'new_media_url' => $newMedia->getUrl()
- ]);
- }
-
- // Dispatch event for app.js to handle
- $component->getLivewire()->dispatch('featured-image-added', ['mediaId' => $newMedia->id]);
-
- \Filament\Notifications\Notification::make()
- ->success()
- ->title('Image added to featured image')
- ->send();
- } catch (\Exception $e) {
- Log::error('Featured Image Picker Failed', [
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString(),
- 'source_media_id' => $data['image_id'],
- 'disk' => $diskName
- ]);
-
- \Filament\Notifications\Notification::make()
- ->danger()
- ->title('Error: ' . $e->getMessage())
- ->persistent()
- ->send();
- } finally {
- if (isset($tempCopy) && file_exists($tempCopy)) {
- unlink($tempCopy);
- }
- }
- })
- ),
- Toggle::make('is_published')
- ->required(),
- Toggle::make('is_featured')
- ->required(),
- TextInput::make('priority')
- ->label('Priority')
- ->numeric()
- ->default(0)
- ->required(),
- DatePicker::make('published_at')
- ->visible(fn($get) => $get('type') === 'article'),
- Select::make('category_id')
- ->label('Category')
- ->options(function () {
- return Category::all()
- ->pluck('name', 'id')
- ->toArray();
- })
- ->searchable(),
- TextInput::make('call_to_action_text')
- ->label('Call to Action Text')
- ->visible(fn($get) => $get('type') !== 'article'),
- TextInput::make('call_to_action_link')
- ->label('Call to Action URL')
- ->visible(fn($get) => $get('type') !== 'article'),
-
- RichEditor::make('content')
- ->visible(fn($get) => $get('type') !== 'image')
- ->columnSpanFull()
- ->hintAction(
- Action::make('picker')
- ->label('Gallery Picker')
- ->icon('heroicon-m-photo')
- ->schema([
- Select::make('image_url')
- ->label('Select an existing image')
- ->allowHtml()
- ->options(function () {
- return Media::latest()
- ->limit(30) // Limit to 30 most recent items for performance
- ->get(['id', 'file_name', 'name', 'uuid', 'collection_name', 'model_type', 'model_id', 'disk'])
- ->filter(function (Media $item) {
- // Only include media items that have a valid disk
- return $item->disk !== null;
- })
- ->mapWithKeys(function (Media $item) {
- try {
- $url = $item->getUrl();
- } catch (\Exception $e) {
- // Skip items that can't generate URLs
- return [];
- }
-
- $fileName = e($item->file_name);
- $name = e($item->name ?? '');
-
- // Smaller image preview for better performance
- $html = "" .
- "

" .
- "
" .
- "{$name}" .
- "{$fileName}" .
- '
';
-
- return [$url => $html];
- })->toArray();
- })
- ->searchable()
- ->preload()
- ->required(),
- ])
- ->action(function (array $data, RichEditor $component) {
- // We dispatch the URL to the browser to be inserted into TipTap
- $component->getLivewire()->dispatch('insert-editor-content', [
- 'statePath' => $component->getStatePath(),
- 'html' => "
",
- ]);
- })
- ),
-
- ]);
- }
-}
diff --git a/app/Filament/Resources/Entries/Schemas/EntryInfolist.php b/app/Filament/Resources/Entries/Schemas/EntryInfolist.php
deleted file mode 100644
index be741bc..0000000
--- a/app/Filament/Resources/Entries/Schemas/EntryInfolist.php
+++ /dev/null
@@ -1,42 +0,0 @@
-components([
- TextEntry::make('title'),
- TextEntry::make('slug'),
- TextEntry::make('description')
- ->placeholder('-')
- ->columnSpanFull(),
- SpatieMediaLibraryImageEntry::make('featured_image')
- ->collection('featured-image')
- ->columnSpanFull(),
- IconEntry::make('is_published')
- ->boolean(),
- IconEntry::make('is_featured')
- ->boolean(),
- TextEntry::make('published_at')
- ->date()
- ->placeholder('-'),
- TextEntry::make('content')
- ->placeholder('-')
- ->columnSpanFull(),
- TextEntry::make('created_at')
- ->dateTime()
- ->placeholder('-'),
- TextEntry::make('updated_at')
- ->dateTime()
- ->placeholder('-'),
- ]);
- }
-}
diff --git a/app/Filament/Resources/Entries/Tables/EntriesTable.php b/app/Filament/Resources/Entries/Tables/EntriesTable.php
deleted file mode 100644
index 723c1fd..0000000
--- a/app/Filament/Resources/Entries/Tables/EntriesTable.php
+++ /dev/null
@@ -1,73 +0,0 @@
-columns([
- TextColumn::make('id')
- ->label('ID')
- ->sortable(query: function ($query, $direction) {
- $query->orderBy('id', $direction);
- }),
- SpatieMediaLibraryImageColumn::make('featured_image')
- ->collection('featured-image')
- ->label('Image')
- ->circular()
- ->stacked()
- ->limit(3),
- TextColumn::make('title')
- ->searchable()
- ->sortable(),
- TextColumn::make('category.name')
- ->label('Category')
- ->sortable(query: function ($query, $direction) {
- $query->join('categories', 'entries.category_id', '=', 'categories.id')
- ->orderBy('categories.name', $direction)
- ->select('entries.*');
- })
- ->searchable(),
- IconColumn::make('is_published')
- ->label('pub')
- ->boolean(),
- IconColumn::make('is_featured')
- ->label('feat')
- ->boolean(),
- TextColumn::make('published_at')
- ->date()
- ->sortable(),
- TextColumn::make('created_at')
- ->dateTime()
- ->sortable()
- ->toggleable(isToggledHiddenByDefault: true),
- TextColumn::make('updated_at')
- ->dateTime()
- ->sortable()
- ->toggleable(isToggledHiddenByDefault: true),
- ])
- ->filters([
- //
- ])
- ->recordActions([
- ViewAction::make(),
- EditAction::make(),
- ])
- ->toolbarActions([
- BulkActionGroup::make([
- DeleteBulkAction::make(),
- ]),
- ]);
- }
-}
diff --git a/app/Filament/Resources/Media/MediaResource.php b/app/Filament/Resources/Media/MediaResource.php
deleted file mode 100644
index ecd739d..0000000
--- a/app/Filament/Resources/Media/MediaResource.php
+++ /dev/null
@@ -1,60 +0,0 @@
- ListMedia::route('/'),
- 'create' => CreateMedia::route('/create'),
- 'view' => ViewMedia::route('/{record}'),
- 'edit' => EditMedia::route('/{record}/edit'),
- ];
- }
-}
diff --git a/app/Filament/Resources/Media/Pages/CreateMedia.php b/app/Filament/Resources/Media/Pages/CreateMedia.php
deleted file mode 100644
index c652a96..0000000
--- a/app/Filament/Resources/Media/Pages/CreateMedia.php
+++ /dev/null
@@ -1,61 +0,0 @@
-uploadedFile = $file;
-
- // Set required fields for Media model
- $data['model_type'] = $data['model_type'] ?? 'temp';
- $data['model_id'] = $data['model_id'] ?? 0;
- $data['collection_name'] = $data['collection_name'] ?? 'default';
- $data['disk'] = $data['disk'] ?? 'public';
- $data['file_name'] = $file ? basename($file) : '';
- $data['mime_type'] = $file && Storage::disk('public')->exists($file)
- ? Storage::disk('public')->mimeType($file)
- : 'application/octet-stream';
- $data['size'] = $file && Storage::disk('public')->exists($file)
- ? Storage::disk('public')->size($file)
- : 0;
- $data['manipulations'] = [];
- $data['custom_properties'] = [];
- $data['generated_conversions'] = [];
- $data['responsive_images'] = [];
-
- return $data;
- }
-
- protected function afterCreate(): void
- {
- if ($this->uploadedFile && $this->record) {
- $disk = Storage::disk('public');
-
- // Create the directory for this media ID (Spatie structure: {id}/{filename})
- $mediaDirectory = (string) $this->record->id;
- $disk->makeDirectory($mediaDirectory);
-
- // Move file from temporary upload location to Spatie's expected location
- if ($disk->exists($this->uploadedFile)) {
- $newPath = $mediaDirectory.'/'.$this->record->file_name;
- $disk->move($this->uploadedFile, $newPath);
- }
- }
- }
-}
diff --git a/app/Filament/Resources/Media/Pages/EditMedia.php b/app/Filament/Resources/Media/Pages/EditMedia.php
deleted file mode 100644
index b6f4cdb..0000000
--- a/app/Filament/Resources/Media/Pages/EditMedia.php
+++ /dev/null
@@ -1,72 +0,0 @@
-record->getPathRelativeToRoot()) {
- $this->uploadedFile = $file;
-
- // Keep the original file_name to prevent breaking existing references
- // $data['file_name'] is not updated - we preserve the original filename
- $data['mime_type'] = Storage::disk('public')->exists($file)
- ? Storage::disk('public')->mimeType($file)
- : 'application/octet-stream';
- $data['size'] = Storage::disk('public')->exists($file)
- ? Storage::disk('public')->size($file)
- : 0;
- }
-
- return $data;
- }
-
- protected function afterSave(): void
- {
- if ($this->uploadedFile && $this->record) {
- $disk = Storage::disk('public');
- $mediaDirectory = (string) $this->record->id;
-
- // Delete old file if it exists
- $oldPath = $mediaDirectory.'/'.$this->record->getOriginal('file_name');
- if ($disk->exists($oldPath)) {
- $disk->delete($oldPath);
- }
-
- // Move new file to Spatie's expected location using the original filename
- if ($disk->exists($this->uploadedFile)) {
- $disk->makeDirectory($mediaDirectory);
- // Use the original file_name to preserve existing references
- $newPath = $mediaDirectory.'/'.$this->record->file_name;
- $disk->move($this->uploadedFile, $newPath);
- }
-
- // Redirect to the same page to refresh the form state
- $this->redirect(static::getUrl(['record' => $this->record]), navigate: true);
- }
- }
-}
diff --git a/app/Filament/Resources/Media/Pages/ListMedia.php b/app/Filament/Resources/Media/Pages/ListMedia.php
deleted file mode 100644
index 1552945..0000000
--- a/app/Filament/Resources/Media/Pages/ListMedia.php
+++ /dev/null
@@ -1,19 +0,0 @@
-components([
- TextInput::make('name')
- ->required()
- ->maxLength(255),
- TextInput::make('collection_name')
- ->default('default')
- ->required()
- ->maxLength(255),
- Hidden::make('disk')
- ->default('public'),
- FileUpload::make('file')
- ->multiple() // workaround for Filament v4 single-file bug
- ->label('File')
- ->imageEditor()
- ->imageEditorAspectRatios([
- '16:9',
- '4:3',
- '1:1',
- ])
- ->columnSpanFull()
- ->disk('s3')
- ->directory('media')
- ->visibility('public')
- ->acceptedFileTypes(['image/*', 'application/pdf'])
- ->maxSize(10240)
- ->required(fn($context) => $context === 'create')
-
-
- ->afterStateHydrated(function (FileUpload $component, $state, $record): void {
- Log::info('MediaForm afterStateHydrated invoked', ['record_id' => $record?->id, 'state' => $state]);
-
- try {
- if (! $record) {
- return;
- }
-
- $media = $record;
- if (! $media instanceof SpatieMedia) {
- return;
- }
-
- // Construct the correct path: {media_id}/{filename}
- $path = $media->id . '/' . $media->file_name;
-
- try {
- $disk = $media->disk ?? 'public';
- if (Storage::disk($disk)->exists($path)) {
- $component->state($path);
- }
- } catch (\Throwable $e) {
- Log::error('MediaForm afterStateHydrated storage check failed', [
- 'err' => $e->getMessage(),
- 'trace' => $e->getTraceAsString(),
- 'disk' => $media->disk ?? null,
- 'path' => $path,
- ]);
- }
- } catch (\Throwable $e) {
- Log::error('MediaForm afterStateHydrated unhandled', [
- 'err' => $e->getMessage(),
- 'trace' => $e->getTraceAsString(),
- 'record' => $record?->id,
- 'state' => $state,
- ]);
- throw $e;
- }
- }),
-
-
-
- ]);
- }
-}
diff --git a/app/Filament/Resources/Media/Schemas/MediaInfolist.php b/app/Filament/Resources/Media/Schemas/MediaInfolist.php
deleted file mode 100644
index dfe4801..0000000
--- a/app/Filament/Resources/Media/Schemas/MediaInfolist.php
+++ /dev/null
@@ -1,36 +0,0 @@
-components([
- ImageEntry::make('file_name')
- ->label('Preview')
- ->getStateUsing(fn ($record) => $record->getUrl())
- ->visible(fn ($record) => $record->mime_type && str_starts_with($record->mime_type, 'image/')),
- TextEntry::make('name'),
- TextEntry::make('file_name'),
- TextEntry::make('mime_type'),
- TextEntry::make('collection_name'),
- TextEntry::make('size')
- ->formatStateUsing(fn ($state) => number_format($state / 1024, 2).' KB'),
- TextEntry::make('model_type')
- ->label('Attached to Model'),
- TextEntry::make('model_id'),
- TextEntry::make('custom_properties')
- ->formatStateUsing(fn ($state) => json_encode($state, JSON_PRETTY_PRINT)),
- TextEntry::make('created_at')
- ->dateTime(),
- TextEntry::make('updated_at')
- ->dateTime(),
- ]);
- }
-}
diff --git a/app/Filament/Resources/Media/Tables/MediaTable.php b/app/Filament/Resources/Media/Tables/MediaTable.php
deleted file mode 100644
index c45730c..0000000
--- a/app/Filament/Resources/Media/Tables/MediaTable.php
+++ /dev/null
@@ -1,95 +0,0 @@
-modifyQueryUsing(fn($query) => $query->where('collection_name', '!=', 'avatars'))
- ->columns([
- ImageColumn::make('url')
- ->label('Preview')
- ->getStateUsing(
- fn($record) =>
- // Prefer the stored path produced by Filament's FileUpload (saved in custom_properties),
- // fall back to Spatie's getUrl() when no stored_path exists.
- ($record->getCustomProperty('stored_path'))
- ? Storage::url($record->getCustomProperty('stored_path'))
- : $record->getUrl()
- )
- ->height(40)
- ->width(40),
- TextColumn::make('name')
- ->searchable(),
- TextColumn::make('file_name')
- ->searchable(),
- TextColumn::make('collection_name')
- ->badge(),
- TextColumn::make('mime_type'),
- TextColumn::make('size')
- ->formatStateUsing(fn($state) => number_format($state / 1024, 2) . ' KB'),
- TextColumn::make('created_at')
- ->dateTime(),
- ])
- ->filters([
- SelectFilter::make('collection_name')
- ->options([
- 'images' => 'Images',
- 'documents' => 'Documents',
- ]),
- ])
- ->recordActions([
- // EditAction::make(),
- DeleteAction::make()
- ->action(function (Media $record) {
- // Delete the actual stored file path if we saved one, otherwise fall back to the Spatie path.
- $stored = $record->getCustomProperty('stored_path');
- if ($stored) {
- Storage::disk($record->disk)->delete($stored);
- } else {
- Storage::disk($record->disk)->delete($record->getPath());
- }
-
- $record->delete();
- }),
- ])
- ->toolbarActions([
-
- Action::make('add')
- ->label('Add')
- ->icon('heroicon-o-plus')
- ->url(fn() => url('admin/assets/create'))
- ->color('primary'),
-
- BulkActionGroup::make([
- DeleteBulkAction::make()
- ->action(function (Collection $records) {
- $records->each(function (Media $record) {
- $stored = $record->getCustomProperty('stored_path');
- if ($stored) {
- Storage::disk($record->disk)->delete($stored);
- } else {
- Storage::disk($record->disk)->delete($record->getPath());
- }
- $record->delete();
- });
- }),
- ]),
- ]);
- }
-}
diff --git a/app/Filament/Resources/TextWidgets/Pages/CreateTextWidget.php b/app/Filament/Resources/TextWidgets/Pages/CreateTextWidget.php
deleted file mode 100644
index 24451ee..0000000
--- a/app/Filament/Resources/TextWidgets/Pages/CreateTextWidget.php
+++ /dev/null
@@ -1,11 +0,0 @@
-components([
- TextInput::make('title')
- ->required()
- ->live(onBlur: true),
- TextInput::make('description')
- ->nullable(),
- Textarea::make('content')
- ->rows(5)
- ->columnSpanFull(),
- Select::make('category_id')
- ->label('Category')
- ->options(function () {
- return Category::all()
- ->pluck('name', 'id')
- ->toArray();
- })
- ->searchable(),
-
- ]);
- }
-}
diff --git a/app/Filament/Resources/TextWidgets/Tables/TextWidgetsTable.php b/app/Filament/Resources/TextWidgets/Tables/TextWidgetsTable.php
deleted file mode 100644
index cc9b034..0000000
--- a/app/Filament/Resources/TextWidgets/Tables/TextWidgetsTable.php
+++ /dev/null
@@ -1,42 +0,0 @@
-columns([
- TextColumn::make('title')
- ->label('Title')
- ->sortable()
- ->searchable(),
- TextColumn::make('created_at')
- ->label('Created')
- ->dateTime('M d, Y H:i')
- ->sortable(),
- TextColumn::make('updated_at')
- ->label('Updated')
- ->dateTime('M d, Y H:i')
- ->sortable(),
- ])
- ->filters([
- //
- ])
- ->recordActions([
- EditAction::make(),
- ])
- ->toolbarActions([
- BulkActionGroup::make([
- DeleteBulkAction::make(),
- ]),
- ]);
- }
-}
diff --git a/app/Filament/Resources/TextWidgets/TextWidgetResource.php b/app/Filament/Resources/TextWidgets/TextWidgetResource.php
deleted file mode 100644
index a0e1ec4..0000000
--- a/app/Filament/Resources/TextWidgets/TextWidgetResource.php
+++ /dev/null
@@ -1,53 +0,0 @@
- ListTextWidgets::route('/'),
- 'create' => CreateTextWidget::route('/create'),
- 'edit' => EditTextWidget::route('/{record}/edit'),
- ];
- }
-}
diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php
deleted file mode 100644
index feda710..0000000
--- a/app/Http/Controllers/CategoryController.php
+++ /dev/null
@@ -1,61 +0,0 @@
-validated()));
- }
-
- /**
- * Display the specified resource.
- */
- public function show(Category $category)
- {
- return new CategoryResource($category);
- }
-
- /**
- * Update the specified resource in storage.
- */
- public function update(UpdateCategoryRequest $request, Category $category)
- {
- $category->update($request->validated());
-
- return new CategoryResource($category);
- }
-
- /**
- * Remove the specified resource from storage.
- */
- public function destroy(Category $category)
- {
- $user = auth()->user();
-
- if (! $user || $user->email !== config('app.admin_email')) {
- return response()->json(['message' => 'Forbidden'], 403);
- }
-
- $category->delete();
-
- return response()->noContent();
- }
-}
diff --git a/app/Http/Controllers/EntryController.php b/app/Http/Controllers/EntryController.php
deleted file mode 100644
index 88f45e4..0000000
--- a/app/Http/Controllers/EntryController.php
+++ /dev/null
@@ -1,93 +0,0 @@
-get());
- }
-
- /**
- * Store a newly created resource in storage.
- */
- public function store(Request $request)
- {
- $user = Auth::user();
-
- if (! $user || $user->email !== config('app.admin_email')) {
- return response()->json(['message' => 'Forbidden'], 403);
- }
-
- $validated = $request->validate([
- 'title' => 'required|string|max:255',
- 'content' => 'required|string',
- ]);
-
- $validated['slug'] = $this->generateUniqueSlug($validated['title']);
-
- return new EntryResource(Entry::create($validated));
- }
-
- private function generateUniqueSlug(string $title): string
- {
- do {
- $slug = Str::slug($title).'-'.Str::random(8);
- } while (Entry::where('slug', $slug)->exists());
-
- return $slug;
- }
-
- /**
- * Display the specified resource.
- */
- public function show(Entry $entry)
- {
- $this->authorize('view', $entry);
-
- return new EntryResource($entry);
- }
-
- /**
- * Update the specified resource in storage.
- */
- public function update(Request $request, Entry $entry)
- {
- $validated = $request->validate([
- 'title' => 'sometimes|required|string|max:255',
- 'content' => 'sometimes|required|string',
- ]);
-
- $entry->update($validated);
-
- return new EntryResource($entry);
- }
-
- /**
- * Remove the specified resource from storage.
- */
- public function destroy(Entry $entry)
- {
- $entry->delete();
-
- return response()->noContent();
- }
-
- /**
- * Determine if the user is authorized to make this request.
- */
- public function authorize(): bool
- {
- return Auth::check();
- }
-}
diff --git a/app/Http/Controllers/NotificationController.php b/app/Http/Controllers/NotificationController.php
deleted file mode 100644
index fe0a97d..0000000
--- a/app/Http/Controllers/NotificationController.php
+++ /dev/null
@@ -1,28 +0,0 @@
-validated()['message'];
-
- PreviewSiteBuilt::dispatch($message, 'success');
-
- return response()->json([
- 'success' => true,
- 'message' => 'Preview site built notification sent successfully',
- 'data' => [
- 'notification_message' => $message,
- ],
- ]);
- }
-}
diff --git a/app/Http/Controllers/TextWidgetController.php b/app/Http/Controllers/TextWidgetController.php
deleted file mode 100644
index 53f89f3..0000000
--- a/app/Http/Controllers/TextWidgetController.php
+++ /dev/null
@@ -1,75 +0,0 @@
-json([
- 'data' => TextWidget::with('category')->get()->map(fn ($tw) => new TextWidgetResource($tw))
- ]);
- }
-
- /**
- * Store a newly created resource in storage.
- */
- public function store(Request $request)
- {
- $user = Auth::user();
-
- if (! $user || $user->email !== config('app.admin_email')) {
- return response()->json(['message' => 'Forbidden'], 403);
- }
-
- $validated = $request->validate([
- 'title' => 'required|string|max:255',
- 'description' => 'nullable|string',
- 'content' => 'required|string',
- ]);
-
- return new TextWidgetResource(TextWidget::create($validated));
- }
-
- /**
- * Display the specified resource.
- */
- public function show(TextWidget $textWidget)
- {
- return new TextWidgetResource($textWidget->load('category'));
- }
-
- /**
- * Update the specified resource in storage.
- */
- public function update(Request $request, TextWidget $textWidget)
- {
- $validated = $request->validate([
- 'title' => 'sometimes|required|string|max:255',
- 'description' => 'sometimes|nullable|string',
- 'content' => 'sometimes|required|string',
- ]);
-
- $textWidget->update($validated);
-
- return new TextWidgetResource($textWidget->load('category'));
- }
-
- /**
- * Remove the specified resource from storage.
- */
- public function destroy(TextWidget $textWidget)
- {
- $textWidget->delete();
-
- return response()->noContent();
- }
-}
diff --git a/app/Http/Requests/SendPreviewSiteBuiltNotificationRequest.php b/app/Http/Requests/SendPreviewSiteBuiltNotificationRequest.php
deleted file mode 100644
index 575db16..0000000
--- a/app/Http/Requests/SendPreviewSiteBuiltNotificationRequest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-user() && $this->user()->email === config('app.admin_email');
- }
-
- /**
- * Get the validation rules that apply to the request.
- *
- * @return array|string>
- */
- public function rules(): array
- {
- return [
- 'message' => 'required|string|max:255',
- ];
- }
-}
diff --git a/app/Http/Requests/StoreCategoryRequest.php b/app/Http/Requests/StoreCategoryRequest.php
deleted file mode 100644
index da5e2ce..0000000
--- a/app/Http/Requests/StoreCategoryRequest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-user() && $this->user()->email === config('app.admin_email');
- }
-
- /**
- * Get the validation rules that apply to the request.
- *
- * @return array|string>
- */
- public function rules(): array
- {
- return [
- 'name' => 'required|string|max:255|unique:categories,name',
- ];
- }
-}
diff --git a/app/Http/Requests/StoreEntryRequest.php b/app/Http/Requests/StoreEntryRequest.php
deleted file mode 100644
index ef2ec7b..0000000
--- a/app/Http/Requests/StoreEntryRequest.php
+++ /dev/null
@@ -1,29 +0,0 @@
-user() && $this->user()->email === config('app.admin_email');
- }
-
- /**
- * Get the validation rules that apply to the request.
- *
- * @return array|string>
- */
- public function rules(): array
- {
- return [
- 'title' => 'required|string|max:255',
- 'content' => 'required|string',
- ];
- }
-}
diff --git a/app/Http/Requests/UpdateCategoryRequest.php b/app/Http/Requests/UpdateCategoryRequest.php
deleted file mode 100644
index 53e0b06..0000000
--- a/app/Http/Requests/UpdateCategoryRequest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-user() && $this->user()->email === config('app.admin_email');
- }
-
- /**
- * Get the validation rules that apply to the request.
- *
- * @return array|string>
- */
- public function rules(): array
- {
- return [
- 'name' => 'sometimes|required|string|max:255|unique:categories,name,'.$this->category->id,
- ];
- }
-}
diff --git a/app/Http/Requests/UpdateEntryRequest.php b/app/Http/Requests/UpdateEntryRequest.php
deleted file mode 100644
index 3d85337..0000000
--- a/app/Http/Requests/UpdateEntryRequest.php
+++ /dev/null
@@ -1,29 +0,0 @@
-user() && $this->user()->email === config('app.admin_email');
- }
-
- /**
- * Get the validation rules that apply to the request.
- *
- * @return array|string>
- */
- public function rules(): array
- {
- return [
- 'title' => 'sometimes|required|string|max:255',
- 'content' => 'sometimes|required|string',
- ];
- }
-}
diff --git a/app/Http/Resources/CategoryResource.php b/app/Http/Resources/CategoryResource.php
deleted file mode 100644
index 5c82c39..0000000
--- a/app/Http/Resources/CategoryResource.php
+++ /dev/null
@@ -1,24 +0,0 @@
-
- */
- public function toArray(Request $request): array
- {
- return [
- 'id' => $this->id,
- 'name' => $this->name,
- 'created_at' => $this->created_at,
- 'updated_at' => $this->updated_at,
- ];
- }
-}
diff --git a/app/Http/Resources/EntryResource.php b/app/Http/Resources/EntryResource.php
deleted file mode 100644
index 36377b4..0000000
--- a/app/Http/Resources/EntryResource.php
+++ /dev/null
@@ -1,36 +0,0 @@
-
- */
- public function toArray(Request $request): array
- {
- return [
- 'id' => $this->id,
- 'title' => $this->title,
- 'slug' => $this->slug,
- 'description' => $this->description,
- 'is_published' => $this->is_published,
- 'is_featured' => $this->is_featured,
- 'published_at' => $this->published_at,
- 'content' => $this->content,
- 'category' => $this->category->name ?? null,
- 'featured_image_url' => $this->getFirstMediaUrl('featured-image') ?: null,
- 'call_to_action_text' => $this->call_to_action_text,
- 'call_to_action_link' => $this->call_to_action_link,
- 'created_at' => $this->created_at,
- 'updated_at' => $this->updated_at,
- 'priority' => $this->priority,
- 'type' => $this->type,
- ];
- }
-}
diff --git a/app/Http/Resources/TextWidgetResource.php b/app/Http/Resources/TextWidgetResource.php
deleted file mode 100644
index 141452e..0000000
--- a/app/Http/Resources/TextWidgetResource.php
+++ /dev/null
@@ -1,27 +0,0 @@
-
- */
- public function toArray(Request $request): array
- {
- return [
- 'id' => $this->id,
- 'title' => $this->title,
- 'description' => $this->description,
- 'content' => $this->content,
- 'category' => $this->category->name ?? null,
- 'created_at' => $this->created_at,
- 'updated_at' => $this->updated_at,
- ];
- }
-}
diff --git a/app/Jobs/ProcessChangeUpdate.php b/app/Jobs/ProcessChangeUpdate.php
deleted file mode 100644
index 4f937ed..0000000
--- a/app/Jobs/ProcessChangeUpdate.php
+++ /dev/null
@@ -1,36 +0,0 @@
-changeId}, action={$this->action}");
- (new ProcessUpdateService)->processUpdate($this->changeId, $this->action, $this->type);
- }
-}
diff --git a/app/Jobs/ProcessEntryUpdate.php b/app/Jobs/ProcessEntryUpdate.php
deleted file mode 100644
index f97ea07..0000000
--- a/app/Jobs/ProcessEntryUpdate.php
+++ /dev/null
@@ -1,34 +0,0 @@
-processUpdate($this->entryId, $this->action, $this->type);
- }
-}
diff --git a/app/Livewire/GalleryPicker.php b/app/Livewire/GalleryPicker.php
deleted file mode 100644
index c1da485..0000000
--- a/app/Livewire/GalleryPicker.php
+++ /dev/null
@@ -1,108 +0,0 @@
-entryId = $entryId;
- $this->loadMediaItems();
- $this->showModal = true;
- }
-
- public function loadMediaItems(): void
- {
- $this->mediaItems = Media::where('model_type', 'temp')
- ->where('model_id', 0)
- ->where('disk', 'public')
- ->latest()
- ->limit(30)
- ->get(['id', 'file_name', 'name', 'disk'])
- ->toArray();
- }
-
- public function selectMedia($mediaId): void
- {
- $this->selectedMediaId = $mediaId;
- }
-
- public function copyToEntry(): void
- {
- if (!$this->selectedMediaId || !$this->entryId) {
- $this->dispatch('notify-error', ['message' => 'Please select an image']);
- return;
- }
-
- $sourceMedia = Media::find($this->selectedMediaId);
- if (!$sourceMedia) {
- $this->dispatch('notify-error', ['message' => 'Media not found']);
- return;
- }
-
- try {
- // Get the entry
- $entry = \App\Models\Entry::find($this->entryId);
- if (!$entry) {
- $this->dispatch('notify-error', ['message' => 'Entry not found']);
- return;
- }
-
- // Get source file
- $sourceFile = $sourceMedia->getPath();
- if (!file_exists($sourceFile)) {
- $this->dispatch('notify-error', ['message' => 'Source file not found']);
- return;
- }
-
- // Create temp copy
- $tempCopy = sys_get_temp_dir() . '/' . uniqid() . '_' . $sourceMedia->file_name;
- copy($sourceFile, $tempCopy);
-
- try {
- // Clear existing featured image
- $entry->clearMediaCollection('featured-image');
-
- // Add to entry
- $newMedia = $entry->addMedia($tempCopy)
- ->usingName($sourceMedia->name ?: pathinfo($sourceMedia->file_name, PATHINFO_FILENAME))
- ->usingFileName($sourceMedia->file_name)
- ->toMediaCollection('featured-image', 'public');
-
- // Close modal and notify
- $this->showModal = false;
- $this->selectedMediaId = null;
- $this->dispatch('media-selected', ['mediaId' => $newMedia->id, 'fileName' => $newMedia->file_name]);
- $this->dispatch('notify-success', ['message' => 'Image added to entry']);
- } finally {
- if (file_exists($tempCopy)) {
- unlink($tempCopy);
- }
- }
- } catch (\Exception $e) {
- $this->dispatch('notify-error', ['message' => 'Error: ' . $e->getMessage()]);
- }
- }
-
- public function closePicker(): void
- {
- $this->showModal = false;
- $this->selectedMediaId = null;
- }
-
- public function render()
- {
- return view('livewire.gallery-picker');
- }
-}
diff --git a/app/Models/Asset.php b/app/Models/Asset.php
deleted file mode 100644
index aa1da32..0000000
--- a/app/Models/Asset.php
+++ /dev/null
@@ -1,16 +0,0 @@
-belongsTo(User::class);
- }
-}
diff --git a/app/Models/Entry.php b/app/Models/Entry.php
deleted file mode 100644
index 37d0b15..0000000
--- a/app/Models/Entry.php
+++ /dev/null
@@ -1,68 +0,0 @@
-registerRichContent('content')
- ->fileAttachmentProvider(
- SpatieMediaLibraryFileAttachmentProvider::make()
- ->collection('content-attachments')
- ->preserveFilenames()
- );
- }
-
- protected static function boot()
- {
- parent::boot();
-
- static::creating(function ($entry) {
- if (empty($entry->slug)) {
- $entry->slug = Str::slug($entry->title);
- }
- });
- }
-
- public function category(): BelongsTo
- {
- return $this->belongsTo(Category::class);
- }
-}
diff --git a/app/Models/TextWidget.php b/app/Models/TextWidget.php
deleted file mode 100644
index 73f121e..0000000
--- a/app/Models/TextWidget.php
+++ /dev/null
@@ -1,24 +0,0 @@
-belongsTo(Category::class);
- }
-}
diff --git a/app/Models/User.php b/app/Models/User.php
index de4961a..214bea4 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -3,20 +3,16 @@
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
-
-use Filament\Models\Contracts\FilamentUser;
-use Filament\Panel;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Str;
use Laravel\Fortify\TwoFactorAuthenticatable;
-use Laravel\Sanctum\HasApiTokens;
-class User extends Authenticatable implements FilamentUser
+class User extends Authenticatable
{
/** @use HasFactory<\Database\Factories\UserFactory> */
- use HasApiTokens, HasFactory, Notifiable, TwoFactorAuthenticatable;
+ use HasFactory, Notifiable, TwoFactorAuthenticatable;
/**
* The attributes that are mass assignable.
@@ -65,17 +61,4 @@ class User extends Authenticatable implements FilamentUser
->map(fn ($word) => Str::substr($word, 0, 1))
->implode('');
}
-
- /**
- * Determine if the user can access Filament admin panel.
- */
- public function canAccessPanel(Panel $panel): bool
- {
- return $this->email === config('app.admin_email') || $this->role === 'admin';
- }
-
- public function changes()
- {
- return $this->hasMany(Change::class);
- }
}
diff --git a/app/Observers/ChangeObserver.php b/app/Observers/ChangeObserver.php
deleted file mode 100644
index e86990b..0000000
--- a/app/Observers/ChangeObserver.php
+++ /dev/null
@@ -1,49 +0,0 @@
-id, 'created');
- }
-
- /**
- * Handle the Change "updated" event.
- */
- public function updated(Change $change): void
- {
- ProcessChangeUpdate::dispatch($change->id, 'updated');
- }
-
- /**
- * Handle the Change "deleted" event.
- */
- public function deleted(Change $change): void
- {
- //
- }
-
- /**
- * Handle the Change "restored" event.
- */
- public function restored(Change $change): void
- {
- //
- }
-
- /**
- * Handle the Change "force deletecURLd" event.
- */
- public function forceDeleted(Change $change): void
- {
- //
- }
-}
diff --git a/app/Observers/EntryObserver.php b/app/Observers/EntryObserver.php
deleted file mode 100644
index 3b9b50c..0000000
--- a/app/Observers/EntryObserver.php
+++ /dev/null
@@ -1,50 +0,0 @@
-id, 'created');
- }
-
- /**
- * Handle the Entry "updated" event.
- */
- public function updated(Entry $entry): void
- {
- ProcessEntryUpdate::dispatch($entry->id, 'updated');
- }
-
- /**
- * Handle the Entry "deleted" event.
- */
- public function deleted(Entry $entry): void
- {
- ProcessEntryUpdate::dispatch($entry->id, 'deleted');
- }
-
- /**
- * Handle the Entry "restored" event.
- */
- public function restored(Entry $entry): void
- {
- //
- }
-
- /**
- * Handle the Entry "force deleted" event.
- */
- public function forceDeleted(Entry $entry): void
- {
- // ProcessEntryUpdate::dispatch($entry, 'force deleted');
- }
-}
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index 0fad18d..452e6b6 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -2,12 +2,7 @@
namespace App\Providers;
-use App\Models\Entry;
-use App\Observers\EntryObserver;
-use App\Models\Change;
-use App\Observers\ChangeObserver;
use Illuminate\Support\ServiceProvider;
-use Illuminate\Support\Facades\File;
class AppServiceProvider extends ServiceProvider
{
@@ -24,13 +19,6 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot(): void
{
- // Ensure the livewire-tmp directory exists
- $livewireTmpPath = storage_path('framework/livewire-tmp');
- if (!File::exists($livewireTmpPath)) {
- File::makeDirectory($livewireTmpPath, 0755, true);
- }
-
- Entry::observe(EntryObserver::class);
- Change::observe(ChangeObserver::class);
+ //
}
}
diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php
deleted file mode 100644
index 8ea5759..0000000
--- a/app/Providers/Filament/AdminPanelProvider.php
+++ /dev/null
@@ -1,234 +0,0 @@
-url($previewSiteUrl, shouldOpenInNewTab: true)
- ->icon('heroicon-o-eye')
- ->group('External Links')
- ->sort(1),
- \Filament\Navigation\NavigationItem::make('Live Site')
- ->url($liveSiteUrl, shouldOpenInNewTab: true)
- ->icon('heroicon-o-rocket-launch')
- ->group('External Links')
- ->sort(2),
- ];
- }
-
- return $panel
- ->default()
- ->sidebarCollapsibleOnDesktop()
- ->id('admin')
- ->path('admin')
- ->login()
- ->colors([
- 'primary' => Color::Blue,
- ])
- ->resources([
- \App\Filament\Resources\Entries\EntryResource::class,
- \App\Filament\Resources\Media\MediaResource::class,
- \App\Filament\Resources\Categroys\CategroyResource::class,
- ])
- ->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources')
- ->discoverPages(in: app_path('Filament/Pages'), for: 'App\Filament\Pages')
- ->pages([
- Dashboard::class,
- ])
- ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\Filament\Widgets')
- ->widgets([
- AccountWidget::class,
- FilamentInfoWidget::class,
- ])
- ->navigationItems($navigationItems)
- ->middleware([
- EncryptCookies::class,
- AddQueuedCookiesToResponse::class,
- StartSession::class,
- AuthenticateSession::class,
- ShareErrorsFromSession::class,
- VerifyCsrfToken::class,
- SubstituteBindings::class,
- DisableBladeIconComponents::class,
- DispatchServingFilamentEvent::class,
- ])
- ->authMiddleware([
- Authenticate::class,
- ]);
- }
-
- public function boot(): void
- {
- FilamentView::registerRenderHook(
- PanelsRenderHook::BODY_END,
- fn(): string => \Illuminate\Support\Facades\Blade::render('@vite("resources/js/app.js")'),
- );
-
- FilamentView::registerRenderHook(
- PanelsRenderHook::BODY_END,
- function (): string {
- return '
- ';
- }
- );
- }
-}
diff --git a/app/Services/ProcessUpdateService.php b/app/Services/ProcessUpdateService.php
deleted file mode 100644
index 4082ad5..0000000
--- a/app/Services/ProcessUpdateService.php
+++ /dev/null
@@ -1,79 +0,0 @@
- $entryId,
- 'action' => $action,
- 'subject' => $subject,
- 'app_url' => $appUrl,
- 'type' => $type,
- ];
-
- $jsonData = json_encode($incoming, JSON_THROW_ON_ERROR);
- $tempFile = tempnam(sys_get_temp_dir(), $type);
- file_put_contents($tempFile, $jsonData);
-
- $scriptPath = env('HANDLE_ENTRY_UPDATES_SCRIPT', base_path('cmd/handle_cms_updates.sh'));
-
- try {
- // Log what we're about to execute
- Log::info("Executing script: {$scriptPath} with action: {$action}", [
- 'entry_id' => $entryId,
- 'temp_file' => $tempFile,
- 'script_exists' => file_exists($scriptPath),
- 'script_executable' => is_executable($scriptPath),
- ]);
-
- $result = Process::run([
- 'bash',
- $scriptPath,
- $action,
- $tempFile,
- ]);
-
- if ($result->failed()) {
- $errorDetails = [
- 'exit_code' => $result->exitCode(),
- 'stdout' => $result->output(),
- 'stderr' => $result->errorOutput(),
- 'command' => ['bash', $scriptPath, $action, $tempFile],
- 'script_path' => $scriptPath,
- 'script_exists' => file_exists($scriptPath),
- 'temp_file_exists' => file_exists($tempFile),
- 'temp_file_contents' => file_exists($tempFile) ? file_get_contents($tempFile) : 'N/A',
- ];
-
- Log::error('Script execution failed', $errorDetails);
-
- throw new RuntimeException(
- "Script execution failed with exit code {$result->exitCode()}. " .
- 'STDOUT: ' . ($result->output() ?: 'empty') . ' ' .
- 'STDERR: ' . ($result->errorOutput() ?: 'empty')
- );
- }
-
- Log::info('Script executed successfully', [
- 'stdout' => $result->output(),
- 'entry_id' => $entryId,
- 'action' => $action,
- ]);
- } finally {
- // Clean up temp file
- if (file_exists($tempFile)) {
- unlink($tempFile);
- }
- }
- }
-}
diff --git a/bootstrap/app.php b/bootstrap/app.php
index f24e379..c183276 100644
--- a/bootstrap/app.php
+++ b/bootstrap/app.php
@@ -7,9 +7,7 @@ use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
- api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
- channels: __DIR__.'/../routes/channels.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware): void {
diff --git a/bootstrap/providers.php b/bootstrap/providers.php
index 2baf31c..0ad9c57 100644
--- a/bootstrap/providers.php
+++ b/bootstrap/providers.php
@@ -2,6 +2,5 @@
return [
App\Providers\AppServiceProvider::class,
- App\Providers\Filament\AdminPanelProvider::class,
App\Providers\FortifyServiceProvider::class,
];
diff --git a/cmd/backup_raw_data.sh b/cmd/backup_raw_data.sh
deleted file mode 100755
index bfc210b..0000000
--- a/cmd/backup_raw_data.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-#SQLITE_DB_PATH="../share-lt/database/database.sqlite"
-SQLITE_DB_PATH="../share-lt/database/database.sqlite.backup5.recovery"
-BACKUP_DIR="database/backups"
-TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
-BACKUP_FILE="$BACKUP_DIR/backup_$TIMESTAMP.sql"
-TABLES="taggables media tags categories text_widgets entries users"
-mkdir -p "$BACKUP_DIR"
-
-for TABLE in $TABLES; do
- echo "Backing up table: $TABLE"
- sqlite3 "$SQLITE_DB_PATH" ".dump $TABLE" > "$BACKUP_DIR/${TABLE}_backup_$TIMESTAMP.sql"
-done
-
diff --git a/cmd/build_container.sh b/cmd/build_container.sh
deleted file mode 100755
index 70056f8..0000000
--- a/cmd/build_container.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-LARAVEL_CONTAINER_NAME="quay.io/marshyon/share-lt"
-CONTAINER_LABEL="0.0.7"
-CACHE="--no-cache"
-CACHE=""
-
-docker build \
- $CACHE \
- -t ${LARAVEL_CONTAINER_NAME}:${CONTAINER_LABEL} \
- -f Dockerfile .
diff --git a/cmd/build_prod_container.sh b/cmd/build_prod_container.sh
deleted file mode 100755
index c33bddc..0000000
--- a/cmd/build_prod_container.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-LARAVEL_CONTAINER_NAME="quay.io/marshyon/share-lt"
-CONTAINER_LABEL="v0.0.8"
-CACHE="--no-cache"
-# CACHE=""
-
-docker build \
- $CACHE \
- -t ${LARAVEL_CONTAINER_NAME}:${CONTAINER_LABEL} .
diff --git a/cmd/curl_get_categories.sh b/cmd/curl_get_categories.sh
deleted file mode 100755
index a50c125..0000000
--- a/cmd/curl_get_categories.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-# TOKEN="your_api_token_here"
-# ensure to have set TOKEN to a valid value before running
-# ideally add this to an .envrc file and source it
-# tokens need to be created with tinker or similar method
-
-
-URL='http://127.0.0.1:8000/api/categories'
-
-curl -s -X GET \
- -H "Authorization: Bearer $TOKEN" \
- -H "Accept: application/json" \
- $URL
-
diff --git a/cmd/curl_get_categories_anon.sh b/cmd/curl_get_categories_anon.sh
deleted file mode 100755
index 1ae77fa..0000000
--- a/cmd/curl_get_categories_anon.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env bash
-
-# TOKEN="your_api_token_here"
-# ensure to have set TOKEN to a valid value before running
-# ideally add this to an .envrc file and source it
-# tokens need to be created with tinker or similar method
-
-
-URL='http://127.0.0.1:8000/api/categories'
-
-curl -s -X GET \
- -H "Accept: application/json" \
- $URL
-
diff --git a/cmd/curl_get_entries.sh b/cmd/curl_get_entries.sh
deleted file mode 100755
index 79e57cd..0000000
--- a/cmd/curl_get_entries.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env bash
-
-# TOKEN="your_api_token_here"
-# ensure to have set TOKEN to a valid value before running
-# ideally add this to an .envrc file and source it
-# tokens need to be created with tinker or similar method
-
-
-URL="${ADDRESS:-http://127.0.0.1:8000/api/entries}"
-curl -s -X GET \
- -H "Authorization: Bearer $TOKEN" \
- -H "Accept: application/json" \
- $URL
-
diff --git a/cmd/curl_get_entries_anon.sh b/cmd/curl_get_entries_anon.sh
deleted file mode 100755
index 5d69ce1..0000000
--- a/cmd/curl_get_entries_anon.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env bash
-
-# this should fail, no token provided
-# users need to be authenticated and have been
-# granted access to view entries by being given
-# a token
-
-URL="${ADDRESS:-http://127.0.0.1:8000/api/entries}"
-curl -s -X GET \
- -H "Accept: application/json" \
- $URL
-
diff --git a/cmd/curl_get_text_widget.sh b/cmd/curl_get_text_widget.sh
deleted file mode 100755
index 13eb288..0000000
--- a/cmd/curl_get_text_widget.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-# TOKEN="your_api_token_here"
-# ensure to have set TOKEN to a valid value before running
-# ideally add this to an .envrc file and source it
-# tokens need to be created with tinker or similar method
-
-
-URL='http://127.0.0.1:8000/api/text-widgets'
-
-curl -s -X GET \
- -H "Authorization: Bearer $TOKEN" \
- -H "Accept: application/json" \
- $URL
-
diff --git a/cmd/curl_get_text_widgets_anon.sh b/cmd/curl_get_text_widgets_anon.sh
deleted file mode 100755
index 4d3e708..0000000
--- a/cmd/curl_get_text_widgets_anon.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-
-# this should fail, no token provided
-# users need to be authenticated and have been
-# granted access to view text widgets by being given
-# a token
-
-URL='http://127.0.0.1:8000/api/text-widgets'
-
-curl -s -X GET \
- -H "Accept: application/json" \
- $URL
-
diff --git a/cmd/curl_post_entry.sh b/cmd/curl_post_entry.sh
deleted file mode 100755
index 0b2a74d..0000000
--- a/cmd/curl_post_entry.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-
-# TOKEN="your_api_token_here"
-# ensure to have set TOKEN to a valid value before running
-# ideally add this to an .envrc file and source it
-# only the admin user can create entries so this should
-# fail unless .env has ADMIN_EMAIL set to the user that
-# the token belongs to
-
-URL='http://127.0.0.1:8000/api/entries'
-
-curl -X POST \
- -H "Authorization: Bearer $TOKEN" \
- -H "Accept: application/json" \
- -H "Content-Type: application/json" \
- -d '{
- "title": "Yet Another New Entry Title",
- "content": "This is the content yet again of the new entry."
- }' \
- $URL
\ No newline at end of file
diff --git a/cmd/curl_post_entry_anon.sh b/cmd/curl_post_entry_anon.sh
deleted file mode 100755
index 7bb22c6..0000000
--- a/cmd/curl_post_entry_anon.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-
-# this should fail as no token is provided
-# user is not authenticated
-# no token has been granted
-
-URL='http://127.0.0.1:8000/api/entries'
-
-curl -X POST \
- -H "Accept: application/json" \
- -H "Content-Type: application/json" \
- -d '{
- "title": "Yet Another New Entry Title",
- "content": "This is the content yet again of the new entry."
- }' \
- $URL
\ No newline at end of file
diff --git a/cmd/curl_post_text_widget.sh b/cmd/curl_post_text_widget.sh
deleted file mode 100755
index 24ac0d0..0000000
--- a/cmd/curl_post_text_widget.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-
-# TOKEN="your_api_token_here"
-# ensure to have set TOKEN to a valid value before running
-# ideally add this to an .envrc file and source it
-# only the admin user can create entries so this should
-# fail unless .env has ADMIN_EMAIL set to the user that
-# the token belongs to
-
-URL='http://127.0.0.1:8000/api/text-widgets'
-
-curl -X POST \
- -H "Authorization: Bearer $TOKEN" \
- -H "Accept: application/json" \
- -H "Content-Type: application/json" \
- -d '{
- "title": "Yet Another New text widget Title",
- "content": "This is the content yet again of the new text widget."
- }' \
- $URL
\ No newline at end of file
diff --git a/cmd/curl_post_text_widget_anon.sh b/cmd/curl_post_text_widget_anon.sh
deleted file mode 100755
index 8d844ab..0000000
--- a/cmd/curl_post_text_widget_anon.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-
-# this should fail as no token is provided
-# user is not authenticated
-# no token has been granted
-
-URL='http://127.0.0.1:8000/api/text-widgets'
-
-curl -X POST \
- -H "Accept: application/json" \
- -H "Content-Type: application/json" \
- -d '{
- "title": "Yet Another New Entry Title",
- "content": "This is the content yet again of the new entry."
- }' \
- $URL
\ No newline at end of file
diff --git a/cmd/curl_send_user_toast_message.sh b/cmd/curl_send_user_toast_message.sh
deleted file mode 100755
index 339d3d9..0000000
--- a/cmd/curl_send_user_toast_message.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-# URL='http://127.0.0.1:8000'
-
-curl -X POST $URL/api/notifications/preview-site-built \
- -H "Authorization: Bearer $TOKEN" \
- -H "Content-Type: application/json" \
- -d '{"message": "Published to LIVE 💯🚀🎯 - site notification!"}'
-
-
-
diff --git a/cmd/docker-entrypoint.sh b/cmd/docker-entrypoint.sh
deleted file mode 100644
index e25830e..0000000
--- a/cmd/docker-entrypoint.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh
-set -e
-
-# Ensure APP_KEY is set and persisted
-PERSISTED_KEY="/var/www/storage/.app_key"
-
-if [ -z "$APP_KEY" ]; then
- if [ -f "$PERSISTED_KEY" ]; then
- echo "Using persisted APP_KEY from: $PERSISTED_KEY"
- export APP_KEY=$(cat "$PERSISTED_KEY")
- else
- # Generate key, strip "base64:", and save
- NEW_KEY=$(php artisan key:generate --show --no-interaction)
- echo "Generated new APP_KEY to: $PERSISTED_KEY"
- echo "$NEW_KEY" > "$PERSISTED_KEY"
- export APP_KEY="$NEW_KEY"
- fi
-fi
-
-# check to see if /var/www/database/database.sqlite exists
-# if not, run migrations
-if [ ! -f /var/www/database/database.sqlite ]; then
- php artisan migrate --force
-fi
-
-# check to see if /var/www/public/storage exists
-# if not, run storage:link
-if [ ! -d /var/www/public/storage ]; then
- php artisan storage:link
-fi
-
-php artisan config:clear
-npm run build
-
-# Start supervisord directly
-exec "$@"
-
diff --git a/cmd/handle_cms_updates.sh b/cmd/handle_cms_updates.sh
deleted file mode 100755
index 58b4e45..0000000
--- a/cmd/handle_cms_updates.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env bash
-
-LOG_FILE="/tmp/logfile.log"
-
-# Redirect all output to both stdout and the log file
-exec > >(tee -a "$LOG_FILE") 2>&1
-
-# Read the first two command line arguments
-ACTION=$1
-FILENAME=$2
-
-# Check if the file exists and echo its contents
-if [[ -f "$FILENAME" ]]; then
- echo "Contents of the file $FILENAME:"
- cat "$FILENAME" | jq
-else
- echo "Error: File $FILENAME does not exist."
-fi
-
-echo
-# Read and print command line arguments
-echo "=============================="
-echo "ACTION: $ACTION"
-echo "FILENAME: $FILENAME"
-echo "=============================="
-echo
-
-# Publish message and check return code
-if nats pub $NATS_SUBJECT "$(cat "$FILENAME")" --server $NATS_URL --user $NATS_USERNAME --password $NATS_PASSWORD; then
- echo "Success: Message published to NATS successfully."
-else
- echo "Error: Failed to publish message to NATS."
-fi
\ No newline at end of file
diff --git a/cmd/restore_raw_data.sh b/cmd/restore_raw_data.sh
deleted file mode 100755
index 2fe10e5..0000000
--- a/cmd/restore_raw_data.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/bash
-
-# Define the backup directory and the SQLite database file
-BACKUP_DIR="database/backups"
-DB_FILE="database/database.sqlite"
-# DATE="20260124_115644"
-DATE="20260124_123340"
-
-# Ensure the DATE variable is set
-if [ -z "$DATE" ]; then
- echo "DATE variable is not set. Please set the DATE variable to match the backup file date."
- exit 1
-fi
-
-# Check if the backup directory exists
-if [ ! -d "$BACKUP_DIR" ]; then
- echo "Backup directory does not exist: $BACKUP_DIR"
- exit 1
-fi
-
-# Check if the SQLite database file exists
-if [ ! -f "$DB_FILE" ]; then
- echo "SQLite database file does not exist: $DB_FILE"
- exit 1
-fi
-
-# Check if there are any matching backup files
-if ! ls "$BACKUP_DIR"/*"$DATE".sql 1> /dev/null 2>&1; then
- echo "No backup files found for the date: $DATE"
- exit 1
-fi
-
-echo "Starting restore process from backups dated: $DATE"
-echo "Using database file: $DB_FILE"
-
-# Loop through each file in the backup directory
-for file in "$BACKUP_DIR"/*"$DATE".sql; do
- if [ -f "$file" ]; then
- echo "Restoring data from $file into $DB_FILE..."
-
- # Import the SQL file into the SQLite database and log output
- sqlite3 "$DB_FILE" < "$file" 2>> restore_errors.log
-
- # Check for errors in the restore process
- if [ $? -eq 0 ]; then
- echo "Successfully restored $file"
- else
- echo "Failed to restore $file. Check restore_errors.log for details."
- fi
-
- # Debugging: Print the last 10 lines of the database to verify data
- # echo "Last 10 rows of the database after restoring $file:"
- # sqlite3 "$DB_FILE" "SELECT * FROM sqlite_master WHERE type='table';" 2>> restore_errors.log
- # sqlite3 "$DB_FILE" "SELECT * FROM entries ORDER BY rowid DESC LIMIT 10;" 2>> restore_errors.log
- fi
-done
-
-echo "Restore process completed."
\ No newline at end of file
diff --git a/composer.json b/composer.json
index d32e0bd..8166092 100644
--- a/composer.json
+++ b/composer.json
@@ -3,27 +3,21 @@
"name": "laravel/livewire-starter-kit",
"type": "project",
"description": "The official Laravel starter kit for Livewire.",
- "keywords": ["laravel", "framework"],
+ "keywords": [
+ "laravel",
+ "framework"
+ ],
"license": "MIT",
"require": {
"php": "^8.2",
- "filament/filament": "^4.0",
- "filament/spatie-laravel-media-library-plugin": "^4.4",
- "filament/spatie-laravel-tags-plugin": "^4.0",
"laravel/fortify": "^1.30",
"laravel/framework": "^12.0",
- "laravel/reverb": "^1.0",
- "laravel/sanctum": "^4.0",
"laravel/tinker": "^2.10.1",
- "league/flysystem-aws-s3-v3": "^3.0",
- "livewire/flux": "^2.9.0",
- "spatie/laravel-medialibrary": "^11.17",
- "spatie/laravel-tags": "^4.10"
+ "livewire/flux": "^2.9.0"
},
"require-dev": {
"fakerphp/faker": "^1.23",
"laravel/boost": "^1.8",
- "laravel/dusk": "^8.3",
"laravel/pail": "^1.2.2",
"laravel/pint": "^1.24",
"laravel/sail": "^1.41",
@@ -63,8 +57,7 @@
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
- "@php artisan package:discover --ansi",
- "@php artisan filament:upgrade"
+ "@php artisan package:discover --ansi"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force",
@@ -98,4 +91,4 @@
},
"minimum-stability": "stable",
"prefer-stable": true
-}
+}
\ No newline at end of file
diff --git a/composer.lock b/composer.lock
index 7c28c5c..6655bd7 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,225 +4,8 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "2c8346f199360fa0de4000e945a86602",
+ "content-hash": "c9d24d6546cd1e9c0fa266105c8e18b3",
"packages": [
- {
- "name": "anourvalar/eloquent-serialize",
- "version": "1.3.5",
- "source": {
- "type": "git",
- "url": "https://github.com/AnourValar/eloquent-serialize.git",
- "reference": "1a7dead8d532657e5358f8f27c0349373517681e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/1a7dead8d532657e5358f8f27c0349373517681e",
- "reference": "1a7dead8d532657e5358f8f27c0349373517681e",
- "shasum": ""
- },
- "require": {
- "laravel/framework": "^8.0|^9.0|^10.0|^11.0|^12.0",
- "php": "^7.4|^8.0"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^3.26",
- "laravel/legacy-factories": "^1.1",
- "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0",
- "phpstan/phpstan": "^2.0",
- "phpunit/phpunit": "^9.5|^10.5|^11.0",
- "psalm/plugin-laravel": "^2.8|^3.0",
- "squizlabs/php_codesniffer": "^3.7"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "aliases": {
- "EloquentSerialize": "AnourValar\\EloquentSerialize\\Facades\\EloquentSerializeFacade"
- }
- }
- },
- "autoload": {
- "psr-4": {
- "AnourValar\\EloquentSerialize\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Laravel Query Builder (Eloquent) serialization",
- "homepage": "https://github.com/AnourValar/eloquent-serialize",
- "keywords": [
- "anourvalar",
- "builder",
- "copy",
- "eloquent",
- "job",
- "laravel",
- "query",
- "querybuilder",
- "queue",
- "serializable",
- "serialization",
- "serialize"
- ],
- "support": {
- "issues": "https://github.com/AnourValar/eloquent-serialize/issues",
- "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.3.5"
- },
- "time": "2025-12-04T13:38:21+00:00"
- },
- {
- "name": "aws/aws-crt-php",
- "version": "v1.2.7",
- "source": {
- "type": "git",
- "url": "https://github.com/awslabs/aws-crt-php.git",
- "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e",
- "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e",
- "shasum": ""
- },
- "require": {
- "php": ">=5.5"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5",
- "yoast/phpunit-polyfills": "^1.0"
- },
- "suggest": {
- "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality."
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "AWS SDK Common Runtime Team",
- "email": "aws-sdk-common-runtime@amazon.com"
- }
- ],
- "description": "AWS Common Runtime for PHP",
- "homepage": "https://github.com/awslabs/aws-crt-php",
- "keywords": [
- "amazon",
- "aws",
- "crt",
- "sdk"
- ],
- "support": {
- "issues": "https://github.com/awslabs/aws-crt-php/issues",
- "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7"
- },
- "time": "2024-10-18T22:15:13+00:00"
- },
- {
- "name": "aws/aws-sdk-php",
- "version": "3.369.19",
- "source": {
- "type": "git",
- "url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "32fee3a25290186724ede9ca177d5090f7c5a837"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/32fee3a25290186724ede9ca177d5090f7c5a837",
- "reference": "32fee3a25290186724ede9ca177d5090f7c5a837",
- "shasum": ""
- },
- "require": {
- "aws/aws-crt-php": "^1.2.3",
- "ext-json": "*",
- "ext-pcre": "*",
- "ext-simplexml": "*",
- "guzzlehttp/guzzle": "^7.4.5",
- "guzzlehttp/promises": "^2.0",
- "guzzlehttp/psr7": "^2.4.5",
- "mtdowling/jmespath.php": "^2.8.0",
- "php": ">=8.1",
- "psr/http-message": "^1.0 || ^2.0",
- "symfony/filesystem": "^v5.4.45 || ^v6.4.3 || ^v7.1.0 || ^v8.0.0"
- },
- "require-dev": {
- "andrewsville/php-token-reflection": "^1.4",
- "aws/aws-php-sns-message-validator": "~1.0",
- "behat/behat": "~3.0",
- "composer/composer": "^2.7.8",
- "dms/phpunit-arraysubset-asserts": "^0.4.0",
- "doctrine/cache": "~1.4",
- "ext-dom": "*",
- "ext-openssl": "*",
- "ext-sockets": "*",
- "phpunit/phpunit": "^9.6",
- "psr/cache": "^2.0 || ^3.0",
- "psr/simple-cache": "^2.0 || ^3.0",
- "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0",
- "yoast/phpunit-polyfills": "^2.0"
- },
- "suggest": {
- "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
- "doctrine/cache": "To use the DoctrineCacheAdapter",
- "ext-curl": "To send requests using cURL",
- "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
- "ext-pcntl": "To use client-side monitoring",
- "ext-sockets": "To use client-side monitoring"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
- },
- "autoload": {
- "files": [
- "src/functions.php"
- ],
- "psr-4": {
- "Aws\\": "src/"
- },
- "exclude-from-classmap": [
- "src/data/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Amazon Web Services",
- "homepage": "http://aws.amazon.com"
- }
- ],
- "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
- "homepage": "http://aws.amazon.com/sdkforphp",
- "keywords": [
- "amazon",
- "aws",
- "cloud",
- "dynamodb",
- "ec2",
- "glacier",
- "s3",
- "sdk"
- ],
- "support": {
- "forum": "https://github.com/aws/aws-sdk-php/discussions",
- "issues": "https://github.com/aws/aws-sdk-php/issues",
- "source": "https://github.com/aws/aws-sdk-php/tree/3.369.19"
- },
- "time": "2026-01-23T19:05:51+00:00"
- },
{
"name": "bacon/bacon-qr-code",
"version": "v3.0.3",
@@ -278,156 +61,6 @@
},
"time": "2025-11-19T17:15:36+00:00"
},
- {
- "name": "blade-ui-kit/blade-heroicons",
- "version": "2.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/driesvints/blade-heroicons.git",
- "reference": "4553b2a1f6c76f0ac7f3bc0de4c0cfa06a097d19"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/driesvints/blade-heroicons/zipball/4553b2a1f6c76f0ac7f3bc0de4c0cfa06a097d19",
- "reference": "4553b2a1f6c76f0ac7f3bc0de4c0cfa06a097d19",
- "shasum": ""
- },
- "require": {
- "blade-ui-kit/blade-icons": "^1.6",
- "illuminate/support": "^9.0|^10.0|^11.0|^12.0",
- "php": "^8.0"
- },
- "require-dev": {
- "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0",
- "phpunit/phpunit": "^9.0|^10.5|^11.0"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "BladeUI\\Heroicons\\BladeHeroiconsServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "BladeUI\\Heroicons\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Dries Vints",
- "homepage": "https://driesvints.com"
- }
- ],
- "description": "A package to easily make use of Heroicons in your Laravel Blade views.",
- "homepage": "https://github.com/blade-ui-kit/blade-heroicons",
- "keywords": [
- "Heroicons",
- "blade",
- "laravel"
- ],
- "support": {
- "issues": "https://github.com/driesvints/blade-heroicons/issues",
- "source": "https://github.com/driesvints/blade-heroicons/tree/2.6.0"
- },
- "funding": [
- {
- "url": "https://github.com/sponsors/driesvints",
- "type": "github"
- },
- {
- "url": "https://www.paypal.com/paypalme/driesvints",
- "type": "paypal"
- }
- ],
- "time": "2025-02-13T20:53:33+00:00"
- },
- {
- "name": "blade-ui-kit/blade-icons",
- "version": "1.8.0",
- "source": {
- "type": "git",
- "url": "https://github.com/driesvints/blade-icons.git",
- "reference": "7b743f27476acb2ed04cb518213d78abe096e814"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/driesvints/blade-icons/zipball/7b743f27476acb2ed04cb518213d78abe096e814",
- "reference": "7b743f27476acb2ed04cb518213d78abe096e814",
- "shasum": ""
- },
- "require": {
- "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0",
- "illuminate/filesystem": "^8.0|^9.0|^10.0|^11.0|^12.0",
- "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0",
- "illuminate/view": "^8.0|^9.0|^10.0|^11.0|^12.0",
- "php": "^7.4|^8.0",
- "symfony/console": "^5.3|^6.0|^7.0",
- "symfony/finder": "^5.3|^6.0|^7.0"
- },
- "require-dev": {
- "mockery/mockery": "^1.5.1",
- "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0",
- "phpunit/phpunit": "^9.0|^10.5|^11.0"
- },
- "bin": [
- "bin/blade-icons-generate"
- ],
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "BladeUI\\Icons\\BladeIconsServiceProvider"
- ]
- }
- },
- "autoload": {
- "files": [
- "src/helpers.php"
- ],
- "psr-4": {
- "BladeUI\\Icons\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Dries Vints",
- "homepage": "https://driesvints.com"
- }
- ],
- "description": "A package to easily make use of icons in your Laravel Blade views.",
- "homepage": "https://github.com/blade-ui-kit/blade-icons",
- "keywords": [
- "blade",
- "icons",
- "laravel",
- "svg"
- ],
- "support": {
- "issues": "https://github.com/blade-ui-kit/blade-icons/issues",
- "source": "https://github.com/blade-ui-kit/blade-icons"
- },
- "funding": [
- {
- "url": "https://github.com/sponsors/driesvints",
- "type": "github"
- },
- {
- "url": "https://www.paypal.com/paypalme/driesvints",
- "type": "paypal"
- }
- ],
- "time": "2025-02-13T20:35:06+00:00"
- },
{
"name": "brick/math",
"version": "0.14.1",
@@ -557,477 +190,6 @@
],
"time": "2024-02-09T16:56:22+00:00"
},
- {
- "name": "chillerlan/php-qrcode",
- "version": "5.0.5",
- "source": {
- "type": "git",
- "url": "https://github.com/chillerlan/php-qrcode.git",
- "reference": "7b66282572fc14075c0507d74d9837dab25b38d6"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/7b66282572fc14075c0507d74d9837dab25b38d6",
- "reference": "7b66282572fc14075c0507d74d9837dab25b38d6",
- "shasum": ""
- },
- "require": {
- "chillerlan/php-settings-container": "^2.1.6 || ^3.2.1",
- "ext-mbstring": "*",
- "php": "^7.4 || ^8.0"
- },
- "require-dev": {
- "chillerlan/php-authenticator": "^4.3.1 || ^5.2.1",
- "ext-fileinfo": "*",
- "phan/phan": "^5.5.2",
- "phpcompatibility/php-compatibility": "10.x-dev",
- "phpmd/phpmd": "^2.15",
- "phpunit/phpunit": "^9.6",
- "setasign/fpdf": "^1.8.2",
- "slevomat/coding-standard": "^8.23.0",
- "squizlabs/php_codesniffer": "^4.0.0"
- },
- "suggest": {
- "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.",
- "setasign/fpdf": "Required to use the QR FPDF output.",
- "simple-icons/simple-icons": "SVG icons that you can use to embed as logos in the QR Code"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "chillerlan\\QRCode\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT",
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Kazuhiko Arase",
- "homepage": "https://github.com/kazuhikoarase/qrcode-generator"
- },
- {
- "name": "ZXing Authors",
- "homepage": "https://github.com/zxing/zxing"
- },
- {
- "name": "Ashot Khanamiryan",
- "homepage": "https://github.com/khanamiryan/php-qrcode-detector-decoder"
- },
- {
- "name": "Smiley",
- "email": "smiley@chillerlan.net",
- "homepage": "https://github.com/codemasher"
- },
- {
- "name": "Contributors",
- "homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors"
- }
- ],
- "description": "A QR Code generator and reader with a user-friendly API. PHP 7.4+",
- "homepage": "https://github.com/chillerlan/php-qrcode",
- "keywords": [
- "phpqrcode",
- "qr",
- "qr code",
- "qr-reader",
- "qrcode",
- "qrcode-generator",
- "qrcode-reader"
- ],
- "support": {
- "docs": "https://php-qrcode.readthedocs.io",
- "issues": "https://github.com/chillerlan/php-qrcode/issues",
- "source": "https://github.com/chillerlan/php-qrcode"
- },
- "funding": [
- {
- "url": "https://ko-fi.com/codemasher",
- "type": "Ko-Fi"
- }
- ],
- "time": "2025-11-23T23:51:44+00:00"
- },
- {
- "name": "chillerlan/php-settings-container",
- "version": "3.2.1",
- "source": {
- "type": "git",
- "url": "https://github.com/chillerlan/php-settings-container.git",
- "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/95ed3e9676a1d47cab2e3174d19b43f5dbf52681",
- "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "php": "^8.1"
- },
- "require-dev": {
- "phpmd/phpmd": "^2.15",
- "phpstan/phpstan": "^1.11",
- "phpstan/phpstan-deprecation-rules": "^1.2",
- "phpunit/phpunit": "^10.5",
- "squizlabs/php_codesniffer": "^3.10"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "chillerlan\\Settings\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Smiley",
- "email": "smiley@chillerlan.net",
- "homepage": "https://github.com/codemasher"
- }
- ],
- "description": "A container class for immutable settings objects. Not a DI container.",
- "homepage": "https://github.com/chillerlan/php-settings-container",
- "keywords": [
- "Settings",
- "configuration",
- "container",
- "helper"
- ],
- "support": {
- "issues": "https://github.com/chillerlan/php-settings-container/issues",
- "source": "https://github.com/chillerlan/php-settings-container"
- },
- "funding": [
- {
- "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
- "type": "custom"
- },
- {
- "url": "https://ko-fi.com/codemasher",
- "type": "ko_fi"
- }
- ],
- "time": "2024-07-16T11:13:48+00:00"
- },
- {
- "name": "clue/redis-protocol",
- "version": "v0.3.2",
- "source": {
- "type": "git",
- "url": "https://github.com/clue/redis-protocol.git",
- "reference": "6f565332f5531b7722d1e9c445314b91862f6d6c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/clue/redis-protocol/zipball/6f565332f5531b7722d1e9c445314b91862f6d6c",
- "reference": "6f565332f5531b7722d1e9c445314b91862f6d6c",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Clue\\Redis\\Protocol\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@lueck.tv"
- }
- ],
- "description": "A streaming Redis protocol (RESP) parser and serializer written in pure PHP.",
- "homepage": "https://github.com/clue/redis-protocol",
- "keywords": [
- "parser",
- "protocol",
- "redis",
- "resp",
- "serializer",
- "streaming"
- ],
- "support": {
- "issues": "https://github.com/clue/redis-protocol/issues",
- "source": "https://github.com/clue/redis-protocol/tree/v0.3.2"
- },
- "funding": [
- {
- "url": "https://clue.engineering/support",
- "type": "custom"
- },
- {
- "url": "https://github.com/clue",
- "type": "github"
- }
- ],
- "time": "2024-08-07T11:06:28+00:00"
- },
- {
- "name": "clue/redis-react",
- "version": "v2.8.0",
- "source": {
- "type": "git",
- "url": "https://github.com/clue/reactphp-redis.git",
- "reference": "84569198dfd5564977d2ae6a32de4beb5a24bdca"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/clue/reactphp-redis/zipball/84569198dfd5564977d2ae6a32de4beb5a24bdca",
- "reference": "84569198dfd5564977d2ae6a32de4beb5a24bdca",
- "shasum": ""
- },
- "require": {
- "clue/redis-protocol": "^0.3.2",
- "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
- "php": ">=5.3",
- "react/event-loop": "^1.2",
- "react/promise": "^3.2 || ^2.0 || ^1.1",
- "react/promise-timer": "^1.11",
- "react/socket": "^1.16"
- },
- "require-dev": {
- "clue/block-react": "^1.5",
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Clue\\React\\Redis\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering"
- }
- ],
- "description": "Async Redis client implementation, built on top of ReactPHP.",
- "homepage": "https://github.com/clue/reactphp-redis",
- "keywords": [
- "async",
- "client",
- "database",
- "reactphp",
- "redis"
- ],
- "support": {
- "issues": "https://github.com/clue/reactphp-redis/issues",
- "source": "https://github.com/clue/reactphp-redis/tree/v2.8.0"
- },
- "funding": [
- {
- "url": "https://clue.engineering/support",
- "type": "custom"
- },
- {
- "url": "https://github.com/clue",
- "type": "github"
- }
- ],
- "time": "2025-01-03T16:18:33+00:00"
- },
- {
- "name": "composer/semver",
- "version": "3.4.4",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/semver.git",
- "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
- "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.2 || ^7.0 || ^8.0"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.11",
- "symfony/phpunit-bridge": "^3 || ^7"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "3.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\Semver\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nils Adermann",
- "email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
- },
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- },
- {
- "name": "Rob Bast",
- "email": "rob.bast@gmail.com",
- "homepage": "http://robbast.nl"
- }
- ],
- "description": "Semver library that offers utilities, version constraint parsing and validation.",
- "keywords": [
- "semantic",
- "semver",
- "validation",
- "versioning"
- ],
- "support": {
- "irc": "ircs://irc.libera.chat:6697/composer",
- "issues": "https://github.com/composer/semver/issues",
- "source": "https://github.com/composer/semver/tree/3.4.4"
- },
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- }
- ],
- "time": "2025-08-20T19:15:30+00:00"
- },
- {
- "name": "danharrin/date-format-converter",
- "version": "v0.3.1",
- "source": {
- "type": "git",
- "url": "https://github.com/danharrin/date-format-converter.git",
- "reference": "7c31171bc981e48726729a5f3a05a2d2b63f0b1e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/danharrin/date-format-converter/zipball/7c31171bc981e48726729a5f3a05a2d2b63f0b1e",
- "reference": "7c31171bc981e48726729a5f3a05a2d2b63f0b1e",
- "shasum": ""
- },
- "require": {
- "php": "^7.2|^8.0"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/helpers.php",
- "src/standards.php"
- ],
- "psr-4": {
- "DanHarrin\\DateFormatConverter\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Dan Harrin",
- "email": "dan@danharrin.com"
- }
- ],
- "description": "Convert token-based date formats between standards.",
- "homepage": "https://github.com/danharrin/date-format-converter",
- "support": {
- "issues": "https://github.com/danharrin/date-format-converter/issues",
- "source": "https://github.com/danharrin/date-format-converter"
- },
- "funding": [
- {
- "url": "https://github.com/danharrin",
- "type": "github"
- }
- ],
- "time": "2024-06-13T09:38:44+00:00"
- },
- {
- "name": "danharrin/livewire-rate-limiting",
- "version": "v2.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/danharrin/livewire-rate-limiting.git",
- "reference": "14dde653a9ae8f38af07a0ba4921dc046235e1a0"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/14dde653a9ae8f38af07a0ba4921dc046235e1a0",
- "reference": "14dde653a9ae8f38af07a0ba4921dc046235e1a0",
- "shasum": ""
- },
- "require": {
- "illuminate/support": "^9.0|^10.0|^11.0|^12.0",
- "php": "^8.0"
- },
- "require-dev": {
- "livewire/livewire": "^3.0",
- "livewire/volt": "^1.3",
- "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0",
- "phpunit/phpunit": "^9.0|^10.0|^11.5.3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "DanHarrin\\LivewireRateLimiting\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Dan Harrin",
- "email": "dan@danharrin.com"
- }
- ],
- "description": "Apply rate limiters to Laravel Livewire actions.",
- "homepage": "https://github.com/danharrin/livewire-rate-limiting",
- "support": {
- "issues": "https://github.com/danharrin/livewire-rate-limiting/issues",
- "source": "https://github.com/danharrin/livewire-rate-limiting"
- },
- "funding": [
- {
- "url": "https://github.com/danharrin",
- "type": "github"
- }
- ],
- "time": "2025-02-21T08:52:11+00:00"
- },
{
"name": "dasprid/enum",
"version": "1.0.7",
@@ -1451,614 +613,6 @@
],
"time": "2025-03-06T22:45:56+00:00"
},
- {
- "name": "evenement/evenement",
- "version": "v3.0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/igorw/evenement.git",
- "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc",
- "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc",
- "shasum": ""
- },
- "require": {
- "php": ">=7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^9 || ^6"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Evenement\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Igor Wiedler",
- "email": "igor@wiedler.ch"
- }
- ],
- "description": "Événement is a very simple event dispatching library for PHP",
- "keywords": [
- "event-dispatcher",
- "event-emitter"
- ],
- "support": {
- "issues": "https://github.com/igorw/evenement/issues",
- "source": "https://github.com/igorw/evenement/tree/v3.0.2"
- },
- "time": "2023-08-08T05:53:35+00:00"
- },
- {
- "name": "filament/actions",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/actions.git",
- "reference": "55939e38b429526f51cf0385d4142a46c4449e9d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/actions/zipball/55939e38b429526f51cf0385d4142a46c4449e9d",
- "reference": "55939e38b429526f51cf0385d4142a46c4449e9d",
- "shasum": ""
- },
- "require": {
- "anourvalar/eloquent-serialize": "^1.2",
- "filament/forms": "self.version",
- "filament/infolists": "self.version",
- "filament/notifications": "self.version",
- "filament/support": "self.version",
- "league/csv": "^9.27",
- "openspout/openspout": "^4.23",
- "php": "^8.2"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\Actions\\ActionsServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Filament\\Actions\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Easily add beautiful action modals to any Livewire component.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-30T13:02:40+00:00"
- },
- {
- "name": "filament/filament",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/panels.git",
- "reference": "7d63beb782dc85a384a782a5ef434716c45aeaa5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/panels/zipball/7d63beb782dc85a384a782a5ef434716c45aeaa5",
- "reference": "7d63beb782dc85a384a782a5ef434716c45aeaa5",
- "shasum": ""
- },
- "require": {
- "chillerlan/php-qrcode": "^5.0",
- "filament/actions": "self.version",
- "filament/forms": "self.version",
- "filament/infolists": "self.version",
- "filament/notifications": "self.version",
- "filament/schemas": "self.version",
- "filament/support": "self.version",
- "filament/tables": "self.version",
- "filament/widgets": "self.version",
- "php": "^8.2",
- "pragmarx/google2fa": "^8.0|^9.0",
- "pragmarx/google2fa-qrcode": "^3.0"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\FilamentServiceProvider"
- ]
- }
- },
- "autoload": {
- "files": [
- "src/global_helpers.php",
- "src/helpers.php"
- ],
- "psr-4": {
- "Filament\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "A collection of full-stack components for accelerated Laravel app development.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-30T13:02:13+00:00"
- },
- {
- "name": "filament/forms",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/forms.git",
- "reference": "0ac70fa4b7bce3ed656e947ecc97b7177c901ca8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/forms/zipball/0ac70fa4b7bce3ed656e947ecc97b7177c901ca8",
- "reference": "0ac70fa4b7bce3ed656e947ecc97b7177c901ca8",
- "shasum": ""
- },
- "require": {
- "danharrin/date-format-converter": "^0.3",
- "filament/actions": "self.version",
- "filament/schemas": "self.version",
- "filament/support": "self.version",
- "php": "^8.2",
- "ueberdosis/tiptap-php": "^2.0"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\Forms\\FormsServiceProvider"
- ]
- }
- },
- "autoload": {
- "files": [
- "src/helpers.php"
- ],
- "psr-4": {
- "Filament\\Forms\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Easily add beautiful forms to any Livewire component.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-30T13:02:11+00:00"
- },
- {
- "name": "filament/infolists",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/infolists.git",
- "reference": "fc562cc08e704546aff754cb6f008b0c669b2206"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/infolists/zipball/fc562cc08e704546aff754cb6f008b0c669b2206",
- "reference": "fc562cc08e704546aff754cb6f008b0c669b2206",
- "shasum": ""
- },
- "require": {
- "filament/actions": "self.version",
- "filament/schemas": "self.version",
- "filament/support": "self.version",
- "php": "^8.2"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\Infolists\\InfolistsServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Filament\\Infolists\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Easily add beautiful read-only infolists to any Livewire component.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-30T13:02:32+00:00"
- },
- {
- "name": "filament/notifications",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/notifications.git",
- "reference": "f8657e9b98f549f316daf74cf24a659b85a10e12"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/notifications/zipball/f8657e9b98f549f316daf74cf24a659b85a10e12",
- "reference": "f8657e9b98f549f316daf74cf24a659b85a10e12",
- "shasum": ""
- },
- "require": {
- "filament/actions": "self.version",
- "filament/support": "self.version",
- "php": "^8.2"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\Notifications\\NotificationsServiceProvider"
- ]
- }
- },
- "autoload": {
- "files": [
- "src/Testing/helpers.php"
- ],
- "psr-4": {
- "Filament\\Notifications\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Easily add beautiful notifications to any Livewire app.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-11-28T11:21:34+00:00"
- },
- {
- "name": "filament/query-builder",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/query-builder.git",
- "reference": "d9d3ecf78a87c4fad9dad7959d7280bc73f780ed"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/query-builder/zipball/d9d3ecf78a87c4fad9dad7959d7280bc73f780ed",
- "reference": "d9d3ecf78a87c4fad9dad7959d7280bc73f780ed",
- "shasum": ""
- },
- "require": {
- "filament/actions": "self.version",
- "filament/forms": "self.version",
- "filament/schemas": "self.version",
- "filament/support": "self.version",
- "php": "^8.2"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\QueryBuilder\\QueryBuilderServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Filament\\QueryBuilder\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "A powerful query builder component for Filament.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-30T13:02:08+00:00"
- },
- {
- "name": "filament/schemas",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/schemas.git",
- "reference": "df5604b940d5eb82733b62560ac2aa2862fac5b0"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/schemas/zipball/df5604b940d5eb82733b62560ac2aa2862fac5b0",
- "reference": "df5604b940d5eb82733b62560ac2aa2862fac5b0",
- "shasum": ""
- },
- "require": {
- "danharrin/date-format-converter": "^0.3",
- "filament/actions": "self.version",
- "filament/support": "self.version",
- "php": "^8.2"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\Schemas\\SchemasServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Filament\\Schemas\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Easily add beautiful UI to any Livewire component.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-30T13:02:44+00:00"
- },
- {
- "name": "filament/spatie-laravel-media-library-plugin",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/spatie-laravel-media-library-plugin.git",
- "reference": "73748df28a9c2e8c34d2c02f9314c330602e1830"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/spatie-laravel-media-library-plugin/zipball/73748df28a9c2e8c34d2c02f9314c330602e1830",
- "reference": "73748df28a9c2e8c34d2c02f9314c330602e1830",
- "shasum": ""
- },
- "require": {
- "filament/support": "self.version",
- "php": "^8.2",
- "spatie/laravel-medialibrary": "^11.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Filament\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Filament support for `spatie/laravel-medialibrary`.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-09T09:54:02+00:00"
- },
- {
- "name": "filament/spatie-laravel-tags-plugin",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/spatie-laravel-tags-plugin.git",
- "reference": "2f90daee868c1d1031180c51045baa77afebf9a7"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/spatie-laravel-tags-plugin/zipball/2f90daee868c1d1031180c51045baa77afebf9a7",
- "reference": "2f90daee868c1d1031180c51045baa77afebf9a7",
- "shasum": ""
- },
- "require": {
- "filament/support": "self.version",
- "php": "^8.2",
- "spatie/laravel-tags": "^4.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Filament\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Filament support for `spatie/laravel-tags`.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-09T09:52:55+00:00"
- },
- {
- "name": "filament/support",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/support.git",
- "reference": "0029ed0bde9c26b85775cdf135dce8ee1cbbdabe"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/support/zipball/0029ed0bde9c26b85775cdf135dce8ee1cbbdabe",
- "reference": "0029ed0bde9c26b85775cdf135dce8ee1cbbdabe",
- "shasum": ""
- },
- "require": {
- "blade-ui-kit/blade-heroicons": "^2.5",
- "danharrin/livewire-rate-limiting": "^2.0",
- "ext-intl": "*",
- "illuminate/contracts": "^11.28|^12.0",
- "kirschbaum-development/eloquent-power-joins": "^4.0",
- "league/uri-components": "^7.0",
- "livewire/livewire": "^3.5",
- "nette/php-generator": "^4.0",
- "php": "^8.2",
- "ryangjchandler/blade-capture-directive": "^1.0",
- "spatie/invade": "^2.0",
- "spatie/laravel-package-tools": "^1.9",
- "symfony/console": "^7.0",
- "symfony/html-sanitizer": "^7.0"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\Support\\SupportServiceProvider"
- ]
- }
- },
- "autoload": {
- "files": [
- "src/helpers.php"
- ],
- "psr-4": {
- "Filament\\Support\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Core helper methods and foundation code for all Filament packages.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-30T13:02:27+00:00"
- },
- {
- "name": "filament/tables",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/tables.git",
- "reference": "012af14bfd7bb8b501d2d542f74fadf7836f57bc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/tables/zipball/012af14bfd7bb8b501d2d542f74fadf7836f57bc",
- "reference": "012af14bfd7bb8b501d2d542f74fadf7836f57bc",
- "shasum": ""
- },
- "require": {
- "filament/actions": "self.version",
- "filament/forms": "self.version",
- "filament/query-builder": "self.version",
- "filament/support": "self.version",
- "php": "^8.2"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\Tables\\TablesServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Filament\\Tables\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Easily add beautiful tables to any Livewire component.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-30T13:02:11+00:00"
- },
- {
- "name": "filament/widgets",
- "version": "v4.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/filamentphp/widgets.git",
- "reference": "80141884dba3892d398d4913b7591b7d40fd50c8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filamentphp/widgets/zipball/80141884dba3892d398d4913b7591b7d40fd50c8",
- "reference": "80141884dba3892d398d4913b7591b7d40fd50c8",
- "shasum": ""
- },
- "require": {
- "filament/schemas": "self.version",
- "filament/support": "self.version",
- "php": "^8.2"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Filament\\Widgets\\WidgetsServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Filament\\Widgets\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Easily add beautiful dashboard widgets to any Livewire component.",
- "homepage": "https://github.com/filamentphp/filament",
- "support": {
- "issues": "https://github.com/filamentphp/filament/issues",
- "source": "https://github.com/filamentphp/filament"
- },
- "time": "2025-12-30T13:02:08+00:00"
- },
{
"name": "fruitcake/php-cors",
"version": "v1.4.0",
@@ -2603,69 +1157,6 @@
],
"time": "2025-08-22T14:27:06+00:00"
},
- {
- "name": "kirschbaum-development/eloquent-power-joins",
- "version": "4.2.11",
- "source": {
- "type": "git",
- "url": "https://github.com/kirschbaum-development/eloquent-power-joins.git",
- "reference": "0e3e3372992e4bf82391b3c7b84b435c3db73588"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/0e3e3372992e4bf82391b3c7b84b435c3db73588",
- "reference": "0e3e3372992e4bf82391b3c7b84b435c3db73588",
- "shasum": ""
- },
- "require": {
- "illuminate/database": "^11.42|^12.0",
- "illuminate/support": "^11.42|^12.0",
- "php": "^8.2"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "dev-master",
- "laravel/legacy-factories": "^1.0@dev",
- "orchestra/testbench": "^9.0|^10.0",
- "phpunit/phpunit": "^10.0|^11.0"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Kirschbaum\\PowerJoins\\PowerJoinsServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Kirschbaum\\PowerJoins\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Luis Dalmolin",
- "email": "luis.nh@gmail.com",
- "role": "Developer"
- }
- ],
- "description": "The Laravel magic applied to joins.",
- "homepage": "https://github.com/kirschbaum-development/eloquent-power-joins",
- "keywords": [
- "eloquent",
- "join",
- "laravel",
- "mysql"
- ],
- "support": {
- "issues": "https://github.com/kirschbaum-development/eloquent-power-joins/issues",
- "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.2.11"
- },
- "time": "2025-12-17T00:37:48+00:00"
- },
{
"name": "laravel/fortify",
"version": "v1.33.0",
@@ -2731,16 +1222,16 @@
},
{
"name": "laravel/framework",
- "version": "v12.46.0",
+ "version": "v12.44.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "9dcff48d25a632c1fadb713024c952fec489c4ae"
+ "reference": "592bbf1c036042958332eb98e3e8131b29102f33"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/9dcff48d25a632c1fadb713024c952fec489c4ae",
- "reference": "9dcff48d25a632c1fadb713024c952fec489c4ae",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/592bbf1c036042958332eb98e3e8131b29102f33",
+ "reference": "592bbf1c036042958332eb98e3e8131b29102f33",
"shasum": ""
},
"require": {
@@ -2949,7 +1440,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2026-01-07T23:26:53+00:00"
+ "time": "2025-12-23T15:29:43+00:00"
},
{
"name": "laravel/prompts",
@@ -3010,148 +1501,6 @@
},
"time": "2025-11-21T20:52:52+00:00"
},
- {
- "name": "laravel/reverb",
- "version": "v1.7.1",
- "source": {
- "type": "git",
- "url": "https://github.com/laravel/reverb.git",
- "reference": "a069484cb972dc948518ea359b611ede23d2ce3d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/laravel/reverb/zipball/a069484cb972dc948518ea359b611ede23d2ce3d",
- "reference": "a069484cb972dc948518ea359b611ede23d2ce3d",
- "shasum": ""
- },
- "require": {
- "clue/redis-react": "^2.6",
- "guzzlehttp/psr7": "^2.6",
- "illuminate/console": "^10.47|^11.0|^12.0|^13.0",
- "illuminate/contracts": "^10.47|^11.0|^12.0|^13.0",
- "illuminate/http": "^10.47|^11.0|^12.0|^13.0",
- "illuminate/support": "^10.47|^11.0|^12.0|^13.0",
- "laravel/prompts": "^0.1.15|^0.2.0|^0.3.0",
- "php": "^8.2",
- "pusher/pusher-php-server": "^7.2",
- "ratchet/rfc6455": "^0.4",
- "react/promise-timer": "^1.10",
- "react/socket": "^1.14",
- "symfony/console": "^6.0|^7.0|^8.0",
- "symfony/http-foundation": "^6.3|^7.0|^8.0"
- },
- "require-dev": {
- "orchestra/testbench": "^8.36|^9.15|^10.8|^11.0",
- "pestphp/pest": "^2.0|^3.0|^4.0",
- "phpstan/phpstan": "^1.10",
- "ratchet/pawl": "^0.4.1",
- "react/async": "^4.2",
- "react/http": "^1.9"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Laravel\\Reverb\\ApplicationManagerServiceProvider",
- "Laravel\\Reverb\\ReverbServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Laravel\\Reverb\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Taylor Otwell",
- "email": "taylor@laravel.com"
- },
- {
- "name": "Joe Dixon",
- "email": "joe@laravel.com"
- }
- ],
- "description": "Laravel Reverb provides a real-time WebSocket communication backend for Laravel applications.",
- "keywords": [
- "WebSockets",
- "laravel",
- "real-time",
- "websocket"
- ],
- "support": {
- "issues": "https://github.com/laravel/reverb/issues",
- "source": "https://github.com/laravel/reverb/tree/v1.7.1"
- },
- "time": "2026-02-04T15:07:19+00:00"
- },
- {
- "name": "laravel/sanctum",
- "version": "v4.2.2",
- "source": {
- "type": "git",
- "url": "https://github.com/laravel/sanctum.git",
- "reference": "fd447754d2d3f56950d53b930128af2e3b617de9"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/laravel/sanctum/zipball/fd447754d2d3f56950d53b930128af2e3b617de9",
- "reference": "fd447754d2d3f56950d53b930128af2e3b617de9",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "illuminate/console": "^11.0|^12.0",
- "illuminate/contracts": "^11.0|^12.0",
- "illuminate/database": "^11.0|^12.0",
- "illuminate/support": "^11.0|^12.0",
- "php": "^8.2",
- "symfony/console": "^7.0"
- },
- "require-dev": {
- "mockery/mockery": "^1.6",
- "orchestra/testbench": "^9.15|^10.8",
- "phpstan/phpstan": "^1.10"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Laravel\\Sanctum\\SanctumServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Laravel\\Sanctum\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Taylor Otwell",
- "email": "taylor@laravel.com"
- }
- ],
- "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.",
- "keywords": [
- "auth",
- "laravel",
- "sanctum"
- ],
- "support": {
- "issues": "https://github.com/laravel/sanctum/issues",
- "source": "https://github.com/laravel/sanctum"
- },
- "time": "2026-01-06T23:11:51+00:00"
- },
{
"name": "laravel/serializable-closure",
"version": "v2.0.7",
@@ -3468,109 +1817,18 @@
],
"time": "2022-12-11T20:36:23+00:00"
},
- {
- "name": "league/csv",
- "version": "9.28.0",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/csv.git",
- "reference": "6582ace29ae09ba5b07049d40ea13eb19c8b5073"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/csv/zipball/6582ace29ae09ba5b07049d40ea13eb19c8b5073",
- "reference": "6582ace29ae09ba5b07049d40ea13eb19c8b5073",
- "shasum": ""
- },
- "require": {
- "ext-filter": "*",
- "php": "^8.1.2"
- },
- "require-dev": {
- "ext-dom": "*",
- "ext-xdebug": "*",
- "friendsofphp/php-cs-fixer": "^3.92.3",
- "phpbench/phpbench": "^1.4.3",
- "phpstan/phpstan": "^1.12.32",
- "phpstan/phpstan-deprecation-rules": "^1.2.1",
- "phpstan/phpstan-phpunit": "^1.4.2",
- "phpstan/phpstan-strict-rules": "^1.6.2",
- "phpunit/phpunit": "^10.5.16 || ^11.5.22 || ^12.5.4",
- "symfony/var-dumper": "^6.4.8 || ^7.4.0 || ^8.0"
- },
- "suggest": {
- "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes",
- "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters",
- "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters",
- "ext-mysqli": "Requiered to use the package with the MySQLi extension",
- "ext-pdo": "Required to use the package with the PDO extension",
- "ext-pgsql": "Requiered to use the package with the PgSQL extension",
- "ext-sqlite3": "Required to use the package with the SQLite3 extension"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "9.x-dev"
- }
- },
- "autoload": {
- "files": [
- "src/functions_include.php"
- ],
- "psr-4": {
- "League\\Csv\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Ignace Nyamagana Butera",
- "email": "nyamsprod@gmail.com",
- "homepage": "https://github.com/nyamsprod/",
- "role": "Developer"
- }
- ],
- "description": "CSV data manipulation made easy in PHP",
- "homepage": "https://csv.thephpleague.com",
- "keywords": [
- "convert",
- "csv",
- "export",
- "filter",
- "import",
- "read",
- "transform",
- "write"
- ],
- "support": {
- "docs": "https://csv.thephpleague.com",
- "issues": "https://github.com/thephpleague/csv/issues",
- "rss": "https://github.com/thephpleague/csv/releases.atom",
- "source": "https://github.com/thephpleague/csv"
- },
- "funding": [
- {
- "url": "https://github.com/sponsors/nyamsprod",
- "type": "github"
- }
- ],
- "time": "2025-12-27T15:18:42+00:00"
- },
{
"name": "league/flysystem",
- "version": "3.31.0",
+ "version": "3.30.2",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff"
+ "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1717e0b3642b0df65ecb0cc89cdd99fa840672ff",
- "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277",
+ "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277",
"shasum": ""
},
"require": {
@@ -3638,77 +1896,22 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/3.31.0"
+ "source": "https://github.com/thephpleague/flysystem/tree/3.30.2"
},
- "time": "2026-01-23T15:38:47+00:00"
- },
- {
- "name": "league/flysystem-aws-s3-v3",
- "version": "3.31.0",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
- "reference": "e36a2bc60b06332c92e4435047797ded352b446f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/e36a2bc60b06332c92e4435047797ded352b446f",
- "reference": "e36a2bc60b06332c92e4435047797ded352b446f",
- "shasum": ""
- },
- "require": {
- "aws/aws-sdk-php": "^3.295.10",
- "league/flysystem": "^3.10.0",
- "league/mime-type-detection": "^1.0.0",
- "php": "^8.0.2"
- },
- "conflict": {
- "guzzlehttp/guzzle": "<7.0",
- "guzzlehttp/ringphp": "<1.1.1"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "League\\Flysystem\\AwsS3V3\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Frank de Jonge",
- "email": "info@frankdejonge.nl"
- }
- ],
- "description": "AWS S3 filesystem adapter for Flysystem.",
- "keywords": [
- "Flysystem",
- "aws",
- "file",
- "files",
- "filesystem",
- "s3",
- "storage"
- ],
- "support": {
- "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.31.0"
- },
- "time": "2026-01-23T15:30:45+00:00"
+ "time": "2025-11-10T17:13:11+00:00"
},
{
"name": "league/flysystem-local",
- "version": "3.31.0",
+ "version": "3.30.2",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-local.git",
- "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079"
+ "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079",
- "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ab4f9d0d672f601b102936aa728801dd1a11968d",
+ "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d",
"shasum": ""
},
"require": {
@@ -3742,9 +1945,9 @@
"local"
],
"support": {
- "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0"
+ "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.2"
},
- "time": "2026-01-23T15:30:45+00:00"
+ "time": "2025-11-10T11:23:37+00:00"
},
{
"name": "league/mime-type-detection",
@@ -3900,91 +2103,6 @@
],
"time": "2025-12-07T16:02:06+00:00"
},
- {
- "name": "league/uri-components",
- "version": "7.7.0",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/uri-components.git",
- "reference": "005f8693ce8c1f16f80e88a05cbf08da04c1c374"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/005f8693ce8c1f16f80e88a05cbf08da04c1c374",
- "reference": "005f8693ce8c1f16f80e88a05cbf08da04c1c374",
- "shasum": ""
- },
- "require": {
- "league/uri": "^7.7",
- "php": "^8.1"
- },
- "suggest": {
- "bakame/aide-uri": "A polyfill for PHP8.1 until PHP8.4 to add support to PHP Native URI parser",
- "ext-bcmath": "to improve IPV4 host parsing",
- "ext-fileinfo": "to create Data URI from file contennts",
- "ext-gmp": "to improve IPV4 host parsing",
- "ext-intl": "to handle IDN host with the best performance",
- "ext-mbstring": "to use the sorting algorithm of URLSearchParams",
- "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain",
- "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP",
- "php-64bit": "to improve IPV4 host parsing",
- "rowbot/url": "to handle WHATWG URL",
- "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "7.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "League\\Uri\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Ignace Nyamagana Butera",
- "email": "nyamsprod@gmail.com",
- "homepage": "https://nyamsprod.com"
- }
- ],
- "description": "URI components manipulation library",
- "homepage": "http://uri.thephpleague.com",
- "keywords": [
- "authority",
- "components",
- "fragment",
- "host",
- "middleware",
- "modifier",
- "path",
- "port",
- "query",
- "rfc3986",
- "scheme",
- "uri",
- "url",
- "userinfo"
- ],
- "support": {
- "docs": "https://uri.thephpleague.com",
- "forum": "https://thephpleague.slack.com",
- "issues": "https://github.com/thephpleague/uri-src/issues",
- "source": "https://github.com/thephpleague/uri-components/tree/7.7.0"
- },
- "funding": [
- {
- "url": "https://github.com/nyamsprod",
- "type": "github"
- }
- ],
- "time": "2025-12-07T16:02:56+00:00"
- },
{
"name": "league/uri-interfaces",
"version": "7.7.0",
@@ -4211,163 +2329,18 @@
],
"time": "2025-12-19T02:00:29+00:00"
},
- {
- "name": "maennchen/zipstream-php",
- "version": "3.2.1",
- "source": {
- "type": "git",
- "url": "https://github.com/maennchen/ZipStream-PHP.git",
- "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/682f1098a8fddbaf43edac2306a691c7ad508ec5",
- "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5",
- "shasum": ""
- },
- "require": {
- "ext-mbstring": "*",
- "ext-zlib": "*",
- "php-64bit": "^8.3"
- },
- "require-dev": {
- "brianium/paratest": "^7.7",
- "ext-zip": "*",
- "friendsofphp/php-cs-fixer": "^3.86",
- "guzzlehttp/guzzle": "^7.5",
- "mikey179/vfsstream": "^1.6",
- "php-coveralls/php-coveralls": "^2.5",
- "phpunit/phpunit": "^12.0",
- "vimeo/psalm": "^6.0"
- },
- "suggest": {
- "guzzlehttp/psr7": "^2.4",
- "psr/http-message": "^2.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "ZipStream\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Paul Duncan",
- "email": "pabs@pablotron.org"
- },
- {
- "name": "Jonatan Männchen",
- "email": "jonatan@maennchen.ch"
- },
- {
- "name": "Jesse Donat",
- "email": "donatj@gmail.com"
- },
- {
- "name": "András Kolesár",
- "email": "kolesar@kolesar.hu"
- }
- ],
- "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
- "keywords": [
- "stream",
- "zip"
- ],
- "support": {
- "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
- "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.1"
- },
- "funding": [
- {
- "url": "https://github.com/maennchen",
- "type": "github"
- }
- ],
- "time": "2025-12-10T09:58:31+00:00"
- },
- {
- "name": "masterminds/html5",
- "version": "2.10.0",
- "source": {
- "type": "git",
- "url": "https://github.com/Masterminds/html5-php.git",
- "reference": "fcf91eb64359852f00d921887b219479b4f21251"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251",
- "reference": "fcf91eb64359852f00d921887b219479b4f21251",
- "shasum": ""
- },
- "require": {
- "ext-dom": "*",
- "php": ">=5.3.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.7-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Masterminds\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Matt Butcher",
- "email": "technosophos@gmail.com"
- },
- {
- "name": "Matt Farina",
- "email": "matt@mattfarina.com"
- },
- {
- "name": "Asmir Mustafic",
- "email": "goetas@gmail.com"
- }
- ],
- "description": "An HTML5 parser and serializer.",
- "homepage": "http://masterminds.github.io/html5-php",
- "keywords": [
- "HTML5",
- "dom",
- "html",
- "parser",
- "querypath",
- "serializer",
- "xml"
- ],
- "support": {
- "issues": "https://github.com/Masterminds/html5-php/issues",
- "source": "https://github.com/Masterminds/html5-php/tree/2.10.0"
- },
- "time": "2025-07-25T09:04:22+00:00"
- },
{
"name": "monolog/monolog",
- "version": "3.10.0",
+ "version": "3.9.0",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0"
+ "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0",
- "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6",
+ "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6",
"shasum": ""
},
"require": {
@@ -4385,7 +2358,7 @@
"graylog2/gelf-php": "^1.4.2 || ^2.0",
"guzzlehttp/guzzle": "^7.4.5",
"guzzlehttp/psr7": "^2.2",
- "mongodb/mongodb": "^1.8 || ^2.0",
+ "mongodb/mongodb": "^1.8",
"php-amqplib/php-amqplib": "~2.4 || ^3",
"php-console/php-console": "^3.1.8",
"phpstan/phpstan": "^2",
@@ -4445,7 +2418,7 @@
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/3.10.0"
+ "source": "https://github.com/Seldaek/monolog/tree/3.9.0"
},
"funding": [
{
@@ -4457,73 +2430,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-02T08:56:05+00:00"
- },
- {
- "name": "mtdowling/jmespath.php",
- "version": "2.8.0",
- "source": {
- "type": "git",
- "url": "https://github.com/jmespath/jmespath.php.git",
- "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc",
- "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc",
- "shasum": ""
- },
- "require": {
- "php": "^7.2.5 || ^8.0",
- "symfony/polyfill-mbstring": "^1.17"
- },
- "require-dev": {
- "composer/xdebug-handler": "^3.0.3",
- "phpunit/phpunit": "^8.5.33"
- },
- "bin": [
- "bin/jp.php"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.8-dev"
- }
- },
- "autoload": {
- "files": [
- "src/JmesPath.php"
- ],
- "psr-4": {
- "JmesPath\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Graham Campbell",
- "email": "hello@gjcampbell.co.uk",
- "homepage": "https://github.com/GrahamCampbell"
- },
- {
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
- }
- ],
- "description": "Declaratively specify how to extract elements from a JSON document",
- "keywords": [
- "json",
- "jsonpath"
- ],
- "support": {
- "issues": "https://github.com/jmespath/jmespath.php/issues",
- "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0"
- },
- "time": "2024-09-04T18:46:31+00:00"
+ "time": "2025-03-24T10:02:05+00:00"
},
{
"name": "nesbot/carbon",
@@ -4630,78 +2537,6 @@
],
"time": "2025-12-02T21:04:28+00:00"
},
- {
- "name": "nette/php-generator",
- "version": "v4.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/nette/php-generator.git",
- "reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nette/php-generator/zipball/4707546a1f11badd72f5d82af4f8a6bc64bd56ac",
- "reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac",
- "shasum": ""
- },
- "require": {
- "nette/utils": "^4.0.6",
- "php": "8.1 - 8.5"
- },
- "require-dev": {
- "jetbrains/phpstorm-attributes": "^1.2",
- "nette/tester": "^2.4",
- "nikic/php-parser": "^5.0",
- "phpstan/phpstan-nette": "^2.0@stable",
- "tracy/tracy": "^2.8"
- },
- "suggest": {
- "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.2-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Nette\\": "src"
- },
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause",
- "GPL-2.0-only",
- "GPL-3.0-only"
- ],
- "authors": [
- {
- "name": "David Grudl",
- "homepage": "https://davidgrudl.com"
- },
- {
- "name": "Nette Community",
- "homepage": "https://nette.org/contributors"
- }
- ],
- "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.5 features.",
- "homepage": "https://nette.org",
- "keywords": [
- "code",
- "nette",
- "php",
- "scaffolding"
- ],
- "support": {
- "issues": "https://github.com/nette/php-generator/issues",
- "source": "https://github.com/nette/php-generator/tree/v4.2.0"
- },
- "time": "2025-08-06T18:24:31+00:00"
- },
{
"name": "nette/schema",
"version": "v1.3.3",
@@ -5001,99 +2836,6 @@
],
"time": "2025-11-20T02:34:59+00:00"
},
- {
- "name": "openspout/openspout",
- "version": "v4.32.0",
- "source": {
- "type": "git",
- "url": "https://github.com/openspout/openspout.git",
- "reference": "41f045c1f632e1474e15d4c7bc3abcb4a153563d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/openspout/openspout/zipball/41f045c1f632e1474e15d4c7bc3abcb4a153563d",
- "reference": "41f045c1f632e1474e15d4c7bc3abcb4a153563d",
- "shasum": ""
- },
- "require": {
- "ext-dom": "*",
- "ext-fileinfo": "*",
- "ext-filter": "*",
- "ext-libxml": "*",
- "ext-xmlreader": "*",
- "ext-zip": "*",
- "php": "~8.3.0 || ~8.4.0 || ~8.5.0"
- },
- "require-dev": {
- "ext-zlib": "*",
- "friendsofphp/php-cs-fixer": "^3.86.0",
- "infection/infection": "^0.31.2",
- "phpbench/phpbench": "^1.4.1",
- "phpstan/phpstan": "^2.1.22",
- "phpstan/phpstan-phpunit": "^2.0.7",
- "phpstan/phpstan-strict-rules": "^2.0.6",
- "phpunit/phpunit": "^12.3.7"
- },
- "suggest": {
- "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)",
- "ext-mbstring": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.3.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "OpenSpout\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Adrien Loison",
- "email": "adrien@box.com"
- }
- ],
- "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way",
- "homepage": "https://github.com/openspout/openspout",
- "keywords": [
- "OOXML",
- "csv",
- "excel",
- "memory",
- "odf",
- "ods",
- "office",
- "open",
- "php",
- "read",
- "scale",
- "spreadsheet",
- "stream",
- "write",
- "xlsx"
- ],
- "support": {
- "issues": "https://github.com/openspout/openspout/issues",
- "source": "https://github.com/openspout/openspout/tree/v4.32.0"
- },
- "funding": [
- {
- "url": "https://paypal.me/filippotessarotto",
- "type": "custom"
- },
- {
- "url": "https://github.com/Slamdunk",
- "type": "github"
- }
- ],
- "time": "2025-09-03T16:03:54+00:00"
- },
{
"name": "paragonie/constant_time_encoding",
"version": "v3.1.3",
@@ -5163,102 +2905,6 @@
},
"time": "2025-09-24T15:06:41+00:00"
},
- {
- "name": "paragonie/sodium_compat",
- "version": "v2.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/paragonie/sodium_compat.git",
- "reference": "4714da6efdc782c06690bc72ce34fae7941c2d9f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/4714da6efdc782c06690bc72ce34fae7941c2d9f",
- "reference": "4714da6efdc782c06690bc72ce34fae7941c2d9f",
- "shasum": ""
- },
- "require": {
- "php": "^8.1",
- "php-64bit": "*"
- },
- "require-dev": {
- "infection/infection": "^0",
- "nikic/php-fuzzer": "^0",
- "phpunit/phpunit": "^7|^8|^9|^10|^11",
- "vimeo/psalm": "^4|^5|^6"
- },
- "suggest": {
- "ext-sodium": "Better performance, password hashing (Argon2i), secure memory management (memzero), and better security."
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
- "autoload": {
- "files": [
- "autoload.php"
- ],
- "psr-4": {
- "ParagonIE\\Sodium\\": "namespaced/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "ISC"
- ],
- "authors": [
- {
- "name": "Paragon Initiative Enterprises",
- "email": "security@paragonie.com"
- },
- {
- "name": "Frank Denis",
- "email": "jedisct1@pureftpd.org"
- }
- ],
- "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists",
- "keywords": [
- "Authentication",
- "BLAKE2b",
- "ChaCha20",
- "ChaCha20-Poly1305",
- "Chapoly",
- "Curve25519",
- "Ed25519",
- "EdDSA",
- "Edwards-curve Digital Signature Algorithm",
- "Elliptic Curve Diffie-Hellman",
- "Poly1305",
- "Pure-PHP cryptography",
- "RFC 7748",
- "RFC 8032",
- "Salpoly",
- "Salsa20",
- "X25519",
- "XChaCha20-Poly1305",
- "XSalsa20-Poly1305",
- "Xchacha20",
- "Xsalsa20",
- "aead",
- "cryptography",
- "ecdh",
- "elliptic curve",
- "elliptic curve cryptography",
- "encryption",
- "libsodium",
- "php",
- "public-key cryptography",
- "secret-key cryptography",
- "side-channel resistant"
- ],
- "support": {
- "issues": "https://github.com/paragonie/sodium_compat/issues",
- "source": "https://github.com/paragonie/sodium_compat/tree/v2.5.0"
- },
- "time": "2025-12-30T16:12:18+00:00"
- },
{
"name": "phpoption/phpoption",
"version": "1.9.5",
@@ -5386,73 +3032,6 @@
},
"time": "2025-09-19T22:51:08+00:00"
},
- {
- "name": "pragmarx/google2fa-qrcode",
- "version": "v3.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/antonioribeiro/google2fa-qrcode.git",
- "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/ce4d8a729b6c93741c607cfb2217acfffb5bf76b",
- "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1",
- "pragmarx/google2fa": ">=4.0"
- },
- "require-dev": {
- "bacon/bacon-qr-code": "^2.0",
- "chillerlan/php-qrcode": "^1.0|^2.0|^3.0|^4.0",
- "khanamiryan/qrcode-detector-decoder": "^1.0",
- "phpunit/phpunit": "~4|~5|~6|~7|~8|~9"
- },
- "suggest": {
- "bacon/bacon-qr-code": "For QR Code generation, requires imagick",
- "chillerlan/php-qrcode": "For QR Code generation"
- },
- "type": "library",
- "extra": {
- "component": "package",
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "PragmaRX\\Google2FAQRCode\\": "src/",
- "PragmaRX\\Google2FAQRCode\\Tests\\": "tests/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Antonio Carlos Ribeiro",
- "email": "acr@antoniocarlosribeiro.com",
- "role": "Creator & Designer"
- }
- ],
- "description": "QR Code package for Google2FA",
- "keywords": [
- "2fa",
- "Authentication",
- "Two Factor Authentication",
- "google2fa",
- "qr code",
- "qrcode"
- ],
- "support": {
- "issues": "https://github.com/antonioribeiro/google2fa-qrcode/issues",
- "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v3.0.0"
- },
- "time": "2021-08-15T12:53:48+00:00"
- },
{
"name": "psr/clock",
"version": "1.0.0",
@@ -5944,67 +3523,6 @@
},
"time": "2025-12-17T14:35:46+00:00"
},
- {
- "name": "pusher/pusher-php-server",
- "version": "7.2.7",
- "source": {
- "type": "git",
- "url": "https://github.com/pusher/pusher-http-php.git",
- "reference": "148b0b5100d000ed57195acdf548a2b1b38ee3f7"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/pusher/pusher-http-php/zipball/148b0b5100d000ed57195acdf548a2b1b38ee3f7",
- "reference": "148b0b5100d000ed57195acdf548a2b1b38ee3f7",
- "shasum": ""
- },
- "require": {
- "ext-curl": "*",
- "ext-json": "*",
- "guzzlehttp/guzzle": "^7.2",
- "paragonie/sodium_compat": "^1.6|^2.0",
- "php": "^7.3|^8.0",
- "psr/log": "^1.0|^2.0|^3.0"
- },
- "require-dev": {
- "overtrue/phplint": "^2.3",
- "phpunit/phpunit": "^9.3"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Pusher\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Library for interacting with the Pusher REST API",
- "keywords": [
- "events",
- "messaging",
- "php-pusher-server",
- "publish",
- "push",
- "pusher",
- "real time",
- "real-time",
- "realtime",
- "rest",
- "trigger"
- ],
- "support": {
- "issues": "https://github.com/pusher/pusher-http-php/issues",
- "source": "https://github.com/pusher/pusher-http-php/tree/7.2.7"
- },
- "time": "2025-01-06T10:56:20+00:00"
- },
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
@@ -6203,1462 +3721,6 @@
},
"time": "2025-12-14T04:43:48+00:00"
},
- {
- "name": "ratchet/rfc6455",
- "version": "v0.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/ratchetphp/RFC6455.git",
- "reference": "859d95f85dda0912c6d5b936d036d044e3af47ef"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ratchetphp/RFC6455/zipball/859d95f85dda0912c6d5b936d036d044e3af47ef",
- "reference": "859d95f85dda0912c6d5b936d036d044e3af47ef",
- "shasum": ""
- },
- "require": {
- "php": ">=7.4",
- "psr/http-factory-implementation": "^1.0",
- "symfony/polyfill-php80": "^1.15"
- },
- "require-dev": {
- "guzzlehttp/psr7": "^2.7",
- "phpunit/phpunit": "^9.5",
- "react/socket": "^1.3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Ratchet\\RFC6455\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "role": "Developer"
- },
- {
- "name": "Matt Bonneau",
- "role": "Developer"
- }
- ],
- "description": "RFC6455 WebSocket protocol handler",
- "homepage": "http://socketo.me",
- "keywords": [
- "WebSockets",
- "rfc6455",
- "websocket"
- ],
- "support": {
- "chat": "https://gitter.im/reactphp/reactphp",
- "issues": "https://github.com/ratchetphp/RFC6455/issues",
- "source": "https://github.com/ratchetphp/RFC6455/tree/v0.4.0"
- },
- "time": "2025-02-24T01:18:22+00:00"
- },
- {
- "name": "react/cache",
- "version": "v1.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/cache.git",
- "reference": "d47c472b64aa5608225f47965a484b75c7817d5b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b",
- "reference": "d47c472b64aa5608225f47965a484b75c7817d5b",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0",
- "react/promise": "^3.0 || ^2.0 || ^1.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Cache\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "Async, Promise-based cache interface for ReactPHP",
- "keywords": [
- "cache",
- "caching",
- "promise",
- "reactphp"
- ],
- "support": {
- "issues": "https://github.com/reactphp/cache/issues",
- "source": "https://github.com/reactphp/cache/tree/v1.2.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2022-11-30T15:59:55+00:00"
- },
- {
- "name": "react/dns",
- "version": "v1.14.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/dns.git",
- "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3",
- "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0",
- "react/cache": "^1.0 || ^0.6 || ^0.5",
- "react/event-loop": "^1.2",
- "react/promise": "^3.2 || ^2.7 || ^1.2.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
- "react/async": "^4.3 || ^3 || ^2",
- "react/promise-timer": "^1.11"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Dns\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "Async DNS resolver for ReactPHP",
- "keywords": [
- "async",
- "dns",
- "dns-resolver",
- "reactphp"
- ],
- "support": {
- "issues": "https://github.com/reactphp/dns/issues",
- "source": "https://github.com/reactphp/dns/tree/v1.14.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2025-11-18T19:34:28+00:00"
- },
- {
- "name": "react/event-loop",
- "version": "v1.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/event-loop.git",
- "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a",
- "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
- },
- "suggest": {
- "ext-pcntl": "For signal handling support when using the StreamSelectLoop"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\EventLoop\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
- "keywords": [
- "asynchronous",
- "event-loop"
- ],
- "support": {
- "issues": "https://github.com/reactphp/event-loop/issues",
- "source": "https://github.com/reactphp/event-loop/tree/v1.6.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2025-11-17T20:46:25+00:00"
- },
- {
- "name": "react/promise",
- "version": "v3.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/promise.git",
- "reference": "23444f53a813a3296c1368bb104793ce8d88f04a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a",
- "reference": "23444f53a813a3296c1368bb104793ce8d88f04a",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1.0"
- },
- "require-dev": {
- "phpstan/phpstan": "1.12.28 || 1.4.10",
- "phpunit/phpunit": "^9.6 || ^7.5"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/functions_include.php"
- ],
- "psr-4": {
- "React\\Promise\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "A lightweight implementation of CommonJS Promises/A for PHP",
- "keywords": [
- "promise",
- "promises"
- ],
- "support": {
- "issues": "https://github.com/reactphp/promise/issues",
- "source": "https://github.com/reactphp/promise/tree/v3.3.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2025-08-19T18:57:03+00:00"
- },
- {
- "name": "react/promise-timer",
- "version": "v1.11.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/promise-timer.git",
- "reference": "4f70306ed66b8b44768941ca7f142092600fafc1"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/4f70306ed66b8b44768941ca7f142092600fafc1",
- "reference": "4f70306ed66b8b44768941ca7f142092600fafc1",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3",
- "react/event-loop": "^1.2",
- "react/promise": "^3.2 || ^2.7.0 || ^1.2.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/functions_include.php"
- ],
- "psr-4": {
- "React\\Promise\\Timer\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.",
- "homepage": "https://github.com/reactphp/promise-timer",
- "keywords": [
- "async",
- "event-loop",
- "promise",
- "reactphp",
- "timeout",
- "timer"
- ],
- "support": {
- "issues": "https://github.com/reactphp/promise-timer/issues",
- "source": "https://github.com/reactphp/promise-timer/tree/v1.11.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2024-06-04T14:27:45+00:00"
- },
- {
- "name": "react/socket",
- "version": "v1.17.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/socket.git",
- "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08",
- "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08",
- "shasum": ""
- },
- "require": {
- "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
- "php": ">=5.3.0",
- "react/dns": "^1.13",
- "react/event-loop": "^1.2",
- "react/promise": "^3.2 || ^2.6 || ^1.2.1",
- "react/stream": "^1.4"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
- "react/async": "^4.3 || ^3.3 || ^2",
- "react/promise-stream": "^1.4",
- "react/promise-timer": "^1.11"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Socket\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
- "keywords": [
- "Connection",
- "Socket",
- "async",
- "reactphp",
- "stream"
- ],
- "support": {
- "issues": "https://github.com/reactphp/socket/issues",
- "source": "https://github.com/reactphp/socket/tree/v1.17.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2025-11-19T20:47:34+00:00"
- },
- {
- "name": "react/stream",
- "version": "v1.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/stream.git",
- "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d",
- "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d",
- "shasum": ""
- },
- "require": {
- "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
- "php": ">=5.3.8",
- "react/event-loop": "^1.2"
- },
- "require-dev": {
- "clue/stream-filter": "~1.2",
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Stream\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
- "keywords": [
- "event-driven",
- "io",
- "non-blocking",
- "pipe",
- "reactphp",
- "readable",
- "stream",
- "writable"
- ],
- "support": {
- "issues": "https://github.com/reactphp/stream/issues",
- "source": "https://github.com/reactphp/stream/tree/v1.4.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2024-06-11T12:45:25+00:00"
- },
- {
- "name": "ryangjchandler/blade-capture-directive",
- "version": "v1.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/ryangjchandler/blade-capture-directive.git",
- "reference": "bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ryangjchandler/blade-capture-directive/zipball/bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d",
- "reference": "bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d",
- "shasum": ""
- },
- "require": {
- "illuminate/contracts": "^10.0|^11.0|^12.0",
- "php": "^8.1",
- "spatie/laravel-package-tools": "^1.9.2"
- },
- "require-dev": {
- "nunomaduro/collision": "^7.0|^8.0",
- "nunomaduro/larastan": "^2.0|^3.0",
- "orchestra/testbench": "^8.0|^9.0|^10.0",
- "pestphp/pest": "^2.0|^3.7",
- "pestphp/pest-plugin-laravel": "^2.0|^3.1",
- "phpstan/extension-installer": "^1.1",
- "phpstan/phpstan-deprecation-rules": "^1.0|^2.0",
- "phpstan/phpstan-phpunit": "^1.0|^2.0",
- "phpunit/phpunit": "^10.0|^11.5.3",
- "spatie/laravel-ray": "^1.26"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "aliases": {
- "BladeCaptureDirective": "RyanChandler\\BladeCaptureDirective\\Facades\\BladeCaptureDirective"
- },
- "providers": [
- "RyanChandler\\BladeCaptureDirective\\BladeCaptureDirectiveServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "RyanChandler\\BladeCaptureDirective\\": "src",
- "RyanChandler\\BladeCaptureDirective\\Database\\Factories\\": "database/factories"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Ryan Chandler",
- "email": "support@ryangjchandler.co.uk",
- "role": "Developer"
- }
- ],
- "description": "Create inline partials in your Blade templates with ease.",
- "homepage": "https://github.com/ryangjchandler/blade-capture-directive",
- "keywords": [
- "blade-capture-directive",
- "laravel",
- "ryangjchandler"
- ],
- "support": {
- "issues": "https://github.com/ryangjchandler/blade-capture-directive/issues",
- "source": "https://github.com/ryangjchandler/blade-capture-directive/tree/v1.1.0"
- },
- "funding": [
- {
- "url": "https://github.com/ryangjchandler",
- "type": "github"
- }
- ],
- "time": "2025-02-25T09:09:36+00:00"
- },
- {
- "name": "scrivo/highlight.php",
- "version": "v9.18.1.10",
- "source": {
- "type": "git",
- "url": "https://github.com/scrivo/highlight.php.git",
- "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/850f4b44697a2552e892ffe71490ba2733c2fc6e",
- "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "php": ">=5.4"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8|^5.7",
- "sabberworm/php-css-parser": "^8.3",
- "symfony/finder": "^2.8|^3.4|^5.4",
- "symfony/var-dumper": "^2.8|^3.4|^5.4"
- },
- "suggest": {
- "ext-mbstring": "Allows highlighting code with unicode characters and supports language with unicode keywords"
- },
- "type": "library",
- "autoload": {
- "files": [
- "HighlightUtilities/functions.php"
- ],
- "psr-0": {
- "Highlight\\": "",
- "HighlightUtilities\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Geert Bergman",
- "homepage": "http://www.scrivo.org/",
- "role": "Project Author"
- },
- {
- "name": "Vladimir Jimenez",
- "homepage": "https://allejo.io",
- "role": "Maintainer"
- },
- {
- "name": "Martin Folkers",
- "homepage": "https://twobrain.io",
- "role": "Contributor"
- }
- ],
- "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js",
- "keywords": [
- "code",
- "highlight",
- "highlight.js",
- "highlight.php",
- "syntax"
- ],
- "support": {
- "issues": "https://github.com/scrivo/highlight.php/issues",
- "source": "https://github.com/scrivo/highlight.php"
- },
- "funding": [
- {
- "url": "https://github.com/allejo",
- "type": "github"
- }
- ],
- "time": "2022-12-17T21:53:22+00:00"
- },
- {
- "name": "spatie/eloquent-sortable",
- "version": "4.5.2",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/eloquent-sortable.git",
- "reference": "c1c4f3a66cd41eb7458783c8a4c8e5d7924a9f20"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/c1c4f3a66cd41eb7458783c8a4c8e5d7924a9f20",
- "reference": "c1c4f3a66cd41eb7458783c8a4c8e5d7924a9f20",
- "shasum": ""
- },
- "require": {
- "illuminate/database": "^9.31|^10.0|^11.0|^12.0",
- "illuminate/support": "^9.31|^10.0|^11.0|^12.0",
- "nesbot/carbon": "^2.63|^3.0",
- "php": "^8.1",
- "spatie/laravel-package-tools": "^1.9"
- },
- "require-dev": {
- "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0",
- "phpunit/phpunit": "^9.5|^10.0|^11.5.3"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Spatie\\EloquentSortable\\EloquentSortableServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Spatie\\EloquentSortable\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be"
- }
- ],
- "description": "Sortable behaviour for eloquent models",
- "homepage": "https://github.com/spatie/eloquent-sortable",
- "keywords": [
- "behaviour",
- "eloquent",
- "laravel",
- "model",
- "sort",
- "sortable"
- ],
- "support": {
- "issues": "https://github.com/spatie/eloquent-sortable/issues",
- "source": "https://github.com/spatie/eloquent-sortable/tree/4.5.2"
- },
- "funding": [
- {
- "url": "https://spatie.be/open-source/support-us",
- "type": "custom"
- },
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2025-08-25T11:46:57+00:00"
- },
- {
- "name": "spatie/image",
- "version": "3.8.7",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/image.git",
- "reference": "4d35db207c4b317bc221d02ab7ba94aa78b44c24"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/image/zipball/4d35db207c4b317bc221d02ab7ba94aa78b44c24",
- "reference": "4d35db207c4b317bc221d02ab7ba94aa78b44c24",
- "shasum": ""
- },
- "require": {
- "ext-exif": "*",
- "ext-json": "*",
- "ext-mbstring": "*",
- "php": "^8.2",
- "spatie/image-optimizer": "^1.7.5",
- "spatie/temporary-directory": "^2.2",
- "symfony/process": "^6.4|^7.0|^8.0"
- },
- "require-dev": {
- "ext-gd": "*",
- "ext-imagick": "*",
- "laravel/sail": "^1.34",
- "pestphp/pest": "^3.0|^4.0",
- "phpstan/phpstan": "^1.10.50",
- "spatie/pest-plugin-snapshots": "^2.1",
- "spatie/pixelmatch-php": "^1.0",
- "spatie/ray": "^1.40.1",
- "symfony/var-dumper": "^6.4|^7.0|^8.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Spatie\\Image\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
- }
- ],
- "description": "Manipulate images with an expressive API",
- "homepage": "https://github.com/spatie/image",
- "keywords": [
- "image",
- "spatie"
- ],
- "support": {
- "source": "https://github.com/spatie/image/tree/3.8.7"
- },
- "funding": [
- {
- "url": "https://spatie.be/open-source/support-us",
- "type": "custom"
- },
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2025-11-24T15:10:50+00:00"
- },
- {
- "name": "spatie/image-optimizer",
- "version": "1.8.1",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/image-optimizer.git",
- "reference": "2ad9ac7c19501739183359ae64ea6c15869c23d9"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/2ad9ac7c19501739183359ae64ea6c15869c23d9",
- "reference": "2ad9ac7c19501739183359ae64ea6c15869c23d9",
- "shasum": ""
- },
- "require": {
- "ext-fileinfo": "*",
- "php": "^7.3|^8.0",
- "psr/log": "^1.0 | ^2.0 | ^3.0",
- "symfony/process": "^4.2|^5.0|^6.0|^7.0|^8.0"
- },
- "require-dev": {
- "pestphp/pest": "^1.21|^2.0|^3.0|^4.0",
- "phpunit/phpunit": "^8.5.21|^9.4.4|^10.0|^11.0|^12.0",
- "symfony/var-dumper": "^4.2|^5.0|^6.0|^7.0|^8.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Spatie\\ImageOptimizer\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
- }
- ],
- "description": "Easily optimize images using PHP",
- "homepage": "https://github.com/spatie/image-optimizer",
- "keywords": [
- "image-optimizer",
- "spatie"
- ],
- "support": {
- "issues": "https://github.com/spatie/image-optimizer/issues",
- "source": "https://github.com/spatie/image-optimizer/tree/1.8.1"
- },
- "time": "2025-11-26T10:57:19+00:00"
- },
- {
- "name": "spatie/invade",
- "version": "2.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/invade.git",
- "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/invade/zipball/b920f6411d21df4e8610a138e2e87ae4957d7f63",
- "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63",
- "shasum": ""
- },
- "require": {
- "php": "^8.0"
- },
- "require-dev": {
- "pestphp/pest": "^1.20",
- "phpstan/phpstan": "^1.4",
- "spatie/ray": "^1.28"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/functions.php"
- ],
- "psr-4": {
- "Spatie\\Invade\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "role": "Developer"
- }
- ],
- "description": "A PHP function to work with private properties and methods",
- "homepage": "https://github.com/spatie/invade",
- "keywords": [
- "invade",
- "spatie"
- ],
- "support": {
- "source": "https://github.com/spatie/invade/tree/2.1.0"
- },
- "funding": [
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2024-05-17T09:06:10+00:00"
- },
- {
- "name": "spatie/laravel-medialibrary",
- "version": "11.17.7",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/laravel-medialibrary.git",
- "reference": "237f34f70ae97523c1a99cad7176e229b8d6f0b6"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/237f34f70ae97523c1a99cad7176e229b8d6f0b6",
- "reference": "237f34f70ae97523c1a99cad7176e229b8d6f0b6",
- "shasum": ""
- },
- "require": {
- "composer/semver": "^3.4",
- "ext-exif": "*",
- "ext-fileinfo": "*",
- "ext-json": "*",
- "illuminate/bus": "^10.2|^11.0|^12.0",
- "illuminate/conditionable": "^10.2|^11.0|^12.0",
- "illuminate/console": "^10.2|^11.0|^12.0",
- "illuminate/database": "^10.2|^11.0|^12.0",
- "illuminate/pipeline": "^10.2|^11.0|^12.0",
- "illuminate/support": "^10.2|^11.0|^12.0",
- "maennchen/zipstream-php": "^3.1",
- "php": "^8.2",
- "spatie/image": "^3.3.2",
- "spatie/laravel-package-tools": "^1.16.1",
- "spatie/temporary-directory": "^2.2",
- "symfony/console": "^6.4.1|^7.0|^8.0"
- },
- "conflict": {
- "php-ffmpeg/php-ffmpeg": "<0.6.1"
- },
- "require-dev": {
- "aws/aws-sdk-php": "^3.293.10",
- "ext-imagick": "*",
- "ext-pdo_sqlite": "*",
- "ext-zip": "*",
- "guzzlehttp/guzzle": "^7.8.1",
- "larastan/larastan": "^2.7|^3.0",
- "league/flysystem-aws-s3-v3": "^3.22",
- "mockery/mockery": "^1.6.7",
- "orchestra/testbench": "^8.36|^9.15|^10.8",
- "pestphp/pest": "^2.36|^3.0|^4.0",
- "phpstan/extension-installer": "^1.3.1",
- "spatie/laravel-ray": "^1.33",
- "spatie/pdf-to-image": "^2.2|^3.0",
- "spatie/pest-expectations": "^1.13",
- "spatie/pest-plugin-snapshots": "^2.1"
- },
- "suggest": {
- "league/flysystem-aws-s3-v3": "Required to use AWS S3 file storage",
- "php-ffmpeg/php-ffmpeg": "Required for generating video thumbnails",
- "spatie/pdf-to-image": "Required for generating thumbnails of PDFs and SVGs"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Spatie\\MediaLibrary\\MediaLibraryServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Spatie\\MediaLibrary\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
- }
- ],
- "description": "Associate files with Eloquent models",
- "homepage": "https://github.com/spatie/laravel-medialibrary",
- "keywords": [
- "cms",
- "conversion",
- "downloads",
- "images",
- "laravel",
- "laravel-medialibrary",
- "media",
- "spatie"
- ],
- "support": {
- "issues": "https://github.com/spatie/laravel-medialibrary/issues",
- "source": "https://github.com/spatie/laravel-medialibrary/tree/11.17.7"
- },
- "funding": [
- {
- "url": "https://spatie.be/open-source/support-us",
- "type": "custom"
- },
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2025-12-15T08:51:55+00:00"
- },
- {
- "name": "spatie/laravel-package-tools",
- "version": "1.92.7",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/laravel-package-tools.git",
- "reference": "f09a799850b1ed765103a4f0b4355006360c49a5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5",
- "reference": "f09a799850b1ed765103a4f0b4355006360c49a5",
- "shasum": ""
- },
- "require": {
- "illuminate/contracts": "^9.28|^10.0|^11.0|^12.0",
- "php": "^8.0"
- },
- "require-dev": {
- "mockery/mockery": "^1.5",
- "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0",
- "pestphp/pest": "^1.23|^2.1|^3.1",
- "phpunit/php-code-coverage": "^9.0|^10.0|^11.0",
- "phpunit/phpunit": "^9.5.24|^10.5|^11.5",
- "spatie/pest-plugin-test-time": "^1.1|^2.2"
- },
- "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.92.7"
- },
- "funding": [
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2025-07-17T15:46:43+00:00"
- },
- {
- "name": "spatie/laravel-tags",
- "version": "4.10.1",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/laravel-tags.git",
- "reference": "26fe2ad5490e65e2a3475c3fe8a4d9609934aa40"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-tags/zipball/26fe2ad5490e65e2a3475c3fe8a4d9609934aa40",
- "reference": "26fe2ad5490e65e2a3475c3fe8a4d9609934aa40",
- "shasum": ""
- },
- "require": {
- "laravel/framework": "^10.0|^11.0|^12.0",
- "nesbot/carbon": "^2.63|^3.0",
- "php": "^8.1",
- "spatie/eloquent-sortable": "^4.0",
- "spatie/laravel-package-tools": "^1.4",
- "spatie/laravel-translatable": "^6.0"
- },
- "require-dev": {
- "orchestra/testbench": "^8.0|^9.0|^10.0",
- "pestphp/pest": "^1.22|^2.0",
- "phpunit/phpunit": "^9.5.2"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Spatie\\Tags\\TagsServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Spatie\\Tags\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
- }
- ],
- "description": "Add tags and taggable behaviour to your Laravel app",
- "homepage": "https://github.com/spatie/laravel-tags",
- "keywords": [
- "laravel-tags",
- "spatie"
- ],
- "support": {
- "issues": "https://github.com/spatie/laravel-tags/issues",
- "source": "https://github.com/spatie/laravel-tags/tree/4.10.1"
- },
- "funding": [
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2025-10-13T14:16:14+00:00"
- },
- {
- "name": "spatie/laravel-translatable",
- "version": "6.12.0",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/laravel-translatable.git",
- "reference": "8fc0c1dd5ab4013c27a28e5d5590f2ce849bd349"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-translatable/zipball/8fc0c1dd5ab4013c27a28e5d5590f2ce849bd349",
- "reference": "8fc0c1dd5ab4013c27a28e5d5590f2ce849bd349",
- "shasum": ""
- },
- "require": {
- "illuminate/database": "^11.0|^12.0",
- "illuminate/support": "^11.0|^12.0",
- "php": "^8.3",
- "spatie/laravel-package-tools": "^1.92.7"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^3.90",
- "mockery/mockery": "^1.6.12",
- "orchestra/testbench": "^9.0|^10.0",
- "pestphp/pest": "^4.0.0"
- },
- "type": "library",
- "extra": {
- "aliases": {
- "Translatable": "Spatie\\Translatable\\Facades\\Translatable"
- },
- "laravel": {
- "providers": [
- "Spatie\\Translatable\\TranslatableServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Spatie\\Translatable\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
- },
- {
- "name": "Sebastian De Deyne",
- "email": "sebastian@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
- }
- ],
- "description": "A trait to make an Eloquent model hold translations",
- "homepage": "https://github.com/spatie/laravel-translatable",
- "keywords": [
- "eloquent",
- "i8n",
- "laravel-translatable",
- "model",
- "multilingual",
- "spatie",
- "translate"
- ],
- "support": {
- "issues": "https://github.com/spatie/laravel-translatable/issues",
- "source": "https://github.com/spatie/laravel-translatable/tree/6.12.0"
- },
- "funding": [
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2025-11-24T15:57:48+00:00"
- },
- {
- "name": "spatie/shiki-php",
- "version": "2.3.2",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/shiki-php.git",
- "reference": "a2e78a9ff8a1290b25d550be8fbf8285c13175c5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/shiki-php/zipball/a2e78a9ff8a1290b25d550be8fbf8285c13175c5",
- "reference": "a2e78a9ff8a1290b25d550be8fbf8285c13175c5",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "php": "^8.0",
- "symfony/process": "^5.4|^6.4|^7.1"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^v3.0",
- "pestphp/pest": "^1.8",
- "phpunit/phpunit": "^9.5",
- "spatie/pest-plugin-snapshots": "^1.1",
- "spatie/ray": "^1.10"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Spatie\\ShikiPhp\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Rias Van der Veken",
- "email": "rias@spatie.be",
- "role": "Developer"
- },
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "role": "Developer"
- }
- ],
- "description": "Highlight code using Shiki in PHP",
- "homepage": "https://github.com/spatie/shiki-php",
- "keywords": [
- "shiki",
- "spatie"
- ],
- "support": {
- "source": "https://github.com/spatie/shiki-php/tree/2.3.2"
- },
- "funding": [
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2025-02-21T14:16:57+00:00"
- },
- {
- "name": "spatie/temporary-directory",
- "version": "2.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/temporary-directory.git",
- "reference": "580eddfe9a0a41a902cac6eeb8f066b42e65a32b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/580eddfe9a0a41a902cac6eeb8f066b42e65a32b",
- "reference": "580eddfe9a0a41a902cac6eeb8f066b42e65a32b",
- "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.3.0"
- },
- "funding": [
- {
- "url": "https://spatie.be/open-source/support-us",
- "type": "custom"
- },
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2025-01-13T13:04:43+00:00"
- },
{
"name": "symfony/clock",
"version": "v7.4.0",
@@ -8214,76 +4276,6 @@
],
"time": "2024-09-25T14:21:43+00:00"
},
- {
- "name": "symfony/filesystem",
- "version": "v7.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/filesystem.git",
- "reference": "d551b38811096d0be9c4691d406991b47c0c630a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a",
- "reference": "d551b38811096d0be9c4691d406991b47c0c630a",
- "shasum": ""
- },
- "require": {
- "php": ">=8.2",
- "symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-mbstring": "~1.8"
- },
- "require-dev": {
- "symfony/process": "^6.4|^7.0|^8.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Filesystem\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Provides basic utilities for the filesystem",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/filesystem/tree/v7.4.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://github.com/nicolas-grekas",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2025-11-27T13:27:24+00:00"
- },
{
"name": "symfony/finder",
"version": "v7.4.3",
@@ -8352,80 +4344,6 @@
],
"time": "2025-12-23T14:50:43+00:00"
},
- {
- "name": "symfony/html-sanitizer",
- "version": "v7.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/html-sanitizer.git",
- "reference": "5b0bbcc3600030b535dd0b17a0e8c56243f96d7f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/5b0bbcc3600030b535dd0b17a0e8c56243f96d7f",
- "reference": "5b0bbcc3600030b535dd0b17a0e8c56243f96d7f",
- "shasum": ""
- },
- "require": {
- "ext-dom": "*",
- "league/uri": "^6.5|^7.0",
- "masterminds/html5": "^2.7.2",
- "php": ">=8.2",
- "symfony/deprecation-contracts": "^2.5|^3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\HtmlSanitizer\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Titouan Galopin",
- "email": "galopintitouan@gmail.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Provides an object-oriented API to sanitize untrusted HTML input for safe insertion into a document's DOM.",
- "homepage": "https://symfony.com",
- "keywords": [
- "Purifier",
- "html",
- "sanitizer"
- ],
- "support": {
- "source": "https://github.com/symfony/html-sanitizer/tree/v7.4.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://github.com/nicolas-grekas",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2025-10-30T13:39:42+00:00"
- },
{
"name": "symfony/http-foundation",
"version": "v7.4.3",
@@ -10359,75 +6277,6 @@
},
"time": "2025-12-02T11:56:42+00:00"
},
- {
- "name": "ueberdosis/tiptap-php",
- "version": "2.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/ueberdosis/tiptap-php.git",
- "reference": "458194ad0f8b0cf616fecdf451a84f9a6c1f3056"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/458194ad0f8b0cf616fecdf451a84f9a6c1f3056",
- "reference": "458194ad0f8b0cf616fecdf451a84f9a6c1f3056",
- "shasum": ""
- },
- "require": {
- "php": "^8.0",
- "scrivo/highlight.php": "^9.18",
- "spatie/shiki-php": "^2.0"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^3.5",
- "pestphp/pest": "^1.21",
- "phpunit/phpunit": "^9.5",
- "vimeo/psalm": "^4.3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Tiptap\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Hans Pagel",
- "email": "humans@tiptap.dev",
- "role": "Developer"
- }
- ],
- "description": "A PHP package to work with Tiptap output",
- "homepage": "https://github.com/ueberdosis/tiptap-php",
- "keywords": [
- "prosemirror",
- "tiptap",
- "ueberdosis"
- ],
- "support": {
- "issues": "https://github.com/ueberdosis/tiptap-php/issues",
- "source": "https://github.com/ueberdosis/tiptap-php/tree/2.0.0"
- },
- "funding": [
- {
- "url": "https://tiptap.dev/pricing",
- "type": "custom"
- },
- {
- "url": "https://github.com/ueberdosis",
- "type": "github"
- },
- {
- "url": "https://opencollective.com/tiptap",
- "type": "open_collective"
- }
- ],
- "time": "2025-06-26T14:11:46+00:00"
- },
{
"name": "vlucas/phpdotenv",
"version": "v5.6.3",
@@ -11101,80 +6950,6 @@
},
"time": "2025-12-19T15:04:12+00:00"
},
- {
- "name": "laravel/dusk",
- "version": "v8.3.4",
- "source": {
- "type": "git",
- "url": "https://github.com/laravel/dusk.git",
- "reference": "33a4211c7b63ffe430bf30ec3c014012dcb6dfa6"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/laravel/dusk/zipball/33a4211c7b63ffe430bf30ec3c014012dcb6dfa6",
- "reference": "33a4211c7b63ffe430bf30ec3c014012dcb6dfa6",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "ext-zip": "*",
- "guzzlehttp/guzzle": "^7.5",
- "illuminate/console": "^10.0|^11.0|^12.0",
- "illuminate/support": "^10.0|^11.0|^12.0",
- "php": "^8.1",
- "php-webdriver/webdriver": "^1.15.2",
- "symfony/console": "^6.2|^7.0",
- "symfony/finder": "^6.2|^7.0",
- "symfony/process": "^6.2|^7.0",
- "vlucas/phpdotenv": "^5.2"
- },
- "require-dev": {
- "laravel/framework": "^10.0|^11.0|^12.0",
- "mockery/mockery": "^1.6",
- "orchestra/testbench-core": "^8.19|^9.17|^10.8",
- "phpstan/phpstan": "^1.10",
- "phpunit/phpunit": "^10.1|^11.0|^12.0.1",
- "psy/psysh": "^0.11.12|^0.12",
- "symfony/yaml": "^6.2|^7.0"
- },
- "suggest": {
- "ext-pcntl": "Used to gracefully terminate Dusk when tests are running."
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Laravel\\Dusk\\DuskServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Laravel\\Dusk\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Taylor Otwell",
- "email": "taylor@laravel.com"
- }
- ],
- "description": "Laravel Dusk provides simple end-to-end testing and browser automation.",
- "keywords": [
- "laravel",
- "testing",
- "webdriver"
- ],
- "support": {
- "issues": "https://github.com/laravel/dusk/issues",
- "source": "https://github.com/laravel/dusk/tree/v8.3.4"
- },
- "time": "2025-11-20T16:26:16+00:00"
- },
{
"name": "laravel/mcp",
"version": "v0.5.1",
@@ -12340,72 +8115,6 @@
},
"time": "2022-02-21T01:04:05+00:00"
},
- {
- "name": "php-webdriver/webdriver",
- "version": "1.16.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-webdriver/php-webdriver.git",
- "reference": "ac0662863aa120b4f645869f584013e4c4dba46a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/ac0662863aa120b4f645869f584013e4c4dba46a",
- "reference": "ac0662863aa120b4f645869f584013e4c4dba46a",
- "shasum": ""
- },
- "require": {
- "ext-curl": "*",
- "ext-json": "*",
- "ext-zip": "*",
- "php": "^7.3 || ^8.0",
- "symfony/polyfill-mbstring": "^1.12",
- "symfony/process": "^5.0 || ^6.0 || ^7.0 || ^8.0"
- },
- "replace": {
- "facebook/webdriver": "*"
- },
- "require-dev": {
- "ergebnis/composer-normalize": "^2.20.0",
- "ondram/ci-detector": "^4.0",
- "php-coveralls/php-coveralls": "^2.4",
- "php-mock/php-mock-phpunit": "^2.0",
- "php-parallel-lint/php-parallel-lint": "^1.2",
- "phpunit/phpunit": "^9.3",
- "squizlabs/php_codesniffer": "^3.5",
- "symfony/var-dumper": "^5.0 || ^6.0 || ^7.0 || ^8.0"
- },
- "suggest": {
- "ext-simplexml": "For Firefox profile creation"
- },
- "type": "library",
- "autoload": {
- "files": [
- "lib/Exception/TimeoutException.php"
- ],
- "psr-4": {
- "Facebook\\WebDriver\\": "lib/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.",
- "homepage": "https://github.com/php-webdriver/php-webdriver",
- "keywords": [
- "Chromedriver",
- "geckodriver",
- "php",
- "selenium",
- "webdriver"
- ],
- "support": {
- "issues": "https://github.com/php-webdriver/php-webdriver/issues",
- "source": "https://github.com/php-webdriver/php-webdriver/tree/1.16.0"
- },
- "time": "2025-12-28T23:57:40+00:00"
- },
{
"name": "phpdocumentor/reflection-common",
"version": "2.2.0",
@@ -14203,16 +9912,16 @@
},
{
"name": "webmozart/assert",
- "version": "2.1.1",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
- "reference": "bdbabc199a7ba9965484e4725d66170e5711323b"
+ "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/bdbabc199a7ba9965484e4725d66170e5711323b",
- "reference": "bdbabc199a7ba9965484e4725d66170e5711323b",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/1b34b004e35a164bc5bb6ebd33c844b2d8069a54",
+ "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54",
"shasum": ""
},
"require": {
@@ -14259,9 +9968,9 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/2.1.1"
+ "source": "https://github.com/webmozarts/assert/tree/2.0.0"
},
- "time": "2026-01-08T11:28:40+00:00"
+ "time": "2025-12-16T21:36:00+00:00"
}
],
"aliases": [],
diff --git a/config/app.php b/config/app.php
index bf88713..423eed5 100644
--- a/config/app.php
+++ b/config/app.php
@@ -123,6 +123,4 @@ return [
'store' => env('APP_MAINTENANCE_STORE', 'database'),
],
- 'admin_email' => env('ADMIN_EMAIL', ''),
-
];
diff --git a/config/broadcasting.php b/config/broadcasting.php
deleted file mode 100644
index a37254f..0000000
--- a/config/broadcasting.php
+++ /dev/null
@@ -1,82 +0,0 @@
- env('BROADCAST_CONNECTION', 'null'),
-
- /*
- |--------------------------------------------------------------------------
- | Broadcast Connections
- |--------------------------------------------------------------------------
- |
- | Here you may define all of the broadcast connections that will be used
- | to broadcast events to other systems or over WebSockets. Samples of
- | each available type of connection are provided inside this array.
- |
- */
-
- 'connections' => [
-
- 'reverb' => [
- 'driver' => 'reverb',
- 'key' => env('REVERB_APP_KEY'),
- 'secret' => env('REVERB_APP_SECRET'),
- 'app_id' => env('REVERB_APP_ID'),
- 'options' => [
- 'host' => env('REVERB_API_HOST', '127.0.0.1'),
- 'port' => env('REVERB_API_PORT', 9001),
- 'scheme' => env('REVERB_API_SCHEME', 'http'),
- 'useTLS' => env('REVERB_API_SCHEME', 'http') !== 'https',
- ],
- 'client_options' => [
- // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
- ],
- ],
-
- 'pusher' => [
- 'driver' => 'pusher',
- 'key' => env('PUSHER_APP_KEY'),
- 'secret' => env('PUSHER_APP_SECRET'),
- 'app_id' => env('PUSHER_APP_ID'),
- 'options' => [
- 'cluster' => env('PUSHER_APP_CLUSTER'),
- 'host' => env('PUSHER_HOST') ?: 'api-' . env('PUSHER_APP_CLUSTER', 'mt1') . '.pusher.com',
- 'port' => env('PUSHER_PORT', 443),
- 'scheme' => env('PUSHER_SCHEME', 'https'),
- 'encrypted' => true,
- 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
- ],
- 'client_options' => [
- // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
- ],
- ],
-
- 'ably' => [
- 'driver' => 'ably',
- 'key' => env('ABLY_KEY'),
- ],
-
- 'log' => [
- 'driver' => 'log',
- ],
-
- 'null' => [
- 'driver' => 'null',
- ],
-
- ],
-
-];
diff --git a/config/filament.php b/config/filament.php
deleted file mode 100644
index 46d2b6e..0000000
--- a/config/filament.php
+++ /dev/null
@@ -1,120 +0,0 @@
- [
-
- 'echo' => [
- 'broadcaster' => 'reverb',
- 'key' => env('VITE_REVERB_APP_KEY'),
- 'cluster' => env('VITE_REVERB_APP_CLUSTER'),
- 'wsHost' => env('VITE_REVERB_HOST'),
- 'wsPort' => env('VITE_REVERB_PORT'),
- 'wssPort' => env('VITE_REVERB_PORT'),
- 'authEndpoint' => '/broadcasting/auth',
- 'disableStats' => true,
- 'encrypted' => env('VITE_REVERB_SCHEME', 'https') === 'https',
- 'forceTLS' => env('VITE_REVERB_SCHEME', 'https') === 'https',
- ],
-
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Default Filesystem Disk
- |--------------------------------------------------------------------------
- |
- | This is the storage disk Filament will use to store files. You may use
- | any of the disks defined in the `config/filesystems.php`.
- |
- */
-
- 'default_filesystem_disk' => env('FILESYSTEM_DISK', 'local'),
-
- /*
- |--------------------------------------------------------------------------
- | Assets Path
- |--------------------------------------------------------------------------
- |
- | This is the directory where Filament's assets will be published to. It
- | is relative to the `public` directory of your Laravel application.
- |
- | After changing the path, you should run `php artisan filament:assets`.
- |
- */
-
- 'assets_path' => null,
-
- /*
- |--------------------------------------------------------------------------
- | Cache Path
- |--------------------------------------------------------------------------
- |
- | This is the directory that Filament will use to store cache files that
- | are used to optimize the registration of components.
- |
- | After changing the path, you should run `php artisan filament:cache-components`.
- |
- */
-
- 'cache_path' => base_path('bootstrap/cache/filament'),
-
- /*
- |--------------------------------------------------------------------------
- | Livewire Loading Delay
- |--------------------------------------------------------------------------
- |
- | This sets the delay before loading indicators appear.
- |
- | Setting this to 'none' makes indicators appear immediately, which can be
- | desirable for high-latency connections. Setting it to 'default' applies
- | Livewire's standard 200ms delay.
- |
- */
-
- 'livewire_loading_delay' => 'default',
-
- /*
- |--------------------------------------------------------------------------
- | File Generation
- |--------------------------------------------------------------------------
- |
- | Artisan commands that generate files can be configured here by setting
- | configuration flags that will impact their location or content.
- |
- | Often, this is useful to preserve file generation behavior from a
- | previous version of Filament, to ensure consistency between older and
- | newer generated files. These flags are often documented in the upgrade
- | guide for the version of Filament you are upgrading to.
- |
- */
-
- 'file_generation' => [
- 'flags' => [],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | System Route Prefix
- |--------------------------------------------------------------------------
- |
- | This is the prefix used for the system routes that Filament registers,
- | such as the routes for downloading exports and failed import rows.
- |
- */
-
- 'system_route_prefix' => 'filament',
-
-];
diff --git a/config/filesystems.php b/config/filesystems.php
index 367dbfe..3d671bd 100644
--- a/config/filesystems.php
+++ b/config/filesystems.php
@@ -41,7 +41,7 @@ return [
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
- 'url' => env('APP_URL') . '/storage',
+ 'url' => env('APP_URL').'/storage',
'visibility' => 'public',
'throw' => false,
'report' => false,
@@ -53,7 +53,6 @@ return [
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
- 'root' => env('AWS_DIRECTORY', ''),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
diff --git a/config/media-library.php b/config/media-library.php
deleted file mode 100644
index 33d558a..0000000
--- a/config/media-library.php
+++ /dev/null
@@ -1,303 +0,0 @@
- env('MEDIA_DISK', 'public'),
-
- /*
- * The maximum file size of an item in bytes.
- * Adding a larger file will result in an exception.
- */
- 'max_file_size' => 1024 * 1024 * 10, // 10MB
-
- /*
- * This queue connection will be used to generate derived and responsive images.
- * Leave empty to use the default queue connection.
- */
- 'queue_connection_name' => env('QUEUE_CONNECTION', 'sync'),
-
- /*
- * This queue will be used to generate derived and responsive images.
- * Leave empty to use the default queue.
- */
- 'queue_name' => env('MEDIA_QUEUE', ''),
-
- /*
- * By default all conversions will be performed on a queue.
- */
- 'queue_conversions_by_default' => env('QUEUE_CONVERSIONS_BY_DEFAULT', true),
-
- /*
- * Should database transactions be run after database commits?
- */
- 'queue_conversions_after_database_commit' => env('QUEUE_CONVERSIONS_AFTER_DB_COMMIT', true),
-
- /*
- * The fully qualified class name of the media model.
- */
- 'media_model' => Spatie\MediaLibrary\MediaCollections\Models\Media::class,
-
- /*
- * The fully qualified class name of the media observer.
- */
- 'media_observer' => Spatie\MediaLibrary\MediaCollections\Models\Observers\MediaObserver::class,
-
- /*
- * When enabled, media collections will be serialised using the default
- * laravel model serialization behaviour.
- *
- * Keep this option disabled if using Media Library Pro components (https://medialibrary.pro)
- */
- 'use_default_collection_serialization' => false,
-
- /*
- * The fully qualified class name of the model used for temporary uploads.
- *
- * This model is only used in Media Library Pro (https://medialibrary.pro)
- */
- 'temporary_upload_model' => Spatie\MediaLibraryPro\Models\TemporaryUpload::class,
-
- /*
- * When enabled, Media Library Pro will only process temporary uploads that were uploaded
- * in the same session. You can opt to disable this for stateless usage of
- * the pro components.
- */
- 'enable_temporary_uploads_session_affinity' => true,
-
- /*
- * When enabled, Media Library pro will generate thumbnails for uploaded file.
- */
- 'generate_thumbnails_for_temporary_uploads' => true,
-
- /*
- * This is the class that is responsible for naming generated files.
- */
- 'file_namer' => Spatie\MediaLibrary\Support\FileNamer\DefaultFileNamer::class,
-
- /*
- * The class that contains the strategy for determining a media file's path.
- */
- 'path_generator' => Spatie\MediaLibrary\Support\PathGenerator\DefaultPathGenerator::class,
-
- /*
- * The class that contains the strategy for determining how to remove files.
- */
- 'file_remover_class' => Spatie\MediaLibrary\Support\FileRemover\DefaultFileRemover::class,
-
- /*
- * Here you can specify which path generator should be used for the given class.
- */
- 'custom_path_generators' => [
- // Model::class => PathGenerator::class
- // or
- // 'model_morph_alias' => PathGenerator::class
- ],
-
- /*
- * When urls to files get generated, this class will be called. Use the default
- * if your files are stored locally above the site root or on s3.
- */
- 'url_generator' => Spatie\MediaLibrary\Support\UrlGenerator\DefaultUrlGenerator::class,
-
- /*
- * Moves media on updating to keep path consistent. Enable it only with a custom
- * PathGenerator that uses, for example, the media UUID.
- */
- 'moves_media_on_update' => false,
-
- /*
- * Whether to activate versioning when urls to files get generated.
- * When activated, this attaches a ?v=xx query string to the URL.
- */
- 'version_urls' => false,
-
- /*
- * The media library will try to optimize all converted images by removing
- * metadata and applying a little bit of compression. These are
- * the optimizers that will be used by default.
- */
- 'image_optimizers' => [
- Spatie\ImageOptimizer\Optimizers\Jpegoptim::class => [
- '-m85', // set maximum quality to 85%
- '--force', // ensure that progressive generation is always done also if a little bigger
- '--strip-all', // this strips out all text information such as comments and EXIF data
- '--all-progressive', // this will make sure the resulting image is a progressive one
- ],
- Spatie\ImageOptimizer\Optimizers\Pngquant::class => [
- '--force', // required parameter for this package
- ],
- Spatie\ImageOptimizer\Optimizers\Optipng::class => [
- '-i0', // this will result in a non-interlaced, progressive scanned image
- '-o2', // this set the optimization level to two (multiple IDAT compression trials)
- '-quiet', // required parameter for this package
- ],
- Spatie\ImageOptimizer\Optimizers\Svgo::class => [
- '--disable=cleanupIDs', // disabling because it is known to cause troubles
- ],
- Spatie\ImageOptimizer\Optimizers\Gifsicle::class => [
- '-b', // required parameter for this package
- '-O3', // this produces the slowest but best results
- ],
- Spatie\ImageOptimizer\Optimizers\Cwebp::class => [
- '-m 6', // for the slowest compression method in order to get the best compression.
- '-pass 10', // for maximizing the amount of analysis pass.
- '-mt', // multithreading for some speed improvements.
- '-q 90', // quality factor that brings the least noticeable changes.
- ],
- Spatie\ImageOptimizer\Optimizers\Avifenc::class => [
- '-a cq-level=23', // constant quality level, lower values mean better quality and greater file size (0-63).
- '-j all', // number of jobs (worker threads, "all" uses all available cores).
- '--min 0', // min quantizer for color (0-63).
- '--max 63', // max quantizer for color (0-63).
- '--minalpha 0', // min quantizer for alpha (0-63).
- '--maxalpha 63', // max quantizer for alpha (0-63).
- '-a end-usage=q', // rate control mode set to Constant Quality mode.
- '-a tune=ssim', // SSIM as tune the encoder for distortion metric.
- ],
- ],
-
- /*
- * These generators will be used to create an image of media files.
- */
- 'image_generators' => [
- Spatie\MediaLibrary\Conversions\ImageGenerators\Image::class,
- Spatie\MediaLibrary\Conversions\ImageGenerators\Webp::class,
- Spatie\MediaLibrary\Conversions\ImageGenerators\Avif::class,
- Spatie\MediaLibrary\Conversions\ImageGenerators\Pdf::class,
- Spatie\MediaLibrary\Conversions\ImageGenerators\Svg::class,
- Spatie\MediaLibrary\Conversions\ImageGenerators\Video::class,
- ],
-
- /*
- * The path where to store temporary files while performing image conversions.
- * If set to null, storage_path('media-library/temp') will be used.
- */
- 'temporary_directory_path' => null,
-
- /*
- * The engine that should perform the image conversions.
- * Should be either `gd` or `imagick`.
- */
- 'image_driver' => env('IMAGE_DRIVER', 'gd'),
-
- /*
- * FFMPEG & FFProbe binaries paths, only used if you try to generate video
- * thumbnails and have installed the php-ffmpeg/php-ffmpeg composer
- * dependency.
- */
- 'ffmpeg_path' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'),
- 'ffprobe_path' => env('FFPROBE_PATH', '/usr/bin/ffprobe'),
-
- /*
- * The timeout (in seconds) that will be used when generating video
- * thumbnails via FFMPEG.
- */
- 'ffmpeg_timeout' => env('FFMPEG_TIMEOUT', 900),
-
- /*
- * The number of threads that FFMPEG should use. 0 means that FFMPEG
- * may decide itself.
- */
- 'ffmpeg_threads' => env('FFMPEG_THREADS', 0),
-
- /*
- * Here you can override the class names of the jobs used by this package. Make sure
- * your custom jobs extend the ones provided by the package.
- */
- 'jobs' => [
- 'perform_conversions' => Spatie\MediaLibrary\Conversions\Jobs\PerformConversionsJob::class,
- 'generate_responsive_images' => Spatie\MediaLibrary\ResponsiveImages\Jobs\GenerateResponsiveImagesJob::class,
- ],
-
- /*
- * When using the addMediaFromUrl method you may want to replace the default downloader.
- * This is particularly useful when the url of the image is behind a firewall and
- * need to add additional flags, possibly using curl.
- */
- 'media_downloader' => Spatie\MediaLibrary\Downloaders\DefaultDownloader::class,
-
- /*
- * When using the addMediaFromUrl method the SSL is verified by default.
- * This is option disables SSL verification when downloading remote media.
- * Please note that this is a security risk and should only be false in a local environment.
- */
- 'media_downloader_ssl' => env('MEDIA_DOWNLOADER_SSL', true),
-
- /*
- * The default lifetime in minutes for temporary urls.
- * This is used when you call the `getLastTemporaryUrl` or `getLastTemporaryUrl` method on a media item.
- */
- 'temporary_url_default_lifetime' => env('MEDIA_TEMPORARY_URL_DEFAULT_LIFETIME', 5),
-
- 'remote' => [
- /*
- * Any extra headers that should be included when uploading media to
- * a remote disk. Even though supported headers may vary between
- * different drivers, a sensible default has been provided.
- *
- * Supported by S3: CacheControl, Expires, StorageClass,
- * ServerSideEncryption, Metadata, ACL, ContentEncoding
- */
- 'extra_headers' => [
- 'CacheControl' => 'max-age=604800',
- ],
- ],
-
- 'responsive_images' => [
- /*
- * This class is responsible for calculating the target widths of the responsive
- * images. By default we optimize for filesize and create variations that each are 30%
- * smaller than the previous one. More info in the documentation.
- *
- * https://docs.spatie.be/laravel-medialibrary/v9/advanced-usage/generating-responsive-images
- */
- 'width_calculator' => Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class,
-
- /*
- * By default rendering media to a responsive image will add some javascript and a tiny placeholder.
- * This ensures that the browser can already determine the correct layout.
- * When disabled, no tiny placeholder is generated.
- */
- 'use_tiny_placeholders' => true,
-
- /*
- * This class will generate the tiny placeholder used for progressive image loading. By default
- * the media library will use a tiny blurred jpg image.
- */
- 'tiny_placeholder_generator' => Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class,
- ],
-
- /*
- * When enabling this option, a route will be registered that will enable
- * the Media Library Pro Vue and React components to move uploaded files
- * in a S3 bucket to their right place.
- */
- 'enable_vapor_uploads' => env('ENABLE_MEDIA_LIBRARY_VAPOR_UPLOADS', false),
-
- /*
- * When converting Media instances to response the media library will add
- * a `loading` attribute to the `img` tag. Here you can set the default
- * value of that attribute.
- *
- * Possible values: 'lazy', 'eager', 'auto' or null if you don't want to set any loading instruction.
- *
- * More info: https://css-tricks.com/native-lazy-loading/
- */
- 'default_loading_attribute_value' => null,
-
- /*
- * You can specify a prefix for that is used for storing all media.
- * If you set this to `/my-subdir`, all your media will be stored in a `/my-subdir` directory.
- */
- 'prefix' => env('MEDIA_PREFIX', ''),
-
- /*
- * When forcing lazy loading, media will be loaded even if you don't eager load media and you have
- * disabled lazy loading globally in the service provider.
- */
- 'force_lazy_loading' => env('FORCE_MEDIA_LIBRARY_LAZY_LOADING', true),
-];
diff --git a/config/reverb.php b/config/reverb.php
deleted file mode 100644
index d7fc88e..0000000
--- a/config/reverb.php
+++ /dev/null
@@ -1,95 +0,0 @@
- env('REVERB_SERVER', 'reverb'),
-
- /*
- |--------------------------------------------------------------------------
- | Reverb Servers
- |--------------------------------------------------------------------------
- |
- | Here you may define details for each of the supported Reverb servers.
- | Each server has its own configuration options that are defined in
- | the array below. You should ensure all the options are present.
- |
- */
-
- 'servers' => [
-
- 'reverb' => [
- 'host' => env('REVERB_SERVER_HOST', '0.0.0.0'),
- 'port' => env('REVERB_SERVER_PORT', 8080),
- 'path' => env('REVERB_SERVER_PATH', ''),
- 'hostname' => env('REVERB_HOST'),
- 'options' => [
- 'tls' => [],
- ],
- 'max_request_size' => env('REVERB_MAX_REQUEST_SIZE', 10_000),
- 'scaling' => [
- 'enabled' => env('REVERB_SCALING_ENABLED', false),
- 'channel' => env('REVERB_SCALING_CHANNEL', 'reverb'),
- 'server' => [
- 'url' => env('REDIS_URL'),
- 'host' => env('REDIS_HOST', '127.0.0.1'),
- 'port' => env('REDIS_PORT', '6379'),
- 'username' => env('REDIS_USERNAME'),
- 'password' => env('REDIS_PASSWORD'),
- 'database' => env('REDIS_DB', '0'),
- 'timeout' => env('REDIS_TIMEOUT', 60),
- ],
- ],
- 'pulse_ingest_interval' => env('REVERB_PULSE_INGEST_INTERVAL', 15),
- 'telescope_ingest_interval' => env('REVERB_TELESCOPE_INGEST_INTERVAL', 15),
- ],
-
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Reverb Applications
- |--------------------------------------------------------------------------
- |
- | Here you may define how Reverb applications are managed. If you choose
- | to use the "config" provider, you may define an array of apps which
- | your server will support, including their connection credentials.
- |
- */
-
- 'apps' => [
-
- 'provider' => 'config',
-
- 'apps' => [
- [
- 'key' => env('REVERB_APP_KEY'),
- 'secret' => env('REVERB_APP_SECRET'),
- 'app_id' => env('REVERB_APP_ID'),
- 'options' => [
- 'host' => env('REVERB_HOST'),
- 'port' => env('REVERB_PORT', 443),
- 'scheme' => env('REVERB_SCHEME', 'https'),
- 'useTLS' => env('REVERB_SCHEME', 'https') === 'https',
- ],
- 'allowed_origins' => ['*'],
- 'ping_interval' => env('REVERB_APP_PING_INTERVAL', 60),
- 'activity_timeout' => env('REVERB_APP_ACTIVITY_TIMEOUT', 30),
- 'max_connections' => env('REVERB_APP_MAX_CONNECTIONS'),
- 'max_message_size' => env('REVERB_APP_MAX_MESSAGE_SIZE', 10_000),
- ],
- ],
-
- ],
-
-];
diff --git a/config/sanctum.php b/config/sanctum.php
deleted file mode 100644
index 44527d6..0000000
--- a/config/sanctum.php
+++ /dev/null
@@ -1,84 +0,0 @@
- explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
- '%s%s',
- 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
- Sanctum::currentApplicationUrlWithPort(),
- // Sanctum::currentRequestHost(),
- ))),
-
- /*
- |--------------------------------------------------------------------------
- | Sanctum Guards
- |--------------------------------------------------------------------------
- |
- | This array contains the authentication guards that will be checked when
- | Sanctum is trying to authenticate a request. If none of these guards
- | are able to authenticate the request, Sanctum will use the bearer
- | token that's present on an incoming request for authentication.
- |
- */
-
- 'guard' => ['web'],
-
- /*
- |--------------------------------------------------------------------------
- | Expiration Minutes
- |--------------------------------------------------------------------------
- |
- | This value controls the number of minutes until an issued token will be
- | considered expired. This will override any values set in the token's
- | "expires_at" attribute, but first-party sessions are not affected.
- |
- */
-
- 'expiration' => null,
-
- /*
- |--------------------------------------------------------------------------
- | Token Prefix
- |--------------------------------------------------------------------------
- |
- | Sanctum can prefix new tokens in order to take advantage of numerous
- | security scanning initiatives maintained by open source platforms
- | that notify developers if they commit tokens into repositories.
- |
- | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning
- |
- */
-
- 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''),
-
- /*
- |--------------------------------------------------------------------------
- | Sanctum Middleware
- |--------------------------------------------------------------------------
- |
- | When authenticating your first-party SPA with Sanctum you may need to
- | customize some of the middleware Sanctum uses while processing the
- | request. You may change the middleware listed below as required.
- |
- */
-
- 'middleware' => [
- 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class,
- 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class,
- 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class,
- ],
-
-];
diff --git a/config/services.php b/config/services.php
index eba8929..6a90eb8 100644
--- a/config/services.php
+++ b/config/services.php
@@ -26,7 +26,6 @@ return [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
- 'directory' => env('AWS_DIRECTORY'),
],
'slack' => [
diff --git a/config/tags.php b/config/tags.php
deleted file mode 100644
index 628dc1a..0000000
--- a/config/tags.php
+++ /dev/null
@@ -1,28 +0,0 @@
- null,
-
- /*
- * The fully qualified class name of the tag model.
- */
- 'tag_model' => Spatie\Tags\Tag::class,
-
- /*
- * The name of the table associated with the taggable morph relation.
- */
- 'taggable' => [
- 'table_name' => 'taggables',
- 'morph_name' => 'taggable',
-
- /*
- * The fully qualified class name of the pivot model.
- */
- 'class_name' => Illuminate\Database\Eloquent\Relations\MorphPivot::class,
- ]
-];
diff --git a/database/factories/CategoryFactory.php b/database/factories/CategoryFactory.php
deleted file mode 100644
index 43031ce..0000000
--- a/database/factories/CategoryFactory.php
+++ /dev/null
@@ -1,23 +0,0 @@
-
- */
-class CategoryFactory extends Factory
-{
- /**
- * Define the model's default state.
- *
- * @return array
- */
- public function definition(): array
- {
- return [
- 'name' => fake()->unique()->words(2, true),
- ];
- }
-}
diff --git a/database/factories/EntryFactory.php b/database/factories/EntryFactory.php
deleted file mode 100644
index 9d9d947..0000000
--- a/database/factories/EntryFactory.php
+++ /dev/null
@@ -1,26 +0,0 @@
-
- */
-class EntryFactory extends Factory
-{
- /**
- * Define the model's default state.
- *
- * @return array
- */
- public function definition(): array
- {
- return [
- 'title' => $this->faker->sentence,
- 'content' => $this->faker->paragraph,
- 'slug' => Str::slug($this->faker->sentence) . '-' . Str::uuid(),
- ];
- }
-}
diff --git a/database/factories/TextWidgetFactory.php b/database/factories/TextWidgetFactory.php
deleted file mode 100644
index 83cba21..0000000
--- a/database/factories/TextWidgetFactory.php
+++ /dev/null
@@ -1,25 +0,0 @@
-
- */
-class TextWidgetFactory extends Factory
-{
- /**
- * Define the model's default state.
- *
- * @return array
- */
- public function definition(): array
- {
- return [
- 'title' => $this->faker->sentence(),
- 'description' => $this->faker->paragraph(),
- 'content' => $this->faker->text(500),
- ];
- }
-}
diff --git a/database/migrations/2026_01_02_134204_create_entries_table.php b/database/migrations/2026_01_02_134204_create_entries_table.php
deleted file mode 100644
index 337002b..0000000
--- a/database/migrations/2026_01_02_134204_create_entries_table.php
+++ /dev/null
@@ -1,34 +0,0 @@
-id();
- $table->string('title');
- $table->string('slug')->unique();
- $table->text('description')->nullable();
- $table->boolean('is_published')->default(false);
- $table->boolean('is_featured')->default(false);
- $table->date('published_at')->nullable();
- $table->mediumText('content')->nullable();
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::dropIfExists('entries');
- }
-};
diff --git a/database/migrations/2026_01_02_160151_create_media_table.php b/database/migrations/2026_01_02_160151_create_media_table.php
deleted file mode 100644
index d29dcf7..0000000
--- a/database/migrations/2026_01_02_160151_create_media_table.php
+++ /dev/null
@@ -1,30 +0,0 @@
-id();
- $table->morphs('model');
- $table->uuid()->nullable()->unique();
- $table->string('collection_name');
- $table->string('name');
- $table->string('file_name');
- $table->string('mime_type')->nullable();
- $table->string('disk');
- $table->string('conversions_disk')->nullable();
- $table->unsignedBigInteger('size');
- $table->json('manipulations');
- $table->json('custom_properties');
- $table->json('generated_conversions');
- $table->json('responsive_images');
- $table->unsignedInteger('order_column')->nullable()->index();
- $table->nullableTimestamps();
- });
- }
-};
diff --git a/database/migrations/2026_01_07_162137_create_personal_access_tokens_table.php b/database/migrations/2026_01_07_162137_create_personal_access_tokens_table.php
deleted file mode 100644
index 40ff706..0000000
--- a/database/migrations/2026_01_07_162137_create_personal_access_tokens_table.php
+++ /dev/null
@@ -1,33 +0,0 @@
-id();
- $table->morphs('tokenable');
- $table->text('name');
- $table->string('token', 64)->unique();
- $table->text('abilities')->nullable();
- $table->timestamp('last_used_at')->nullable();
- $table->timestamp('expires_at')->nullable()->index();
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::dropIfExists('personal_access_tokens');
- }
-};
diff --git a/database/migrations/2026_01_08_130657_create_tag_tables.php b/database/migrations/2026_01_08_130657_create_tag_tables.php
deleted file mode 100644
index 5925c6c..0000000
--- a/database/migrations/2026_01_08_130657_create_tag_tables.php
+++ /dev/null
@@ -1,36 +0,0 @@
-id();
-
- $table->json('name');
- $table->json('slug');
- $table->string('type')->nullable();
- $table->integer('order_column')->nullable();
-
- $table->timestamps();
- });
-
- Schema::create('taggables', function (Blueprint $table) {
- $table->foreignId('tag_id')->constrained()->cascadeOnDelete();
-
- $table->morphs('taggable');
-
- $table->unique(['tag_id', 'taggable_id', 'taggable_type']);
- });
- }
-
- public function down(): void
- {
- Schema::dropIfExists('taggables');
- Schema::dropIfExists('tags');
- }
-};
diff --git a/database/migrations/2026_01_08_140636_create_text_widgets_table.php b/database/migrations/2026_01_08_140636_create_text_widgets_table.php
deleted file mode 100644
index b15d365..0000000
--- a/database/migrations/2026_01_08_140636_create_text_widgets_table.php
+++ /dev/null
@@ -1,30 +0,0 @@
-id();
- $table->string('title');
- $table->text('description')->nullable();
- $table->mediumText('content')->nullable();
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::dropIfExists('text_widgets');
- }
-};
diff --git a/database/migrations/2026_01_08_214229_create_categories_table.php b/database/migrations/2026_01_08_214229_create_categories_table.php
deleted file mode 100644
index b86b7b1..0000000
--- a/database/migrations/2026_01_08_214229_create_categories_table.php
+++ /dev/null
@@ -1,28 +0,0 @@
-id();
- $table->string('name');
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::dropIfExists('categories');
- }
-};
diff --git a/database/migrations/2026_01_08_215025_add_category_id_to_text_widgets_table.php b/database/migrations/2026_01_08_215025_add_category_id_to_text_widgets_table.php
deleted file mode 100644
index 72dd1ac..0000000
--- a/database/migrations/2026_01_08_215025_add_category_id_to_text_widgets_table.php
+++ /dev/null
@@ -1,29 +0,0 @@
-foreignId('category_id')->nullable()->constrained('categories');
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::table('text_widgets', function (Blueprint $table) {
- $table->dropForeign(['category_id']);
- $table->dropColumn('category_id');
- });
- }
-};
diff --git a/database/migrations/2026_01_08_215405_add_category_id_to_entries_table.php b/database/migrations/2026_01_08_215405_add_category_id_to_entries_table.php
deleted file mode 100644
index 96c8b89..0000000
--- a/database/migrations/2026_01_08_215405_add_category_id_to_entries_table.php
+++ /dev/null
@@ -1,29 +0,0 @@
-foreignId('category_id')->nullable()->constrained('categories');
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::table('entries', function (Blueprint $table) {
- $table->dropForeign(['category_id']);
- $table->dropColumn('category_id');
- });
- }
-};
diff --git a/database/migrations/2026_01_17_162204_add-url-to-entries.php b/database/migrations/2026_01_17_162204_add-url-to-entries.php
deleted file mode 100644
index f40244e..0000000
--- a/database/migrations/2026_01_17_162204_add-url-to-entries.php
+++ /dev/null
@@ -1,29 +0,0 @@
-string('call_to_action_text')->nullable()->after('title');
- $table->string('call_to_action_link')->nullable()->after('url');
- });
- }
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::table('entries', function (Blueprint $table) {
- $table->dropColumn('call_to_action_text');
- $table->dropColumn('call_to_action_link');
- });
- }
-};
diff --git a/database/migrations/2026_01_20_000000_add_type_to_entries_table.php b/database/migrations/2026_01_20_000000_add_type_to_entries_table.php
deleted file mode 100644
index 89596ed..0000000
--- a/database/migrations/2026_01_20_000000_add_type_to_entries_table.php
+++ /dev/null
@@ -1,28 +0,0 @@
-string('type')->nullable()->default('article')->after('title');
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::table('entries', function (Blueprint $table) {
- $table->dropColumn('type');
- });
- }
-};
diff --git a/database/migrations/2026_01_20_175349_add_priority_to_entries.php b/database/migrations/2026_01_20_175349_add_priority_to_entries.php
deleted file mode 100644
index b89e4a4..0000000
--- a/database/migrations/2026_01_20_175349_add_priority_to_entries.php
+++ /dev/null
@@ -1,28 +0,0 @@
-integer('priority')->default(0);
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::table('entries', function (Blueprint $table) {
- $table->dropColumn('priority');
- });
- }
-};
diff --git a/database/migrations/2026_02_01_095251_create_assets_table.php b/database/migrations/2026_02_01_095251_create_assets_table.php
deleted file mode 100644
index 75b5e66..0000000
--- a/database/migrations/2026_02_01_095251_create_assets_table.php
+++ /dev/null
@@ -1,28 +0,0 @@
-id();
- $table->string('alt_text')->nullable();
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::dropIfExists('assets');
- }
-};
diff --git a/database/migrations/2026_02_02_102348_add_roles_to_user_table.php b/database/migrations/2026_02_02_102348_add_roles_to_user_table.php
deleted file mode 100644
index 6cc2ed9..0000000
--- a/database/migrations/2026_02_02_102348_add_roles_to_user_table.php
+++ /dev/null
@@ -1,28 +0,0 @@
-string('role')->default('user')->after('email');
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::table('users', function (Blueprint $table) {
- $table->dropColumn('role');
- });
- }
-};
diff --git a/database/migrations/2026_02_15_192829_create_changes_table.php b/database/migrations/2026_02_15_192829_create_changes_table.php
deleted file mode 100644
index cc5bc8f..0000000
--- a/database/migrations/2026_02_15_192829_create_changes_table.php
+++ /dev/null
@@ -1,30 +0,0 @@
-id();
- $table->string('note');
- $table->integer('user_id');
- $table->string('type')->default('general');
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- */
- public function down(): void
- {
- Schema::dropIfExists('changes');
- }
-};
diff --git a/docker/php/conf.d/opcache.ini b/docker/php/conf.d/opcache.ini
deleted file mode 100644
index b5358a9..0000000
--- a/docker/php/conf.d/opcache.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-opcache.enable=1
-opcache.enable_cli=0
-opcache.memory_consumption=256
-opcache.interned_strings_buffer=16
-opcache.max_accelerated_files=100000
-opcache.validate_timestamps=0
-opcache.revalidate_freq=0
-opcache.save_comments=1
diff --git a/docker/php/php.ini b/docker/php/php.ini
deleted file mode 100644
index 9229cfd..0000000
--- a/docker/php/php.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-; PHP Configuration File
-
-; Maximum allowed size for uploaded files.
-upload_max_filesize = 10M
-
-; Maximum size of POST data that PHP will accept.
-post_max_size = 12M
-
-; Maximum execution time of each script, in seconds.
-max_execution_time = 120
-
-; Maximum amount of memory a script may consume.
-memory_limit = 256M
-
-; Maximum number of files that can be uploaded via a single request.
-max_file_uploads = 20
-
-; File upload temporary directory (optional, defaults to system temp directory).
-; upload_tmp_dir = /tmp
-
diff --git a/docker/supervisord.conf b/docker/supervisord.conf
deleted file mode 100644
index b15b2dc..0000000
--- a/docker/supervisord.conf
+++ /dev/null
@@ -1,46 +0,0 @@
-[supervisord]
-nodaemon=true
-logfile=/var/log/supervisor/supervisord.log
-loglevel=info
-
-[program:php-fpm]
-command=/usr/local/sbin/php-fpm -F
-autostart=true
-autorestart=true
-startretries=3
-stdout_logfile=/dev/stdout
-stdout_logfile_maxbytes=0
-stderr_logfile=/dev/stderr
-stderr_logfile_maxbytes=0
-
-[program:nginx]
-command=/usr/sbin/nginx -g "daemon off;"
-autostart=true
-autorestart=true
-startretries=3
-stdout_logfile=/dev/stdout
-stdout_logfile_maxbytes=0
-stderr_logfile=/dev/stderr
-stderr_logfile_maxbytes=0
-
-[program:queue-worker]
-command=/usr/local/bin/php /var/www/artisan queue:work --sleep=3 --tries=3 --max-time=3600
-autostart=true
-autorestart=true
-startretries=3
-stdout_logfile=/dev/stdout
-stdout_logfile_maxbytes=0
-stderr_logfile=/dev/stderr
-stderr_logfile_maxbytes=0
-stopwaitsecs=3600
-
-[program:reverb]
-command=/usr/local/bin/php /var/www/artisan reverb:start
-autostart=true
-autorestart=true
-startretries=3
-stdout_logfile=/dev/stdout
-stdout_logfile_maxbytes=0
-stderr_logfile=/dev/stderr
-stderr_logfile_maxbytes=0
-stopwaitsecs=3600
diff --git a/docs/decisions/002-AGPLv3-and-filament.md b/docs/decisions/002-AGPLv3-and-filament.md
deleted file mode 100644
index 7bed142..0000000
--- a/docs/decisions/002-AGPLv3-and-filament.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# 2026-01-01
-
-## AGPLv3
-
-License updated to AGPLv3 to close the SaaS loophole and ensure that all modifications used to provide network services are contributed back to the community.
-
-## Filament
-
-Filament is another reason to use Laravel if you need admin consoles without needing to develop another app atop of your own app to give operational control over the app.
-
-It is a way to create apps that have all the features of an advanced app with management capabilities without needing to write all of that yourself. Admin interfaces are complex and hard to write, hard to get right.
-
-There are so many things to do, we don't have the time to re-write or re-invent what is already achieved by filament and likely, better than we could create ourselves or likely dream of.
-
diff --git a/docs/decisions/003-initial-model-and-filament-resource.md b/docs/decisions/003-initial-model-and-filament-resource.md
deleted file mode 100644
index 1e25a98..0000000
--- a/docs/decisions/003-initial-model-and-filament-resource.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# 2026-01-02
-
-## Entry model
-
-```bash
-php artisan make:model -m Entry
-```
-
-creates skeleton files for a model and migration
-
-we edit the migration to hold the fields we desire to be present in each record
-
-just the minimal are added for now, paying attention to the amount of data that these may need to hold
-
-* string (varchar): ~255 chars default.
-* text: ~65 KB.
-* mediumText: ~16 MB.
-
-```bash
-php artisan migrate
-```
-
-runs the migration to create the table
-
-## Entry filament resource
-
-```bash
-❯ php artisan filament:resource Entry
-
- The "title attribute" is used to label each record in the UI.
-
- You can leave this blank if records do not have a title.
-
- ┌ What is the title attribute for this model? ─────────────────┐
- │ title │
- └──────────────────────────────────────────────────────────────┘
-
- ┌ Would you like to generate a read-only view page for the resource? ┐
- │ Yes │
- └────────────────────────────────────────────────────────────────────┘
-
- ┌ Should the configuration be generated from the current database columns? ┐
- │ Yes │
- └──────────────────────────────────────────────────────────────────────────┘
-
- INFO Filament resource [App\Filament\Resources\Entries\EntryResource] created successfully.
-```
-
-There is more work to do on this model but for now, a new resource is added to the admin panel by which records can be added, edited, listed.
-
-Full CRUD is already possible. This is amazing if you think how long this would have taken to create all this manually.
-
-
-
-### slugify
-
-```php
- TextInput::make('title')
- ->required()
- ->reactive()
- ->afterStateUpdated(function ($state, $set): void {
- $set('slug', Str::slug((string) $state));
- }),
- TextInput::make('slug')
- ->required(),
-```
-
-adding reactive and afterStateUpdted to title automatically creates a safe slug
-
-I class things like this creature comforts of the framework and it shows how simple it can be to make fields active and updated by previous entries
-
-For the user, this reduces error and confusion over what a url should be
-
-### rich editor
-
-just changing the TextInput for content
-
-```php
- RichEditor::make('content')
- ->columnSpanFull(),
-```
-
-to `RichEditr` gives us a 'tiptap' rich text editor
-
-already, this is feeling more like a mini CMS, with relatively little effort
-
diff --git a/docs/decisions/004-spatie-media-library.md b/docs/decisions/004-spatie-media-library.md
deleted file mode 100644
index 64431d3..0000000
--- a/docs/decisions/004-spatie-media-library.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# 2026-01-02
-
-```bash
-php artisan storage:link
-composer require "spatie/laravel-medialibrary"
-composer require filament/spatie-laravel-media-library-plugin:"^4.0" -W
-php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-config"
-php artisan migrate
-```
-I had a lot of fun and silly games working out if I even needed both Spatie media library and the filament plugin they have as it states itself a sub directory of filament itself.
-
-I managed to remove the spatie fulament plugin and for the app to work for a while but eventually found a part of it not implemented in filament core. It took a while but there seems to be an overlap somewhere. So I re-installed the spatie filament module to find all the errors went away, when previously they did not
-
-PHP and I guess composer would seem to aggressively cache things very very hard and I just didnt understand how very hard that is sometimes.
-
-Suffice to say, spatie media library seems to be 'the way' as far as media is concerned for filament.
-
-I looked at curator, also by the author of the tiptap filament integration to find it seems dependant on tailwind3, limiting me to Laravel 11 I believe, which was not what I wanted.
-
-I used filament 'actions' in order to augment the form for 'entries' so as to add 'pick from gallery' functionality together with custom javascript to insert records found in media library for both rich content and featured images
-
-There may be a better way of doing this but for now, I believe this is a solution I have craved for a while now with filament and have at least gained a bit better understanding of so called 'actions' and will re-visit this whole section in the docs.
-
-
diff --git a/docs/decisions/005-testing.md b/docs/decisions/005-testing.md
deleted file mode 100644
index eb0c372..0000000
--- a/docs/decisions/005-testing.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# 2026-01-05
-
-I would very much like to start using Pest4 as it has a lot of nice things in it like browser testing with some of the latest screen shot visual testing and more
-
-for now I know Dusk and have been able to use this in previous projects before Pest4
-
-so initially at least I intend to use Dusk and build on to migrate to Pest4 where I can
-
-# test isolation and setup
-
-in the past I now realize, I was introducing brittle tests by first doing setup to then rely on a configuration for further tests
-
-I think this is a pattern that some follow but as a generalist, devops and hybrid person I can and do make mistakes. I suppose we all do.
-
-Mine was to not fully embrace test isolation
-
-Each test therefor needs to be set up from scratch so to speak
-
-I then have each subsequent test re-setting up say, a user, a database table, whatever is required but each time from a blank slate
-
-That way, when a test fails, it should be obvious what has been broken without having to traverse through a bunch of setup and dependencies to find I broke a setup step, not a test.
-
-Let us hope so anyway. That is the approach I am going with with Dusk for now. Lets see how I get on and if I get the setup code as non repeated by abstraction as I can
-
-I think testing and particulary automated testing is essential for success.
-
-It has been disappointing to find in my time working with others in the past that there seems resistance to testing and to automation of testing for reasons I believe not technical but that which time does not allow for me to digress
-
-## confusing config
-
-In config files: Just use the key name without any prefix
-
-In your code: Use config('filename.keyname')
-
-The filename becomes the first part automatically - you never type it inside the config file itself.
-
-
-
diff --git a/docs/decisions/006-api b/docs/decisions/006-api
deleted file mode 100644
index b6d8c60..0000000
--- a/docs/decisions/006-api
+++ /dev/null
@@ -1,53 +0,0 @@
-## known limitations
-
-at this stage, I just want a simple read api but have added some CRUD so as to have it in part and to test access is in place
-
-users need to be authenticated and have been given a token to read from entries
-
-an admin user can create entries however images cannot be uploaded or associated with posts, this is not a requirement to get static site generation in play
-
-## creating and using tokens
-
-this is in tinker for now
-
-```php
-> $user = User::find(2);
-= App\Models\User {#7224
- id: 2,
- name: "jon@test.com",
- email: "jon@test.com",
- email_verified_at: null,
- #password: "...",
- #remember_token: null,
- created_at: "2026-01-04 16:28:21",
- updated_at: "2026-01-04 16:28:21",
- #two_factor_secret: null,
- #two_factor_recovery_codes: null,
- two_factor_confirmed_at: null,
- }
-
-> $token = $user->createToken('API Token')->plainTextToken;
-= "generated token-string-shown-here"
-```
-
-then this token can be used to get posts
-
-```bash
-curl -X GET \
- -H "Authorization: Bearer " \
- -H "Accept: application/json" \
- http://your-laravel-app.test/api/entries
-
-```
-
-to delete a user token, again back in tinker
-
-```php
-// having already found a user as in the above ...
-// ..
-$user->tokens()->delete();
-//
-// or
-$user->tokens()->where('id', $tokenId)->delete();
-```
-
diff --git a/docs/decisions/007-docker-build.md b/docs/decisions/007-docker-build.md
deleted file mode 100644
index c79113d..0000000
--- a/docs/decisions/007-docker-build.md
+++ /dev/null
@@ -1,17 +0,0 @@
-The ENTRYPOINT script (/usr/local/bin/docker-entrypoint.sh) is executed first.
-
-The CMD (/usr/bin/supervisord -n -c /etc/supervisord.conf) is passed as arguments to the ENTRYPOINT script.
-
-The ENTRYPOINT script can choose to execute the CMD or perform other tasks before running the CMD.
-
-for now, supervisord is used in its current form, that of a python based application
-
-this is ok for now but other options could be considered, such as replacing it with a [go binary port of supervisord](https://github.com/ochinchina/supervisord), using [s6-overlay](https://github.com/just-containers/s6-overlay), [dumb-init](https://github.com/Yelp/dumb-init) or similar process management tools designed for containers.
-
-In the dockerfile, a user directive is used to lower from default root to that of a user that is created - 'www' and which is, for now, given a shell by which it is possible to log into this container for debugging and maintenance.
-
-further on, this can be removed somehow - likely a case for k8s as there are patterns for this that are perhaps not so much for docker alone.
-
-
-
-
diff --git a/docs/docker/create_nats_stream.sh b/docs/docker/create_nats_stream.sh
deleted file mode 100755
index f0973a2..0000000
--- a/docs/docker/create_nats_stream.sh
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env bash
-
-# This script creates a NATS stream using the nats CLI tool.
-# It reads the stream name, password, and subject from an .env file.
-
-ENV_FILE=".env"
-
-if [ ! -f "$ENV_FILE" ]; then
- echo ".env file not found at $ENV_FILE"
- exit 1
-fi
-
-. "$ENV_FILE"
-
-if [ -z "$NATS_STREAM" ]; then
- echo "NATS_STREAM is not set in .env file"
- exit 1
-fi
-
-if [ -z "$NATS_PASSWORD" ]; then
- echo "NATS_PASSWORD is not set in .env file"
- exit 1
-fi
-
-if [ -z "$NATS_SUBJECT" ]; then
- echo "NATS_SUBJECT is not set in .env file"
- exit 1
-fi
-
-nats \
- stream add "$NATS_STREAM" \
- --user ruser --password $NATS_PASSWORD \
- --subjects NATS_SUBJECT1 \
- --subjects NATS_SUBJECT2 \
- --subjects NATS_SUBJECT3 \
- --storage file \
- --dupe-window="2m" \
- --replicas=1 \
- --max-msgs-per-subject=-1 \
- --no-allow-rollup \
- --no-deny-delete \
- --no-deny-purge \
- --discard=old \
- --max-msgs=-1 \
- --max-bytes=-1 \
- --max-msg-size=-1 \
- --max-age=1h \
- --retention limits
diff --git a/docs/docker/docker-compose-cloudflard.yaml b/docs/docker/docker-compose-cloudflard.yaml
deleted file mode 100644
index 3fa6484..0000000
--- a/docs/docker/docker-compose-cloudflard.yaml
+++ /dev/null
@@ -1,117 +0,0 @@
-services:
- #nats:
- # image: nats:2.9.19-alpine
- # restart: unless-stopped
- #ports:
- # - 4222:4222
- # - 8222:8222
- # volumes:
- # - ./nats/nats-server.conf:/nats-server.conf
- # - nats-data:/opt/storage
- # command: ["-c", "/nats-server.conf"]
-
- # networks:
- # - app-network
- # - nats
-
- # nats-cli:
- # image: natsio/nats-box
- # container_name: nats-cli
- # depends_on:
- # - nats
- # command: sleep infinity # Keeps container running
- # networks:
- # - app-network
- # - nats
-
- app:
- image: quay.io/marshyon/share-lt:v0.0.8
- restart: unless-stopped
- tty: false
- working_dir: /var/www
- networks:
- - app-network
- - nats
- ports:
- - 8889:8889
- volumes:
- - storage-data:/var/www/storage
- - database-data:/var/www/database
- - ./nginx/conf.d/app.conf:/etc/nginx/http.d/app.conf
- - ./docker/php/php.ini:/usr/local/etc/php/php.ini
-
- environment:
- - "LIVEWIRE_TEMPORARY_FILE_UPLOAD_MAX_FILE_UPLOAD_TIME=5"
- - "ADMIN_EMAIL=${ADMIN_EMAIL}"
- - "APP_NAME=${APP_NAME}"
- - "APP_ENV=production"
- - "APP_KEY=${APP_KEY}"
- - "APP_DEBUG=false"
- - "APP_URL=${APP_URL}"
- - "APP_LOCALE=en"
- - "APP_FALLBACK_LOCALE=en"
- - "APP_MAINTENANCE_DRIVER=file"
- - "PHP_CLI_SERVER_WORKERS=4"
- - "BCRYPT_ROUNDS=12"
- - "LOG_CHANNEL=stack"
- - "LOG_STACK=single"
- - "LOG_DEPRECATIONS_CHANNEL=null"
- - "LOG_LEVEL=${LOG_LEVEL}"
- - "DB_CONNECTION=sqlite"
- - "SESSION_DRIVER=database"
- - "SESSION_LIFETIME=120"
- - "SESSION_ENCRYPT=false"
- - "SESSION_PATH=/"
- - "SESSION_DOMAIN=null"
- - "BROADCAST_CONNECTION=log"
- - "FILESYSTEM_DISK=s3"
- - "QUEUE_CONNECTION=database"
- - "CACHE_STORE=database"
- - "CACHE_PREFIX=laravel_"
- - "MAIL_MAILER=smtp"
- - "MAIL_SCHEME=smtp"
- - "MAIL_HOST=${MAIL_HOST}"
- - "MAIL_PORT=${MAIL_PORT}"
- - "MAIL_USERNAME=${MAIL_USERNAME}"
- - "MAIL_PASSWORD=${MAIL_PASSWORD}"
- - "MAIL_FROM_ADDRESS=${MAIL_FROM_ADDRESS}"
- - "MAIL_FROM_NAME=${APP_NAME}"
- - "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}"
- - "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}"
- - "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}"
- - "AWS_BUCKET=${AWS_BUCKET}"
- - "AWS_USE_PATH_STYLE_ENDPOINT=${AWS_USE_PATH_STYLE_ENDPOINT}"
- - "AWS_DIRECTORY=${AWS_DIRECTORY}"
- - "MEDIA_DISK=${MEDIA_DISK}"
- - "VITE_APP_NAME=${APP_NAME}"
-
- - "NATS_URL=${NATS_URL}"
- - "NATS_USERNAME=${NATS_USERNAME}"
- - "NATS_PASSWORD=${NATS_PASSWORD}"
- - "NATS_STREAM=${NATS_STREAM}"
- - "NATS_SUBJECT=${NATS_SUBJECT}"
-
- - "REVERB_APP_ID=${REVERB_APP_ID}"
- - "REVERB_APP_KEY=${REVERB_APP_KEY}"
- - "REVERB_APP_SECRET=${REVERB_APP_SECRET}"
- - "REVERB_HOST=${REVERB_HOST}"
- - "REVERB_PORT=${REVERB_PORT}"
- - "REVERB_SCHEME=${REVERB_SCHEME}"
- - "REVERB_SERVER_HOST=${REVERB_SERVER_HOST}"
- - "REVERB_SERVER_PORT=${REVERB_SERVER_PORT}"
- - "VITE_REVERB_APP_KEY=${REVERB_APP_KEY}"
- - "VITE_REVERB_HOST=${REVERB_HOST}"
- - "VITE_REVERB_PORT=${REVERB_PORT}"
- - "VITE_REVERB_SCHEME=${REVERB_SCHEME}"
- - "BROADCAST_CONNECTION=${BROADCAST_CONNECTION}"
-
-volumes:
- storage-data:
- database-data:
- nats-data:
-
-networks:
- app-network:
- nats:
- external: true
-
diff --git a/docs/docker/docker-compose-dev.yml b/docs/docker/docker-compose-dev.yml
deleted file mode 100644
index fc6a749..0000000
--- a/docs/docker/docker-compose-dev.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-services:
- #PHP Service
- app:
- image: quay.io/marshyon/share-lt:0.0.1
- ports:
- - "8000:8000"
- command: sh -c "php artisan optimize:clear && php artisan serve --host=0.0.0.0 --port=8000"
- volumes:
- - ./.env:/var/www/.env
- - ./database/database.sqlite:/var/www/database/database.sqlite
- - ./storage:/var/www/storage
-
- restart: unless-stopped
- tty: true
- working_dir: /var/www
-
-
-
diff --git a/docs/docker/docker-compose-nats.yaml b/docs/docker/docker-compose-nats.yaml
deleted file mode 100644
index 9c85e62..0000000
--- a/docs/docker/docker-compose-nats.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-services:
- nats:
- image: nats:2.9.19-alpine
- restart: unless-stopped
- ports:
- - 4222:4222
- - 8222:8222
- volumes:
- - ./nats/nats-server.conf:/nats-server.conf
- - nats-data:/opt/storage
- command: ["-c", "/nats-server.conf"]
-
- networks:
- - nats
-
-volumes:
- nats-data:
- driver: local
-
-networks:
- nats:
- external: true
diff --git a/docs/docker/docker-compose-prod.yaml b/docs/docker/docker-compose-prod.yaml
deleted file mode 100644
index 5e3d93c..0000000
--- a/docs/docker/docker-compose-prod.yaml
+++ /dev/null
@@ -1,84 +0,0 @@
-services:
- app:
- image: quay.io/marshyon/share-lt:v0.0.8
- restart: unless-stopped
- tty: false
- working_dir: /var/www
- networks:
- - app-network
- - traefik-net9
- volumes:
- - storage-data:/var/www/storage
- - database-data:/var/www/database
- - ./nginx/conf.d/app.conf:/etc/nginx/http.d/app.conf
- - ./docker/php/php.ini:/usr/local/etc/php/php.ini
-
- environment:
- - "LIVEWIRE_TEMPORARY_FILE_UPLOAD_MAX_FILE_UPLOAD_TIME=5"
- - "ADMIN_EMAIL=${ADMIN_EMAIL}"
- - "APP_NAME=${APP_NAME}"
- - "APP_ENV=production"
- - "APP_KEY=${APP_KEY}"
- - "APP_DEBUG=false"
- - "APP_URL=${APP_URL}"
- - "APP_LOCALE=en"
- - "APP_FALLBACK_LOCALE=en"
- - "APP_MAINTENANCE_DRIVER=file"
- - "PHP_CLI_SERVER_WORKERS=4"
- - "BCRYPT_ROUNDS=12"
- - "LOG_CHANNEL=stack"
- - "LOG_STACK=single"
- - "LOG_DEPRECATIONS_CHANNEL=null"
- - "LOG_LEVEL=${LOG_LEVEL}"
- - "DB_CONNECTION=sqlite"
- - "SESSION_DRIVER=database"
- - "SESSION_LIFETIME=120"
- - "SESSION_ENCRYPT=false"
- - "SESSION_PATH=/"
- - "SESSION_DOMAIN=null"
- - "BROADCAST_CONNECTION=log"
- - "FILESYSTEM_DISK=s3"
- - "QUEUE_CONNECTION=database"
- - "CACHE_STORE=database"
- - "CACHE_PREFIX=laravel_"
- - "MAIL_MAILER=smtp"
- - "MAIL_SCHEME=smtp"
- - "MAIL_HOST=${MAIL_HOST}"
- - "MAIL_PORT=${MAIL_PORT}"
- - "MAIL_USERNAME=${MAIL_USERNAME}"
- - "MAIL_PASSWORD=${MAIL_PASSWORD}"
- - "MAIL_FROM_ADDRESS=${MAIL_FROM_ADDRESS}"
- - "MAIL_FROM_NAME=${APP_NAME}"
- - "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}"
- - "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}"
- - "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}"
- - "AWS_BUCKET=${AWS_BUCKET}"
- - "AWS_USE_PATH_STYLE_ENDPOINT=${AWS_USE_PATH_STYLE_ENDPOINT}"
- - "AWS_DIRECTORY=${AWS_DIRECTORY}"
- - "MEDIA_DISK=${MEDIA_DISK}"
- - "VITE_APP_NAME=${APP_NAME}"
-
- labels:
- - "traefik.enable=true"
- - "traefik.docker.network=traefik-net9"
- - "traefik.http.services.${APP_SERVICE_NAME}.loadbalancer.server.port=${APP_PORT}"
- - "traefik.http.services.${APP_SERVICE_NAME}.loadbalancer.server.scheme=http"
- - "traefik.http.routers.${APP_SERVICE_NAME}.service=${APP_SERVICE_NAME}"
- - "traefik.http.routers.${APP_SERVICE_NAME}.tls.certresolver=le"
- - "traefik.http.routers.${APP_SERVICE_NAME}.rule=Host(`${APP_DOMAIN}`)"
- - "traefik.http.routers.${APP_SERVICE_NAME}.entrypoints=websecure"
- - "traefik.http.routers.${APP_SERVICE_NAME}.tls=true"
-
-volumes:
- storage-data:
- database-data:
-
-networks:
- app-network:
- traefik-net9:
- external: true
-
-
-
-
-
diff --git a/docs/docker/nats/nats-server.conf b/docs/docker/nats/nats-server.conf
deleted file mode 100644
index ddef438..0000000
--- a/docs/docker/nats/nats-server.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-# Client port of 4222 on all interfaces
-port: 4222
-
-# HTTP monitoring port
-monitor_port: 8222
-
-# Enable JetStream and specify the storage directory
-jetstream: {
- store_dir: "/opt/storage"
-}
-
-# Set a unique server name for this instance
-server_name: "nats-server-1"
\ No newline at end of file
diff --git a/nginx/conf.d/app.conf b/nginx/conf.d/app.conf
deleted file mode 100644
index f907e3d..0000000
--- a/nginx/conf.d/app.conf
+++ /dev/null
@@ -1,50 +0,0 @@
-server {
- listen 8889;
- # Redirect all HTTP requests to HTTPS
- # return 301 https://$host$request_uri;
-
- index index.php index.html;
- # error_log /var/log/nginx/error.log;
- error_log /dev/stderr debug;
- # access_log /var/log/nginx/access.log;
- access_log /dev/stdout;
- root /var/www/public;
-
-
- location ~ ^/(app|apps) {
- proxy_http_version 1.1;
- proxy_set_header Host $host;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "Upgrade";
-
- # This is the "Don't Crash" magic for Reverb
- # It tells Reverb the original connection was HTTPS
- proxy_set_header X-Forwarded-Proto https;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-
- # Forward to Reverb's internal port
- proxy_pass http://127.0.0.1:9001;
- }
-
-
- location ~ \.php$ {
- try_files $uri =404;
- fastcgi_split_path_info ^(.+\.php)(/.+)$;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- include fastcgi_params;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- fastcgi_param PATH_INFO $fastcgi_path_info;
- fastcgi_param HTTPS on;
- fastcgi_param HTTP_X_FORWARDED_PROTO https;
- }
- location / {
- try_files $uri $uri/ /index.php?$query_string;
- gzip_static on;
- }
- location /storage/ {
- alias /var/www/storage/app/public/;
- autoindex on;
- }
-}
diff --git a/package-lock.json b/package-lock.json
index 246ab74..a54ebf9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,10 +13,6 @@
"tailwindcss": "^4.0.7",
"vite": "^7.0.4"
},
- "devDependencies": {
- "laravel-echo": "^2.3.0",
- "pusher-js": "^8.4.0"
- },
"optionalDependencies": {
"@rollup/rollup-linux-x64-gnu": "4.9.5",
"@tailwindcss/oxide-linux-x64-gnu": "^4.0.1",
@@ -759,14 +755,6 @@
"win32"
]
},
- "node_modules/@socket.io/component-emitter": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
- "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
"node_modules/@tailwindcss/node": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz",
@@ -1284,25 +1272,6 @@
"url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
}
},
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -1347,32 +1316,6 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
- "node_modules/engine.io-client": {
- "version": "6.6.4",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz",
- "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@socket.io/component-emitter": "~3.1.0",
- "debug": "~4.4.1",
- "engine.io-parser": "~5.2.1",
- "ws": "~8.18.3",
- "xmlhttprequest-ssl": "~2.1.1"
- }
- },
- "node_modules/engine.io-parser": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
- "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=10.0.0"
- }
- },
"node_modules/enhanced-resolve": {
"version": "5.18.2",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz",
@@ -1700,20 +1643,6 @@
"jiti": "lib/jiti-cli.mjs"
}
},
- "node_modules/laravel-echo": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-2.3.0.tgz",
- "integrity": "sha512-wgHPnnBvfHmu2I58xJ4asZH37Nu6P0472ku6zuoGRLc3zEWwIbpovDLYTiOshDH1SM7rA6AjZTKuu+jYoM1tpQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20"
- },
- "peerDependencies": {
- "pusher-js": "*",
- "socket.io-client": "*"
- }
- },
"node_modules/laravel-vite-plugin": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.0.0.tgz",
@@ -2042,14 +1971,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "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==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -2141,16 +2062,6 @@
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
- "node_modules/pusher-js": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.4.0.tgz",
- "integrity": "sha512-wp3HqIIUc1GRyu1XrP6m2dgyE9MoCsXVsWNlohj0rjSkLf+a0jLvEyVubdg58oMk7bhjBWnFClgp8jfAa6Ak4Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tweetnacl": "^1.0.3"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -2233,38 +2144,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/socket.io-client": {
- "version": "4.8.3",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz",
- "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@socket.io/component-emitter": "~3.1.0",
- "debug": "~4.4.1",
- "engine.io-client": "~6.6.1",
- "socket.io-parser": "~4.2.4"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/socket.io-parser": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz",
- "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@socket.io/component-emitter": "~3.1.0",
- "debug": "~4.4.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -2378,13 +2257,6 @@
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
- "node_modules/tweetnacl": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
- "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
- "dev": true,
- "license": "Unlicense"
- },
"node_modules/update-browserslist-db": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
@@ -2528,39 +2400,6 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/ws": {
- "version": "8.18.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
- "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "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/xmlhttprequest-ssl": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
- "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
diff --git a/package.json b/package.json
index 3909aa8..688bea8 100644
--- a/package.json
+++ b/package.json
@@ -19,9 +19,5 @@
"@rollup/rollup-linux-x64-gnu": "4.9.5",
"@tailwindcss/oxide-linux-x64-gnu": "^4.0.1",
"lightningcss-linux-x64-gnu": "^1.29.1"
- },
- "devDependencies": {
- "laravel-echo": "^2.3.0",
- "pusher-js": "^8.4.0"
}
}
diff --git a/public/fonts/filament/filament/inter/index.css b/public/fonts/filament/filament/inter/index.css
deleted file mode 100644
index 425213e..0000000
--- a/public/fonts/filament/filament/inter/index.css
+++ /dev/null
@@ -1 +0,0 @@
-@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-cyrillic-ext-wght-normal-IYF56FF6.woff2") format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-cyrillic-wght-normal-JEOLYBOO.woff2") format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-greek-ext-wght-normal-EOVOK2B5.woff2") format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-greek-wght-normal-IRE366VL.woff2") format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-vietnamese-wght-normal-CE5GGD3W.woff2") format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-latin-ext-wght-normal-HA22NDSG.woff2") format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url("./inter-latin-wght-normal-NRMW37G5.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-ASVAGXXE.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-ASVAGXXE.woff2
deleted file mode 100644
index 0ba164b..0000000
Binary files a/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-ASVAGXXE.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2
deleted file mode 100644
index de83a9c..0000000
Binary files a/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-XKHXBTUO.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-XKHXBTUO.woff2
deleted file mode 100644
index a61a0be..0000000
Binary files a/public/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-XKHXBTUO.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-EWLSKVKN.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-EWLSKVKN.woff2
deleted file mode 100644
index 83a6f10..0000000
Binary files a/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-EWLSKVKN.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-JEOLYBOO.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-JEOLYBOO.woff2
deleted file mode 100644
index d750914..0000000
Binary files a/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-JEOLYBOO.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-R5CMSONN.woff2 b/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-R5CMSONN.woff2
deleted file mode 100644
index b655a43..0000000
Binary files a/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-R5CMSONN.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-7GGTF7EK.woff2 b/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-7GGTF7EK.woff2
deleted file mode 100644
index cf56a71..0000000
Binary files a/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-7GGTF7EK.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-EOVOK2B5.woff2 b/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-EOVOK2B5.woff2
deleted file mode 100644
index 6e7141f..0000000
Binary files a/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-EOVOK2B5.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-ZEVLMORV.woff2 b/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-ZEVLMORV.woff2
deleted file mode 100644
index 9117b5b..0000000
Binary files a/public/fonts/filament/filament/inter/inter-greek-ext-wght-normal-ZEVLMORV.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-greek-wght-normal-AXVTPQD5.woff2 b/public/fonts/filament/filament/inter/inter-greek-wght-normal-AXVTPQD5.woff2
deleted file mode 100644
index eb38b38..0000000
Binary files a/public/fonts/filament/filament/inter/inter-greek-wght-normal-AXVTPQD5.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-greek-wght-normal-IRE366VL.woff2 b/public/fonts/filament/filament/inter/inter-greek-wght-normal-IRE366VL.woff2
deleted file mode 100644
index 024f077..0000000
Binary files a/public/fonts/filament/filament/inter/inter-greek-wght-normal-IRE366VL.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-greek-wght-normal-N43DBLU2.woff2 b/public/fonts/filament/filament/inter/inter-greek-wght-normal-N43DBLU2.woff2
deleted file mode 100644
index 907b4a4..0000000
Binary files a/public/fonts/filament/filament/inter/inter-greek-wght-normal-N43DBLU2.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-5SRY4DMZ.woff2 b/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-5SRY4DMZ.woff2
deleted file mode 100644
index 887153b..0000000
Binary files a/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-5SRY4DMZ.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-GZCIV3NH.woff2 b/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-GZCIV3NH.woff2
deleted file mode 100644
index 3df865d..0000000
Binary files a/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-GZCIV3NH.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-HA22NDSG.woff2 b/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-HA22NDSG.woff2
deleted file mode 100644
index 479d010..0000000
Binary files a/public/fonts/filament/filament/inter/inter-latin-ext-wght-normal-HA22NDSG.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-latin-wght-normal-NRMW37G5.woff2 b/public/fonts/filament/filament/inter/inter-latin-wght-normal-NRMW37G5.woff2
deleted file mode 100644
index d15208d..0000000
Binary files a/public/fonts/filament/filament/inter/inter-latin-wght-normal-NRMW37G5.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-latin-wght-normal-O25CN4JL.woff2 b/public/fonts/filament/filament/inter/inter-latin-wght-normal-O25CN4JL.woff2
deleted file mode 100644
index 798d6d9..0000000
Binary files a/public/fonts/filament/filament/inter/inter-latin-wght-normal-O25CN4JL.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-latin-wght-normal-OPIJAQLS.woff2 b/public/fonts/filament/filament/inter/inter-latin-wght-normal-OPIJAQLS.woff2
deleted file mode 100644
index 4025543..0000000
Binary files a/public/fonts/filament/filament/inter/inter-latin-wght-normal-OPIJAQLS.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-CE5GGD3W.woff2 b/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-CE5GGD3W.woff2
deleted file mode 100644
index a40c469..0000000
Binary files a/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-CE5GGD3W.woff2 and /dev/null differ
diff --git a/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-TWG5UU7E.woff2 b/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-TWG5UU7E.woff2
deleted file mode 100644
index ce21ca1..0000000
Binary files a/public/fonts/filament/filament/inter/inter-vietnamese-wght-normal-TWG5UU7E.woff2 and /dev/null differ
diff --git a/resources/js/app.js b/resources/js/app.js
index ccd693b..e69de29 100644
--- a/resources/js/app.js
+++ b/resources/js/app.js
@@ -1,53 +0,0 @@
-document.addEventListener('livewire:init', () => {
- Livewire.on('insert-editor-content', (data) => {
- // console.log('Received insert-editor-content data:', data);
- // Handle if data is an array
- const payload = Array.isArray(data) ? data[0] : data;
- const statePath = payload.statePath;
- const html = payload.html;
- // console.log('Extracted statePath:', statePath, 'html:', html);
- // 1. Find the editor by its statePath
- const container = document.querySelector(`[wire\\:model="${statePath}"]`) || document.querySelector(`[statepath="${statePath}"]`);
- // console.log('Container found:', container);
- const editorElement = container ? container.querySelector('.tiptap') : null;
- // console.log('Editor element found:', editorElement);
-
- if (editorElement && editorElement.editor) {
- // console.log('Inserting content:', html);
- // 2. Insert the HTML (the
tag) into the editor
- setTimeout(() => {
- editorElement.editor.chain().focus().insertContent(html).run();
- }, 500);
- } else {
- // console.log('Editor not found or not initialized');
- // Fallback: try to find any .tiptap on the page
- const anyTiptap = document.querySelector('.tiptap');
- // console.log('Any tiptap found:', anyTiptap);
- if (anyTiptap && anyTiptap.editor) {
- // console.log('Inserting to any tiptap');
- setTimeout(() => {
- anyTiptap.editor.chain().focus().insertContent(html).run();
- }, 500);
- }
- }
- });
-
- Livewire.on('featured-image-added', (data) => {
- // console.log('Received featured-image-added event:', data);
- const payload = Array.isArray(data) ? data[0] : data;
-
- // Reload the page to show the updated featured image
- setTimeout(() => {
- window.location.reload();
- }, 500);
- });
-});
-
-
-/**
- * Echo exposes an expressive API for subscribing to channels and listening
- * for events that are broadcast by Laravel. Echo and event broadcasting
- * allow your team to quickly build robust real-time web applications.
- */
-
-import './echo';
diff --git a/resources/js/echo.js b/resources/js/echo.js
deleted file mode 100644
index 9ea2fa2..0000000
--- a/resources/js/echo.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import Echo from 'laravel-echo';
-import Pusher from 'pusher-js';
-
-window.Pusher = Pusher;
-
-// Add error handling and logging
-try {
- console.log('Initializing Echo with:', {
- key: import.meta.env.VITE_REVERB_APP_KEY,
- wsHost: import.meta.env.VITE_REVERB_HOST,
- wsPort: import.meta.env.VITE_REVERB_PORT,
- scheme: import.meta.env.VITE_REVERB_SCHEME
- });
-
- window.Echo = new Echo({
- broadcaster: 'reverb',
- key: import.meta.env.VITE_REVERB_APP_KEY,
- wsHost: import.meta.env.VITE_REVERB_HOST,
- wsPort: import.meta.env.VITE_REVERB_PORT ?? 80,
- wssPort: import.meta.env.VITE_REVERB_PORT ?? 443,
- forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? 'https') === 'https',
- enabledTransports: ['ws', 'wss'],
- });
-
- console.log('Echo initialized:', window.Echo);
-} catch (error) {
- console.error('Failed to initialize Echo:', error);
-}
\ No newline at end of file
diff --git a/resources/views/test-reverb.blade.php b/resources/views/test-reverb.blade.php
deleted file mode 100644
index d26315b..0000000
--- a/resources/views/test-reverb.blade.php
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
- Reverb Test
- @vite(['resources/css/app.css', 'resources/js/app.js'])
-
-
-
- Reverb Connection Test
- Waiting for Echo...
-
-
-
-
-
-
diff --git a/routes/api.php b/routes/api.php
deleted file mode 100644
index 6c09928..0000000
--- a/routes/api.php
+++ /dev/null
@@ -1,29 +0,0 @@
-group(function () {
- Route::get('/categories', [CategoryController::class, 'index']);
- Route::post('/categories', [CategoryController::class, 'store']);
- Route::get('/categories/{category}', [CategoryController::class, 'show']);
- Route::put('/categories/{category}', [CategoryController::class, 'update']);
- Route::delete('/categories/{category}', [CategoryController::class, 'destroy']);
-
- Route::get('/entries', [EntryController::class, 'index']);
- Route::post('/entries', [EntryController::class, 'store']);
- Route::get('/entries/{entry}', [EntryController::class, 'show']);
- Route::put('/entries/{entry}', [EntryController::class, 'update']);
- Route::delete('/entries/{entry}', [EntryController::class, 'destroy']);
-
- Route::get('/text-widgets', [TextWidgetController::class, 'index']);
- Route::post('/text-widgets', [TextWidgetController::class, 'store']);
- Route::get('/text-widgets/{textWidget}', [TextWidgetController::class, 'show']);
- Route::put('/text-widgets/{textWidget}', [TextWidgetController::class, 'update']);
- Route::delete('/text-widgets/{textWidget}', [TextWidgetController::class, 'destroy']);
-
- Route::post('/notifications/preview-site-built', [NotificationController::class, 'sendPreviewSiteBuilt']);
-});
diff --git a/routes/channels.php b/routes/channels.php
deleted file mode 100644
index df2ad28..0000000
--- a/routes/channels.php
+++ /dev/null
@@ -1,7 +0,0 @@
-id === (int) $id;
-});
diff --git a/routes/web.php b/routes/web.php
index 12b00bf..08f2975 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -32,20 +32,4 @@ Route::middleware(['auth'])->group(function () {
),
)
->name('two-factor.show');
-
- Route::get('/test-reverb', function () {
- event(new App\Events\TestEvent('Hello from Laravel at ' . now()));
-
- return 'Event fired! Check your browser console.';
- })->name('test.reverb');
-
- Route::get('/test-reverb-page', function () {
- return view('test-reverb');
- })->name('test.reverb.page');
-
- Route::get('/test-preview-site-built', function () {
- event(new App\Events\PreviewSiteBuilt('Preview site is built at ' . now(), 'success'));
-
- return 'Preview site built notification sent! Check your Filament admin panel for the toast notification.';
- })->name('test.preview.site.built');
});
diff --git a/tests/Browser/001_LoginDashAdminTest.php b/tests/Browser/001_LoginDashAdminTest.php
deleted file mode 100644
index b5d2bc3..0000000
--- a/tests/Browser/001_LoginDashAdminTest.php
+++ /dev/null
@@ -1,60 +0,0 @@
-createTestUser("login-test@example.com");
-
- $this->browse(function (Browser $browser) use ($user) {
- $this->loginUser($browser, $user);
- $this->assertWithDebugPause($browser, fn($b) =>
- $b->assertPathIs('/dashboard'),
- 1000 // Custom pause time for this test
- );
- });
- }
-
- public function test_invalid_login(): void
- {
- $user = $this->createTestUser("invalid-email@example.com");
-
- $this->browse(function (Browser $browser) use ($user) {
- $this->loginUser($browser, $user);
- $this->assertWithDebugPause($browser, fn($b) =>
- $b->visit('/admin')
- ->waitForLocation('/admin')
- ->assertPathIs('/admin')
- ->assertSee('FORBIDDEN'),
- 1000 // Custom pause time for this test
- );
- });
- }
-
- public function test_access_admin_panel(): void
- {
- $user = $this->createTestUser("login-test@example.com");
-
- $this->browse(function (Browser $browser) use ($user) {
- $this->loginUser($browser, $user);
- $this->assertWithDebugPause($browser, fn($b) =>
- $b->visit('/admin')
- ->waitForLocation('/admin')
- ->assertPathIs('/admin')
- ->assertTitleContains('Dashboard')
- ->assertDontSee('FORBIDDEN'),
- 1000 // Custom pause time for this test
- );
- });
- }
-}
\ No newline at end of file
diff --git a/tests/Browser/002_UploadImageAdminTest.php b/tests/Browser/002_UploadImageAdminTest.php
deleted file mode 100644
index 2d5a150..0000000
--- a/tests/Browser/002_UploadImageAdminTest.php
+++ /dev/null
@@ -1,45 +0,0 @@
-createTestUser("login-test@example.com");
-
- $filePath = base_path('tests/Browser/fixtures/robot.webp');
-
- $this->browse(function (Browser $browser) use ($user, $filePath) {
- $this->loginUser($browser, $user);
- $this->assertWithDebugPause(
- $browser,
- fn($b) =>
- $b->visit('/admin/media')
- ->waitForLocation('/admin/media')
- ->assertPathIs('/admin/media')
- ->assertTitleContains('Media')
- ->clickLink('Add')
- ->waitForText('Create Asset')
- ->type('#form\\.alt_text', 'test image')
- ->assertVisible('.filepond--drop-label')
- ->attach('.filepond--browser', $filePath)
- ->pause(7000)
- ->waitForText('Create')
- ->waitFor('#key-bindings-1:not([disabled])')
- ->click('#key-bindings-1'),
- 1000 // Custom pause time for this test
- );
- });
- }
-}
diff --git a/tests/Browser/003_CreateEntryAdminTest.php b/tests/Browser/003_CreateEntryAdminTest.php
deleted file mode 100644
index 6748a85..0000000
--- a/tests/Browser/003_CreateEntryAdminTest.php
+++ /dev/null
@@ -1,66 +0,0 @@
-createTestUser("login-test@example.com");
-
- $filePath = base_path('tests/Browser/fixtures/robot.webp');
-
- $this->browse(function (Browser $browser) use ($user, $filePath) {
- $this->loginUser($browser, $user);
- $this->assertWithDebugPause(
- $browser,
- fn($b) =>
- $b->visit('/admin/media')
- ->waitForLocation('/admin/media')
- ->assertPathIs('/admin/media')
- ->assertTitleContains('Media')
- ->clickLink('Add')
- ->waitForText('Create Asset')
- ->type('#form\\.alt_text', 'test image')
- ->assertVisible('.filepond--drop-label')
- ->attach('.filepond--browser', $filePath)
- ->pause(7000)
- ->waitForText('Create Asset')
- ->waitFor('#key-bindings-1:not([disabled])')
- ->click('#key-bindings-1')
- ->pause(1000)
-
- ->visit('/admin/entries')
- ->waitForLocation('/admin/entries')
- ->assertPathIs('/admin/entries')
- ->assertTitleContains('Entries')
- ->clickLink('New entry')
- ->waitForText('Create Entry')
- ->type('#form\\.title', 'TEST ENTRY')
- ->keys('#form\\.title', '{tab}')
- ->waitForText('Create')
-
- ->click('#key-bindings-1')
- ->waitForText('Updated at')
- ->assertSee('Updated at')
- ->visit('/admin/entries/1/edit')
- ->waitForText('Edit TEST ENTRY')
- ->waitForText('Featured Image')
- ->click('#featured-picker-button')
- ->pause(5000)
- ->waitForText('Select an existing image')
- ->pause(3000),
- // TODO: find a way to select the image
- 1000 // Custom pause time for this test
- );
- });
- }
-}
diff --git a/tests/Browser/Concerns/AuthenticatesUsers.php b/tests/Browser/Concerns/AuthenticatesUsers.php
deleted file mode 100644
index 640fbd0..0000000
--- a/tests/Browser/Concerns/AuthenticatesUsers.php
+++ /dev/null
@@ -1,38 +0,0 @@
-create([
- 'email' => $email,
- 'password' => bcrypt('password'),
- 'two_factor_secret' => null,
- 'two_factor_recovery_codes' => null,
- ]);
- }
-
- private function loginUser(Browser $browser, User $user): void
- {
- $browser->visit('/login')
- ->type('email', $user->email)
- ->type('password', 'password')
- ->press('Log in')
- ->waitForLocation('/dashboard');
- }
-
- private function assertWithDebugPause(Browser $browser, callable $assertions, int $pauseMs = 10000): void
- {
- try {
- $assertions($browser);
- } catch (\Exception $e) {
- $browser->pause($pauseMs);
- throw $e;
- }
- }
-}
\ No newline at end of file
diff --git a/tests/Browser/console/.gitignore b/tests/Browser/console/.gitignore
deleted file mode 100644
index d6b7ef3..0000000
--- a/tests/Browser/console/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/tests/Browser/fixtures/robot.webp b/tests/Browser/fixtures/robot.webp
deleted file mode 100644
index 3dd400b..0000000
Binary files a/tests/Browser/fixtures/robot.webp and /dev/null differ
diff --git a/tests/Browser/screenshots/.gitignore b/tests/Browser/screenshots/.gitignore
deleted file mode 100644
index d6b7ef3..0000000
--- a/tests/Browser/screenshots/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/tests/Browser/source/.gitignore b/tests/Browser/source/.gitignore
deleted file mode 100644
index d6b7ef3..0000000
--- a/tests/Browser/source/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/tests/DuskTestCase.php b/tests/DuskTestCase.php
deleted file mode 100644
index 020699d..0000000
--- a/tests/DuskTestCase.php
+++ /dev/null
@@ -1,48 +0,0 @@
-addArguments(collect([
- $this->shouldStartMaximized() ? '--start-maximized' : '--window-size=1920,1080',
- '--disable-search-engine-choice-screen',
- '--disable-smooth-scrolling',
- ])->unless($this->hasHeadlessDisabled(), function (Collection $items) {
- return $items->merge([
- '--disable-gpu',
- '--headless=new',
- ]);
- })->all());
-
- return RemoteWebDriver::create(
- $_ENV['DUSK_DRIVER_URL'] ?? env('DUSK_DRIVER_URL') ?? 'http://localhost:9515',
- DesiredCapabilities::chrome()->setCapability(
- ChromeOptions::CAPABILITY, $options
- )
- );
- }
-}
diff --git a/tests/Feature/CategoryApiTest.php b/tests/Feature/CategoryApiTest.php
deleted file mode 100644
index 814d296..0000000
--- a/tests/Feature/CategoryApiTest.php
+++ /dev/null
@@ -1,171 +0,0 @@
-create();
-
- Category::factory()->count(3)->create();
-
- actingAs($user)
- ->getJson('/api/categories')
- ->assertSuccessful()
- ->assertJsonCount(3, 'data');
-});
-
-test('index requires authentication', function () {
- getJson('/api/categories')->assertUnauthorized();
-});
-
-test('store creates a new category when user is admin', function () {
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
-
- actingAs($admin)
- ->postJson('/api/categories', ['name' => 'Technology'])
- ->assertSuccessful()
- ->assertJsonPath('data.name', 'Technology');
-
- expect(Category::where('name', 'Technology')->exists())->toBeTrue();
-});
-
-test('store fails when name is missing', function () {
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
-
- actingAs($admin)
- ->postJson('/api/categories', [])
- ->assertUnprocessable()
- ->assertJsonValidationErrors(['name']);
-});
-
-test('store fails when name is not unique', function () {
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
-
- Category::factory()->create(['name' => 'Existing']);
-
- actingAs($admin)
- ->postJson('/api/categories', ['name' => 'Existing'])
- ->assertUnprocessable()
- ->assertJsonValidationErrors(['name']);
-});
-
-test('store fails when user is not admin', function () {
- $user = User::factory()->create();
-
- actingAs($user)
- ->postJson('/api/categories', ['name' => 'Technology'])
- ->assertForbidden();
-});
-
-test('store requires authentication', function () {
- postJson('/api/categories', ['name' => 'Technology'])->assertUnauthorized();
-});
-
-test('show returns a single category', function () {
- $user = User::factory()->create();
- $category = Category::factory()->create(['name' => 'Science']);
-
- actingAs($user)
- ->getJson("/api/categories/{$category->id}")
- ->assertSuccessful()
- ->assertJsonPath('data.name', 'Science')
- ->assertJsonPath('data.id', $category->id);
-});
-
-test('show requires authentication', function () {
- $category = Category::factory()->create();
-
- getJson("/api/categories/{$category->id}")->assertUnauthorized();
-});
-
-test('update modifies an existing category when user is admin', function () {
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
- $category = Category::factory()->create(['name' => 'Old Name']);
-
- actingAs($admin)
- ->putJson("/api/categories/{$category->id}", ['name' => 'New Name'])
- ->assertSuccessful()
- ->assertJsonPath('data.name', 'New Name');
-
- expect($category->refresh()->name)->toBe('New Name');
-});
-
-test('update allows partial updates', function () {
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
- $category = Category::factory()->create(['name' => 'Original']);
-
- actingAs($admin)
- ->putJson("/api/categories/{$category->id}", [])
- ->assertSuccessful();
-
- expect($category->refresh()->name)->toBe('Original');
-});
-
-test('update fails when name is not unique', function () {
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
-
- Category::factory()->create(['name' => 'Existing']);
- $category = Category::factory()->create(['name' => 'Original']);
-
- actingAs($admin)
- ->putJson("/api/categories/{$category->id}", ['name' => 'Existing'])
- ->assertUnprocessable()
- ->assertJsonValidationErrors(['name']);
-});
-
-test('update fails when user is not admin', function () {
- $user = User::factory()->create();
- $category = Category::factory()->create();
-
- actingAs($user)
- ->putJson("/api/categories/{$category->id}", ['name' => 'New Name'])
- ->assertForbidden();
-});
-
-test('update requires authentication', function () {
- $category = Category::factory()->create();
-
- putJson("/api/categories/{$category->id}", ['name' => 'New Name'])->assertUnauthorized();
-});
-
-test('destroy deletes a category when user is admin', function () {
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
- $category = Category::factory()->create();
-
- actingAs($admin)
- ->deleteJson("/api/categories/{$category->id}")
- ->assertNoContent();
-
- expect(Category::find($category->id))->toBeNull();
-});
-
-test('destroy fails when user is not admin', function () {
- $user = User::factory()->create();
- $category = Category::factory()->create();
-
- actingAs($user)
- ->deleteJson("/api/categories/{$category->id}")
- ->assertForbidden();
-});
-
-test('destroy requires authentication', function () {
- $category = Category::factory()->create();
-
- deleteJson("/api/categories/{$category->id}")->assertUnauthorized();
-});
diff --git a/tests/Feature/NotificationControllerTest.php b/tests/Feature/NotificationControllerTest.php
deleted file mode 100644
index a72e426..0000000
--- a/tests/Feature/NotificationControllerTest.php
+++ /dev/null
@@ -1,77 +0,0 @@
- 'Test notification',
- ])->assertUnauthorized();
-});
-
-test('send preview site built notification requires admin permissions', function () {
- $user = User::factory()->create();
-
- actingAs($user)
- ->postJson('/api/notifications/preview-site-built', [
- 'message' => 'Test notification',
- ])
- ->assertForbidden();
-});
-
-test('send preview site built notification validates message requirement', function () {
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
-
- actingAs($admin)
- ->postJson('/api/notifications/preview-site-built', [])
- ->assertUnprocessable()
- ->assertJsonValidationErrors(['message']);
-});
-
-test('send preview site built notification validates message length', function () {
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
-
- actingAs($admin)
- ->postJson('/api/notifications/preview-site-built', [
- 'message' => str_repeat('a', 256), // 256 characters, over the 255 limit
- ])
- ->assertUnprocessable()
- ->assertJsonValidationErrors(['message']);
-});
-
-test('send preview site built notification dispatches event successfully', function () {
- Event::fake();
-
- $adminEmail = config('app.admin_email');
- $admin = User::factory()->create(['email' => $adminEmail]);
- $message = 'Test preview site notification';
-
- actingAs($admin)
- ->postJson('/api/notifications/preview-site-built', [
- 'message' => $message,
- ])
- ->assertSuccessful()
- ->assertJsonStructure([
- 'success',
- 'message',
- 'data' => [
- 'notification_message',
- ],
- ])
- ->assertJsonPath('success', true)
- ->assertJsonPath('data.notification_message', $message);
-
- Event::assertDispatched(PreviewSiteBuilt::class, function ($event) use ($message) {
- return $event->message === $message
- && $event->type === 'success';
- });
-});
diff --git a/tests/Feature/PreviewSiteBuiltEventTest.php b/tests/Feature/PreviewSiteBuiltEventTest.php
deleted file mode 100644
index 9eef748..0000000
--- a/tests/Feature/PreviewSiteBuiltEventTest.php
+++ /dev/null
@@ -1,23 +0,0 @@
-message === 'Test preview site is built'
- && $event->type === 'success';
- });
-});
-
-it('has correct broadcast channel and event name', function () {
- $event = new PreviewSiteBuilt('Test message', 'success');
-
- expect($event->broadcastOn())->toHaveCount(1)
- ->and($event->broadcastOn()[0]->name)->toBe('filament-notifications')
- ->and($event->broadcastAs())->toBe('preview-site.built');
-});
diff --git a/tests/Pest.php b/tests/Pest.php
index 59833e1..40d096b 100644
--- a/tests/Pest.php
+++ b/tests/Pest.php
@@ -1,9 +1,5 @@
extend(Tests\DuskTestCase::class)
-// ->use(Illuminate\Foundation\Testing\DatabaseMigrations::class)
- ->in('Browser');
-
/*
|--------------------------------------------------------------------------
| Test Case
@@ -17,7 +13,7 @@ pest()->extend(Tests\DuskTestCase::class)
pest()->extend(Tests\TestCase::class)
->use(Illuminate\Foundation\Testing\RefreshDatabase::class)
- ->in('Feature', 'Unit');
+ ->in('Feature');
/*
|--------------------------------------------------------------------------
diff --git a/tests/TestCase.php b/tests/TestCase.php
index 65c00a0..fe1ffc2 100644
--- a/tests/TestCase.php
+++ b/tests/TestCase.php
@@ -6,15 +6,5 @@ use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
- /**
- * Creates the application.
- */
- public function createApplication(): \Illuminate\Foundation\Application
- {
- $app = require __DIR__ . '/../bootstrap/app.php';
-
- $app->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap();
-
- return $app;
- }
+ //
}
diff --git a/tests/Unit/EntryApiTest.php b/tests/Unit/EntryApiTest.php
deleted file mode 100644
index 0b8fea5..0000000
--- a/tests/Unit/EntryApiTest.php
+++ /dev/null
@@ -1,92 +0,0 @@
-create();
- Entry::factory()->count(3)->create();
-
- $response = $this->actingAs($user)->getJson('/api/entries');
-
- $response->assertOk()
- ->assertJsonCount(3, 'data');
-});
-
-test('can create an entry', function () {
- $admin = User::factory()->create(['email' => config('app.admin_email')]);
-
- $this->actingAs($admin);
-
- $data = [
- 'title' => 'Sample Title',
- 'content' => 'Sample Content',
- ];
-
- $response = $this->postJson('/api/entries', $data);
-
- $response->assertCreated()
- ->assertJsonFragment($data);
-});
-
-test('can show an entry', function () {
- $user = User::factory()->create();
- $entry = Entry::factory()->create();
-
- $response = $this->actingAs($user)->getJson("/api/entries/{$entry->id}");
-
- $response->assertOk()
- ->assertJsonFragment(['id' => $entry->id]);
-});
-
-test('can update an entry', function () {
- $user = User::factory()->create();
- $entry = Entry::factory()->create();
- $data = ['title' => 'Updated Title'];
-
- $response = $this->actingAs($user)->putJson("/api/entries/{$entry->id}", $data);
-
- $response->assertOk()
- ->assertJsonFragment($data);
-});
-
-test('can delete an entry', function () {
- $user = User::factory()->create();
- $entry = Entry::factory()->create();
-
- $response = $this->actingAs($user)->deleteJson("/api/entries/{$entry->id}");
-
- $response->assertNoContent();
-
- $this->assertDatabaseMissing('entries', ['id' => $entry->id]);
-});
-
-test('only admin can create entries', function () {
- $adminEmail = Config::get('app.admin_email');
- $user = User::factory()->create(['email' => $adminEmail]);
-
- $this->actingAs($user)
- ->postJson('/api/entries', ['title' => 'Test', 'content' => 'Test content'])
- ->assertCreated();
-
- $nonAdmin = User::factory()->create(['email' => 'nonadmin@example.com']);
-
- $this->actingAs($nonAdmin)
- ->postJson('/api/entries', ['title' => 'Test', 'content' => 'Test content'])
- ->assertForbidden();
-});
-
-test('authenticated users can read entries', function () {
- $user = User::factory()->create();
-
- $this->actingAs($user)
- ->getJson('/api/entries')
- ->assertOk();
-
- $this->getJson('/api/entries')
- ->assertOk();
-});
diff --git a/tests/Unit/EntryModelTest.php b/tests/Unit/EntryModelTest.php
deleted file mode 100644
index 939bfe6..0000000
--- a/tests/Unit/EntryModelTest.php
+++ /dev/null
@@ -1,24 +0,0 @@
-getFillable())->toEqual($expected);
-});
diff --git a/tests/Unit/EntryResourceTest.php b/tests/Unit/EntryResourceTest.php
deleted file mode 100644
index 3757f62..0000000
--- a/tests/Unit/EntryResourceTest.php
+++ /dev/null
@@ -1,53 +0,0 @@
-getDefaultProperties();
-
- expect($defaults['model'] ?? null)->toBe(Entry::class);
- expect($defaults['recordTitleAttribute'] ?? null)->toBe('title');
-});
-
-it('defines the expected pages', function () {
- $pages = EntryResource::getPages();
-
- expect(array_keys($pages))->toEqual(['index', 'create', 'view', 'edit']);
-});
-
-it('accepts new record when entered via the form schema', function () {
-
- $data = [
- 'title' => 'Test Entry',
- 'slug' => 'test-entry',
- 'description' => 'This is a test entry.',
- 'is_published' => true,
- 'is_featured' => false,
- 'published_at' => now()->toDateString(),
- 'content' => 'This is the content of the test entry.
',
- ];
-
- $entry = new Entry();
- $entry->fill($data);
-
- expect($entry->slug)->toBe('test-entry');
-});
-
-it('deletes a record correctly', function () {
- $entry = Entry::create([
- 'title' => 'Test Entry to Delete',
- 'slug' => 'test-entry-to-delete',
- 'description' => 'This is a test entry.',
- 'is_published' => false,
- 'is_featured' => false,
- 'published_at' => null,
- 'content' => 'This is the content of the test entry.
',
- ]);
-
- $entryId = $entry->id;
- $entry->delete();
-
- $deletedEntry = Entry::find($entryId);
- expect($deletedEntry)->toBeNull();
-});
\ No newline at end of file
diff --git a/tests/Unit/TextWidgetApiTest.php b/tests/Unit/TextWidgetApiTest.php
deleted file mode 100644
index 5f2df58..0000000
--- a/tests/Unit/TextWidgetApiTest.php
+++ /dev/null
@@ -1,95 +0,0 @@
-create();
- TextWidget::factory()->count(3)->create();
-
- $response = $this->actingAs($user)->getJson('/api/text-widgets');
-
- $response->assertOk()
- ->assertJson(fn ($json) =>
- $json->has('data', 3)
- ->etc()
- );
-});
-
-test('can create a text widget', function () {
- $admin = User::factory()->create(['email' => config('app.admin_email')]);
-
- $this->actingAs($admin);
-
- $data = [
- 'title' => 'Sample Title',
- 'content' => 'Sample Content',
- ];
-
- $response = $this->postJson('/api/text-widgets', $data);
-
- $response->assertCreated()
- ->assertJsonFragment($data);
-});
-
-test('can show a text widget', function () {
- $user = User::factory()->create();
- $textWidget = TextWidget::factory()->create();
-
- $response = $this->actingAs($user)->getJson("/api/text-widgets/{$textWidget->id}");
-
- $response->assertOk()
- ->assertJsonFragment(['id' => $textWidget->id]);
-});
-
-test('can update a text widget', function () {
- $user = User::factory()->create();
- $textWidget = TextWidget::factory()->create();
- $data = ['title' => 'Updated Title'];
-
- $response = $this->actingAs($user)->putJson("/api/text-widgets/{$textWidget->id}", $data);
-
- $response->assertOk()
- ->assertJsonFragment($data);
-});
-
-test('can delete a text widget', function () {
- $user = User::factory()->create();
- $textWidget = TextWidget::factory()->create();
-
- $response = $this->actingAs($user)->deleteJson("/api/text-widgets/{$textWidget->id}");
-
- $response->assertNoContent();
-
- $this->assertDatabaseMissing('text_widgets', ['id' => $textWidget->id]);
-});
-
-test('only admin can create text widgets', function () {
- $adminEmail = Config::get('app.admin_email');
- $user = User::factory()->create(['email' => $adminEmail]);
-
- $this->actingAs($user)
- ->postJson('/api/text-widgets', ['title' => 'Test', 'content' => 'Test content'])
- ->assertCreated();
-
- $nonAdmin = User::factory()->create(['email' => 'nonadmin@example.com']);
-
- $this->actingAs($nonAdmin)
- ->postJson('/api/text-widgets', ['title' => 'Test', 'content' => 'Test content'])
- ->assertForbidden();
-});
-
-test('authenticated users can read text widgets', function () {
- $user = User::factory()->create();
-
- $this->actingAs($user)
- ->getJson('/api/text-widgets')
- ->assertOk();
-
- $this->getJson('/api/text-widgets')
- ->assertOk();
-});
diff --git a/tests/Unit/TextWidgetModelTest.php b/tests/Unit/TextWidgetModelTest.php
deleted file mode 100644
index 13f405b..0000000
--- a/tests/Unit/TextWidgetModelTest.php
+++ /dev/null
@@ -1,16 +0,0 @@
-getFillable())->toEqual($expected);
-});
diff --git a/tests/Unit/TextWidgetResourceTest.php b/tests/Unit/TextWidgetResourceTest.php
deleted file mode 100644
index 7ad5461..0000000
--- a/tests/Unit/TextWidgetResourceTest.php
+++ /dev/null
@@ -1,47 +0,0 @@
-getDefaultProperties();
-
- expect($defaults['model'] ?? null)->toBe(TextWidget::class);
- expect($defaults['recordTitleAttribute'] ?? null)->toBe('title');
-});
-
-it('defines the expected pages', function () {
- $pages = EntryResource::getPages();
-
- expect(array_keys($pages))->toEqual(['index', 'create', 'view', 'edit']);
-});
-
-it('accepts new record when entered via the form schema', function () {
-
- $data = [
- 'title' => 'Test Entry',
- 'description' => 'This is a test entry.',
- 'content' => 'This is the content of the test entry.
',
- ];
-
- $entry = new TextWidget;
- $entry->fill($data);
-
- expect($entry->title)->toBe('Test Entry');
-});
-
-it('deletes a record correctly', function () {
- $entry = TextWidget::create([
- 'title' => 'Test Entry to Delete',
- 'description' => 'This is a test entry.',
- 'content' => 'This is the content of the test entry.
',
- ]);
-
- $entryId = $entry->id;
- $entry->delete();
-
- $deletedEntry = TextWidget::find($entryId);
- expect($deletedEntry)->toBeNull();
-});