├── .ddev └── config.yaml ├── .devcontainer ├── devcontainer.json ├── postCreateCommand.sh └── templates │ └── docker-compose.vite-workaround.yaml ├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── .gitpod.yml ├── .gitpod ├── project-setup.sh └── templates │ ├── docker-compose.vite-workaround.yaml │ └── launch.json ├── README.md ├── README.original.md ├── app ├── Http │ └── Controllers │ │ └── Controller.php ├── Models │ └── User.php └── Providers │ └── AppServiceProvider.php ├── artisan ├── bootstrap ├── app.php ├── cache │ └── .gitignore └── providers.php ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── cache.php ├── database.php ├── filesystems.php ├── logging.php ├── mail.php ├── queue.php ├── services.php └── session.php ├── database ├── .gitignore ├── factories │ └── UserFactory.php ├── migrations │ ├── 0001_01_01_000000_create_users_table.php │ ├── 0001_01_01_000001_create_cache_table.php │ └── 0001_01_01_000002_create_jobs_table.php └── seeders │ └── DatabaseSeeder.php ├── package-lock.json ├── package.json ├── phpunit.xml ├── public ├── .htaccess ├── favicon.ico ├── index.php └── robots.txt ├── resources ├── css │ └── app.css ├── js │ ├── app.js │ └── bootstrap.js └── views │ ├── welcome.blade.original.php │ └── welcome.blade.php ├── routes ├── console.php └── web.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tests ├── Feature │ └── ExampleTest.php ├── TestCase.php └── Unit │ └── ExampleTest.php └── vite.config.js /.ddev/config.yaml: -------------------------------------------------------------------------------- 1 | name: ddev-laravel-vite 2 | type: laravel 3 | docroot: public 4 | php_version: "8.2" 5 | webserver_type: nginx-fpm 6 | xdebug_enabled: false 7 | additional_hostnames: [] 8 | additional_fqdns: [] 9 | database: 10 | type: mysql 11 | version: "8.0" 12 | use_dns_when_possible: true 13 | composer_version: "2" 14 | web_environment: 15 | - GITPOD_WORKSPACE_URL 16 | - CODESPACES 17 | - CODESPACE_NAME 18 | - GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN 19 | corepack_enable: false 20 | nodejs_version: "20.13.1" 21 | web_extra_exposed_ports: 22 | - name: vite 23 | container_port: 5173 24 | http_port: 5172 25 | https_port: 5173 26 | 27 | # Key features of DDEV's config.yaml: 28 | 29 | # name: # Name of the project, automatically provides 30 | # http://projectname.ddev.site and https://projectname.ddev.site 31 | 32 | # type: # backdrop, craftcms, django4, drupal, drupal6, drupal7, laravel, magento, magento2, php, python, shopware6, silverstripe, typo3, wordpress 33 | # See https://ddev.readthedocs.io/en/stable/users/quickstart/ for more 34 | # information on the different project types 35 | # "drupal" covers recent Drupal 8+ 36 | 37 | # docroot: # Relative path to the directory containing index.php. 38 | 39 | # php_version: "8.2" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3" 40 | 41 | # You can explicitly specify the webimage but this 42 | # is not recommended, as the images are often closely tied to DDEV's' behavior, 43 | # so this can break upgrades. 44 | 45 | # webimage: # nginx/php docker image. 46 | 47 | # database: 48 | # type: # mysql, mariadb, postgres 49 | # version: # database version, like "10.11" or "8.0" 50 | # MariaDB versions can be 5.5-10.8 and 10.11, MySQL versions can be 5.5-8.0 51 | # PostgreSQL versions can be 9-16. 52 | 53 | # router_http_port: # Port to be used for http (defaults to global configuration, usually 80) 54 | # router_https_port: # Port for https (defaults to global configuration, usually 443) 55 | 56 | # xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart" 57 | # Note that for most people the commands 58 | # "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better, 59 | # as leaving Xdebug enabled all the time is a big performance hit. 60 | 61 | # xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart" 62 | # Note that for most people the commands 63 | # "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better, 64 | # as leaving Xhprof enabled all the time is a big performance hit. 65 | 66 | # webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn 67 | 68 | # timezone: Europe/Berlin 69 | # This is the timezone used in the containers and by PHP; 70 | # it can be set to any valid timezone, 71 | # see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 72 | # For example Europe/Dublin or MST7MDT 73 | 74 | # composer_root: 75 | # Relative path to the Composer root directory from the project root. This is 76 | # the directory which contains the composer.json and where all Composer related 77 | # commands are executed. 78 | 79 | # composer_version: "2" 80 | # You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 81 | # to use the latest major version available at the time your container is built. 82 | # It is also possible to use each other Composer version channel. This includes: 83 | # - 2.2 (latest Composer LTS version) 84 | # - stable 85 | # - preview 86 | # - snapshot 87 | # Alternatively, an explicit Composer version may be specified, for example "2.2.18". 88 | # To reinstall Composer after the image was built, run "ddev debug refresh". 89 | 90 | # nodejs_version: "20" 91 | # change from the default system Node.js version to any other version. 92 | # Numeric version numbers can be complete (i.e. 18.15.0) or 93 | # incomplete (18, 17.2, 16). 'lts' and 'latest' can be used as well along with 94 | # other named releases. 95 | # see https://www.npmjs.com/package/n#specifying-nodejs-versions 96 | # Note that you can continue using 'ddev nvm' or nvm inside the web container 97 | # to change the project's installed node version if you need to. 98 | 99 | # corepack_enable: false 100 | # Change to 'true' to 'corepack enable' and gain access to latest versions of yarn/pnpm 101 | 102 | # additional_hostnames: 103 | # - somename 104 | # - someothername 105 | # would provide http and https URLs for "somename.ddev.site" 106 | # and "someothername.ddev.site". 107 | 108 | # additional_fqdns: 109 | # - example.com 110 | # - sub1.example.com 111 | # would provide http and https URLs for "example.com" and "sub1.example.com" 112 | # Please take care with this because it can cause great confusion. 113 | 114 | # upload_dirs: "custom/upload/dir" 115 | # 116 | # upload_dirs: 117 | # - custom/upload/dir 118 | # - ../private 119 | # 120 | # would set the destination paths for ddev import-files to /custom/upload/dir 121 | # When Mutagen is enabled this path is bind-mounted so that all the files 122 | # in the upload_dirs don't have to be synced into Mutagen. 123 | 124 | # disable_upload_dirs_warning: false 125 | # If true, turns off the normal warning that says 126 | # "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set" 127 | 128 | # ddev_version_constraint: "" 129 | # Example: 130 | # ddev_version_constraint: ">= 1.22.4" 131 | # This will enforce that the running ddev version is within this constraint. 132 | # See https://github.com/Masterminds/semver#checking-version-constraints for 133 | # supported constraint formats 134 | 135 | # working_dir: 136 | # web: /var/www/html 137 | # db: /home 138 | # would set the default working directory for the web and db services. 139 | # These values specify the destination directory for ddev ssh and the 140 | # directory in which commands passed into ddev exec are run. 141 | 142 | # omit_containers: [db, ddev-ssh-agent] 143 | # Currently only these containers are supported. Some containers can also be 144 | # omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit 145 | # the "db" container, several standard features of DDEV that access the 146 | # database container will be unusable. In the global configuration it is also 147 | # possible to omit ddev-router, but not here. 148 | 149 | # performance_mode: "global" 150 | # DDEV offers performance optimization strategies to improve the filesystem 151 | # performance depending on your host system. Should be configured globally. 152 | # 153 | # If set, will override the global config. Possible values are: 154 | # - "global": uses the value from the global config. 155 | # - "none": disables performance optimization for this project. 156 | # - "mutagen": enables Mutagen for this project. 157 | # - "nfs": enables NFS for this project. 158 | # 159 | # See https://ddev.readthedocs.io/en/stable/users/install/performance/#nfs 160 | # See https://ddev.readthedocs.io/en/stable/users/install/performance/#mutagen 161 | 162 | # fail_on_hook_fail: False 163 | # Decide whether 'ddev start' should be interrupted by a failing hook 164 | 165 | # host_https_port: "59002" 166 | # The host port binding for https can be explicitly specified. It is 167 | # dynamic unless otherwise specified. 168 | # This is not used by most people, most people use the *router* instead 169 | # of the localhost port. 170 | 171 | # host_webserver_port: "59001" 172 | # The host port binding for the ddev-webserver can be explicitly specified. It is 173 | # dynamic unless otherwise specified. 174 | # This is not used by most people, most people use the *router* instead 175 | # of the localhost port. 176 | 177 | # host_db_port: "59002" 178 | # The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic 179 | # unless explicitly specified. 180 | 181 | # mailpit_http_port: "8025" 182 | # mailpit_https_port: "8026" 183 | # The Mailpit ports can be changed from the default 8025 and 8026 184 | 185 | # host_mailpit_port: "8025" 186 | # The mailpit port is not normally bound on the host at all, instead being routed 187 | # through ddev-router, but it can be bound directly to localhost if specified here. 188 | 189 | # webimage_extra_packages: [php7.4-tidy, php-bcmath] 190 | # Extra Debian packages that are needed in the webimage can be added here 191 | 192 | # dbimage_extra_packages: [telnet,netcat] 193 | # Extra Debian packages that are needed in the dbimage can be added here 194 | 195 | # use_dns_when_possible: true 196 | # If the host has internet access and the domain configured can 197 | # successfully be looked up, DNS will be used for hostname resolution 198 | # instead of editing /etc/hosts 199 | # Defaults to true 200 | 201 | # project_tld: ddev.site 202 | # The top-level domain used for project URLs 203 | # The default "ddev.site" allows DNS lookup via a wildcard 204 | # If you prefer you can change this to "ddev.local" to preserve 205 | # pre-v1.9 behavior. 206 | 207 | # ngrok_args: --basic-auth username:pass1234 208 | # Provide extra flags to the "ngrok http" command, see 209 | # https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h" 210 | 211 | # disable_settings_management: false 212 | # If true, DDEV will not create CMS-specific settings files like 213 | # Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php 214 | # In this case the user must provide all such settings. 215 | 216 | # You can inject environment variables into the web container with: 217 | # web_environment: 218 | # - SOMEENV=somevalue 219 | # - SOMEOTHERENV=someothervalue 220 | 221 | # no_project_mount: false 222 | # (Experimental) If true, DDEV will not mount the project into the web container; 223 | # the user is responsible for mounting it manually or via a script. 224 | # This is to enable experimentation with alternate file mounting strategies. 225 | # For advanced users only! 226 | 227 | # bind_all_interfaces: false 228 | # If true, host ports will be bound on all network interfaces, 229 | # not the localhost interface only. This means that ports 230 | # will be available on the local network if the host firewall 231 | # allows it. 232 | 233 | # default_container_timeout: 120 234 | # The default time that DDEV waits for all containers to become ready can be increased from 235 | # the default 120. This helps in importing huge databases, for example. 236 | 237 | #web_extra_exposed_ports: 238 | #- name: nodejs 239 | # container_port: 3000 240 | # http_port: 2999 241 | # https_port: 3000 242 | #- name: something 243 | # container_port: 4000 244 | # https_port: 4000 245 | # http_port: 3999 246 | # Allows a set of extra ports to be exposed via ddev-router 247 | # Fill in all three fields even if you don’t intend to use the https_port! 248 | # If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start. 249 | # 250 | # The port behavior on the ddev-webserver must be arranged separately, for example 251 | # using web_extra_daemons. 252 | # For example, with a web app on port 3000 inside the container, this config would 253 | # expose that web app on https://.ddev.site:9999 and http://.ddev.site:9998 254 | # web_extra_exposed_ports: 255 | # - name: myapp 256 | # container_port: 3000 257 | # http_port: 9998 258 | # https_port: 9999 259 | 260 | #web_extra_daemons: 261 | #- name: "http-1" 262 | # command: "/var/www/html/node_modules/.bin/http-server -p 3000" 263 | # directory: /var/www/html 264 | #- name: "http-2" 265 | # command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" 266 | # directory: /var/www/html 267 | 268 | # override_config: false 269 | # By default, config.*.yaml files are *merged* into the configuration 270 | # But this means that some things can't be overridden 271 | # For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge 272 | # and you can't erase existing hooks or all environment variables. 273 | # However, with "override_config: true" in a particular config.*.yaml file, 274 | # 'use_dns_when_possible: false' can override the existing values, and 275 | # hooks: 276 | # post-start: [] 277 | # or 278 | # web_environment: [] 279 | # or 280 | # additional_hostnames: [] 281 | # can have their intended affect. 'override_config' affects only behavior of the 282 | # config.*.yaml file it exists in. 283 | 284 | # Many DDEV commands can be extended to run tasks before or after the 285 | # DDEV command is executed, for example "post-start", "post-import-db", 286 | # "pre-composer", "post-composer" 287 | # See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more 288 | # information on the commands that can be extended and the tasks you can define 289 | # for them. Example: 290 | #hooks: 291 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://hub.docker.com/_/microsoft-devcontainers-universal 3 | // this will also install docker-in-docker 4 | "image": "mcr.microsoft.com/devcontainers/universal:2", 5 | "features": { 6 | "ghcr.io/ddev/ddev/install-ddev:latest": {} 7 | }, 8 | // TODO: is this still necessary? 9 | // https://code.visualstudio.com/docs/devcontainers/containers#_always-forwarding-a-port 10 | "forwardPorts": [5174], 11 | // these are just labels for codespaces ports tab, these will not create ports by default 12 | "portsAttributes": { 13 | "3306": { 14 | "label": "database" 15 | }, 16 | "8027": { 17 | "label": "mailhog" 18 | }, 19 | "8036": { 20 | "label": "phpmyadmin" 21 | }, 22 | "8080": { 23 | "label": "web http" 24 | }, 25 | "8443": { 26 | "label": "web https" 27 | }, 28 | // our custom vite port for ddev + codespaces 29 | "5173":{ 30 | "label": "vite" 31 | } 32 | }, 33 | 34 | "postCreateCommand": "chmod +x ./.devcontainer/postCreateCommand.sh && ./.devcontainer/postCreateCommand.sh" 35 | } 36 | -------------------------------------------------------------------------------- /.devcontainer/postCreateCommand.sh: -------------------------------------------------------------------------------- 1 | 2 | #!/bin/bash 3 | set -ex 4 | 5 | # This file is called in three scenarios: 6 | # 1. fresh creation of devcontainer 7 | # 2. rebuild 8 | # 3. full rebuild 9 | 10 | # ddev default commands 11 | # see: https://ddev.readthedocs.io/en/latest/users/install/ddev-installation/#github-codespaces 12 | 13 | # retry, see https://github.com/ddev/ddev/pull/5592 14 | wait_for_docker() { 15 | while true; do 16 | docker ps > /dev/null 2>&1 && break 17 | sleep 1 18 | done 19 | echo "Docker is ready." 20 | } 21 | 22 | wait_for_docker 23 | 24 | # TODO: remove, might not be needed (auto-detected) 25 | # https://github.com/ddev/ddev/pull/5290#issuecomment-1689024764 26 | ddev config global --omit-containers=ddev-router 27 | 28 | # download images beforehand 29 | ddev debug download-images 30 | 31 | # avoid errors on rebuilds 32 | ddev poweroff 33 | 34 | # Workaround for Vite: 35 | # Normally expose port 5173 for Vite in .ddev/config.yaml, but ddev-router 36 | # is not used on Gitpod / Codespaces, etc. The Routing is handled by Gitpod / 37 | # Codespaces itself. Therefore we will create an additional config file for 38 | # DDEV which will expose port 5173 without ddev-router. 39 | cp .devcontainer/templates/docker-compose.vite-workaround.yaml .ddev/. 40 | 41 | # Start the DDEV project 42 | # (will automatically get URL from env, adds db connection to .env) 43 | export DDEV_NONINTERACTIVE=true 44 | ddev start -y 45 | 46 | # Start the DDEV project 47 | # (will automatically get URL from env, adds db connection to .env) 48 | export DDEV_NONINTERACTIVE=true 49 | ddev start -y 50 | 51 | # Prepare Laravel website 52 | ddev composer install 53 | ddev npm install 54 | ddev artisan key:generate 55 | ddev artisan migrate 56 | 57 | # Further steps - you could also import a database here: 58 | # ddev import-db --file=dump.sql.gz 59 | # or use 'ddev pull' to get latest db / files from remote 60 | # https://ddev.readthedocs.io/en/stable/users/providers/ 61 | 62 | -------------------------------------------------------------------------------- /.devcontainer/templates/docker-compose.vite-workaround.yaml: -------------------------------------------------------------------------------- 1 | # See postCreateCommand.sh for more information - expose the Vite port without using 2 | # ddev router (disabled on Gitpod/Codespaces,etc.). This file should not be committed 3 | # to git since it conflicts with local DDEV usage (with ddev router) 4 | services: 5 | web: 6 | ports: 7 | - 5173:5173 -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_TIMEZONE=UTC 6 | APP_URL=http://localhost 7 | 8 | APP_LOCALE=en 9 | APP_FALLBACK_LOCALE=en 10 | APP_FAKER_LOCALE=en_US 11 | 12 | APP_MAINTENANCE_DRIVER=file 13 | APP_MAINTENANCE_STORE=database 14 | 15 | BCRYPT_ROUNDS=12 16 | 17 | LOG_CHANNEL=stack 18 | LOG_STACK=single 19 | LOG_DEPRECATIONS_CHANNEL=null 20 | LOG_LEVEL=debug 21 | 22 | DB_CONNECTION=sqlite 23 | # DB_HOST=127.0.0.1 24 | # DB_PORT=3306 25 | # DB_DATABASE=laravel 26 | # DB_USERNAME=root 27 | # DB_PASSWORD= 28 | 29 | SESSION_DRIVER=database 30 | SESSION_LIFETIME=120 31 | SESSION_ENCRYPT=false 32 | SESSION_PATH=/ 33 | SESSION_DOMAIN=null 34 | 35 | BROADCAST_CONNECTION=log 36 | FILESYSTEM_DISK=local 37 | QUEUE_CONNECTION=database 38 | 39 | CACHE_STORE=database 40 | CACHE_PREFIX= 41 | 42 | MEMCACHED_HOST=127.0.0.1 43 | 44 | REDIS_CLIENT=phpredis 45 | REDIS_HOST=127.0.0.1 46 | REDIS_PASSWORD=null 47 | REDIS_PORT=6379 48 | 49 | MAIL_MAILER=log 50 | MAIL_HOST=127.0.0.1 51 | MAIL_PORT=2525 52 | MAIL_USERNAME=null 53 | MAIL_PASSWORD=null 54 | MAIL_ENCRYPTION=null 55 | MAIL_FROM_ADDRESS="hello@example.com" 56 | MAIL_FROM_NAME="${APP_NAME}" 57 | 58 | AWS_ACCESS_KEY_ID= 59 | AWS_SECRET_ACCESS_KEY= 60 | AWS_DEFAULT_REGION=us-east-1 61 | AWS_BUCKET= 62 | AWS_USE_PATH_STYLE_ENDPOINT=false 63 | 64 | VITE_APP_NAME="${APP_NAME}" 65 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | /.github export-ignore 10 | CHANGELOG.md export-ignore 11 | .styleci.yml export-ignore 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /vendor 8 | .env 9 | .env.backup 10 | .env.production 11 | .phpactor.json 12 | .phpunit.result.cache 13 | Homestead.json 14 | Homestead.yaml 15 | auth.json 16 | npm-debug.log 17 | yarn-error.log 18 | /.fleet 19 | /.idea 20 | /.vscode 21 | 22 | # only needed for gitpod and codespaces 23 | .ddev/docker-compose.vite-workaround.yaml -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | # ddev v1.23.1 2 | # https://github.com/ddev/ddev-gitpod-launcher 3 | # https://hub.docker.com/r/ddev/ddev-gitpod-base 4 | image: ddev/ddev-gitpod-base:20240516 5 | 6 | # Based on 7 | # https://github.com/ddev/ddev-gitpod-launcher/blob/main/.gitpod.yml 8 | # https://github.com/shaal/DrupalPod/blob/main/.gitpod.yml 9 | 10 | # ddev and composer are running as part of the prebuild 11 | # when starting a Gitpod workspace all docker images are ready 12 | tasks: 13 | - name: prepare 14 | init: | 15 | ddev debug download-images 16 | command: | 17 | chmod +x .gitpod/project-setup.sh 18 | .gitpod/project-setup.sh 19 | gp ports await 8080 && sleep 1 && gp preview $(gp url 8080) 20 | echo "The system is ready, happy developing!" 21 | code resources/css/app.css 22 | ddev npm run dev 23 | 24 | vscode: 25 | extensions: 26 | # PHP extensions. 27 | - felixfbecker.php-debug 28 | - bmewburn.vscode-intelephense-client 29 | 30 | # Prettier 31 | - esbenp.prettier-vscode 32 | 33 | # Blade 34 | - shufo.vscode-blade-formatter 35 | 36 | # Bash extensions. 37 | - timonwong.shellcheck 38 | - rogalmic.bash-debug 39 | 40 | ports: 41 | # Vite port 42 | - port: 5173 43 | onOpen: ignore 44 | visibility: public 45 | # Used by ddev - local db clients 46 | - port: 3306 47 | onOpen: ignore 48 | # Used by projector 49 | - port: 6942 50 | onOpen: ignore 51 | # Used by Mailpit 52 | - port: 8025 53 | onOpen: ignore 54 | # Mailpit web UI 55 | - port: 8027 56 | onOpen: ignore 57 | # Direct-connect ddev-webserver port that is the main port 58 | - port: 8080 59 | onOpen: ignore 60 | # Ignore host https port 61 | - port: 8443 62 | onOpen: ignore 63 | # xdebug port 64 | - port: 9003 65 | onOpen: ignore 66 | # projector port 67 | - port: 9999 68 | onOpen: open-browser -------------------------------------------------------------------------------- /.gitpod/project-setup.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Prepare vscode-xdebug setup 4 | mkdir -p .vscode 5 | cp .gitpod/templates/launch.json .vscode/. 6 | 7 | # Workaround for Vite: 8 | # Normally expose port 5173 for Vite in .ddev/config.yaml, but ddev-router 9 | # is not used on Gitpod / Codespaces, etc. The Routing is handled by Gitpod / 10 | # Codespaces itself. Therefore we will create an additional config file for 11 | # DDEV which will expose port 5173 without ddev-router. 12 | cp .gitpod/templates/docker-compose.vite-workaround.yaml .ddev/. 13 | 14 | # Start the DDEV project 15 | # (will automatically get URL from env, adds db connection to .env) 16 | export DDEV_NONINTERACTIVE=true 17 | ddev start -y 18 | 19 | # Prepare Laravel website 20 | ddev composer install 21 | ddev npm install 22 | ddev artisan key:generate 23 | ddev artisan migrate 24 | 25 | # Further steps - you could also import a database here: 26 | # ddev import-db --file=dump.sql.gz 27 | # or use 'ddev pull' to get latest db / files from remote 28 | # https://ddev.readthedocs.io/en/stable/users/providers/ 29 | -------------------------------------------------------------------------------- /.gitpod/templates/docker-compose.vite-workaround.yaml: -------------------------------------------------------------------------------- 1 | # See postCreateCommand.sh for more information - expose the Vite port without using 2 | # ddev router (disabled on Gitpod/Codespaces,etc.). This file should not be committed 3 | # to git since it conflicts with local DDEV usage (with ddev router) 4 | services: 5 | web: 6 | ports: 7 | - 5173:5173 8 | -------------------------------------------------------------------------------- /.gitpod/templates/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "label": "Auto-open css file", 9 | "type": "shell", 10 | "command": "code resources/css/app.css", 11 | "runOptions": { 12 | "runOn": "folderOpen" 13 | }, 14 | "presentation": { 15 | "echo": true, 16 | "reveal": "silent", 17 | "focus": false, 18 | "panel": "shared", 19 | "showReuseMessage": false, 20 | "clear": false 21 | } 22 | }, 23 | { 24 | "name": "Listen for XDebug", 25 | "type": "php", 26 | "request": "launch", 27 | "hostname": "0.0.0.0", 28 | "port": 9003, 29 | "pathMappings": { 30 | "/var/www/html": "${workspaceRoot}" 31 | } 32 | }, 33 | { 34 | "type": "bashdb", 35 | "request": "launch", 36 | "name": "Bash-Debug (select script from list of sh files)", 37 | "cwd": "${workspaceFolder}", 38 | "program": "${command:SelectScriptName}", 39 | "args": [] 40 | } 41 | ] 42 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ddev-laravel-vite 2 | 3 | [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/mandrasch/ddev-laravel-vite/) 4 | 5 | Demo repository for Laravel v11 with [DDEV](https://ddev.com/), including Vite support. 6 | 7 | Based on the tutorial [Install Laravel with Vite support in DDEV (Docker)](https://dev.to/mandrasch/install-laravel-with-vite-support-in-ddev-docker-4lmh). See https://ddev.com/blog/working-with-vite-in-ddev/ as well for all information. 8 | 9 | You can run this 10 | 11 | 1. on [your local laptop](#1-local-setup) 12 | 1. via [Gitpod in your browser](#2-gitpod) 13 | 1. via [Codespaces (experimental)](#3-codespaces-experimental) 14 | 15 | ## 1. Local setup 16 | 17 | Install [DDEV](https://ddev.com/get-started/) and run the following commands: 18 | 19 | ```bash 20 | git clone https://github.com/mandrasch/ddev-laravel-vite.git 21 | # or git clone git@github.com:mandrasch/ddev-laravel-vite.git 22 | 23 | cd ddev-laravel-vite/ 24 | 25 | # automatically creates .env with correct db settings 26 | ddev start 27 | 28 | # install dependencies 29 | ddev composer install && ddev npm install 30 | 31 | # create key for .env 32 | ddev artisan key:generate 33 | 34 | # create db tables 35 | ddev artisan migrate 36 | 37 | # Open your website in browser, ... 38 | ddev launch 39 | 40 | # start the local dev server (Vite), ... 41 | ddev npm run dev 42 | 43 | # ... and hit reload in browser. Vite should work now 🥳 44 | ``` 45 | 46 | After this first time setup, only `ddev npm run dev` is needed (after `ddev start`). 47 | 48 | Your site is accessible via https://ddev-laravel-vite.ddev.site. 49 | 50 | You could also import a database dump via `ddev import-db --file=dump.sql.gz` or use [`ddev pull`](https://ddev.readthedocs.io/en/stable/users/providers/) to setup a project. Use `ddev sequelace` to view your database. 51 | 52 | ## 2. Gitpod 53 | 54 | Just hit the button, wait for the initial setup and start developing: 55 | 56 | [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/mandrasch/ddev-laravel-vite/) 57 | 58 | ## 3. Codespaces (experimental) 59 | 60 | ⚠️ Disclaimer - May 2024: Codespaces is currently a bit buggy on startups, see https://github.com/devcontainers/features/issues/977. 61 | 62 | [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/mandrasch/ddev-laravel-vite) 63 | 64 | 1. Click the button 65 | 1. Wait for `postCreateCommand.sh` to be finished 66 | 1. Switch Vite port to public in ports tab (can't be automated currently) 67 | 1. Run `ddev npm run dev` 68 | 1. Open site (web http) via ports tab (or use `ddev launch` in future (currently small bug to be fixed)). 69 | 70 | The port switch can take a minute. Just wait if it doesn't work instantly. 71 | 72 | Access control panel via `/admin` (or use in future `ddev launch /admin`, when small bug is fixed in ddev). 73 | 74 | Login via user `admin` and password `newPassword` . 75 | 76 | ### Troubleshooting 77 | 78 | See creation log via 'CMD + P > View creation log' if errors occur. Unfortunately there is no general error notification when this fails. But if there is only one port in the ports tab installation did not succeed. Sometimes only a full rebuild solve the problems, use: 79 | 80 | - `SHIFT + CMD + P > Codespaces: Full rebuild` 81 | 82 | Containers and db will be deleted. 83 | 84 | ## How was this created? 85 | 86 | Tutorial: [Install Laravel with Vite support in DDEV (Docker)](https://dev.to/mandrasch/install-laravel-with-vite-support-in-ddev-docker-4lmh). 87 | 88 | 1. Installed Laravel in DDEV via [quickstart documentation](https://ddev.readthedocs.io/en/latest/users/quickstart/#laravel). 89 | 90 | ```bash 91 | ddev config --project-type=laravel --docroot=public --php-version="8.2" --database="mysql:8.0" --nodejs-version="20" 92 | ddev start 93 | ddev composer create "laravel/laravel:^11" 94 | ddev artisan key:generate 95 | 96 | # open in browser 97 | ddev launch 98 | ``` 99 | 100 | 2. After that we need to expose the vite port of the DDEV (docker) container so that it can be reached from outside (= from our computer) while developing. The http_port does not really matter. 101 | 102 | Add this to your `.ddev/config.yaml`: 103 | 104 | ```yaml 105 | # .ddev/config.yaml 106 | web_extra_exposed_ports: 107 | - name: vite 108 | container_port: 5173 109 | http_port: 5172 110 | https_port: 5173 111 | ``` 112 | 113 | ⚠️ A `ddev restart` is needed after that. 114 | 115 | _See [Exposing Extra Ports via ddev-router](https://ddev.readthedocs.io/en/latest/users/extend/customization-extendibility/#exposing-extra-ports-via-ddev-router) for more information. You'll need at least DDEV [v1.20.0](https://github.com/ddev/ddev/releases/tag/v1.20.0) for this, before it was done via docker-compose files ([example](https://github.com/torenware/ddev-viteserve/blob/master/docker-compose.viteserve.yaml))._ 116 | 117 | 3. The [`vite.config.js`](https://github.com/mandrasch/ddev-laravel-vite/blob/main/vite.config.js) needs some modifications as well. These `.server` options were added: 118 | 119 | ```js 120 | import laravel from 'laravel-vite-plugin'; 121 | 122 | const port = 5173; 123 | const origin = `${process.env.DDEV_PRIMARY_URL}:${port}`; 124 | 125 | export default defineConfig({ 126 | plugins: [ 127 | laravel({ 128 | input: ['resources/css/app.css', 'resources/js/app.js'], 129 | refresh: true, 130 | }), 131 | ], 132 | server: { 133 | // respond to all network requests 134 | host: '0.0.0.0', 135 | port: port, 136 | strictPort: true, 137 | // Defines the origin of the generated asset URLs during development, 138 | // this will also be used for the public/hot file (devserver URL) 139 | origin: origin 140 | } 141 | }); 142 | 143 | ``` 144 | 145 | 4. Then we need to follow the [Asset Bundling (Vite)](https://laravel.com/docs/10.x/vite#loading-your-scripts-and-styles) documentation and add the output to the `welcome.blade.php` template. 146 | 147 | ```blade 148 | 149 | 150 | 151 | 152 | 153 | 154 | @vite('resources/js/app.js') 155 | 156 | 157 | 158 |

Hello, vite!

159 |

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

160 | 161 | 162 | ``` 163 | 164 | 5. Add the CSS to to the `resources/js/app.js` file: 165 | 166 | ```js 167 | // import css: 168 | import '../css/app.css' 169 | 170 | import './bootstrap'; 171 | ``` 172 | 173 | 6. If you now run `ddev npm run dev` vite should handle the reloading. Test with the following in `app.css 174 | 175 | ```css 176 | p{ 177 | color:red !important; 178 | } 179 | ``` 180 | 181 | ## Deployment / production 182 | 183 | You can simulate the production environment like this: 184 | 185 | 1. Run `ddev npm run build` 186 | 2. Set `APP_ENV=local` to `APP_ENV=production` in `.env` 187 | 188 | Your styles will be imported like this: 189 | 190 | ```html 191 | 192 | ``` 193 | 194 | ## Reset the demo 195 | 196 | ```bash 197 | # delete without snapshot 198 | ddev delete -O 199 | # reset files, beware: deletes all untracked files! 200 | git clean -fdx 201 | # reset files, but not .ddev 202 | git clean -fdx -e .ddev/ 203 | ``` 204 | 205 | ## Acknowledgements 206 | 207 | Thanks to the DDEV maintainers and DDEV open source community, especially [Ofer Shaal](https://github.com/shaal) for providing DrupalPod, [Randy Fay](https://github.com/rfay) and [tyler36](https://github.com/tyler36) for suggestions and feedback! 💚 208 | 209 | ## Further resources 210 | 211 | - Other Laravel demos: https://github.com/mandrasch?tab=repositories&q=ddev-laravel&type=&language=&sort= 212 | - https://github.com/tyler36/lara10-base-demo 213 | 214 | More experiments and notes about DDEV + vite: https://my-ddev-lab.mandrasch.eu/ 215 | 216 | Connect with the DDEV community on [Discord](https://discord.gg/hCZFfAMc5k) 217 | -------------------------------------------------------------------------------- /README.original.md: -------------------------------------------------------------------------------- 1 |

Laravel Logo

2 | 3 |

4 | Build Status 5 | Total Downloads 6 | Latest Stable Version 7 | License 8 |

9 | 10 | ## About Laravel 11 | 12 | Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: 13 | 14 | - [Simple, fast routing engine](https://laravel.com/docs/routing). 15 | - [Powerful dependency injection container](https://laravel.com/docs/container). 16 | - Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. 17 | - Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). 18 | - Database agnostic [schema migrations](https://laravel.com/docs/migrations). 19 | - [Robust background job processing](https://laravel.com/docs/queues). 20 | - [Real-time event broadcasting](https://laravel.com/docs/broadcasting). 21 | 22 | Laravel is accessible, powerful, and provides tools required for large, robust applications. 23 | 24 | ## Learning Laravel 25 | 26 | Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. 27 | 28 | You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch. 29 | 30 | If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. 31 | 32 | ## Laravel Sponsors 33 | 34 | We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). 35 | 36 | ### Premium Partners 37 | 38 | - **[Vehikl](https://vehikl.com/)** 39 | - **[Tighten Co.](https://tighten.co)** 40 | - **[WebReinvent](https://webreinvent.com/)** 41 | - **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** 42 | - **[64 Robots](https://64robots.com)** 43 | - **[Curotec](https://www.curotec.com/services/technologies/laravel/)** 44 | - **[Cyber-Duck](https://cyber-duck.co.uk)** 45 | - **[DevSquad](https://devsquad.com/hire-laravel-developers)** 46 | - **[Jump24](https://jump24.co.uk)** 47 | - **[Redberry](https://redberry.international/laravel/)** 48 | - **[Active Logic](https://activelogic.com)** 49 | - **[byte5](https://byte5.de)** 50 | - **[OP.GG](https://op.gg)** 51 | 52 | ## Contributing 53 | 54 | Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). 55 | 56 | ## Code of Conduct 57 | 58 | In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). 59 | 60 | ## Security Vulnerabilities 61 | 62 | If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. 63 | 64 | ## License 65 | 66 | The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). 67 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | 18 | */ 19 | protected $fillable = [ 20 | 'name', 21 | 'email', 22 | 'password', 23 | ]; 24 | 25 | /** 26 | * The attributes that should be hidden for serialization. 27 | * 28 | * @var array 29 | */ 30 | protected $hidden = [ 31 | 'password', 32 | 'remember_token', 33 | ]; 34 | 35 | /** 36 | * Get the attributes that should be cast. 37 | * 38 | * @return array 39 | */ 40 | protected function casts(): array 41 | { 42 | return [ 43 | 'email_verified_at' => 'datetime', 44 | 'password' => 'hashed', 45 | ]; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | handleCommand(new ArgvInput); 14 | 15 | exit($status); 16 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | withRouting( 9 | web: __DIR__.'/../routes/web.php', 10 | commands: __DIR__.'/../routes/console.php', 11 | health: '/up', 12 | ) 13 | ->withMiddleware(function (Middleware $middleware) { 14 | // 15 | }) 16 | ->withExceptions(function (Exceptions $exceptions) { 17 | // 18 | })->create(); 19 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /bootstrap/providers.php: -------------------------------------------------------------------------------- 1 | env('APP_NAME', 'Laravel'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Application Environment 21 | |-------------------------------------------------------------------------- 22 | | 23 | | This value determines the "environment" your application is currently 24 | | running in. This may determine how you prefer to configure various 25 | | services the application utilizes. Set this in your ".env" file. 26 | | 27 | */ 28 | 29 | 'env' => env('APP_ENV', 'production'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Application Debug Mode 34 | |-------------------------------------------------------------------------- 35 | | 36 | | When your application is in debug mode, detailed error messages with 37 | | stack traces will be shown on every error that occurs within your 38 | | application. If disabled, a simple generic error page is shown. 39 | | 40 | */ 41 | 42 | 'debug' => (bool) env('APP_DEBUG', false), 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Application URL 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This URL is used by the console to properly generate URLs when using 50 | | the Artisan command line tool. You should set this to the root of 51 | | the application so that it's available within Artisan commands. 52 | | 53 | */ 54 | 55 | 'url' => env('APP_URL', 'http://localhost'), 56 | 57 | /* 58 | |-------------------------------------------------------------------------- 59 | | Application Timezone 60 | |-------------------------------------------------------------------------- 61 | | 62 | | Here you may specify the default timezone for your application, which 63 | | will be used by the PHP date and date-time functions. The timezone 64 | | is set to "UTC" by default as it is suitable for most use cases. 65 | | 66 | */ 67 | 68 | 'timezone' => env('APP_TIMEZONE', 'UTC'), 69 | 70 | /* 71 | |-------------------------------------------------------------------------- 72 | | Application Locale Configuration 73 | |-------------------------------------------------------------------------- 74 | | 75 | | The application locale determines the default locale that will be used 76 | | by Laravel's translation / localization methods. This option can be 77 | | set to any locale for which you plan to have translation strings. 78 | | 79 | */ 80 | 81 | 'locale' => env('APP_LOCALE', 'en'), 82 | 83 | 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), 84 | 85 | 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), 86 | 87 | /* 88 | |-------------------------------------------------------------------------- 89 | | Encryption Key 90 | |-------------------------------------------------------------------------- 91 | | 92 | | This key is utilized by Laravel's encryption services and should be set 93 | | to a random, 32 character string to ensure that all encrypted values 94 | | are secure. You should do this prior to deploying the application. 95 | | 96 | */ 97 | 98 | 'cipher' => 'AES-256-CBC', 99 | 100 | 'key' => env('APP_KEY'), 101 | 102 | 'previous_keys' => [ 103 | ...array_filter( 104 | explode(',', env('APP_PREVIOUS_KEYS', '')) 105 | ), 106 | ], 107 | 108 | /* 109 | |-------------------------------------------------------------------------- 110 | | Maintenance Mode Driver 111 | |-------------------------------------------------------------------------- 112 | | 113 | | These configuration options determine the driver used to determine and 114 | | manage Laravel's "maintenance mode" status. The "cache" driver will 115 | | allow maintenance mode to be controlled across multiple machines. 116 | | 117 | | Supported drivers: "file", "cache" 118 | | 119 | */ 120 | 121 | 'maintenance' => [ 122 | 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), 123 | 'store' => env('APP_MAINTENANCE_STORE', 'database'), 124 | ], 125 | 126 | ]; 127 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'guard' => env('AUTH_GUARD', 'web'), 18 | 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), 19 | ], 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Authentication Guards 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Next, you may define every authentication guard for your application. 27 | | Of course, a great default configuration has been defined for you 28 | | which utilizes session storage plus the Eloquent user provider. 29 | | 30 | | All authentication guards have a user provider, which defines how the 31 | | users are actually retrieved out of your database or other storage 32 | | system used by the application. Typically, Eloquent is utilized. 33 | | 34 | | Supported: "session" 35 | | 36 | */ 37 | 38 | 'guards' => [ 39 | 'web' => [ 40 | 'driver' => 'session', 41 | 'provider' => 'users', 42 | ], 43 | ], 44 | 45 | /* 46 | |-------------------------------------------------------------------------- 47 | | User Providers 48 | |-------------------------------------------------------------------------- 49 | | 50 | | All authentication guards have a user provider, which defines how the 51 | | users are actually retrieved out of your database or other storage 52 | | system used by the application. Typically, Eloquent is utilized. 53 | | 54 | | If you have multiple user tables or models you may configure multiple 55 | | providers to represent the model / table. These providers may then 56 | | be assigned to any extra authentication guards you have defined. 57 | | 58 | | Supported: "database", "eloquent" 59 | | 60 | */ 61 | 62 | 'providers' => [ 63 | 'users' => [ 64 | 'driver' => 'eloquent', 65 | 'model' => env('AUTH_MODEL', App\Models\User::class), 66 | ], 67 | 68 | // 'users' => [ 69 | // 'driver' => 'database', 70 | // 'table' => 'users', 71 | // ], 72 | ], 73 | 74 | /* 75 | |-------------------------------------------------------------------------- 76 | | Resetting Passwords 77 | |-------------------------------------------------------------------------- 78 | | 79 | | These configuration options specify the behavior of Laravel's password 80 | | reset functionality, including the table utilized for token storage 81 | | and the user provider that is invoked to actually retrieve users. 82 | | 83 | | The expiry time is the number of minutes that each reset token will be 84 | | considered valid. This security feature keeps tokens short-lived so 85 | | they have less time to be guessed. You may change this as needed. 86 | | 87 | | The throttle setting is the number of seconds a user must wait before 88 | | generating more password reset tokens. This prevents the user from 89 | | quickly generating a very large amount of password reset tokens. 90 | | 91 | */ 92 | 93 | 'passwords' => [ 94 | 'users' => [ 95 | 'provider' => 'users', 96 | 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), 97 | 'expire' => 60, 98 | 'throttle' => 60, 99 | ], 100 | ], 101 | 102 | /* 103 | |-------------------------------------------------------------------------- 104 | | Password Confirmation Timeout 105 | |-------------------------------------------------------------------------- 106 | | 107 | | Here you may define the amount of seconds before a password confirmation 108 | | window expires and users are asked to re-enter their password via the 109 | | confirmation screen. By default, the timeout lasts for three hours. 110 | | 111 | */ 112 | 113 | 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), 114 | 115 | ]; 116 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_STORE', 'database'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Cache Stores 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the cache "stores" for your application as 26 | | well as their drivers. You may even define multiple stores for the 27 | | same cache driver to group types of items stored in your caches. 28 | | 29 | | Supported drivers: "array", "database", "file", "memcached", 30 | | "redis", "dynamodb", "octane", "null" 31 | | 32 | */ 33 | 34 | 'stores' => [ 35 | 36 | 'array' => [ 37 | 'driver' => 'array', 38 | 'serialize' => false, 39 | ], 40 | 41 | 'database' => [ 42 | 'driver' => 'database', 43 | 'table' => env('DB_CACHE_TABLE', 'cache'), 44 | 'connection' => env('DB_CACHE_CONNECTION'), 45 | 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), 46 | ], 47 | 48 | 'file' => [ 49 | 'driver' => 'file', 50 | 'path' => storage_path('framework/cache/data'), 51 | 'lock_path' => storage_path('framework/cache/data'), 52 | ], 53 | 54 | 'memcached' => [ 55 | 'driver' => 'memcached', 56 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 57 | 'sasl' => [ 58 | env('MEMCACHED_USERNAME'), 59 | env('MEMCACHED_PASSWORD'), 60 | ], 61 | 'options' => [ 62 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 63 | ], 64 | 'servers' => [ 65 | [ 66 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 67 | 'port' => env('MEMCACHED_PORT', 11211), 68 | 'weight' => 100, 69 | ], 70 | ], 71 | ], 72 | 73 | 'redis' => [ 74 | 'driver' => 'redis', 75 | 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), 76 | 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), 77 | ], 78 | 79 | 'dynamodb' => [ 80 | 'driver' => 'dynamodb', 81 | 'key' => env('AWS_ACCESS_KEY_ID'), 82 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 83 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 84 | 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 85 | 'endpoint' => env('DYNAMODB_ENDPOINT'), 86 | ], 87 | 88 | 'octane' => [ 89 | 'driver' => 'octane', 90 | ], 91 | 92 | ], 93 | 94 | /* 95 | |-------------------------------------------------------------------------- 96 | | Cache Key Prefix 97 | |-------------------------------------------------------------------------- 98 | | 99 | | When utilizing the APC, database, memcached, Redis, and DynamoDB cache 100 | | stores, there might be other applications using the same cache. For 101 | | that reason, you may prefix every cache key to avoid collisions. 102 | | 103 | */ 104 | 105 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), 106 | 107 | ]; 108 | -------------------------------------------------------------------------------- /config/database.php: -------------------------------------------------------------------------------- 1 | env('DB_CONNECTION', 'sqlite'), 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Database Connections 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Below are all of the database connections defined for your application. 27 | | An example configuration is provided for each database system which 28 | | is supported by Laravel. You're free to add / remove connections. 29 | | 30 | */ 31 | 32 | 'connections' => [ 33 | 34 | 'sqlite' => [ 35 | 'driver' => 'sqlite', 36 | 'url' => env('DB_URL'), 37 | 'database' => env('DB_DATABASE', database_path('database.sqlite')), 38 | 'prefix' => '', 39 | 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), 40 | ], 41 | 42 | 'mysql' => [ 43 | 'driver' => 'mysql', 44 | 'url' => env('DB_URL'), 45 | 'host' => env('DB_HOST', '127.0.0.1'), 46 | 'port' => env('DB_PORT', '3306'), 47 | 'database' => env('DB_DATABASE', 'laravel'), 48 | 'username' => env('DB_USERNAME', 'root'), 49 | 'password' => env('DB_PASSWORD', ''), 50 | 'unix_socket' => env('DB_SOCKET', ''), 51 | 'charset' => env('DB_CHARSET', 'utf8mb4'), 52 | 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 53 | 'prefix' => '', 54 | 'prefix_indexes' => true, 55 | 'strict' => true, 56 | 'engine' => null, 57 | 'options' => extension_loaded('pdo_mysql') ? array_filter([ 58 | PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), 59 | ]) : [], 60 | ], 61 | 62 | 'mariadb' => [ 63 | 'driver' => 'mariadb', 64 | 'url' => env('DB_URL'), 65 | 'host' => env('DB_HOST', '127.0.0.1'), 66 | 'port' => env('DB_PORT', '3306'), 67 | 'database' => env('DB_DATABASE', 'laravel'), 68 | 'username' => env('DB_USERNAME', 'root'), 69 | 'password' => env('DB_PASSWORD', ''), 70 | 'unix_socket' => env('DB_SOCKET', ''), 71 | 'charset' => env('DB_CHARSET', 'utf8mb4'), 72 | 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 73 | 'prefix' => '', 74 | 'prefix_indexes' => true, 75 | 'strict' => true, 76 | 'engine' => null, 77 | 'options' => extension_loaded('pdo_mysql') ? array_filter([ 78 | PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), 79 | ]) : [], 80 | ], 81 | 82 | 'pgsql' => [ 83 | 'driver' => 'pgsql', 84 | 'url' => env('DB_URL'), 85 | 'host' => env('DB_HOST', '127.0.0.1'), 86 | 'port' => env('DB_PORT', '5432'), 87 | 'database' => env('DB_DATABASE', 'laravel'), 88 | 'username' => env('DB_USERNAME', 'root'), 89 | 'password' => env('DB_PASSWORD', ''), 90 | 'charset' => env('DB_CHARSET', 'utf8'), 91 | 'prefix' => '', 92 | 'prefix_indexes' => true, 93 | 'search_path' => 'public', 94 | 'sslmode' => 'prefer', 95 | ], 96 | 97 | 'sqlsrv' => [ 98 | 'driver' => 'sqlsrv', 99 | 'url' => env('DB_URL'), 100 | 'host' => env('DB_HOST', 'localhost'), 101 | 'port' => env('DB_PORT', '1433'), 102 | 'database' => env('DB_DATABASE', 'laravel'), 103 | 'username' => env('DB_USERNAME', 'root'), 104 | 'password' => env('DB_PASSWORD', ''), 105 | 'charset' => env('DB_CHARSET', 'utf8'), 106 | 'prefix' => '', 107 | 'prefix_indexes' => true, 108 | // 'encrypt' => env('DB_ENCRYPT', 'yes'), 109 | // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), 110 | ], 111 | 112 | ], 113 | 114 | /* 115 | |-------------------------------------------------------------------------- 116 | | Migration Repository Table 117 | |-------------------------------------------------------------------------- 118 | | 119 | | This table keeps track of all the migrations that have already run for 120 | | your application. Using this information, we can determine which of 121 | | the migrations on disk haven't actually been run on the database. 122 | | 123 | */ 124 | 125 | 'migrations' => [ 126 | 'table' => 'migrations', 127 | 'update_date_on_publish' => true, 128 | ], 129 | 130 | /* 131 | |-------------------------------------------------------------------------- 132 | | Redis Databases 133 | |-------------------------------------------------------------------------- 134 | | 135 | | Redis is an open source, fast, and advanced key-value store that also 136 | | provides a richer body of commands than a typical key-value system 137 | | such as Memcached. You may define your connection settings here. 138 | | 139 | */ 140 | 141 | 'redis' => [ 142 | 143 | 'client' => env('REDIS_CLIENT', 'phpredis'), 144 | 145 | 'options' => [ 146 | 'cluster' => env('REDIS_CLUSTER', 'redis'), 147 | 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), 148 | ], 149 | 150 | 'default' => [ 151 | 'url' => env('REDIS_URL'), 152 | 'host' => env('REDIS_HOST', '127.0.0.1'), 153 | 'username' => env('REDIS_USERNAME'), 154 | 'password' => env('REDIS_PASSWORD'), 155 | 'port' => env('REDIS_PORT', '6379'), 156 | 'database' => env('REDIS_DB', '0'), 157 | ], 158 | 159 | 'cache' => [ 160 | 'url' => env('REDIS_URL'), 161 | 'host' => env('REDIS_HOST', '127.0.0.1'), 162 | 'username' => env('REDIS_USERNAME'), 163 | 'password' => env('REDIS_PASSWORD'), 164 | 'port' => env('REDIS_PORT', '6379'), 165 | 'database' => env('REDIS_CACHE_DB', '1'), 166 | ], 167 | 168 | ], 169 | 170 | ]; 171 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DISK', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Filesystem Disks 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Below you may configure as many filesystem disks as necessary, and you 24 | | may even configure multiple disks for the same driver. Examples for 25 | | most supported storage drivers are configured here for reference. 26 | | 27 | | Supported Drivers: "local", "ftp", "sftp", "s3" 28 | | 29 | */ 30 | 31 | 'disks' => [ 32 | 33 | 'local' => [ 34 | 'driver' => 'local', 35 | 'root' => storage_path('app'), 36 | 'throw' => false, 37 | ], 38 | 39 | 'public' => [ 40 | 'driver' => 'local', 41 | 'root' => storage_path('app/public'), 42 | 'url' => env('APP_URL').'/storage', 43 | 'visibility' => 'public', 44 | 'throw' => false, 45 | ], 46 | 47 | 's3' => [ 48 | 'driver' => 's3', 49 | 'key' => env('AWS_ACCESS_KEY_ID'), 50 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 51 | 'region' => env('AWS_DEFAULT_REGION'), 52 | 'bucket' => env('AWS_BUCKET'), 53 | 'url' => env('AWS_URL'), 54 | 'endpoint' => env('AWS_ENDPOINT'), 55 | 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 56 | 'throw' => false, 57 | ], 58 | 59 | ], 60 | 61 | /* 62 | |-------------------------------------------------------------------------- 63 | | Symbolic Links 64 | |-------------------------------------------------------------------------- 65 | | 66 | | Here you may configure the symbolic links that will be created when the 67 | | `storage:link` Artisan command is executed. The array keys should be 68 | | the locations of the links and the values should be their targets. 69 | | 70 | */ 71 | 72 | 'links' => [ 73 | public_path('storage') => storage_path('app/public'), 74 | ], 75 | 76 | ]; 77 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Deprecations Log Channel 26 | |-------------------------------------------------------------------------- 27 | | 28 | | This option controls the log channel that should be used to log warnings 29 | | regarding deprecated PHP and library features. This allows you to get 30 | | your application ready for upcoming major versions of dependencies. 31 | | 32 | */ 33 | 34 | 'deprecations' => [ 35 | 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), 36 | 'trace' => env('LOG_DEPRECATIONS_TRACE', false), 37 | ], 38 | 39 | /* 40 | |-------------------------------------------------------------------------- 41 | | Log Channels 42 | |-------------------------------------------------------------------------- 43 | | 44 | | Here you may configure the log channels for your application. Laravel 45 | | utilizes the Monolog PHP logging library, which includes a variety 46 | | of powerful log handlers and formatters that you're free to use. 47 | | 48 | | Available Drivers: "single", "daily", "slack", "syslog", 49 | | "errorlog", "monolog", "custom", "stack" 50 | | 51 | */ 52 | 53 | 'channels' => [ 54 | 55 | 'stack' => [ 56 | 'driver' => 'stack', 57 | 'channels' => explode(',', env('LOG_STACK', 'single')), 58 | 'ignore_exceptions' => false, 59 | ], 60 | 61 | 'single' => [ 62 | 'driver' => 'single', 63 | 'path' => storage_path('logs/laravel.log'), 64 | 'level' => env('LOG_LEVEL', 'debug'), 65 | 'replace_placeholders' => true, 66 | ], 67 | 68 | 'daily' => [ 69 | 'driver' => 'daily', 70 | 'path' => storage_path('logs/laravel.log'), 71 | 'level' => env('LOG_LEVEL', 'debug'), 72 | 'days' => env('LOG_DAILY_DAYS', 14), 73 | 'replace_placeholders' => true, 74 | ], 75 | 76 | 'slack' => [ 77 | 'driver' => 'slack', 78 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 79 | 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), 80 | 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), 81 | 'level' => env('LOG_LEVEL', 'critical'), 82 | 'replace_placeholders' => true, 83 | ], 84 | 85 | 'papertrail' => [ 86 | 'driver' => 'monolog', 87 | 'level' => env('LOG_LEVEL', 'debug'), 88 | 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), 89 | 'handler_with' => [ 90 | 'host' => env('PAPERTRAIL_URL'), 91 | 'port' => env('PAPERTRAIL_PORT'), 92 | 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), 93 | ], 94 | 'processors' => [PsrLogMessageProcessor::class], 95 | ], 96 | 97 | 'stderr' => [ 98 | 'driver' => 'monolog', 99 | 'level' => env('LOG_LEVEL', 'debug'), 100 | 'handler' => StreamHandler::class, 101 | 'formatter' => env('LOG_STDERR_FORMATTER'), 102 | 'with' => [ 103 | 'stream' => 'php://stderr', 104 | ], 105 | 'processors' => [PsrLogMessageProcessor::class], 106 | ], 107 | 108 | 'syslog' => [ 109 | 'driver' => 'syslog', 110 | 'level' => env('LOG_LEVEL', 'debug'), 111 | 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), 112 | 'replace_placeholders' => true, 113 | ], 114 | 115 | 'errorlog' => [ 116 | 'driver' => 'errorlog', 117 | 'level' => env('LOG_LEVEL', 'debug'), 118 | 'replace_placeholders' => true, 119 | ], 120 | 121 | 'null' => [ 122 | 'driver' => 'monolog', 123 | 'handler' => NullHandler::class, 124 | ], 125 | 126 | 'emergency' => [ 127 | 'path' => storage_path('logs/laravel.log'), 128 | ], 129 | 130 | ], 131 | 132 | ]; 133 | -------------------------------------------------------------------------------- /config/mail.php: -------------------------------------------------------------------------------- 1 | env('MAIL_MAILER', 'log'), 18 | 19 | /* 20 | |-------------------------------------------------------------------------- 21 | | Mailer Configurations 22 | |-------------------------------------------------------------------------- 23 | | 24 | | Here you may configure all of the mailers used by your application plus 25 | | their respective settings. Several examples have been configured for 26 | | you and you are free to add your own as your application requires. 27 | | 28 | | Laravel supports a variety of mail "transport" drivers that can be used 29 | | when delivering an email. You may specify which one you're using for 30 | | your mailers below. You may also add additional mailers if needed. 31 | | 32 | | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", 33 | | "postmark", "resend", "log", "array", 34 | | "failover", "roundrobin" 35 | | 36 | */ 37 | 38 | 'mailers' => [ 39 | 40 | 'smtp' => [ 41 | 'transport' => 'smtp', 42 | 'url' => env('MAIL_URL'), 43 | 'host' => env('MAIL_HOST', '127.0.0.1'), 44 | 'port' => env('MAIL_PORT', 2525), 45 | 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 46 | 'username' => env('MAIL_USERNAME'), 47 | 'password' => env('MAIL_PASSWORD'), 48 | 'timeout' => null, 49 | 'local_domain' => env('MAIL_EHLO_DOMAIN'), 50 | ], 51 | 52 | 'ses' => [ 53 | 'transport' => 'ses', 54 | ], 55 | 56 | 'postmark' => [ 57 | 'transport' => 'postmark', 58 | // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), 59 | // 'client' => [ 60 | // 'timeout' => 5, 61 | // ], 62 | ], 63 | 64 | 'resend' => [ 65 | 'transport' => 'resend', 66 | ], 67 | 68 | 'sendmail' => [ 69 | 'transport' => 'sendmail', 70 | 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), 71 | ], 72 | 73 | 'log' => [ 74 | 'transport' => 'log', 75 | 'channel' => env('MAIL_LOG_CHANNEL'), 76 | ], 77 | 78 | 'array' => [ 79 | 'transport' => 'array', 80 | ], 81 | 82 | 'failover' => [ 83 | 'transport' => 'failover', 84 | 'mailers' => [ 85 | 'smtp', 86 | 'log', 87 | ], 88 | ], 89 | 90 | 'roundrobin' => [ 91 | 'transport' => 'roundrobin', 92 | 'mailers' => [ 93 | 'ses', 94 | 'postmark', 95 | ], 96 | ], 97 | 98 | ], 99 | 100 | /* 101 | |-------------------------------------------------------------------------- 102 | | Global "From" Address 103 | |-------------------------------------------------------------------------- 104 | | 105 | | You may wish for all emails sent by your application to be sent from 106 | | the same address. Here you may specify a name and address that is 107 | | used globally for all emails that are sent by your application. 108 | | 109 | */ 110 | 111 | 'from' => [ 112 | 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 113 | 'name' => env('MAIL_FROM_NAME', 'Example'), 114 | ], 115 | 116 | ]; 117 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_CONNECTION', 'database'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Queue Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the connection options for every queue backend 24 | | used by your application. An example configuration is provided for 25 | | each backend supported by Laravel. You're also free to add more. 26 | | 27 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'sync' => [ 34 | 'driver' => 'sync', 35 | ], 36 | 37 | 'database' => [ 38 | 'driver' => 'database', 39 | 'connection' => env('DB_QUEUE_CONNECTION'), 40 | 'table' => env('DB_QUEUE_TABLE', 'jobs'), 41 | 'queue' => env('DB_QUEUE', 'default'), 42 | 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), 43 | 'after_commit' => false, 44 | ], 45 | 46 | 'beanstalkd' => [ 47 | 'driver' => 'beanstalkd', 48 | 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), 49 | 'queue' => env('BEANSTALKD_QUEUE', 'default'), 50 | 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), 51 | 'block_for' => 0, 52 | 'after_commit' => false, 53 | ], 54 | 55 | 'sqs' => [ 56 | 'driver' => 'sqs', 57 | 'key' => env('AWS_ACCESS_KEY_ID'), 58 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 59 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 60 | 'queue' => env('SQS_QUEUE', 'default'), 61 | 'suffix' => env('SQS_SUFFIX'), 62 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 63 | 'after_commit' => false, 64 | ], 65 | 66 | 'redis' => [ 67 | 'driver' => 'redis', 68 | 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), 69 | 'queue' => env('REDIS_QUEUE', 'default'), 70 | 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), 71 | 'block_for' => null, 72 | 'after_commit' => false, 73 | ], 74 | 75 | ], 76 | 77 | /* 78 | |-------------------------------------------------------------------------- 79 | | Job Batching 80 | |-------------------------------------------------------------------------- 81 | | 82 | | The following options configure the database and table that store job 83 | | batching information. These options can be updated to any database 84 | | connection and table which has been defined by your application. 85 | | 86 | */ 87 | 88 | 'batching' => [ 89 | 'database' => env('DB_CONNECTION', 'sqlite'), 90 | 'table' => 'job_batches', 91 | ], 92 | 93 | /* 94 | |-------------------------------------------------------------------------- 95 | | Failed Queue Jobs 96 | |-------------------------------------------------------------------------- 97 | | 98 | | These options configure the behavior of failed queue job logging so you 99 | | can control how and where failed jobs are stored. Laravel ships with 100 | | support for storing failed jobs in a simple file or in a database. 101 | | 102 | | Supported drivers: "database-uuids", "dynamodb", "file", "null" 103 | | 104 | */ 105 | 106 | 'failed' => [ 107 | 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 108 | 'database' => env('DB_CONNECTION', 'sqlite'), 109 | 'table' => 'failed_jobs', 110 | ], 111 | 112 | ]; 113 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'token' => env('POSTMARK_TOKEN'), 19 | ], 20 | 21 | 'ses' => [ 22 | 'key' => env('AWS_ACCESS_KEY_ID'), 23 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 24 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 25 | ], 26 | 27 | 'resend' => [ 28 | 'key' => env('RESEND_KEY'), 29 | ], 30 | 31 | 'slack' => [ 32 | 'notifications' => [ 33 | 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), 34 | 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), 35 | ], 36 | ], 37 | 38 | ]; 39 | -------------------------------------------------------------------------------- /config/session.php: -------------------------------------------------------------------------------- 1 | env('SESSION_DRIVER', 'database'), 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Session Lifetime 26 | |-------------------------------------------------------------------------- 27 | | 28 | | Here you may specify the number of minutes that you wish the session 29 | | to be allowed to remain idle before it expires. If you want them 30 | | to expire immediately when the browser is closed then you may 31 | | indicate that via the expire_on_close configuration option. 32 | | 33 | */ 34 | 35 | 'lifetime' => env('SESSION_LIFETIME', 120), 36 | 37 | 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), 38 | 39 | /* 40 | |-------------------------------------------------------------------------- 41 | | Session Encryption 42 | |-------------------------------------------------------------------------- 43 | | 44 | | This option allows you to easily specify that all of your session data 45 | | should be encrypted before it's stored. All encryption is performed 46 | | automatically by Laravel and you may use the session like normal. 47 | | 48 | */ 49 | 50 | 'encrypt' => env('SESSION_ENCRYPT', false), 51 | 52 | /* 53 | |-------------------------------------------------------------------------- 54 | | Session File Location 55 | |-------------------------------------------------------------------------- 56 | | 57 | | When utilizing the "file" session driver, the session files are placed 58 | | on disk. The default storage location is defined here; however, you 59 | | are free to provide another location where they should be stored. 60 | | 61 | */ 62 | 63 | 'files' => storage_path('framework/sessions'), 64 | 65 | /* 66 | |-------------------------------------------------------------------------- 67 | | Session Database Connection 68 | |-------------------------------------------------------------------------- 69 | | 70 | | When using the "database" or "redis" session drivers, you may specify a 71 | | connection that should be used to manage these sessions. This should 72 | | correspond to a connection in your database configuration options. 73 | | 74 | */ 75 | 76 | 'connection' => env('SESSION_CONNECTION'), 77 | 78 | /* 79 | |-------------------------------------------------------------------------- 80 | | Session Database Table 81 | |-------------------------------------------------------------------------- 82 | | 83 | | When using the "database" session driver, you may specify the table to 84 | | be used to store sessions. Of course, a sensible default is defined 85 | | for you; however, you're welcome to change this to another table. 86 | | 87 | */ 88 | 89 | 'table' => env('SESSION_TABLE', 'sessions'), 90 | 91 | /* 92 | |-------------------------------------------------------------------------- 93 | | Session Cache Store 94 | |-------------------------------------------------------------------------- 95 | | 96 | | When using one of the framework's cache driven session backends, you may 97 | | define the cache store which should be used to store the session data 98 | | between requests. This must match one of your defined cache stores. 99 | | 100 | | Affects: "apc", "dynamodb", "memcached", "redis" 101 | | 102 | */ 103 | 104 | 'store' => env('SESSION_STORE'), 105 | 106 | /* 107 | |-------------------------------------------------------------------------- 108 | | Session Sweeping Lottery 109 | |-------------------------------------------------------------------------- 110 | | 111 | | Some session drivers must manually sweep their storage location to get 112 | | rid of old sessions from storage. Here are the chances that it will 113 | | happen on a given request. By default, the odds are 2 out of 100. 114 | | 115 | */ 116 | 117 | 'lottery' => [2, 100], 118 | 119 | /* 120 | |-------------------------------------------------------------------------- 121 | | Session Cookie Name 122 | |-------------------------------------------------------------------------- 123 | | 124 | | Here you may change the name of the session cookie that is created by 125 | | the framework. Typically, you should not need to change this value 126 | | since doing so does not grant a meaningful security improvement. 127 | | 128 | */ 129 | 130 | 'cookie' => env( 131 | 'SESSION_COOKIE', 132 | Str::slug(env('APP_NAME', 'laravel'), '_').'_session' 133 | ), 134 | 135 | /* 136 | |-------------------------------------------------------------------------- 137 | | Session Cookie Path 138 | |-------------------------------------------------------------------------- 139 | | 140 | | The session cookie path determines the path for which the cookie will 141 | | be regarded as available. Typically, this will be the root path of 142 | | your application, but you're free to change this when necessary. 143 | | 144 | */ 145 | 146 | 'path' => env('SESSION_PATH', '/'), 147 | 148 | /* 149 | |-------------------------------------------------------------------------- 150 | | Session Cookie Domain 151 | |-------------------------------------------------------------------------- 152 | | 153 | | This value determines the domain and subdomains the session cookie is 154 | | available to. By default, the cookie will be available to the root 155 | | domain and all subdomains. Typically, this shouldn't be changed. 156 | | 157 | */ 158 | 159 | 'domain' => env('SESSION_DOMAIN'), 160 | 161 | /* 162 | |-------------------------------------------------------------------------- 163 | | HTTPS Only Cookies 164 | |-------------------------------------------------------------------------- 165 | | 166 | | By setting this option to true, session cookies will only be sent back 167 | | to the server if the browser has a HTTPS connection. This will keep 168 | | the cookie from being sent to you when it can't be done securely. 169 | | 170 | */ 171 | 172 | 'secure' => env('SESSION_SECURE_COOKIE'), 173 | 174 | /* 175 | |-------------------------------------------------------------------------- 176 | | HTTP Access Only 177 | |-------------------------------------------------------------------------- 178 | | 179 | | Setting this value to true will prevent JavaScript from accessing the 180 | | value of the cookie and the cookie will only be accessible through 181 | | the HTTP protocol. It's unlikely you should disable this option. 182 | | 183 | */ 184 | 185 | 'http_only' => env('SESSION_HTTP_ONLY', true), 186 | 187 | /* 188 | |-------------------------------------------------------------------------- 189 | | Same-Site Cookies 190 | |-------------------------------------------------------------------------- 191 | | 192 | | This option determines how your cookies behave when cross-site requests 193 | | take place, and can be used to mitigate CSRF attacks. By default, we 194 | | will set this value to "lax" to permit secure cross-site requests. 195 | | 196 | | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value 197 | | 198 | | Supported: "lax", "strict", "none", null 199 | | 200 | */ 201 | 202 | 'same_site' => env('SESSION_SAME_SITE', 'lax'), 203 | 204 | /* 205 | |-------------------------------------------------------------------------- 206 | | Partitioned Cookies 207 | |-------------------------------------------------------------------------- 208 | | 209 | | Setting this value to true will tie the cookie to the top-level site for 210 | | a cross-site context. Partitioned cookies are accepted by the browser 211 | | when flagged "secure" and the Same-Site attribute is set to "none". 212 | | 213 | */ 214 | 215 | 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), 216 | 217 | ]; 218 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class UserFactory extends Factory 13 | { 14 | /** 15 | * The current password being used by the factory. 16 | */ 17 | protected static ?string $password; 18 | 19 | /** 20 | * Define the model's default state. 21 | * 22 | * @return array 23 | */ 24 | public function definition(): array 25 | { 26 | return [ 27 | 'name' => fake()->name(), 28 | 'email' => fake()->unique()->safeEmail(), 29 | 'email_verified_at' => now(), 30 | 'password' => static::$password ??= Hash::make('password'), 31 | 'remember_token' => Str::random(10), 32 | ]; 33 | } 34 | 35 | /** 36 | * Indicate that the model's email address should be unverified. 37 | */ 38 | public function unverified(): static 39 | { 40 | return $this->state(fn (array $attributes) => [ 41 | 'email_verified_at' => null, 42 | ]); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('name'); 17 | $table->string('email')->unique(); 18 | $table->timestamp('email_verified_at')->nullable(); 19 | $table->string('password'); 20 | $table->rememberToken(); 21 | $table->timestamps(); 22 | }); 23 | 24 | Schema::create('password_reset_tokens', function (Blueprint $table) { 25 | $table->string('email')->primary(); 26 | $table->string('token'); 27 | $table->timestamp('created_at')->nullable(); 28 | }); 29 | 30 | Schema::create('sessions', function (Blueprint $table) { 31 | $table->string('id')->primary(); 32 | $table->foreignId('user_id')->nullable()->index(); 33 | $table->string('ip_address', 45)->nullable(); 34 | $table->text('user_agent')->nullable(); 35 | $table->longText('payload'); 36 | $table->integer('last_activity')->index(); 37 | }); 38 | } 39 | 40 | /** 41 | * Reverse the migrations. 42 | */ 43 | public function down(): void 44 | { 45 | Schema::dropIfExists('users'); 46 | Schema::dropIfExists('password_reset_tokens'); 47 | Schema::dropIfExists('sessions'); 48 | } 49 | }; 50 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000001_create_cache_table.php: -------------------------------------------------------------------------------- 1 | string('key')->primary(); 16 | $table->mediumText('value'); 17 | $table->integer('expiration'); 18 | }); 19 | 20 | Schema::create('cache_locks', function (Blueprint $table) { 21 | $table->string('key')->primary(); 22 | $table->string('owner'); 23 | $table->integer('expiration'); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | */ 30 | public function down(): void 31 | { 32 | Schema::dropIfExists('cache'); 33 | Schema::dropIfExists('cache_locks'); 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000002_create_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('queue')->index(); 17 | $table->longText('payload'); 18 | $table->unsignedTinyInteger('attempts'); 19 | $table->unsignedInteger('reserved_at')->nullable(); 20 | $table->unsignedInteger('available_at'); 21 | $table->unsignedInteger('created_at'); 22 | }); 23 | 24 | Schema::create('job_batches', function (Blueprint $table) { 25 | $table->string('id')->primary(); 26 | $table->string('name'); 27 | $table->integer('total_jobs'); 28 | $table->integer('pending_jobs'); 29 | $table->integer('failed_jobs'); 30 | $table->longText('failed_job_ids'); 31 | $table->mediumText('options')->nullable(); 32 | $table->integer('cancelled_at')->nullable(); 33 | $table->integer('created_at'); 34 | $table->integer('finished_at')->nullable(); 35 | }); 36 | 37 | Schema::create('failed_jobs', function (Blueprint $table) { 38 | $table->id(); 39 | $table->string('uuid')->unique(); 40 | $table->text('connection'); 41 | $table->text('queue'); 42 | $table->longText('payload'); 43 | $table->longText('exception'); 44 | $table->timestamp('failed_at')->useCurrent(); 45 | }); 46 | } 47 | 48 | /** 49 | * Reverse the migrations. 50 | */ 51 | public function down(): void 52 | { 53 | Schema::dropIfExists('jobs'); 54 | Schema::dropIfExists('job_batches'); 55 | Schema::dropIfExists('failed_jobs'); 56 | } 57 | }; 58 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 17 | 18 | User::factory()->create([ 19 | 'name' => 'Test User', 20 | 'email' => 'test@example.com', 21 | ]); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "html", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "devDependencies": { 8 | "axios": "^1.6.4", 9 | "laravel-vite-plugin": "^1.0", 10 | "vite": "^5.0" 11 | } 12 | }, 13 | "node_modules/@esbuild/aix-ppc64": { 14 | "version": "0.20.2", 15 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", 16 | "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", 17 | "cpu": [ 18 | "ppc64" 19 | ], 20 | "dev": true, 21 | "optional": true, 22 | "os": [ 23 | "aix" 24 | ], 25 | "engines": { 26 | "node": ">=12" 27 | } 28 | }, 29 | "node_modules/@esbuild/android-arm": { 30 | "version": "0.20.2", 31 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", 32 | "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", 33 | "cpu": [ 34 | "arm" 35 | ], 36 | "dev": true, 37 | "optional": true, 38 | "os": [ 39 | "android" 40 | ], 41 | "engines": { 42 | "node": ">=12" 43 | } 44 | }, 45 | "node_modules/@esbuild/android-arm64": { 46 | "version": "0.20.2", 47 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", 48 | "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", 49 | "cpu": [ 50 | "arm64" 51 | ], 52 | "dev": true, 53 | "optional": true, 54 | "os": [ 55 | "android" 56 | ], 57 | "engines": { 58 | "node": ">=12" 59 | } 60 | }, 61 | "node_modules/@esbuild/android-x64": { 62 | "version": "0.20.2", 63 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", 64 | "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", 65 | "cpu": [ 66 | "x64" 67 | ], 68 | "dev": true, 69 | "optional": true, 70 | "os": [ 71 | "android" 72 | ], 73 | "engines": { 74 | "node": ">=12" 75 | } 76 | }, 77 | "node_modules/@esbuild/darwin-arm64": { 78 | "version": "0.20.2", 79 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", 80 | "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", 81 | "cpu": [ 82 | "arm64" 83 | ], 84 | "dev": true, 85 | "optional": true, 86 | "os": [ 87 | "darwin" 88 | ], 89 | "engines": { 90 | "node": ">=12" 91 | } 92 | }, 93 | "node_modules/@esbuild/darwin-x64": { 94 | "version": "0.20.2", 95 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", 96 | "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", 97 | "cpu": [ 98 | "x64" 99 | ], 100 | "dev": true, 101 | "optional": true, 102 | "os": [ 103 | "darwin" 104 | ], 105 | "engines": { 106 | "node": ">=12" 107 | } 108 | }, 109 | "node_modules/@esbuild/freebsd-arm64": { 110 | "version": "0.20.2", 111 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", 112 | "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", 113 | "cpu": [ 114 | "arm64" 115 | ], 116 | "dev": true, 117 | "optional": true, 118 | "os": [ 119 | "freebsd" 120 | ], 121 | "engines": { 122 | "node": ">=12" 123 | } 124 | }, 125 | "node_modules/@esbuild/freebsd-x64": { 126 | "version": "0.20.2", 127 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", 128 | "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", 129 | "cpu": [ 130 | "x64" 131 | ], 132 | "dev": true, 133 | "optional": true, 134 | "os": [ 135 | "freebsd" 136 | ], 137 | "engines": { 138 | "node": ">=12" 139 | } 140 | }, 141 | "node_modules/@esbuild/linux-arm": { 142 | "version": "0.20.2", 143 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", 144 | "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", 145 | "cpu": [ 146 | "arm" 147 | ], 148 | "dev": true, 149 | "optional": true, 150 | "os": [ 151 | "linux" 152 | ], 153 | "engines": { 154 | "node": ">=12" 155 | } 156 | }, 157 | "node_modules/@esbuild/linux-arm64": { 158 | "version": "0.20.2", 159 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", 160 | "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", 161 | "cpu": [ 162 | "arm64" 163 | ], 164 | "dev": true, 165 | "optional": true, 166 | "os": [ 167 | "linux" 168 | ], 169 | "engines": { 170 | "node": ">=12" 171 | } 172 | }, 173 | "node_modules/@esbuild/linux-ia32": { 174 | "version": "0.20.2", 175 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", 176 | "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", 177 | "cpu": [ 178 | "ia32" 179 | ], 180 | "dev": true, 181 | "optional": true, 182 | "os": [ 183 | "linux" 184 | ], 185 | "engines": { 186 | "node": ">=12" 187 | } 188 | }, 189 | "node_modules/@esbuild/linux-loong64": { 190 | "version": "0.20.2", 191 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", 192 | "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", 193 | "cpu": [ 194 | "loong64" 195 | ], 196 | "dev": true, 197 | "optional": true, 198 | "os": [ 199 | "linux" 200 | ], 201 | "engines": { 202 | "node": ">=12" 203 | } 204 | }, 205 | "node_modules/@esbuild/linux-mips64el": { 206 | "version": "0.20.2", 207 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", 208 | "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", 209 | "cpu": [ 210 | "mips64el" 211 | ], 212 | "dev": true, 213 | "optional": true, 214 | "os": [ 215 | "linux" 216 | ], 217 | "engines": { 218 | "node": ">=12" 219 | } 220 | }, 221 | "node_modules/@esbuild/linux-ppc64": { 222 | "version": "0.20.2", 223 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", 224 | "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", 225 | "cpu": [ 226 | "ppc64" 227 | ], 228 | "dev": true, 229 | "optional": true, 230 | "os": [ 231 | "linux" 232 | ], 233 | "engines": { 234 | "node": ">=12" 235 | } 236 | }, 237 | "node_modules/@esbuild/linux-riscv64": { 238 | "version": "0.20.2", 239 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", 240 | "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", 241 | "cpu": [ 242 | "riscv64" 243 | ], 244 | "dev": true, 245 | "optional": true, 246 | "os": [ 247 | "linux" 248 | ], 249 | "engines": { 250 | "node": ">=12" 251 | } 252 | }, 253 | "node_modules/@esbuild/linux-s390x": { 254 | "version": "0.20.2", 255 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", 256 | "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", 257 | "cpu": [ 258 | "s390x" 259 | ], 260 | "dev": true, 261 | "optional": true, 262 | "os": [ 263 | "linux" 264 | ], 265 | "engines": { 266 | "node": ">=12" 267 | } 268 | }, 269 | "node_modules/@esbuild/linux-x64": { 270 | "version": "0.20.2", 271 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", 272 | "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", 273 | "cpu": [ 274 | "x64" 275 | ], 276 | "dev": true, 277 | "optional": true, 278 | "os": [ 279 | "linux" 280 | ], 281 | "engines": { 282 | "node": ">=12" 283 | } 284 | }, 285 | "node_modules/@esbuild/netbsd-x64": { 286 | "version": "0.20.2", 287 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", 288 | "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", 289 | "cpu": [ 290 | "x64" 291 | ], 292 | "dev": true, 293 | "optional": true, 294 | "os": [ 295 | "netbsd" 296 | ], 297 | "engines": { 298 | "node": ">=12" 299 | } 300 | }, 301 | "node_modules/@esbuild/openbsd-x64": { 302 | "version": "0.20.2", 303 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", 304 | "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", 305 | "cpu": [ 306 | "x64" 307 | ], 308 | "dev": true, 309 | "optional": true, 310 | "os": [ 311 | "openbsd" 312 | ], 313 | "engines": { 314 | "node": ">=12" 315 | } 316 | }, 317 | "node_modules/@esbuild/sunos-x64": { 318 | "version": "0.20.2", 319 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", 320 | "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", 321 | "cpu": [ 322 | "x64" 323 | ], 324 | "dev": true, 325 | "optional": true, 326 | "os": [ 327 | "sunos" 328 | ], 329 | "engines": { 330 | "node": ">=12" 331 | } 332 | }, 333 | "node_modules/@esbuild/win32-arm64": { 334 | "version": "0.20.2", 335 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", 336 | "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", 337 | "cpu": [ 338 | "arm64" 339 | ], 340 | "dev": true, 341 | "optional": true, 342 | "os": [ 343 | "win32" 344 | ], 345 | "engines": { 346 | "node": ">=12" 347 | } 348 | }, 349 | "node_modules/@esbuild/win32-ia32": { 350 | "version": "0.20.2", 351 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", 352 | "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", 353 | "cpu": [ 354 | "ia32" 355 | ], 356 | "dev": true, 357 | "optional": true, 358 | "os": [ 359 | "win32" 360 | ], 361 | "engines": { 362 | "node": ">=12" 363 | } 364 | }, 365 | "node_modules/@esbuild/win32-x64": { 366 | "version": "0.20.2", 367 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", 368 | "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", 369 | "cpu": [ 370 | "x64" 371 | ], 372 | "dev": true, 373 | "optional": true, 374 | "os": [ 375 | "win32" 376 | ], 377 | "engines": { 378 | "node": ">=12" 379 | } 380 | }, 381 | "node_modules/@rollup/rollup-android-arm-eabi": { 382 | "version": "4.17.2", 383 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", 384 | "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", 385 | "cpu": [ 386 | "arm" 387 | ], 388 | "dev": true, 389 | "optional": true, 390 | "os": [ 391 | "android" 392 | ] 393 | }, 394 | "node_modules/@rollup/rollup-android-arm64": { 395 | "version": "4.17.2", 396 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", 397 | "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", 398 | "cpu": [ 399 | "arm64" 400 | ], 401 | "dev": true, 402 | "optional": true, 403 | "os": [ 404 | "android" 405 | ] 406 | }, 407 | "node_modules/@rollup/rollup-darwin-arm64": { 408 | "version": "4.17.2", 409 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", 410 | "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", 411 | "cpu": [ 412 | "arm64" 413 | ], 414 | "dev": true, 415 | "optional": true, 416 | "os": [ 417 | "darwin" 418 | ] 419 | }, 420 | "node_modules/@rollup/rollup-darwin-x64": { 421 | "version": "4.17.2", 422 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", 423 | "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", 424 | "cpu": [ 425 | "x64" 426 | ], 427 | "dev": true, 428 | "optional": true, 429 | "os": [ 430 | "darwin" 431 | ] 432 | }, 433 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 434 | "version": "4.17.2", 435 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", 436 | "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", 437 | "cpu": [ 438 | "arm" 439 | ], 440 | "dev": true, 441 | "optional": true, 442 | "os": [ 443 | "linux" 444 | ] 445 | }, 446 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 447 | "version": "4.17.2", 448 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", 449 | "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", 450 | "cpu": [ 451 | "arm" 452 | ], 453 | "dev": true, 454 | "optional": true, 455 | "os": [ 456 | "linux" 457 | ] 458 | }, 459 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 460 | "version": "4.17.2", 461 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", 462 | "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", 463 | "cpu": [ 464 | "arm64" 465 | ], 466 | "dev": true, 467 | "optional": true, 468 | "os": [ 469 | "linux" 470 | ] 471 | }, 472 | "node_modules/@rollup/rollup-linux-arm64-musl": { 473 | "version": "4.17.2", 474 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", 475 | "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", 476 | "cpu": [ 477 | "arm64" 478 | ], 479 | "dev": true, 480 | "optional": true, 481 | "os": [ 482 | "linux" 483 | ] 484 | }, 485 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 486 | "version": "4.17.2", 487 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", 488 | "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", 489 | "cpu": [ 490 | "ppc64" 491 | ], 492 | "dev": true, 493 | "optional": true, 494 | "os": [ 495 | "linux" 496 | ] 497 | }, 498 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 499 | "version": "4.17.2", 500 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", 501 | "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", 502 | "cpu": [ 503 | "riscv64" 504 | ], 505 | "dev": true, 506 | "optional": true, 507 | "os": [ 508 | "linux" 509 | ] 510 | }, 511 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 512 | "version": "4.17.2", 513 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", 514 | "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", 515 | "cpu": [ 516 | "s390x" 517 | ], 518 | "dev": true, 519 | "optional": true, 520 | "os": [ 521 | "linux" 522 | ] 523 | }, 524 | "node_modules/@rollup/rollup-linux-x64-gnu": { 525 | "version": "4.17.2", 526 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", 527 | "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", 528 | "cpu": [ 529 | "x64" 530 | ], 531 | "dev": true, 532 | "optional": true, 533 | "os": [ 534 | "linux" 535 | ] 536 | }, 537 | "node_modules/@rollup/rollup-linux-x64-musl": { 538 | "version": "4.17.2", 539 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", 540 | "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", 541 | "cpu": [ 542 | "x64" 543 | ], 544 | "dev": true, 545 | "optional": true, 546 | "os": [ 547 | "linux" 548 | ] 549 | }, 550 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 551 | "version": "4.17.2", 552 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", 553 | "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", 554 | "cpu": [ 555 | "arm64" 556 | ], 557 | "dev": true, 558 | "optional": true, 559 | "os": [ 560 | "win32" 561 | ] 562 | }, 563 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 564 | "version": "4.17.2", 565 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", 566 | "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", 567 | "cpu": [ 568 | "ia32" 569 | ], 570 | "dev": true, 571 | "optional": true, 572 | "os": [ 573 | "win32" 574 | ] 575 | }, 576 | "node_modules/@rollup/rollup-win32-x64-msvc": { 577 | "version": "4.17.2", 578 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", 579 | "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", 580 | "cpu": [ 581 | "x64" 582 | ], 583 | "dev": true, 584 | "optional": true, 585 | "os": [ 586 | "win32" 587 | ] 588 | }, 589 | "node_modules/@types/estree": { 590 | "version": "1.0.5", 591 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 592 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 593 | "dev": true 594 | }, 595 | "node_modules/asynckit": { 596 | "version": "0.4.0", 597 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 598 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 599 | "dev": true 600 | }, 601 | "node_modules/axios": { 602 | "version": "1.6.8", 603 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", 604 | "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", 605 | "dev": true, 606 | "dependencies": { 607 | "follow-redirects": "^1.15.6", 608 | "form-data": "^4.0.0", 609 | "proxy-from-env": "^1.1.0" 610 | } 611 | }, 612 | "node_modules/combined-stream": { 613 | "version": "1.0.8", 614 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 615 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 616 | "dev": true, 617 | "dependencies": { 618 | "delayed-stream": "~1.0.0" 619 | }, 620 | "engines": { 621 | "node": ">= 0.8" 622 | } 623 | }, 624 | "node_modules/delayed-stream": { 625 | "version": "1.0.0", 626 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 627 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 628 | "dev": true, 629 | "engines": { 630 | "node": ">=0.4.0" 631 | } 632 | }, 633 | "node_modules/esbuild": { 634 | "version": "0.20.2", 635 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", 636 | "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", 637 | "dev": true, 638 | "hasInstallScript": true, 639 | "bin": { 640 | "esbuild": "bin/esbuild" 641 | }, 642 | "engines": { 643 | "node": ">=12" 644 | }, 645 | "optionalDependencies": { 646 | "@esbuild/aix-ppc64": "0.20.2", 647 | "@esbuild/android-arm": "0.20.2", 648 | "@esbuild/android-arm64": "0.20.2", 649 | "@esbuild/android-x64": "0.20.2", 650 | "@esbuild/darwin-arm64": "0.20.2", 651 | "@esbuild/darwin-x64": "0.20.2", 652 | "@esbuild/freebsd-arm64": "0.20.2", 653 | "@esbuild/freebsd-x64": "0.20.2", 654 | "@esbuild/linux-arm": "0.20.2", 655 | "@esbuild/linux-arm64": "0.20.2", 656 | "@esbuild/linux-ia32": "0.20.2", 657 | "@esbuild/linux-loong64": "0.20.2", 658 | "@esbuild/linux-mips64el": "0.20.2", 659 | "@esbuild/linux-ppc64": "0.20.2", 660 | "@esbuild/linux-riscv64": "0.20.2", 661 | "@esbuild/linux-s390x": "0.20.2", 662 | "@esbuild/linux-x64": "0.20.2", 663 | "@esbuild/netbsd-x64": "0.20.2", 664 | "@esbuild/openbsd-x64": "0.20.2", 665 | "@esbuild/sunos-x64": "0.20.2", 666 | "@esbuild/win32-arm64": "0.20.2", 667 | "@esbuild/win32-ia32": "0.20.2", 668 | "@esbuild/win32-x64": "0.20.2" 669 | } 670 | }, 671 | "node_modules/follow-redirects": { 672 | "version": "1.15.6", 673 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 674 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 675 | "dev": true, 676 | "funding": [ 677 | { 678 | "type": "individual", 679 | "url": "https://github.com/sponsors/RubenVerborgh" 680 | } 681 | ], 682 | "engines": { 683 | "node": ">=4.0" 684 | }, 685 | "peerDependenciesMeta": { 686 | "debug": { 687 | "optional": true 688 | } 689 | } 690 | }, 691 | "node_modules/form-data": { 692 | "version": "4.0.0", 693 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 694 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 695 | "dev": true, 696 | "dependencies": { 697 | "asynckit": "^0.4.0", 698 | "combined-stream": "^1.0.8", 699 | "mime-types": "^2.1.12" 700 | }, 701 | "engines": { 702 | "node": ">= 6" 703 | } 704 | }, 705 | "node_modules/fsevents": { 706 | "version": "2.3.3", 707 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 708 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 709 | "dev": true, 710 | "hasInstallScript": true, 711 | "optional": true, 712 | "os": [ 713 | "darwin" 714 | ], 715 | "engines": { 716 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 717 | } 718 | }, 719 | "node_modules/laravel-vite-plugin": { 720 | "version": "1.0.4", 721 | "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.0.4.tgz", 722 | "integrity": "sha512-dEj8Q/Fsn0kKbOQ55bl/NmyJL+dD6OxnVaM/nNByw5XV4b00ky6FzXKVuHLDr4BvSJKH1y6oaOcEG5wKpCZ5+A==", 723 | "dev": true, 724 | "dependencies": { 725 | "picocolors": "^1.0.0", 726 | "vite-plugin-full-reload": "^1.1.0" 727 | }, 728 | "bin": { 729 | "clean-orphaned-assets": "bin/clean.js" 730 | }, 731 | "engines": { 732 | "node": "^18.0.0 || >=20.0.0" 733 | }, 734 | "peerDependencies": { 735 | "vite": "^5.0.0" 736 | } 737 | }, 738 | "node_modules/mime-db": { 739 | "version": "1.52.0", 740 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 741 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 742 | "dev": true, 743 | "engines": { 744 | "node": ">= 0.6" 745 | } 746 | }, 747 | "node_modules/mime-types": { 748 | "version": "2.1.35", 749 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 750 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 751 | "dev": true, 752 | "dependencies": { 753 | "mime-db": "1.52.0" 754 | }, 755 | "engines": { 756 | "node": ">= 0.6" 757 | } 758 | }, 759 | "node_modules/nanoid": { 760 | "version": "3.3.7", 761 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 762 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 763 | "dev": true, 764 | "funding": [ 765 | { 766 | "type": "github", 767 | "url": "https://github.com/sponsors/ai" 768 | } 769 | ], 770 | "bin": { 771 | "nanoid": "bin/nanoid.cjs" 772 | }, 773 | "engines": { 774 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 775 | } 776 | }, 777 | "node_modules/picocolors": { 778 | "version": "1.0.1", 779 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 780 | "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", 781 | "dev": true 782 | }, 783 | "node_modules/picomatch": { 784 | "version": "2.3.1", 785 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 786 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 787 | "dev": true, 788 | "engines": { 789 | "node": ">=8.6" 790 | }, 791 | "funding": { 792 | "url": "https://github.com/sponsors/jonschlinkert" 793 | } 794 | }, 795 | "node_modules/postcss": { 796 | "version": "8.4.38", 797 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 798 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 799 | "dev": true, 800 | "funding": [ 801 | { 802 | "type": "opencollective", 803 | "url": "https://opencollective.com/postcss/" 804 | }, 805 | { 806 | "type": "tidelift", 807 | "url": "https://tidelift.com/funding/github/npm/postcss" 808 | }, 809 | { 810 | "type": "github", 811 | "url": "https://github.com/sponsors/ai" 812 | } 813 | ], 814 | "dependencies": { 815 | "nanoid": "^3.3.7", 816 | "picocolors": "^1.0.0", 817 | "source-map-js": "^1.2.0" 818 | }, 819 | "engines": { 820 | "node": "^10 || ^12 || >=14" 821 | } 822 | }, 823 | "node_modules/proxy-from-env": { 824 | "version": "1.1.0", 825 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 826 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 827 | "dev": true 828 | }, 829 | "node_modules/rollup": { 830 | "version": "4.17.2", 831 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", 832 | "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", 833 | "dev": true, 834 | "dependencies": { 835 | "@types/estree": "1.0.5" 836 | }, 837 | "bin": { 838 | "rollup": "dist/bin/rollup" 839 | }, 840 | "engines": { 841 | "node": ">=18.0.0", 842 | "npm": ">=8.0.0" 843 | }, 844 | "optionalDependencies": { 845 | "@rollup/rollup-android-arm-eabi": "4.17.2", 846 | "@rollup/rollup-android-arm64": "4.17.2", 847 | "@rollup/rollup-darwin-arm64": "4.17.2", 848 | "@rollup/rollup-darwin-x64": "4.17.2", 849 | "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", 850 | "@rollup/rollup-linux-arm-musleabihf": "4.17.2", 851 | "@rollup/rollup-linux-arm64-gnu": "4.17.2", 852 | "@rollup/rollup-linux-arm64-musl": "4.17.2", 853 | "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", 854 | "@rollup/rollup-linux-riscv64-gnu": "4.17.2", 855 | "@rollup/rollup-linux-s390x-gnu": "4.17.2", 856 | "@rollup/rollup-linux-x64-gnu": "4.17.2", 857 | "@rollup/rollup-linux-x64-musl": "4.17.2", 858 | "@rollup/rollup-win32-arm64-msvc": "4.17.2", 859 | "@rollup/rollup-win32-ia32-msvc": "4.17.2", 860 | "@rollup/rollup-win32-x64-msvc": "4.17.2", 861 | "fsevents": "~2.3.2" 862 | } 863 | }, 864 | "node_modules/source-map-js": { 865 | "version": "1.2.0", 866 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 867 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 868 | "dev": true, 869 | "engines": { 870 | "node": ">=0.10.0" 871 | } 872 | }, 873 | "node_modules/vite": { 874 | "version": "5.2.11", 875 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", 876 | "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", 877 | "dev": true, 878 | "dependencies": { 879 | "esbuild": "^0.20.1", 880 | "postcss": "^8.4.38", 881 | "rollup": "^4.13.0" 882 | }, 883 | "bin": { 884 | "vite": "bin/vite.js" 885 | }, 886 | "engines": { 887 | "node": "^18.0.0 || >=20.0.0" 888 | }, 889 | "funding": { 890 | "url": "https://github.com/vitejs/vite?sponsor=1" 891 | }, 892 | "optionalDependencies": { 893 | "fsevents": "~2.3.3" 894 | }, 895 | "peerDependencies": { 896 | "@types/node": "^18.0.0 || >=20.0.0", 897 | "less": "*", 898 | "lightningcss": "^1.21.0", 899 | "sass": "*", 900 | "stylus": "*", 901 | "sugarss": "*", 902 | "terser": "^5.4.0" 903 | }, 904 | "peerDependenciesMeta": { 905 | "@types/node": { 906 | "optional": true 907 | }, 908 | "less": { 909 | "optional": true 910 | }, 911 | "lightningcss": { 912 | "optional": true 913 | }, 914 | "sass": { 915 | "optional": true 916 | }, 917 | "stylus": { 918 | "optional": true 919 | }, 920 | "sugarss": { 921 | "optional": true 922 | }, 923 | "terser": { 924 | "optional": true 925 | } 926 | } 927 | }, 928 | "node_modules/vite-plugin-full-reload": { 929 | "version": "1.1.0", 930 | "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.1.0.tgz", 931 | "integrity": "sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA==", 932 | "dev": true, 933 | "dependencies": { 934 | "picocolors": "^1.0.0", 935 | "picomatch": "^2.3.1" 936 | } 937 | } 938 | } 939 | } 940 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "vite build" 7 | }, 8 | "devDependencies": { 9 | "axios": "^1.6.4", 10 | "laravel-vite-plugin": "^1.0", 11 | "vite": "^5.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | tests/Unit 10 | 11 | 12 | tests/Feature 13 | 14 | 15 | 16 | 17 | app 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mandrasch/ddev-laravel-vite/8c96e8ec9c130eaab330b3807d223e9e9bb9afa4/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | handleRequest(Request::capture()); 18 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | padding: 20px; 4 | } 5 | p { 6 | color: blue !important; 7 | } 8 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | import "../css/app.css"; 2 | import './bootstrap'; 3 | -------------------------------------------------------------------------------- /resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | window.axios = axios; 3 | 4 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 5 | -------------------------------------------------------------------------------- /resources/views/welcome.blade.original.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Laravel 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 |
20 | 21 |
22 |
23 |
24 |
25 | 26 |
27 | @if (Route::has('login')) 28 | 54 | @endif 55 |
56 | 57 |
58 | 163 |
164 | 165 |
166 | Laravel v{{ Illuminate\Foundation\Application::VERSION }} (PHP v{{ PHP_VERSION }}) 167 |
168 |
169 |
170 |
171 | 172 | 173 | -------------------------------------------------------------------------------- /resources/views/welcome.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | @vite('resources/js/app.js') 10 | 11 | 12 | 13 | 14 |

Hello, vite!

15 |

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 8 | })->purpose('Display an inspiring quote')->hourly(); 9 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | get('/'); 16 | 17 | $response->assertStatus(200); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig, loadConfigFromFile } from 'vite'; 2 | import laravel from 'laravel-vite-plugin'; 3 | 4 | // defaults for local DDEV 5 | let port = 5173; 6 | let origin = `${process.env.DDEV_PRIMARY_URL}:${port}`; 7 | 8 | // Gitpod support 9 | // env var GITPOD_WORKSPACE_URL needs to be passed through to ddev 10 | // via 'web_environment:' config, see .ddev/config.yaml 11 | if (Object.prototype.hasOwnProperty.call(process.env, 'GITPOD_WORKSPACE_URL')) { 12 | origin = `${process.env.GITPOD_WORKSPACE_URL}`; 13 | origin = origin.replace('https://', 'https://5173-'); 14 | console.log(`Gitpod detected, set origin to ${origin}`); 15 | } 16 | 17 | // Codespaces support 18 | // env var GITPOD_WORKSPACE_URL needs to be passed through to ddev, see .ddev/config.yaml 19 | // You need to switch the port manually to public on codespaces after launching 20 | if (Object.prototype.hasOwnProperty.call(process.env, 'CODESPACES')) { 21 | origin = `https://${process.env.CODESPACE_NAME}-${port}.${process.env.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}`; 22 | console.log('Codespaces environment detected, setting config to ', {port,origin}); 23 | console.log("Please check that this can be opened via browser after you run 'ddev npm run dev':"); 24 | console.log(origin + '/resources/js/app.js'); 25 | console.log('If it can\'t be opened, please switch the Vite port to public in the ports tab.'); 26 | /* console.log({ 27 | 'CODESPACES' : process.env?.CODESPACES, 28 | 'CODESPACE_NAME' : process.env?.CODESPACE_NAME, 29 | 'GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN': process.env?.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN 30 | });*/ 31 | } 32 | 33 | export default defineConfig({ 34 | plugins: [ 35 | laravel({ 36 | input: ['resources/css/app.css', 'resources/js/app.js'], 37 | refresh: true, 38 | }), 39 | ], 40 | server: { 41 | // respond to all network requests 42 | host: '0.0.0.0', 43 | port: port, 44 | strictPort: true, 45 | // Defines the origin of the generated asset URLs during development, 46 | // this will also be used for the public/hot file (Vite devserver URL) 47 | origin: origin 48 | } 49 | }); 50 | --------------------------------------------------------------------------------